(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i { const convars = msg.convars; if (!convars) return; for (const cvar of convars.cvars) { const oldValue = this.vars.get(cvar.name); this.vars.set(cvar.name, cvar.value); const args = { name: cvar.name, value: cvar.value, oldValue }; this.emit(cvar.name, args); this.emit("change", args); } }); } } exports.ConVars = ConVars; },{"events":84}],5:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.decodeCrosshairCode = exports.CrosshairStyle = void 0; const sharecode_1 = require("./sharecode"); var CrosshairStyle; (function (CrosshairStyle) { CrosshairStyle[CrosshairStyle["Default"] = 0] = "Default"; CrosshairStyle[CrosshairStyle["DefaultStatic"] = 1] = "DefaultStatic"; CrosshairStyle[CrosshairStyle["Classic"] = 2] = "Classic"; CrosshairStyle[CrosshairStyle["ClassicDynamic"] = 3] = "ClassicDynamic"; CrosshairStyle[CrosshairStyle["ClassicStatic"] = 4] = "ClassicStatic"; })(CrosshairStyle = exports.CrosshairStyle || (exports.CrosshairStyle = {})); function decodeCrosshairCode(shareCode) { function signed(byte) { return byte > 127 ? -(~byte & 0xff) - 1 : byte; } const bytes = (0, sharecode_1.decodeShareCode)(shareCode); if (bytes[1] !== bytes.slice(2).reduce((x, y) => x + y) % 256) { throw new Error("invalid crosshair code"); } return { outline: bytes[4] / 2, red: bytes[5], green: bytes[6], blue: bytes[7], alpha: bytes[8], splitDistance: bytes[9], innerSplitAlpha: (bytes[11] >> 4) / 10, hasOutline: !!(bytes[11] & 8), outerSplitAlpha: (bytes[12] & 0xf) / 10, splitSizeRatio: (bytes[12] >> 4) / 10, thickness: bytes[13] / 10, length: bytes[15] / 10, gap: signed(bytes[3]) / 10, hasCenterDot: !!((bytes[14] >> 4) & 1), hasAlpha: !!((bytes[14] >> 4) & 4), isTStyle: !!((bytes[14] >> 4) & 8), style: CrosshairStyle[(bytes[14] & 0xf) >> 1] }; } exports.decodeCrosshairCode = decodeCrosshairCode; },{"./sharecode":28}],6:[function(require,module,exports){ (function (Buffer){(function (){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.DemoFile = exports.parseHeader = void 0; const events_1 = require("events"); const timers = require("timers"); const url_1 = require("url"); const https = require("https"); const ByteBuffer = require("bytebuffer"); const bitbuffer_1 = require("./ext/bitbuffer"); const assert = require("assert"); const consts_1 = require("./consts"); const convars_1 = require("./convars"); const entities_1 = require("./entities"); const gameevents_1 = require("./gameevents"); const icekey_1 = require("./icekey"); const net = require("./net"); const stringtables_1 = require("./stringtables"); const usermessages_1 = require("./usermessages"); const assert_exists_1 = require("./assert-exists"); const grenadetrajectory_1 = require("./supplements/grenadetrajectory"); const molotovdetonate_1 = require("./supplements/molotovdetonate"); const itempurchase_1 = require("./supplements/itempurchase"); function httpGet(url) { return new Promise((resolve, reject) => { https .request(url, res => { const chunks = []; res.on("data", chunk => { chunks.push(chunk); }); res.on("end", () => { if (res.statusCode == 200) { resolve(Buffer.concat(chunks)); } else { reject(`request '${url}' failed: ${res.statusCode} (${res.statusMessage})`); } }); }) .end(); }); } function parseHeaderBytebuf(bytebuf) { return { magic: bytebuf.readString(8, ByteBuffer.METRICS_BYTES).split("\0", 2)[0], protocol: bytebuf.readInt32(), networkProtocol: bytebuf.readInt32(), serverName: bytebuf .readString(consts_1.MAX_OSPATH, ByteBuffer.METRICS_BYTES) .split("\0", 2)[0], clientName: bytebuf .readString(consts_1.MAX_OSPATH, ByteBuffer.METRICS_BYTES) .split("\0", 2)[0], mapName: bytebuf .readString(consts_1.MAX_OSPATH, ByteBuffer.METRICS_BYTES) .split("\0", 2)[0], gameDirectory: bytebuf .readString(consts_1.MAX_OSPATH, ByteBuffer.METRICS_BYTES) .split("\0", 2)[0], playbackTime: bytebuf.readFloat(), playbackTicks: bytebuf.readInt32(), playbackFrames: bytebuf.readInt32(), signonLength: bytebuf.readInt32() }; } /** * Parses a demo file header from the buffer. * @param {ArrayBuffer} buffer - Buffer of the demo header * @returns {IDemoHeader} Header object */ function parseHeader(buffer) { const bytebuf = ByteBuffer.wrap(buffer, true); return parseHeaderBytebuf(bytebuf); } exports.parseHeader = parseHeader; /** * Represents a demo file for parsing. */ class DemoFile extends events_1.EventEmitter { /** * Starts parsing buffer as a demo file. * * @fires DemoFile#tickstart * @fires DemoFile#tickend * @fires DemoFile#end * * @param {ArrayBuffer} buffer - Buffer pointing to start of demo header */ constructor() { super(); /** * When parsing, set to current tick. */ this.currentTick = -1; /** * Number of seconds per tick */ this.tickInterval = NaN; /** * When parsing, set to the splitscreen slot for the current command. * @deprecated Splitscreen slot is unused for PC games. */ this.playerSlot = 0; /** * Set to the client slot of the recording player. * Always null for GOTV demos. */ this.recordingClientSlot = null; this._chunks = []; this._lastThreadYieldTime = 0; this._immediateTimerToken = null; this._timeoutTimerToken = null; this._encryptionKey = null; this._hasEnded = false; this._isBroadcastFragment = false; this._supplementEvents = [ grenadetrajectory_1.default, molotovdetonate_1.default, itempurchase_1.default ]; this._supplementCleanupFns = new Map(); this.entities = new entities_1.Entities(); this.gameEvents = new gameevents_1.GameEvents(); this.stringTables = new stringtables_1.StringTables(); this.userMessages = new usermessages_1.UserMessages(); this.conVars = new convars_1.ConVars(); this.gameEvents.listen(this); // It is important that entities listens after game events, as they both listen on // tickend. this.entities.listen(this); this.stringTables.listen(this); this.userMessages.listen(this); this.conVars.listen(this); // #65: Some demos are missing playbackTicks from the header // Pull the tick interval from ServerInfo this.on("svc_ServerInfo", msg => { this.tickInterval = msg.tickInterval; }); this.on("svc_EncryptedData", msg => { if (!this._handleEncryptedData(msg)) { // Some demos appear to have the encryption key recorded // incorrectly in the .dem.info file. Don't throw an error // if we can't decode it correctly. // The game client silently skips bad encrypted messages. // See https://github.com/saul/demofile/issues/322#issuecomment-1085776379 this.emit("warning", { message: "Unable to read encrypted message" }); } }); this.on("newListener", (event) => { // If we already have listeners for this event, nothing to do if (this.listenerCount(event) > 0) return; const supplement = this._findSupplement(event); if (supplement == null) return; const cleanupFn = supplement.setup(this); this._supplementCleanupFns.set(supplement, cleanupFn); }); this.on("removeListener", (event) => { // If there are still listeners for this event, early out if (this.listenerCount(event) > 0) return; const supplement = this._findSupplement(event); if (supplement == null) return; // Don't cleanup if there are listeners on other emits that this supplement emits const existingListenerCount = supplement.emits.reduce((prev, name) => prev + this.listenerCount(name), 0); if (existingListenerCount > 0) return; const cleanupFn = (0, assert_exists_1.default)(this._supplementCleanupFns.get(supplement)); cleanupFn(); this._supplementCleanupFns.delete(supplement); }); } /** * @returns Number of ticks per second */ get tickRate() { return 1.0 / this.tickInterval; } /** * @returns Number of seconds elapsed */ get currentTime() { return this.currentTick * this.tickInterval; } /** * Shortcut for `this.entities.players` * @returns All connected player entities */ get players() { return this.entities.players; } /** * Shortcut for `this.entities.teams` * @returns All team entities */ get teams() { return this.entities.teams; } /** * Shortcut for `this.entities.gameRules` * @returns GameRules entity */ get gameRules() { return this.entities.gameRules; } _findSupplement(eventName) { for (const supplement of this._supplementEvents) { if (supplement.emits.indexOf(eventName) >= 0) return supplement; } return null; } /** * Start streaming a GOTV broadcast over HTTP. * Will keep streaming until the broadcast finishes. * * @param url URL to the GOTV broadcast. * @returns Promise that resolves then the broadcast finishes. */ async parseBroadcast(url) { if (!url.endsWith("/")) url += "/"; // Some packets are formatted slightly differently in // broadcast fragments compared to a normal demo file. this._isBroadcastFragment = true; const syncUrl = new url_1.URL("sync", url).toString(); const syncResponse = await httpGet(syncUrl); const syncDto = JSON.parse(syncResponse.toString()); if (syncDto.protocol !== 4) { throw new Error(`expected protocol version 4, got: ${syncDto.protocol}`); } if (syncDto.token_redirect != null) { url = new url_1.URL(syncDto.token_redirect, url).toString(); if (!url.endsWith("/")) url += "/"; } this.header = { magic: "HL2DEMO", protocol: syncDto.protocol, networkProtocol: 0, serverName: `GOTV Broadcast: ${url}`, clientName: "GOTV Demo", mapName: syncDto.map, gameDirectory: "csgo", playbackTime: 0, playbackTicks: 0, playbackFrames: 0, signonLength: 0 }; this.tickInterval = 1 / syncDto.tps; let cancelled = false; this.emit("start", { cancel() { cancelled = true; } }); // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition if (cancelled) { return; } const startUrl = new url_1.URL(`${syncDto.signup_fragment | 0}/start`, url).toString(); const startResponse = await httpGet(startUrl); // Read the signon fragment this._bytebuf = ByteBuffer.wrap(startResponse, true); while (this._bytebuf.remaining() > 0) { this._readCommand(); } // Keep reading fragments until we run out let fragment = syncDto.fragment | 0; let fragmentType = "full"; while (!this._hasEnded) { const fragmentUrl = new url_1.URL(`${fragment}/${fragmentType}`, url).toString(); let fragmentResponse; try { fragmentResponse = await httpGet(fragmentUrl); } catch { // HTTP 404 errors are expected - each fragment only lasts for a few seconds. // Wait for 1-2 secs before retrying to avoid spamming the relay. await new Promise(resolve => setTimeout(resolve, 1000 + Math.random() * 1000)); continue; } // We need to request {fragment}/full + {fragment}/delta if (fragmentType == "full") { fragmentType = "delta"; } else { fragment += 1; } this._bytebuf = ByteBuffer.wrap(fragmentResponse, true); while (this._bytebuf.remaining() > 0) { this._readCommand(); } } } parseStream(stream) { this._hasEnded = false; const onReceiveChunk = (chunk) => { // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition if (this._bytebuf == null) { this._bytebuf = ByteBuffer.wrap(chunk, true); } else { this._chunks.push(chunk); } }; const readPacketChunk = () => { try { // Keep reading until we can't read any more while (this._bytebuf.remaining() > 0 || this._chunks.length > 0) { this._bytebuf.mark(); this._readCommand(); } } catch (e) { if (e instanceof RangeError) { // Reset the byte buffer to the start of the last command this._bytebuf.offset = Math.max(0, this._bytebuf.markedOffset); } else { stream.off("data", onReceiveChunk); const error = e instanceof Error ? e : new Error(`Exception during parsing: ${e}`); this._emitEnd({ error, incomplete: false }); } } }; const readHeaderChunk = () => { // Wait for enough bytes for us to read the header if (!this._tryEnsureRemaining(1072)) return; // Once we've read the header, remove this handler stream.off("data", readHeaderChunk); const cancelled = this._parseHeader(); if (!cancelled) stream.on("data", readPacketChunk); }; stream.on("data", onReceiveChunk); stream.on("data", readHeaderChunk); stream.on("error", e => { stream.off("data", onReceiveChunk); this._emitEnd({ error: e, incomplete: false }); }); stream.on("end", () => { var _a; const fullyConsumed = // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition ((_a = this._bytebuf) === null || _a === void 0 ? void 0 : _a.remaining()) === 0 && this._chunks.length === 0; if (fullyConsumed) return; this._emitEnd({ incomplete: true }); }); } parse(buffer) { this._hasEnded = false; this._bytebuf = ByteBuffer.wrap(buffer, true); const cancelled = this._parseHeader(); if (!cancelled) timers.setTimeout(this._parseRecurse.bind(this), 0); } /** * Cancel the current parse operation. */ cancel() { if (this._immediateTimerToken) { timers.clearImmediate(this._immediateTimerToken); this._immediateTimerToken = null; } if (this._timeoutTimerToken) { timers.clearTimeout(this._timeoutTimerToken); this._timeoutTimerToken = null; } } /** * Set encryption key for decrypting `svc_EncryptedData` packets. * This allows decryption of messages from public matchmaking, like * chat messages and caster voice data. * * The key can be extracted from `match730_*.dem.info` files with `extractPublicEncryptionKey`. * * @param publicKey Public encryption key. */ setEncryptionKey(publicKey) { if (publicKey != null && publicKey.length !== 16) { throw new Error(`Public key must be 16 bytes long, got ${publicKey.length} bytes instead`); } this._encryptionKey = publicKey; } _emitEnd(e) { if (this._hasEnded) return; if (e.error) { this.emit("error", e.error); } this.emit("end", e); this._hasEnded = true; } _parseHeader() { this.header = parseHeaderBytebuf(this._bytebuf); // #65: Some demos are missing playbackTicks from the header if (this.header.playbackTicks > 0) { this.tickInterval = this.header.playbackTime / this.header.playbackTicks; } // If this is a POV demo, try to figure out who the recording player is if (this.header.clientName !== "GOTV Demo") { this.stringTables.on("update", this._handleStringTableUpdate.bind(this)); } let cancelled = false; this.emit("start", { cancel: () => { cancelled = true; } }); return cancelled; } _readIBytes() { this._ensureRemaining(4); const length = this._bytebuf.readInt32(); this._ensureRemaining(length); return this._bytebuf.readBytes(length); } _handleEncryptedData(msg) { if (msg.keyType !== 2 || this._encryptionKey == null) return true; const key = new icekey_1.IceKey(2); key.set(this._encryptionKey); assert(msg.encrypted.length % key.blockSize() === 0); const plainText = new Uint8Array(msg.encrypted.length); key.decryptUint8Array(msg.encrypted, plainText); // Create a ByteBuffer skipped past the padding const buf = ByteBuffer.wrap(plainText, true); const paddingBytes = buf.readUint8(); if (paddingBytes + 4 > buf.remaining()) return false; buf.skip(paddingBytes); // For some reason, the size is encoded as an int32, then as a varint32 buf.BE(); const bytesWritten = buf.readInt32(); buf.LE(); if (buf.remaining() !== bytesWritten) return false; const cmd = buf.readVarint32(); const size = buf.readVarint32(); if (buf.remaining() !== size) return false; const message = net.findByType(cmd); assert(message != null, `No message handler for ${cmd}`); if (this.listenerCount(message.name)) { const msgInst = message.class.decode(new Uint8Array(buf.toBuffer())); this.emit(message.name, msgInst); } return true; } _handleStringTableUpdate(update) { if (this.recordingClientSlot != null) return; if (update.table.name === "userinfo" && update.userData != null) { const playerInfo = update.userData; if (playerInfo.name === this.header.clientName) { this.recordingClientSlot = update.entryIndex; } } } /** * Fired when a packet of this type is hit. `svc_MessageName` events are also fired. * @public * @event DemoFile#net_MessageName */ _handleDemoPacket() { if (!this._isBroadcastFragment) { this._ensureRemaining(160); // skip cmd info this._bytebuf.skip(152); // skip over sequence info this._bytebuf.readInt32(); this._bytebuf.readInt32(); } const chunk = this._readIBytes(); while (chunk.remaining()) { const cmd = chunk.readVarint32(); const size = chunk.readVarint32(); const message = net.findByType(cmd); assert(message != null, `No message handler for ${cmd}`); if (this.listenerCount(message.name)) { const messageBuffer = chunk.readBytes(size); const msgInst = message.class.decode(new Uint8Array(messageBuffer.toBuffer())); this.emit(message.name, msgInst); } else { chunk.skip(size); } } } _handleDataChunk() { this._readIBytes(); } _handleDataTables() { const chunk = this._isBroadcastFragment ? this._bytebuf : this._readIBytes(); this.entities.handleDataTables(chunk); } _handleUserCmd() { this._ensureRemaining(4); this._bytebuf.readInt32(); // outgoing sequence const chunk = this._readIBytes(); // If nobody's listening, don't waste cycles decoding it if (!this.listenerCount("usercmd")) return; const bitbuf = bitbuffer_1.BitStream.from(chunk.buffer.slice(chunk.offset, chunk.limit)); const move = { commandNumber: 0, tickCount: 0, viewAngles: { x: 0, y: 0, z: 0 }, aimDirection: { x: 0, y: 0, z: 0 }, forwardMove: 0, sideMove: 0, upMove: 0, buttons: new Array(), impulse: 0, weaponSelect: 0, weaponSubType: 0, randomSeed: 0, mouseDeltaX: 0, mouseDeltaY: 0 }; if (bitbuf.readOneBit()) { move.commandNumber = bitbuf.readUInt32(); } else { move.commandNumber = 1; } if (bitbuf.readOneBit()) { move.tickCount = bitbuf.readUInt32(); } else { move.tickCount = 1; } // Read direction if (bitbuf.readOneBit()) move.viewAngles.x = bitbuf.readFloat32(); if (bitbuf.readOneBit()) move.viewAngles.y = bitbuf.readFloat32(); if (bitbuf.readOneBit()) move.viewAngles.z = bitbuf.readFloat32(); // Read aim direction if (bitbuf.readOneBit()) move.aimDirection.x = bitbuf.readFloat32(); if (bitbuf.readOneBit()) move.aimDirection.y = bitbuf.readFloat32(); if (bitbuf.readOneBit()) move.aimDirection.z = bitbuf.readFloat32(); // Read movement if (bitbuf.readOneBit()) move.forwardMove = bitbuf.readFloat32(); if (bitbuf.readOneBit()) move.sideMove = bitbuf.readFloat32(); if (bitbuf.readOneBit()) move.upMove = bitbuf.readFloat32(); if (bitbuf.readOneBit()) { const buttons = bitbuf.readUInt32(); if (buttons & (1 << 0)) move.buttons.push("attack"); if (buttons & (1 << 1)) move.buttons.push("jump"); if (buttons & (1 << 2)) move.buttons.push("duck"); if (buttons & (1 << 3)) move.buttons.push("forward"); if (buttons & (1 << 4)) move.buttons.push("back"); if (buttons & (1 << 5)) move.buttons.push("use"); if (buttons & (1 << 6)) move.buttons.push("cancel"); if (buttons & (1 << 7)) move.buttons.push("left"); if (buttons & (1 << 8)) move.buttons.push("right"); if (buttons & (1 << 9)) move.buttons.push("moveleft"); if (buttons & (1 << 10)) move.buttons.push("moveright"); if (buttons & (1 << 11)) move.buttons.push("attack2"); if (buttons & (1 << 12)) move.buttons.push("run"); if (buttons & (1 << 13)) move.buttons.push("reload"); if (buttons & (1 << 14)) move.buttons.push("alt1"); if (buttons & (1 << 15)) move.buttons.push("alt2"); if (buttons & (1 << 16)) move.buttons.push("score"); if (buttons & (1 << 17)) move.buttons.push("speed"); if (buttons & (1 << 18)) move.buttons.push("walk"); if (buttons & (1 << 19)) move.buttons.push("zoom"); if (buttons & (1 << 20)) move.buttons.push("weapon1"); if (buttons & (1 << 21)) move.buttons.push("weapon2"); if (buttons & (1 << 22)) move.buttons.push("bullrush"); if (buttons & (1 << 23)) move.buttons.push("grenade1"); if (buttons & (1 << 24)) move.buttons.push("grenade2"); if (buttons & (1 << 25)) move.buttons.push("lookspin"); } if (bitbuf.readOneBit()) move.impulse = bitbuf.readUInt8(); if (bitbuf.readOneBit()) { move.weaponSelect = bitbuf.readUBits(consts_1.MAX_EDICT_BITS); if (bitbuf.readOneBit()) move.weaponSubType = bitbuf.readUBits(6); } if (bitbuf.readOneBit()) move.mouseDeltaX = bitbuf.readInt16(); if (bitbuf.readOneBit()) move.mouseDeltaY = bitbuf.readInt16(); this.emit("usercmd", move); } _handleStringTables() { const chunk = this._readIBytes(); const bitbuf = bitbuffer_1.BitStream.from(chunk.buffer.slice(chunk.offset, chunk.limit)); this.stringTables.handleStringTables(bitbuf); } _tryEnsureRemaining(bytes) { const remaining = this._bytebuf.remaining(); if (remaining >= bytes) return true; let left = bytes - remaining; for (let i = 0; i < this._chunks.length && left > 0; ++i) left -= this._chunks[i].length; // We don't have enough bytes with what we have buffered up if (left > 0) return false; const mark = Math.max(0, this._bytebuf.markedOffset); const newOffset = this._bytebuf.offset - mark; // Reset to the marked offset. We're never going to need the bytes preceding it this._bytebuf.offset = mark; this._bytebuf = ByteBuffer.wrap(Buffer.concat([ new Uint8Array(this._bytebuf.toBuffer()), ...this._chunks ]), true); this._chunks = []; // Advance to the point we'd already read up to this._bytebuf.offset = newOffset; return true; } _ensureRemaining(bytes) { if (!this._tryEnsureRemaining(bytes)) { throw new RangeError(`Not enough data to continue parsing. ${bytes} bytes needed`); } } _readCommand() { this._ensureRemaining(6); const command = this._bytebuf.readUint8(); const tick = this._bytebuf.readInt32(); this.playerSlot = this._bytebuf.readUint8(); if (tick !== this.currentTick) { this.emit("tickend", this.currentTick); this.currentTick = tick; this.emit("tickstart", this.currentTick); } switch (command) { case 2 /* DemoCommands.Packet */: case 1 /* DemoCommands.Signon */: this._handleDemoPacket(); break; case 6 /* DemoCommands.DataTables */: this._handleDataTables(); break; case 9 /* DemoCommands.StringTables */: this._handleStringTables(); break; case 4 /* DemoCommands.ConsoleCmd */: // TODO this._handleDataChunk(); break; case 5 /* DemoCommands.UserCmd */: this._handleUserCmd(); break; case 7 /* DemoCommands.Stop */: this.cancel(); this.emit("tickend", this.currentTick); this._emitEnd({ incomplete: false }); return; case 8 /* DemoCommands.CustomData */: throw new Error("Custom data not supported"); case 3 /* DemoCommands.SyncTick */: break; default: throw new Error(`Unrecognised command: ${command}`); } } _parseRecurse() { const now = Date.now(); // Schedule another round of parsing if (now - this._lastThreadYieldTime < 32) { this._immediateTimerToken = timers.setImmediate(this._parseRecurse.bind(this)); } else { this._lastThreadYieldTime = now; this._timeoutTimerToken = timers.setTimeout(this._parseRecurse.bind(this), 0); } try { this.emit("progress", this._bytebuf.offset / this._bytebuf.limit); this._readCommand(); } catch (e) { // Always cancel if we have an error - we've already scheduled the next tick this.cancel(); // #11, #172: Some demos have been written incompletely. // Don't throw an error when we run out of bytes to read. if (e instanceof RangeError && this.header.playbackTicks === 0 && this.header.playbackTime === 0 && this.header.playbackFrames === 0) { this._emitEnd({ incomplete: true }); } else { const error = e instanceof Error ? e : new Error(`Exception during parsing: ${e}`); this._emitEnd({ error, incomplete: false }); } } } } exports.DemoFile = DemoFile; }).call(this)}).call(this,require("buffer").Buffer) },{"./assert-exists":2,"./consts":3,"./convars":4,"./entities":7,"./ext/bitbuffer":18,"./gameevents":20,"./icekey":21,"./net":22,"./stringtables":29,"./supplements/grenadetrajectory":30,"./supplements/itempurchase":31,"./supplements/molotovdetonate":32,"./usermessages":33,"assert":73,"buffer":81,"bytebuffer":83,"events":84,"https":85,"timers":752,"url":753}],7:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.Entities = void 0; const assert = require("assert"); const events_1 = require("events"); const assert_exists_1 = require("./assert-exists"); const bitbuffer_1 = require("./ext/bitbuffer"); const consts = require("./consts"); const net = require("./net"); const immutable = require("immutable"); const iter_tools_1 = require("iter-tools"); const baseentity_1 = require("./entities/baseentity"); const gamerules_1 = require("./entities/gamerules"); const networkable_1 = require("./entities/networkable"); const player_1 = require("./entities/player"); const team_1 = require("./entities/team"); const weapon_1 = require("./entities/weapon"); const props_1 = require("./props"); const Long = require("long"); const projectile_1 = require("./entities/projectile"); function isPropExcluded(excludes, table, prop) { return excludes.find(excluded => table.netTableName === excluded.dtName && prop.varName === excluded.varName); } function readFieldIndex(entityBitBuffer, lastIndex, newWay) { if (newWay && entityBitBuffer.readOneBit()) { return lastIndex + 1; } let ret = 0; if (newWay && entityBitBuffer.readOneBit()) { ret = entityBitBuffer.readUBits(3); } else { ret = entityBitBuffer.readUBits(7); switch (ret & (32 | 64)) { case 32: ret = (ret & ~96) | (entityBitBuffer.readUBits(2) << 5); assert(ret >= 32); break; case 64: ret = (ret & ~96) | (entityBitBuffer.readUBits(4) << 5); assert(ret >= 128); break; case 96: ret = (ret & ~96) | (entityBitBuffer.readUBits(7) << 5); assert(ret >= 512); break; } } if (ret === 0xfff) { // end marker is 4095 for CS:GO return -1; } return lastIndex + 1 + ret; } function cloneProps(props) { const result = {}; // eslint-disable-next-line no-restricted-syntax for (const tableName in props) { const oldTable = props[tableName]; const newTable = {}; // eslint-disable-next-line no-restricted-syntax for (const prop in oldTable) { newTable[prop] = oldTable[prop]; } result[tableName] = newTable; } return result; } /** * Represents entities and networked properties within a demo. */ class Entities extends events_1.EventEmitter { constructor() { super(...arguments); this.dataTables = []; this.serverClasses = []; /** * Map of entity index => networkable instance */ this.entities = new Map(); this.markedForDeletion = []; this.staticBaselines = {}; this.pendingBaselines = {}; this.serverClassBits = 0; this.tableClassMap = { DT_CSPlayer: player_1.Player, DT_Team: team_1.Team, DT_CSGameRules: gamerules_1.GameRules, DT_BaseCSGrenadeProjectile: projectile_1.Projectile, DT_WeaponCSBase: weapon_1.Weapon, DT_BaseEntity: baseentity_1.BaseEntity }; this._serverClassConstructor = new Map(); /** * Set of which entities were active in the most recent tick. */ this.transmitEntities = null; this._entityBaselines = [ new Map(), new Map() ]; this._frames = immutable.Map(); this._demo = null; this._singletonEnts = {}; this._currentServerTick = -1; this._maxPlayers = 0; this._userInfoTable = null; this._userIdToEntity = new Map(); this._steam64IdToEntity = new Map(); this._accountNumberToEntity = new Map(); } get playerResource() { return this._demo.entities.getSingleton("CCSPlayerResource"); } get gameRules() { return this.getSingleton("CCSGameRulesProxy"); } get teams() { return Array.from(this.findAllWithClass(team_1.Team)); } get players() { const players = []; for (let i = 1; i <= this._maxPlayers; ++i) { const entity = this.entities.get(i); // Only return players that are fully connected if ((entity === null || entity === void 0 ? void 0 : entity.userInfo) != null) { players.push(entity); } } return players; } get weapons() { return Array.from(this.findAllWithClass(weapon_1.Weapon)); } listen(demo) { this._demo = demo; demo.on("svc_PacketEntities", e => this._handlePacketEntities(e)); demo.on("svc_TempEntities", e => this._handleTempEntities(e)); demo.on("svc_ServerInfo", e => { this._maxPlayers = e.maxClients; }); demo.on("net_Tick", e => { this._currentServerTick = e.tick; }); demo.stringTables.on("create", table => { if (table.name === "userinfo") this._userInfoTable = table; }); demo.stringTables.on("update", e => this._handleStringTableUpdate(e)); demo.on("tickend", () => { if (this.markedForDeletion.length > 0) { for (const index of this.markedForDeletion) { this.entities.delete(index); this.emit("remove", { index }); } this.markedForDeletion.length = 0; } }); } /** * Determines whether handle is set. * This function does not determine whether the handle points to a valid entity. * @param {number} handle - Networked entity handle value * @returns {boolean} true if handle is set */ isHandleSet(handle) { return handle !== consts.INVALID_NETWORKED_EHANDLE_VALUE; } /** * Returns the entity specified by a particular handle. * @param {number} handle - Networked entity handle value * @returns {Entity|null} Entity referenced by the handle. `null` if no matching entity. */ getByHandle(handle) { if (!handle.isValid) { return null; } const ent = this.entities.get(handle.index); if (ent == null || ent.serialNum !== handle.serialNum) { return null; } return ent; } /** * Returns the entity that belongs to the player with a given user ID. * @param {number} userId - Player user ID * @returns {Player|null} Entity referenced by the user ID. `null` if no matching player. */ getByUserId(userId) { const entityIndex = this._userIdToEntity.get(userId); if (entityIndex === undefined) return null; return this.entities.get(entityIndex); } /** * Returns the entity that belongs to the player with a given Steam account ID. * @param {number} accountId - Steam account ID * @returns {Player|null} Entity referenced by the account ID. `null` if no matching player. */ getByAccountId(accountId) { const entityIndex = this._accountNumberToEntity.get(accountId); if (entityIndex === undefined) return null; return this.entities.get(entityIndex); } /** * Returns the entity that belongs to the player with a given 64-bit Steam ID. * @param {Long|string} steam64Id - 64-bit Steam ID * @returns {Player|null} Entity referenced by the Steam ID. `null` if no matching player. */ getBySteam64Id(steam64Id) { const idString = steam64Id instanceof Long ? steam64Id.toString() : steam64Id; const entityIndex = this._steam64IdToEntity.get(idString); if (entityIndex === undefined) return null; return this.entities.get(entityIndex); } getSingleton(serverClass) { const existing = this._singletonEnts[serverClass]; if (existing) { return existing; } const result = (0, iter_tools_1.find)(([, ent]) => ent.serverClass.name === serverClass, this.entities); if (!result) { throw new Error(`Missing singleton ${serverClass}`); } const [, entity] = result; this._singletonEnts[serverClass] = entity; return entity; } *findAllWithTable(table) { for (const ent of this.entities.values()) { if (table in ent.props) { yield ent; } } } *findAllWithClass(klass) { for (const ent of this.entities.values()) { if (ent instanceof klass) { yield ent; } } } handleDataTables(chunk) { // eslint-disable-next-line no-constant-condition while (true) { const descriptor = net.findByType(chunk.readVarint32()); assert((descriptor === null || descriptor === void 0 ? void 0 : descriptor.name) === "svc_SendTable", "expected SendTable message"); const length = chunk.readVarint32(); const msg = descriptor.class.decode(new Uint8Array(chunk.readBytes(length).toBuffer())); if (msg.isEnd) { break; } this.dataTables.push(msg); } const serverClasses = chunk.readShort(); this.serverClassBits = Math.ceil(Math.log2(serverClasses)); for (let i = 0; i < serverClasses; ++i) { const classId = chunk.readShort(); assert(classId === i, "server class entry for invalid class ID"); const name = chunk.readCString(); const dtName = chunk.readCString(); const dataTable = (0, assert_exists_1.default)(this._findTableByName(dtName), "no data table for server class"); const serverClass = { name, dtName, dataTable, flattenedProps: this._flattenDataTable(dataTable) }; this.serverClasses.push(serverClass); // Find the constructor for this server class const tablesInClass = new Set(serverClass.flattenedProps.map(prop => prop.table.netTableName)); // eslint-disable-next-line no-restricted-syntax for (const tableName in this.tableClassMap) { if (tablesInClass.has(tableName)) { this._serverClassConstructor.set(classId, this.tableClassMap[tableName]); break; } } // parse any pending baseline const pendingBaseline = this.pendingBaselines[classId]; if (pendingBaseline) { this.staticBaselines[classId] = this._parseInstanceBaseline(pendingBaseline, classId); this.emit("baselineupdate", { classId, serverClass, baseline: this.staticBaselines[classId] }); delete this.pendingBaselines[classId]; } } this.emit("datatablesready"); } _gatherExcludes(table) { const excludes = []; for (const prop of table.props) { if ((prop.flags & props_1.SPROP_EXCLUDE) !== 0) { excludes.push(prop); } if (prop.type === 6 /* PropType.DataTable */) { const subTable = (0, assert_exists_1.default)(this._findTableByName(prop.dtName)); excludes.push(...this._gatherExcludes(subTable)); } } return excludes; } _gatherProps(table, excludes) { const flattened = []; for (let index = 0; index < table.props.length; ++index) { const prop = table.props[index]; if ((prop.flags & props_1.SPROP_INSIDEARRAY) !== 0 || (prop.flags & props_1.SPROP_EXCLUDE) !== 0 || isPropExcluded(excludes, table, prop)) { continue; } if (prop.type === 6 /* PropType.DataTable */) { const subTable = (0, assert_exists_1.default)(this._findTableByName(prop.dtName)); const childProps = this._gatherProps(subTable, excludes); if ((prop.flags & props_1.SPROP_COLLAPSIBLE) === 0) { for (const fp of childProps) { fp.collapsible = false; } } flattened.push(...childProps); } else { flattened.push({ prop, table, decode: (0, props_1.makeDecoder)(prop, prop.type === 5 /* PropType.Array */ ? table.props[index - 1] : undefined), collapsible: true }); } } // collapsible props should come after non-collapsible return flattened.sort(({ collapsible: a }, { collapsible: b }) => (a ? 1 : 0) - (b ? 1 : 0)); } _flattenDataTable(table) { const flattenedProps = this._gatherProps(table, this._gatherExcludes(table)); const prioritySet = new Set(flattenedProps.map(fp => fp.prop.priority)); prioritySet.add(64); const priorities = Array.from(prioritySet).sort((a, b) => a - b); let start = 0; // On this surface this looks like a sort by priority (or min(64, priority) // for CHANGES_OFTEN props). It's not a stable sort so it can't just be // replaced with JS Array#sort for (const priority of priorities) { // eslint-disable-next-line no-constant-condition while (true) { let currentProp; for (currentProp = start; currentProp < flattenedProps.length; ++currentProp) { const prop = flattenedProps[currentProp].prop; if (prop.priority === priority || (priority === 64 && (prop.flags & props_1.SPROP_CHANGES_OFTEN) !== 0)) { if (start !== currentProp) { const temp = flattenedProps[start]; flattenedProps[start] = flattenedProps[currentProp]; flattenedProps[currentProp] = temp; } start++; break; } } if (currentProp === flattenedProps.length) { break; } } } return flattenedProps; } _findTableByName(name) { return this.dataTables.find(table => table.netTableName === name); } _addEntity(index, classId, serialNum, existingEntity, entityBaseline) { const baseline = entityBaseline || this.staticBaselines[classId]; if (!baseline) { throw new Error(`no baseline for entity ${index} (class ID ${classId})`); } const props = cloneProps(baseline); // If we already have this entity, start fresh with baseline props if ((existingEntity === null || existingEntity === void 0 ? void 0 : existingEntity.serialNum) === serialNum) { existingEntity.props = props; return existingEntity; } // Delete the entity if the serial numbers mismatch if (existingEntity) { this._removeEntity(index, true); } const klass = this._serverClassConstructor.get(classId) || networkable_1.Networkable; const entity = new klass(this._demo, index, classId, serialNum, props); // eslint-disable-next-line @typescript-eslint/no-unsafe-argument this.entities.set(index, entity); return entity; } _removeEntity(index, immediate) { const entity = this.entities.get(index); if (!entity) { return; } // It's possible that the entity is already marked for deletion. // This is because entities are deleted at the end of the dem_packet, // after the game events fire. if (!immediate && entity.deleting) { return; } this.emit("beforeremove", { entity, immediate }); if (immediate) { this.entities.delete(index); this.emit("remove", { index }); } else { entity.deleting = true; this.markedForDeletion.push(index); } } _parseEntityUpdate(entityBitBuffer, classId) { const serverClass = this.serverClasses[classId]; const newWay = entityBitBuffer.readOneBit(); let lastIndex = -1; const fieldIndices = []; // eslint-disable-next-line no-constant-condition while (true) { lastIndex = readFieldIndex(entityBitBuffer, lastIndex, newWay); if (lastIndex === -1) { break; } fieldIndices.push(lastIndex); } const updatedProps = new Array(fieldIndices.length); for (let i = 0; i < fieldIndices.length; ++i) { const propIndex = fieldIndices[i]; const flattenedProp = serverClass.flattenedProps[propIndex]; assert(flattenedProp); updatedProps[i] = { prop: flattenedProp, value: flattenedProp.decode(entityBitBuffer) }; } return updatedProps; } _readNewEntity(entityBitBuffer, entity) { const updates = this._parseEntityUpdate(entityBitBuffer, entity.classId); const recordChanges = this.listenerCount("change") > 0; const changes = recordChanges ? new Array(updates.length) : []; for (let i = 0; i < updates.length; ++i) { const update = updates[i]; const tableName = update.prop.table.netTableName; const varName = update.prop.prop.varName; const table = entity.props[tableName]; const oldValue = table && varName in table ? table[varName] : undefined; entity.updateProp(tableName, varName, update.value); if (recordChanges) { changes[i] = { tableName, varName, oldValue, newValue: update.value }; } } if (recordChanges) { this.emit("change", { entity, changes }); } } _updatesToPropObject(target, updates) { for (const update of updates) { const tableName = update.prop.table.netTableName; const varName = update.prop.prop.varName; target[tableName] = Object.assign(target[tableName] || {}, { [varName]: update.value }); } return target; } _handleTempEntities(msg) { const entityBitBuffer = bitbuffer_1.BitStream.from(msg.entityData); let lastClassId = -1; let lastProps = null; // Reliable tempents are sent with 0 entries, but really they have 1 const numEntries = msg.numEntries === 0 ? 1 : msg.numEntries; for (let i = 0; i < numEntries; ++i) { let fireDelay = 0.0; if (entityBitBuffer.readOneBit()) { fireDelay = entityBitBuffer.readSBits(8) / 100.0; } if (entityBitBuffer.readOneBit()) { lastClassId = entityBitBuffer.readUBits(this.serverClassBits) - 1; const updates = this._parseEntityUpdate(entityBitBuffer, lastClassId); lastProps = this._updatesToPropObject({}, updates); } else { // delta against last temp entity assert(lastClassId !== -1, "Delta with no baseline"); const updates = this._parseEntityUpdate(entityBitBuffer, lastClassId); lastProps = this._updatesToPropObject(cloneProps((0, assert_exists_1.default)(lastProps)), updates); } this.emit("tempent", { delay: fireDelay, classId: lastClassId, serverClass: this.serverClasses[lastClassId], props: lastProps }); } } _handlePacketEntities(msg) { // Take a copy of the transmitted entities from the delta frame // Otherwise start with a blank slate const baseTransmitEntities = (0, assert_exists_1.default)(msg.isDelta ? this._frames.get(msg.deltaFrom) : immutable.Set(), `delta from unknown frame ${msg.deltaFrom}`); if (!msg.isDelta) { // Clear out old entities - this is a full update for (const entityIndex of Array.from(this.entities.keys())) { this._removeEntity(entityIndex, true); } // Remove all frames - we won't be using them this._frames = immutable.Map(); // Clear all entity baselines for (const baseline of this._entityBaselines) { baseline.clear(); } } const newFrame = baseTransmitEntities.withMutations(mutableFrame => this._readPacketEntities(msg, mutableFrame)); this._frames = this._frames.set(this._currentServerTick, newFrame); this.transmitEntities = newFrame; // Delete old frames that we no longer need to reference if (msg.isDelta) { const oldFrames = (0, iter_tools_1.filter)(tick => tick < msg.deltaFrom, this._frames.keys()); this._frames = this._frames.removeAll(oldFrames); } } _readPacketEntities(msg, frame) { const entityBitBuffer = bitbuffer_1.BitStream.from(msg.entityData); let entityIndex = -1; for (let i = 0; i < msg.updatedEntries; ++i) { entityIndex += 1 + entityBitBuffer.readUBitVar(); assert(entityIndex < consts.MAX_EDICTS, "newEntity >= MAX_EDICTS"); if (entityBitBuffer.readOneBit()) { assert(msg.isDelta, "entity leaving PVS on full update"); frame.remove(entityIndex); if (entityBitBuffer.readOneBit()) { // 0b11: FHDR_LEAVEPVS | FHDR_DELETE this._removeEntity(entityIndex, false); } else { // 0b10: FHDR_LEAVEPVS } // eslint-disable-next-line no-dupe-else-if } else if (entityBitBuffer.readOneBit()) { // 0b01: FHDR_ENTERPVS frame.add(entityIndex); const classId = entityBitBuffer.readUBits(this.serverClassBits); const serialNum = entityBitBuffer.readUBits(consts.NUM_NETWORKED_EHANDLE_SERIAL_NUMBER_BITS); const existingBaseline = this._entityBaselines[msg.baseline].get(entityIndex); const entityBaselineProps = msg.isDelta && (existingBaseline === null || existingBaseline === void 0 ? void 0 : existingBaseline.classId) === classId ? existingBaseline.props : undefined; const existingEntity = this.entities.get(entityIndex); const entity = this._addEntity(entityIndex, classId, serialNum, existingEntity, entityBaselineProps); // eslint-disable-next-line @typescript-eslint/no-unsafe-argument this._readNewEntity(entityBitBuffer, entity); if (entity !== existingEntity) { const eventVars = { entity }; this.emit("create", eventVars); // Still emit 'postcreate' for backwards compatibility this.emit("postcreate", eventVars); } // Update the OTHER baseline with the merged result of `old baseline + new props` if (msg.updateBaseline) { this._entityBaselines[msg.baseline ? 0 : 1].set(entityIndex, { classId, // eslint-disable-next-line @typescript-eslint/no-unsafe-argument props: cloneProps(entity.props) }); } } else { // 0b00: DeltaEnt const entity = (0, assert_exists_1.default)(this.entities.get(entityIndex), `missing client entity ${entityIndex}`); assert(frame.contains(entityIndex), `delta on dormant entity ${entityIndex}`); this._readNewEntity(entityBitBuffer, entity); } } // Read deletions if (msg.isDelta) { entityIndex = -1; const deletions = entityBitBuffer.readUBitVar(); for (let i = 0; i < deletions; ++i) { entityIndex += entityBitBuffer.readUBitVar(); // Entity wasn't dealt with in packet, but has been deleted frame.remove(entityIndex); this._removeEntity(entityIndex, false); } } } _parseInstanceBaseline(baselineBuf, classId) { const classBaseline = {}; for (const bl of this._parseEntityUpdate(baselineBuf, classId)) { const tableName = bl.prop.table.netTableName; const varName = bl.prop.prop.varName; const table = classBaseline[tableName]; if (table === undefined) { classBaseline[tableName] = { [varName]: bl.value }; } else { table[varName] = bl.value; } } return classBaseline; } _handleUserInfoUpdate(clientSlot, oldPlayerInfo, playerInfo) { if (oldPlayerInfo != null) { this._userIdToEntity.delete(oldPlayerInfo.userId); this._steam64IdToEntity.delete(oldPlayerInfo.xuid.toString()); this._accountNumberToEntity.delete(oldPlayerInfo.friendsId); } if (playerInfo != null) { this._userIdToEntity.set(playerInfo.userId, clientSlot + 1); this._steam64IdToEntity.set(playerInfo.xuid.toString(), clientSlot + 1); this._accountNumberToEntity.set(playerInfo.friendsId, clientSlot + 1); } } _handleInstanceBaselineUpdate(event) { if (!event.userData) return; const classId = parseInt(event.entry, 10); const baselineBuf = bitbuffer_1.BitStream.from(event.userData); if (!this.serverClasses[classId]) { this.pendingBaselines[classId] = baselineBuf; return; } const baseline = this._parseInstanceBaseline(baselineBuf, classId); this.staticBaselines[classId] = baseline; this.emit("baselineupdate", { classId, serverClass: this.serverClasses[classId], baseline }); } _handleStringTableUpdate(event) { if (event.table.name === "userinfo") { this._handleUserInfoUpdate(event.entryIndex, event.oldUserData, event.userData); } else if (event.table.name === "instancebaseline") { // eslint-disable-next-line @typescript-eslint/no-unsafe-argument this._handleInstanceBaselineUpdate(event); } } } exports.Entities = Entities; },{"./assert-exists":2,"./consts":3,"./entities/baseentity":8,"./entities/gamerules":9,"./entities/networkable":11,"./entities/player":12,"./entities/projectile":13,"./entities/team":14,"./entities/weapon":15,"./ext/bitbuffer":18,"./net":22,"./props":23,"assert":73,"events":84,"immutable":87,"iter-tools":473,"long":712}],8:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.BaseEntity = void 0; const networkable_1 = require("./networkable"); /** * Represents an in-game entity. */ class BaseEntity extends networkable_1.Networkable { /** * Position of this entity in the game world. * @returns World-space coordinates */ get position() { const cellWidth = 1 << this.getProp("DT_BaseEntity", "m_cellbits"); const cellX = this.getProp("DT_BaseEntity", "m_cellX"); const cellY = this.getProp("DT_BaseEntity", "m_cellY"); const cellZ = this.getProp("DT_BaseEntity", "m_cellZ"); const cellOffset = this.getProp("DT_BaseEntity", "m_vecOrigin"); return { x: cellX * cellWidth - 16384 + cellOffset.x, y: cellY * cellWidth - 16384 + cellOffset.y, z: cellZ * cellWidth - 16384 + cellOffset.z }; } /** * @returns Entity which this entity is moving with, if any */ get moveParent() { // UNSAFE: cast here as move parent will always be a proper entity return this._demo.entities.getByHandle(this.getProp("DT_BaseEntity", "moveparent")); } /** * @returns Owning entity, if any */ get owner() { // UNSAFE: cast here as owner will always be a proper entity return this._demo.entities.getByHandle(this.getProp("DT_BaseEntity", "m_hOwnerEntity")); } /** * @returns Team number (0: Unassigned, 1: Spectator, 2: Terrorist, 3: Counter-Terrorist) */ get teamNumber() { return this.getProp("DT_BaseEntity", "m_iTeamNum"); } /** * @returns Team if assigned, null if unassigned. */ get team() { const teamNum = this.teamNumber; if (teamNum === 0) { return null; } return this._demo.entities.teams[teamNum]; } /** * @returns Name of the model that should be rendered for this entity. (e.g. 'models/Weapons/w_eq_smokegrenade_thrown.mdl') */ get modelName() { const modelprecache = this._demo.stringTables.findTableByName("modelprecache"); if (!modelprecache) { return null; } return modelprecache.entries[this.getProp("DT_BaseEntity", "m_nModelIndex")].entry; } } exports.BaseEntity = BaseEntity; },{"./networkable":11}],9:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.GameRules = void 0; const networkable_1 = require("./networkable"); /** * Represents the game rules. */ class GameRules extends networkable_1.Networkable { /** * @returns Is the game currently in 'warmup' mode? */ get isWarmup() { return this.getProp("DT_CSGameRules", "m_bWarmupPeriod"); } /** * @deprecated Use `GameRules#roundsPlayed` instead. */ get roundNumber() { return this.roundsPlayed; } /** * This value is incremented when the scores are updated at round end. * If you need to keep track of the current round number, store this value * at each `round_start`. * * @returns Total number of rounds played. */ get roundsPlayed() { return this.getProp("DT_CSGameRules", "m_totalRoundsPlayed"); } /** * @returns 'first', 'second', 'halftime' or 'postgame' */ get phase() { const gamePhases = { 2: "first", 3: "second", 4: "halftime", 5: "postgame" }; const phase = this.getProp("DT_CSGameRules", "m_gamePhase"); return gamePhases[phase]; } } exports.GameRules = GameRules; },{"./networkable":11}],10:[function(require,module,exports){ "use strict"; // DO NOT MODIFY! // Auto-generated by ./generators/itemdefs.ts Object.defineProperty(exports, "__esModule", { value: true }); exports.paintKitIndexMap = exports.itemDefinitionIndexMap = void 0; exports.itemDefinitionIndexMap = { "1": { className: "weapon_deagle", itemName: "Desert Eagle" }, "2": { className: "weapon_elite", itemName: "Dual Berettas" }, "3": { className: "weapon_fiveseven", itemName: "Five-SeveN" }, "4": { className: "weapon_glock", itemName: "Glock-18" }, "7": { className: "weapon_ak47", itemName: "AK-47" }, "8": { className: "weapon_aug", itemName: "AUG" }, "9": { className: "weapon_awp", itemName: "AWP" }, "10": { className: "weapon_famas", itemName: "FAMAS" }, "11": { className: "weapon_g3sg1", itemName: "G3SG1" }, "13": { className: "weapon_galilar", itemName: "Galil AR" }, "14": { className: "weapon_m249", itemName: "M249" }, "16": { className: "weapon_m4a1", itemName: "M4A4" }, "17": { className: "weapon_mac10", itemName: "MAC-10" }, "19": { className: "weapon_p90", itemName: "P90" }, "20": { className: "weapon_zone_repulsor", itemName: "Repulsor Device" }, "23": { className: "weapon_mp5sd", itemName: "MP5-SD" }, "24": { className: "weapon_ump45", itemName: "UMP-45" }, "25": { className: "weapon_xm1014", itemName: "XM1014" }, "26": { className: "weapon_bizon", itemName: "PP-Bizon" }, "27": { className: "weapon_mag7", itemName: "MAG-7" }, "28": { className: "weapon_negev", itemName: "Negev" }, "29": { className: "weapon_sawedoff", itemName: "Sawed-Off" }, "30": { className: "weapon_tec9", itemName: "Tec-9" }, "31": { className: "weapon_taser", itemName: "Zeus x27" }, "32": { className: "weapon_hkp2000", itemName: "P2000" }, "33": { className: "weapon_mp7", itemName: "MP7" }, "34": { className: "weapon_mp9", itemName: "MP9" }, "35": { className: "weapon_nova", itemName: "Nova" }, "36": { className: "weapon_p250", itemName: "P250" }, "37": { className: "weapon_shield", itemName: "Riot Shield" }, "38": { className: "weapon_scar20", itemName: "SCAR-20" }, "39": { className: "weapon_sg556", itemName: "SG 553" }, "40": { className: "weapon_ssg08", itemName: "SSG 08" }, "41": { className: "weapon_knifegg", itemName: "Knife" }, "42": { className: "weapon_knife", itemName: "Knife" }, "43": { className: "weapon_flashbang", itemName: "Flashbang" }, "44": { className: "weapon_hegrenade", itemName: "High Explosive Grenade" }, "45": { className: "weapon_smokegrenade", itemName: "Smoke Grenade" }, "46": { className: "weapon_molotov", itemName: "Molotov" }, "47": { className: "weapon_decoy", itemName: "Decoy Grenade" }, "48": { className: "weapon_incgrenade", itemName: "Incendiary Grenade" }, "49": { className: "weapon_c4", itemName: "C4 Explosive" }, "57": { className: "weapon_healthshot", itemName: "Medi-Shot" }, "59": { className: "weapon_knife_t", itemName: "Knife" }, "60": { className: "weapon_m4a1_silencer", itemName: "M4A1-S" }, "61": { className: "weapon_usp_silencer", itemName: "USP-S" }, "63": { className: "weapon_cz75a", itemName: "CZ75-Auto" }, "64": { className: "weapon_revolver", itemName: "R8 Revolver" }, "68": { className: "weapon_tagrenade", itemName: "Tactical Awareness Grenade" }, "69": { className: "weapon_fists", itemName: "Bare Hands" }, "70": { className: "weapon_breachcharge", itemName: "Breach Charge" }, "72": { className: "weapon_tablet", itemName: "Tablet" }, "75": { className: "weapon_axe", itemName: "Axe" }, "76": { className: "weapon_hammer", itemName: "Hammer" }, "78": { className: "weapon_spanner", itemName: "Wrench" }, "80": { className: "weapon_knife_ghost", itemName: "Knife" }, "81": { className: "weapon_firebomb", itemName: "Fire Bomb" }, "82": { className: "weapon_diversion", itemName: "Diversion Device" }, "83": { className: "weapon_frag_grenade", itemName: "Frag Grenade" }, "84": { className: "weapon_snowball", itemName: "Snowball" }, "85": { className: "weapon_bumpmine", itemName: "Bump Mine" }, "500": { className: "weapon_bayonet", itemName: "Bayonet" }, "503": { className: "weapon_knife_css", itemName: "Classic Knife" }, "505": { className: "weapon_knife_flip", itemName: "Flip Knife" }, "506": { className: "weapon_knife_gut", itemName: "Gut Knife" }, "507": { className: "weapon_knife_karambit", itemName: "Karambit" }, "508": { className: "weapon_knife_m9_bayonet", itemName: "M9 Bayonet" }, "509": { className: "weapon_knife_tactical", itemName: "Huntsman Knife" }, "512": { className: "weapon_knife_falchion", itemName: "Falchion Knife" }, "514": { className: "weapon_knife_survival_bowie", itemName: "Bowie Knife" }, "515": { className: "weapon_knife_butterfly", itemName: "Butterfly Knife" }, "516": { className: "weapon_knife_push", itemName: "Shadow Daggers" }, "517": { className: "weapon_knife_cord", itemName: "Paracord Knife" }, "518": { className: "weapon_knife_canis", itemName: "Survival Knife" }, "519": { className: "weapon_knife_ursus", itemName: "Ursus Knife" }, "520": { className: "weapon_knife_gypsy_jackknife", itemName: "Navaja Knife" }, "521": { className: "weapon_knife_outdoor", itemName: "Nomad Knife" }, "522": { className: "weapon_knife_stiletto", itemName: "Stiletto Knife" }, "523": { className: "weapon_knife_widowmaker", itemName: "Talon Knife" }, "525": { className: "weapon_knife_skeleton", itemName: "Skeleton Knife" } }; exports.paintKitIndexMap = { "0": { name: "default", tag: "-" }, "2": { name: "so_olive", tag: "Groundwater" }, "3": { name: "so_red", tag: "Candy Apple" }, "5": { name: "hy_ddpat", tag: "Forest DDPAT" }, "6": { name: "hy_arctic", tag: "Arctic Camo" }, "8": { name: "hy_desert", tag: "Desert Storm" }, "9": { name: "hy_tiger", tag: "Bengal Tiger" }, "10": { name: "hy_copperhead", tag: "Copperhead" }, "11": { name: "hy_skulls", tag: "Skulls" }, "12": { name: "hy_webs", tag: "Crimson Web" }, "13": { name: "hy_splatter", tag: "Blue Streak" }, "14": { name: "hy_ak47lam", tag: "Red Laminate" }, "15": { name: "hy_gelpen", tag: "Gunsmoke" }, "16": { name: "hy_v_tiger", tag: "Jungle Tiger" }, "17": { name: "hy_ddpat_urb", tag: "Urban DDPAT" }, "20": { name: "hy_zombie", tag: "Virus" }, "21": { name: "hy_granite", tag: "Granite Marbleized" }, "22": { name: "sp_spray", tag: "Contrast Spray" }, "25": { name: "sp_leaves", tag: "Forest Leaves" }, "26": { name: "sp_short_tape", tag: "Lichen Dashed" }, "27": { name: "sp_tape", tag: "Bone Mask" }, "28": { name: "an_navy", tag: "Anodized Navy" }, "30": { name: "sp_snake", tag: "Snake Camo" }, "32": { name: "an_silver", tag: "Silver" }, "33": { name: "an_red", tag: "Hot Rod" }, "34": { name: "am_urban", tag: "Metallic DDPAT" }, "36": { name: "am_ossify", tag: "Ossified" }, "37": { name: "aa_flames", tag: "Blaze" }, "38": { name: "aa_fade", tag: "Fade" }, "39": { name: "so_yellow", tag: "Bulldozer" }, "40": { name: "so_night", tag: "Night" }, "41": { name: "aq_copper", tag: "Copper" }, "42": { name: "aq_blued", tag: "Blue Steel" }, "43": { name: "aq_forced", tag: "Stained" }, "44": { name: "aq_oiled", tag: "Case Hardened" }, "46": { name: "so_pmc", tag: "Contractor" }, "47": { name: "so_space_marine", tag: "Colony" }, "48": { name: "am_dragon_glock", tag: "Dragon Tattoo" }, "51": { name: "am_lightning_awp", tag: "Lightning Strike" }, "59": { name: "am_zebra", tag: "Slaughter" }, "60": { name: "am_zebra_dark", tag: "Dark Water" }, "61": { name: "aa_vertigo", tag: "Hypnotic" }, "62": { name: "cu_spring_nova", tag: "Bloomstick" }, "67": { name: "am_slither_p90", tag: "Cold Blooded" }, "70": { name: "am_carbon_fiber", tag: "Carbon Fiber" }, "71": { name: "am_scorpion_p2000", tag: "Scorpion" }, "72": { name: "sp_mesh_tan", tag: "Safari Mesh" }, "73": { name: "hy_feathers_aug", tag: "Wings" }, "74": { name: "hy_arctic_contrast", tag: "Polar Camo" }, "75": { name: "hy_blizzard", tag: "Blizzard Marbleized" }, "76": { name: "hy_forest_winter", tag: "Winter Forest" }, "77": { name: "hy_forest_boreal", tag: "Boreal Forest" }, "78": { name: "hy_forest_night", tag: "Forest Night" }, "83": { name: "hy_ddpat_orange", tag: "Orange DDPAT" }, "84": { name: "hy_ddpat_pink", tag: "Pink DDPAT" }, "90": { name: "hy_mottled_sand", tag: "Mudder" }, "92": { name: "hy_reef", tag: "Cyanospatter" }, "93": { name: "so_caramel", tag: "Caramel" }, "95": { name: "so_grassland", tag: "Grassland" }, "96": { name: "so_moss", tag: "Blue Spruce" }, "98": { name: "so_purple", tag: "Ultraviolet" }, "99": { name: "so_sand", tag: "Sand Dune" }, "100": { name: "so_stormfront", tag: "Storm" }, "101": { name: "so_tornado", tag: "Tornado" }, "102": { name: "so_whiteout", tag: "Whiteout" }, "104": { name: "sp_leaves_grassland", tag: "Grassland Leaves" }, "107": { name: "sp_mesh_arctic_contrast", tag: "Polar Mesh" }, "110": { name: "sp_mesh_forest_fire", tag: "Condemned" }, "111": { name: "sp_mesh_glacier", tag: "Glacier Mesh" }, "116": { name: "sp_mesh_sand", tag: "Sand Mesh" }, "119": { name: "sp_spray_desert_sage", tag: "Sage Spray" }, "122": { name: "sp_spray_jungle", tag: "Jungle Spray" }, "124": { name: "sp_spray_sand", tag: "Sand Spray" }, "125": { name: "cu_xray_p250", tag: "X-Ray" }, "135": { name: "sp_tape_dots_urban", tag: "Urban Perforated" }, "136": { name: "sp_tape_dots_waves", tag: "Waves Perforated" }, "141": { name: "sp_tape_orange", tag: "Orange Peel" }, "143": { name: "sp_tape_urban", tag: "Urban Masked" }, "147": { name: "sp_tape_short_jungle", tag: "Jungle Dashed" }, "148": { name: "sp_tape_short_sand", tag: "Sand Dashed" }, "149": { name: "sp_tape_short_urban", tag: "Urban Dashed" }, "151": { name: "so_jungle", tag: "Jungle" }, "153": { name: "so_tangerine", tag: "Demolition" }, "154": { name: "cu_broken_path_famas", tag: "Afterimage" }, "155": { name: "cu_bullet_rain_m4a1", tag: "Bullet Rain" }, "156": { name: "cu_catskulls_p90", tag: "Death by Kitty" }, "157": { name: "sp_palm", tag: "Palm" }, "158": { name: "cu_walnut_nova", tag: "Walnut" }, "159": { name: "aq_brass", tag: "Brass" }, "162": { name: "sp_splash_p250", tag: "Splash" }, "164": { name: "hy_hunter_modern", tag: "Modern Hunter" }, "165": { name: "hy_hunter_blaze_pink", tag: "Splash Jam" }, "166": { name: "hy_hunter_blaze_orange", tag: "Blaze Orange" }, "167": { name: "sp_nukestripe_orange", tag: "Radiation Hazard" }, "168": { name: "sp_nukestripe_green", tag: "Nuclear Threat" }, "169": { name: "sp_nukestripe_maroon", tag: "Fallout Warning" }, "170": { name: "sp_zebracam", tag: "Predator" }, "171": { name: "sp_nukestripe_brown", tag: "Irradiated Alert" }, "172": { name: "hy_ak47lam_bw", tag: "Black Laminate" }, "174": { name: "hy_blam_simple", tag: "BOOM" }, "175": { name: "sp_dapple", tag: "Scorched" }, "176": { name: "sp_zebracam_bw", tag: "Faded Zebra" }, "177": { name: "hy_icosahedron", tag: "Memento" }, "178": { name: "hy_doomkitty", tag: "Doomkitty" }, "179": { name: "sp_nukestripe_green_tec9", tag: "Nuclear Threat" }, "180": { name: "cu_fireserpent_ak47_bravo", tag: "Fire Serpent" }, "181": { name: "cu_favela_awp", tag: "Corticera" }, "182": { name: "cu_dragon_p90_bravo", tag: "Emerald Dragon" }, "183": { name: "hy_siege_bravo", tag: "Overgrowth" }, "184": { name: "cu_favela_p2000", tag: "Corticera" }, "185": { name: "am_scales_bravo", tag: "Golden Koi" }, "186": { name: "sp_spray_waves_bravo", tag: "Wave Spray" }, "187": { name: "sp_star_bravo", tag: "Zirka" }, "188": { name: "aq_etched_mac10_bravo", tag: "Graven" }, "189": { name: "hy_ocean_bravo", tag: "Bright Water" }, "190": { name: "cu_season_elites_bravo", tag: "Black Limba" }, "191": { name: "hy_seaside_bravo", tag: "Tempest" }, "192": { name: "hy_crumple_bravo", tag: "Shattered" }, "193": { name: "sp_skull_diagram_bravo", tag: "Bone Pile" }, "194": { name: "sp_spitfire_famas_bravo", tag: "Spitfire" }, "195": { name: "hy_bluepolygon_bravo", tag: "Demeter" }, "196": { name: "an_emerald_bravo", tag: "Emerald" }, "197": { name: "an_navy_bravo", tag: "Anodized Navy" }, "198": { name: "sp_hazard_bravo", tag: "Hazard" }, "199": { name: "sp_tape_dots_bravo", tag: "Dry Season" }, "200": { name: "hy_mayan_dreams_bravo", tag: "Mayan Dreams" }, "201": { name: "sp_palm_bravo", tag: "Palm" }, "202": { name: "hy_ddpat_jungle_bravo", tag: "Jungle DDPAT" }, "203": { name: "aq_steel_bravo", tag: "Rust Coat" }, "204": { name: "hy_ali_tile_bravo", tag: "Mosaico" }, "205": { name: "so_jungle_bravo", tag: "Jungle" }, "206": { name: "so_tornado_bravo", tag: "Tornado" }, "207": { name: "hy_crumple_dark_bravo", tag: "Facets" }, "208": { name: "so_sand_bravo", tag: "Sand Dune" }, "209": { name: "so_olive_bravo", tag: "Groundwater" }, "210": { name: "an_gunmetal_bravo", tag: "Anodized Gunmetal" }, "211": { name: "am_ossify_blue_p2000_bravo", tag: "Ocean Foam" }, "212": { name: "am_crumple_bravo", tag: "Graphite" }, "213": { name: "am_ossify_blue", tag: "Ocean Foam" }, "214": { name: "am_crumple", tag: "Graphite" }, "215": { name: "cu_xray_m4", tag: "X-Ray" }, "216": { name: "an_titanium30v", tag: "Blue Titanium" }, "217": { name: "hy_redtiger", tag: "Blood Tiger" }, "218": { name: "hy_bluehex", tag: "Hexane" }, "219": { name: "hy_redhex", tag: "Hive" }, "220": { name: "am_ossify_red", tag: "Hemoglobin" }, "221": { name: "am_electric_red", tag: "Serum" }, "222": { name: "cu_shark", tag: "Blood in the Water" }, "223": { name: "hy_flowers", tag: "Nightshade" }, "224": { name: "hy_water_crest", tag: "Water Sigil" }, "225": { name: "sp_camo_wood_blue", tag: "Ghost Camo" }, "226": { name: "hy_ak47lam_blue", tag: "Blue Laminate" }, "227": { name: "hy_hive", tag: "Electric Hive" }, "228": { name: "hy_modspots", tag: "Blind Spot" }, "229": { name: "sp_zebracam_blue", tag: "Azure Zebra" }, "230": { name: "am_ddpatdense_silver", tag: "Steel Disruption" }, "231": { name: "am_ddpatdense_peacock", tag: "Cobalt Disruption" }, "232": { name: "hy_webs_darker", tag: "Crimson Web" }, "233": { name: "sp_palm_shadow", tag: "Tropical Storm" }, "234": { name: "sp_twigs", tag: "Ash Wood" }, "235": { name: "hy_varicamo", tag: "VariCamo" }, "236": { name: "hy_varicamo_night", tag: "Night Ops" }, "237": { name: "hy_varicamo_urban", tag: "Urban Rubble" }, "238": { name: "hy_varicamo_blue", tag: "VariCamo Blue" }, "240": { name: "hy_varicamo_desert", tag: "CaliCamo" }, "241": { name: "sp_mesh_slashes", tag: "Hunting Blind" }, "242": { name: "sp_mesh_army", tag: "Army Mesh" }, "243": { name: "sp_mesh_python", tag: "Gator Mesh" }, "244": { name: "sp_mesh_hot_and_cold", tag: "Teardown" }, "245": { name: "sp_spray_army", tag: "Army Recon" }, "246": { name: "aa_fade_metallic", tag: "Amber Fade" }, "247": { name: "aq_damascus_sg553", tag: "Damascus Steel" }, "248": { name: "am_crystallized", tag: "Red Quartz" }, "249": { name: "am_crystallized_blue", tag: "Cobalt Quartz" }, "250": { name: "hy_varicamo_red", tag: "Full Stop" }, "251": { name: "hy_snakeskin", tag: "Pit Viper" }, "252": { name: "am_crystallized_silver", tag: "Silver Quartz" }, "253": { name: "aa_fade_grassland", tag: "Acid Fade" }, "254": { name: "so_orange_accents", tag: "Nitro" }, "255": { name: "cu_m4_asimov", tag: "Asiimov" }, "256": { name: "cu_sawedoff_octopump", tag: "The Kraken" }, "257": { name: "cu_m4a1-s_elegant", tag: "Guardian" }, "258": { name: "cu_p250_refined", tag: "Mehndi" }, "259": { name: "cu_awp_cobra", tag: "Redline" }, "260": { name: "cu_famas_pulse", tag: "Pulse" }, "261": { name: "hy_marina_sunrise", tag: "Marina" }, "262": { name: "am_thorny_rose_mp9", tag: "Rose Iron" }, "263": { name: "cu_skull_nova", tag: "Rising Skull" }, "264": { name: "cu_sandstorm", tag: "Sandstorm" }, "265": { name: "hy_kami", tag: "Kami" }, "266": { name: "aq_obsidian", tag: "Magma" }, "267": { name: "am_turqoise_halftone", tag: "Cobalt Halftone" }, "268": { name: "am_diamond_plate", tag: "Tread Plate" }, "269": { name: "am_fuschia", tag: "The Fuschia Is Now" }, "270": { name: "aq_etched_cz75", tag: "Victoria" }, "271": { name: "am_p250_beaded_paint", tag: "Undertow" }, "272": { name: "am_fluted_tec9", tag: "Titanium Bit" }, "273": { name: "aq_engraved_deagle", tag: "Heirloom" }, "274": { name: "am_copper_flecks", tag: "Copper Galaxy" }, "275": { name: "hy_poly_camo", tag: "Red FragCam" }, "276": { name: "so_panther", tag: "Panther" }, "277": { name: "aq_usp_stainless", tag: "Stainless" }, "278": { name: "hy_craquelure", tag: "Blue Fissure" }, "279": { name: "cu_awp_asimov", tag: "Asiimov" }, "280": { name: "cu_aug_chameleonaire", tag: "Chameleon" }, "281": { name: "cu_ump_corporal", tag: "Corporal" }, "282": { name: "cu_ak47_cobra", tag: "Redline" }, "283": { name: "cu_p90_trigon", tag: "Trigon" }, "284": { name: "cu_mac10_redhot", tag: "Heat" }, "285": { name: "sp_negev_turq_terrain", tag: "Terrain" }, "286": { name: "cu_nova_antique", tag: "Antique" }, "287": { name: "cu_sg553_pulse", tag: "Pulse" }, "288": { name: "an_famas_sgt", tag: "Sergeant" }, "289": { name: "cu_tec9_sandstorm", tag: "Sandstorm" }, "290": { name: "cu_usp_elegant", tag: "Guardian" }, "291": { name: "cu_mag7_heaven", tag: "Heaven Guard" }, "293": { name: "hy_nerodia", tag: "Death Rattle" }, "294": { name: "so_green", tag: "Green Apple" }, "295": { name: "cu_money", tag: "Franklin" }, "296": { name: "am_crystallized_dark", tag: "Meteorite" }, "297": { name: "so_orca", tag: "Tuxedo" }, "298": { name: "am_army_shine", tag: "Army Sheen" }, "299": { name: "am_oval_hex", tag: "Caged Steel" }, "300": { name: "cu_pinstripe_ak47", tag: "Emerald Pinstripe" }, "301": { name: "am_m4a1-s_alloy_orange", tag: "Atomic Alloy" }, "302": { name: "cu_ak47_rubber", tag: "Vulcan" }, "303": { name: "cu_tec9_asiimov", tag: "Isaac" }, "304": { name: "cu_ssg08_immortal", tag: "Slashed" }, "305": { name: "cu_aug_progressiv", tag: "Torque" }, "306": { name: "cu_bizon_antique", tag: "Antique" }, "307": { name: "cu_retribution", tag: "Retribution" }, "308": { name: "hy_galil_kami", tag: "Kami" }, "309": { name: "cu_m4a1_howling", tag: "Howl" }, "310": { name: "cu_mac10_decay", tag: "Curse" }, "311": { name: "cu_p90_scorpius", tag: "Desert Warfare" }, "312": { name: "cu_scar_cyrex", tag: "Cyrex" }, "313": { name: "cu_usp_spitfire", tag: "Orion" }, "314": { name: "cu_xm1014_heaven_guard", tag: "Heaven Guard" }, "315": { name: "am_nitrogen", tag: "Poison Dart" }, "316": { name: "cu_panther_ak47", tag: "Jaguar" }, "317": { name: "cu_bratatat_negev", tag: "Bratatat" }, "318": { name: "cu_usp_sandpapered", tag: "Road Rash" }, "319": { name: "hy_ssg08_marker", tag: "Detour" }, "320": { name: "hy_snakeskin_red", tag: "Red Python" }, "321": { name: "cu_m4a1-s_silence", tag: "Master Piece" }, "322": { name: "so_orange_accents2", tag: "Nitro" }, "323": { name: "aq_steel", tag: "Rust Coat" }, "325": { name: "am_royal", tag: "Chalice" }, "326": { name: "am_metals", tag: "Knight" }, "327": { name: "am_chainmail", tag: "Chainmail" }, "328": { name: "aq_handcannon", tag: "Hand Cannon" }, "329": { name: "am_metal_inlay", tag: "Dark Age" }, "330": { name: "hy_vines", tag: "Briar" }, "332": { name: "hy_indigo_usp", tag: "Royal Blue" }, "333": { name: "so_indigo_and_grey", tag: "Indigo" }, "334": { name: "am_gyrate", tag: "Twist" }, "335": { name: "an_royalbleed", tag: "Module" }, "336": { name: "cu_titanstorm", tag: "Desert-Strike" }, "337": { name: "cu_korupt", tag: "Tatter" }, "338": { name: "cu_p2000_pulse", tag: "Pulse" }, "339": { name: "cu_kaiman", tag: "Caiman" }, "340": { name: "cu_well_traveled_ak47", tag: "Jet Set" }, "341": { name: "cu_green_leather_ak47", tag: "First Class" }, "342": { name: "cu_brown_leather_p90", tag: "Leather" }, "343": { name: "cu_luggage_mac10", tag: "Commuter" }, "344": { name: "cu_medieval_dragon_awp", tag: "Dragon Lore" }, "345": { name: "cu_green_leather_sawedoff", tag: "First Class" }, "346": { name: "cu_luggage_p2000", tag: "Coach Class" }, "347": { name: "aq_pilot_deagle", tag: "Pilot" }, "348": { name: "cu_leather_xm1014", tag: "Red Leather" }, "349": { name: "cu_bizon-osiris", tag: "Osiris" }, "350": { name: "cu_c75a-tiger", tag: "Tigris" }, "351": { name: "cu_deagle_aureus", tag: "Conspiracy" }, "352": { name: "aq_57_feathers", tag: "Fowl Play" }, "353": { name: "cu_glock-liquescent", tag: "Water Elemental" }, "354": { name: "cu_mp7-commander", tag: "Urban Hazard" }, "355": { name: "cu_negev_titanstorm", tag: "Desert-Strike" }, "356": { name: "cu_nova_koi", tag: "Koi" }, "357": { name: "cu_p2000_ivory", tag: "Ivory" }, "358": { name: "cu_bittersweet", tag: "Supernova" }, "359": { name: "cu_p90-asiimov", tag: "Asiimov" }, "360": { name: "cu_m4a1s_cyrex", tag: "Cyrex" }, "361": { name: "aq_leviathan", tag: "Abyss" }, "362": { name: "hy_lines_orange", tag: "Labyrinth" }, "363": { name: "cu_luggage_sg553", tag: "Traveler" }, "364": { name: "cu_luggage_usp-s", tag: "Business Class" }, "365": { name: "hy_plaid1", tag: "Olive Plaid" }, "366": { name: "hy_plaid2", tag: "Green Plaid" }, "367": { name: "am_nuclear_pattern1_glock", tag: "Reactor" }, "368": { name: "hy_nuclear_pattern2_mp9", tag: "Setting Sun" }, "369": { name: "sp_nuclear_pattern3_negev", tag: "Nuclear Waste" }, "370": { name: "am_nuclear_skulls1_xm1014", tag: "Bone Machine" }, "371": { name: "am_nuclear_skulls2_famas", tag: "Styx" }, "372": { name: "am_nuclear_skulls3_mac10", tag: "Nuclear Garden" }, "373": { name: "hy_nuclear_skulls4_p250", tag: "Contamination" }, "374": { name: "hy_nuclear_skulls5_tec9", tag: "Toxic" }, "375": { name: "sp_nukestripe_orange_aug", tag: "Radiation Hazard" }, "376": { name: "so_grey_nuclear_green_bizon", tag: "Chemical Green" }, "377": { name: "so_grey_nuclear_orange_five_seven", tag: "Hot Shot" }, "378": { name: "sp_nukestripe_maroon_sg553", tag: "Fallout Warning" }, "379": { name: "cu_cerbrus_galil", tag: "Cerberus" }, "380": { name: "cu_tribute_ak47", tag: "Wasteland Rebel" }, "381": { name: "aq_glock_coiled", tag: "Grinder" }, "382": { name: "am_g3sg1_murky", tag: "Murky" }, "383": { name: "aq_m4a1s_basilisk", tag: "Basilisk" }, "384": { name: "cu_m4a4_griffin", tag: "Griffin" }, "385": { name: "sp_mag7_firebitten", tag: "Firestarter" }, "386": { name: "cu_mp9_chevron", tag: "Dart" }, "387": { name: "cu_fiveseven_urban_hazard", tag: "Urban Hazard" }, "388": { name: "aq_p250_cartel", tag: "Cartel" }, "389": { name: "cu_p2000_fire_elemental", tag: "Fire Elemental" }, "390": { name: "aq_sawedoff_blackgold", tag: "Highwayman" }, "391": { name: "cu_scar20_intervention", tag: "Cardiac" }, "392": { name: "sp_ump45_d-visions", tag: "Delusion" }, "393": { name: "cu_xm1014_caritas", tag: "Tranquility" }, "394": { name: "aq_ak47_cartel", tag: "Cartel" }, "395": { name: "am_awp_glory", tag: "Man-o'-war" }, "396": { name: "cu_elites_urbanstorm", tag: "Urban Shock" }, "397": { name: "aq_deagle_naga", tag: "Naga" }, "398": { name: "cu_galil_abrasion", tag: "Chatterbox" }, "399": { name: "cu_glock_deathtoll", tag: "Catacombs" }, "400": { name: "cu_m4a4_ancestral", tag: "龍王 (Dragon King)" }, "401": { name: "cu_m249_sektor", tag: "System Lock" }, "402": { name: "am_mac10_malachite", tag: "Malachite" }, "403": { name: "cu_mp9_deadly_poison", tag: "Deadly Poison" }, "404": { name: "cu_p250_mandala", tag: "Muertos" }, "405": { name: "cu_sawedoff_deva", tag: "Serenity" }, "406": { name: "aq_scar20_leak", tag: "Grotto" }, "407": { name: "aq_xm1014_sigla", tag: "Quicksilver" }, "409": { name: "an_tiger_orange", tag: "Tiger Tooth" }, "410": { name: "aq_damascus", tag: "Damascus Steel" }, "411": { name: "aq_damascus_90", tag: "Damascus Steel" }, "413": { name: "am_marble_fade", tag: "Marble Fade" }, "414": { name: "aq_steel_knife", tag: "Rust Coat" }, "415": { name: "am_ruby_marbleized", tag: "Doppler" }, "416": { name: "am_sapphire_marbleized", tag: "Doppler" }, "417": { name: "am_blackpearl_marbleized", tag: "Doppler" }, "418": { name: "am_doppler_phase1", tag: "Doppler" }, "419": { name: "am_doppler_phase2", tag: "Doppler" }, "420": { name: "am_doppler_phase3", tag: "Doppler" }, "421": { name: "am_doppler_phase4", tag: "Doppler" }, "422": { name: "cu_ak47_mastery", tag: "Elite Build" }, "423": { name: "aq_mp7_ultramodern", tag: "Armor Core" }, "424": { name: "aq_awp_twine", tag: "Worm God" }, "425": { name: "am_bronze_sparkle", tag: "Bronze Deco" }, "426": { name: "aq_p250_contour", tag: "Valence" }, "427": { name: "cu_fiveseven_banana", tag: "Monkey Business" }, "428": { name: "cu_galil_eco", tag: "Eco" }, "429": { name: "aq_famas_jinn", tag: "Djinn" }, "430": { name: "cu_m4a1_hyper_beast", tag: "Hyper Beast" }, "431": { name: "cu_mag7_redhot", tag: "Heat" }, "432": { name: "am_negev_glory", tag: "Man-o'-war" }, "433": { name: "cu_mac10_neonrider", tag: "Neon Rider" }, "434": { name: "cu_sawedoff_origami", tag: "Origami" }, "435": { name: "cu_cz75_precision", tag: "Pole Position" }, "436": { name: "am_ump_racer", tag: "Grand Prix" }, "437": { name: "am_aqua_flecks", tag: "Twilight Galaxy" }, "438": { name: "cu_chronos_g3sg1", tag: "Chronos" }, "439": { name: "hy_hades", tag: "Hades" }, "440": { name: "hy_icarus", tag: "Icarus Fell" }, "441": { name: "cu_labyrinth", tag: "Minotaur's Labyrinth" }, "442": { name: "sp_labyrinth", tag: "Asterion" }, "443": { name: "sp_labyrinth2", tag: "Pathfinder" }, "444": { name: "sp_labyrinth3", tag: "Daedalus" }, "445": { name: "an_red_m4a1s", tag: "Hot Rod" }, "446": { name: "cu_medusa_awp", tag: "Medusa" }, "447": { name: "gs_mother_of_pearl_elite", tag: "Duelist" }, "448": { name: "aa_pandora", tag: "Pandora's Box" }, "449": { name: "cu_poseidon", tag: "Poseidon" }, "450": { name: "hy_zodiac1", tag: "Moon in Libra" }, "451": { name: "hy_zodiac2", tag: "Sun in Leo" }, "452": { name: "hy_zodiac3", tag: "Shipping Forecast" }, "453": { name: "an_emerald", tag: "Emerald" }, "454": { name: "so_khaki_green", tag: "Para Green" }, "455": { name: "cu_anime_aug", tag: "Akihabara Accept" }, "456": { name: "am_bamboo_jungle", tag: "Hydroponic" }, "457": { name: "hy_bamboo_jungle_ink", tag: "Bamboo Print" }, "458": { name: "hy_bamboo_jungle_black", tag: "Bamboo Shadow" }, "459": { name: "hy_bamboo_jungle", tag: "Bamboo Forest" }, "460": { name: "am_geometric_steps", tag: "Aqua Terrace" }, "462": { name: "hy_geometric_steps_green", tag: "Counter Terrace" }, "463": { name: "hy_geometric_steps_yellow", tag: "Terrace" }, "464": { name: "hy_kimono_diamonds", tag: "Neon Kimono" }, "465": { name: "hy_kimono_diamonds_orange", tag: "Orange Kimono" }, "466": { name: "hy_kimono_diamonds_red", tag: "Crimson Kimono" }, "467": { name: "sp_kimono_diamonds", tag: "Mint Kimono" }, "468": { name: "am_seastorm", tag: "Midnight Storm" }, "469": { name: "am_seastorm_blood", tag: "Sunset Storm 壱" }, "470": { name: "am_seastorm_shojo", tag: "Sunset Storm 弐" }, "471": { name: "am_kimono_sunrise", tag: "Daybreak" }, "472": { name: "so_keycolors", tag: "Impact Drill" }, "473": { name: "so_aqua", tag: "Seabird" }, "474": { name: "cu_ak47_courage_alt", tag: "Aquamarine Revenge" }, "475": { name: "cu_awp_hyper_beast", tag: "Hyper Beast" }, "476": { name: "cu_cz75a_chastizer", tag: "Yellow Jacket" }, "477": { name: "am_famas_dots", tag: "Neural Net" }, "478": { name: "cu_galilar_particles", tag: "Rocket Pop" }, "479": { name: "aq_glock18_flames_blue", tag: "Bunsen Burner" }, "480": { name: "cu_m4a4_evil_daimyo", tag: "Evil Daimyo" }, "481": { name: "cu_mp7_nemsis", tag: "Nemesis" }, "482": { name: "am_mp9_nitrogen", tag: "Ruby Poison Dart" }, "483": { name: "cu_negev_annihilator", tag: "Loudmouth" }, "484": { name: "cu_nova_ranger", tag: "Ranger" }, "485": { name: "aq_p2000_boom", tag: "Handgun" }, "486": { name: "cu_p90_mastery", tag: "Elite Build" }, "487": { name: "cu_sg553_cyrex", tag: "Cyrex" }, "488": { name: "cu_ump45_uproar", tag: "Riot" }, "489": { name: "cu_usp_progressiv", tag: "Torque" }, "490": { name: "cu_ak47_winter_sport", tag: "Frontside Misty" }, "491": { name: "cu_dualberretta_dragons", tag: "Dualing Dragons" }, "492": { name: "cu_famas_lenta", tag: "Survivor Z" }, "493": { name: "gs_g3sg1_flux_purple", tag: "Flux" }, "494": { name: "gs_galil_nightwing", tag: "Stone Cold" }, "495": { name: "gs_glock18_wrathys", tag: "Wraiths" }, "496": { name: "gs_m249_nebula_crusader", tag: "Nebula Crusader" }, "497": { name: "gs_m4a1s_snakebite_gold", tag: "Golden Coil" }, "498": { name: "cu_mac10_alekhya_duo", tag: "Rangeen" }, "499": { name: "cu_mag7_myrcene", tag: "Cobalt Core" }, "500": { name: "cu_mp7_classified", tag: "Special Delivery" }, "501": { name: "hy_p250_crackshot", tag: "Wingshot" }, "502": { name: "gs_scar20_peacemaker03", tag: "Green Marine" }, "503": { name: "cu_ssg08_technicality", tag: "Big Iron" }, "504": { name: "cu_usp_kill_confirmed", tag: "Kill Confirmed" }, "505": { name: "aq_xm1014_scumbria", tag: "Scumbria" }, "506": { name: "cu_ak47_point_disarray", tag: "Point Disarray" }, "507": { name: "am_aug_jumble", tag: "Ricochet" }, "508": { name: "cu_bizon_noxious", tag: "Fuel Rod" }, "509": { name: "aq_deagle_corinthian", tag: "Corinthian" }, "510": { name: "cu_fiveseven_retrobution", tag: "Retrobution" }, "511": { name: "cu_g3sg1_executioner", tag: "The Executioner" }, "512": { name: "gs_m4a4_royal_squire", tag: "Royal Paladin" }, "514": { name: "cu_negev_impact", tag: "Power Loader" }, "515": { name: "am_p2000_imperial_red", tag: "Imperial" }, "516": { name: "cu_p90_shapewood", tag: "Shapewood" }, "517": { name: "gs_sawedoff_necromancer", tag: "Yorick" }, "518": { name: "hy_scar20_jungler", tag: "Outbreak" }, "519": { name: "gs_sg553_tiger_moth", tag: "Tiger Moth" }, "520": { name: "cu_tec9_avalanche", tag: "Avalanche" }, "521": { name: "aq_xm1014_hot_rod", tag: "Teclu Burner" }, "522": { name: "aa_fade_revolver", tag: "Fade" }, "523": { name: "aa_fade_metallic_revolver", tag: "Amber Fade" }, "524": { name: "gs_ak47_supercharged", tag: "Fuel Injector" }, "525": { name: "cu_awp_mastery", tag: "Elite Build" }, "526": { name: "cu_bizon_citizen", tag: "Photic Zone" }, "527": { name: "aq_deserteagle_kumichodragon", tag: "Kumicho Dragon" }, "528": { name: "aq_dualberettas_cartel", tag: "Cartel" }, "529": { name: "aq_famas_contour", tag: "Valence" }, "530": { name: "cu_fiveseven_augmented", tag: "Triumvirate" }, "532": { name: "gs_glock18_award", tag: "Royal Legion" }, "533": { name: "gs_m4a4_pioneer", tag: "The Battlestar" }, "534": { name: "am_mac10_electricity", tag: "Lapis Gator" }, "535": { name: "gs_mag7_praetorian", tag: "Praetorian" }, "536": { name: "sp_mp7_impire", tag: "Impire" }, "537": { name: "cu_nova_hyperbeast", tag: "Hyper Beast" }, "538": { name: "cu_ssg08_necropos", tag: "Necropos" }, "539": { name: "gs_tec9_jambiya", tag: "Jambiya" }, "540": { name: "gs_usp_voltage", tag: "Lead Conduit" }, "541": { name: "cu_aug_swallows", tag: "Fleet Flock" }, "542": { name: "cu_bizon_Curse", tag: "Judgement of Anubis" }, "543": { name: "gs_cz75a_redastor", tag: "Red Astor" }, "544": { name: "gs_dualberettas_ventilators", tag: "Ventilators" }, "545": { name: "sp_g3sg1_militiaorange", tag: "Orange Crash" }, "546": { name: "gs_galilar_incenerator", tag: "Firefight" }, "547": { name: "cu_m249_spectre", tag: "Spectre" }, "548": { name: "cu_m4a1s_soultaker", tag: "Chantico's Fire" }, "549": { name: "am_mp9_bioleak", tag: "Bioleak" }, "550": { name: "hy_p2000_oceani", tag: "Oceanic" }, "551": { name: "cu_p250_asiimov", tag: "Asiimov" }, "552": { name: "gs_sawedoff_fubar", tag: "Fubar" }, "553": { name: "cu_sg553_atlas", tag: "Atlas" }, "554": { name: "gs_ssg08_armacore", tag: "Ghost Crusader" }, "555": { name: "am_tec9_redblast", tag: "Re-Entry" }, "556": { name: "cu_ump45_primalsaber", tag: "Primal Saber" }, "557": { name: "cu_xm1014_spectrum", tag: "Black Tie" }, "558": { name: "cu_bayonet_lore", tag: "Lore" }, "559": { name: "cu_flip_lore", tag: "Lore" }, "560": { name: "cu_gut_lore", tag: "Lore" }, "561": { name: "cu_karam_lore", tag: "Lore" }, "562": { name: "cu_m9_bay_lore", tag: "Lore" }, "563": { name: "cu_bayonet_stonewash", tag: "Black Laminate" }, "564": { name: "cu_flip_stonewash", tag: "Black Laminate" }, "565": { name: "cu_gut_stonewash", tag: "Black Laminate" }, "566": { name: "cu_karam_stonewash", tag: "Black Laminate" }, "567": { name: "cu_m9_bay_stonewash", tag: "Black Laminate" }, "568": { name: "am_emerald_marbleized", tag: "Gamma Doppler" }, "569": { name: "am_gamma_doppler_phase1", tag: "Gamma Doppler" }, "570": { name: "am_gamma_doppler_phase2", tag: "Gamma Doppler" }, "571": { name: "am_gamma_doppler_phase3", tag: "Gamma Doppler" }, "572": { name: "am_gamma_doppler_phase4", tag: "Gamma Doppler" }, "573": { name: "gs_bayonet_autotronic", tag: "Autotronic" }, "574": { name: "gs_flip_autotronic", tag: "Autotronic" }, "575": { name: "gs_gut_autotronic", tag: "Autotronic" }, "576": { name: "gs_karam_autotronic", tag: "Autotronic" }, "577": { name: "gs_m9_bay_autotronic", tag: "Autotronic" }, "578": { name: "hy_ocean_knife", tag: "Bright Water" }, "579": { name: "hy_ocean_knife_90", tag: "Bright Water" }, "580": { name: "am_marked_up", tag: "Freehand" }, "581": { name: "am_marked_up_90", tag: "Freehand" }, "582": { name: "am_marked_up_fine", tag: "Freehand" }, "583": { name: "gs_aug_aristocrat", tag: "Aristocrat" }, "584": { name: "gs_awp_phobos", tag: "Phobos" }, "585": { name: "cu_five_seven_daimyo", tag: "Violent Daimyo" }, "586": { name: "cu_glock_wasteland_rebel", tag: "Wasteland Rebel" }, "587": { name: "gs_m4a1_mecha_industries", tag: "Mecha Industries" }, "588": { name: "cu_m4a4_desolate_space", tag: "Desolate Space" }, "589": { name: "aq_mac_10_alien_camo", tag: "Carnivore" }, "590": { name: "aq_nova_sci_fi", tag: "Exo" }, "591": { name: "gs_p2000_imperial_dragon", tag: "Imperial Dragon" }, "592": { name: "gs_p250_metal_panels", tag: "Iron Clad" }, "593": { name: "gs_p90_full_throttle", tag: "Chopper" }, "594": { name: "gs_pp_bizon_harvester", tag: "Harvester" }, "595": { name: "cu_r8_cybersport", tag: "Reboot" }, "596": { name: "cu_sawed_off_lime", tag: "Limelight" }, "597": { name: "gs_scar20_bloodsport", tag: "Bloodsport" }, "598": { name: "cu_sg553_aerial", tag: "Aerial" }, "599": { name: "am_tec_9_sea_salt", tag: "Ice Cap" }, "600": { name: "cu_ak47_anarchy", tag: "Neon Revolution" }, "601": { name: "gs_aug_syd_mead", tag: "Syd Mead" }, "602": { name: "gs_cz75_tread", tag: "Imprint" }, "603": { name: "aq_desert_eagle_constable", tag: "Directive" }, "604": { name: "gs_famas_rally", tag: "Roll Cage" }, "605": { name: "aq_five_seven_scumbria", tag: "Scumbria" }, "606": { name: "gs_g3sg1_ventilator", tag: "Ventilator" }, "607": { name: "cu_glock18_weasel", tag: "Weasel" }, "608": { name: "cu_mag7_tribal", tag: "Petroglyph" }, "609": { name: "cu_mp9_narcis", tag: "Airlock" }, "610": { name: "hy_negev_dazzle", tag: "Dazzle" }, "611": { name: "cu_p90_grimm", tag: "Grim" }, "612": { name: "gs_scar20_powercore", tag: "Powercore" }, "613": { name: "cu_sg556_triarch", tag: "Triarch" }, "614": { name: "gs_tec9_supercharged", tag: "Fuel Injector" }, "615": { name: "cu_ump45_metritera", tag: "Briefing" }, "616": { name: "hy_xm1014_fractal_blue", tag: "Slipstream" }, "617": { name: "am_blackpearl_marbleized_b", tag: "Doppler" }, "618": { name: "am_doppler_phase2_b", tag: "Doppler" }, "619": { name: "am_sapphire_marbleized_b", tag: "Doppler" }, "620": { name: "cu_purple_huntsman", tag: "Ultraviolet" }, "621": { name: "so_purple_falchion", tag: "Ultraviolet" }, "622": { name: "am_czv2_mf", tag: "Polymer" }, "623": { name: "aq_glock_dark-fall", tag: "Ironwork" }, "624": { name: "cu_ssg08_dragonfire_scope", tag: "Dragonfire" }, "625": { name: "gs_dual_berettas_golden_venice", tag: "Royal Consorts" }, "626": { name: "gs_famas_mecha", tag: "Mecha Industries" }, "627": { name: "gs_final_pooldeadv2", tag: "Cirrus" }, "628": { name: "gs_g3sg1_viper_yellow", tag: "Stinger" }, "629": { name: "cu_galil_ar-camo", tag: "Black Sand" }, "630": { name: "aa_hide-mp9", tag: "Sand Scale" }, "631": { name: "cu_m4a1_flashback", tag: "Flashback" }, "632": { name: "gs_m4a4_sector", tag: "Buzz Kill" }, "633": { name: "am_mag7_malform", tag: "Sonar" }, "634": { name: "am_nova_sand", tag: "Gila" }, "635": { name: "gs_p2000-sport", tag: "Turf" }, "636": { name: "gs_p90_shallow_grave", tag: "Shallow Grave" }, "637": { name: "cu_usp_cyrex", tag: "Cyrex" }, "638": { name: "cu_wp_sawedoff", tag: "Wasteland Princess" }, "639": { name: "gs_ak47_bloodsport", tag: "Bloodsport" }, "640": { name: "cu_awp_psychopath", tag: "Fever Dream" }, "641": { name: "hy_bizon_torn_green", tag: "Jungle Slipstream" }, "642": { name: "cu_blueprint_scar", tag: "Blueprint" }, "643": { name: "gs_cz_snakes_purple", tag: "Xiangliu" }, "644": { name: "gs_m4a1_decimator", tag: "Decimator" }, "645": { name: "cu_desert_eagle_corroden", tag: "Oxide Blaze" }, "646": { name: "cu_fiveseven_vein", tag: "Capillary" }, "647": { name: "sp_galil_wave", tag: "Crimson Tsunami" }, "648": { name: "sp_m249_frog_original", tag: "Emerald Poison Dart" }, "649": { name: "sp_mp7_tribal_yellow", tag: "Akoben" }, "650": { name: "am_p250_sputnik", tag: "Ripple" }, "651": { name: "aa_mac10_the_last_dive", tag: "Last Dive" }, "652": { name: "gs_ump_abyss", tag: "Scaffold" }, "653": { name: "cu_usps_noir", tag: "Neo-Noir" }, "654": { name: "aq_xm_leaf_fade", tag: "Seasons" }, "655": { name: "aq_sawedoff_zander2", tag: "Zander" }, "656": { name: "gs_ak_colony01_red", tag: "Orbit Mk01" }, "657": { name: "cu_usps_blueprint", tag: "Blueprint" }, "658": { name: "gs_dualberettas_cobra", tag: "Cobra Strike" }, "659": { name: "sp_famas_macabre", tag: "Macabre" }, "660": { name: "cu_fiveseven_hyperbeast", tag: "Hyper Beast" }, "661": { name: "cu_galil_candychaos", tag: "Sugar Rush" }, "662": { name: "cu_awp_hannya", tag: "Oni Taiji" }, "663": { name: "cu_m4a1s_metritera", tag: "Briefing" }, "664": { name: "cu_m4a4_hellfire", tag: "Hellfire" }, "665": { name: "am_mac10_aloha", tag: "Aloha" }, "666": { name: "am_mag7_caustic", tag: "Hard Water" }, "667": { name: "cu_p2000_hunter", tag: "Woodsman" }, "668": { name: "cu_p250_axiom", tag: "Red Rock" }, "669": { name: "hy_p90_barebones_blue", tag: "Death Grip" }, "670": { name: "cu_ssg08_deathshead", tag: "Death's Head" }, "671": { name: "aq_tec9_chalk_pattern", tag: "Cut Out" }, "672": { name: "aq_ump45_flameflower", tag: "Metal Flowers" }, "673": { name: "aq_sawed-off_flower", tag: "Morris" }, "674": { name: "cu_aug_orange_triangle", tag: "Triqua" }, "675": { name: "gs_ak47_empress", tag: "The Empress" }, "676": { name: "cu_bizon_all_in", tag: "High Roller" }, "677": { name: "gs_g3sg1_cetme_redux", tag: "Hunter" }, "678": { name: "cu_p250_cybercroc", tag: "See Ya Later" }, "679": { name: "cu_mp9_goo", tag: "Goo" }, "680": { name: "cu_glock_indigo", tag: "Off World" }, "681": { name: "gs_m4a1_shatter", tag: "Leaded Glass" }, "682": { name: "am_mac10_oceani", tag: "Oceanic" }, "683": { name: "gs_r8_llamacannon", tag: "Llama Cannon" }, "684": { name: "cu_tec9_cracked_opal", tag: "Cracked Opal" }, "685": { name: "hy_scar20_jungle_slipstream", tag: "Jungle Slipstream" }, "686": { name: "gs_sg553_phantom", tag: "Phantom" }, "687": { name: "gs_cz75_tacticat", tag: "Tacticat" }, "688": { name: "cu_ump45_x-ray_machine", tag: "Exposure" }, "689": { name: "aq_xm1014_ziggy_anarchy", tag: "Ziggy" }, "690": { name: "gs_aug_stymphalian_birds", tag: "Stymphalian" }, "691": { name: "gs_awp_death", tag: "Mortis" }, "692": { name: "cu_bizon_riot", tag: "Night Riot" }, "693": { name: "gs_fiveseven_hot_rod_violet", tag: "Flame Test" }, "694": { name: "aa_glock_18_urban_moon_fever", tag: "Moonrise" }, "695": { name: "cu_m4a4_neo_noir", tag: "Neo-Noir" }, "696": { name: "gs_mp7_bloodsport", tag: "Bloodsport" }, "697": { name: "cu_mp9_black_sand", tag: "Black Sand" }, "698": { name: "sp_negev_lionfish", tag: "Lionfish" }, "699": { name: "gs_nova_anchorite", tag: "Wild Six" }, "700": { name: "cu_p2000_urban_hazard", tag: "Urban Hazard" }, "701": { name: "gs_revolver_tread", tag: "Grip" }, "702": { name: "sp_sg533_aloha", tag: "Aloha" }, "703": { name: "aq_mag7_swag7", tag: "SWAG-7" }, "704": { name: "cu_ump45_white_fang", tag: "Arctic Wolf" }, "705": { name: "cu_usp_cut", tag: "Cortex" }, "706": { name: "cu_xm1014_oxide_blaze", tag: "Oxide Blaze" }, "707": { name: "cu_ak_neon_rider", tag: "Neon Rider" }, "708": { name: "hy_aug_torn_orange", tag: "Amber Slipstream" }, "709": { name: "cu_cz75_eco", tag: "Eco" }, "710": { name: "sp_elites_winter_raider", tag: "Shred" }, "711": { name: "gs_deagle_aggressor", tag: "Code Red" }, "712": { name: "gs_g3sg1_buccaneer", tag: "High Seas" }, "713": { name: "gs_glock_thunder_dust", tag: "Warhawk" }, "714": { name: "cu_m4a1s_nightmare", tag: "Nightmare" }, "715": { name: "cu_mp9_vein", tag: "Capillary" }, "716": { name: "cu_nova_toy_soldier", tag: "Toy Soldier" }, "717": { name: "gs_p90_tread", tag: "Traction" }, "718": { name: "am_awp_pawpaw", tag: "PAW" }, "719": { name: "gs_powercore_mp7", tag: "Powercore" }, "720": { name: "cu_sawedoff_devourer", tag: "Devourer" }, "721": { name: "cu_r8_survivalist", tag: "Survivalist" }, "722": { name: "cu_tec9_snake", tag: "Snek-9" }, "723": { name: "cu_famas_owl_orange", tag: "Eye of Athena" }, "724": { name: "cu_ak_island_floral", tag: "Wild Lotus" }, "725": { name: "hy_bloom_red", tag: "Day Lily" }, "726": { name: "sp_bloom_orange", tag: "Sunset Lily" }, "727": { name: "am_bloom_blue", tag: "Midnight Lily" }, "728": { name: "sp_bud_green", tag: "Teal Blossom" }, "729": { name: "hy_bud_red", tag: "Crimson Blossom" }, "730": { name: "sp_bud_blue", tag: "Dark Blossom" }, "731": { name: "hy_leaf_green", tag: "Banana Leaf" }, "732": { name: "hy_leaf_blue", tag: "Synth Leaf" }, "733": { name: "sp_leaf_orange", tag: "Rust Leaf" }, "734": { name: "cu_mp9_island_floral", tag: "Wild Lily" }, "735": { name: "sp_nightstripe", tag: "Night Stripe" }, "736": { name: "gs_awp_enamel", tag: "The Prince" }, "737": { name: "gs_mag7_glass", tag: "Cinquedea" }, "738": { name: "hy_murano_orange", tag: "Orange Murano" }, "739": { name: "am_murano_violet", tag: "Violet Murano" }, "740": { name: "hy_murano_blue", tag: "Navy Murano" }, "741": { name: "am_ren_dark", tag: "Dark Filigree" }, "742": { name: "am_ren_red", tag: "Red Filigree" }, "743": { name: "hy_ren_orange", tag: "Orange Filigree" }, "744": { name: "am_veneto_red", tag: "Baroque Red" }, "745": { name: "hy_veneto_purple", tag: "Baroque Purple" }, "746": { name: "am_veneto2", tag: "Baroque Orange" }, "747": { name: "cu_dual_elites_rally", tag: "Twin Turbo" }, "748": { name: "gs_mac10_checker", tag: "Calf Skin" }, "749": { name: "gs_p250_checker", tag: "Vino Primo" }, "750": { name: "cu_sg553_rally", tag: "Integrale" }, "751": { name: "gs_ssg08_checker", tag: "Hand Brake" }, "752": { name: "aa_fade_mp7", tag: "Fade" }, "753": { name: "sp_tape_short_rally", tag: "Dirt Drop" }, "754": { name: "aq_steel_inferno", tag: "Rust Coat" }, "755": { name: "hy_splatter3", tag: "Slide" }, "756": { name: "gs_awp_gungnir", tag: "Gungnir" }, "757": { name: "am_jorm_green", tag: "Emerald Jörmungandr" }, "758": { name: "am_jorm_orange", tag: "Flame Jörmungandr" }, "759": { name: "am_jorm_blue", tag: "Astral Jörmungandr" }, "760": { name: "am_knots_silver", tag: "Frost Borre" }, "761": { name: "am_knots_brown", tag: "Copper Borre" }, "762": { name: "so_rune_stone", tag: "Red Stone" }, "763": { name: "gs_negev_thor", tag: "Mjölnir" }, "764": { name: "gs_deagle_fennec", tag: "Fennec Fox" }, "765": { name: "aa_desert_bloom_bright", tag: "Desert Blossom" }, "775": { name: "hy_blueprint_white", tag: "Facility Sketch" }, "776": { name: "hy_blueprint_aqua", tag: "Facility Negative" }, "777": { name: "hy_blueprint_red", tag: "Facility Draft" }, "778": { name: "hy_blueprint_bluered", tag: "Facility Dark" }, "779": { name: "am_circuitboard_orange", tag: "Random Access" }, "780": { name: "am_circuitboard_silver", tag: "Mainframe" }, "781": { name: "am_circuitboard_aqua", tag: "Co-Processor" }, "782": { name: "am_circuitboard_green", tag: "Motherboard" }, "783": { name: "hy_ducts_yellow", tag: "Bulkhead" }, "784": { name: "hy_ducts_green", tag: "Coolant" }, "785": { name: "hy_ducts_grey", tag: "Mandrel" }, "786": { name: "hy_ducts_blue", tag: "Exchanger" }, "787": { name: "hy_nuclear_hotorange", tag: "Core Breach" }, "788": { name: "hy_nuclear_skulls_redblue", tag: "Acheron" }, "789": { name: "am_nuclear_skulls_green", tag: "Nuclear Garden" }, "790": { name: "hy_nuclear_skulls_aqua", tag: "Cold Fusion" }, "791": { name: "gs_tec9_envoy", tag: "Remote Control" }, "792": { name: "gs_m4a1s_operator", tag: "Control Panel" }, "793": { name: "hy_red_hex", tag: "Converter" }, "794": { name: "sp_mesh_safetyblack", tag: "Sweeper" }, "795": { name: "hy_mesh_safetyorange", tag: "Safety Net" }, "796": { name: "sp_mesh_safetyred", tag: "Check Engine" }, "797": { name: "aa_vertigo_red", tag: "Brake Light" }, "798": { name: "so_orange_accents3", tag: "Nitro" }, "799": { name: "aa_vertigo_blue", tag: "High Beam" }, "800": { name: "hy_labrat_mp5", tag: "Lab Rats" }, "801": { name: "cu_ak47_asiimov", tag: "Asiimov" }, "802": { name: "cu_ump_arrows", tag: "Momentum" }, "803": { name: "cu_awp_neonoir", tag: "Neo-Noir" }, "804": { name: "gs_mp9_colony01", tag: "Modest Threat" }, "805": { name: "gs_deagle_mecha", tag: "Mecha Industries" }, "806": { name: "gs_g3sg1_savage", tag: "Scavenger" }, "807": { name: "hy_galil_signal_red", tag: "Signal" }, "808": { name: "cu_glock18_corroden", tag: "Oxide Blaze" }, "809": { name: "gs_nova_hunter_brute", tag: "Wood Fired" }, "810": { name: "gs_mp5_festival_drip", tag: "Phosphor" }, "811": { name: "gs_m4a4_chopper_ghost", tag: "Magnesium" }, "812": { name: "gs_mac10_exo_pipes", tag: "Pipe Down" }, "813": { name: "aa_p250_gravediggers", tag: "Nevermore" }, "814": { name: "cu_sawedoff_black_sand", tag: "Black Sand" }, "815": { name: "gs_sg553_over_heated", tag: "Danger Close" }, "816": { name: "gs_tec9_fubar", tag: "Fubar" }, "817": { name: "cu_usp_flashback", tag: "Flashback" }, "818": { name: "am_ddpat_purple", tag: "Purple DDPAT" }, "819": { name: "gs_awp_hydra", tag: "Desert Hydra" }, "820": { name: "am_mirage_flowers_metalic", tag: "Music Box" }, "821": { name: "am_moro_textile_bright", tag: "Elegant Vines" }, "822": { name: "am_navy_shine", tag: "Navy Sheen" }, "823": { name: "gs_aug_sand_storm", tag: "Sand Storm" }, "824": { name: "sp_dry_wood", tag: "Drift Wood" }, "825": { name: "sp_desert_skulls_dawn", tag: "Drought" }, "826": { name: "sp_mirage_flowers_tan", tag: "Sienna Damask" }, "827": { name: "sp_moro_carving_burnt", tag: "Humidor" }, "828": { name: "sp_moro_textile_green_vine", tag: "Verdant Growth" }, "829": { name: "hy_lizard_skin", tag: "Anolis" }, "835": { name: "sp_famas_ghost_insects", tag: "Crypsis" }, "836": { name: "cu_ak47_aztec", tag: "Uncharted" }, "837": { name: "cu_five_seven_angry", tag: "Angry Mob" }, "838": { name: "cu_awp_viper", tag: "Atheris" }, "839": { name: "cu_tec9_bamboo", tag: "Bamboozle" }, "840": { name: "gs_mac10_fish_bait", tag: "Whitefish" }, "841": { name: "gs_deagle_exo", tag: "Light Rail" }, "842": { name: "sp_galil_akoben", tag: "Akoben" }, "843": { name: "cu_revolver_oppressor", tag: "Skull Crusher" }, "844": { name: "gs_m4a4_emperor", tag: "The Emperor" }, "845": { name: "cu_aug_momentum", tag: "Momentum" }, "846": { name: "gs_mp5sd_astromatic", tag: "Gauss" }, "847": { name: "cu_mp7_racketeer", tag: "Mischief" }, "848": { name: "aq_p250_verdigris", tag: "Verdigris" }, "849": { name: "cu_p90_offworld", tag: "Off World" }, "850": { name: "cu_xm1014_incinerator", tag: "Incinegator" }, "851": { name: "aa_ump45_moonrise_sunset", tag: "Moonrise" }, "852": { name: "am_doppler_phase1_widow", tag: "Doppler" }, "853": { name: "am_doppler_phase2_widow", tag: "Doppler" }, "854": { name: "am_doppler_phase3_widow", tag: "Doppler" }, "855": { name: "am_doppler_phase4_widow", tag: "Doppler" }, "856": { name: "am_marble_fade_widow", tag: "Marble Fade" }, "857": { name: "aq_damascus_prisma", tag: "Damascus Steel" }, "858": { name: "aq_damascus_widow", tag: "Damascus Steel" }, "859": { name: "am_crystallized_green", tag: "Emerald Quartz" }, "860": { name: "hy_gelpen_dark", tag: "Pyre" }, "861": { name: "sp_asgard_wall", tag: "Barricade" }, "862": { name: "am_crystallized_dark_green", tag: "Moss Quartz" }, "863": { name: "sp_knots_blue", tag: "Night Borre" }, "864": { name: "so_red_sg553", tag: "Candy Apple" }, "865": { name: "hy_canals_tile", tag: "Stone Mosaico" }, "866": { name: "sp_spray_water", tag: "Canal Spray" }, "867": { name: "am_stained_glass", tag: "Stained Glass" }, "868": { name: "hy_flowers_stmarc", tag: "Sea Calico" }, "869": { name: "sp_palm_sunset", tag: "Sundown" }, "870": { name: "sp_palm_green", tag: "Jungle Thicket" }, "871": { name: "sp_twigs_beach", tag: "Surfwood" }, "872": { name: "hy_bamboo_stmarc", tag: "Bamboo Garden" }, "873": { name: "so_aqua_stmarc", tag: "Seabird" }, "879": { name: "aa_fade_ump", tag: "Fade" }, "880": { name: "hy_desert_bloom", tag: "Parched" }, "884": { name: "cu_bizon_road_warrior", tag: "Embargo" }, "885": { name: "gs_ak47_nibbler", tag: "Rat Rod" }, "886": { name: "cu_aug_whitefang", tag: "Arctic Wolf" }, "887": { name: "cu_awp_virus", tag: "Containment Breach" }, "888": { name: "gs_mp5_etch", tag: "Acid Wash" }, "889": { name: "gs_tec9_decimator", tag: "Decimator" }, "890": { name: "cu_nova_featherswing", tag: "Plume" }, "891": { name: "cu_g3sg1_blacksand", tag: "Black Sand" }, "892": { name: "gs_r8_memento", tag: "Memento" }, "893": { name: "cu_mp7_replica", tag: "Neon Ply" }, "894": { name: "cu_p2000_obsidian", tag: "Obsidian" }, "895": { name: "gs_dual_elites_rose", tag: "Balance" }, "896": { name: "sp_scar20_striker_dust", tag: "Torn" }, "897": { name: "cu_sg553_reactor", tag: "Colony IV" }, "898": { name: "gs_mac10_stalker", tag: "Stalker" }, "899": { name: "cu_ssg08_tickler", tag: "Bloodshot" }, "900": { name: "gs_m249_warbird_veteran", tag: "Warbird" }, "902": { name: "aq_m249_aztec", tag: "Aztec" }, "903": { name: "gs_dual_elites_classic", tag: "Elite 1.6" }, "904": { name: "cu_famas_nuke_tension", tag: "Decommissioned" }, "905": { name: "cu_tec9_flash", tag: "Flash Out" }, "906": { name: "cu_fiveseven_gsg9", tag: "Buddy" }, "907": { name: "gs_p250_inferno", tag: "Inferno" }, "908": { name: "gs_mac10_dust_crate", tag: "Classic Crate" }, "909": { name: "gs_mag7_popdog", tag: "Popdog" }, "910": { name: "cu_mp9_hydra", tag: "Hydra" }, "911": { name: "cu_p90_nostalgia", tag: "Nostalgia" }, "913": { name: "am_aug_death_by_doggy", tag: "Death by Puppy" }, "914": { name: "cu_scar_assault", tag: "Assault" }, "915": { name: "gs_mp5_fbi", tag: "Agent" }, "916": { name: "cu_ump_bomb", tag: "Plastique" }, "917": { name: "cu_awp_wildfire", tag: "Wildfire" }, "918": { name: "cu_glock_hero", tag: "Sacrifice" }, "919": { name: "gs_famas_legacy_gold", tag: "Commemoration" }, "920": { name: "hy_veneto_tan", tag: "Boroque Sand" }, "921": { name: "gs_ak47_gold_arabesque", tag: "Gold Arabesque" }, "922": { name: "am_lizard_red", tag: "Orange Anolis" }, "923": { name: "gs_mp5_neon_flektarn", tag: "Oxide Oasis" }, "924": { name: "hy_brush_camo_tan", tag: "Desert Brush" }, "925": { name: "hy_ddpat_desert", tag: "Desert DDPAT" }, "926": { name: "hy_ddpat_urban_red", tag: "Red DDPAT" }, "927": { name: "hy_dry_wood", tag: "Spalted Wood" }, "928": { name: "hy_desert_multicam", tag: "Black & Tan" }, "929": { name: "hy_torn_camo_paints", tag: "Quick Sand" }, "930": { name: "sp_moro_carving_lightblue", tag: "New Roots" }, "931": { name: "sp_moro_carving_yellow", tag: "Old Roots" }, "932": { name: "sp_moro_textile_purple_yellow", tag: "Withered Vine" }, "933": { name: "sp_palm_night", tag: "Midnight Palm" }, "934": { name: "sp_desert_skulls", tag: "Bleached" }, "935": { name: "sp_zebracam_red", tag: "Prey" }, "941": { name: "cu_ak-47_phantom_disruptor", tag: "Phantom Disruptor" }, "942": { name: "gs_aug_thunderstorm", tag: "Tom Cat" }, "943": { name: "cu_awp_vein", tag: "Capillary" }, "944": { name: "cu_cz75_cerakote", tag: "Distressed" }, "945": { name: "cu_deagle_replica", tag: "Blue Ply" }, "946": { name: "cu_m4a1s_csgo2048", tag: "Player Two" }, "947": { name: "cu_mac10_nacre", tag: "Disco Tech" }, "948": { name: "gs_mag7_justice", tag: "Justice" }, "949": { name: "cu_mp5_desert_strike", tag: "Desert Strike" }, "950": { name: "cu_negev_prototype", tag: "Prototype" }, "951": { name: "aq_p2000_acid_clover", tag: "Acid Etched" }, "952": { name: "gs_r8_leviathan", tag: "Bone Forged" }, "953": { name: "cu_sawedoff_apocalypto", tag: "Apocalypto" }, "954": { name: "gs_scar20_enforcer", tag: "Enforcer" }, "955": { name: "cu_sg553_darkwing", tag: "Darkwing" }, "956": { name: "cu_ssg08_fever_dream", tag: "Fever Dream" }, "957": { name: "cu_glock18_warmaiden", tag: "Bullet Queen" }, "958": { name: "cu_negev_ultralight", tag: "Ultralight" }, "959": { name: "cu_ak47_anubis", tag: "Legion of Anubis" }, "960": { name: "aq_p2000_lost_world", tag: "Gnarled" }, "961": { name: "cu_mag7_monster_call", tag: "Monster Call" }, "962": { name: "cu_deag_printstream", tag: "Printstream" }, "963": { name: "cu_glock_eyecontact", tag: "Vogue" }, "964": { name: "gs_tec9_guerilla", tag: "Brother" }, "965": { name: "cu_mac10_isoonna", tag: "Allure" }, "966": { name: "gs_sg553_rusty", tag: "Ol' Rusty" }, "967": { name: "cu_ssg08_mainframe", tag: "Mainframe 001" }, "968": { name: "cu_p250_cassette", tag: "Cassette" }, "969": { name: "gs_p90_container", tag: "Freight" }, "970": { name: "cu_xm1014_amulet_blue", tag: "Entombed" }, "971": { name: "cu_m4a4_queenfairy", tag: "Tooth Fairy" }, "972": { name: "gs_galil_phoenix", tag: "Connexion" }, "973": { name: "gs_bizon_hellraider", tag: "Runic" }, "974": { name: "gs_mp5sd_wasteland_legacy", tag: "Kitbash" }, "975": { name: "gs_awp_exoskeleton", tag: "Exoskeleton" }, "976": { name: "gs_cz75_vendetta", tag: "Vendetta" }, "977": { name: "hy_p90_dino_rampage", tag: "Cocoa Rampage" }, "978": { name: "gs_dual_elites_dezastre", tag: "Dezastre" }, "979": { name: "cu_five_seven_diary", tag: "Fairy Tale" }, "980": { name: "gs_g3sg1_disrupt", tag: "Digital Mesh" }, "981": { name: "gs_galil_vandal", tag: "Vandal" }, "982": { name: "cu_p250_infect", tag: "Contaminant" }, "983": { name: "cu_m249_deep_relief", tag: "Deep Relief" }, "984": { name: "cu_m4a1s_printstream", tag: "Printstream" }, "985": { name: "cu_m4a4_cyberpunk", tag: "Cyber Security" }, "986": { name: "gs_mp5_conditionzero", tag: "Condition Zero" }, "987": { name: "cu_nova_polymer", tag: "Clear Polymer" }, "988": { name: "cu_glock_noir", tag: "Neo-Noir" }, "989": { name: "cu_ssg08_chromatic", tag: "Parallax" }, "990": { name: "gs_ump_gold_bismuth", tag: "Gold Bismuth" }, "991": { name: "cu_usp_krokos", tag: "Monster Mashup" }, "992": { name: "am_numbers_bronze", tag: "The Bronze" }, "993": { name: "cu_csgo_camo", tag: "Global Offensive" }, "994": { name: "am_authority_brown", tag: "Charter" }, "995": { name: "am_intelligence_grey", tag: "Surveillance" }, "996": { name: "am_intelligence_orange", tag: "Threat Detected" }, "997": { name: "am_numbers_red_blue", tag: "Dispatch" }, "998": { name: "hy_numbers_green", tag: "Switch Board" }, "999": { name: "am_numbers_magenta", tag: "Prime Conspiracy" }, "1000": { name: "cu_jaguar_p90", tag: "Run and Hide" }, "1001": { name: "cu_m4a1_snake", tag: "Welcome to the Jungle" }, "1002": { name: "aa_fade_red_blue", tag: "Berries And Cherries" }, "1003": { name: "cu_ump_crime_scene", tag: "Crime Scene" }, "1004": { name: "cu_ak_xray", tag: "X-Ray" }, "1005": { name: "am_heist_plans_green", tag: "Heist" }, "1006": { name: "am_heist_plans_purple", tag: "Night Heist" }, "1007": { name: "am_heist_plans_yellow", tag: "Vault Heist" }, "1008": { name: "hy_houndstooth_brown", tag: "Houndstooth" }, "1009": { name: "gs_mac10_snake", tag: "Hot Snakes" }, "1010": { name: "hy_phoenix_tags_lilac", tag: "Phoenix Chalk" }, "1011": { name: "am_phoenix_tags_blue", tag: "Phoenix Marker" }, "1012": { name: "hy_phoenix_tags_red", tag: "Phoenix Stencil" }, "1013": { name: "sp_phoenix_tags_purple", tag: "Phoenix Blacklight" }, "1014": { name: "hy_tigers_tan", tag: "Clay Ambush" }, "1015": { name: "am_tigers_brown", tag: "Tiger Pit" }, "1016": { name: "cu_money_glock", tag: "Franklin" }, "1017": { name: "am_m4a1s_bluesmoke", tag: "Blue Phosphor" }, "1018": { name: "cu_ak_jaguar", tag: "Panthera onca" }, "1019": { name: "am_black_panther", tag: "Panther Camo" }, "1020": { name: "aa_ancient_brown", tag: "Ancient Earth" }, "1021": { name: "am_ancient_warm", tag: "Ancient Lore" }, "1022": { name: "aa_ruins_green", tag: "Lush Ruins" }, "1023": { name: "hy_drywood_green", tag: "Tall Grass" }, "1024": { name: "hy_ancient_tiles_peach", tag: "Blast From the Past" }, "1025": { name: "am_gold_brick", tag: "Gold Brick" }, "1026": { name: "aa_awp_fade", tag: "Fade" }, "1027": { name: "am_intelligence_magenta", tag: "Target Acquired" }, "1028": { name: "hy_authority_purple", tag: "Magna Carta" }, "1029": { name: "am_tigers_blue", tag: "Silk Tiger" }, "1030": { name: "hy_p250_tiger", tag: "Bengal Tiger" }, "1031": { name: "sp_ancient_bright", tag: "Ancient Visions" }, "1032": { name: "hy_ruins_red", tag: "Dusk Ruins" }, "1033": { name: "am_jade", tag: "Carved Jade" }, "1034": { name: "am_ancient_wine", tag: "Ancient Ritual" }, "1035": { name: "gs_ak47_professional", tag: "Slate" }, "1036": { name: "cu_cz75_whirlwind", tag: "Circaetus" }, "1037": { name: "cu_mp9_food_chain", tag: "Food Chain" }, "1038": { name: "cu_galil_chroma_pink", tag: "Chromatic Aberration" }, "1039": { name: "gs_glock_polymer", tag: "Clear Polymer" }, "1040": { name: "gs_usps_hangedman", tag: "The Traitor" }, "1041": { name: "cu_m4a4_love", tag: "In Living Color" }, "1042": { name: "gs_m249_combine", tag: "O.S.I.P.R." }, "1043": { name: "cu_negev_devtexture", tag: "dev_texture" }, "1044": { name: "gs_p250_cybershell", tag: "Cyber Shell" }, "1045": { name: "cu_mac10_portable", tag: "Button Masher" }, "1046": { name: "aq_xm1014_punk", tag: "XOXO" }, "1047": { name: "gs_r8_rustking", tag: "Junk Yard" }, "1048": { name: "gs_sg553_deathmetal", tag: "Heavy Metal" }, "1049": { name: "am_ump45_electrowave", tag: "Oscillator" }, "1050": { name: "cu_deag_trigger_discipline", tag: "Trigger Discipline" }, "1051": { name: "sp_nova_wind_dispersal", tag: "Windblown" }, "1052": { name: "cu_ssg08_scorpion", tag: "Death Strike" }, "1053": { name: "am_nuclear_pattern4_famas", tag: "Meltdown" }, "1055": { name: "aa_spacerace_orange", tag: "Space Race" }, "1056": { name: "sp_spacerace_blue", tag: "Sputnik" }, "1058": { name: "hy_technowar_rwb", tag: "POP AWP" }, "1059": { name: "sp_technowar_red", tag: "Fizzy POP" }, "1060": { name: "hy_trainarchitect_green", tag: "Spring Twilly" }, "1061": { name: "hy_trainarchitect", tag: "Autumn Twilly" }, "1063": { name: "gs_m4a4_coalition", tag: "The Coalition" }, "1064": { name: "gs_train_cz75", tag: "Syndicate" }, "1065": { name: "so_whiteout_riptide", tag: "Whiteout" }, "1066": { name: "aa_wiring_yellow", tag: "Faulty Wiring" }, "1067": { name: "cu_mac10_propaganda", tag: "Propaganda" }, "1070": { name: "hy_ak47lam_green", tag: "Green Laminate" }, "1071": { name: "sp_galil_caution", tag: "CAUTION!" }, "1072": { name: "hy_geometric_steps_pearl", tag: "Prism Terrace" }, "1073": { name: "gs_m4a1_vertigo", tag: "Imminent Danger" }, "1074": { name: "hy_vertigogeo", tag: "Schematic" }, "1075": { name: "hy_vertigospray_blue", tag: "Strats" }, "1076": { name: "hy_vertigoillusion", tag: "Framework" }, "1077": { name: "hy_vertigoillusion_yellow", tag: "Interlock" }, "1078": { name: "sp_tire_tread_blue", tag: "Blue Tire" }, "1079": { name: "sp_tire_tread_red", tag: "Red Tire" }, "1080": { name: "hy_vertigospray", tag: "Infrastructure" }, "1081": { name: "aa_vertigogeo_neon", tag: "Digital Architect" }, "1082": { name: "cu_vertigo_fiveseven", tag: "Fall Hazard" }, "1083": { name: "aa_wiring", tag: "Breaker Box" }, "1084": { name: "cu_sg553_caution", tag: "Hazard Pay" }, "1085": { name: "aa_engine_performance", tag: "Mechanism" }, "1086": { name: "sp_engine_dirty", tag: "Oil Change" }, "1087": { name: "gs_ak47_abstract", tag: "Leet Museo" }, "1088": { name: "gs_aug_plague", tag: "Plague" }, "1089": { name: "gs_mag7_bismuth", tag: "BI83 Spectrum" }, "1090": { name: "cu_deagle_kitch", tag: "Ocean Drive" }, "1091": { name: "gs_dual_berettas_tread", tag: "Tread" }, "1092": { name: "cu_famas_spectron", tag: "ZX Spectron" }, "1093": { name: "gs_five_seven_efusion", tag: "Boost Protocol" }, "1094": { name: "aa_mp9_fuji_pink", tag: "Mount Fuji" }, "1095": { name: "cu_g3sg1_tacticalmap", tag: "Keeping Tabs" }, "1096": { name: "cu_mp7_khaki", tag: "Guerrilla" }, "1097": { name: "gs_m4_flowers", tag: "Spider Lily" }, "1098": { name: "cu_mac10_toybox", tag: "Toybox" }, "1099": { name: "gs_bizon_flasher", tag: "Lumen" }, "1100": { name: "cu_glock_snackattack", tag: "Snack Attack" }, "1101": { name: "cu_ssg_overtake", tag: "Turbo Peek" }, "1102": { name: "cu_usp_black_lotus", tag: "Black Lotus" }, "1103": { name: "gs_xm1014_watchdog", tag: "Watchdog" }, "1104": { name: "cu_bowie_lore", tag: "Lore" }, "1105": { name: "cu_butterfly_lore", tag: "Lore" }, "1106": { name: "cu_falchion_lore", tag: "Lore" }, "1107": { name: "cu_huntsman_lore", tag: "Lore" }, "1108": { name: "cu_push_lore", tag: "Lore" }, "1109": { name: "gs_bowie_black_laminate", tag: "Black Laminate" }, "1110": { name: "gs_butterfly_black_laminate", tag: "Black Laminate" }, "1111": { name: "gs_falchion_black_laminate", tag: "Black Laminate" }, "1112": { name: "gs_huntsman_black_laminate", tag: "Black Laminate" }, "1113": { name: "gs_push_black_laminate", tag: "Black Laminate" }, "1114": { name: "gs_bowie_autotronic", tag: "Autotronic" }, "1115": { name: "gs_butterfly_autotronic", tag: "Autotronic" }, "1116": { name: "gs_falchion_autotronic", tag: "Autotronic" }, "1117": { name: "gs_huntsman_autotronic", tag: "Autotronic" }, "1118": { name: "gs_push_autotronic", tag: "Autotronic" }, "1119": { name: "am_emerald_marbleized_glock", tag: "Gamma Doppler" }, "1120": { name: "am_gamma_doppler_phase1_glock", tag: "Gamma Doppler" }, "1121": { name: "am_gamma_doppler_phase2_glock", tag: "Gamma Doppler" }, "1122": { name: "am_gamma_doppler_phase3_glock", tag: "Gamma Doppler" }, "1123": { name: "am_gamma_doppler_phase4_glock", tag: "Gamma Doppler" }, "1125": { name: "cu_bizon_spacecat", tag: "Space Cat" }, "1126": { name: "cu_elites_beware", tag: "Melondrama" }, "1127": { name: "gs_famas_rapid_eyes", tag: "Rapid Eye Movement" }, "1128": { name: "cu_fiveseven_alpha_omega", tag: "Scrawl" }, "1129": { name: "cu_g3sg1_glade", tag: "Dream Glade" }, "1130": { name: "gs_m4a1s_insomnia", tag: "Night Terror" }, "1131": { name: "cu_mac10_pixie", tag: "Ensnared" }, "1132": { name: "cu_mag7_predictor", tag: "Foresight" }, "1133": { name: "cu_mp7_fear", tag: "Abyssal Apparition" }, "1134": { name: "gs_mp9_starlight", tag: "Starlight Protector" }, "1135": { name: "am_xm_zombie_offensive", tag: "Zombie Offensive" }, "1136": { name: "cu_usp_to_hell", tag: "Ticket to Hell" }, "1137": { name: "gs_mp5_kid_necronomicon", tag: "Necro Jr." }, "1138": { name: "cu_p2k_flying_dream", tag: "Lifted Spirits" }, "1139": { name: "sp_scar_chickenfight", tag: "Poultrygeist" }, "1140": { name: "cu_sawedoff_ouija", tag: "Spirit Board" }, "1141": { name: "cu_ak47_nightwish", tag: "Nightwish" }, "1142": { name: "cu_usp_printstream", tag: "Printstream" }, "1143": { name: "cu_ak47_cogthings", tag: "Ice Coaled" }, "1144": { name: "cu_awp_chroma_pink", tag: "Chromatic Aberration" }, "1145": { name: "gs_revolver_purple_elite", tag: "Crazy 8" }, "1146": { name: "gs_famas_corp_meow", tag: "Meow 36" }, "1147": { name: "cu_galil_destroyer", tag: "Destroyer" }, "1148": { name: "cu_m249_downvote", tag: "Downtown" }, "1149": { name: "cu_m4a4_elite_tactical", tag: "Poly Mag" }, "1150": { name: "cu_mac10_monkeyflage", tag: "Monkeyflage" }, "1151": { name: "cu_sg553_cyber_dragon", tag: "Dragon Tech" }, "1152": { name: "cu_negev_clear_sky", tag: "Drop Me" }, "1153": { name: "gs_p250_visions", tag: "Visions" }, "1154": { name: "gs_p90_tangled", tag: "Vent Rush" }, "1155": { name: "cu_sawedoff_kisslove", tag: "Kiss♥Love" }, "1156": { name: "cu_dual_elites_evil_flora", tag: "Flora Carnivora" }, "1157": { name: "gs_ump_roadblock", tag: "Roadblock" }, "1158": { name: "gs_glock_elite_camo", tag: "Winterized" }, "10006": { name: "bloodhound_black_silver", tag: "Charred" }, "10007": { name: "bloodhound_snakeskin_brass", tag: "Snakebite" }, "10008": { name: "bloodhound_metallic", tag: "Bronzed" }, "10009": { name: "handwrap_leathery", tag: "Leather" }, "10010": { name: "handwrap_camo_grey", tag: "Spruce DDPAT" }, "10013": { name: "slick_black", tag: "Lunar Weave" }, "10015": { name: "slick_military", tag: "Convoy" }, "10016": { name: "slick_red", tag: "Crimson Weave" }, "10018": { name: "sporty_light_blue", tag: "Superconductor" }, "10019": { name: "sporty_military", tag: "Arid" }, "10021": { name: "handwrap_red_slaughter", tag: "Slaughter" }, "10024": { name: "motorcycle_basic_black", tag: "Eclipse" }, "10026": { name: "motorcycle_mint_triangle", tag: "Spearmint" }, "10027": { name: "motorcycle_mono_boom", tag: "Boom!" }, "10028": { name: "motorcycle_triangle_blue", tag: "Cool Mint" }, "10030": { name: "specialist_ddpat_green_camo", tag: "Forest DDPAT" }, "10033": { name: "specialist_kimono_diamonds_red", tag: "Crimson Kimono" }, "10034": { name: "specialist_emerald_web", tag: "Emerald Web" }, "10035": { name: "specialist_orange_white", tag: "Foundation" }, "10036": { name: "handwrap_fabric_orange_camo", tag: "Badlands" }, "10037": { name: "sporty_purple", tag: "Pandora's Box" }, "10038": { name: "sporty_green", tag: "Hedge Maze" }, "10039": { name: "bloodhound_guerrilla", tag: "Guerrilla" }, "10040": { name: "slick_snakeskin_yellow", tag: "Diamondback" }, "10041": { name: "slick_snakeskin_white", tag: "King Snake" }, "10042": { name: "slick_plaid_purple", tag: "Imperial Plaid" }, "10043": { name: "slick_stitched_black_orange", tag: "Overtake" }, "10044": { name: "slick_stitched_green_grey", tag: "Racing Green" }, "10045": { name: "sporty_poison_frog_blue_white", tag: "Amphibious" }, "10046": { name: "sporty_poison_frog_red_green", tag: "Bronze Morph" }, "10047": { name: "sporty_black_webbing_yellow", tag: "Omega" }, "10048": { name: "sporty_blue_pink", tag: "Vice" }, "10049": { name: "motorcycle_choco_boom", tag: "POW!" }, "10050": { name: "motorcycle_basic_green_orange", tag: "Turtle" }, "10051": { name: "motorcycle_yellow_camo", tag: "Transport" }, "10052": { name: "motorcycle_trigrid_blue", tag: "Polygon" }, "10053": { name: "handwrap_leathery_fabric_blue_skulls", tag: "Cobalt Skulls" }, "10054": { name: "handwrap_leathery_fabric_geometric_blue", tag: "Overprint" }, "10055": { name: "handwrap_leathery_ducttape", tag: "Duct Tape" }, "10056": { name: "handwrap_leathery_fabric_green_camo", tag: "Arboreal" }, "10057": { name: "bloodhound_hydra_black_green", tag: "Emerald" }, "10058": { name: "bloodhound_hydra_green_leather_mesh_brass", tag: "Mangrove" }, "10059": { name: "bloodhound_hydra_snakeskin_brass", tag: "Rattler" }, "10060": { name: "bloodhound_hydra_case_hardened", tag: "Case Hardened" }, "10061": { name: "specialist_webs_red", tag: "Crimson Web" }, "10062": { name: "specialist_forest_brown", tag: "Buckshot" }, "10063": { name: "specialist_fade", tag: "Fade" }, "10064": { name: "specialist_winterhex", tag: "Mogul" }, "10065": { name: "specialist_marble_fade", tag: "Marble Fade" }, "10066": { name: "specialist_ricksaw_camo", tag: "Lt. Commander" }, "10067": { name: "specialist_tiger_orange", tag: "Tiger Strike" }, "10068": { name: "specialist_fbi", tag: "Field Agent" }, "10069": { name: "slick_rezan", tag: "Rezan the Red" }, "10070": { name: "slick_jaguar_white", tag: "Snow Leopard" }, "10071": { name: "slick_jaguar_yellow", tag: "Queen Jaguar" }, "10072": { name: "slick_stitched_black_white", tag: "Black Tie" }, "10073": { name: "sporty_slingshot", tag: "Slingshot" }, "10074": { name: "sporty_hunter", tag: "Big Game" }, "10075": { name: "sporty_houndstooth_red", tag: "Scarlet Shamagh" }, "10076": { name: "sporty_jaguar", tag: "Nocts" }, "10077": { name: "motorcycle_checker_flag_blue_green", tag: "Finish Line" }, "10078": { name: "motorcycle_smoke", tag: "Smoke Out" }, "10079": { name: "motorcycle_carbonfiber_red", tag: "Blood Pressure" }, "10080": { name: "motorcycle_commando_ksk", tag: "3rd Commando Company" }, "10081": { name: "handwrap_fabric_houndstooth_orange", tag: "Desert Shamagh" }, "10082": { name: "handwrap_leathery_fabric_giraffe", tag: "Giraffe" }, "10083": { name: "handwrap_leathery_snakeskin_orange", tag: "Constrictor" }, "10084": { name: "handwrap_leathery_caution", tag: "CAUTION!" }, "10085": { name: "operation10_metalic_green", tag: "Jade" }, "10086": { name: "operation10_poison_frog_black_yellow", tag: "Yellow-banded" }, "10087": { name: "operation10_floral", tag: "Needle Point" }, "10088": { name: "operation10_snakeskin_black", tag: "Unhinged" } }; },{}],11:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.Networkable = void 0; const consts_1 = require("../consts"); /** * Represents an in-game entity. */ class Networkable { constructor(demo, index, classId, serialNum, props) { /** * Entity is scheduled for removal this tick. */ this.deleting = false; this._demo = demo; this.index = index; this.classId = classId; this.serialNum = serialNum; this.props = props || {}; } /** * Get the serverclass associated with this entity. * @returns Object representing the entity's class */ get serverClass() { return this._demo.entities.serverClasses[this.classId]; } /** * @returns Number uniquely identifying this entity. Should be unique throughout the entire demo. */ get handle() { return this.index | (this.serialNum << consts_1.MAX_EDICT_BITS); } /** * Retrieves the value of a networked property * @param {string} tableName - Table name (e.g., DT_BaseEntity) * @param {string} varName - Network variable name (e.g., m_vecOrigin) * @returns {*} Property value, `undefined` if non-existent * @public */ getProp(tableName, varName) { return this.props[tableName][varName]; } /** * Interpret an array-like data table (e.g., m_iAmmo) as an array * @param tableName Name of the data table */ getIndexedProps(tableName) { if (!("000" in this.props[tableName])) { return undefined; } return Object.values(this.props[tableName]); } /** * Update the value of a prop * @param tableName Name of the data table * @param varName Name of the prop to update * @param newValue New prop value */ updateProp(tableName, varName, newValue) { const table = this.props[tableName]; // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition if (table === undefined) { this.props[tableName] = { [varName]: newValue }; } else { table[varName] = newValue; } } /** * True if this entity is out of the PVS. * Always false on GOTV demos as all entities are always in the PVS. */ get isDormant() { return !this._demo.entities.transmitEntities.has(this.index); } toJSON() { return `#${this.index}(${this.serverClass.name})`; } } exports.Networkable = Networkable; },{"../consts":3}],12:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.Player = void 0; const crosshair_1 = require("../crosshair"); const baseentity_1 = require("./baseentity"); const weapon_1 = require("./weapon"); /** * Represents an in-game player. */ class Player extends baseentity_1.BaseEntity { constructor(demo, index, classId, serialNum, baseline) { super(demo, index, classId, serialNum, baseline); /** * The 'client slot' is the index into various arrays such as the userinfo table. */ this.clientSlot = index - 1; } /** * @returns {int} Current health */ get health() { return this.getProp("DT_BasePlayer", "m_iHealth"); } get eyeAngles() { return { pitch: this.getProp("DT_CSPlayer", "m_angEyeAngles[0]"), yaw: this.getProp("DT_CSPlayer", "m_angEyeAngles[1]") }; } get position() { const table = this._demo.recordingClientSlot == null || this.isRecordingDemo ? "DT_CSLocalPlayerExclusive" : "DT_CSNonLocalPlayerExclusive"; const xy = this.getProp(table, "m_vecOrigin"); return { x: xy.x, y: xy.y, z: this.getProp(table, "m_vecOrigin[2]") }; } get velocity() { return this._demo.recordingClientSlot == null || this.isRecordingDemo ? { x: this.getProp("DT_LocalPlayerExclusive", "m_vecVelocity[0]"), y: this.getProp("DT_LocalPlayerExclusive", "m_vecVelocity[1]"), z: this.getProp("DT_LocalPlayerExclusive", "m_vecVelocity[2]") } : { x: 0, y: 0, z: 0 }; } /** * Speed of the entity. * @returns Speed in game units. */ get speed() { const vel = this.velocity; return Math.sqrt(vel.x * vel.x + vel.y * vel.y + vel.z * vel.z); } /** * @returns Current cash */ get account() { return this.getProp("DT_CSPlayer", "m_iAccount"); } get lifeState() { return this.getProp("DT_BasePlayer", "m_lifeState"); } /** * @returns lifeState == 0 */ get isAlive() { return this.lifeState === 0 /* LifeState.Alive */; } /** * @returns User info associated with this player */ get userInfo() { return this._demo.entities._userInfoTable.entries[this.clientSlot] .userData; } /** * @returns User ID */ get userId() { return this.userInfo.userId; } /** * @returns Steam ID */ get steamId() { return this.userInfo.guid; } /** * @returns Steam 64 ID */ get steam64Id() { if (this._steam64IdCache === undefined) this._steam64IdCache = this.userInfo.xuid.toString(); return this._steam64IdCache; } /** * @returns Player name */ get name() { return this.userInfo.name; } /** * @returns Is this player fake (i.e. a bot) */ get isFakePlayer() { return this.userInfo.fakePlayer; } /** * @returns Is this player a HLTV relay */ get isHltv() { return this.userInfo.isHltv; } /** * @returns Player armor (0-100) */ get armor() { return this.getProp("DT_CSPlayer", "m_ArmorValue"); } /** * @returns Current navmesh place name */ get placeName() { return this.getProp("DT_BasePlayer", "m_szLastPlaceName"); } /** * @returns Currently held weapon */ get weapon() { return this._demo.entities.getByHandle(this.getProp("DT_BaseCombatCharacter", "m_hActiveWeapon")); } /** * @returns All weapons helds by this player */ get weapons() { return this.getIndexedProps("m_hMyWeapons") .map(handle => this._demo.entities.getByHandle(handle)) .filter(ent => ent ? ent instanceof weapon_1.Weapon : false); } /** * @returns Is the player is the bomb zone? */ get isInBombZone() { return this.getProp("DT_CSPlayer", "m_bInBombZone"); } /** * @returns Is the player in the buy zone? */ get isInBuyZone() { return this.getProp("DT_CSPlayer", "m_bInBuyZone"); } /** * @returns Is the player defusing? */ get isDefusing() { return this.getProp("DT_CSPlayer", "m_bIsDefusing"); } /** * @returns Does the player have a defuser? */ get hasDefuser() { return this.getProp("DT_CSPlayer", "m_bHasDefuser"); } /** * @returns Does the player have a helmet? */ get hasHelmet() { return this.getProp("DT_CSPlayer", "m_bHasHelmet"); } /** * @returns Does the player is controlling a BOT? */ get isControllingBot() { return this.getProp("DT_CSPlayer", "m_bIsControllingBot"); } /** * Retrieves the value of an array property on the singleton entity DT_CSPlayerResource. * @param {string} propName - Name of the property on DT_CSPlayerResource to retrieve * @returns {*} Property value */ resourceProp(tableName) { const array = this._demo.entities.playerResource.getIndexedProps(tableName); return array[this.index]; } /** * @returns How many kills the player has made */ get kills() { return this.resourceProp("m_iKills"); } /** * @returns How many assists the player has made */ get assists() { return this.resourceProp("m_iAssists"); } /** * @returns How many times the player has died */ get deaths() { return this.resourceProp("m_iDeaths"); } /** * @returns Cash that this player has spent this round */ get cashSpendThisRound() { return this.resourceProp("m_iCashSpentThisRound"); } /** * @returns Cash that the player has spent all game */ get cashSpendTotal() { return this.resourceProp("m_iTotalCashSpent"); } /** * @returns Whether the player holds the C4 */ get hasC4() { const pr = this._demo.entities.playerResource; return pr.getProp("DT_CSPlayerResource", "m_iPlayerC4") === this.index; } /** * @returns Score of the player */ get score() { const pr = this._demo.entities.playerResource; return pr.getIndexedProps("m_iScore")[this.index]; } /** * @returns MVPs of the player */ get mvps() { const pr = this._demo.entities.playerResource; return pr.getIndexedProps("m_iMVPs")[this.index]; } /** * @returns Clantag of the player */ get clanTag() { const pr = this._demo.entities.playerResource; return pr.getIndexedProps("m_szClan")[this.index]; } /** * @returns Has this player been spotted by any others? */ get isSpotted() { return this.getProp("DT_BaseEntity", "m_bSpotted"); } /** * Checks if this player has been spotted by the other. * Note that this still returns true if spotted by the other player even if * the other player is dead. * @param other - Other player entity * @returns Is this player spotted by the other? */ isSpottedBy(other) { let bit = other.clientSlot; let mask = null; if (other.clientSlot < 32) { mask = this.getProp("m_bSpottedByMask", "000"); } else { bit = other.clientSlot - 32; mask = this.getProp("m_bSpottedByMask", "001"); } return (mask & (1 << bit)) !== 0; } /** * @returns Alive players that have spotted this player */ get allSpotters() { return this._demo.players.filter(p => p.clientSlot !== this.clientSlot && p.isAlive && this.isSpottedBy(p)); } /** * Checks if this player has spotted another. * Can still return true even if this player is dead. * @param other - Other player entity * @returns Has this player spotted the other? */ hasSpotted(other) { return other.isSpottedBy(this); } /** * @returns Alive players that this player has spotted */ get allSpotted() { return this._demo.players.filter(p => p.clientSlot !== this.clientSlot && p.isAlive && this.hasSpotted(p)); } /** * @param other - Other player entity * @returns Whether the two players are on the same team */ isFriendly(other) { const sameTeam = this.teamNumber === other.teamNumber; const teammatesAreEnemies = this._demo.conVars.vars.get("mp_teammates_are_enemies") || 0; return sameTeam && !teammatesAreEnemies; } /** * @returns Is scoped */ get isScoped() { return this.getProp("DT_CSPlayer", "m_bIsScoped"); } /** * @returns Is walking */ get isWalking() { return this.getProp("DT_CSPlayer", "m_bIsWalking"); } /** * @returns Player is transitioning from ducked -> standing or standing -> ducked */ get isDucking() { return this.getProp("DT_Local", "m_bDucking"); } /** * @returns Is ducked */ get isDucked() { return this.getProp("DT_Local", "m_bDucked"); } /** * @returns Duration of a flash that hit the player */ get flashDuration() { return this.getProp("DT_CSPlayer", "m_flFlashDuration"); } /** * @returns Current equipment value */ get currentEquipmentValue() { return this.getProp("DT_CSPlayer", "m_unCurrentEquipmentValue"); } /** * @returns Round start equipment value */ get roundStartEquipmentValue() { return this.getProp("DT_CSPlayer", "m_unRoundStartEquipmentValue"); } /** * @returns Freeze time end equipment value */ get freezeTimeEndEquipmentValue() { return this.getProp("DT_CSPlayer", "m_unFreezetimeEndEquipmentValue"); } /** * @returns Object representing the player's performance per round */ get matchStats() { const kills = this.getIndexedProps("m_iMatchStats_Kills"); const damage = this.getIndexedProps("m_iMatchStats_Damage"); const equipmentValue = this.getIndexedProps("m_iMatchStats_EquipmentValue"); const moneySaved = this.getIndexedProps("m_iMatchStats_MoneySaved"); const killReward = this.getIndexedProps("m_iMatchStats_KillReward"); const liveTime = this.getIndexedProps("m_iMatchStats_LiveTime"); const deaths = this.getIndexedProps("m_iMatchStats_Deaths"); const assists = this.getIndexedProps("m_iMatchStats_Assists"); const headShotKills = this.getIndexedProps("m_iMatchStats_HeadShotKills"); const objective = this.getIndexedProps("m_iMatchStats_Objective"); const rounds = new Array(); for (let roundIdx = 0; roundIdx < kills.length; ++roundIdx) { rounds.push({ kills: kills[roundIdx], damage: damage[roundIdx], equipmentValue: equipmentValue[roundIdx], moneySaved: moneySaved[roundIdx], killReward: killReward[roundIdx], liveTime: liveTime[roundIdx], deaths: deaths[roundIdx], assists: assists[roundIdx], headShotKills: headShotKills[roundIdx], objective: objective[roundIdx] }); } return rounds; } /** * @returns Object representing user-customisable crosshair settings. */ get crosshairInfo() { return (0, crosshair_1.decodeCrosshairCode)(this.resourceProp("m_szCrosshairCodes")); } /** * @returns true if this player is recording the demo from their POV. */ get isRecordingDemo() { return this._demo.recordingClientSlot === this.clientSlot; } } exports.Player = Player; },{"../crosshair":5,"./baseentity":8,"./weapon":15}],13:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.Projectile = void 0; const baseentity_1 = require("./baseentity"); /** * Represents a grenade projectile. */ class Projectile extends baseentity_1.BaseEntity { /** * @returns {GrenadeType} Type of grenade that this projectile is. */ get grenadeType() { switch (this.modelName) { case "models/Weapons/w_eq_fraggrenade_dropped.mdl": return "explosive"; case "models/Weapons/w_eq_flashbang_dropped.mdl": return "flashbang"; case "models/Weapons/w_eq_molotov_dropped.mdl": return "molotov"; case "models/Weapons/w_eq_incendiarygrenade_dropped.mdl": return "incendiary"; case "models/Weapons/w_eq_decoy_dropped.mdl": return "decoy"; case "models/Weapons/w_eq_smokegrenade_thrown.mdl": return "smoke"; default: throw new Error(`Unknown projectile with model: ${this.modelName}`); } } } exports.Projectile = Projectile; },{"./baseentity":8}],14:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.Team = void 0; const networkable_1 = require("./networkable"); const player_1 = require("./player"); /** * Represents an in-game team. */ class Team extends networkable_1.Networkable { /** * @returns {Player[]} All players in this team */ get members() { // UNSAFE: cast here as members will always be players return this.getProp("DT_Team", '"player_array"') .map(index => this._demo.entities.entities.get(index)) .filter(player => player instanceof player_1.Player); } /** * @returns {int} 0: Unassigned, 1: Spectator, 2: Terrorist, 3: Counter-Terrorist */ get teamNumber() { return this.getProp("DT_Team", "m_iTeamNum"); } /** * @returns Clan name */ get clanName() { return this.getProp("DT_Team", "m_szClanTeamname"); } /** * @returns 'SPECTATOR', 'TERRORIST' or 'COUNTERTERRORIST' */ get teamName() { return this.getProp("DT_Team", "m_szTeamname"); } /** * @returns Total score */ get score() { return this.getProp("DT_Team", "m_scoreTotal"); } /** * @returns First half score */ get scoreFirstHalf() { return this.getProp("DT_Team", "m_scoreFirstHalf"); } /** * @returns Second half score */ get scoreSecondHalf() { return this.getProp("DT_Team", "m_scoreSecondHalf"); } /** * @returns Team flag image */ get flagImage() { return this.getProp("DT_Team", "m_szTeamFlagImage"); } /** * @returns Team logo image */ get logoImage() { return this.getProp("DT_Team", "m_szTeamLogoImage"); } } exports.Team = Team; },{"./networkable":11,"./player":12}],15:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.Weapon = void 0; const baseentity_1 = require("./baseentity"); const itemdefs_1 = require("./itemdefs"); const qualities = [ "normal", "genuine", "vintage", "unusual", "unique", "community", "developer", "selfmade", "customized", "strange", "completed", "haunted", "tournament", "favored" ]; /** * Represents an in-game weapon (guns, grenades, knifes). */ class Weapon extends baseentity_1.BaseEntity { /** * @returns Owning player, if any */ get owner() { return super.owner; } /** * @returns Item definition index */ get itemIndex() { return this.getProp("DT_ScriptCreatedItem", "m_iItemDefinitionIndex"); } /** * @returns Name of the weapon (e.g. "Five-SeveN") */ get itemName() { const weaponId = this.itemIndex; const itemDefinition = itemdefs_1.itemDefinitionIndexMap[weaponId]; return itemDefinition !== undefined ? itemDefinition.itemName : null; } /** * @returns Entity class name of the weapon (e.g. "weapon_ak47") */ get className() { const weaponId = this.itemIndex; const itemDefinition = itemdefs_1.itemDefinitionIndexMap[weaponId]; return itemDefinition !== undefined ? itemDefinition.className : null; } /** * @returns Previous owner */ get prevOwner() { const handle = this.getProp("DT_WeaponCSBase", "m_hPrevOwner"); return this._demo.entities.getByHandle(handle); } /** * @returns Amount of ammo in the clip of the weapon */ get clipAmmo() { return this.getProp("DT_BaseCombatWeapon", "m_iClip1"); } /** * @returns The amount ammo this weapon has in reserve */ get reserveAmmo() { return this.getProp("DT_BaseCombatWeapon", "m_iPrimaryReserveAmmoCount"); } /** * @returns The amount of ammo the owner holds for this weapon. Null if no owner. */ get ownerAmmo() { if (!this.owner) return null; const ammoType = this.getProp("DT_LocalWeaponData", "m_iPrimaryAmmoType"); if (ammoType === -1) return null; return this.owner.getIndexedProps("m_iAmmo")[ammoType]; } /** * @returns Quality of the item. */ get quality() { const quality = this.getProp("DT_ScriptCreatedItem", "m_iEntityQuality"); return qualities[quality]; } } exports.Weapon = Weapon; },{"./baseentity":8,"./itemdefs":10}],16:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.EntityHandle = void 0; const consts_1 = require("./consts"); class EntityHandle { constructor(value) { this.value = value; } get isValid() { return this.value !== consts_1.INVALID_NETWORKED_EHANDLE_VALUE; } get index() { return this.value & consts_1.NETWORKED_EHANDLE_ENT_ENTRY_MASK; } get serialNum() { return this.value >> consts_1.MAX_EDICT_BITS; } } exports.EntityHandle = EntityHandle; },{"./consts":3}],17:[function(require,module,exports){ "use strict"; /* eslint-disable @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-argument, sonarjs/no-duplicated-branches */ // DO NOT MODIFY! // Auto-generated by ./generators/eventtypes.ts Object.defineProperty(exports, "__esModule", { value: true }); exports.annotateEvent = void 0; const itemdefs_1 = require("./entities/itemdefs"); const Long = require("long"); function annotateEvent(entities, eventName, event) { if (eventName === "bomb_begindefuse") { event.player = entities.getByUserId(event.userid); } else if (eventName === "bomb_beginplant") { event.player = entities.getByUserId(event.userid); } else if (eventName === "bomb_defused") { event.player = entities.getByUserId(event.userid); } else if (eventName === "bomb_dropped") { event.player = entities.getByUserId(event.userid); event.entity = entities.entities.get(event.entindex); } else if (eventName === "bomb_exploded") { event.player = entities.getByUserId(event.userid); } else if (eventName === "bomb_pickup") { event.player = entities.getByUserId(event.userid); } else if (eventName === "bomb_planted") { event.player = entities.getByUserId(event.userid); } else if (eventName === "bot_takeover") { event.player = entities.getByUserId(event.userid); event.bot = entities.getByUserId(event.botid); } else if (eventName === "cs_win_panel_round") { event.player = entities.entities.get(event.funfact_player); } else if (eventName === "decoy_detonate") { event.player = entities.getByUserId(event.userid); event.entity = entities.entities.get(event.entityid); } else if (eventName === "decoy_started") { event.player = entities.getByUserId(event.userid); event.entity = entities.entities.get(event.entityid); } else if (eventName === "defuser_dropped") { event.entity = entities.entities.get(event.entityid); } else if (eventName === "defuser_pickup") { event.entity = entities.entities.get(event.entityid); event.player = entities.getByUserId(event.userid); } else if (eventName === "flashbang_detonate") { event.player = entities.getByUserId(event.userid); event.entity = entities.entities.get(event.entityid); } else if (eventName === "hegrenade_detonate") { event.player = entities.getByUserId(event.userid); event.entity = entities.entities.get(event.entityid); } else if (eventName === "hostage_hurt") { event.player = entities.getByUserId(event.userid); event.entity = entities.entities.get(event.hostage); } else if (eventName === "hostage_killed") { event.player = entities.getByUserId(event.userid); event.entity = entities.entities.get(event.hostage); } else if (eventName === "hostage_rescued") { event.player = entities.getByUserId(event.userid); event.entity = entities.entities.get(event.hostage); } else if (eventName === "inferno_expire") { event.entity = entities.entities.get(event.entityid); } else if (eventName === "inferno_startburn") { event.entity = entities.entities.get(event.entityid); } else if (eventName === "item_equip") { event.player = entities.getByUserId(event.userid); event.itemDefinition = itemdefs_1.itemDefinitionIndexMap[event.defindex] || null; } else if (eventName === "item_pickup") { event.player = entities.getByUserId(event.userid); event.itemDefinition = itemdefs_1.itemDefinitionIndexMap[event.defindex] || null; } else if (eventName === "item_remove") { event.player = entities.getByUserId(event.userid); event.itemDefinition = itemdefs_1.itemDefinitionIndexMap[event.defindex] || null; } else if (eventName === "items_gifted") { event.entity = entities.getByAccountId(event.accountid); } else if (eventName === "other_death") { event.victim = entities.entities.get(event.otherid); event.attackerEntity = entities.getByUserId(event.attacker); event.itemDefinition = event.weapon_fauxitemid != "" ? itemdefs_1.itemDefinitionIndexMap[Long.fromString(event.weapon_fauxitemid, true) .and(0xffff) .toString()] : null; event.paintKit = event.weapon_fauxitemid != "" ? itemdefs_1.paintKitIndexMap[Long.fromString(event.weapon_fauxitemid, true) .shiftRightUnsigned(16) .and(0xffff) .toString()] : null; event.originalOwner = entities.getBySteam64Id(event.weapon_originalowner_xuid); } else if (eventName === "player_blind") { event.player = entities.getByUserId(event.userid); event.attackerEntity = entities.getByUserId(event.attacker); event.entity = entities.entities.get(event.entityid); } else if (eventName === "player_changename") { event.player = entities.getByUserId(event.userid); } else if (eventName === "player_chat") { event.player = entities.getByUserId(event.userid); } else if (eventName === "player_connect_full") { event.player = entities.getByUserId(event.userid); } else if (eventName === "player_death") { event.player = entities.getByUserId(event.userid); event.attackerEntity = entities.getByUserId(event.attacker); event.assisterEntity = entities.getByUserId(event.assister); event.itemDefinition = event.weapon_fauxitemid != "" ? itemdefs_1.itemDefinitionIndexMap[Long.fromString(event.weapon_fauxitemid, true) .and(0xffff) .toString()] : null; event.paintKit = event.weapon_fauxitemid != "" ? itemdefs_1.paintKitIndexMap[Long.fromString(event.weapon_fauxitemid, true) .shiftRightUnsigned(16) .and(0xffff) .toString()] : null; event.originalOwner = entities.getBySteam64Id(event.weapon_originalowner_xuid); } else if (eventName === "player_disconnect") { event.player = entities.getByUserId(event.userid); } else if (eventName === "player_falldamage") { event.player = entities.getByUserId(event.userid); } else if (eventName === "player_footstep") { event.player = entities.getByUserId(event.userid); } else if (eventName === "player_hurt") { event.player = entities.getByUserId(event.userid); event.attackerEntity = entities.getByUserId(event.attacker); } else if (eventName === "player_info") { event.player = entities.getByUserId(event.userid); } else if (eventName === "player_jump") { event.player = entities.getByUserId(event.userid); } else if (eventName === "player_spawn") { event.player = entities.getByUserId(event.userid); } else if (eventName === "player_team") { event.player = entities.getByUserId(event.userid); } else if (eventName === "round_mvp") { event.player = entities.getByUserId(event.userid); } else if (eventName === "smokegrenade_detonate") { event.player = entities.getByUserId(event.userid); event.entity = entities.entities.get(event.entityid); } else if (eventName === "smokegrenade_expired") { event.player = entities.getByUserId(event.userid); event.entity = entities.entities.get(event.entityid); } else if (eventName === "survival_paradrop_break") { event.entity = entities.entities.get(event.entityid); } else if (eventName === "survival_paradrop_spawn") { event.entity = entities.entities.get(event.entityid); } else if (eventName === "tournament_reward") { event.itemDefinition = itemdefs_1.itemDefinitionIndexMap[event.defindex] || null; event.entity = entities.getByAccountId(event.accountid); } else if (eventName === "weapon_fire") { event.player = entities.getByUserId(event.userid); } else if (eventName === "weapon_fire_on_empty") { event.player = entities.getByUserId(event.userid); } else if (eventName === "weapon_outofammo") { event.player = entities.getByUserId(event.userid); } else if (eventName === "weapon_reload") { event.player = entities.getByUserId(event.userid); } else if (eventName === "weapon_zoom") { event.player = entities.getByUserId(event.userid); } return event; } exports.annotateEvent = annotateEvent; },{"./entities/itemdefs":10,"long":712}],18:[function(require,module,exports){ (function (Buffer){(function (){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.BitView = exports.BitStream = void 0; /* eslint-disable @typescript-eslint/unbound-method */ const bit_buffer_1 = require("bit-buffer"); Object.defineProperty(exports, "BitStream", { enumerable: true, get: function () { return bit_buffer_1.BitStream; } }); Object.defineProperty(exports, "BitView", { enumerable: true, get: function () { return bit_buffer_1.BitView; } }); const COORD_INTEGER_BITS = 14; const COORD_FRACTIONAL_BITS = 5; const COORD_DENOMINATOR = 1 << COORD_FRACTIONAL_BITS; const COORD_RESOLUTION = 1.0 / COORD_DENOMINATOR; // Special threshold for networking multiplayer origins const COORD_INTEGER_BITS_MP = 11; const COORD_FRACTIONAL_BITS_MP_LOWPRECISION = 3; const COORD_DENOMINATOR_LOWPRECISION = 1 << COORD_FRACTIONAL_BITS_MP_LOWPRECISION; const COORD_RESOLUTION_LOWPRECISION = 1.0 / COORD_DENOMINATOR_LOWPRECISION; const NORMAL_FRACTIONAL_BITS = 11; const NORMAL_DENOMINATOR = (1 << NORMAL_FRACTIONAL_BITS) - 1; const NORMAL_RESOLUTION = 1.0 / NORMAL_DENOMINATOR; const MAX_VAR_INT32_BYTES = 5; bit_buffer_1.BitStream.from = function from(array) { return new bit_buffer_1.BitStream(array.buffer, array.byteOffset, array.byteLength); }; bit_buffer_1.BitStream.prototype.readString = function (bytes) { let s = ""; let record = true; for (let i = 0; i < bytes; ++i) { const c = this.readUint8(); // Stop appending chars once we hit 0x00 if (c === 0x00) { record = false; } else if (record) { s += String.fromCharCode(c); } } return s; }; bit_buffer_1.BitStream.prototype.readBytes = function (bytes) { const arr = new Array(bytes); for (let i = 0; i < bytes; ++i) { arr[i] = this.readUInt8(); } return Buffer.from(arr); }; bit_buffer_1.BitStream.prototype.readOneBit = function () { return this.readBits(1, false) === 1; }; bit_buffer_1.BitStream.prototype.readUBits = bit_buffer_1.BitStream.prototype.readBits; bit_buffer_1.BitStream.prototype.readSBits = function (bits) { return this.readBits(bits, true); }; bit_buffer_1.BitStream.prototype.readUBitVar = function () { let ret = this.readUBits(6); switch (ret & (16 | 32)) { case 16: ret = (ret & 15) | (this.readUBits(4) << 4); break; case 32: ret = (ret & 15) | (this.readUBits(8) << 4); break; case 48: ret = (ret & 15) | (this.readUBits(32 - 4) << 4); break; } return ret; }; bit_buffer_1.BitStream.prototype.readBitCoord = function () { let intval = this.readOneBit() ? 1 : 0; let fractval = this.readOneBit() ? 1 : 0; if (!intval && !fractval) { return 0.0; } const signbit = this.readOneBit(); if (intval) { intval = this.readUBits(COORD_INTEGER_BITS) + 1; } if (fractval) { fractval = this.readUBits(COORD_FRACTIONAL_BITS); } let value = intval + fractval * COORD_RESOLUTION; if (signbit) { value = -value; } return value; }; bit_buffer_1.BitStream.prototype.readUVarInt32 = function () { let result = 0; let count = 0; let bytes; do { if (count === MAX_VAR_INT32_BYTES) { return result; } bytes = this.readUInt8(); result |= (bytes & 0x7f) << (7 * count); ++count; } while (bytes & 0x80); return result; }; bit_buffer_1.BitStream.prototype.readVarInt32 = function () { const result = this.readUVarInt32(); return (result >> 1) ^ -(result & 1); }; bit_buffer_1.BitStream.prototype.readBitCoordMPNone = function () { const inBounds = this.readOneBit(); let intval = this.readOneBit() ? 1 : 0; const signbit = this.readOneBit(); if (intval) { if (inBounds) { intval = this.readUBits(COORD_INTEGER_BITS_MP) + 1; } else { intval = this.readUBits(COORD_INTEGER_BITS) + 1; } } const fractval = this.readUBits(COORD_FRACTIONAL_BITS); let value = intval + fractval * COORD_RESOLUTION; if (signbit) { value = -value; } return value; }; bit_buffer_1.BitStream.prototype.readBitCoordMPLowPrecision = function () { const inBounds = this.readOneBit(); let intval = this.readOneBit() ? 1 : 0; const signbit = this.readOneBit(); if (intval) { if (inBounds) { intval = this.readUBits(COORD_INTEGER_BITS_MP) + 1; } else { intval = this.readUBits(COORD_INTEGER_BITS) + 1; } } const fractval = this.readUBits(COORD_FRACTIONAL_BITS_MP_LOWPRECISION); let value = intval + fractval * COORD_RESOLUTION_LOWPRECISION; if (signbit) { value = -value; } return value; }; bit_buffer_1.BitStream.prototype.readBitCoordMPIntegral = function () { const inBounds = this.readOneBit(); if (!this.readOneBit()) { return 0.0; } const signbit = this.readOneBit(); let value; if (inBounds) { value = this.readUBits(COORD_INTEGER_BITS_MP) + 1; } else { value = this.readUBits(COORD_INTEGER_BITS) + 1; } if (signbit) { value = -value; } return value; }; bit_buffer_1.BitStream.prototype.readBitNormal = function () { const signbit = this.readOneBit(); const fractval = this.readUBits(NORMAL_FRACTIONAL_BITS); let value = fractval * NORMAL_RESOLUTION; if (signbit) { value = -value; } return value; }; bit_buffer_1.BitStream.prototype.readBitCellCoordNone = function (bits) { const intval = this.readUBits(bits); const fractval = this.readUBits(COORD_FRACTIONAL_BITS); return intval + fractval * COORD_RESOLUTION; }; bit_buffer_1.BitStream.prototype.readBitCellCoordLowPrecision = function (bits) { const intval = this.readUBits(bits); const fractval = this.readUBits(COORD_FRACTIONAL_BITS_MP_LOWPRECISION); return intval + fractval * COORD_RESOLUTION_LOWPRECISION; }; bit_buffer_1.BitStream.prototype.readBitCellCoordIntegral = function (bits) { return this.readUBits(bits); }; bit_buffer_1.BitStream.prototype.readCString = function () { let s = ""; // eslint-disable-next-line no-constant-condition while (true) { const c = this.readUint8(); // Stop appending chars once we hit 0x00 if (c === 0x00) { break; } s += String.fromCharCode(c); } return s; }; bit_buffer_1.BitStream.prototype.readUInt8 = bit_buffer_1.BitStream.prototype.readUint8; bit_buffer_1.BitStream.prototype.readUInt16 = bit_buffer_1.BitStream.prototype.readUint16; bit_buffer_1.BitStream.prototype.readUInt32 = bit_buffer_1.BitStream.prototype.readUint32; bit_buffer_1.BitStream.prototype.writeUInt8 = bit_buffer_1.BitStream.prototype.writeUint8; bit_buffer_1.BitStream.prototype.writeUInt16 = bit_buffer_1.BitStream.prototype.writeUint16; bit_buffer_1.BitStream.prototype.writeUInt32 = bit_buffer_1.BitStream.prototype.writeUint32; }).call(this)}).call(this,require("buffer").Buffer) },{"bit-buffer":79,"buffer":81}],19:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.GameEvent = void 0; const assert = require("assert"); var EventKeyType; (function (EventKeyType) { EventKeyType[EventKeyType["TYPE_STRING"] = 1] = "TYPE_STRING"; EventKeyType[EventKeyType["TYPE_FLOAT"] = 2] = "TYPE_FLOAT"; EventKeyType[EventKeyType["TYPE_LONG"] = 3] = "TYPE_LONG"; EventKeyType[EventKeyType["TYPE_SHORT"] = 4] = "TYPE_SHORT"; EventKeyType[EventKeyType["TYPE_BYTE"] = 5] = "TYPE_BYTE"; EventKeyType[EventKeyType["TYPE_BOOL"] = 6] = "TYPE_BOOL"; EventKeyType[EventKeyType["TYPE_UINT64"] = 7] = "TYPE_UINT64"; EventKeyType[EventKeyType["TYPE_WSTRING"] = 8] = "TYPE_WSTRING"; })(EventKeyType || (EventKeyType = {})); class GameEvent { constructor(descriptor) { this.name = descriptor.name; this.id = descriptor.eventid; this.keyNames = descriptor.keys.map(key => key.name); } messageToObject(eventMsg) { assert(eventMsg.eventid === this.id); const event = {}; for (let i = 0; i < this.keyNames.length; ++i) { const keyName = this.keyNames[i]; const value = eventMsg.keys[i]; switch (value.type) { case EventKeyType.TYPE_STRING: event[keyName] = value.valString; break; case EventKeyType.TYPE_FLOAT: event[keyName] = value.valFloat; break; case EventKeyType.TYPE_LONG: event[keyName] = value.valLong; break; case EventKeyType.TYPE_SHORT: event[keyName] = value.valShort; break; case EventKeyType.TYPE_BYTE: event[keyName] = value.valByte; break; case EventKeyType.TYPE_BOOL: event[keyName] = value.valBool; break; case EventKeyType.TYPE_UINT64: event[keyName] = value.valUint64; break; case EventKeyType.TYPE_WSTRING: event[keyName] = value.valWstring; break; } } return event; } } exports.GameEvent = GameEvent; },{"assert":73}],20:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.GameEvents = void 0; const events_1 = require("events"); const gameevent_1 = require("./gameevent"); const eventtypes_1 = require("./eventtypes"); /** * Manages game events for a demo file. */ class GameEvents extends events_1.EventEmitter { constructor() { super(...arguments); this.gameEventList = []; this._tickEvents = []; } listen(demo) { const entities = demo.entities; demo.on("svc_GameEventList", this._handleGameEventList.bind(this)); demo.on("svc_GameEvent", msg => { const event = this.gameEventList[msg.eventid]; if (!event) { return; } const eventVars = event.messageToObject(msg); // buffer game events until the end of the tick this._tickEvents.push({ name: event.name, event: (0, eventtypes_1.annotateEvent)(entities, event.name, eventVars) }); }); demo.on("tickend", () => { this._tickEvents.forEach(event => { this.emit(event.name, event.event); this.emit("event", { name: event.name, // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment event: event.event }); }); this._tickEvents = []; }); } _handleGameEventList(msg) { for (const descriptor of msg.descriptors) { this.gameEventList[descriptor.eventid] = new gameevent_1.GameEvent(descriptor); } } } exports.GameEvents = GameEvents; },{"./eventtypes":17,"./gameevent":19,"events":84}],21:[function(require,module,exports){ "use strict"; // Copied from https://github.com/DSergiu/node-ice // --- // The MIT License // // Copyright (c) 2010-2017 Google, Inc. http://angularjs.org // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. Object.defineProperty(exports, "__esModule", { value: true }); exports.IceKey = void 0; class IceKey { // Create a new ICE key with the specified level. constructor(level) { this.cipherHolder = new Uint8Array(8); this.plainHolder = new Uint8Array(8); if (!IceKey.spBoxInitialised) { this.spBoxInit(); IceKey.spBoxInitialised = true; } if (level < 1) { this.size = 1; this.rounds = 8; } else { this.size = level; this.rounds = level * 16; } this.keySchedule = []; for (let i = 0; i < this.rounds; i++) { this.keySchedule[i] = []; for (let j = 0; j < 3; j++) { this.keySchedule[i][j] = 0; } } } // Return the key size, in bytes. keySize() { return this.size * 8; } // Return the block size, in bytes. blockSize() { return 8; } // Set the key schedule of an ICE key. set(key) { const kb = new Uint16Array(4); for (let i = 0; i < 4; i++) kb[i] = 0; if (this.rounds === 8) { for (let i = 0; i < 4; i++) kb[3 - i] = ((key[i * 2] & 0xff) << 8) | (key[i * 2 + 1] & 0xff); this.scheduleBuild(kb, 0, 0); return; } for (let i = 0; i < this.size; i++) { for (let j = 0; j < 4; j++) kb[3 - j] = ((key[i * 8 + j * 2] & 0xff) << 8) | (key[i * 8 + j * 2 + 1] & 0xff); this.scheduleBuild(kb, i * 8, 0); this.scheduleBuild(kb, this.rounds - 8 - i * 8, 8); } } // Clear the key schedule to prevent memory snooping. clear() { for (let i = 0; i < this.rounds; i++) for (let j = 0; j < 3; j++) this.keySchedule[i][j] = 0; } // Encrypt a block of 8 bytes of data. encrypt(plaintext, ciphertext) { let i; let l = 0; let r = 0; for (i = 0; i < 4; i++) { l |= (plaintext[i] & 0xff) << (24 - i * 8); r |= (plaintext[i + 4] & 0xff) << (24 - i * 8); } for (i = 0; i < this.rounds; i += 2) { l ^= this.roundFunc(r, this.keySchedule[i]); r ^= this.roundFunc(l, this.keySchedule[i + 1]); } for (i = 0; i < 4; i++) { ciphertext[3 - i] = Number(r & 0xff); ciphertext[7 - i] = Number(l & 0xff); r >>>= 8; l >>>= 8; } } // Decrypt a block of 8 bytes of data. decrypt(ciphertext, plaintext) { let i; let l = 0; let r = 0; for (i = 0; i < 4; i++) { l |= (ciphertext[i] & 0xff) << (24 - i * 8); r |= (ciphertext[i + 4] & 0xff) << (24 - i * 8); } for (i = this.rounds - 1; i > 0; i -= 2) { l ^= this.roundFunc(r, this.keySchedule[i]); r ^= this.roundFunc(l, this.keySchedule[i - 1]); } for (i = 0; i < 4; i++) { plaintext[3 - i] = Number(r & 0xff); plaintext[7 - i] = Number(l & 0xff); r >>>= 8; l >>>= 8; } } decryptUint8Array(cipherArray, plainArray, from, to) { if (from == null) from = 0; if (to == null) to = cipherArray.length; let k = 0; // decrypt full blocks while (from + 8 <= to) { for (let i = 0; i < 8; i++) { this.cipherHolder[i] = cipherArray[from + i]; } this.decrypt(this.cipherHolder, this.plainHolder); for (let i = 0; i < 8; i++) { plainArray[k + i] = this.plainHolder[i]; } k += 8; from += 8; } // remaining bytes do not get encryption, just copy them if (((to - from) & 0x7) !== 0) { for (let i = from; i < to; i++) { plainArray[k++] = cipherArray[i]; } } } // 8-bit Galois Field multiplication of a by b, modulo m. // Just like arithmetic multiplication, except that // additions and subtractions are replaced by XOR. gf_mult(a, b, m) { let res = 0; while (b !== 0) { if ((b & 1) !== 0) res ^= a; a <<= 1; b >>>= 1; if (a >= 256) a ^= m; } return res; } // 8-bit Galois Field exponentiation. // Raise the base to the power of 7, modulo m. gf_exp7(b, m) { let x; if (b === 0) return 0; x = this.gf_mult(b, b, m); x = this.gf_mult(b, x, m); x = this.gf_mult(x, x, m); return this.gf_mult(b, x, m); } // Carry out the ICE 32-bit permutation. perm32(x) { let res = 0; let i = 0; while (x !== 0) { if ((x & 1) !== 0) res |= IceKey.pBox[i]; i++; x >>>= 1; } return res; } // Initialise the substitution/permutation boxes. spBoxInit() { IceKey.spBox = []; for (let i = 0; i < 4; i++) { IceKey.spBox[i] = []; for (let j = 0; j < 1024; j++) { IceKey.spBox[i][j] = 0; } } for (let i = 0; i < 1024; i++) { const col = (i >>> 1) & 0xff; const row = (i & 0x1) | ((i & 0x200) >>> 8); let x; x = this.gf_exp7(col ^ IceKey.sXor[0][row], IceKey.sMod[0][row]) << 24; IceKey.spBox[0][i] = this.perm32(x); x = this.gf_exp7(col ^ IceKey.sXor[1][row], IceKey.sMod[1][row]) << 16; IceKey.spBox[1][i] = this.perm32(x); x = this.gf_exp7(col ^ IceKey.sXor[2][row], IceKey.sMod[2][row]) << 8; IceKey.spBox[2][i] = this.perm32(x); x = this.gf_exp7(col ^ IceKey.sXor[3][row], IceKey.sMod[3][row]); IceKey.spBox[3][i] = this.perm32(x); } } // Set 8 rounds [n, n+7] of the key schedule of an ICE key. scheduleBuild(kb, n, krotIdx) { let i; for (i = 0; i < 8; i++) { let j; const kr = IceKey.keyrot[krotIdx + i]; const subkey = this.keySchedule[n + i]; for (j = 0; j < 3; j++) this.keySchedule[n + i][j] = 0; for (j = 0; j < 15; j++) { let k; const curSk = j % 3; for (k = 0; k < 4; k++) { const curKb = kb[(kr + k) & 3]; const bit = curKb & 1; subkey[curSk] = (subkey[curSk] << 1) | bit; kb[(kr + k) & 3] = (curKb >>> 1) | ((bit ^ 1) << 15); } } } } // The single round ICE f function. roundFunc(p, subkey) { const tl = ((p >>> 16) & 0x3ff) | (((p >>> 14) | (p << 18)) & 0xffc00); const tr = (p & 0x3ff) | ((p << 2) & 0xffc00); let al = subkey[2] & (tl ^ tr); let ar = al ^ tr; al ^= tl; al ^= subkey[0]; ar ^= subkey[1]; return (IceKey.spBox[0][al >>> 10] | IceKey.spBox[1][al & 0x3ff] | IceKey.spBox[2][ar >>> 10] | IceKey.spBox[3][ar & 0x3ff]); } } exports.IceKey = IceKey; IceKey.spBoxInitialised = false; IceKey.sMod = [ [333, 313, 505, 369], [379, 375, 319, 391], [361, 445, 451, 397], [397, 425, 395, 505] ]; IceKey.sXor = [ [0x83, 0x85, 0x9b, 0xcd], [0xcc, 0xa7, 0xad, 0x41], [0x4b, 0x2e, 0xd4, 0x33], [0xea, 0xcb, 0x2e, 0x04] ]; IceKey.pBox = [ 0x00000001, 0x00000080, 0x00000400, 0x00002000, 0x00080000, 0x00200000, 0x01000000, 0x40000000, 0x00000008, 0x00000020, 0x00000100, 0x00004000, 0x00010000, 0x00800000, 0x04000000, 0x20000000, 0x00000004, 0x00000010, 0x00000200, 0x00008000, 0x00020000, 0x00400000, 0x08000000, 0x10000000, 0x00000002, 0x00000040, 0x00000800, 0x00001000, 0x00040000, 0x00100000, 0x02000000, 0x80000000 ]; IceKey.keyrot = [0, 1, 2, 3, 2, 1, 3, 0, 1, 3, 2, 0, 3, 1, 0, 2]; },{}],22:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.findByType = exports.findByName = exports.messages = void 0; const netmessages_1 = require("./protobufs/netmessages"); exports.messages = []; exports.messages[netmessages_1.NETMessages.net_NOP] = { name: "net_NOP", class: netmessages_1.CNETMsgNOP }; exports.messages[netmessages_1.NETMessages.net_Disconnect] = { name: "net_Disconnect", class: netmessages_1.CNETMsgDisconnect }; exports.messages[netmessages_1.NETMessages.net_File] = { name: "net_File", class: netmessages_1.CNETMsgFile }; exports.messages[netmessages_1.NETMessages.net_SplitScreenUser] = { name: "net_SplitScreenUser", class: netmessages_1.CNETMsgSplitScreenUser }; exports.messages[netmessages_1.NETMessages.net_Tick] = { name: "net_Tick", class: netmessages_1.CNETMsgTick }; exports.messages[netmessages_1.NETMessages.net_StringCmd] = { name: "net_StringCmd", class: netmessages_1.CNETMsgStringCmd }; exports.messages[netmessages_1.NETMessages.net_SetConVar] = { name: "net_SetConVar", class: netmessages_1.CNETMsgSetConVar }; exports.messages[netmessages_1.NETMessages.net_SignonState] = { name: "net_SignonState", class: netmessages_1.CNETMsgSignonState }; exports.messages[netmessages_1.NETMessages.net_PlayerAvatarData] = { name: "net_PlayerAvatarData", class: netmessages_1.CNETMsgPlayerAvatarData }; exports.messages[netmessages_1.SVCMessages.svc_ServerInfo] = { name: "svc_ServerInfo", class: netmessages_1.CSVCMsgServerInfo }; exports.messages[netmessages_1.SVCMessages.svc_SendTable] = { name: "svc_SendTable", class: netmessages_1.CSVCMsgSendTable }; exports.messages[netmessages_1.SVCMessages.svc_ClassInfo] = { name: "svc_ClassInfo", class: netmessages_1.CSVCMsgClassInfo }; exports.messages[netmessages_1.SVCMessages.svc_SetPause] = { name: "svc_SetPause", class: netmessages_1.CSVCMsgSetPause }; exports.messages[netmessages_1.SVCMessages.svc_CreateStringTable] = { name: "svc_CreateStringTable", class: netmessages_1.CSVCMsgCreateStringTable }; exports.messages[netmessages_1.SVCMessages.svc_UpdateStringTable] = { name: "svc_UpdateStringTable", class: netmessages_1.CSVCMsgUpdateStringTable }; exports.messages[netmessages_1.SVCMessages.svc_VoiceInit] = { name: "svc_VoiceInit", class: netmessages_1.CSVCMsgVoiceInit }; exports.messages[netmessages_1.SVCMessages.svc_VoiceData] = { name: "svc_VoiceData", class: netmessages_1.CSVCMsgVoiceData }; exports.messages[netmessages_1.SVCMessages.svc_Print] = { name: "svc_Print", class: netmessages_1.CSVCMsgPrint }; exports.messages[netmessages_1.SVCMessages.svc_Sounds] = { name: "svc_Sounds", class: netmessages_1.CSVCMsgSounds }; exports.messages[netmessages_1.SVCMessages.svc_SetView] = { name: "svc_SetView", class: netmessages_1.CSVCMsgSetView }; exports.messages[netmessages_1.SVCMessages.svc_FixAngle] = { name: "svc_FixAngle", class: netmessages_1.CSVCMsgFixAngle }; exports.messages[netmessages_1.SVCMessages.svc_CrosshairAngle] = { name: "svc_CrosshairAngle", class: netmessages_1.CSVCMsgCrosshairAngle }; exports.messages[netmessages_1.SVCMessages.svc_BSPDecal] = { name: "svc_BSPDecal", class: netmessages_1.CSVCMsgBSPDecal }; exports.messages[netmessages_1.SVCMessages.svc_SplitScreen] = { name: "svc_SplitScreen", class: netmessages_1.CSVCMsgSplitScreen }; exports.messages[netmessages_1.SVCMessages.svc_UserMessage] = { name: "svc_UserMessage", class: netmessages_1.CSVCMsgUserMessage }; exports.messages[netmessages_1.SVCMessages.svc_EntityMessage] = { name: "svc_EntityMessage", class: netmessages_1.CSVCMsgEntityMsg }; exports.messages[netmessages_1.SVCMessages.svc_GameEvent] = { name: "svc_GameEvent", class: netmessages_1.CSVCMsgGameEvent }; exports.messages[netmessages_1.SVCMessages.svc_PacketEntities] = { name: "svc_PacketEntities", class: netmessages_1.CSVCMsgPacketEntities }; exports.messages[netmessages_1.SVCMessages.svc_TempEntities] = { name: "svc_TempEntities", class: netmessages_1.CSVCMsgTempEntities }; exports.messages[netmessages_1.SVCMessages.svc_Prefetch] = { name: "svc_Prefetch", class: netmessages_1.CSVCMsgPrefetch }; exports.messages[netmessages_1.SVCMessages.svc_Menu] = { name: "svc_Menu", class: netmessages_1.CSVCMsgMenu }; exports.messages[netmessages_1.SVCMessages.svc_GameEventList] = { name: "svc_GameEventList", class: netmessages_1.CSVCMsgGameEventList }; exports.messages[netmessages_1.SVCMessages.svc_GetCvarValue] = { name: "svc_GetCvarValue", class: netmessages_1.CSVCMsgGetCvarValue }; exports.messages[netmessages_1.SVCMessages.svc_PaintmapData] = { name: "svc_PaintmapData", class: netmessages_1.CSVCMsgPaintmapData }; exports.messages[netmessages_1.SVCMessages.svc_CmdKeyValues] = { name: "svc_CmdKeyValues", class: netmessages_1.CSVCMsgCmdKeyValues }; exports.messages[netmessages_1.SVCMessages.svc_EncryptedData] = { name: "svc_EncryptedData", class: netmessages_1.CSVCMsgEncryptedData }; exports.messages[netmessages_1.SVCMessages.svc_HltvReplay] = { name: "svc_HltvReplay", class: netmessages_1.CSVCMsgHltvReplay }; exports.messages[netmessages_1.SVCMessages.svc_Broadcast_Command] = { name: "svc_Broadcast_Command", class: netmessages_1.CSVCMsgBroadcastCommand }; function findByName(name) { return exports.messages.find(descriptor => descriptor.name === name); } exports.findByName = findByName; function findByType(type) { return exports.messages[type]; } exports.findByType = findByType; },{"./protobufs/netmessages":27}],23:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.makeDecoder = exports.SPROP_VARINT = exports.SPROP_CHANGES_OFTEN = exports.SPROP_CELL_COORD_INTEGRAL = exports.SPROP_CELL_COORD_LOWPRECISION = exports.SPROP_CELL_COORD = exports.SPROP_COORD_MP_INTEGRAL = exports.SPROP_COORD_MP_LOWPRECISION = exports.SPROP_COORD_MP = exports.SPROP_COLLAPSIBLE = exports.SPROP_IS_A_VECTOR_ELEM = exports.SPROP_PROXY_ALWAYS_YES = exports.SPROP_INSIDEARRAY = exports.SPROP_XYZE = exports.SPROP_EXCLUDE = exports.SPROP_NORMAL = exports.SPROP_ROUNDUP = exports.SPROP_ROUNDDOWN = exports.SPROP_NOSCALE = exports.SPROP_COORD = exports.SPROP_UNSIGNED = void 0; const assert = require("assert"); const Long = require("long"); const assert_exists_1 = require("./assert-exists"); const consts_1 = require("./consts"); const entityhandle_1 = require("./entityhandle"); exports.SPROP_UNSIGNED = 1 << 0; // Unsigned integer data. exports.SPROP_COORD = 1 << 1; // If this is set, the float/vector is treated like a world coordinate. Note that the bit count is ignored in this case. exports.SPROP_NOSCALE = 1 << 2; // For floating point, don't scale into range, just take value as is. exports.SPROP_ROUNDDOWN = 1 << 3; // For floating point, limit high value to range minus one bit unit exports.SPROP_ROUNDUP = 1 << 4; // For floating point, limit low value to range minus one bit unit exports.SPROP_NORMAL = 1 << 5; // If this is set, the vector is treated like a normal (only valid for vectors) exports.SPROP_EXCLUDE = 1 << 6; // This is an exclude prop (not excludED, but it points at another prop to be excluded). exports.SPROP_XYZE = 1 << 7; // Use XYZ/Exponent encoding for vectors. exports.SPROP_INSIDEARRAY = 1 << 8; // This tells us that the property is inside an array, so it shouldn't be put into the flattened property list. Its array will point at it when it needs to. exports.SPROP_PROXY_ALWAYS_YES = 1 << 9; // Set for datatable props using one of the default datatable proxies like SendProxy_DataTableToDataTable that always send the data to all clients. exports.SPROP_IS_A_VECTOR_ELEM = 1 << 10; // Set automatically if SPROP_VECTORELEM is used. exports.SPROP_COLLAPSIBLE = 1 << 11; // Set automatically if it's a datatable with an offset of 0 that doesn't change the pointer (ie: for all automatically-chained base classes). exports.SPROP_COORD_MP = 1 << 12; // Like SPROP_COORD, but special handling for multiplayer games exports.SPROP_COORD_MP_LOWPRECISION = 1 << 13; // Like SPROP_COORD, but special handling for multiplayer games where the fractional component only gets a 3 bits instead of 5 exports.SPROP_COORD_MP_INTEGRAL = 1 << 14; // SPROP_COORD_MP, but coordinates are rounded to integral boundaries exports.SPROP_CELL_COORD = 1 << 15; // Like SPROP_COORD, but special encoding for cell coordinates that can't be negative, bit count indicate maximum value exports.SPROP_CELL_COORD_LOWPRECISION = 1 << 16; // Like SPROP_CELL_COORD, but special handling where the fractional component only gets a 3 bits instead of 5 exports.SPROP_CELL_COORD_INTEGRAL = 1 << 17; // SPROP_CELL_COORD, but coordinates are rounded to integral boundaries exports.SPROP_CHANGES_OFTEN = 1 << 18; // this is an often changed field, moved to head of sendtable so it gets a small index exports.SPROP_VARINT = 1 << 19; // use var int encoded (google protobuf style), note you want to include SPROP_UNSIGNED if needed, its more efficient const DT_MAX_STRING_BITS = 9; function makeIntDecoder(sendProp) { if ((sendProp.flags & exports.SPROP_VARINT) !== 0) { if ((sendProp.flags & exports.SPROP_UNSIGNED) !== 0) { return bitbuf => bitbuf.readUVarInt32(); } else { return bitbuf => bitbuf.readVarInt32(); } } else { const numBits = sendProp.numBits; if ((sendProp.flags & exports.SPROP_UNSIGNED) !== 0) { if ((sendProp.flags & exports.SPROP_NOSCALE) !== 0 && sendProp.numBits === consts_1.NUM_NETWORKED_EHANDLE_BITS) { return bitbuf => new entityhandle_1.EntityHandle(bitbuf.readUBits(numBits)); } else if (numBits === 1) { return bitbuf => bitbuf.readOneBit(); } else { return bitbuf => bitbuf.readUBits(numBits); } } else { return bitbuf => bitbuf.readSBits(numBits); } } } function makeSpecialFloatDecoder(sendProp) { if ((sendProp.flags & exports.SPROP_COORD) !== 0) { return bitbuf => bitbuf.readBitCoord(); } else if ((sendProp.flags & exports.SPROP_COORD_MP) !== 0) { return bitbuf => bitbuf.readBitCoordMPNone(); } else if ((sendProp.flags & exports.SPROP_COORD_MP_LOWPRECISION) !== 0) { return bitbuf => bitbuf.readBitCoordMPLowPrecision(); } else if ((sendProp.flags & exports.SPROP_COORD_MP_INTEGRAL) !== 0) { return bitbuf => bitbuf.readBitCoordMPIntegral(); } else if ((sendProp.flags & exports.SPROP_NOSCALE) !== 0) { return bitbuf => bitbuf.readFloat32(); } else if ((sendProp.flags & exports.SPROP_NORMAL) !== 0) { return bitbuf => bitbuf.readBitNormal(); } else if ((sendProp.flags & exports.SPROP_CELL_COORD) !== 0) { return bitbuf => bitbuf.readBitCellCoordNone(sendProp.numBits); } else if ((sendProp.flags & exports.SPROP_CELL_COORD_LOWPRECISION) !== 0) { return bitbuf => bitbuf.readBitCellCoordLowPrecision(sendProp.numBits); } else if ((sendProp.flags & exports.SPROP_CELL_COORD_INTEGRAL) !== 0) { return bitbuf => bitbuf.readUBits(sendProp.numBits); } else { return undefined; } } function makeFloatDecoder(sendProp) { const special = makeSpecialFloatDecoder(sendProp); if (special !== undefined) { return special; } const numBits = sendProp.numBits; const maxValue = (1 << numBits) - 1; const lowValue = sendProp.lowValue; const highValue = sendProp.highValue; return bitbuf => { const interp = bitbuf.readUBits(numBits); const fVal = interp / maxValue; return lowValue + (highValue - lowValue) * fVal; }; } function makeVectorDecoder(sendProp) { const floatDecode = makeFloatDecoder(sendProp); const isNormal = (sendProp.flags & exports.SPROP_NORMAL) !== 0; if (isNormal) { return bitbuf => { const v = { x: floatDecode(bitbuf), y: floatDecode(bitbuf), z: 0.0 }; const signBit = bitbuf.readOneBit(); const v0v0v1v1 = v.x * v.x + v.y * v.y; if (v0v0v1v1 < 1.0) { v.z = Math.sqrt(1.0 - v0v0v1v1); } else { v.z = 0.0; } if (signBit) { v.z *= -1.0; } return v; }; } else { return bitbuf => ({ x: floatDecode(bitbuf), y: floatDecode(bitbuf), z: floatDecode(bitbuf) }); } } function makeVectorXYDecoder(sendProp) { const floatDecode = makeFloatDecoder(sendProp); return bitbuf => ({ x: floatDecode(bitbuf), y: floatDecode(bitbuf), z: 0.0 }); } function makeStringDecoder(_sendProp) { return bitbuf => { const len = bitbuf.readUBits(DT_MAX_STRING_BITS); return bitbuf.readString(len); }; } function makeInt64Decoder(sendProp) { if ((sendProp.flags & exports.SPROP_VARINT) !== 0) { if ((sendProp.flags & exports.SPROP_UNSIGNED) !== 0) { throw new Error("64-bit unsigned varint not implemented"); // TODO } else { throw new Error("64-bit signed varint not implemented"); // TODO } } else { const highBits = sendProp.numBits - 32; if ((sendProp.flags & exports.SPROP_UNSIGNED) !== 0) { return bitbuf => { const lowInt = bitbuf.readUBits(32); const highInt = bitbuf.readUBits(highBits); return Long.fromBits(lowInt, highInt, false); }; } else { return bitbuf => { const neg = bitbuf.readOneBit(); const lowInt = bitbuf.readUBits(32); const highInt = bitbuf.readUBits(highBits - 1); return Long.fromBits(lowInt, highInt, !neg); }; } } } function makeValueDecoder(sendProp) { switch (sendProp.type) { case 0 /* PropType.Int */: return makeIntDecoder(sendProp); case 1 /* PropType.Float */: return makeFloatDecoder(sendProp); case 2 /* PropType.Vector */: return makeVectorDecoder(sendProp); case 3 /* PropType.VectorXY */: return makeVectorXYDecoder(sendProp); case 4 /* PropType.String */: return makeStringDecoder(sendProp); case 7 /* PropType.Int64 */: return makeInt64Decoder(sendProp); default: throw new Error(`Unsupported send prop type ${sendProp.type}`); } } function makeArrayDecoder(sendProp, arrayElementProp) { const maxElements = sendProp.numElements; const numBits = (Math.log2(maxElements) | 0) + 1; const elementDecoder = makeValueDecoder(arrayElementProp); return bitbuf => { const numElements = bitbuf.readUBits(numBits); const array = new Array(numElements); for (let i = 0; i < numElements; ++i) { array[i] = elementDecoder(bitbuf); } return array; }; } function makeDecoder(sendProp, arrayElementProp) { const type = sendProp.type; assert(type !== 6 /* PropType.DataTable */); if (type === 5 /* PropType.Array */) { return makeArrayDecoder(sendProp, (0, assert_exists_1.default)(arrayElementProp, "array prop with no element prop")); } else { return makeValueDecoder(sendProp); } } exports.makeDecoder = makeDecoder; },{"./assert-exists":2,"./consts":3,"./entityhandle":16,"assert":73,"long":712}],24:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.CMsgGCCStrike15V2MatchmakingServerRoundStats_DropInfo = exports.CMsgGCCStrike15V2MatchmakingServerRoundStats = exports.CMsgGCCStrike15V2MatchmakingGC2ClientReserve = exports.CMsgGCCStrike15V2MatchmakingServerReservationResponse = exports.CMsgGCCStrike15V2MatchmakingGC2ServerReserve = exports.CPreMatchInfoData_TeamStats = exports.CPreMatchInfoData = exports.CDataGCCStrike15V2TournamentMatchDraft_Entry = exports.CDataGCCStrike15V2TournamentMatchDraft = exports.CMsgGCCStrike15V2MatchmakingGC2ClientUpdate_Note = exports.CMsgGCCStrike15V2MatchmakingGC2ClientUpdate = exports.CMsgGCCStrike15V2MatchmakingClient2ServerPing = exports.CMsgGCCStrike15V2MatchmakingStop = exports.CMsgGCCStrike15V2MatchmakingStart = exports.CMsgGCCStrike15V2GC2ServerReservationUpdate = exports.CMsgGCCStrike15V2MatchmakingGC2ServerConfirm = exports.CMsgGCCStrike15V2MatchmakingGCOperationalStats = exports.CMsgGCServerQuestUpdateData = exports.DeepPlayerMatchEvent = exports.DeepPlayerStatsEntry = exports.PlayerQuestData_QuestItemData = exports.PlayerQuestData = exports.ScoreLeaderboardData_AccountEntries = exports.ScoreLeaderboardData_Entry = exports.ScoreLeaderboardData = exports.MatchEndItemUpdates = exports.XpProgressData = exports.CMsgCsgoSteamUserStatChange = exports.IpAddressMask = exports.ServerHltvInfo = exports.TournamentMatchSetup = exports.AccountActivity = exports.PlayerMedalsInfo = exports.PlayerCommendationInfo = exports.PlayerRankingInfo = exports.OperationalStatisticsPacket = exports.OperationalStatisticElement = exports.OperationalStatisticDescription = exports.GlobalStatistics = exports.TournamentEvent = exports.TournamentTeam = exports.TournamentPlayer = exports.DetailedSearchStatistic = exports.DataCenterPing = exports.GameServerPing = exports.EInitSystemResult = exports.EClientReportingVersion = exports.ECsgoSteamUserStat = exports.ECsgoGCMsg = exports.protobufPackage = void 0; exports.CMsgGCCStrike15V2MatchList = exports.CDataGCCStrike15V2TournamentInfo = exports.CDataGCCStrike15V2TournamentSection = exports.CDataGCCStrike15V2TournamentGroup_Picks = exports.CDataGCCStrike15V2TournamentGroup = exports.CDataGCCStrike15V2TournamentGroupTeam = exports.CDataGCCStrike15V2MatchInfo = exports.CMsgGCCStrike15V2MatchListRequestFullGameInfo = exports.CMsgGCCStrike15V2MatchListRequestTournamentGames = exports.CMsgGCCStrike15V2MatchListRequestRecentUserGames = exports.CMsgGCCStrike15V2MatchListRequestLiveGameForUser = exports.CMsgGCCStrike15V2MatchListRequestCurrentLiveGames = exports.CMsgGCCStrike15V2Client2GCEconPreviewDataBlockResponse = exports.CMsgGCCStrike15V2Client2GCEconPreviewDataBlockRequest = exports.CMsgItemAcknowledged = exports.CMsgGCCStrike15V2MatchEndRewardDropsNotification = exports.CEconItemPreviewDataBlock_Sticker = exports.CEconItemPreviewDataBlock = exports.CMsgGCCStrike15V2MatchEndRunRewardDrops = exports.CMsgGCCStrike15V2Client2GCTextMsg = exports.CMsgGCCStrike15V2GC2ClientTextMsg = exports.CClientHeaderOverwatchEvidence = exports.CMsgGCCStrike15V2PlayerOverwatchCaseStatus = exports.CMsgGCCStrike15V2PlayerOverwatchCaseAssignment = exports.CMsgGCCStrike15V2PlayerOverwatchCaseUpdate = exports.CMsgGCCStrike15V2PlayersProfile = exports.CMsgGCCStrike15V2ClientRequestPlayersProfile = exports.CMsgGCCStrike15V2WatchInfoUsers = exports.CMsgGCCStrike15ClientDeepStats_DeepStatsMatch = exports.CMsgGCCStrike15ClientDeepStats_DeepStatsRange = exports.CMsgGCCStrike15ClientDeepStats = exports.CMsgGCCstrike15V2GC2ServerNotifyXPRewarded = exports.CMsgGCCstrike15V2ClientRedeemMissionReward = exports.CMsgGCCstrike15V2ClientRequestNewMission = exports.CMsgGCCStrike15V2ClientRequestJoinServerData = exports.CMsgGCCStrike15V2ClientRequestJoinFriendData = exports.WatchableMatchInfo = exports.CMsgGCCStrike15V2ClientRequestWatchInfoFriends = exports.CMsgGCCStrike15V2ClientReportResponse = exports.CMsgGCCStrike15V2ClientReportServer = exports.CMsgGCCStrike15V2ClientCommendPlayer = exports.CMsgGCCStrike15V2ClientReportPlayer = exports.CMsgGCCStrike15V2ServerNotificationForUserPenalty = exports.CMsgGCCStrike15V2MatchmakingOperator2GCBlogUpdate = exports.CMsgGCCStrike15V2ClientGCRankUpdate = exports.CMsgGCCStrike15V2MatchmakingGC2ClientAbandon = exports.CMsgGCCStrike15V2AccountPrivacySettings_Setting = exports.CMsgGCCStrike15V2AccountPrivacySettings = exports.CMsgGCCStrike15V2MatchmakingGC2ClientHello = exports.CMsgGCCStrike15V2MatchmakingClient2GCHello = void 0; exports.CMsgGCCStrike15V2ClientPartyWarning = exports.CMsgGCCStrike15V2ClientPartyJoinRelay = exports.CMsgGCCStrike15V2ClientAccountBalance = exports.CMsgGCCStrike15V2ClientRequestSouvenir = exports.CMsgGCCStrike15V2ClientRequestOffers = exports.CMsgGCToClientSteamDatagramTicket = exports.CMsgGCCStrike15V2ClientToGCRequestTicket = exports.CMsgGCCStrike15V2AccountRequestCoPlays_Player = exports.CMsgGCCStrike15V2AccountRequestCoPlays = exports.CMsgGCCStrike15V2PartyInvite = exports.CMsgGCCStrike15V2PartySearchResults_Entry = exports.CMsgGCCStrike15V2PartySearchResults = exports.CMsgGCCStrike15V2PartySearch = exports.CMsgGCCStrike15V2PartyRegister = exports.CMsgGCCStrike15V2ClientPollState = exports.CMsgGCCStrike15V2ClientLogonFatalError = exports.CMsgGCCStrike15V2ClientPlayerDecalSign = exports.PlayerDecalDigitalSignature = exports.CMsgGCCStrike15GotvSyncPacket = exports.CMsgGCCStrike15V2ClientAuthKeyCode = exports.CMsgGCCStrike15V2GCToClientChat = exports.CMsgGCCStrike15V2ClientToGCChat = exports.CMsgGCCStrike15V2ClientToGCRequestElevate = exports.CMsgGCCStrike15V2Client2GCStreamUnlock = exports.CMsgGCCStrike15V2Client2GCRequestPrestigeCoin = exports.CMsgGCCStrike15V2AcknowledgePenalty = exports.CMsgGCGlobalGamePlay = exports.CMsgGCGlobalGameUnsubscribe = exports.CMsgGCGlobalGameSubscribe = exports.CSOPersonaDataPublic = exports.CSOAccountRecurringSubscription = exports.CSOAccountSeasonalOperation = exports.CSOQuestProgress = exports.CSOEconCoupon = exports.CMsgGCCStrike15V2GC2ClientTournamentInfo = exports.CMsgGCCStrike15V2Server2GCClientValidate = exports.CMsgGCCStrike15V2ClientSubmitSurveyVote = exports.CMsgGCCStrike15V2GiftsLeaderboardResponse_GiftLeaderboardEntry = exports.CMsgGCCStrike15V2GiftsLeaderboardResponse = exports.CMsgGCCStrike15V2GiftsLeaderboardRequest = exports.CMsgGCCStrike15V2ServerVarValueNotificationInfo = exports.CMsgGCCStrike15V2ClientVarValueNotificationInfo = exports.CMsgCStrike15Welcome = exports.CAttributeString = exports.CMsgGCCStrike15V2Fantasy_FantasyTeam = exports.CMsgGCCStrike15V2Fantasy_FantasySlot = exports.CMsgGCCStrike15V2Fantasy = exports.CMsgGCCStrike15V2Predictions_GroupMatchTeamPick = exports.CMsgGCCStrike15V2Predictions = exports.CMsgGCCStrike15V2MatchListTournamentOperatorMgmt = void 0; exports.CMsgGCCStrike15V2GC2ClientInitSystemResponse = exports.CMsgGCCStrike15V2GC2ClientInitSystem = exports.CMsgGCCStrike15V2GC2ClientRequestValidation = exports.CMsgGCCStrike15V2GC2ClientRefuseSecureMode = exports.CMsgGCCStrike15V2ClientReportValidation = exports.CVDiagnostic = exports.CMsgGCCStrike15V2ClientPerfReport_Entry = exports.CMsgGCCStrike15V2ClientPerfReport = exports.CMsgGCCStrike15V2GetEventFavoritesResponse = exports.CMsgGCCStrike15V2GetEventFavoritesRequest = exports.CMsgGCCStrike15V2SetEventFavorite = exports.CMsgGCCStrike15V2ClientPartyWarning_Entry = void 0; /* eslint-disable */ const minimal_1 = require("protobufjs/minimal"); const Long = require("long"); const engine_gcmessages_1 = require("./engine_gcmessages"); exports.protobufPackage = ""; var ECsgoGCMsg; (function (ECsgoGCMsg) { ECsgoGCMsg[ECsgoGCMsg["k_EMsgGCCStrike15_v2_Base"] = 9100] = "k_EMsgGCCStrike15_v2_Base"; ECsgoGCMsg[ECsgoGCMsg["k_EMsgGCCStrike15_v2_MatchmakingStart"] = 9101] = "k_EMsgGCCStrike15_v2_MatchmakingStart"; ECsgoGCMsg[ECsgoGCMsg["k_EMsgGCCStrike15_v2_MatchmakingStop"] = 9102] = "k_EMsgGCCStrike15_v2_MatchmakingStop"; ECsgoGCMsg[ECsgoGCMsg["k_EMsgGCCStrike15_v2_MatchmakingClient2ServerPing"] = 9103] = "k_EMsgGCCStrike15_v2_MatchmakingClient2ServerPing"; ECsgoGCMsg[ECsgoGCMsg["k_EMsgGCCStrike15_v2_MatchmakingGC2ClientUpdate"] = 9104] = "k_EMsgGCCStrike15_v2_MatchmakingGC2ClientUpdate"; ECsgoGCMsg[ECsgoGCMsg["k_EMsgGCCStrike15_v2_MatchmakingServerReservationResponse"] = 9106] = "k_EMsgGCCStrike15_v2_MatchmakingServerReservationResponse"; ECsgoGCMsg[ECsgoGCMsg["k_EMsgGCCStrike15_v2_MatchmakingGC2ClientReserve"] = 9107] = "k_EMsgGCCStrike15_v2_MatchmakingGC2ClientReserve"; ECsgoGCMsg[ECsgoGCMsg["k_EMsgGCCStrike15_v2_MatchmakingClient2GCHello"] = 9109] = "k_EMsgGCCStrike15_v2_MatchmakingClient2GCHello"; ECsgoGCMsg[ECsgoGCMsg["k_EMsgGCCStrike15_v2_MatchmakingGC2ClientHello"] = 9110] = "k_EMsgGCCStrike15_v2_MatchmakingGC2ClientHello"; ECsgoGCMsg[ECsgoGCMsg["k_EMsgGCCStrike15_v2_MatchmakingGC2ClientAbandon"] = 9112] = "k_EMsgGCCStrike15_v2_MatchmakingGC2ClientAbandon"; ECsgoGCMsg[ECsgoGCMsg["k_EMsgGCCStrike15_v2_MatchmakingGCOperationalStats"] = 9115] = "k_EMsgGCCStrike15_v2_MatchmakingGCOperationalStats"; ECsgoGCMsg[ECsgoGCMsg["k_EMsgGCCStrike15_v2_MatchmakingOperator2GCBlogUpdate"] = 9117] = "k_EMsgGCCStrike15_v2_MatchmakingOperator2GCBlogUpdate"; ECsgoGCMsg[ECsgoGCMsg["k_EMsgGCCStrike15_v2_ServerNotificationForUserPenalty"] = 9118] = "k_EMsgGCCStrike15_v2_ServerNotificationForUserPenalty"; ECsgoGCMsg[ECsgoGCMsg["k_EMsgGCCStrike15_v2_ClientReportPlayer"] = 9119] = "k_EMsgGCCStrike15_v2_ClientReportPlayer"; ECsgoGCMsg[ECsgoGCMsg["k_EMsgGCCStrike15_v2_ClientReportServer"] = 9120] = "k_EMsgGCCStrike15_v2_ClientReportServer"; ECsgoGCMsg[ECsgoGCMsg["k_EMsgGCCStrike15_v2_ClientCommendPlayer"] = 9121] = "k_EMsgGCCStrike15_v2_ClientCommendPlayer"; ECsgoGCMsg[ECsgoGCMsg["k_EMsgGCCStrike15_v2_ClientReportResponse"] = 9122] = "k_EMsgGCCStrike15_v2_ClientReportResponse"; ECsgoGCMsg[ECsgoGCMsg["k_EMsgGCCStrike15_v2_ClientCommendPlayerQuery"] = 9123] = "k_EMsgGCCStrike15_v2_ClientCommendPlayerQuery"; ECsgoGCMsg[ECsgoGCMsg["k_EMsgGCCStrike15_v2_ClientCommendPlayerQueryResponse"] = 9124] = "k_EMsgGCCStrike15_v2_ClientCommendPlayerQueryResponse"; ECsgoGCMsg[ECsgoGCMsg["k_EMsgGCCStrike15_v2_WatchInfoUsers"] = 9126] = "k_EMsgGCCStrike15_v2_WatchInfoUsers"; ECsgoGCMsg[ECsgoGCMsg["k_EMsgGCCStrike15_v2_ClientRequestPlayersProfile"] = 9127] = "k_EMsgGCCStrike15_v2_ClientRequestPlayersProfile"; ECsgoGCMsg[ECsgoGCMsg["k_EMsgGCCStrike15_v2_PlayersProfile"] = 9128] = "k_EMsgGCCStrike15_v2_PlayersProfile"; ECsgoGCMsg[ECsgoGCMsg["k_EMsgGCCStrike15_v2_PlayerOverwatchCaseUpdate"] = 9131] = "k_EMsgGCCStrike15_v2_PlayerOverwatchCaseUpdate"; ECsgoGCMsg[ECsgoGCMsg["k_EMsgGCCStrike15_v2_PlayerOverwatchCaseAssignment"] = 9132] = "k_EMsgGCCStrike15_v2_PlayerOverwatchCaseAssignment"; ECsgoGCMsg[ECsgoGCMsg["k_EMsgGCCStrike15_v2_PlayerOverwatchCaseStatus"] = 9133] = "k_EMsgGCCStrike15_v2_PlayerOverwatchCaseStatus"; ECsgoGCMsg[ECsgoGCMsg["k_EMsgGCCStrike15_v2_GC2ClientTextMsg"] = 9134] = "k_EMsgGCCStrike15_v2_GC2ClientTextMsg"; ECsgoGCMsg[ECsgoGCMsg["k_EMsgGCCStrike15_v2_Client2GCTextMsg"] = 9135] = "k_EMsgGCCStrike15_v2_Client2GCTextMsg"; ECsgoGCMsg[ECsgoGCMsg["k_EMsgGCCStrike15_v2_MatchEndRunRewardDrops"] = 9136] = "k_EMsgGCCStrike15_v2_MatchEndRunRewardDrops"; ECsgoGCMsg[ECsgoGCMsg["k_EMsgGCCStrike15_v2_MatchEndRewardDropsNotification"] = 9137] = "k_EMsgGCCStrike15_v2_MatchEndRewardDropsNotification"; ECsgoGCMsg[ECsgoGCMsg["k_EMsgGCCStrike15_v2_ClientRequestWatchInfoFriends2"] = 9138] = "k_EMsgGCCStrike15_v2_ClientRequestWatchInfoFriends2"; ECsgoGCMsg[ECsgoGCMsg["k_EMsgGCCStrike15_v2_MatchList"] = 9139] = "k_EMsgGCCStrike15_v2_MatchList"; ECsgoGCMsg[ECsgoGCMsg["k_EMsgGCCStrike15_v2_MatchListRequestCurrentLiveGames"] = 9140] = "k_EMsgGCCStrike15_v2_MatchListRequestCurrentLiveGames"; ECsgoGCMsg[ECsgoGCMsg["k_EMsgGCCStrike15_v2_MatchListRequestRecentUserGames"] = 9141] = "k_EMsgGCCStrike15_v2_MatchListRequestRecentUserGames"; ECsgoGCMsg[ECsgoGCMsg["k_EMsgGCCStrike15_v2_GC2ServerReservationUpdate"] = 9142] = "k_EMsgGCCStrike15_v2_GC2ServerReservationUpdate"; ECsgoGCMsg[ECsgoGCMsg["k_EMsgGCCStrike15_v2_ClientVarValueNotificationInfo"] = 9144] = "k_EMsgGCCStrike15_v2_ClientVarValueNotificationInfo"; ECsgoGCMsg[ECsgoGCMsg["k_EMsgGCCStrike15_v2_MatchListRequestTournamentGames"] = 9146] = "k_EMsgGCCStrike15_v2_MatchListRequestTournamentGames"; ECsgoGCMsg[ECsgoGCMsg["k_EMsgGCCStrike15_v2_MatchListRequestFullGameInfo"] = 9147] = "k_EMsgGCCStrike15_v2_MatchListRequestFullGameInfo"; ECsgoGCMsg[ECsgoGCMsg["k_EMsgGCCStrike15_v2_GiftsLeaderboardRequest"] = 9148] = "k_EMsgGCCStrike15_v2_GiftsLeaderboardRequest"; ECsgoGCMsg[ECsgoGCMsg["k_EMsgGCCStrike15_v2_GiftsLeaderboardResponse"] = 9149] = "k_EMsgGCCStrike15_v2_GiftsLeaderboardResponse"; ECsgoGCMsg[ECsgoGCMsg["k_EMsgGCCStrike15_v2_ServerVarValueNotificationInfo"] = 9150] = "k_EMsgGCCStrike15_v2_ServerVarValueNotificationInfo"; ECsgoGCMsg[ECsgoGCMsg["k_EMsgGCCStrike15_v2_ClientSubmitSurveyVote"] = 9152] = "k_EMsgGCCStrike15_v2_ClientSubmitSurveyVote"; ECsgoGCMsg[ECsgoGCMsg["k_EMsgGCCStrike15_v2_Server2GCClientValidate"] = 9153] = "k_EMsgGCCStrike15_v2_Server2GCClientValidate"; ECsgoGCMsg[ECsgoGCMsg["k_EMsgGCCStrike15_v2_MatchListRequestLiveGameForUser"] = 9154] = "k_EMsgGCCStrike15_v2_MatchListRequestLiveGameForUser"; ECsgoGCMsg[ECsgoGCMsg["k_EMsgGCCStrike15_v2_Client2GCEconPreviewDataBlockRequest"] = 9156] = "k_EMsgGCCStrike15_v2_Client2GCEconPreviewDataBlockRequest"; ECsgoGCMsg[ECsgoGCMsg["k_EMsgGCCStrike15_v2_Client2GCEconPreviewDataBlockResponse"] = 9157] = "k_EMsgGCCStrike15_v2_Client2GCEconPreviewDataBlockResponse"; ECsgoGCMsg[ECsgoGCMsg["k_EMsgGCCStrike15_v2_AccountPrivacySettings"] = 9158] = "k_EMsgGCCStrike15_v2_AccountPrivacySettings"; ECsgoGCMsg[ECsgoGCMsg["k_EMsgGCCStrike15_v2_SetMyActivityInfo"] = 9159] = "k_EMsgGCCStrike15_v2_SetMyActivityInfo"; ECsgoGCMsg[ECsgoGCMsg["k_EMsgGCCStrike15_v2_MatchListRequestTournamentPredictions"] = 9160] = "k_EMsgGCCStrike15_v2_MatchListRequestTournamentPredictions"; ECsgoGCMsg[ECsgoGCMsg["k_EMsgGCCStrike15_v2_MatchListUploadTournamentPredictions"] = 9161] = "k_EMsgGCCStrike15_v2_MatchListUploadTournamentPredictions"; ECsgoGCMsg[ECsgoGCMsg["k_EMsgGCCStrike15_v2_DraftSummary"] = 9162] = "k_EMsgGCCStrike15_v2_DraftSummary"; ECsgoGCMsg[ECsgoGCMsg["k_EMsgGCCStrike15_v2_ClientRequestJoinFriendData"] = 9163] = "k_EMsgGCCStrike15_v2_ClientRequestJoinFriendData"; ECsgoGCMsg[ECsgoGCMsg["k_EMsgGCCStrike15_v2_ClientRequestJoinServerData"] = 9164] = "k_EMsgGCCStrike15_v2_ClientRequestJoinServerData"; ECsgoGCMsg[ECsgoGCMsg["k_EMsgGCCStrike15_v2_ClientRequestNewMission"] = 9165] = "k_EMsgGCCStrike15_v2_ClientRequestNewMission"; ECsgoGCMsg[ECsgoGCMsg["k_EMsgGCCStrike15_v2_GC2ClientTournamentInfo"] = 9167] = "k_EMsgGCCStrike15_v2_GC2ClientTournamentInfo"; ECsgoGCMsg[ECsgoGCMsg["k_EMsgGC_GlobalGame_Subscribe"] = 9168] = "k_EMsgGC_GlobalGame_Subscribe"; ECsgoGCMsg[ECsgoGCMsg["k_EMsgGC_GlobalGame_Unsubscribe"] = 9169] = "k_EMsgGC_GlobalGame_Unsubscribe"; ECsgoGCMsg[ECsgoGCMsg["k_EMsgGC_GlobalGame_Play"] = 9170] = "k_EMsgGC_GlobalGame_Play"; ECsgoGCMsg[ECsgoGCMsg["k_EMsgGCCStrike15_v2_AcknowledgePenalty"] = 9171] = "k_EMsgGCCStrike15_v2_AcknowledgePenalty"; ECsgoGCMsg[ECsgoGCMsg["k_EMsgGCCStrike15_v2_Client2GCRequestPrestigeCoin"] = 9172] = "k_EMsgGCCStrike15_v2_Client2GCRequestPrestigeCoin"; ECsgoGCMsg[ECsgoGCMsg["k_EMsgGCCStrike15_v2_GC2ClientGlobalStats"] = 9173] = "k_EMsgGCCStrike15_v2_GC2ClientGlobalStats"; ECsgoGCMsg[ECsgoGCMsg["k_EMsgGCCStrike15_v2_Client2GCStreamUnlock"] = 9174] = "k_EMsgGCCStrike15_v2_Client2GCStreamUnlock"; ECsgoGCMsg[ECsgoGCMsg["k_EMsgGCCStrike15_v2_FantasyRequestClientData"] = 9175] = "k_EMsgGCCStrike15_v2_FantasyRequestClientData"; ECsgoGCMsg[ECsgoGCMsg["k_EMsgGCCStrike15_v2_FantasyUpdateClientData"] = 9176] = "k_EMsgGCCStrike15_v2_FantasyUpdateClientData"; ECsgoGCMsg[ECsgoGCMsg["k_EMsgGCCStrike15_v2_GCToClientSteamdatagramTicket"] = 9177] = "k_EMsgGCCStrike15_v2_GCToClientSteamdatagramTicket"; ECsgoGCMsg[ECsgoGCMsg["k_EMsgGCCStrike15_v2_ClientToGCRequestTicket"] = 9178] = "k_EMsgGCCStrike15_v2_ClientToGCRequestTicket"; ECsgoGCMsg[ECsgoGCMsg["k_EMsgGCCStrike15_v2_ClientToGCRequestElevate"] = 9179] = "k_EMsgGCCStrike15_v2_ClientToGCRequestElevate"; ECsgoGCMsg[ECsgoGCMsg["k_EMsgGCCStrike15_v2_GlobalChat"] = 9180] = "k_EMsgGCCStrike15_v2_GlobalChat"; ECsgoGCMsg[ECsgoGCMsg["k_EMsgGCCStrike15_v2_GlobalChat_Subscribe"] = 9181] = "k_EMsgGCCStrike15_v2_GlobalChat_Subscribe"; ECsgoGCMsg[ECsgoGCMsg["k_EMsgGCCStrike15_v2_GlobalChat_Unsubscribe"] = 9182] = "k_EMsgGCCStrike15_v2_GlobalChat_Unsubscribe"; ECsgoGCMsg[ECsgoGCMsg["k_EMsgGCCStrike15_v2_ClientAuthKeyCode"] = 9183] = "k_EMsgGCCStrike15_v2_ClientAuthKeyCode"; ECsgoGCMsg[ECsgoGCMsg["k_EMsgGCCStrike15_v2_GotvSyncPacket"] = 9184] = "k_EMsgGCCStrike15_v2_GotvSyncPacket"; ECsgoGCMsg[ECsgoGCMsg["k_EMsgGCCStrike15_v2_ClientPlayerDecalSign"] = 9185] = "k_EMsgGCCStrike15_v2_ClientPlayerDecalSign"; ECsgoGCMsg[ECsgoGCMsg["k_EMsgGCCStrike15_v2_ClientLogonFatalError"] = 9187] = "k_EMsgGCCStrike15_v2_ClientLogonFatalError"; ECsgoGCMsg[ECsgoGCMsg["k_EMsgGCCStrike15_v2_ClientPollState"] = 9188] = "k_EMsgGCCStrike15_v2_ClientPollState"; ECsgoGCMsg[ECsgoGCMsg["k_EMsgGCCStrike15_v2_Party_Register"] = 9189] = "k_EMsgGCCStrike15_v2_Party_Register"; ECsgoGCMsg[ECsgoGCMsg["k_EMsgGCCStrike15_v2_Party_Unregister"] = 9190] = "k_EMsgGCCStrike15_v2_Party_Unregister"; ECsgoGCMsg[ECsgoGCMsg["k_EMsgGCCStrike15_v2_Party_Search"] = 9191] = "k_EMsgGCCStrike15_v2_Party_Search"; ECsgoGCMsg[ECsgoGCMsg["k_EMsgGCCStrike15_v2_Party_Invite"] = 9192] = "k_EMsgGCCStrike15_v2_Party_Invite"; ECsgoGCMsg[ECsgoGCMsg["k_EMsgGCCStrike15_v2_Account_RequestCoPlays"] = 9193] = "k_EMsgGCCStrike15_v2_Account_RequestCoPlays"; ECsgoGCMsg[ECsgoGCMsg["k_EMsgGCCStrike15_v2_ClientGCRankUpdate"] = 9194] = "k_EMsgGCCStrike15_v2_ClientGCRankUpdate"; ECsgoGCMsg[ECsgoGCMsg["k_EMsgGCCStrike15_v2_ClientRequestOffers"] = 9195] = "k_EMsgGCCStrike15_v2_ClientRequestOffers"; ECsgoGCMsg[ECsgoGCMsg["k_EMsgGCCStrike15_v2_ClientAccountBalance"] = 9196] = "k_EMsgGCCStrike15_v2_ClientAccountBalance"; ECsgoGCMsg[ECsgoGCMsg["k_EMsgGCCStrike15_v2_ClientPartyJoinRelay"] = 9197] = "k_EMsgGCCStrike15_v2_ClientPartyJoinRelay"; ECsgoGCMsg[ECsgoGCMsg["k_EMsgGCCStrike15_v2_ClientPartyWarning"] = 9198] = "k_EMsgGCCStrike15_v2_ClientPartyWarning"; ECsgoGCMsg[ECsgoGCMsg["k_EMsgGCCStrike15_v2_SetEventFavorite"] = 9200] = "k_EMsgGCCStrike15_v2_SetEventFavorite"; ECsgoGCMsg[ECsgoGCMsg["k_EMsgGCCStrike15_v2_GetEventFavorites_Request"] = 9201] = "k_EMsgGCCStrike15_v2_GetEventFavorites_Request"; ECsgoGCMsg[ECsgoGCMsg["k_EMsgGCCStrike15_v2_ClientPerfReport"] = 9202] = "k_EMsgGCCStrike15_v2_ClientPerfReport"; ECsgoGCMsg[ECsgoGCMsg["k_EMsgGCCStrike15_v2_GetEventFavorites_Response"] = 9203] = "k_EMsgGCCStrike15_v2_GetEventFavorites_Response"; ECsgoGCMsg[ECsgoGCMsg["k_EMsgGCCStrike15_v2_ClientRequestSouvenir"] = 9204] = "k_EMsgGCCStrike15_v2_ClientRequestSouvenir"; ECsgoGCMsg[ECsgoGCMsg["k_EMsgGCCStrike15_v2_ClientReportValidation"] = 9205] = "k_EMsgGCCStrike15_v2_ClientReportValidation"; ECsgoGCMsg[ECsgoGCMsg["k_EMsgGCCStrike15_v2_GC2ClientRefuseSecureMode"] = 9206] = "k_EMsgGCCStrike15_v2_GC2ClientRefuseSecureMode"; ECsgoGCMsg[ECsgoGCMsg["k_EMsgGCCStrike15_v2_GC2ClientRequestValidation"] = 9207] = "k_EMsgGCCStrike15_v2_GC2ClientRequestValidation"; ECsgoGCMsg[ECsgoGCMsg["k_EMsgGCCStrike15_v2_ClientRedeemMissionReward"] = 9209] = "k_EMsgGCCStrike15_v2_ClientRedeemMissionReward"; ECsgoGCMsg[ECsgoGCMsg["k_EMsgGCCStrike15_ClientDeepStats"] = 9210] = "k_EMsgGCCStrike15_ClientDeepStats"; ECsgoGCMsg[ECsgoGCMsg["k_EMsgGCCStrike15_StartAgreementSessionInGame"] = 9211] = "k_EMsgGCCStrike15_StartAgreementSessionInGame"; ECsgoGCMsg[ECsgoGCMsg["k_EMsgGCCStrike15_v2_GC2ClientInitSystem"] = 9212] = "k_EMsgGCCStrike15_v2_GC2ClientInitSystem"; ECsgoGCMsg[ECsgoGCMsg["k_EMsgGCCStrike15_v2_GC2ClientInitSystem_Response"] = 9213] = "k_EMsgGCCStrike15_v2_GC2ClientInitSystem_Response"; ECsgoGCMsg[ECsgoGCMsg["k_EMsgGCCStrike15_v2_PrivateQueues"] = 9214] = "k_EMsgGCCStrike15_v2_PrivateQueues"; ECsgoGCMsg[ECsgoGCMsg["k_EMsgGCCStrike15_v2_MatchListTournamentOperatorMgmt"] = 9215] = "k_EMsgGCCStrike15_v2_MatchListTournamentOperatorMgmt"; })(ECsgoGCMsg = exports.ECsgoGCMsg || (exports.ECsgoGCMsg = {})); var ECsgoSteamUserStat; (function (ECsgoSteamUserStat) { ECsgoSteamUserStat[ECsgoSteamUserStat["k_ECsgoSteamUserStat_XpEarnedGames"] = 1] = "k_ECsgoSteamUserStat_XpEarnedGames"; ECsgoSteamUserStat[ECsgoSteamUserStat["k_ECsgoSteamUserStat_MatchWinsCompetitive"] = 2] = "k_ECsgoSteamUserStat_MatchWinsCompetitive"; ECsgoSteamUserStat[ECsgoSteamUserStat["k_ECsgoSteamUserStat_SurvivedDangerZone"] = 3] = "k_ECsgoSteamUserStat_SurvivedDangerZone"; })(ECsgoSteamUserStat = exports.ECsgoSteamUserStat || (exports.ECsgoSteamUserStat = {})); var EClientReportingVersion; (function (EClientReportingVersion) { EClientReportingVersion[EClientReportingVersion["k_EClientReportingVersion_OldVersion"] = 0] = "k_EClientReportingVersion_OldVersion"; EClientReportingVersion[EClientReportingVersion["k_EClientReportingVersion_BetaVersion"] = 1] = "k_EClientReportingVersion_BetaVersion"; EClientReportingVersion[EClientReportingVersion["k_EClientReportingVersion_SupportsTrustedMode"] = 2] = "k_EClientReportingVersion_SupportsTrustedMode"; })(EClientReportingVersion = exports.EClientReportingVersion || (exports.EClientReportingVersion = {})); var EInitSystemResult; (function (EInitSystemResult) { EInitSystemResult[EInitSystemResult["k_EInitSystemResult_Invalid"] = 0] = "k_EInitSystemResult_Invalid"; EInitSystemResult[EInitSystemResult["k_EInitSystemResult_Success"] = 1] = "k_EInitSystemResult_Success"; EInitSystemResult[EInitSystemResult["k_EInitSystemResult_None"] = 2] = "k_EInitSystemResult_None"; EInitSystemResult[EInitSystemResult["k_EInitSystemResult_NotFound"] = 3] = "k_EInitSystemResult_NotFound"; EInitSystemResult[EInitSystemResult["k_EInitSystemResult_Existing"] = 4] = "k_EInitSystemResult_Existing"; EInitSystemResult[EInitSystemResult["k_EInitSystemResult_FailedOpen"] = 5] = "k_EInitSystemResult_FailedOpen"; EInitSystemResult[EInitSystemResult["k_EInitSystemResult_Mismatch"] = 6] = "k_EInitSystemResult_Mismatch"; EInitSystemResult[EInitSystemResult["k_EInitSystemResult_FailedInit"] = 7] = "k_EInitSystemResult_FailedInit"; EInitSystemResult[EInitSystemResult["k_EInitSystemResult_Max"] = 8] = "k_EInitSystemResult_Max"; })(EInitSystemResult = exports.EInitSystemResult || (exports.EInitSystemResult = {})); function createBaseGameServerPing() { return { ping: 0, ip: 0, instances: 0 }; } exports.GameServerPing = { encode(message, writer = minimal_1.Writer.create()) { if (message.ping !== 0) { writer.uint32(16).int32(message.ping); } if (message.ip !== 0) { writer.uint32(24).uint32(message.ip); } if (message.instances !== 0) { writer.uint32(40).uint32(message.instances); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseGameServerPing(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 2: message.ping = reader.int32(); break; case 3: message.ip = reader.uint32(); break; case 5: message.instances = reader.uint32(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c; const message = createBaseGameServerPing(); message.ping = (_a = object.ping) !== null && _a !== void 0 ? _a : 0; message.ip = (_b = object.ip) !== null && _b !== void 0 ? _b : 0; message.instances = (_c = object.instances) !== null && _c !== void 0 ? _c : 0; return message; } }; function createBaseDataCenterPing() { return { dataCenterId: 0, ping: 0 }; } exports.DataCenterPing = { encode(message, writer = minimal_1.Writer.create()) { if (message.dataCenterId !== 0) { writer.uint32(13).fixed32(message.dataCenterId); } if (message.ping !== 0) { writer.uint32(16).sint32(message.ping); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseDataCenterPing(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.dataCenterId = reader.fixed32(); break; case 2: message.ping = reader.sint32(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b; const message = createBaseDataCenterPing(); message.dataCenterId = (_a = object.dataCenterId) !== null && _a !== void 0 ? _a : 0; message.ping = (_b = object.ping) !== null && _b !== void 0 ? _b : 0; return message; } }; function createBaseDetailedSearchStatistic() { return { gameType: 0, searchTimeAvg: 0, playersSearching: 0 }; } exports.DetailedSearchStatistic = { encode(message, writer = minimal_1.Writer.create()) { if (message.gameType !== 0) { writer.uint32(8).uint32(message.gameType); } if (message.searchTimeAvg !== 0) { writer.uint32(16).uint32(message.searchTimeAvg); } if (message.playersSearching !== 0) { writer.uint32(32).uint32(message.playersSearching); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseDetailedSearchStatistic(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.gameType = reader.uint32(); break; case 2: message.searchTimeAvg = reader.uint32(); break; case 4: message.playersSearching = reader.uint32(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c; const message = createBaseDetailedSearchStatistic(); message.gameType = (_a = object.gameType) !== null && _a !== void 0 ? _a : 0; message.searchTimeAvg = (_b = object.searchTimeAvg) !== null && _b !== void 0 ? _b : 0; message.playersSearching = (_c = object.playersSearching) !== null && _c !== void 0 ? _c : 0; return message; } }; function createBaseTournamentPlayer() { return { accountId: 0, playerNick: "", playerName: "", playerDob: 0, playerFlag: "", playerLocation: "", playerDesc: "" }; } exports.TournamentPlayer = { encode(message, writer = minimal_1.Writer.create()) { if (message.accountId !== 0) { writer.uint32(8).uint32(message.accountId); } if (message.playerNick !== "") { writer.uint32(18).string(message.playerNick); } if (message.playerName !== "") { writer.uint32(26).string(message.playerName); } if (message.playerDob !== 0) { writer.uint32(32).uint32(message.playerDob); } if (message.playerFlag !== "") { writer.uint32(42).string(message.playerFlag); } if (message.playerLocation !== "") { writer.uint32(50).string(message.playerLocation); } if (message.playerDesc !== "") { writer.uint32(58).string(message.playerDesc); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseTournamentPlayer(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.accountId = reader.uint32(); break; case 2: message.playerNick = reader.string(); break; case 3: message.playerName = reader.string(); break; case 4: message.playerDob = reader.uint32(); break; case 5: message.playerFlag = reader.string(); break; case 6: message.playerLocation = reader.string(); break; case 7: message.playerDesc = reader.string(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c, _d, _e, _f, _g; const message = createBaseTournamentPlayer(); message.accountId = (_a = object.accountId) !== null && _a !== void 0 ? _a : 0; message.playerNick = (_b = object.playerNick) !== null && _b !== void 0 ? _b : ""; message.playerName = (_c = object.playerName) !== null && _c !== void 0 ? _c : ""; message.playerDob = (_d = object.playerDob) !== null && _d !== void 0 ? _d : 0; message.playerFlag = (_e = object.playerFlag) !== null && _e !== void 0 ? _e : ""; message.playerLocation = (_f = object.playerLocation) !== null && _f !== void 0 ? _f : ""; message.playerDesc = (_g = object.playerDesc) !== null && _g !== void 0 ? _g : ""; return message; } }; function createBaseTournamentTeam() { return { teamId: 0, teamTag: "", teamFlag: "", teamName: "", players: [] }; } exports.TournamentTeam = { encode(message, writer = minimal_1.Writer.create()) { if (message.teamId !== 0) { writer.uint32(8).int32(message.teamId); } if (message.teamTag !== "") { writer.uint32(18).string(message.teamTag); } if (message.teamFlag !== "") { writer.uint32(26).string(message.teamFlag); } if (message.teamName !== "") { writer.uint32(34).string(message.teamName); } for (const v of message.players) { exports.TournamentPlayer.encode(v, writer.uint32(42).fork()).ldelim(); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseTournamentTeam(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.teamId = reader.int32(); break; case 2: message.teamTag = reader.string(); break; case 3: message.teamFlag = reader.string(); break; case 4: message.teamName = reader.string(); break; case 5: message.players.push(exports.TournamentPlayer.decode(reader, reader.uint32())); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c, _d, _e; const message = createBaseTournamentTeam(); message.teamId = (_a = object.teamId) !== null && _a !== void 0 ? _a : 0; message.teamTag = (_b = object.teamTag) !== null && _b !== void 0 ? _b : ""; message.teamFlag = (_c = object.teamFlag) !== null && _c !== void 0 ? _c : ""; message.teamName = (_d = object.teamName) !== null && _d !== void 0 ? _d : ""; message.players = ((_e = object.players) === null || _e === void 0 ? void 0 : _e.map(e => exports.TournamentPlayer.fromPartial(e))) || []; return message; } }; function createBaseTournamentEvent() { return { eventId: 0, eventTag: "", eventName: "", eventTimeStart: 0, eventTimeEnd: 0, eventPublic: 0, eventStageId: 0, eventStageName: "", activeSectionId: 0 }; } exports.TournamentEvent = { encode(message, writer = minimal_1.Writer.create()) { if (message.eventId !== 0) { writer.uint32(8).int32(message.eventId); } if (message.eventTag !== "") { writer.uint32(18).string(message.eventTag); } if (message.eventName !== "") { writer.uint32(26).string(message.eventName); } if (message.eventTimeStart !== 0) { writer.uint32(32).uint32(message.eventTimeStart); } if (message.eventTimeEnd !== 0) { writer.uint32(40).uint32(message.eventTimeEnd); } if (message.eventPublic !== 0) { writer.uint32(48).int32(message.eventPublic); } if (message.eventStageId !== 0) { writer.uint32(56).int32(message.eventStageId); } if (message.eventStageName !== "") { writer.uint32(66).string(message.eventStageName); } if (message.activeSectionId !== 0) { writer.uint32(72).uint32(message.activeSectionId); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseTournamentEvent(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.eventId = reader.int32(); break; case 2: message.eventTag = reader.string(); break; case 3: message.eventName = reader.string(); break; case 4: message.eventTimeStart = reader.uint32(); break; case 5: message.eventTimeEnd = reader.uint32(); break; case 6: message.eventPublic = reader.int32(); break; case 7: message.eventStageId = reader.int32(); break; case 8: message.eventStageName = reader.string(); break; case 9: message.activeSectionId = reader.uint32(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c, _d, _e, _f, _g, _h, _j; const message = createBaseTournamentEvent(); message.eventId = (_a = object.eventId) !== null && _a !== void 0 ? _a : 0; message.eventTag = (_b = object.eventTag) !== null && _b !== void 0 ? _b : ""; message.eventName = (_c = object.eventName) !== null && _c !== void 0 ? _c : ""; message.eventTimeStart = (_d = object.eventTimeStart) !== null && _d !== void 0 ? _d : 0; message.eventTimeEnd = (_e = object.eventTimeEnd) !== null && _e !== void 0 ? _e : 0; message.eventPublic = (_f = object.eventPublic) !== null && _f !== void 0 ? _f : 0; message.eventStageId = (_g = object.eventStageId) !== null && _g !== void 0 ? _g : 0; message.eventStageName = (_h = object.eventStageName) !== null && _h !== void 0 ? _h : ""; message.activeSectionId = (_j = object.activeSectionId) !== null && _j !== void 0 ? _j : 0; return message; } }; function createBaseGlobalStatistics() { return { playersOnline: 0, serversOnline: 0, playersSearching: 0, serversAvailable: 0, ongoingMatches: 0, searchTimeAvg: 0, searchStatistics: [], mainPostUrl: "", requiredAppidVersion: 0, pricesheetVersion: 0, twitchStreamsVersion: 0, activeTournamentEventid: 0, activeSurveyId: 0, rtime32Cur: 0, rtime32EventStart: 0 }; } exports.GlobalStatistics = { encode(message, writer = minimal_1.Writer.create()) { if (message.playersOnline !== 0) { writer.uint32(8).uint32(message.playersOnline); } if (message.serversOnline !== 0) { writer.uint32(16).uint32(message.serversOnline); } if (message.playersSearching !== 0) { writer.uint32(24).uint32(message.playersSearching); } if (message.serversAvailable !== 0) { writer.uint32(32).uint32(message.serversAvailable); } if (message.ongoingMatches !== 0) { writer.uint32(40).uint32(message.ongoingMatches); } if (message.searchTimeAvg !== 0) { writer.uint32(48).uint32(message.searchTimeAvg); } for (const v of message.searchStatistics) { exports.DetailedSearchStatistic.encode(v, writer.uint32(58).fork()).ldelim(); } if (message.mainPostUrl !== "") { writer.uint32(66).string(message.mainPostUrl); } if (message.requiredAppidVersion !== 0) { writer.uint32(72).uint32(message.requiredAppidVersion); } if (message.pricesheetVersion !== 0) { writer.uint32(80).uint32(message.pricesheetVersion); } if (message.twitchStreamsVersion !== 0) { writer.uint32(88).uint32(message.twitchStreamsVersion); } if (message.activeTournamentEventid !== 0) { writer.uint32(96).uint32(message.activeTournamentEventid); } if (message.activeSurveyId !== 0) { writer.uint32(104).uint32(message.activeSurveyId); } if (message.rtime32Cur !== 0) { writer.uint32(112).uint32(message.rtime32Cur); } if (message.rtime32EventStart !== 0) { writer.uint32(120).uint32(message.rtime32EventStart); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseGlobalStatistics(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.playersOnline = reader.uint32(); break; case 2: message.serversOnline = reader.uint32(); break; case 3: message.playersSearching = reader.uint32(); break; case 4: message.serversAvailable = reader.uint32(); break; case 5: message.ongoingMatches = reader.uint32(); break; case 6: message.searchTimeAvg = reader.uint32(); break; case 7: message.searchStatistics.push(exports.DetailedSearchStatistic.decode(reader, reader.uint32())); break; case 8: message.mainPostUrl = reader.string(); break; case 9: message.requiredAppidVersion = reader.uint32(); break; case 10: message.pricesheetVersion = reader.uint32(); break; case 11: message.twitchStreamsVersion = reader.uint32(); break; case 12: message.activeTournamentEventid = reader.uint32(); break; case 13: message.activeSurveyId = reader.uint32(); break; case 14: message.rtime32Cur = reader.uint32(); break; case 15: message.rtime32EventStart = reader.uint32(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q; const message = createBaseGlobalStatistics(); message.playersOnline = (_a = object.playersOnline) !== null && _a !== void 0 ? _a : 0; message.serversOnline = (_b = object.serversOnline) !== null && _b !== void 0 ? _b : 0; message.playersSearching = (_c = object.playersSearching) !== null && _c !== void 0 ? _c : 0; message.serversAvailable = (_d = object.serversAvailable) !== null && _d !== void 0 ? _d : 0; message.ongoingMatches = (_e = object.ongoingMatches) !== null && _e !== void 0 ? _e : 0; message.searchTimeAvg = (_f = object.searchTimeAvg) !== null && _f !== void 0 ? _f : 0; message.searchStatistics = ((_g = object.searchStatistics) === null || _g === void 0 ? void 0 : _g.map(e => exports.DetailedSearchStatistic.fromPartial(e))) || []; message.mainPostUrl = (_h = object.mainPostUrl) !== null && _h !== void 0 ? _h : ""; message.requiredAppidVersion = (_j = object.requiredAppidVersion) !== null && _j !== void 0 ? _j : 0; message.pricesheetVersion = (_k = object.pricesheetVersion) !== null && _k !== void 0 ? _k : 0; message.twitchStreamsVersion = (_l = object.twitchStreamsVersion) !== null && _l !== void 0 ? _l : 0; message.activeTournamentEventid = (_m = object.activeTournamentEventid) !== null && _m !== void 0 ? _m : 0; message.activeSurveyId = (_o = object.activeSurveyId) !== null && _o !== void 0 ? _o : 0; message.rtime32Cur = (_p = object.rtime32Cur) !== null && _p !== void 0 ? _p : 0; message.rtime32EventStart = (_q = object.rtime32EventStart) !== null && _q !== void 0 ? _q : 0; return message; } }; function createBaseOperationalStatisticDescription() { return { name: "", idkey: 0 }; } exports.OperationalStatisticDescription = { encode(message, writer = minimal_1.Writer.create()) { if (message.name !== "") { writer.uint32(10).string(message.name); } if (message.idkey !== 0) { writer.uint32(16).uint32(message.idkey); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseOperationalStatisticDescription(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.name = reader.string(); break; case 2: message.idkey = reader.uint32(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b; const message = createBaseOperationalStatisticDescription(); message.name = (_a = object.name) !== null && _a !== void 0 ? _a : ""; message.idkey = (_b = object.idkey) !== null && _b !== void 0 ? _b : 0; return message; } }; function createBaseOperationalStatisticElement() { return { idkey: 0, values: [] }; } exports.OperationalStatisticElement = { encode(message, writer = minimal_1.Writer.create()) { if (message.idkey !== 0) { writer.uint32(8).uint32(message.idkey); } writer.uint32(18).fork(); for (const v of message.values) { writer.int32(v); } writer.ldelim(); return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseOperationalStatisticElement(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.idkey = reader.uint32(); break; case 2: if ((tag & 7) === 2) { const end2 = reader.uint32() + reader.pos; while (reader.pos < end2) { message.values.push(reader.int32()); } } else { message.values.push(reader.int32()); } break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b; const message = createBaseOperationalStatisticElement(); message.idkey = (_a = object.idkey) !== null && _a !== void 0 ? _a : 0; message.values = ((_b = object.values) === null || _b === void 0 ? void 0 : _b.map(e => e)) || []; return message; } }; function createBaseOperationalStatisticsPacket() { return { packetid: 0, mstimestamp: 0, values: [] }; } exports.OperationalStatisticsPacket = { encode(message, writer = minimal_1.Writer.create()) { if (message.packetid !== 0) { writer.uint32(8).int32(message.packetid); } if (message.mstimestamp !== 0) { writer.uint32(16).int32(message.mstimestamp); } for (const v of message.values) { exports.OperationalStatisticElement.encode(v, writer.uint32(26).fork()).ldelim(); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseOperationalStatisticsPacket(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.packetid = reader.int32(); break; case 2: message.mstimestamp = reader.int32(); break; case 3: message.values.push(exports.OperationalStatisticElement.decode(reader, reader.uint32())); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c; const message = createBaseOperationalStatisticsPacket(); message.packetid = (_a = object.packetid) !== null && _a !== void 0 ? _a : 0; message.mstimestamp = (_b = object.mstimestamp) !== null && _b !== void 0 ? _b : 0; message.values = ((_c = object.values) === null || _c === void 0 ? void 0 : _c.map(e => exports.OperationalStatisticElement.fromPartial(e))) || []; return message; } }; function createBasePlayerRankingInfo() { return { accountId: 0, rankId: 0, wins: 0, rankChange: 0, rankTypeId: 0, tvControl: 0 }; } exports.PlayerRankingInfo = { encode(message, writer = minimal_1.Writer.create()) { if (message.accountId !== 0) { writer.uint32(8).uint32(message.accountId); } if (message.rankId !== 0) { writer.uint32(16).uint32(message.rankId); } if (message.wins !== 0) { writer.uint32(24).uint32(message.wins); } if (message.rankChange !== 0) { writer.uint32(37).float(message.rankChange); } if (message.rankTypeId !== 0) { writer.uint32(48).uint32(message.rankTypeId); } if (message.tvControl !== 0) { writer.uint32(56).uint32(message.tvControl); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBasePlayerRankingInfo(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.accountId = reader.uint32(); break; case 2: message.rankId = reader.uint32(); break; case 3: message.wins = reader.uint32(); break; case 4: message.rankChange = reader.float(); break; case 6: message.rankTypeId = reader.uint32(); break; case 7: message.tvControl = reader.uint32(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c, _d, _e, _f; const message = createBasePlayerRankingInfo(); message.accountId = (_a = object.accountId) !== null && _a !== void 0 ? _a : 0; message.rankId = (_b = object.rankId) !== null && _b !== void 0 ? _b : 0; message.wins = (_c = object.wins) !== null && _c !== void 0 ? _c : 0; message.rankChange = (_d = object.rankChange) !== null && _d !== void 0 ? _d : 0; message.rankTypeId = (_e = object.rankTypeId) !== null && _e !== void 0 ? _e : 0; message.tvControl = (_f = object.tvControl) !== null && _f !== void 0 ? _f : 0; return message; } }; function createBasePlayerCommendationInfo() { return { cmdFriendly: 0, cmdTeaching: 0, cmdLeader: 0 }; } exports.PlayerCommendationInfo = { encode(message, writer = minimal_1.Writer.create()) { if (message.cmdFriendly !== 0) { writer.uint32(8).uint32(message.cmdFriendly); } if (message.cmdTeaching !== 0) { writer.uint32(16).uint32(message.cmdTeaching); } if (message.cmdLeader !== 0) { writer.uint32(32).uint32(message.cmdLeader); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBasePlayerCommendationInfo(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.cmdFriendly = reader.uint32(); break; case 2: message.cmdTeaching = reader.uint32(); break; case 4: message.cmdLeader = reader.uint32(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c; const message = createBasePlayerCommendationInfo(); message.cmdFriendly = (_a = object.cmdFriendly) !== null && _a !== void 0 ? _a : 0; message.cmdTeaching = (_b = object.cmdTeaching) !== null && _b !== void 0 ? _b : 0; message.cmdLeader = (_c = object.cmdLeader) !== null && _c !== void 0 ? _c : 0; return message; } }; function createBasePlayerMedalsInfo() { return { displayItemsDefidx: [], featuredDisplayItemDefidx: 0 }; } exports.PlayerMedalsInfo = { encode(message, writer = minimal_1.Writer.create()) { writer.uint32(58).fork(); for (const v of message.displayItemsDefidx) { writer.uint32(v); } writer.ldelim(); if (message.featuredDisplayItemDefidx !== 0) { writer.uint32(64).uint32(message.featuredDisplayItemDefidx); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBasePlayerMedalsInfo(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 7: if ((tag & 7) === 2) { const end2 = reader.uint32() + reader.pos; while (reader.pos < end2) { message.displayItemsDefidx.push(reader.uint32()); } } else { message.displayItemsDefidx.push(reader.uint32()); } break; case 8: message.featuredDisplayItemDefidx = reader.uint32(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b; const message = createBasePlayerMedalsInfo(); message.displayItemsDefidx = ((_a = object.displayItemsDefidx) === null || _a === void 0 ? void 0 : _a.map(e => e)) || []; message.featuredDisplayItemDefidx = (_b = object.featuredDisplayItemDefidx) !== null && _b !== void 0 ? _b : 0; return message; } }; function createBaseAccountActivity() { return { activity: 0, mode: 0, map: 0, matchid: Long.UZERO }; } exports.AccountActivity = { encode(message, writer = minimal_1.Writer.create()) { if (message.activity !== 0) { writer.uint32(8).uint32(message.activity); } if (message.mode !== 0) { writer.uint32(16).uint32(message.mode); } if (message.map !== 0) { writer.uint32(24).uint32(message.map); } if (!message.matchid.isZero()) { writer.uint32(32).uint64(message.matchid); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseAccountActivity(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.activity = reader.uint32(); break; case 2: message.mode = reader.uint32(); break; case 3: message.map = reader.uint32(); break; case 4: message.matchid = reader.uint64(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c; const message = createBaseAccountActivity(); message.activity = (_a = object.activity) !== null && _a !== void 0 ? _a : 0; message.mode = (_b = object.mode) !== null && _b !== void 0 ? _b : 0; message.map = (_c = object.map) !== null && _c !== void 0 ? _c : 0; message.matchid = object.matchid !== undefined && object.matchid !== null ? Long.fromValue(object.matchid) : Long.UZERO; return message; } }; function createBaseTournamentMatchSetup() { return { eventId: 0, teamIdCt: 0, teamIdT: 0, eventStageId: 0 }; } exports.TournamentMatchSetup = { encode(message, writer = minimal_1.Writer.create()) { if (message.eventId !== 0) { writer.uint32(8).int32(message.eventId); } if (message.teamIdCt !== 0) { writer.uint32(16).int32(message.teamIdCt); } if (message.teamIdT !== 0) { writer.uint32(24).int32(message.teamIdT); } if (message.eventStageId !== 0) { writer.uint32(32).int32(message.eventStageId); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseTournamentMatchSetup(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.eventId = reader.int32(); break; case 2: message.teamIdCt = reader.int32(); break; case 3: message.teamIdT = reader.int32(); break; case 4: message.eventStageId = reader.int32(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c, _d; const message = createBaseTournamentMatchSetup(); message.eventId = (_a = object.eventId) !== null && _a !== void 0 ? _a : 0; message.teamIdCt = (_b = object.teamIdCt) !== null && _b !== void 0 ? _b : 0; message.teamIdT = (_c = object.teamIdT) !== null && _c !== void 0 ? _c : 0; message.eventStageId = (_d = object.eventStageId) !== null && _d !== void 0 ? _d : 0; return message; } }; function createBaseServerHltvInfo() { return { tvUdpPort: 0, tvWatchKey: Long.UZERO, tvSlots: 0, tvClients: 0, tvProxies: 0, tvTime: 0, gameType: 0, gameMapgroup: "", gameMap: "", tvMasterSteamid: Long.UZERO, tvLocalSlots: 0, tvLocalClients: 0, tvLocalProxies: 0, tvRelaySlots: 0, tvRelayClients: 0, tvRelayProxies: 0, tvRelayAddress: 0, tvRelayPort: 0, tvRelaySteamid: Long.UZERO, flags: 0 }; } exports.ServerHltvInfo = { encode(message, writer = minimal_1.Writer.create()) { if (message.tvUdpPort !== 0) { writer.uint32(8).uint32(message.tvUdpPort); } if (!message.tvWatchKey.isZero()) { writer.uint32(16).uint64(message.tvWatchKey); } if (message.tvSlots !== 0) { writer.uint32(24).uint32(message.tvSlots); } if (message.tvClients !== 0) { writer.uint32(32).uint32(message.tvClients); } if (message.tvProxies !== 0) { writer.uint32(40).uint32(message.tvProxies); } if (message.tvTime !== 0) { writer.uint32(48).uint32(message.tvTime); } if (message.gameType !== 0) { writer.uint32(64).uint32(message.gameType); } if (message.gameMapgroup !== "") { writer.uint32(74).string(message.gameMapgroup); } if (message.gameMap !== "") { writer.uint32(82).string(message.gameMap); } if (!message.tvMasterSteamid.isZero()) { writer.uint32(88).uint64(message.tvMasterSteamid); } if (message.tvLocalSlots !== 0) { writer.uint32(96).uint32(message.tvLocalSlots); } if (message.tvLocalClients !== 0) { writer.uint32(104).uint32(message.tvLocalClients); } if (message.tvLocalProxies !== 0) { writer.uint32(112).uint32(message.tvLocalProxies); } if (message.tvRelaySlots !== 0) { writer.uint32(120).uint32(message.tvRelaySlots); } if (message.tvRelayClients !== 0) { writer.uint32(128).uint32(message.tvRelayClients); } if (message.tvRelayProxies !== 0) { writer.uint32(136).uint32(message.tvRelayProxies); } if (message.tvRelayAddress !== 0) { writer.uint32(144).uint32(message.tvRelayAddress); } if (message.tvRelayPort !== 0) { writer.uint32(152).uint32(message.tvRelayPort); } if (!message.tvRelaySteamid.isZero()) { writer.uint32(160).uint64(message.tvRelaySteamid); } if (message.flags !== 0) { writer.uint32(168).uint32(message.flags); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseServerHltvInfo(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.tvUdpPort = reader.uint32(); break; case 2: message.tvWatchKey = reader.uint64(); break; case 3: message.tvSlots = reader.uint32(); break; case 4: message.tvClients = reader.uint32(); break; case 5: message.tvProxies = reader.uint32(); break; case 6: message.tvTime = reader.uint32(); break; case 8: message.gameType = reader.uint32(); break; case 9: message.gameMapgroup = reader.string(); break; case 10: message.gameMap = reader.string(); break; case 11: message.tvMasterSteamid = reader.uint64(); break; case 12: message.tvLocalSlots = reader.uint32(); break; case 13: message.tvLocalClients = reader.uint32(); break; case 14: message.tvLocalProxies = reader.uint32(); break; case 15: message.tvRelaySlots = reader.uint32(); break; case 16: message.tvRelayClients = reader.uint32(); break; case 17: message.tvRelayProxies = reader.uint32(); break; case 18: message.tvRelayAddress = reader.uint32(); break; case 19: message.tvRelayPort = reader.uint32(); break; case 20: message.tvRelaySteamid = reader.uint64(); break; case 21: message.flags = reader.uint32(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s; const message = createBaseServerHltvInfo(); message.tvUdpPort = (_a = object.tvUdpPort) !== null && _a !== void 0 ? _a : 0; message.tvWatchKey = object.tvWatchKey !== undefined && object.tvWatchKey !== null ? Long.fromValue(object.tvWatchKey) : Long.UZERO; message.tvSlots = (_b = object.tvSlots) !== null && _b !== void 0 ? _b : 0; message.tvClients = (_c = object.tvClients) !== null && _c !== void 0 ? _c : 0; message.tvProxies = (_d = object.tvProxies) !== null && _d !== void 0 ? _d : 0; message.tvTime = (_e = object.tvTime) !== null && _e !== void 0 ? _e : 0; message.gameType = (_f = object.gameType) !== null && _f !== void 0 ? _f : 0; message.gameMapgroup = (_g = object.gameMapgroup) !== null && _g !== void 0 ? _g : ""; message.gameMap = (_h = object.gameMap) !== null && _h !== void 0 ? _h : ""; message.tvMasterSteamid = object.tvMasterSteamid !== undefined && object.tvMasterSteamid !== null ? Long.fromValue(object.tvMasterSteamid) : Long.UZERO; message.tvLocalSlots = (_j = object.tvLocalSlots) !== null && _j !== void 0 ? _j : 0; message.tvLocalClients = (_k = object.tvLocalClients) !== null && _k !== void 0 ? _k : 0; message.tvLocalProxies = (_l = object.tvLocalProxies) !== null && _l !== void 0 ? _l : 0; message.tvRelaySlots = (_m = object.tvRelaySlots) !== null && _m !== void 0 ? _m : 0; message.tvRelayClients = (_o = object.tvRelayClients) !== null && _o !== void 0 ? _o : 0; message.tvRelayProxies = (_p = object.tvRelayProxies) !== null && _p !== void 0 ? _p : 0; message.tvRelayAddress = (_q = object.tvRelayAddress) !== null && _q !== void 0 ? _q : 0; message.tvRelayPort = (_r = object.tvRelayPort) !== null && _r !== void 0 ? _r : 0; message.tvRelaySteamid = object.tvRelaySteamid !== undefined && object.tvRelaySteamid !== null ? Long.fromValue(object.tvRelaySteamid) : Long.UZERO; message.flags = (_s = object.flags) !== null && _s !== void 0 ? _s : 0; return message; } }; function createBaseIpAddressMask() { return { a: 0, b: 0, c: 0, d: 0, bits: 0, token: 0 }; } exports.IpAddressMask = { encode(message, writer = minimal_1.Writer.create()) { if (message.a !== 0) { writer.uint32(8).uint32(message.a); } if (message.b !== 0) { writer.uint32(16).uint32(message.b); } if (message.c !== 0) { writer.uint32(24).uint32(message.c); } if (message.d !== 0) { writer.uint32(32).uint32(message.d); } if (message.bits !== 0) { writer.uint32(40).uint32(message.bits); } if (message.token !== 0) { writer.uint32(48).uint32(message.token); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseIpAddressMask(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.a = reader.uint32(); break; case 2: message.b = reader.uint32(); break; case 3: message.c = reader.uint32(); break; case 4: message.d = reader.uint32(); break; case 5: message.bits = reader.uint32(); break; case 6: message.token = reader.uint32(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c, _d, _e, _f; const message = createBaseIpAddressMask(); message.a = (_a = object.a) !== null && _a !== void 0 ? _a : 0; message.b = (_b = object.b) !== null && _b !== void 0 ? _b : 0; message.c = (_c = object.c) !== null && _c !== void 0 ? _c : 0; message.d = (_d = object.d) !== null && _d !== void 0 ? _d : 0; message.bits = (_e = object.bits) !== null && _e !== void 0 ? _e : 0; message.token = (_f = object.token) !== null && _f !== void 0 ? _f : 0; return message; } }; function createBaseCMsgCsgoSteamUserStatChange() { return { ecsgosteamuserstat: 0, delta: 0, absolute: false }; } exports.CMsgCsgoSteamUserStatChange = { encode(message, writer = minimal_1.Writer.create()) { if (message.ecsgosteamuserstat !== 0) { writer.uint32(8).int32(message.ecsgosteamuserstat); } if (message.delta !== 0) { writer.uint32(16).int32(message.delta); } if (message.absolute === true) { writer.uint32(24).bool(message.absolute); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCMsgCsgoSteamUserStatChange(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.ecsgosteamuserstat = reader.int32(); break; case 2: message.delta = reader.int32(); break; case 3: message.absolute = reader.bool(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c; const message = createBaseCMsgCsgoSteamUserStatChange(); message.ecsgosteamuserstat = (_a = object.ecsgosteamuserstat) !== null && _a !== void 0 ? _a : 0; message.delta = (_b = object.delta) !== null && _b !== void 0 ? _b : 0; message.absolute = (_c = object.absolute) !== null && _c !== void 0 ? _c : false; return message; } }; function createBaseXpProgressData() { return { xpPoints: 0, xpCategory: 0 }; } exports.XpProgressData = { encode(message, writer = minimal_1.Writer.create()) { if (message.xpPoints !== 0) { writer.uint32(8).uint32(message.xpPoints); } if (message.xpCategory !== 0) { writer.uint32(16).int32(message.xpCategory); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseXpProgressData(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.xpPoints = reader.uint32(); break; case 2: message.xpCategory = reader.int32(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b; const message = createBaseXpProgressData(); message.xpPoints = (_a = object.xpPoints) !== null && _a !== void 0 ? _a : 0; message.xpCategory = (_b = object.xpCategory) !== null && _b !== void 0 ? _b : 0; return message; } }; function createBaseMatchEndItemUpdates() { return { itemId: Long.UZERO, itemAttrDefidx: 0, itemAttrDeltaValue: 0 }; } exports.MatchEndItemUpdates = { encode(message, writer = minimal_1.Writer.create()) { if (!message.itemId.isZero()) { writer.uint32(8).uint64(message.itemId); } if (message.itemAttrDefidx !== 0) { writer.uint32(16).uint32(message.itemAttrDefidx); } if (message.itemAttrDeltaValue !== 0) { writer.uint32(24).uint32(message.itemAttrDeltaValue); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseMatchEndItemUpdates(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.itemId = reader.uint64(); break; case 2: message.itemAttrDefidx = reader.uint32(); break; case 3: message.itemAttrDeltaValue = reader.uint32(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b; const message = createBaseMatchEndItemUpdates(); message.itemId = object.itemId !== undefined && object.itemId !== null ? Long.fromValue(object.itemId) : Long.UZERO; message.itemAttrDefidx = (_a = object.itemAttrDefidx) !== null && _a !== void 0 ? _a : 0; message.itemAttrDeltaValue = (_b = object.itemAttrDeltaValue) !== null && _b !== void 0 ? _b : 0; return message; } }; function createBaseScoreLeaderboardData() { return { questId: Long.UZERO, score: 0, accountentries: [], matchentries: [] }; } exports.ScoreLeaderboardData = { encode(message, writer = minimal_1.Writer.create()) { if (!message.questId.isZero()) { writer.uint32(8).uint64(message.questId); } if (message.score !== 0) { writer.uint32(16).uint32(message.score); } for (const v of message.accountentries) { exports.ScoreLeaderboardData_AccountEntries.encode(v, writer.uint32(26).fork()).ldelim(); } for (const v of message.matchentries) { exports.ScoreLeaderboardData_Entry.encode(v, writer.uint32(42).fork()).ldelim(); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseScoreLeaderboardData(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.questId = reader.uint64(); break; case 2: message.score = reader.uint32(); break; case 3: message.accountentries.push(exports.ScoreLeaderboardData_AccountEntries.decode(reader, reader.uint32())); break; case 5: message.matchentries.push(exports.ScoreLeaderboardData_Entry.decode(reader, reader.uint32())); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c; const message = createBaseScoreLeaderboardData(); message.questId = object.questId !== undefined && object.questId !== null ? Long.fromValue(object.questId) : Long.UZERO; message.score = (_a = object.score) !== null && _a !== void 0 ? _a : 0; message.accountentries = ((_b = object.accountentries) === null || _b === void 0 ? void 0 : _b.map(e => exports.ScoreLeaderboardData_AccountEntries.fromPartial(e))) || []; message.matchentries = ((_c = object.matchentries) === null || _c === void 0 ? void 0 : _c.map(e => exports.ScoreLeaderboardData_Entry.fromPartial(e))) || []; return message; } }; function createBaseScoreLeaderboardData_Entry() { return { tag: 0, val: 0 }; } exports.ScoreLeaderboardData_Entry = { encode(message, writer = minimal_1.Writer.create()) { if (message.tag !== 0) { writer.uint32(8).uint32(message.tag); } if (message.val !== 0) { writer.uint32(16).uint32(message.val); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseScoreLeaderboardData_Entry(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.tag = reader.uint32(); break; case 2: message.val = reader.uint32(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b; const message = createBaseScoreLeaderboardData_Entry(); message.tag = (_a = object.tag) !== null && _a !== void 0 ? _a : 0; message.val = (_b = object.val) !== null && _b !== void 0 ? _b : 0; return message; } }; function createBaseScoreLeaderboardData_AccountEntries() { return { accountid: 0, entries: [] }; } exports.ScoreLeaderboardData_AccountEntries = { encode(message, writer = minimal_1.Writer.create()) { if (message.accountid !== 0) { writer.uint32(8).uint32(message.accountid); } for (const v of message.entries) { exports.ScoreLeaderboardData_Entry.encode(v, writer.uint32(18).fork()).ldelim(); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseScoreLeaderboardData_AccountEntries(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.accountid = reader.uint32(); break; case 2: message.entries.push(exports.ScoreLeaderboardData_Entry.decode(reader, reader.uint32())); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b; const message = createBaseScoreLeaderboardData_AccountEntries(); message.accountid = (_a = object.accountid) !== null && _a !== void 0 ? _a : 0; message.entries = ((_b = object.entries) === null || _b === void 0 ? void 0 : _b.map(e => exports.ScoreLeaderboardData_Entry.fromPartial(e))) || []; return message; } }; function createBasePlayerQuestData() { return { questerAccountId: 0, questItemData: [], xpProgressData: [], timePlayed: 0, mmGameMode: 0, itemUpdates: [], operationPointsEligible: false, userstatchanges: [] }; } exports.PlayerQuestData = { encode(message, writer = minimal_1.Writer.create()) { if (message.questerAccountId !== 0) { writer.uint32(8).uint32(message.questerAccountId); } for (const v of message.questItemData) { exports.PlayerQuestData_QuestItemData.encode(v, writer.uint32(18).fork()).ldelim(); } for (const v of message.xpProgressData) { exports.XpProgressData.encode(v, writer.uint32(26).fork()).ldelim(); } if (message.timePlayed !== 0) { writer.uint32(32).uint32(message.timePlayed); } if (message.mmGameMode !== 0) { writer.uint32(40).uint32(message.mmGameMode); } for (const v of message.itemUpdates) { exports.MatchEndItemUpdates.encode(v, writer.uint32(50).fork()).ldelim(); } if (message.operationPointsEligible === true) { writer.uint32(56).bool(message.operationPointsEligible); } for (const v of message.userstatchanges) { exports.CMsgCsgoSteamUserStatChange.encode(v, writer.uint32(66).fork()).ldelim(); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBasePlayerQuestData(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.questerAccountId = reader.uint32(); break; case 2: message.questItemData.push(exports.PlayerQuestData_QuestItemData.decode(reader, reader.uint32())); break; case 3: message.xpProgressData.push(exports.XpProgressData.decode(reader, reader.uint32())); break; case 4: message.timePlayed = reader.uint32(); break; case 5: message.mmGameMode = reader.uint32(); break; case 6: message.itemUpdates.push(exports.MatchEndItemUpdates.decode(reader, reader.uint32())); break; case 7: message.operationPointsEligible = reader.bool(); break; case 8: message.userstatchanges.push(exports.CMsgCsgoSteamUserStatChange.decode(reader, reader.uint32())); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c, _d, _e, _f, _g, _h; const message = createBasePlayerQuestData(); message.questerAccountId = (_a = object.questerAccountId) !== null && _a !== void 0 ? _a : 0; message.questItemData = ((_b = object.questItemData) === null || _b === void 0 ? void 0 : _b.map(e => exports.PlayerQuestData_QuestItemData.fromPartial(e))) || []; message.xpProgressData = ((_c = object.xpProgressData) === null || _c === void 0 ? void 0 : _c.map(e => exports.XpProgressData.fromPartial(e))) || []; message.timePlayed = (_d = object.timePlayed) !== null && _d !== void 0 ? _d : 0; message.mmGameMode = (_e = object.mmGameMode) !== null && _e !== void 0 ? _e : 0; message.itemUpdates = ((_f = object.itemUpdates) === null || _f === void 0 ? void 0 : _f.map(e => exports.MatchEndItemUpdates.fromPartial(e))) || []; message.operationPointsEligible = (_g = object.operationPointsEligible) !== null && _g !== void 0 ? _g : false; message.userstatchanges = ((_h = object.userstatchanges) === null || _h === void 0 ? void 0 : _h.map(e => exports.CMsgCsgoSteamUserStatChange.fromPartial(e))) || []; return message; } }; function createBasePlayerQuestData_QuestItemData() { return { questId: Long.UZERO, questNormalPointsEarned: 0, questBonusPointsEarned: 0 }; } exports.PlayerQuestData_QuestItemData = { encode(message, writer = minimal_1.Writer.create()) { if (!message.questId.isZero()) { writer.uint32(8).uint64(message.questId); } if (message.questNormalPointsEarned !== 0) { writer.uint32(16).int32(message.questNormalPointsEarned); } if (message.questBonusPointsEarned !== 0) { writer.uint32(24).int32(message.questBonusPointsEarned); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBasePlayerQuestData_QuestItemData(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.questId = reader.uint64(); break; case 2: message.questNormalPointsEarned = reader.int32(); break; case 3: message.questBonusPointsEarned = reader.int32(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b; const message = createBasePlayerQuestData_QuestItemData(); message.questId = object.questId !== undefined && object.questId !== null ? Long.fromValue(object.questId) : Long.UZERO; message.questNormalPointsEarned = (_a = object.questNormalPointsEarned) !== null && _a !== void 0 ? _a : 0; message.questBonusPointsEarned = (_b = object.questBonusPointsEarned) !== null && _b !== void 0 ? _b : 0; return message; } }; function createBaseDeepPlayerStatsEntry() { return { accountid: 0, matchId: Long.UZERO, mmGameMode: 0, mapid: 0, bStartingCt: false, matchOutcome: 0, roundsWon: 0, roundsLost: 0, statScore: 0, statDeaths: 0, statMvps: 0, enemyKills: 0, enemyHeadshots: 0, enemy2ks: 0, enemy3ks: 0, enemy4ks: 0, totalDamage: 0, engagementsEntryCount: 0, engagementsEntryWins: 0, engagements1v1Count: 0, engagements1v1Wins: 0, engagements1v2Count: 0, engagements1v2Wins: 0, utilityCount: 0, utilitySuccess: 0, flashCount: 0, flashSuccess: 0, mates: [] }; } exports.DeepPlayerStatsEntry = { encode(message, writer = minimal_1.Writer.create()) { if (message.accountid !== 0) { writer.uint32(8).uint32(message.accountid); } if (!message.matchId.isZero()) { writer.uint32(16).uint64(message.matchId); } if (message.mmGameMode !== 0) { writer.uint32(24).uint32(message.mmGameMode); } if (message.mapid !== 0) { writer.uint32(32).uint32(message.mapid); } if (message.bStartingCt === true) { writer.uint32(40).bool(message.bStartingCt); } if (message.matchOutcome !== 0) { writer.uint32(48).uint32(message.matchOutcome); } if (message.roundsWon !== 0) { writer.uint32(56).uint32(message.roundsWon); } if (message.roundsLost !== 0) { writer.uint32(64).uint32(message.roundsLost); } if (message.statScore !== 0) { writer.uint32(72).uint32(message.statScore); } if (message.statDeaths !== 0) { writer.uint32(96).uint32(message.statDeaths); } if (message.statMvps !== 0) { writer.uint32(104).uint32(message.statMvps); } if (message.enemyKills !== 0) { writer.uint32(112).uint32(message.enemyKills); } if (message.enemyHeadshots !== 0) { writer.uint32(120).uint32(message.enemyHeadshots); } if (message.enemy2ks !== 0) { writer.uint32(128).uint32(message.enemy2ks); } if (message.enemy3ks !== 0) { writer.uint32(136).uint32(message.enemy3ks); } if (message.enemy4ks !== 0) { writer.uint32(144).uint32(message.enemy4ks); } if (message.totalDamage !== 0) { writer.uint32(152).uint32(message.totalDamage); } if (message.engagementsEntryCount !== 0) { writer.uint32(184).uint32(message.engagementsEntryCount); } if (message.engagementsEntryWins !== 0) { writer.uint32(192).uint32(message.engagementsEntryWins); } if (message.engagements1v1Count !== 0) { writer.uint32(200).uint32(message.engagements1v1Count); } if (message.engagements1v1Wins !== 0) { writer.uint32(208).uint32(message.engagements1v1Wins); } if (message.engagements1v2Count !== 0) { writer.uint32(216).uint32(message.engagements1v2Count); } if (message.engagements1v2Wins !== 0) { writer.uint32(224).uint32(message.engagements1v2Wins); } if (message.utilityCount !== 0) { writer.uint32(232).uint32(message.utilityCount); } if (message.utilitySuccess !== 0) { writer.uint32(240).uint32(message.utilitySuccess); } if (message.flashCount !== 0) { writer.uint32(256).uint32(message.flashCount); } if (message.flashSuccess !== 0) { writer.uint32(264).uint32(message.flashSuccess); } writer.uint32(274).fork(); for (const v of message.mates) { writer.uint32(v); } writer.ldelim(); return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseDeepPlayerStatsEntry(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.accountid = reader.uint32(); break; case 2: message.matchId = reader.uint64(); break; case 3: message.mmGameMode = reader.uint32(); break; case 4: message.mapid = reader.uint32(); break; case 5: message.bStartingCt = reader.bool(); break; case 6: message.matchOutcome = reader.uint32(); break; case 7: message.roundsWon = reader.uint32(); break; case 8: message.roundsLost = reader.uint32(); break; case 9: message.statScore = reader.uint32(); break; case 12: message.statDeaths = reader.uint32(); break; case 13: message.statMvps = reader.uint32(); break; case 14: message.enemyKills = reader.uint32(); break; case 15: message.enemyHeadshots = reader.uint32(); break; case 16: message.enemy2ks = reader.uint32(); break; case 17: message.enemy3ks = reader.uint32(); break; case 18: message.enemy4ks = reader.uint32(); break; case 19: message.totalDamage = reader.uint32(); break; case 23: message.engagementsEntryCount = reader.uint32(); break; case 24: message.engagementsEntryWins = reader.uint32(); break; case 25: message.engagements1v1Count = reader.uint32(); break; case 26: message.engagements1v1Wins = reader.uint32(); break; case 27: message.engagements1v2Count = reader.uint32(); break; case 28: message.engagements1v2Wins = reader.uint32(); break; case 29: message.utilityCount = reader.uint32(); break; case 30: message.utilitySuccess = reader.uint32(); break; case 32: message.flashCount = reader.uint32(); break; case 33: message.flashSuccess = reader.uint32(); break; case 34: if ((tag & 7) === 2) { const end2 = reader.uint32() + reader.pos; while (reader.pos < end2) { message.mates.push(reader.uint32()); } } else { message.mates.push(reader.uint32()); } break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _0, _1, _2; const message = createBaseDeepPlayerStatsEntry(); message.accountid = (_a = object.accountid) !== null && _a !== void 0 ? _a : 0; message.matchId = object.matchId !== undefined && object.matchId !== null ? Long.fromValue(object.matchId) : Long.UZERO; message.mmGameMode = (_b = object.mmGameMode) !== null && _b !== void 0 ? _b : 0; message.mapid = (_c = object.mapid) !== null && _c !== void 0 ? _c : 0; message.bStartingCt = (_d = object.bStartingCt) !== null && _d !== void 0 ? _d : false; message.matchOutcome = (_e = object.matchOutcome) !== null && _e !== void 0 ? _e : 0; message.roundsWon = (_f = object.roundsWon) !== null && _f !== void 0 ? _f : 0; message.roundsLost = (_g = object.roundsLost) !== null && _g !== void 0 ? _g : 0; message.statScore = (_h = object.statScore) !== null && _h !== void 0 ? _h : 0; message.statDeaths = (_j = object.statDeaths) !== null && _j !== void 0 ? _j : 0; message.statMvps = (_k = object.statMvps) !== null && _k !== void 0 ? _k : 0; message.enemyKills = (_l = object.enemyKills) !== null && _l !== void 0 ? _l : 0; message.enemyHeadshots = (_m = object.enemyHeadshots) !== null && _m !== void 0 ? _m : 0; message.enemy2ks = (_o = object.enemy2ks) !== null && _o !== void 0 ? _o : 0; message.enemy3ks = (_p = object.enemy3ks) !== null && _p !== void 0 ? _p : 0; message.enemy4ks = (_q = object.enemy4ks) !== null && _q !== void 0 ? _q : 0; message.totalDamage = (_r = object.totalDamage) !== null && _r !== void 0 ? _r : 0; message.engagementsEntryCount = (_s = object.engagementsEntryCount) !== null && _s !== void 0 ? _s : 0; message.engagementsEntryWins = (_t = object.engagementsEntryWins) !== null && _t !== void 0 ? _t : 0; message.engagements1v1Count = (_u = object.engagements1v1Count) !== null && _u !== void 0 ? _u : 0; message.engagements1v1Wins = (_v = object.engagements1v1Wins) !== null && _v !== void 0 ? _v : 0; message.engagements1v2Count = (_w = object.engagements1v2Count) !== null && _w !== void 0 ? _w : 0; message.engagements1v2Wins = (_x = object.engagements1v2Wins) !== null && _x !== void 0 ? _x : 0; message.utilityCount = (_y = object.utilityCount) !== null && _y !== void 0 ? _y : 0; message.utilitySuccess = (_z = object.utilitySuccess) !== null && _z !== void 0 ? _z : 0; message.flashCount = (_0 = object.flashCount) !== null && _0 !== void 0 ? _0 : 0; message.flashSuccess = (_1 = object.flashSuccess) !== null && _1 !== void 0 ? _1 : 0; message.mates = ((_2 = object.mates) === null || _2 === void 0 ? void 0 : _2.map(e => e)) || []; return message; } }; function createBaseDeepPlayerMatchEvent() { return { accountid: 0, matchId: Long.UZERO, eventId: 0, eventType: 0, bPlayingCt: false, userPosX: 0, userPosY: 0, userPosZ: 0, userDefidx: 0, otherPosX: 0, otherPosY: 0, otherPosZ: 0, otherDefidx: 0, eventData: 0 }; } exports.DeepPlayerMatchEvent = { encode(message, writer = minimal_1.Writer.create()) { if (message.accountid !== 0) { writer.uint32(8).uint32(message.accountid); } if (!message.matchId.isZero()) { writer.uint32(16).uint64(message.matchId); } if (message.eventId !== 0) { writer.uint32(24).uint32(message.eventId); } if (message.eventType !== 0) { writer.uint32(32).uint32(message.eventType); } if (message.bPlayingCt === true) { writer.uint32(40).bool(message.bPlayingCt); } if (message.userPosX !== 0) { writer.uint32(48).int32(message.userPosX); } if (message.userPosY !== 0) { writer.uint32(56).int32(message.userPosY); } if (message.userPosZ !== 0) { writer.uint32(96).int32(message.userPosZ); } if (message.userDefidx !== 0) { writer.uint32(64).uint32(message.userDefidx); } if (message.otherPosX !== 0) { writer.uint32(72).int32(message.otherPosX); } if (message.otherPosY !== 0) { writer.uint32(80).int32(message.otherPosY); } if (message.otherPosZ !== 0) { writer.uint32(104).int32(message.otherPosZ); } if (message.otherDefidx !== 0) { writer.uint32(88).uint32(message.otherDefidx); } if (message.eventData !== 0) { writer.uint32(112).int32(message.eventData); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseDeepPlayerMatchEvent(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.accountid = reader.uint32(); break; case 2: message.matchId = reader.uint64(); break; case 3: message.eventId = reader.uint32(); break; case 4: message.eventType = reader.uint32(); break; case 5: message.bPlayingCt = reader.bool(); break; case 6: message.userPosX = reader.int32(); break; case 7: message.userPosY = reader.int32(); break; case 12: message.userPosZ = reader.int32(); break; case 8: message.userDefidx = reader.uint32(); break; case 9: message.otherPosX = reader.int32(); break; case 10: message.otherPosY = reader.int32(); break; case 13: message.otherPosZ = reader.int32(); break; case 11: message.otherDefidx = reader.uint32(); break; case 14: message.eventData = reader.int32(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o; const message = createBaseDeepPlayerMatchEvent(); message.accountid = (_a = object.accountid) !== null && _a !== void 0 ? _a : 0; message.matchId = object.matchId !== undefined && object.matchId !== null ? Long.fromValue(object.matchId) : Long.UZERO; message.eventId = (_b = object.eventId) !== null && _b !== void 0 ? _b : 0; message.eventType = (_c = object.eventType) !== null && _c !== void 0 ? _c : 0; message.bPlayingCt = (_d = object.bPlayingCt) !== null && _d !== void 0 ? _d : false; message.userPosX = (_e = object.userPosX) !== null && _e !== void 0 ? _e : 0; message.userPosY = (_f = object.userPosY) !== null && _f !== void 0 ? _f : 0; message.userPosZ = (_g = object.userPosZ) !== null && _g !== void 0 ? _g : 0; message.userDefidx = (_h = object.userDefidx) !== null && _h !== void 0 ? _h : 0; message.otherPosX = (_j = object.otherPosX) !== null && _j !== void 0 ? _j : 0; message.otherPosY = (_k = object.otherPosY) !== null && _k !== void 0 ? _k : 0; message.otherPosZ = (_l = object.otherPosZ) !== null && _l !== void 0 ? _l : 0; message.otherDefidx = (_m = object.otherDefidx) !== null && _m !== void 0 ? _m : 0; message.eventData = (_o = object.eventData) !== null && _o !== void 0 ? _o : 0; return message; } }; function createBaseCMsgGCServerQuestUpdateData() { return { playerQuestData: [], binaryData: new Uint8Array(), mmGameMode: 0, missionlbsdata: undefined }; } exports.CMsgGCServerQuestUpdateData = { encode(message, writer = minimal_1.Writer.create()) { for (const v of message.playerQuestData) { exports.PlayerQuestData.encode(v, writer.uint32(10).fork()).ldelim(); } if (message.binaryData.length !== 0) { writer.uint32(18).bytes(message.binaryData); } if (message.mmGameMode !== 0) { writer.uint32(24).uint32(message.mmGameMode); } if (message.missionlbsdata !== undefined) { exports.ScoreLeaderboardData.encode(message.missionlbsdata, writer.uint32(34).fork()).ldelim(); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCMsgGCServerQuestUpdateData(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.playerQuestData.push(exports.PlayerQuestData.decode(reader, reader.uint32())); break; case 2: message.binaryData = reader.bytes(); break; case 3: message.mmGameMode = reader.uint32(); break; case 4: message.missionlbsdata = exports.ScoreLeaderboardData.decode(reader, reader.uint32()); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c; const message = createBaseCMsgGCServerQuestUpdateData(); message.playerQuestData = ((_a = object.playerQuestData) === null || _a === void 0 ? void 0 : _a.map(e => exports.PlayerQuestData.fromPartial(e))) || []; message.binaryData = (_b = object.binaryData) !== null && _b !== void 0 ? _b : new Uint8Array(); message.mmGameMode = (_c = object.mmGameMode) !== null && _c !== void 0 ? _c : 0; message.missionlbsdata = object.missionlbsdata !== undefined && object.missionlbsdata !== null ? exports.ScoreLeaderboardData.fromPartial(object.missionlbsdata) : undefined; return message; } }; function createBaseCMsgGCCStrike15V2MatchmakingGCOperationalStats() { return { packetid: 0, namekeys: [], packets: [] }; } exports.CMsgGCCStrike15V2MatchmakingGCOperationalStats = { encode(message, writer = minimal_1.Writer.create()) { if (message.packetid !== 0) { writer.uint32(8).int32(message.packetid); } for (const v of message.namekeys) { exports.OperationalStatisticDescription.encode(v, writer.uint32(18).fork()).ldelim(); } for (const v of message.packets) { exports.OperationalStatisticsPacket.encode(v, writer.uint32(26).fork()).ldelim(); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCMsgGCCStrike15V2MatchmakingGCOperationalStats(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.packetid = reader.int32(); break; case 2: message.namekeys.push(exports.OperationalStatisticDescription.decode(reader, reader.uint32())); break; case 3: message.packets.push(exports.OperationalStatisticsPacket.decode(reader, reader.uint32())); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c; const message = createBaseCMsgGCCStrike15V2MatchmakingGCOperationalStats(); message.packetid = (_a = object.packetid) !== null && _a !== void 0 ? _a : 0; message.namekeys = ((_b = object.namekeys) === null || _b === void 0 ? void 0 : _b.map(e => exports.OperationalStatisticDescription.fromPartial(e))) || []; message.packets = ((_c = object.packets) === null || _c === void 0 ? void 0 : _c.map(e => exports.OperationalStatisticsPacket.fromPartial(e))) || []; return message; } }; function createBaseCMsgGCCStrike15V2MatchmakingGC2ServerConfirm() { return { token: 0, stamp: 0, exchange: Long.UZERO }; } exports.CMsgGCCStrike15V2MatchmakingGC2ServerConfirm = { encode(message, writer = minimal_1.Writer.create()) { if (message.token !== 0) { writer.uint32(8).uint32(message.token); } if (message.stamp !== 0) { writer.uint32(16).uint32(message.stamp); } if (!message.exchange.isZero()) { writer.uint32(24).uint64(message.exchange); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCMsgGCCStrike15V2MatchmakingGC2ServerConfirm(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.token = reader.uint32(); break; case 2: message.stamp = reader.uint32(); break; case 3: message.exchange = reader.uint64(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b; const message = createBaseCMsgGCCStrike15V2MatchmakingGC2ServerConfirm(); message.token = (_a = object.token) !== null && _a !== void 0 ? _a : 0; message.stamp = (_b = object.stamp) !== null && _b !== void 0 ? _b : 0; message.exchange = object.exchange !== undefined && object.exchange !== null ? Long.fromValue(object.exchange) : Long.UZERO; return message; } }; function createBaseCMsgGCCStrike15V2GC2ServerReservationUpdate() { return { viewersExternalTotal: 0, viewersExternalSteam: 0 }; } exports.CMsgGCCStrike15V2GC2ServerReservationUpdate = { encode(message, writer = minimal_1.Writer.create()) { if (message.viewersExternalTotal !== 0) { writer.uint32(8).uint32(message.viewersExternalTotal); } if (message.viewersExternalSteam !== 0) { writer.uint32(16).uint32(message.viewersExternalSteam); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCMsgGCCStrike15V2GC2ServerReservationUpdate(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.viewersExternalTotal = reader.uint32(); break; case 2: message.viewersExternalSteam = reader.uint32(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b; const message = createBaseCMsgGCCStrike15V2GC2ServerReservationUpdate(); message.viewersExternalTotal = (_a = object.viewersExternalTotal) !== null && _a !== void 0 ? _a : 0; message.viewersExternalSteam = (_b = object.viewersExternalSteam) !== null && _b !== void 0 ? _b : 0; return message; } }; function createBaseCMsgGCCStrike15V2MatchmakingStart() { return { accountIds: [], gameType: 0, ticketData: "", clientVersion: 0, tournamentMatch: undefined, primeOnly: false, tvControl: 0, lobbyId: Long.UZERO }; } exports.CMsgGCCStrike15V2MatchmakingStart = { encode(message, writer = minimal_1.Writer.create()) { writer.uint32(10).fork(); for (const v of message.accountIds) { writer.uint32(v); } writer.ldelim(); if (message.gameType !== 0) { writer.uint32(16).uint32(message.gameType); } if (message.ticketData !== "") { writer.uint32(26).string(message.ticketData); } if (message.clientVersion !== 0) { writer.uint32(32).uint32(message.clientVersion); } if (message.tournamentMatch !== undefined) { exports.TournamentMatchSetup.encode(message.tournamentMatch, writer.uint32(42).fork()).ldelim(); } if (message.primeOnly === true) { writer.uint32(48).bool(message.primeOnly); } if (message.tvControl !== 0) { writer.uint32(56).uint32(message.tvControl); } if (!message.lobbyId.isZero()) { writer.uint32(64).uint64(message.lobbyId); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCMsgGCCStrike15V2MatchmakingStart(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: if ((tag & 7) === 2) { const end2 = reader.uint32() + reader.pos; while (reader.pos < end2) { message.accountIds.push(reader.uint32()); } } else { message.accountIds.push(reader.uint32()); } break; case 2: message.gameType = reader.uint32(); break; case 3: message.ticketData = reader.string(); break; case 4: message.clientVersion = reader.uint32(); break; case 5: message.tournamentMatch = exports.TournamentMatchSetup.decode(reader, reader.uint32()); break; case 6: message.primeOnly = reader.bool(); break; case 7: message.tvControl = reader.uint32(); break; case 8: message.lobbyId = reader.uint64(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c, _d, _e, _f; const message = createBaseCMsgGCCStrike15V2MatchmakingStart(); message.accountIds = ((_a = object.accountIds) === null || _a === void 0 ? void 0 : _a.map(e => e)) || []; message.gameType = (_b = object.gameType) !== null && _b !== void 0 ? _b : 0; message.ticketData = (_c = object.ticketData) !== null && _c !== void 0 ? _c : ""; message.clientVersion = (_d = object.clientVersion) !== null && _d !== void 0 ? _d : 0; message.tournamentMatch = object.tournamentMatch !== undefined && object.tournamentMatch !== null ? exports.TournamentMatchSetup.fromPartial(object.tournamentMatch) : undefined; message.primeOnly = (_e = object.primeOnly) !== null && _e !== void 0 ? _e : false; message.tvControl = (_f = object.tvControl) !== null && _f !== void 0 ? _f : 0; message.lobbyId = object.lobbyId !== undefined && object.lobbyId !== null ? Long.fromValue(object.lobbyId) : Long.UZERO; return message; } }; function createBaseCMsgGCCStrike15V2MatchmakingStop() { return { abandon: 0 }; } exports.CMsgGCCStrike15V2MatchmakingStop = { encode(message, writer = minimal_1.Writer.create()) { if (message.abandon !== 0) { writer.uint32(8).int32(message.abandon); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCMsgGCCStrike15V2MatchmakingStop(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.abandon = reader.int32(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a; const message = createBaseCMsgGCCStrike15V2MatchmakingStop(); message.abandon = (_a = object.abandon) !== null && _a !== void 0 ? _a : 0; return message; } }; function createBaseCMsgGCCStrike15V2MatchmakingClient2ServerPing() { return { gameserverpings: [], offsetIndex: 0, finalBatch: 0, dataCenterPings: [], maxPing: 0, testToken: 0 }; } exports.CMsgGCCStrike15V2MatchmakingClient2ServerPing = { encode(message, writer = minimal_1.Writer.create()) { for (const v of message.gameserverpings) { exports.GameServerPing.encode(v, writer.uint32(10).fork()).ldelim(); } if (message.offsetIndex !== 0) { writer.uint32(16).int32(message.offsetIndex); } if (message.finalBatch !== 0) { writer.uint32(24).int32(message.finalBatch); } for (const v of message.dataCenterPings) { exports.DataCenterPing.encode(v, writer.uint32(34).fork()).ldelim(); } if (message.maxPing !== 0) { writer.uint32(40).uint32(message.maxPing); } if (message.testToken !== 0) { writer.uint32(53).fixed32(message.testToken); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCMsgGCCStrike15V2MatchmakingClient2ServerPing(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.gameserverpings.push(exports.GameServerPing.decode(reader, reader.uint32())); break; case 2: message.offsetIndex = reader.int32(); break; case 3: message.finalBatch = reader.int32(); break; case 4: message.dataCenterPings.push(exports.DataCenterPing.decode(reader, reader.uint32())); break; case 5: message.maxPing = reader.uint32(); break; case 6: message.testToken = reader.fixed32(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c, _d, _e, _f; const message = createBaseCMsgGCCStrike15V2MatchmakingClient2ServerPing(); message.gameserverpings = ((_a = object.gameserverpings) === null || _a === void 0 ? void 0 : _a.map(e => exports.GameServerPing.fromPartial(e))) || []; message.offsetIndex = (_b = object.offsetIndex) !== null && _b !== void 0 ? _b : 0; message.finalBatch = (_c = object.finalBatch) !== null && _c !== void 0 ? _c : 0; message.dataCenterPings = ((_d = object.dataCenterPings) === null || _d === void 0 ? void 0 : _d.map(e => exports.DataCenterPing.fromPartial(e))) || []; message.maxPing = (_e = object.maxPing) !== null && _e !== void 0 ? _e : 0; message.testToken = (_f = object.testToken) !== null && _f !== void 0 ? _f : 0; return message; } }; function createBaseCMsgGCCStrike15V2MatchmakingGC2ClientUpdate() { return { matchmaking: 0, waitingAccountIdSessions: [], error: "", ongoingmatchAccountIdSessions: [], globalStats: undefined, failpingAccountIdSessions: [], penaltyAccountIdSessions: [], failreadyAccountIdSessions: [], vacbannedAccountIdSessions: [], serverIpaddressMask: undefined, notes: [], penaltyAccountIdSessionsGreen: [], insufficientlevelSessions: [], vsncheckAccountIdSessions: [], launcherMismatchSessions: [], insecureAccountIdSessions: [] }; } exports.CMsgGCCStrike15V2MatchmakingGC2ClientUpdate = { encode(message, writer = minimal_1.Writer.create()) { if (message.matchmaking !== 0) { writer.uint32(8).int32(message.matchmaking); } writer.uint32(18).fork(); for (const v of message.waitingAccountIdSessions) { writer.uint32(v); } writer.ldelim(); if (message.error !== "") { writer.uint32(26).string(message.error); } writer.uint32(50).fork(); for (const v of message.ongoingmatchAccountIdSessions) { writer.uint32(v); } writer.ldelim(); if (message.globalStats !== undefined) { exports.GlobalStatistics.encode(message.globalStats, writer.uint32(58).fork()).ldelim(); } writer.uint32(66).fork(); for (const v of message.failpingAccountIdSessions) { writer.uint32(v); } writer.ldelim(); writer.uint32(74).fork(); for (const v of message.penaltyAccountIdSessions) { writer.uint32(v); } writer.ldelim(); writer.uint32(82).fork(); for (const v of message.failreadyAccountIdSessions) { writer.uint32(v); } writer.ldelim(); writer.uint32(90).fork(); for (const v of message.vacbannedAccountIdSessions) { writer.uint32(v); } writer.ldelim(); if (message.serverIpaddressMask !== undefined) { exports.IpAddressMask.encode(message.serverIpaddressMask, writer.uint32(98).fork()).ldelim(); } for (const v of message.notes) { exports.CMsgGCCStrike15V2MatchmakingGC2ClientUpdate_Note.encode(v, writer.uint32(106).fork()).ldelim(); } writer.uint32(114).fork(); for (const v of message.penaltyAccountIdSessionsGreen) { writer.uint32(v); } writer.ldelim(); writer.uint32(122).fork(); for (const v of message.insufficientlevelSessions) { writer.uint32(v); } writer.ldelim(); writer.uint32(130).fork(); for (const v of message.vsncheckAccountIdSessions) { writer.uint32(v); } writer.ldelim(); writer.uint32(138).fork(); for (const v of message.launcherMismatchSessions) { writer.uint32(v); } writer.ldelim(); writer.uint32(146).fork(); for (const v of message.insecureAccountIdSessions) { writer.uint32(v); } writer.ldelim(); return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCMsgGCCStrike15V2MatchmakingGC2ClientUpdate(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.matchmaking = reader.int32(); break; case 2: if ((tag & 7) === 2) { const end2 = reader.uint32() + reader.pos; while (reader.pos < end2) { message.waitingAccountIdSessions.push(reader.uint32()); } } else { message.waitingAccountIdSessions.push(reader.uint32()); } break; case 3: message.error = reader.string(); break; case 6: if ((tag & 7) === 2) { const end2 = reader.uint32() + reader.pos; while (reader.pos < end2) { message.ongoingmatchAccountIdSessions.push(reader.uint32()); } } else { message.ongoingmatchAccountIdSessions.push(reader.uint32()); } break; case 7: message.globalStats = exports.GlobalStatistics.decode(reader, reader.uint32()); break; case 8: if ((tag & 7) === 2) { const end2 = reader.uint32() + reader.pos; while (reader.pos < end2) { message.failpingAccountIdSessions.push(reader.uint32()); } } else { message.failpingAccountIdSessions.push(reader.uint32()); } break; case 9: if ((tag & 7) === 2) { const end2 = reader.uint32() + reader.pos; while (reader.pos < end2) { message.penaltyAccountIdSessions.push(reader.uint32()); } } else { message.penaltyAccountIdSessions.push(reader.uint32()); } break; case 10: if ((tag & 7) === 2) { const end2 = reader.uint32() + reader.pos; while (reader.pos < end2) { message.failreadyAccountIdSessions.push(reader.uint32()); } } else { message.failreadyAccountIdSessions.push(reader.uint32()); } break; case 11: if ((tag & 7) === 2) { const end2 = reader.uint32() + reader.pos; while (reader.pos < end2) { message.vacbannedAccountIdSessions.push(reader.uint32()); } } else { message.vacbannedAccountIdSessions.push(reader.uint32()); } break; case 12: message.serverIpaddressMask = exports.IpAddressMask.decode(reader, reader.uint32()); break; case 13: message.notes.push(exports.CMsgGCCStrike15V2MatchmakingGC2ClientUpdate_Note.decode(reader, reader.uint32())); break; case 14: if ((tag & 7) === 2) { const end2 = reader.uint32() + reader.pos; while (reader.pos < end2) { message.penaltyAccountIdSessionsGreen.push(reader.uint32()); } } else { message.penaltyAccountIdSessionsGreen.push(reader.uint32()); } break; case 15: if ((tag & 7) === 2) { const end2 = reader.uint32() + reader.pos; while (reader.pos < end2) { message.insufficientlevelSessions.push(reader.uint32()); } } else { message.insufficientlevelSessions.push(reader.uint32()); } break; case 16: if ((tag & 7) === 2) { const end2 = reader.uint32() + reader.pos; while (reader.pos < end2) { message.vsncheckAccountIdSessions.push(reader.uint32()); } } else { message.vsncheckAccountIdSessions.push(reader.uint32()); } break; case 17: if ((tag & 7) === 2) { const end2 = reader.uint32() + reader.pos; while (reader.pos < end2) { message.launcherMismatchSessions.push(reader.uint32()); } } else { message.launcherMismatchSessions.push(reader.uint32()); } break; case 18: if ((tag & 7) === 2) { const end2 = reader.uint32() + reader.pos; while (reader.pos < end2) { message.insecureAccountIdSessions.push(reader.uint32()); } } else { message.insecureAccountIdSessions.push(reader.uint32()); } break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p; const message = createBaseCMsgGCCStrike15V2MatchmakingGC2ClientUpdate(); message.matchmaking = (_a = object.matchmaking) !== null && _a !== void 0 ? _a : 0; message.waitingAccountIdSessions = ((_b = object.waitingAccountIdSessions) === null || _b === void 0 ? void 0 : _b.map(e => e)) || []; message.error = (_c = object.error) !== null && _c !== void 0 ? _c : ""; message.ongoingmatchAccountIdSessions = ((_d = object.ongoingmatchAccountIdSessions) === null || _d === void 0 ? void 0 : _d.map(e => e)) || []; message.globalStats = object.globalStats !== undefined && object.globalStats !== null ? exports.GlobalStatistics.fromPartial(object.globalStats) : undefined; message.failpingAccountIdSessions = ((_e = object.failpingAccountIdSessions) === null || _e === void 0 ? void 0 : _e.map(e => e)) || []; message.penaltyAccountIdSessions = ((_f = object.penaltyAccountIdSessions) === null || _f === void 0 ? void 0 : _f.map(e => e)) || []; message.failreadyAccountIdSessions = ((_g = object.failreadyAccountIdSessions) === null || _g === void 0 ? void 0 : _g.map(e => e)) || []; message.vacbannedAccountIdSessions = ((_h = object.vacbannedAccountIdSessions) === null || _h === void 0 ? void 0 : _h.map(e => e)) || []; message.serverIpaddressMask = object.serverIpaddressMask !== undefined && object.serverIpaddressMask !== null ? exports.IpAddressMask.fromPartial(object.serverIpaddressMask) : undefined; message.notes = ((_j = object.notes) === null || _j === void 0 ? void 0 : _j.map(e => exports.CMsgGCCStrike15V2MatchmakingGC2ClientUpdate_Note.fromPartial(e))) || []; message.penaltyAccountIdSessionsGreen = ((_k = object.penaltyAccountIdSessionsGreen) === null || _k === void 0 ? void 0 : _k.map(e => e)) || []; message.insufficientlevelSessions = ((_l = object.insufficientlevelSessions) === null || _l === void 0 ? void 0 : _l.map(e => e)) || []; message.vsncheckAccountIdSessions = ((_m = object.vsncheckAccountIdSessions) === null || _m === void 0 ? void 0 : _m.map(e => e)) || []; message.launcherMismatchSessions = ((_o = object.launcherMismatchSessions) === null || _o === void 0 ? void 0 : _o.map(e => e)) || []; message.insecureAccountIdSessions = ((_p = object.insecureAccountIdSessions) === null || _p === void 0 ? void 0 : _p.map(e => e)) || []; return message; } }; function createBaseCMsgGCCStrike15V2MatchmakingGC2ClientUpdate_Note() { return { type: 0, regionId: 0, regionR: 0, distance: 0 }; } exports.CMsgGCCStrike15V2MatchmakingGC2ClientUpdate_Note = { encode(message, writer = minimal_1.Writer.create()) { if (message.type !== 0) { writer.uint32(8).int32(message.type); } if (message.regionId !== 0) { writer.uint32(16).int32(message.regionId); } if (message.regionR !== 0) { writer.uint32(29).float(message.regionR); } if (message.distance !== 0) { writer.uint32(37).float(message.distance); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCMsgGCCStrike15V2MatchmakingGC2ClientUpdate_Note(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.type = reader.int32(); break; case 2: message.regionId = reader.int32(); break; case 3: message.regionR = reader.float(); break; case 4: message.distance = reader.float(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c, _d; const message = createBaseCMsgGCCStrike15V2MatchmakingGC2ClientUpdate_Note(); message.type = (_a = object.type) !== null && _a !== void 0 ? _a : 0; message.regionId = (_b = object.regionId) !== null && _b !== void 0 ? _b : 0; message.regionR = (_c = object.regionR) !== null && _c !== void 0 ? _c : 0; message.distance = (_d = object.distance) !== null && _d !== void 0 ? _d : 0; return message; } }; function createBaseCDataGCCStrike15V2TournamentMatchDraft() { return { eventId: 0, eventStageId: 0, teamId0: 0, teamId1: 0, mapsCount: 0, mapsCurrent: 0, teamIdStart: 0, teamIdVeto1: 0, teamIdPickn: 0, drafts: [] }; } exports.CDataGCCStrike15V2TournamentMatchDraft = { encode(message, writer = minimal_1.Writer.create()) { if (message.eventId !== 0) { writer.uint32(8).int32(message.eventId); } if (message.eventStageId !== 0) { writer.uint32(16).int32(message.eventStageId); } if (message.teamId0 !== 0) { writer.uint32(24).int32(message.teamId0); } if (message.teamId1 !== 0) { writer.uint32(32).int32(message.teamId1); } if (message.mapsCount !== 0) { writer.uint32(40).int32(message.mapsCount); } if (message.mapsCurrent !== 0) { writer.uint32(48).int32(message.mapsCurrent); } if (message.teamIdStart !== 0) { writer.uint32(56).int32(message.teamIdStart); } if (message.teamIdVeto1 !== 0) { writer.uint32(64).int32(message.teamIdVeto1); } if (message.teamIdPickn !== 0) { writer.uint32(72).int32(message.teamIdPickn); } for (const v of message.drafts) { exports.CDataGCCStrike15V2TournamentMatchDraft_Entry.encode(v, writer.uint32(82).fork()).ldelim(); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCDataGCCStrike15V2TournamentMatchDraft(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.eventId = reader.int32(); break; case 2: message.eventStageId = reader.int32(); break; case 3: message.teamId0 = reader.int32(); break; case 4: message.teamId1 = reader.int32(); break; case 5: message.mapsCount = reader.int32(); break; case 6: message.mapsCurrent = reader.int32(); break; case 7: message.teamIdStart = reader.int32(); break; case 8: message.teamIdVeto1 = reader.int32(); break; case 9: message.teamIdPickn = reader.int32(); break; case 10: message.drafts.push(exports.CDataGCCStrike15V2TournamentMatchDraft_Entry.decode(reader, reader.uint32())); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k; const message = createBaseCDataGCCStrike15V2TournamentMatchDraft(); message.eventId = (_a = object.eventId) !== null && _a !== void 0 ? _a : 0; message.eventStageId = (_b = object.eventStageId) !== null && _b !== void 0 ? _b : 0; message.teamId0 = (_c = object.teamId0) !== null && _c !== void 0 ? _c : 0; message.teamId1 = (_d = object.teamId1) !== null && _d !== void 0 ? _d : 0; message.mapsCount = (_e = object.mapsCount) !== null && _e !== void 0 ? _e : 0; message.mapsCurrent = (_f = object.mapsCurrent) !== null && _f !== void 0 ? _f : 0; message.teamIdStart = (_g = object.teamIdStart) !== null && _g !== void 0 ? _g : 0; message.teamIdVeto1 = (_h = object.teamIdVeto1) !== null && _h !== void 0 ? _h : 0; message.teamIdPickn = (_j = object.teamIdPickn) !== null && _j !== void 0 ? _j : 0; message.drafts = ((_k = object.drafts) === null || _k === void 0 ? void 0 : _k.map(e => exports.CDataGCCStrike15V2TournamentMatchDraft_Entry.fromPartial(e))) || []; return message; } }; function createBaseCDataGCCStrike15V2TournamentMatchDraft_Entry() { return { mapid: 0, teamIdCt: 0 }; } exports.CDataGCCStrike15V2TournamentMatchDraft_Entry = { encode(message, writer = minimal_1.Writer.create()) { if (message.mapid !== 0) { writer.uint32(8).int32(message.mapid); } if (message.teamIdCt !== 0) { writer.uint32(16).int32(message.teamIdCt); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCDataGCCStrike15V2TournamentMatchDraft_Entry(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.mapid = reader.int32(); break; case 2: message.teamIdCt = reader.int32(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b; const message = createBaseCDataGCCStrike15V2TournamentMatchDraft_Entry(); message.mapid = (_a = object.mapid) !== null && _a !== void 0 ? _a : 0; message.teamIdCt = (_b = object.teamIdCt) !== null && _b !== void 0 ? _b : 0; return message; } }; function createBaseCPreMatchInfoData() { return { predictionsPct: 0, draft: undefined, stats: [], wins: [] }; } exports.CPreMatchInfoData = { encode(message, writer = minimal_1.Writer.create()) { if (message.predictionsPct !== 0) { writer.uint32(8).int32(message.predictionsPct); } if (message.draft !== undefined) { exports.CDataGCCStrike15V2TournamentMatchDraft.encode(message.draft, writer.uint32(34).fork()).ldelim(); } for (const v of message.stats) { exports.CPreMatchInfoData_TeamStats.encode(v, writer.uint32(42).fork()).ldelim(); } writer.uint32(50).fork(); for (const v of message.wins) { writer.int32(v); } writer.ldelim(); return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCPreMatchInfoData(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.predictionsPct = reader.int32(); break; case 4: message.draft = exports.CDataGCCStrike15V2TournamentMatchDraft.decode(reader, reader.uint32()); break; case 5: message.stats.push(exports.CPreMatchInfoData_TeamStats.decode(reader, reader.uint32())); break; case 6: if ((tag & 7) === 2) { const end2 = reader.uint32() + reader.pos; while (reader.pos < end2) { message.wins.push(reader.int32()); } } else { message.wins.push(reader.int32()); } break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c; const message = createBaseCPreMatchInfoData(); message.predictionsPct = (_a = object.predictionsPct) !== null && _a !== void 0 ? _a : 0; message.draft = object.draft !== undefined && object.draft !== null ? exports.CDataGCCStrike15V2TournamentMatchDraft.fromPartial(object.draft) : undefined; message.stats = ((_b = object.stats) === null || _b === void 0 ? void 0 : _b.map(e => exports.CPreMatchInfoData_TeamStats.fromPartial(e))) || []; message.wins = ((_c = object.wins) === null || _c === void 0 ? void 0 : _c.map(e => e)) || []; return message; } }; function createBaseCPreMatchInfoData_TeamStats() { return { matchInfoIdxtxt: 0, matchInfoTxt: "", matchInfoTeams: [] }; } exports.CPreMatchInfoData_TeamStats = { encode(message, writer = minimal_1.Writer.create()) { if (message.matchInfoIdxtxt !== 0) { writer.uint32(8).int32(message.matchInfoIdxtxt); } if (message.matchInfoTxt !== "") { writer.uint32(18).string(message.matchInfoTxt); } for (const v of message.matchInfoTeams) { writer.uint32(26).string(v); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCPreMatchInfoData_TeamStats(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.matchInfoIdxtxt = reader.int32(); break; case 2: message.matchInfoTxt = reader.string(); break; case 3: message.matchInfoTeams.push(reader.string()); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c; const message = createBaseCPreMatchInfoData_TeamStats(); message.matchInfoIdxtxt = (_a = object.matchInfoIdxtxt) !== null && _a !== void 0 ? _a : 0; message.matchInfoTxt = (_b = object.matchInfoTxt) !== null && _b !== void 0 ? _b : ""; message.matchInfoTeams = ((_c = object.matchInfoTeams) === null || _c === void 0 ? void 0 : _c.map(e => e)) || []; return message; } }; function createBaseCMsgGCCStrike15V2MatchmakingGC2ServerReserve() { return { accountIds: [], gameType: 0, matchId: Long.UZERO, serverVersion: 0, flags: 0, rankings: [], encryptionKey: Long.UZERO, encryptionKeyPub: Long.UZERO, partyIds: [], whitelist: [], tvMasterSteamid: Long.UZERO, tournamentEvent: undefined, tournamentTeams: [], tournamentCastersAccountIds: [], tvRelaySteamid: Long.UZERO, preMatchData: undefined, rtime32EventStart: 0, tvControl: 0 }; } exports.CMsgGCCStrike15V2MatchmakingGC2ServerReserve = { encode(message, writer = minimal_1.Writer.create()) { writer.uint32(10).fork(); for (const v of message.accountIds) { writer.uint32(v); } writer.ldelim(); if (message.gameType !== 0) { writer.uint32(16).uint32(message.gameType); } if (!message.matchId.isZero()) { writer.uint32(24).uint64(message.matchId); } if (message.serverVersion !== 0) { writer.uint32(32).uint32(message.serverVersion); } if (message.flags !== 0) { writer.uint32(144).uint32(message.flags); } for (const v of message.rankings) { exports.PlayerRankingInfo.encode(v, writer.uint32(42).fork()).ldelim(); } if (!message.encryptionKey.isZero()) { writer.uint32(48).uint64(message.encryptionKey); } if (!message.encryptionKeyPub.isZero()) { writer.uint32(56).uint64(message.encryptionKeyPub); } writer.uint32(66).fork(); for (const v of message.partyIds) { writer.uint32(v); } writer.ldelim(); for (const v of message.whitelist) { exports.IpAddressMask.encode(v, writer.uint32(74).fork()).ldelim(); } if (!message.tvMasterSteamid.isZero()) { writer.uint32(80).uint64(message.tvMasterSteamid); } if (message.tournamentEvent !== undefined) { exports.TournamentEvent.encode(message.tournamentEvent, writer.uint32(90).fork()).ldelim(); } for (const v of message.tournamentTeams) { exports.TournamentTeam.encode(v, writer.uint32(98).fork()).ldelim(); } writer.uint32(106).fork(); for (const v of message.tournamentCastersAccountIds) { writer.uint32(v); } writer.ldelim(); if (!message.tvRelaySteamid.isZero()) { writer.uint32(112).uint64(message.tvRelaySteamid); } if (message.preMatchData !== undefined) { exports.CPreMatchInfoData.encode(message.preMatchData, writer.uint32(122).fork()).ldelim(); } if (message.rtime32EventStart !== 0) { writer.uint32(128).uint32(message.rtime32EventStart); } if (message.tvControl !== 0) { writer.uint32(136).uint32(message.tvControl); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCMsgGCCStrike15V2MatchmakingGC2ServerReserve(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: if ((tag & 7) === 2) { const end2 = reader.uint32() + reader.pos; while (reader.pos < end2) { message.accountIds.push(reader.uint32()); } } else { message.accountIds.push(reader.uint32()); } break; case 2: message.gameType = reader.uint32(); break; case 3: message.matchId = reader.uint64(); break; case 4: message.serverVersion = reader.uint32(); break; case 18: message.flags = reader.uint32(); break; case 5: message.rankings.push(exports.PlayerRankingInfo.decode(reader, reader.uint32())); break; case 6: message.encryptionKey = reader.uint64(); break; case 7: message.encryptionKeyPub = reader.uint64(); break; case 8: if ((tag & 7) === 2) { const end2 = reader.uint32() + reader.pos; while (reader.pos < end2) { message.partyIds.push(reader.uint32()); } } else { message.partyIds.push(reader.uint32()); } break; case 9: message.whitelist.push(exports.IpAddressMask.decode(reader, reader.uint32())); break; case 10: message.tvMasterSteamid = reader.uint64(); break; case 11: message.tournamentEvent = exports.TournamentEvent.decode(reader, reader.uint32()); break; case 12: message.tournamentTeams.push(exports.TournamentTeam.decode(reader, reader.uint32())); break; case 13: if ((tag & 7) === 2) { const end2 = reader.uint32() + reader.pos; while (reader.pos < end2) { message.tournamentCastersAccountIds.push(reader.uint32()); } } else { message.tournamentCastersAccountIds.push(reader.uint32()); } break; case 14: message.tvRelaySteamid = reader.uint64(); break; case 15: message.preMatchData = exports.CPreMatchInfoData.decode(reader, reader.uint32()); break; case 16: message.rtime32EventStart = reader.uint32(); break; case 17: message.tvControl = reader.uint32(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l; const message = createBaseCMsgGCCStrike15V2MatchmakingGC2ServerReserve(); message.accountIds = ((_a = object.accountIds) === null || _a === void 0 ? void 0 : _a.map(e => e)) || []; message.gameType = (_b = object.gameType) !== null && _b !== void 0 ? _b : 0; message.matchId = object.matchId !== undefined && object.matchId !== null ? Long.fromValue(object.matchId) : Long.UZERO; message.serverVersion = (_c = object.serverVersion) !== null && _c !== void 0 ? _c : 0; message.flags = (_d = object.flags) !== null && _d !== void 0 ? _d : 0; message.rankings = ((_e = object.rankings) === null || _e === void 0 ? void 0 : _e.map(e => exports.PlayerRankingInfo.fromPartial(e))) || []; message.encryptionKey = object.encryptionKey !== undefined && object.encryptionKey !== null ? Long.fromValue(object.encryptionKey) : Long.UZERO; message.encryptionKeyPub = object.encryptionKeyPub !== undefined && object.encryptionKeyPub !== null ? Long.fromValue(object.encryptionKeyPub) : Long.UZERO; message.partyIds = ((_f = object.partyIds) === null || _f === void 0 ? void 0 : _f.map(e => e)) || []; message.whitelist = ((_g = object.whitelist) === null || _g === void 0 ? void 0 : _g.map(e => exports.IpAddressMask.fromPartial(e))) || []; message.tvMasterSteamid = object.tvMasterSteamid !== undefined && object.tvMasterSteamid !== null ? Long.fromValue(object.tvMasterSteamid) : Long.UZERO; message.tournamentEvent = object.tournamentEvent !== undefined && object.tournamentEvent !== null ? exports.TournamentEvent.fromPartial(object.tournamentEvent) : undefined; message.tournamentTeams = ((_h = object.tournamentTeams) === null || _h === void 0 ? void 0 : _h.map(e => exports.TournamentTeam.fromPartial(e))) || []; message.tournamentCastersAccountIds = ((_j = object.tournamentCastersAccountIds) === null || _j === void 0 ? void 0 : _j.map(e => e)) || []; message.tvRelaySteamid = object.tvRelaySteamid !== undefined && object.tvRelaySteamid !== null ? Long.fromValue(object.tvRelaySteamid) : Long.UZERO; message.preMatchData = object.preMatchData !== undefined && object.preMatchData !== null ? exports.CPreMatchInfoData.fromPartial(object.preMatchData) : undefined; message.rtime32EventStart = (_k = object.rtime32EventStart) !== null && _k !== void 0 ? _k : 0; message.tvControl = (_l = object.tvControl) !== null && _l !== void 0 ? _l : 0; return message; } }; function createBaseCMsgGCCStrike15V2MatchmakingServerReservationResponse() { return { reservationid: Long.UZERO, reservation: undefined, map: "", gcReservationSent: Long.UZERO, serverVersion: 0, tvInfo: undefined, rewardPlayerAccounts: [], idlePlayerAccounts: [], rewardItemAttrDefIdx: 0, rewardItemAttrValue: 0, rewardItemAttrRewardIdx: 0, rewardDropList: 0, tournamentTag: "", legacySteamdatagramPort: 0, steamdatagramRouting: 0, testToken: 0, flags: 0 }; } exports.CMsgGCCStrike15V2MatchmakingServerReservationResponse = { encode(message, writer = minimal_1.Writer.create()) { if (!message.reservationid.isZero()) { writer.uint32(8).uint64(message.reservationid); } if (message.reservation !== undefined) { exports.CMsgGCCStrike15V2MatchmakingGC2ServerReserve.encode(message.reservation, writer.uint32(18).fork()).ldelim(); } if (message.map !== "") { writer.uint32(26).string(message.map); } if (!message.gcReservationSent.isZero()) { writer.uint32(32).uint64(message.gcReservationSent); } if (message.serverVersion !== 0) { writer.uint32(40).uint32(message.serverVersion); } if (message.tvInfo !== undefined) { exports.ServerHltvInfo.encode(message.tvInfo, writer.uint32(50).fork()).ldelim(); } writer.uint32(58).fork(); for (const v of message.rewardPlayerAccounts) { writer.uint32(v); } writer.ldelim(); writer.uint32(66).fork(); for (const v of message.idlePlayerAccounts) { writer.uint32(v); } writer.ldelim(); if (message.rewardItemAttrDefIdx !== 0) { writer.uint32(72).uint32(message.rewardItemAttrDefIdx); } if (message.rewardItemAttrValue !== 0) { writer.uint32(80).uint32(message.rewardItemAttrValue); } if (message.rewardItemAttrRewardIdx !== 0) { writer.uint32(88).uint32(message.rewardItemAttrRewardIdx); } if (message.rewardDropList !== 0) { writer.uint32(96).uint32(message.rewardDropList); } if (message.tournamentTag !== "") { writer.uint32(106).string(message.tournamentTag); } if (message.legacySteamdatagramPort !== 0) { writer.uint32(112).uint32(message.legacySteamdatagramPort); } if (message.steamdatagramRouting !== 0) { writer.uint32(136).uint32(message.steamdatagramRouting); } if (message.testToken !== 0) { writer.uint32(125).fixed32(message.testToken); } if (message.flags !== 0) { writer.uint32(128).uint32(message.flags); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCMsgGCCStrike15V2MatchmakingServerReservationResponse(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.reservationid = reader.uint64(); break; case 2: message.reservation = exports.CMsgGCCStrike15V2MatchmakingGC2ServerReserve.decode(reader, reader.uint32()); break; case 3: message.map = reader.string(); break; case 4: message.gcReservationSent = reader.uint64(); break; case 5: message.serverVersion = reader.uint32(); break; case 6: message.tvInfo = exports.ServerHltvInfo.decode(reader, reader.uint32()); break; case 7: if ((tag & 7) === 2) { const end2 = reader.uint32() + reader.pos; while (reader.pos < end2) { message.rewardPlayerAccounts.push(reader.uint32()); } } else { message.rewardPlayerAccounts.push(reader.uint32()); } break; case 8: if ((tag & 7) === 2) { const end2 = reader.uint32() + reader.pos; while (reader.pos < end2) { message.idlePlayerAccounts.push(reader.uint32()); } } else { message.idlePlayerAccounts.push(reader.uint32()); } break; case 9: message.rewardItemAttrDefIdx = reader.uint32(); break; case 10: message.rewardItemAttrValue = reader.uint32(); break; case 11: message.rewardItemAttrRewardIdx = reader.uint32(); break; case 12: message.rewardDropList = reader.uint32(); break; case 13: message.tournamentTag = reader.string(); break; case 14: message.legacySteamdatagramPort = reader.uint32(); break; case 17: message.steamdatagramRouting = reader.uint32(); break; case 15: message.testToken = reader.fixed32(); break; case 16: message.flags = reader.uint32(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o; const message = createBaseCMsgGCCStrike15V2MatchmakingServerReservationResponse(); message.reservationid = object.reservationid !== undefined && object.reservationid !== null ? Long.fromValue(object.reservationid) : Long.UZERO; message.reservation = object.reservation !== undefined && object.reservation !== null ? exports.CMsgGCCStrike15V2MatchmakingGC2ServerReserve.fromPartial(object.reservation) : undefined; message.map = (_a = object.map) !== null && _a !== void 0 ? _a : ""; message.gcReservationSent = object.gcReservationSent !== undefined && object.gcReservationSent !== null ? Long.fromValue(object.gcReservationSent) : Long.UZERO; message.serverVersion = (_b = object.serverVersion) !== null && _b !== void 0 ? _b : 0; message.tvInfo = object.tvInfo !== undefined && object.tvInfo !== null ? exports.ServerHltvInfo.fromPartial(object.tvInfo) : undefined; message.rewardPlayerAccounts = ((_c = object.rewardPlayerAccounts) === null || _c === void 0 ? void 0 : _c.map(e => e)) || []; message.idlePlayerAccounts = ((_d = object.idlePlayerAccounts) === null || _d === void 0 ? void 0 : _d.map(e => e)) || []; message.rewardItemAttrDefIdx = (_e = object.rewardItemAttrDefIdx) !== null && _e !== void 0 ? _e : 0; message.rewardItemAttrValue = (_f = object.rewardItemAttrValue) !== null && _f !== void 0 ? _f : 0; message.rewardItemAttrRewardIdx = (_g = object.rewardItemAttrRewardIdx) !== null && _g !== void 0 ? _g : 0; message.rewardDropList = (_h = object.rewardDropList) !== null && _h !== void 0 ? _h : 0; message.tournamentTag = (_j = object.tournamentTag) !== null && _j !== void 0 ? _j : ""; message.legacySteamdatagramPort = (_k = object.legacySteamdatagramPort) !== null && _k !== void 0 ? _k : 0; message.steamdatagramRouting = (_l = object.steamdatagramRouting) !== null && _l !== void 0 ? _l : 0; message.testToken = (_m = object.testToken) !== null && _m !== void 0 ? _m : 0; message.flags = (_o = object.flags) !== null && _o !== void 0 ? _o : 0; return message; } }; function createBaseCMsgGCCStrike15V2MatchmakingGC2ClientReserve() { return { serverid: Long.UZERO, directUdpIp: 0, directUdpPort: 0, reservationid: Long.UZERO, reservation: undefined, map: "", serverAddress: "" }; } exports.CMsgGCCStrike15V2MatchmakingGC2ClientReserve = { encode(message, writer = minimal_1.Writer.create()) { if (!message.serverid.isZero()) { writer.uint32(8).uint64(message.serverid); } if (message.directUdpIp !== 0) { writer.uint32(16).uint32(message.directUdpIp); } if (message.directUdpPort !== 0) { writer.uint32(24).uint32(message.directUdpPort); } if (!message.reservationid.isZero()) { writer.uint32(32).uint64(message.reservationid); } if (message.reservation !== undefined) { exports.CMsgGCCStrike15V2MatchmakingGC2ServerReserve.encode(message.reservation, writer.uint32(42).fork()).ldelim(); } if (message.map !== "") { writer.uint32(50).string(message.map); } if (message.serverAddress !== "") { writer.uint32(58).string(message.serverAddress); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCMsgGCCStrike15V2MatchmakingGC2ClientReserve(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.serverid = reader.uint64(); break; case 2: message.directUdpIp = reader.uint32(); break; case 3: message.directUdpPort = reader.uint32(); break; case 4: message.reservationid = reader.uint64(); break; case 5: message.reservation = exports.CMsgGCCStrike15V2MatchmakingGC2ServerReserve.decode(reader, reader.uint32()); break; case 6: message.map = reader.string(); break; case 7: message.serverAddress = reader.string(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c, _d; const message = createBaseCMsgGCCStrike15V2MatchmakingGC2ClientReserve(); message.serverid = object.serverid !== undefined && object.serverid !== null ? Long.fromValue(object.serverid) : Long.UZERO; message.directUdpIp = (_a = object.directUdpIp) !== null && _a !== void 0 ? _a : 0; message.directUdpPort = (_b = object.directUdpPort) !== null && _b !== void 0 ? _b : 0; message.reservationid = object.reservationid !== undefined && object.reservationid !== null ? Long.fromValue(object.reservationid) : Long.UZERO; message.reservation = object.reservation !== undefined && object.reservation !== null ? exports.CMsgGCCStrike15V2MatchmakingGC2ServerReserve.fromPartial(object.reservation) : undefined; message.map = (_c = object.map) !== null && _c !== void 0 ? _c : ""; message.serverAddress = (_d = object.serverAddress) !== null && _d !== void 0 ? _d : ""; return message; } }; function createBaseCMsgGCCStrike15V2MatchmakingServerRoundStats() { return { reservationid: Long.UZERO, reservation: undefined, map: "", round: 0, kills: [], assists: [], deaths: [], scores: [], pings: [], roundResult: 0, matchResult: 0, teamScores: [], confirm: undefined, reservationStage: 0, matchDuration: 0, enemyKills: [], enemyHeadshots: [], enemy3ks: [], enemy4ks: [], enemy5ks: [], mvps: [], spectatorsCount: 0, spectatorsCountTv: 0, spectatorsCountLnk: 0, enemyKillsAgg: [], dropInfo: undefined, bSwitchedTeams: false, enemy2ks: [], playerSpawned: [], teamSpawnCount: [], maxRounds: 0 }; } exports.CMsgGCCStrike15V2MatchmakingServerRoundStats = { encode(message, writer = minimal_1.Writer.create()) { if (!message.reservationid.isZero()) { writer.uint32(8).uint64(message.reservationid); } if (message.reservation !== undefined) { exports.CMsgGCCStrike15V2MatchmakingGC2ServerReserve.encode(message.reservation, writer.uint32(18).fork()).ldelim(); } if (message.map !== "") { writer.uint32(26).string(message.map); } if (message.round !== 0) { writer.uint32(32).int32(message.round); } writer.uint32(42).fork(); for (const v of message.kills) { writer.int32(v); } writer.ldelim(); writer.uint32(50).fork(); for (const v of message.assists) { writer.int32(v); } writer.ldelim(); writer.uint32(58).fork(); for (const v of message.deaths) { writer.int32(v); } writer.ldelim(); writer.uint32(66).fork(); for (const v of message.scores) { writer.int32(v); } writer.ldelim(); writer.uint32(74).fork(); for (const v of message.pings) { writer.int32(v); } writer.ldelim(); if (message.roundResult !== 0) { writer.uint32(80).int32(message.roundResult); } if (message.matchResult !== 0) { writer.uint32(88).int32(message.matchResult); } writer.uint32(98).fork(); for (const v of message.teamScores) { writer.int32(v); } writer.ldelim(); if (message.confirm !== undefined) { exports.CMsgGCCStrike15V2MatchmakingGC2ServerConfirm.encode(message.confirm, writer.uint32(106).fork()).ldelim(); } if (message.reservationStage !== 0) { writer.uint32(112).int32(message.reservationStage); } if (message.matchDuration !== 0) { writer.uint32(120).int32(message.matchDuration); } writer.uint32(130).fork(); for (const v of message.enemyKills) { writer.int32(v); } writer.ldelim(); writer.uint32(138).fork(); for (const v of message.enemyHeadshots) { writer.int32(v); } writer.ldelim(); writer.uint32(146).fork(); for (const v of message.enemy3ks) { writer.int32(v); } writer.ldelim(); writer.uint32(154).fork(); for (const v of message.enemy4ks) { writer.int32(v); } writer.ldelim(); writer.uint32(162).fork(); for (const v of message.enemy5ks) { writer.int32(v); } writer.ldelim(); writer.uint32(170).fork(); for (const v of message.mvps) { writer.int32(v); } writer.ldelim(); if (message.spectatorsCount !== 0) { writer.uint32(176).uint32(message.spectatorsCount); } if (message.spectatorsCountTv !== 0) { writer.uint32(184).uint32(message.spectatorsCountTv); } if (message.spectatorsCountLnk !== 0) { writer.uint32(192).uint32(message.spectatorsCountLnk); } writer.uint32(202).fork(); for (const v of message.enemyKillsAgg) { writer.int32(v); } writer.ldelim(); if (message.dropInfo !== undefined) { exports.CMsgGCCStrike15V2MatchmakingServerRoundStats_DropInfo.encode(message.dropInfo, writer.uint32(210).fork()).ldelim(); } if (message.bSwitchedTeams === true) { writer.uint32(216).bool(message.bSwitchedTeams); } writer.uint32(226).fork(); for (const v of message.enemy2ks) { writer.int32(v); } writer.ldelim(); writer.uint32(234).fork(); for (const v of message.playerSpawned) { writer.int32(v); } writer.ldelim(); writer.uint32(242).fork(); for (const v of message.teamSpawnCount) { writer.int32(v); } writer.ldelim(); if (message.maxRounds !== 0) { writer.uint32(248).uint32(message.maxRounds); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCMsgGCCStrike15V2MatchmakingServerRoundStats(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.reservationid = reader.uint64(); break; case 2: message.reservation = exports.CMsgGCCStrike15V2MatchmakingGC2ServerReserve.decode(reader, reader.uint32()); break; case 3: message.map = reader.string(); break; case 4: message.round = reader.int32(); break; case 5: if ((tag & 7) === 2) { const end2 = reader.uint32() + reader.pos; while (reader.pos < end2) { message.kills.push(reader.int32()); } } else { message.kills.push(reader.int32()); } break; case 6: if ((tag & 7) === 2) { const end2 = reader.uint32() + reader.pos; while (reader.pos < end2) { message.assists.push(reader.int32()); } } else { message.assists.push(reader.int32()); } break; case 7: if ((tag & 7) === 2) { const end2 = reader.uint32() + reader.pos; while (reader.pos < end2) { message.deaths.push(reader.int32()); } } else { message.deaths.push(reader.int32()); } break; case 8: if ((tag & 7) === 2) { const end2 = reader.uint32() + reader.pos; while (reader.pos < end2) { message.scores.push(reader.int32()); } } else { message.scores.push(reader.int32()); } break; case 9: if ((tag & 7) === 2) { const end2 = reader.uint32() + reader.pos; while (reader.pos < end2) { message.pings.push(reader.int32()); } } else { message.pings.push(reader.int32()); } break; case 10: message.roundResult = reader.int32(); break; case 11: message.matchResult = reader.int32(); break; case 12: if ((tag & 7) === 2) { const end2 = reader.uint32() + reader.pos; while (reader.pos < end2) { message.teamScores.push(reader.int32()); } } else { message.teamScores.push(reader.int32()); } break; case 13: message.confirm = exports.CMsgGCCStrike15V2MatchmakingGC2ServerConfirm.decode(reader, reader.uint32()); break; case 14: message.reservationStage = reader.int32(); break; case 15: message.matchDuration = reader.int32(); break; case 16: if ((tag & 7) === 2) { const end2 = reader.uint32() + reader.pos; while (reader.pos < end2) { message.enemyKills.push(reader.int32()); } } else { message.enemyKills.push(reader.int32()); } break; case 17: if ((tag & 7) === 2) { const end2 = reader.uint32() + reader.pos; while (reader.pos < end2) { message.enemyHeadshots.push(reader.int32()); } } else { message.enemyHeadshots.push(reader.int32()); } break; case 18: if ((tag & 7) === 2) { const end2 = reader.uint32() + reader.pos; while (reader.pos < end2) { message.enemy3ks.push(reader.int32()); } } else { message.enemy3ks.push(reader.int32()); } break; case 19: if ((tag & 7) === 2) { const end2 = reader.uint32() + reader.pos; while (reader.pos < end2) { message.enemy4ks.push(reader.int32()); } } else { message.enemy4ks.push(reader.int32()); } break; case 20: if ((tag & 7) === 2) { const end2 = reader.uint32() + reader.pos; while (reader.pos < end2) { message.enemy5ks.push(reader.int32()); } } else { message.enemy5ks.push(reader.int32()); } break; case 21: if ((tag & 7) === 2) { const end2 = reader.uint32() + reader.pos; while (reader.pos < end2) { message.mvps.push(reader.int32()); } } else { message.mvps.push(reader.int32()); } break; case 22: message.spectatorsCount = reader.uint32(); break; case 23: message.spectatorsCountTv = reader.uint32(); break; case 24: message.spectatorsCountLnk = reader.uint32(); break; case 25: if ((tag & 7) === 2) { const end2 = reader.uint32() + reader.pos; while (reader.pos < end2) { message.enemyKillsAgg.push(reader.int32()); } } else { message.enemyKillsAgg.push(reader.int32()); } break; case 26: message.dropInfo = exports.CMsgGCCStrike15V2MatchmakingServerRoundStats_DropInfo.decode(reader, reader.uint32()); break; case 27: message.bSwitchedTeams = reader.bool(); break; case 28: if ((tag & 7) === 2) { const end2 = reader.uint32() + reader.pos; while (reader.pos < end2) { message.enemy2ks.push(reader.int32()); } } else { message.enemy2ks.push(reader.int32()); } break; case 29: if ((tag & 7) === 2) { const end2 = reader.uint32() + reader.pos; while (reader.pos < end2) { message.playerSpawned.push(reader.int32()); } } else { message.playerSpawned.push(reader.int32()); } break; case 30: if ((tag & 7) === 2) { const end2 = reader.uint32() + reader.pos; while (reader.pos < end2) { message.teamSpawnCount.push(reader.int32()); } } else { message.teamSpawnCount.push(reader.int32()); } break; case 31: message.maxRounds = reader.uint32(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _0, _1, _2; const message = createBaseCMsgGCCStrike15V2MatchmakingServerRoundStats(); message.reservationid = object.reservationid !== undefined && object.reservationid !== null ? Long.fromValue(object.reservationid) : Long.UZERO; message.reservation = object.reservation !== undefined && object.reservation !== null ? exports.CMsgGCCStrike15V2MatchmakingGC2ServerReserve.fromPartial(object.reservation) : undefined; message.map = (_a = object.map) !== null && _a !== void 0 ? _a : ""; message.round = (_b = object.round) !== null && _b !== void 0 ? _b : 0; message.kills = ((_c = object.kills) === null || _c === void 0 ? void 0 : _c.map(e => e)) || []; message.assists = ((_d = object.assists) === null || _d === void 0 ? void 0 : _d.map(e => e)) || []; message.deaths = ((_e = object.deaths) === null || _e === void 0 ? void 0 : _e.map(e => e)) || []; message.scores = ((_f = object.scores) === null || _f === void 0 ? void 0 : _f.map(e => e)) || []; message.pings = ((_g = object.pings) === null || _g === void 0 ? void 0 : _g.map(e => e)) || []; message.roundResult = (_h = object.roundResult) !== null && _h !== void 0 ? _h : 0; message.matchResult = (_j = object.matchResult) !== null && _j !== void 0 ? _j : 0; message.teamScores = ((_k = object.teamScores) === null || _k === void 0 ? void 0 : _k.map(e => e)) || []; message.confirm = object.confirm !== undefined && object.confirm !== null ? exports.CMsgGCCStrike15V2MatchmakingGC2ServerConfirm.fromPartial(object.confirm) : undefined; message.reservationStage = (_l = object.reservationStage) !== null && _l !== void 0 ? _l : 0; message.matchDuration = (_m = object.matchDuration) !== null && _m !== void 0 ? _m : 0; message.enemyKills = ((_o = object.enemyKills) === null || _o === void 0 ? void 0 : _o.map(e => e)) || []; message.enemyHeadshots = ((_p = object.enemyHeadshots) === null || _p === void 0 ? void 0 : _p.map(e => e)) || []; message.enemy3ks = ((_q = object.enemy3ks) === null || _q === void 0 ? void 0 : _q.map(e => e)) || []; message.enemy4ks = ((_r = object.enemy4ks) === null || _r === void 0 ? void 0 : _r.map(e => e)) || []; message.enemy5ks = ((_s = object.enemy5ks) === null || _s === void 0 ? void 0 : _s.map(e => e)) || []; message.mvps = ((_t = object.mvps) === null || _t === void 0 ? void 0 : _t.map(e => e)) || []; message.spectatorsCount = (_u = object.spectatorsCount) !== null && _u !== void 0 ? _u : 0; message.spectatorsCountTv = (_v = object.spectatorsCountTv) !== null && _v !== void 0 ? _v : 0; message.spectatorsCountLnk = (_w = object.spectatorsCountLnk) !== null && _w !== void 0 ? _w : 0; message.enemyKillsAgg = ((_x = object.enemyKillsAgg) === null || _x === void 0 ? void 0 : _x.map(e => e)) || []; message.dropInfo = object.dropInfo !== undefined && object.dropInfo !== null ? exports.CMsgGCCStrike15V2MatchmakingServerRoundStats_DropInfo.fromPartial(object.dropInfo) : undefined; message.bSwitchedTeams = (_y = object.bSwitchedTeams) !== null && _y !== void 0 ? _y : false; message.enemy2ks = ((_z = object.enemy2ks) === null || _z === void 0 ? void 0 : _z.map(e => e)) || []; message.playerSpawned = ((_0 = object.playerSpawned) === null || _0 === void 0 ? void 0 : _0.map(e => e)) || []; message.teamSpawnCount = ((_1 = object.teamSpawnCount) === null || _1 === void 0 ? void 0 : _1.map(e => e)) || []; message.maxRounds = (_2 = object.maxRounds) !== null && _2 !== void 0 ? _2 : 0; return message; } }; function createBaseCMsgGCCStrike15V2MatchmakingServerRoundStats_DropInfo() { return { accountMvp: 0 }; } exports.CMsgGCCStrike15V2MatchmakingServerRoundStats_DropInfo = { encode(message, writer = minimal_1.Writer.create()) { if (message.accountMvp !== 0) { writer.uint32(8).uint32(message.accountMvp); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCMsgGCCStrike15V2MatchmakingServerRoundStats_DropInfo(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.accountMvp = reader.uint32(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a; const message = createBaseCMsgGCCStrike15V2MatchmakingServerRoundStats_DropInfo(); message.accountMvp = (_a = object.accountMvp) !== null && _a !== void 0 ? _a : 0; return message; } }; function createBaseCMsgGCCStrike15V2MatchmakingClient2GCHello() { return {}; } exports.CMsgGCCStrike15V2MatchmakingClient2GCHello = { encode(_, writer = minimal_1.Writer.create()) { return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCMsgGCCStrike15V2MatchmakingClient2GCHello(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(_) { const message = createBaseCMsgGCCStrike15V2MatchmakingClient2GCHello(); return message; } }; function createBaseCMsgGCCStrike15V2MatchmakingGC2ClientHello() { return { accountId: 0, ongoingmatch: undefined, globalStats: undefined, penaltySeconds: 0, penaltyReason: 0, vacBanned: 0, ranking: undefined, commendation: undefined, medals: undefined, myCurrentEvent: undefined, myCurrentEventTeams: [], myCurrentTeam: undefined, myCurrentEventStages: [], surveyVote: 0, activity: undefined, playerLevel: 0, playerCurXp: 0, playerXpBonusFlags: 0, rankings: [] }; } exports.CMsgGCCStrike15V2MatchmakingGC2ClientHello = { encode(message, writer = minimal_1.Writer.create()) { if (message.accountId !== 0) { writer.uint32(8).uint32(message.accountId); } if (message.ongoingmatch !== undefined) { exports.CMsgGCCStrike15V2MatchmakingGC2ClientReserve.encode(message.ongoingmatch, writer.uint32(18).fork()).ldelim(); } if (message.globalStats !== undefined) { exports.GlobalStatistics.encode(message.globalStats, writer.uint32(26).fork()).ldelim(); } if (message.penaltySeconds !== 0) { writer.uint32(32).uint32(message.penaltySeconds); } if (message.penaltyReason !== 0) { writer.uint32(40).uint32(message.penaltyReason); } if (message.vacBanned !== 0) { writer.uint32(48).int32(message.vacBanned); } if (message.ranking !== undefined) { exports.PlayerRankingInfo.encode(message.ranking, writer.uint32(58).fork()).ldelim(); } if (message.commendation !== undefined) { exports.PlayerCommendationInfo.encode(message.commendation, writer.uint32(66).fork()).ldelim(); } if (message.medals !== undefined) { exports.PlayerMedalsInfo.encode(message.medals, writer.uint32(74).fork()).ldelim(); } if (message.myCurrentEvent !== undefined) { exports.TournamentEvent.encode(message.myCurrentEvent, writer.uint32(82).fork()).ldelim(); } for (const v of message.myCurrentEventTeams) { exports.TournamentTeam.encode(v, writer.uint32(90).fork()).ldelim(); } if (message.myCurrentTeam !== undefined) { exports.TournamentTeam.encode(message.myCurrentTeam, writer.uint32(98).fork()).ldelim(); } for (const v of message.myCurrentEventStages) { exports.TournamentEvent.encode(v, writer.uint32(106).fork()).ldelim(); } if (message.surveyVote !== 0) { writer.uint32(112).uint32(message.surveyVote); } if (message.activity !== undefined) { exports.AccountActivity.encode(message.activity, writer.uint32(122).fork()).ldelim(); } if (message.playerLevel !== 0) { writer.uint32(136).int32(message.playerLevel); } if (message.playerCurXp !== 0) { writer.uint32(144).int32(message.playerCurXp); } if (message.playerXpBonusFlags !== 0) { writer.uint32(152).int32(message.playerXpBonusFlags); } for (const v of message.rankings) { exports.PlayerRankingInfo.encode(v, writer.uint32(162).fork()).ldelim(); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCMsgGCCStrike15V2MatchmakingGC2ClientHello(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.accountId = reader.uint32(); break; case 2: message.ongoingmatch = exports.CMsgGCCStrike15V2MatchmakingGC2ClientReserve.decode(reader, reader.uint32()); break; case 3: message.globalStats = exports.GlobalStatistics.decode(reader, reader.uint32()); break; case 4: message.penaltySeconds = reader.uint32(); break; case 5: message.penaltyReason = reader.uint32(); break; case 6: message.vacBanned = reader.int32(); break; case 7: message.ranking = exports.PlayerRankingInfo.decode(reader, reader.uint32()); break; case 8: message.commendation = exports.PlayerCommendationInfo.decode(reader, reader.uint32()); break; case 9: message.medals = exports.PlayerMedalsInfo.decode(reader, reader.uint32()); break; case 10: message.myCurrentEvent = exports.TournamentEvent.decode(reader, reader.uint32()); break; case 11: message.myCurrentEventTeams.push(exports.TournamentTeam.decode(reader, reader.uint32())); break; case 12: message.myCurrentTeam = exports.TournamentTeam.decode(reader, reader.uint32()); break; case 13: message.myCurrentEventStages.push(exports.TournamentEvent.decode(reader, reader.uint32())); break; case 14: message.surveyVote = reader.uint32(); break; case 15: message.activity = exports.AccountActivity.decode(reader, reader.uint32()); break; case 17: message.playerLevel = reader.int32(); break; case 18: message.playerCurXp = reader.int32(); break; case 19: message.playerXpBonusFlags = reader.int32(); break; case 20: message.rankings.push(exports.PlayerRankingInfo.decode(reader, reader.uint32())); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l; const message = createBaseCMsgGCCStrike15V2MatchmakingGC2ClientHello(); message.accountId = (_a = object.accountId) !== null && _a !== void 0 ? _a : 0; message.ongoingmatch = object.ongoingmatch !== undefined && object.ongoingmatch !== null ? exports.CMsgGCCStrike15V2MatchmakingGC2ClientReserve.fromPartial(object.ongoingmatch) : undefined; message.globalStats = object.globalStats !== undefined && object.globalStats !== null ? exports.GlobalStatistics.fromPartial(object.globalStats) : undefined; message.penaltySeconds = (_b = object.penaltySeconds) !== null && _b !== void 0 ? _b : 0; message.penaltyReason = (_c = object.penaltyReason) !== null && _c !== void 0 ? _c : 0; message.vacBanned = (_d = object.vacBanned) !== null && _d !== void 0 ? _d : 0; message.ranking = object.ranking !== undefined && object.ranking !== null ? exports.PlayerRankingInfo.fromPartial(object.ranking) : undefined; message.commendation = object.commendation !== undefined && object.commendation !== null ? exports.PlayerCommendationInfo.fromPartial(object.commendation) : undefined; message.medals = object.medals !== undefined && object.medals !== null ? exports.PlayerMedalsInfo.fromPartial(object.medals) : undefined; message.myCurrentEvent = object.myCurrentEvent !== undefined && object.myCurrentEvent !== null ? exports.TournamentEvent.fromPartial(object.myCurrentEvent) : undefined; message.myCurrentEventTeams = ((_e = object.myCurrentEventTeams) === null || _e === void 0 ? void 0 : _e.map(e => exports.TournamentTeam.fromPartial(e))) || []; message.myCurrentTeam = object.myCurrentTeam !== undefined && object.myCurrentTeam !== null ? exports.TournamentTeam.fromPartial(object.myCurrentTeam) : undefined; message.myCurrentEventStages = ((_f = object.myCurrentEventStages) === null || _f === void 0 ? void 0 : _f.map(e => exports.TournamentEvent.fromPartial(e))) || []; message.surveyVote = (_g = object.surveyVote) !== null && _g !== void 0 ? _g : 0; message.activity = object.activity !== undefined && object.activity !== null ? exports.AccountActivity.fromPartial(object.activity) : undefined; message.playerLevel = (_h = object.playerLevel) !== null && _h !== void 0 ? _h : 0; message.playerCurXp = (_j = object.playerCurXp) !== null && _j !== void 0 ? _j : 0; message.playerXpBonusFlags = (_k = object.playerXpBonusFlags) !== null && _k !== void 0 ? _k : 0; message.rankings = ((_l = object.rankings) === null || _l === void 0 ? void 0 : _l.map(e => exports.PlayerRankingInfo.fromPartial(e))) || []; return message; } }; function createBaseCMsgGCCStrike15V2AccountPrivacySettings() { return { settings: [] }; } exports.CMsgGCCStrike15V2AccountPrivacySettings = { encode(message, writer = minimal_1.Writer.create()) { for (const v of message.settings) { exports.CMsgGCCStrike15V2AccountPrivacySettings_Setting.encode(v, writer.uint32(10).fork()).ldelim(); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCMsgGCCStrike15V2AccountPrivacySettings(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.settings.push(exports.CMsgGCCStrike15V2AccountPrivacySettings_Setting.decode(reader, reader.uint32())); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a; const message = createBaseCMsgGCCStrike15V2AccountPrivacySettings(); message.settings = ((_a = object.settings) === null || _a === void 0 ? void 0 : _a.map(e => exports.CMsgGCCStrike15V2AccountPrivacySettings_Setting.fromPartial(e))) || []; return message; } }; function createBaseCMsgGCCStrike15V2AccountPrivacySettings_Setting() { return { settingType: 0, settingValue: 0 }; } exports.CMsgGCCStrike15V2AccountPrivacySettings_Setting = { encode(message, writer = minimal_1.Writer.create()) { if (message.settingType !== 0) { writer.uint32(8).uint32(message.settingType); } if (message.settingValue !== 0) { writer.uint32(16).uint32(message.settingValue); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCMsgGCCStrike15V2AccountPrivacySettings_Setting(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.settingType = reader.uint32(); break; case 2: message.settingValue = reader.uint32(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b; const message = createBaseCMsgGCCStrike15V2AccountPrivacySettings_Setting(); message.settingType = (_a = object.settingType) !== null && _a !== void 0 ? _a : 0; message.settingValue = (_b = object.settingValue) !== null && _b !== void 0 ? _b : 0; return message; } }; function createBaseCMsgGCCStrike15V2MatchmakingGC2ClientAbandon() { return { accountId: 0, abandonedMatch: undefined, penaltySeconds: 0, penaltyReason: 0 }; } exports.CMsgGCCStrike15V2MatchmakingGC2ClientAbandon = { encode(message, writer = minimal_1.Writer.create()) { if (message.accountId !== 0) { writer.uint32(8).uint32(message.accountId); } if (message.abandonedMatch !== undefined) { exports.CMsgGCCStrike15V2MatchmakingGC2ClientReserve.encode(message.abandonedMatch, writer.uint32(18).fork()).ldelim(); } if (message.penaltySeconds !== 0) { writer.uint32(24).uint32(message.penaltySeconds); } if (message.penaltyReason !== 0) { writer.uint32(32).uint32(message.penaltyReason); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCMsgGCCStrike15V2MatchmakingGC2ClientAbandon(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.accountId = reader.uint32(); break; case 2: message.abandonedMatch = exports.CMsgGCCStrike15V2MatchmakingGC2ClientReserve.decode(reader, reader.uint32()); break; case 3: message.penaltySeconds = reader.uint32(); break; case 4: message.penaltyReason = reader.uint32(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c; const message = createBaseCMsgGCCStrike15V2MatchmakingGC2ClientAbandon(); message.accountId = (_a = object.accountId) !== null && _a !== void 0 ? _a : 0; message.abandonedMatch = object.abandonedMatch !== undefined && object.abandonedMatch !== null ? exports.CMsgGCCStrike15V2MatchmakingGC2ClientReserve.fromPartial(object.abandonedMatch) : undefined; message.penaltySeconds = (_b = object.penaltySeconds) !== null && _b !== void 0 ? _b : 0; message.penaltyReason = (_c = object.penaltyReason) !== null && _c !== void 0 ? _c : 0; return message; } }; function createBaseCMsgGCCStrike15V2ClientGCRankUpdate() { return { rankings: [] }; } exports.CMsgGCCStrike15V2ClientGCRankUpdate = { encode(message, writer = minimal_1.Writer.create()) { for (const v of message.rankings) { exports.PlayerRankingInfo.encode(v, writer.uint32(10).fork()).ldelim(); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCMsgGCCStrike15V2ClientGCRankUpdate(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.rankings.push(exports.PlayerRankingInfo.decode(reader, reader.uint32())); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a; const message = createBaseCMsgGCCStrike15V2ClientGCRankUpdate(); message.rankings = ((_a = object.rankings) === null || _a === void 0 ? void 0 : _a.map(e => exports.PlayerRankingInfo.fromPartial(e))) || []; return message; } }; function createBaseCMsgGCCStrike15V2MatchmakingOperator2GCBlogUpdate() { return { mainPostUrl: "" }; } exports.CMsgGCCStrike15V2MatchmakingOperator2GCBlogUpdate = { encode(message, writer = minimal_1.Writer.create()) { if (message.mainPostUrl !== "") { writer.uint32(10).string(message.mainPostUrl); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCMsgGCCStrike15V2MatchmakingOperator2GCBlogUpdate(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.mainPostUrl = reader.string(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a; const message = createBaseCMsgGCCStrike15V2MatchmakingOperator2GCBlogUpdate(); message.mainPostUrl = (_a = object.mainPostUrl) !== null && _a !== void 0 ? _a : ""; return message; } }; function createBaseCMsgGCCStrike15V2ServerNotificationForUserPenalty() { return { accountId: 0, reason: 0, seconds: 0, communicationCooldown: false }; } exports.CMsgGCCStrike15V2ServerNotificationForUserPenalty = { encode(message, writer = minimal_1.Writer.create()) { if (message.accountId !== 0) { writer.uint32(8).uint32(message.accountId); } if (message.reason !== 0) { writer.uint32(16).uint32(message.reason); } if (message.seconds !== 0) { writer.uint32(24).uint32(message.seconds); } if (message.communicationCooldown === true) { writer.uint32(32).bool(message.communicationCooldown); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCMsgGCCStrike15V2ServerNotificationForUserPenalty(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.accountId = reader.uint32(); break; case 2: message.reason = reader.uint32(); break; case 3: message.seconds = reader.uint32(); break; case 4: message.communicationCooldown = reader.bool(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c, _d; const message = createBaseCMsgGCCStrike15V2ServerNotificationForUserPenalty(); message.accountId = (_a = object.accountId) !== null && _a !== void 0 ? _a : 0; message.reason = (_b = object.reason) !== null && _b !== void 0 ? _b : 0; message.seconds = (_c = object.seconds) !== null && _c !== void 0 ? _c : 0; message.communicationCooldown = (_d = object.communicationCooldown) !== null && _d !== void 0 ? _d : false; return message; } }; function createBaseCMsgGCCStrike15V2ClientReportPlayer() { return { accountId: 0, rptAimbot: 0, rptWallhack: 0, rptSpeedhack: 0, rptTeamharm: 0, rptTextabuse: 0, rptVoiceabuse: 0, matchId: Long.UZERO, reportFromDemo: false }; } exports.CMsgGCCStrike15V2ClientReportPlayer = { encode(message, writer = minimal_1.Writer.create()) { if (message.accountId !== 0) { writer.uint32(8).uint32(message.accountId); } if (message.rptAimbot !== 0) { writer.uint32(16).uint32(message.rptAimbot); } if (message.rptWallhack !== 0) { writer.uint32(24).uint32(message.rptWallhack); } if (message.rptSpeedhack !== 0) { writer.uint32(32).uint32(message.rptSpeedhack); } if (message.rptTeamharm !== 0) { writer.uint32(40).uint32(message.rptTeamharm); } if (message.rptTextabuse !== 0) { writer.uint32(48).uint32(message.rptTextabuse); } if (message.rptVoiceabuse !== 0) { writer.uint32(56).uint32(message.rptVoiceabuse); } if (!message.matchId.isZero()) { writer.uint32(64).uint64(message.matchId); } if (message.reportFromDemo === true) { writer.uint32(72).bool(message.reportFromDemo); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCMsgGCCStrike15V2ClientReportPlayer(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.accountId = reader.uint32(); break; case 2: message.rptAimbot = reader.uint32(); break; case 3: message.rptWallhack = reader.uint32(); break; case 4: message.rptSpeedhack = reader.uint32(); break; case 5: message.rptTeamharm = reader.uint32(); break; case 6: message.rptTextabuse = reader.uint32(); break; case 7: message.rptVoiceabuse = reader.uint32(); break; case 8: message.matchId = reader.uint64(); break; case 9: message.reportFromDemo = reader.bool(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c, _d, _e, _f, _g, _h; const message = createBaseCMsgGCCStrike15V2ClientReportPlayer(); message.accountId = (_a = object.accountId) !== null && _a !== void 0 ? _a : 0; message.rptAimbot = (_b = object.rptAimbot) !== null && _b !== void 0 ? _b : 0; message.rptWallhack = (_c = object.rptWallhack) !== null && _c !== void 0 ? _c : 0; message.rptSpeedhack = (_d = object.rptSpeedhack) !== null && _d !== void 0 ? _d : 0; message.rptTeamharm = (_e = object.rptTeamharm) !== null && _e !== void 0 ? _e : 0; message.rptTextabuse = (_f = object.rptTextabuse) !== null && _f !== void 0 ? _f : 0; message.rptVoiceabuse = (_g = object.rptVoiceabuse) !== null && _g !== void 0 ? _g : 0; message.matchId = object.matchId !== undefined && object.matchId !== null ? Long.fromValue(object.matchId) : Long.UZERO; message.reportFromDemo = (_h = object.reportFromDemo) !== null && _h !== void 0 ? _h : false; return message; } }; function createBaseCMsgGCCStrike15V2ClientCommendPlayer() { return { accountId: 0, matchId: Long.UZERO, commendation: undefined, tokens: 0 }; } exports.CMsgGCCStrike15V2ClientCommendPlayer = { encode(message, writer = minimal_1.Writer.create()) { if (message.accountId !== 0) { writer.uint32(8).uint32(message.accountId); } if (!message.matchId.isZero()) { writer.uint32(64).uint64(message.matchId); } if (message.commendation !== undefined) { exports.PlayerCommendationInfo.encode(message.commendation, writer.uint32(74).fork()).ldelim(); } if (message.tokens !== 0) { writer.uint32(80).uint32(message.tokens); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCMsgGCCStrike15V2ClientCommendPlayer(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.accountId = reader.uint32(); break; case 8: message.matchId = reader.uint64(); break; case 9: message.commendation = exports.PlayerCommendationInfo.decode(reader, reader.uint32()); break; case 10: message.tokens = reader.uint32(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b; const message = createBaseCMsgGCCStrike15V2ClientCommendPlayer(); message.accountId = (_a = object.accountId) !== null && _a !== void 0 ? _a : 0; message.matchId = object.matchId !== undefined && object.matchId !== null ? Long.fromValue(object.matchId) : Long.UZERO; message.commendation = object.commendation !== undefined && object.commendation !== null ? exports.PlayerCommendationInfo.fromPartial(object.commendation) : undefined; message.tokens = (_b = object.tokens) !== null && _b !== void 0 ? _b : 0; return message; } }; function createBaseCMsgGCCStrike15V2ClientReportServer() { return { rptPoorperf: 0, rptAbusivemodels: 0, rptBadmotd: 0, rptListingabuse: 0, rptInventoryabuse: 0, matchId: Long.UZERO }; } exports.CMsgGCCStrike15V2ClientReportServer = { encode(message, writer = minimal_1.Writer.create()) { if (message.rptPoorperf !== 0) { writer.uint32(8).uint32(message.rptPoorperf); } if (message.rptAbusivemodels !== 0) { writer.uint32(16).uint32(message.rptAbusivemodels); } if (message.rptBadmotd !== 0) { writer.uint32(24).uint32(message.rptBadmotd); } if (message.rptListingabuse !== 0) { writer.uint32(32).uint32(message.rptListingabuse); } if (message.rptInventoryabuse !== 0) { writer.uint32(40).uint32(message.rptInventoryabuse); } if (!message.matchId.isZero()) { writer.uint32(64).uint64(message.matchId); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCMsgGCCStrike15V2ClientReportServer(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.rptPoorperf = reader.uint32(); break; case 2: message.rptAbusivemodels = reader.uint32(); break; case 3: message.rptBadmotd = reader.uint32(); break; case 4: message.rptListingabuse = reader.uint32(); break; case 5: message.rptInventoryabuse = reader.uint32(); break; case 8: message.matchId = reader.uint64(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c, _d, _e; const message = createBaseCMsgGCCStrike15V2ClientReportServer(); message.rptPoorperf = (_a = object.rptPoorperf) !== null && _a !== void 0 ? _a : 0; message.rptAbusivemodels = (_b = object.rptAbusivemodels) !== null && _b !== void 0 ? _b : 0; message.rptBadmotd = (_c = object.rptBadmotd) !== null && _c !== void 0 ? _c : 0; message.rptListingabuse = (_d = object.rptListingabuse) !== null && _d !== void 0 ? _d : 0; message.rptInventoryabuse = (_e = object.rptInventoryabuse) !== null && _e !== void 0 ? _e : 0; message.matchId = object.matchId !== undefined && object.matchId !== null ? Long.fromValue(object.matchId) : Long.UZERO; return message; } }; function createBaseCMsgGCCStrike15V2ClientReportResponse() { return { confirmationId: Long.UZERO, accountId: 0, serverIp: 0, responseType: 0, responseResult: 0, tokens: 0 }; } exports.CMsgGCCStrike15V2ClientReportResponse = { encode(message, writer = minimal_1.Writer.create()) { if (!message.confirmationId.isZero()) { writer.uint32(8).uint64(message.confirmationId); } if (message.accountId !== 0) { writer.uint32(16).uint32(message.accountId); } if (message.serverIp !== 0) { writer.uint32(24).uint32(message.serverIp); } if (message.responseType !== 0) { writer.uint32(32).uint32(message.responseType); } if (message.responseResult !== 0) { writer.uint32(40).uint32(message.responseResult); } if (message.tokens !== 0) { writer.uint32(48).uint32(message.tokens); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCMsgGCCStrike15V2ClientReportResponse(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.confirmationId = reader.uint64(); break; case 2: message.accountId = reader.uint32(); break; case 3: message.serverIp = reader.uint32(); break; case 4: message.responseType = reader.uint32(); break; case 5: message.responseResult = reader.uint32(); break; case 6: message.tokens = reader.uint32(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c, _d, _e; const message = createBaseCMsgGCCStrike15V2ClientReportResponse(); message.confirmationId = object.confirmationId !== undefined && object.confirmationId !== null ? Long.fromValue(object.confirmationId) : Long.UZERO; message.accountId = (_a = object.accountId) !== null && _a !== void 0 ? _a : 0; message.serverIp = (_b = object.serverIp) !== null && _b !== void 0 ? _b : 0; message.responseType = (_c = object.responseType) !== null && _c !== void 0 ? _c : 0; message.responseResult = (_d = object.responseResult) !== null && _d !== void 0 ? _d : 0; message.tokens = (_e = object.tokens) !== null && _e !== void 0 ? _e : 0; return message; } }; function createBaseCMsgGCCStrike15V2ClientRequestWatchInfoFriends() { return { requestId: 0, accountIds: [], serverid: Long.UZERO, matchid: Long.UZERO, clientLauncher: 0, dataCenterPings: [] }; } exports.CMsgGCCStrike15V2ClientRequestWatchInfoFriends = { encode(message, writer = minimal_1.Writer.create()) { if (message.requestId !== 0) { writer.uint32(8).uint32(message.requestId); } writer.uint32(18).fork(); for (const v of message.accountIds) { writer.uint32(v); } writer.ldelim(); if (!message.serverid.isZero()) { writer.uint32(24).uint64(message.serverid); } if (!message.matchid.isZero()) { writer.uint32(32).uint64(message.matchid); } if (message.clientLauncher !== 0) { writer.uint32(40).uint32(message.clientLauncher); } for (const v of message.dataCenterPings) { exports.DataCenterPing.encode(v, writer.uint32(50).fork()).ldelim(); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCMsgGCCStrike15V2ClientRequestWatchInfoFriends(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.requestId = reader.uint32(); break; case 2: if ((tag & 7) === 2) { const end2 = reader.uint32() + reader.pos; while (reader.pos < end2) { message.accountIds.push(reader.uint32()); } } else { message.accountIds.push(reader.uint32()); } break; case 3: message.serverid = reader.uint64(); break; case 4: message.matchid = reader.uint64(); break; case 5: message.clientLauncher = reader.uint32(); break; case 6: message.dataCenterPings.push(exports.DataCenterPing.decode(reader, reader.uint32())); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c, _d; const message = createBaseCMsgGCCStrike15V2ClientRequestWatchInfoFriends(); message.requestId = (_a = object.requestId) !== null && _a !== void 0 ? _a : 0; message.accountIds = ((_b = object.accountIds) === null || _b === void 0 ? void 0 : _b.map(e => e)) || []; message.serverid = object.serverid !== undefined && object.serverid !== null ? Long.fromValue(object.serverid) : Long.UZERO; message.matchid = object.matchid !== undefined && object.matchid !== null ? Long.fromValue(object.matchid) : Long.UZERO; message.clientLauncher = (_c = object.clientLauncher) !== null && _c !== void 0 ? _c : 0; message.dataCenterPings = ((_d = object.dataCenterPings) === null || _d === void 0 ? void 0 : _d.map(e => exports.DataCenterPing.fromPartial(e))) || []; return message; } }; function createBaseWatchableMatchInfo() { return { serverIp: 0, tvPort: 0, tvSpectators: 0, tvTime: 0, tvWatchPassword: new Uint8Array(), clDecryptdataKey: Long.UZERO, clDecryptdataKeyPub: Long.UZERO, gameType: 0, gameMapgroup: "", gameMap: "", serverId: Long.UZERO, matchId: Long.UZERO, reservationId: Long.UZERO }; } exports.WatchableMatchInfo = { encode(message, writer = minimal_1.Writer.create()) { if (message.serverIp !== 0) { writer.uint32(8).uint32(message.serverIp); } if (message.tvPort !== 0) { writer.uint32(16).uint32(message.tvPort); } if (message.tvSpectators !== 0) { writer.uint32(24).uint32(message.tvSpectators); } if (message.tvTime !== 0) { writer.uint32(32).uint32(message.tvTime); } if (message.tvWatchPassword.length !== 0) { writer.uint32(42).bytes(message.tvWatchPassword); } if (!message.clDecryptdataKey.isZero()) { writer.uint32(48).uint64(message.clDecryptdataKey); } if (!message.clDecryptdataKeyPub.isZero()) { writer.uint32(56).uint64(message.clDecryptdataKeyPub); } if (message.gameType !== 0) { writer.uint32(64).uint32(message.gameType); } if (message.gameMapgroup !== "") { writer.uint32(74).string(message.gameMapgroup); } if (message.gameMap !== "") { writer.uint32(82).string(message.gameMap); } if (!message.serverId.isZero()) { writer.uint32(88).uint64(message.serverId); } if (!message.matchId.isZero()) { writer.uint32(96).uint64(message.matchId); } if (!message.reservationId.isZero()) { writer.uint32(104).uint64(message.reservationId); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseWatchableMatchInfo(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.serverIp = reader.uint32(); break; case 2: message.tvPort = reader.uint32(); break; case 3: message.tvSpectators = reader.uint32(); break; case 4: message.tvTime = reader.uint32(); break; case 5: message.tvWatchPassword = reader.bytes(); break; case 6: message.clDecryptdataKey = reader.uint64(); break; case 7: message.clDecryptdataKeyPub = reader.uint64(); break; case 8: message.gameType = reader.uint32(); break; case 9: message.gameMapgroup = reader.string(); break; case 10: message.gameMap = reader.string(); break; case 11: message.serverId = reader.uint64(); break; case 12: message.matchId = reader.uint64(); break; case 13: message.reservationId = reader.uint64(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c, _d, _e, _f, _g, _h; const message = createBaseWatchableMatchInfo(); message.serverIp = (_a = object.serverIp) !== null && _a !== void 0 ? _a : 0; message.tvPort = (_b = object.tvPort) !== null && _b !== void 0 ? _b : 0; message.tvSpectators = (_c = object.tvSpectators) !== null && _c !== void 0 ? _c : 0; message.tvTime = (_d = object.tvTime) !== null && _d !== void 0 ? _d : 0; message.tvWatchPassword = (_e = object.tvWatchPassword) !== null && _e !== void 0 ? _e : new Uint8Array(); message.clDecryptdataKey = object.clDecryptdataKey !== undefined && object.clDecryptdataKey !== null ? Long.fromValue(object.clDecryptdataKey) : Long.UZERO; message.clDecryptdataKeyPub = object.clDecryptdataKeyPub !== undefined && object.clDecryptdataKeyPub !== null ? Long.fromValue(object.clDecryptdataKeyPub) : Long.UZERO; message.gameType = (_f = object.gameType) !== null && _f !== void 0 ? _f : 0; message.gameMapgroup = (_g = object.gameMapgroup) !== null && _g !== void 0 ? _g : ""; message.gameMap = (_h = object.gameMap) !== null && _h !== void 0 ? _h : ""; message.serverId = object.serverId !== undefined && object.serverId !== null ? Long.fromValue(object.serverId) : Long.UZERO; message.matchId = object.matchId !== undefined && object.matchId !== null ? Long.fromValue(object.matchId) : Long.UZERO; message.reservationId = object.reservationId !== undefined && object.reservationId !== null ? Long.fromValue(object.reservationId) : Long.UZERO; return message; } }; function createBaseCMsgGCCStrike15V2ClientRequestJoinFriendData() { return { version: 0, accountId: 0, joinToken: 0, joinIpp: 0, res: undefined, errormsg: "" }; } exports.CMsgGCCStrike15V2ClientRequestJoinFriendData = { encode(message, writer = minimal_1.Writer.create()) { if (message.version !== 0) { writer.uint32(8).uint32(message.version); } if (message.accountId !== 0) { writer.uint32(16).uint32(message.accountId); } if (message.joinToken !== 0) { writer.uint32(24).uint32(message.joinToken); } if (message.joinIpp !== 0) { writer.uint32(32).uint32(message.joinIpp); } if (message.res !== undefined) { exports.CMsgGCCStrike15V2MatchmakingGC2ClientReserve.encode(message.res, writer.uint32(42).fork()).ldelim(); } if (message.errormsg !== "") { writer.uint32(50).string(message.errormsg); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCMsgGCCStrike15V2ClientRequestJoinFriendData(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.version = reader.uint32(); break; case 2: message.accountId = reader.uint32(); break; case 3: message.joinToken = reader.uint32(); break; case 4: message.joinIpp = reader.uint32(); break; case 5: message.res = exports.CMsgGCCStrike15V2MatchmakingGC2ClientReserve.decode(reader, reader.uint32()); break; case 6: message.errormsg = reader.string(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c, _d, _e; const message = createBaseCMsgGCCStrike15V2ClientRequestJoinFriendData(); message.version = (_a = object.version) !== null && _a !== void 0 ? _a : 0; message.accountId = (_b = object.accountId) !== null && _b !== void 0 ? _b : 0; message.joinToken = (_c = object.joinToken) !== null && _c !== void 0 ? _c : 0; message.joinIpp = (_d = object.joinIpp) !== null && _d !== void 0 ? _d : 0; message.res = object.res !== undefined && object.res !== null ? exports.CMsgGCCStrike15V2MatchmakingGC2ClientReserve.fromPartial(object.res) : undefined; message.errormsg = (_e = object.errormsg) !== null && _e !== void 0 ? _e : ""; return message; } }; function createBaseCMsgGCCStrike15V2ClientRequestJoinServerData() { return { version: 0, accountId: 0, serverid: Long.UZERO, serverIp: 0, serverPort: 0, res: undefined, errormsg: "" }; } exports.CMsgGCCStrike15V2ClientRequestJoinServerData = { encode(message, writer = minimal_1.Writer.create()) { if (message.version !== 0) { writer.uint32(8).uint32(message.version); } if (message.accountId !== 0) { writer.uint32(16).uint32(message.accountId); } if (!message.serverid.isZero()) { writer.uint32(24).uint64(message.serverid); } if (message.serverIp !== 0) { writer.uint32(32).uint32(message.serverIp); } if (message.serverPort !== 0) { writer.uint32(40).uint32(message.serverPort); } if (message.res !== undefined) { exports.CMsgGCCStrike15V2MatchmakingGC2ClientReserve.encode(message.res, writer.uint32(50).fork()).ldelim(); } if (message.errormsg !== "") { writer.uint32(58).string(message.errormsg); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCMsgGCCStrike15V2ClientRequestJoinServerData(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.version = reader.uint32(); break; case 2: message.accountId = reader.uint32(); break; case 3: message.serverid = reader.uint64(); break; case 4: message.serverIp = reader.uint32(); break; case 5: message.serverPort = reader.uint32(); break; case 6: message.res = exports.CMsgGCCStrike15V2MatchmakingGC2ClientReserve.decode(reader, reader.uint32()); break; case 7: message.errormsg = reader.string(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c, _d, _e; const message = createBaseCMsgGCCStrike15V2ClientRequestJoinServerData(); message.version = (_a = object.version) !== null && _a !== void 0 ? _a : 0; message.accountId = (_b = object.accountId) !== null && _b !== void 0 ? _b : 0; message.serverid = object.serverid !== undefined && object.serverid !== null ? Long.fromValue(object.serverid) : Long.UZERO; message.serverIp = (_c = object.serverIp) !== null && _c !== void 0 ? _c : 0; message.serverPort = (_d = object.serverPort) !== null && _d !== void 0 ? _d : 0; message.res = object.res !== undefined && object.res !== null ? exports.CMsgGCCStrike15V2MatchmakingGC2ClientReserve.fromPartial(object.res) : undefined; message.errormsg = (_e = object.errormsg) !== null && _e !== void 0 ? _e : ""; return message; } }; function createBaseCMsgGCCstrike15V2ClientRequestNewMission() { return { missionId: 0, campaignId: 0 }; } exports.CMsgGCCstrike15V2ClientRequestNewMission = { encode(message, writer = minimal_1.Writer.create()) { if (message.missionId !== 0) { writer.uint32(16).uint32(message.missionId); } if (message.campaignId !== 0) { writer.uint32(24).uint32(message.campaignId); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCMsgGCCstrike15V2ClientRequestNewMission(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 2: message.missionId = reader.uint32(); break; case 3: message.campaignId = reader.uint32(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b; const message = createBaseCMsgGCCstrike15V2ClientRequestNewMission(); message.missionId = (_a = object.missionId) !== null && _a !== void 0 ? _a : 0; message.campaignId = (_b = object.campaignId) !== null && _b !== void 0 ? _b : 0; return message; } }; function createBaseCMsgGCCstrike15V2ClientRedeemMissionReward() { return { campaignId: 0, redeemId: 0, redeemableBalance: 0, expectedCost: 0 }; } exports.CMsgGCCstrike15V2ClientRedeemMissionReward = { encode(message, writer = minimal_1.Writer.create()) { if (message.campaignId !== 0) { writer.uint32(8).uint32(message.campaignId); } if (message.redeemId !== 0) { writer.uint32(16).uint32(message.redeemId); } if (message.redeemableBalance !== 0) { writer.uint32(24).uint32(message.redeemableBalance); } if (message.expectedCost !== 0) { writer.uint32(32).uint32(message.expectedCost); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCMsgGCCstrike15V2ClientRedeemMissionReward(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.campaignId = reader.uint32(); break; case 2: message.redeemId = reader.uint32(); break; case 3: message.redeemableBalance = reader.uint32(); break; case 4: message.expectedCost = reader.uint32(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c, _d; const message = createBaseCMsgGCCstrike15V2ClientRedeemMissionReward(); message.campaignId = (_a = object.campaignId) !== null && _a !== void 0 ? _a : 0; message.redeemId = (_b = object.redeemId) !== null && _b !== void 0 ? _b : 0; message.redeemableBalance = (_c = object.redeemableBalance) !== null && _c !== void 0 ? _c : 0; message.expectedCost = (_d = object.expectedCost) !== null && _d !== void 0 ? _d : 0; return message; } }; function createBaseCMsgGCCstrike15V2GC2ServerNotifyXPRewarded() { return { xpProgressData: [], accountId: 0, currentXp: 0, currentLevel: 0, upgradedDefidx: 0, operationPointsAwarded: 0 }; } exports.CMsgGCCstrike15V2GC2ServerNotifyXPRewarded = { encode(message, writer = minimal_1.Writer.create()) { for (const v of message.xpProgressData) { exports.XpProgressData.encode(v, writer.uint32(10).fork()).ldelim(); } if (message.accountId !== 0) { writer.uint32(16).uint32(message.accountId); } if (message.currentXp !== 0) { writer.uint32(24).uint32(message.currentXp); } if (message.currentLevel !== 0) { writer.uint32(32).uint32(message.currentLevel); } if (message.upgradedDefidx !== 0) { writer.uint32(40).uint32(message.upgradedDefidx); } if (message.operationPointsAwarded !== 0) { writer.uint32(48).uint32(message.operationPointsAwarded); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCMsgGCCstrike15V2GC2ServerNotifyXPRewarded(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.xpProgressData.push(exports.XpProgressData.decode(reader, reader.uint32())); break; case 2: message.accountId = reader.uint32(); break; case 3: message.currentXp = reader.uint32(); break; case 4: message.currentLevel = reader.uint32(); break; case 5: message.upgradedDefidx = reader.uint32(); break; case 6: message.operationPointsAwarded = reader.uint32(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c, _d, _e, _f; const message = createBaseCMsgGCCstrike15V2GC2ServerNotifyXPRewarded(); message.xpProgressData = ((_a = object.xpProgressData) === null || _a === void 0 ? void 0 : _a.map(e => exports.XpProgressData.fromPartial(e))) || []; message.accountId = (_b = object.accountId) !== null && _b !== void 0 ? _b : 0; message.currentXp = (_c = object.currentXp) !== null && _c !== void 0 ? _c : 0; message.currentLevel = (_d = object.currentLevel) !== null && _d !== void 0 ? _d : 0; message.upgradedDefidx = (_e = object.upgradedDefidx) !== null && _e !== void 0 ? _e : 0; message.operationPointsAwarded = (_f = object.operationPointsAwarded) !== null && _f !== void 0 ? _f : 0; return message; } }; function createBaseCMsgGCCStrike15ClientDeepStats() { return { accountId: 0, range: undefined, matches: [] }; } exports.CMsgGCCStrike15ClientDeepStats = { encode(message, writer = minimal_1.Writer.create()) { if (message.accountId !== 0) { writer.uint32(8).uint32(message.accountId); } if (message.range !== undefined) { exports.CMsgGCCStrike15ClientDeepStats_DeepStatsRange.encode(message.range, writer.uint32(18).fork()).ldelim(); } for (const v of message.matches) { exports.CMsgGCCStrike15ClientDeepStats_DeepStatsMatch.encode(v, writer.uint32(26).fork()).ldelim(); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCMsgGCCStrike15ClientDeepStats(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.accountId = reader.uint32(); break; case 2: message.range = exports.CMsgGCCStrike15ClientDeepStats_DeepStatsRange.decode(reader, reader.uint32()); break; case 3: message.matches.push(exports.CMsgGCCStrike15ClientDeepStats_DeepStatsMatch.decode(reader, reader.uint32())); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b; const message = createBaseCMsgGCCStrike15ClientDeepStats(); message.accountId = (_a = object.accountId) !== null && _a !== void 0 ? _a : 0; message.range = object.range !== undefined && object.range !== null ? exports.CMsgGCCStrike15ClientDeepStats_DeepStatsRange.fromPartial(object.range) : undefined; message.matches = ((_b = object.matches) === null || _b === void 0 ? void 0 : _b.map(e => exports.CMsgGCCStrike15ClientDeepStats_DeepStatsMatch.fromPartial(e))) || []; return message; } }; function createBaseCMsgGCCStrike15ClientDeepStats_DeepStatsRange() { return { begin: 0, end: 0, frozen: false }; } exports.CMsgGCCStrike15ClientDeepStats_DeepStatsRange = { encode(message, writer = minimal_1.Writer.create()) { if (message.begin !== 0) { writer.uint32(8).uint32(message.begin); } if (message.end !== 0) { writer.uint32(16).uint32(message.end); } if (message.frozen === true) { writer.uint32(24).bool(message.frozen); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCMsgGCCStrike15ClientDeepStats_DeepStatsRange(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.begin = reader.uint32(); break; case 2: message.end = reader.uint32(); break; case 3: message.frozen = reader.bool(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c; const message = createBaseCMsgGCCStrike15ClientDeepStats_DeepStatsRange(); message.begin = (_a = object.begin) !== null && _a !== void 0 ? _a : 0; message.end = (_b = object.end) !== null && _b !== void 0 ? _b : 0; message.frozen = (_c = object.frozen) !== null && _c !== void 0 ? _c : false; return message; } }; function createBaseCMsgGCCStrike15ClientDeepStats_DeepStatsMatch() { return { player: undefined, events: [] }; } exports.CMsgGCCStrike15ClientDeepStats_DeepStatsMatch = { encode(message, writer = minimal_1.Writer.create()) { if (message.player !== undefined) { exports.DeepPlayerStatsEntry.encode(message.player, writer.uint32(10).fork()).ldelim(); } for (const v of message.events) { exports.DeepPlayerMatchEvent.encode(v, writer.uint32(18).fork()).ldelim(); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCMsgGCCStrike15ClientDeepStats_DeepStatsMatch(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.player = exports.DeepPlayerStatsEntry.decode(reader, reader.uint32()); break; case 2: message.events.push(exports.DeepPlayerMatchEvent.decode(reader, reader.uint32())); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a; const message = createBaseCMsgGCCStrike15ClientDeepStats_DeepStatsMatch(); message.player = object.player !== undefined && object.player !== null ? exports.DeepPlayerStatsEntry.fromPartial(object.player) : undefined; message.events = ((_a = object.events) === null || _a === void 0 ? void 0 : _a.map(e => exports.DeepPlayerMatchEvent.fromPartial(e))) || []; return message; } }; function createBaseCMsgGCCStrike15V2WatchInfoUsers() { return { requestId: 0, accountIds: [], watchableMatchInfos: [], extendedTimeout: 0 }; } exports.CMsgGCCStrike15V2WatchInfoUsers = { encode(message, writer = minimal_1.Writer.create()) { if (message.requestId !== 0) { writer.uint32(8).uint32(message.requestId); } writer.uint32(18).fork(); for (const v of message.accountIds) { writer.uint32(v); } writer.ldelim(); for (const v of message.watchableMatchInfos) { exports.WatchableMatchInfo.encode(v, writer.uint32(26).fork()).ldelim(); } if (message.extendedTimeout !== 0) { writer.uint32(40).uint32(message.extendedTimeout); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCMsgGCCStrike15V2WatchInfoUsers(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.requestId = reader.uint32(); break; case 2: if ((tag & 7) === 2) { const end2 = reader.uint32() + reader.pos; while (reader.pos < end2) { message.accountIds.push(reader.uint32()); } } else { message.accountIds.push(reader.uint32()); } break; case 3: message.watchableMatchInfos.push(exports.WatchableMatchInfo.decode(reader, reader.uint32())); break; case 5: message.extendedTimeout = reader.uint32(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c, _d; const message = createBaseCMsgGCCStrike15V2WatchInfoUsers(); message.requestId = (_a = object.requestId) !== null && _a !== void 0 ? _a : 0; message.accountIds = ((_b = object.accountIds) === null || _b === void 0 ? void 0 : _b.map(e => e)) || []; message.watchableMatchInfos = ((_c = object.watchableMatchInfos) === null || _c === void 0 ? void 0 : _c.map(e => exports.WatchableMatchInfo.fromPartial(e))) || []; message.extendedTimeout = (_d = object.extendedTimeout) !== null && _d !== void 0 ? _d : 0; return message; } }; function createBaseCMsgGCCStrike15V2ClientRequestPlayersProfile() { return { requestIdDeprecated: 0, accountIdsDeprecated: [], accountId: 0, requestLevel: 0 }; } exports.CMsgGCCStrike15V2ClientRequestPlayersProfile = { encode(message, writer = minimal_1.Writer.create()) { if (message.requestIdDeprecated !== 0) { writer.uint32(8).uint32(message.requestIdDeprecated); } writer.uint32(18).fork(); for (const v of message.accountIdsDeprecated) { writer.uint32(v); } writer.ldelim(); if (message.accountId !== 0) { writer.uint32(24).uint32(message.accountId); } if (message.requestLevel !== 0) { writer.uint32(32).uint32(message.requestLevel); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCMsgGCCStrike15V2ClientRequestPlayersProfile(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.requestIdDeprecated = reader.uint32(); break; case 2: if ((tag & 7) === 2) { const end2 = reader.uint32() + reader.pos; while (reader.pos < end2) { message.accountIdsDeprecated.push(reader.uint32()); } } else { message.accountIdsDeprecated.push(reader.uint32()); } break; case 3: message.accountId = reader.uint32(); break; case 4: message.requestLevel = reader.uint32(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c, _d; const message = createBaseCMsgGCCStrike15V2ClientRequestPlayersProfile(); message.requestIdDeprecated = (_a = object.requestIdDeprecated) !== null && _a !== void 0 ? _a : 0; message.accountIdsDeprecated = ((_b = object.accountIdsDeprecated) === null || _b === void 0 ? void 0 : _b.map(e => e)) || []; message.accountId = (_c = object.accountId) !== null && _c !== void 0 ? _c : 0; message.requestLevel = (_d = object.requestLevel) !== null && _d !== void 0 ? _d : 0; return message; } }; function createBaseCMsgGCCStrike15V2PlayersProfile() { return { requestId: 0, accountProfiles: [] }; } exports.CMsgGCCStrike15V2PlayersProfile = { encode(message, writer = minimal_1.Writer.create()) { if (message.requestId !== 0) { writer.uint32(8).uint32(message.requestId); } for (const v of message.accountProfiles) { exports.CMsgGCCStrike15V2MatchmakingGC2ClientHello.encode(v, writer.uint32(18).fork()).ldelim(); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCMsgGCCStrike15V2PlayersProfile(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.requestId = reader.uint32(); break; case 2: message.accountProfiles.push(exports.CMsgGCCStrike15V2MatchmakingGC2ClientHello.decode(reader, reader.uint32())); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b; const message = createBaseCMsgGCCStrike15V2PlayersProfile(); message.requestId = (_a = object.requestId) !== null && _a !== void 0 ? _a : 0; message.accountProfiles = ((_b = object.accountProfiles) === null || _b === void 0 ? void 0 : _b.map(e => exports.CMsgGCCStrike15V2MatchmakingGC2ClientHello.fromPartial(e))) || []; return message; } }; function createBaseCMsgGCCStrike15V2PlayerOverwatchCaseUpdate() { return { caseid: Long.UZERO, suspectid: 0, fractionid: 0, rptAimbot: 0, rptWallhack: 0, rptSpeedhack: 0, rptTeamharm: 0, reason: 0 }; } exports.CMsgGCCStrike15V2PlayerOverwatchCaseUpdate = { encode(message, writer = minimal_1.Writer.create()) { if (!message.caseid.isZero()) { writer.uint32(8).uint64(message.caseid); } if (message.suspectid !== 0) { writer.uint32(24).uint32(message.suspectid); } if (message.fractionid !== 0) { writer.uint32(32).uint32(message.fractionid); } if (message.rptAimbot !== 0) { writer.uint32(40).uint32(message.rptAimbot); } if (message.rptWallhack !== 0) { writer.uint32(48).uint32(message.rptWallhack); } if (message.rptSpeedhack !== 0) { writer.uint32(56).uint32(message.rptSpeedhack); } if (message.rptTeamharm !== 0) { writer.uint32(64).uint32(message.rptTeamharm); } if (message.reason !== 0) { writer.uint32(72).uint32(message.reason); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCMsgGCCStrike15V2PlayerOverwatchCaseUpdate(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.caseid = reader.uint64(); break; case 3: message.suspectid = reader.uint32(); break; case 4: message.fractionid = reader.uint32(); break; case 5: message.rptAimbot = reader.uint32(); break; case 6: message.rptWallhack = reader.uint32(); break; case 7: message.rptSpeedhack = reader.uint32(); break; case 8: message.rptTeamharm = reader.uint32(); break; case 9: message.reason = reader.uint32(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c, _d, _e, _f, _g; const message = createBaseCMsgGCCStrike15V2PlayerOverwatchCaseUpdate(); message.caseid = object.caseid !== undefined && object.caseid !== null ? Long.fromValue(object.caseid) : Long.UZERO; message.suspectid = (_a = object.suspectid) !== null && _a !== void 0 ? _a : 0; message.fractionid = (_b = object.fractionid) !== null && _b !== void 0 ? _b : 0; message.rptAimbot = (_c = object.rptAimbot) !== null && _c !== void 0 ? _c : 0; message.rptWallhack = (_d = object.rptWallhack) !== null && _d !== void 0 ? _d : 0; message.rptSpeedhack = (_e = object.rptSpeedhack) !== null && _e !== void 0 ? _e : 0; message.rptTeamharm = (_f = object.rptTeamharm) !== null && _f !== void 0 ? _f : 0; message.reason = (_g = object.reason) !== null && _g !== void 0 ? _g : 0; return message; } }; function createBaseCMsgGCCStrike15V2PlayerOverwatchCaseAssignment() { return { caseid: Long.UZERO, caseurl: "", verdict: 0, timestamp: 0, throttleseconds: 0, suspectid: 0, fractionid: 0, numrounds: 0, fractionrounds: 0, streakconvictions: 0, reason: 0 }; } exports.CMsgGCCStrike15V2PlayerOverwatchCaseAssignment = { encode(message, writer = minimal_1.Writer.create()) { if (!message.caseid.isZero()) { writer.uint32(8).uint64(message.caseid); } if (message.caseurl !== "") { writer.uint32(18).string(message.caseurl); } if (message.verdict !== 0) { writer.uint32(24).uint32(message.verdict); } if (message.timestamp !== 0) { writer.uint32(32).uint32(message.timestamp); } if (message.throttleseconds !== 0) { writer.uint32(40).uint32(message.throttleseconds); } if (message.suspectid !== 0) { writer.uint32(48).uint32(message.suspectid); } if (message.fractionid !== 0) { writer.uint32(56).uint32(message.fractionid); } if (message.numrounds !== 0) { writer.uint32(64).uint32(message.numrounds); } if (message.fractionrounds !== 0) { writer.uint32(72).uint32(message.fractionrounds); } if (message.streakconvictions !== 0) { writer.uint32(80).int32(message.streakconvictions); } if (message.reason !== 0) { writer.uint32(88).uint32(message.reason); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCMsgGCCStrike15V2PlayerOverwatchCaseAssignment(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.caseid = reader.uint64(); break; case 2: message.caseurl = reader.string(); break; case 3: message.verdict = reader.uint32(); break; case 4: message.timestamp = reader.uint32(); break; case 5: message.throttleseconds = reader.uint32(); break; case 6: message.suspectid = reader.uint32(); break; case 7: message.fractionid = reader.uint32(); break; case 8: message.numrounds = reader.uint32(); break; case 9: message.fractionrounds = reader.uint32(); break; case 10: message.streakconvictions = reader.int32(); break; case 11: message.reason = reader.uint32(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k; const message = createBaseCMsgGCCStrike15V2PlayerOverwatchCaseAssignment(); message.caseid = object.caseid !== undefined && object.caseid !== null ? Long.fromValue(object.caseid) : Long.UZERO; message.caseurl = (_a = object.caseurl) !== null && _a !== void 0 ? _a : ""; message.verdict = (_b = object.verdict) !== null && _b !== void 0 ? _b : 0; message.timestamp = (_c = object.timestamp) !== null && _c !== void 0 ? _c : 0; message.throttleseconds = (_d = object.throttleseconds) !== null && _d !== void 0 ? _d : 0; message.suspectid = (_e = object.suspectid) !== null && _e !== void 0 ? _e : 0; message.fractionid = (_f = object.fractionid) !== null && _f !== void 0 ? _f : 0; message.numrounds = (_g = object.numrounds) !== null && _g !== void 0 ? _g : 0; message.fractionrounds = (_h = object.fractionrounds) !== null && _h !== void 0 ? _h : 0; message.streakconvictions = (_j = object.streakconvictions) !== null && _j !== void 0 ? _j : 0; message.reason = (_k = object.reason) !== null && _k !== void 0 ? _k : 0; return message; } }; function createBaseCMsgGCCStrike15V2PlayerOverwatchCaseStatus() { return { caseid: Long.UZERO, statusid: 0 }; } exports.CMsgGCCStrike15V2PlayerOverwatchCaseStatus = { encode(message, writer = minimal_1.Writer.create()) { if (!message.caseid.isZero()) { writer.uint32(8).uint64(message.caseid); } if (message.statusid !== 0) { writer.uint32(16).uint32(message.statusid); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCMsgGCCStrike15V2PlayerOverwatchCaseStatus(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.caseid = reader.uint64(); break; case 2: message.statusid = reader.uint32(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a; const message = createBaseCMsgGCCStrike15V2PlayerOverwatchCaseStatus(); message.caseid = object.caseid !== undefined && object.caseid !== null ? Long.fromValue(object.caseid) : Long.UZERO; message.statusid = (_a = object.statusid) !== null && _a !== void 0 ? _a : 0; return message; } }; function createBaseCClientHeaderOverwatchEvidence() { return { accountid: 0, caseid: Long.UZERO }; } exports.CClientHeaderOverwatchEvidence = { encode(message, writer = minimal_1.Writer.create()) { if (message.accountid !== 0) { writer.uint32(8).uint32(message.accountid); } if (!message.caseid.isZero()) { writer.uint32(16).uint64(message.caseid); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCClientHeaderOverwatchEvidence(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.accountid = reader.uint32(); break; case 2: message.caseid = reader.uint64(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a; const message = createBaseCClientHeaderOverwatchEvidence(); message.accountid = (_a = object.accountid) !== null && _a !== void 0 ? _a : 0; message.caseid = object.caseid !== undefined && object.caseid !== null ? Long.fromValue(object.caseid) : Long.UZERO; return message; } }; function createBaseCMsgGCCStrike15V2GC2ClientTextMsg() { return { id: 0, type: 0, payload: new Uint8Array() }; } exports.CMsgGCCStrike15V2GC2ClientTextMsg = { encode(message, writer = minimal_1.Writer.create()) { if (message.id !== 0) { writer.uint32(8).uint32(message.id); } if (message.type !== 0) { writer.uint32(16).uint32(message.type); } if (message.payload.length !== 0) { writer.uint32(26).bytes(message.payload); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCMsgGCCStrike15V2GC2ClientTextMsg(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.id = reader.uint32(); break; case 2: message.type = reader.uint32(); break; case 3: message.payload = reader.bytes(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c; const message = createBaseCMsgGCCStrike15V2GC2ClientTextMsg(); message.id = (_a = object.id) !== null && _a !== void 0 ? _a : 0; message.type = (_b = object.type) !== null && _b !== void 0 ? _b : 0; message.payload = (_c = object.payload) !== null && _c !== void 0 ? _c : new Uint8Array(); return message; } }; function createBaseCMsgGCCStrike15V2Client2GCTextMsg() { return { id: 0, args: [] }; } exports.CMsgGCCStrike15V2Client2GCTextMsg = { encode(message, writer = minimal_1.Writer.create()) { if (message.id !== 0) { writer.uint32(8).uint32(message.id); } for (const v of message.args) { writer.uint32(18).bytes(v); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCMsgGCCStrike15V2Client2GCTextMsg(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.id = reader.uint32(); break; case 2: message.args.push(reader.bytes()); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b; const message = createBaseCMsgGCCStrike15V2Client2GCTextMsg(); message.id = (_a = object.id) !== null && _a !== void 0 ? _a : 0; message.args = ((_b = object.args) === null || _b === void 0 ? void 0 : _b.map(e => e)) || []; return message; } }; function createBaseCMsgGCCStrike15V2MatchEndRunRewardDrops() { return { serverinfo: undefined, matchEndQuestData: undefined }; } exports.CMsgGCCStrike15V2MatchEndRunRewardDrops = { encode(message, writer = minimal_1.Writer.create()) { if (message.serverinfo !== undefined) { exports.CMsgGCCStrike15V2MatchmakingServerReservationResponse.encode(message.serverinfo, writer.uint32(26).fork()).ldelim(); } if (message.matchEndQuestData !== undefined) { exports.CMsgGCServerQuestUpdateData.encode(message.matchEndQuestData, writer.uint32(34).fork()).ldelim(); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCMsgGCCStrike15V2MatchEndRunRewardDrops(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 3: message.serverinfo = exports.CMsgGCCStrike15V2MatchmakingServerReservationResponse.decode(reader, reader.uint32()); break; case 4: message.matchEndQuestData = exports.CMsgGCServerQuestUpdateData.decode(reader, reader.uint32()); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { const message = createBaseCMsgGCCStrike15V2MatchEndRunRewardDrops(); message.serverinfo = object.serverinfo !== undefined && object.serverinfo !== null ? exports.CMsgGCCStrike15V2MatchmakingServerReservationResponse.fromPartial(object.serverinfo) : undefined; message.matchEndQuestData = object.matchEndQuestData !== undefined && object.matchEndQuestData !== null ? exports.CMsgGCServerQuestUpdateData.fromPartial(object.matchEndQuestData) : undefined; return message; } }; function createBaseCEconItemPreviewDataBlock() { return { accountid: 0, itemid: Long.UZERO, defindex: 0, paintindex: 0, rarity: 0, quality: 0, paintwear: 0, paintseed: 0, killeaterscoretype: 0, killeatervalue: 0, customname: "", stickers: [], inventory: 0, origin: 0, questid: 0, dropreason: 0, musicindex: 0, entindex: 0 }; } exports.CEconItemPreviewDataBlock = { encode(message, writer = minimal_1.Writer.create()) { if (message.accountid !== 0) { writer.uint32(8).uint32(message.accountid); } if (!message.itemid.isZero()) { writer.uint32(16).uint64(message.itemid); } if (message.defindex !== 0) { writer.uint32(24).uint32(message.defindex); } if (message.paintindex !== 0) { writer.uint32(32).uint32(message.paintindex); } if (message.rarity !== 0) { writer.uint32(40).uint32(message.rarity); } if (message.quality !== 0) { writer.uint32(48).uint32(message.quality); } if (message.paintwear !== 0) { writer.uint32(56).uint32(message.paintwear); } if (message.paintseed !== 0) { writer.uint32(64).uint32(message.paintseed); } if (message.killeaterscoretype !== 0) { writer.uint32(72).uint32(message.killeaterscoretype); } if (message.killeatervalue !== 0) { writer.uint32(80).uint32(message.killeatervalue); } if (message.customname !== "") { writer.uint32(90).string(message.customname); } for (const v of message.stickers) { exports.CEconItemPreviewDataBlock_Sticker.encode(v, writer.uint32(98).fork()).ldelim(); } if (message.inventory !== 0) { writer.uint32(104).uint32(message.inventory); } if (message.origin !== 0) { writer.uint32(112).uint32(message.origin); } if (message.questid !== 0) { writer.uint32(120).uint32(message.questid); } if (message.dropreason !== 0) { writer.uint32(128).uint32(message.dropreason); } if (message.musicindex !== 0) { writer.uint32(136).uint32(message.musicindex); } if (message.entindex !== 0) { writer.uint32(144).int32(message.entindex); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCEconItemPreviewDataBlock(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.accountid = reader.uint32(); break; case 2: message.itemid = reader.uint64(); break; case 3: message.defindex = reader.uint32(); break; case 4: message.paintindex = reader.uint32(); break; case 5: message.rarity = reader.uint32(); break; case 6: message.quality = reader.uint32(); break; case 7: message.paintwear = reader.uint32(); break; case 8: message.paintseed = reader.uint32(); break; case 9: message.killeaterscoretype = reader.uint32(); break; case 10: message.killeatervalue = reader.uint32(); break; case 11: message.customname = reader.string(); break; case 12: message.stickers.push(exports.CEconItemPreviewDataBlock_Sticker.decode(reader, reader.uint32())); break; case 13: message.inventory = reader.uint32(); break; case 14: message.origin = reader.uint32(); break; case 15: message.questid = reader.uint32(); break; case 16: message.dropreason = reader.uint32(); break; case 17: message.musicindex = reader.uint32(); break; case 18: message.entindex = reader.int32(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s; const message = createBaseCEconItemPreviewDataBlock(); message.accountid = (_a = object.accountid) !== null && _a !== void 0 ? _a : 0; message.itemid = object.itemid !== undefined && object.itemid !== null ? Long.fromValue(object.itemid) : Long.UZERO; message.defindex = (_b = object.defindex) !== null && _b !== void 0 ? _b : 0; message.paintindex = (_c = object.paintindex) !== null && _c !== void 0 ? _c : 0; message.rarity = (_d = object.rarity) !== null && _d !== void 0 ? _d : 0; message.quality = (_e = object.quality) !== null && _e !== void 0 ? _e : 0; message.paintwear = (_f = object.paintwear) !== null && _f !== void 0 ? _f : 0; message.paintseed = (_g = object.paintseed) !== null && _g !== void 0 ? _g : 0; message.killeaterscoretype = (_h = object.killeaterscoretype) !== null && _h !== void 0 ? _h : 0; message.killeatervalue = (_j = object.killeatervalue) !== null && _j !== void 0 ? _j : 0; message.customname = (_k = object.customname) !== null && _k !== void 0 ? _k : ""; message.stickers = ((_l = object.stickers) === null || _l === void 0 ? void 0 : _l.map(e => exports.CEconItemPreviewDataBlock_Sticker.fromPartial(e))) || []; message.inventory = (_m = object.inventory) !== null && _m !== void 0 ? _m : 0; message.origin = (_o = object.origin) !== null && _o !== void 0 ? _o : 0; message.questid = (_p = object.questid) !== null && _p !== void 0 ? _p : 0; message.dropreason = (_q = object.dropreason) !== null && _q !== void 0 ? _q : 0; message.musicindex = (_r = object.musicindex) !== null && _r !== void 0 ? _r : 0; message.entindex = (_s = object.entindex) !== null && _s !== void 0 ? _s : 0; return message; } }; function createBaseCEconItemPreviewDataBlock_Sticker() { return { slot: 0, stickerId: 0, wear: 0, scale: 0, rotation: 0, tintId: 0 }; } exports.CEconItemPreviewDataBlock_Sticker = { encode(message, writer = minimal_1.Writer.create()) { if (message.slot !== 0) { writer.uint32(8).uint32(message.slot); } if (message.stickerId !== 0) { writer.uint32(16).uint32(message.stickerId); } if (message.wear !== 0) { writer.uint32(29).float(message.wear); } if (message.scale !== 0) { writer.uint32(37).float(message.scale); } if (message.rotation !== 0) { writer.uint32(45).float(message.rotation); } if (message.tintId !== 0) { writer.uint32(48).uint32(message.tintId); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCEconItemPreviewDataBlock_Sticker(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.slot = reader.uint32(); break; case 2: message.stickerId = reader.uint32(); break; case 3: message.wear = reader.float(); break; case 4: message.scale = reader.float(); break; case 5: message.rotation = reader.float(); break; case 6: message.tintId = reader.uint32(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c, _d, _e, _f; const message = createBaseCEconItemPreviewDataBlock_Sticker(); message.slot = (_a = object.slot) !== null && _a !== void 0 ? _a : 0; message.stickerId = (_b = object.stickerId) !== null && _b !== void 0 ? _b : 0; message.wear = (_c = object.wear) !== null && _c !== void 0 ? _c : 0; message.scale = (_d = object.scale) !== null && _d !== void 0 ? _d : 0; message.rotation = (_e = object.rotation) !== null && _e !== void 0 ? _e : 0; message.tintId = (_f = object.tintId) !== null && _f !== void 0 ? _f : 0; return message; } }; function createBaseCMsgGCCStrike15V2MatchEndRewardDropsNotification() { return { iteminfo: undefined }; } exports.CMsgGCCStrike15V2MatchEndRewardDropsNotification = { encode(message, writer = minimal_1.Writer.create()) { if (message.iteminfo !== undefined) { exports.CEconItemPreviewDataBlock.encode(message.iteminfo, writer.uint32(50).fork()).ldelim(); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCMsgGCCStrike15V2MatchEndRewardDropsNotification(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 6: message.iteminfo = exports.CEconItemPreviewDataBlock.decode(reader, reader.uint32()); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { const message = createBaseCMsgGCCStrike15V2MatchEndRewardDropsNotification(); message.iteminfo = object.iteminfo !== undefined && object.iteminfo !== null ? exports.CEconItemPreviewDataBlock.fromPartial(object.iteminfo) : undefined; return message; } }; function createBaseCMsgItemAcknowledged() { return { iteminfo: undefined }; } exports.CMsgItemAcknowledged = { encode(message, writer = minimal_1.Writer.create()) { if (message.iteminfo !== undefined) { exports.CEconItemPreviewDataBlock.encode(message.iteminfo, writer.uint32(10).fork()).ldelim(); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCMsgItemAcknowledged(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.iteminfo = exports.CEconItemPreviewDataBlock.decode(reader, reader.uint32()); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { const message = createBaseCMsgItemAcknowledged(); message.iteminfo = object.iteminfo !== undefined && object.iteminfo !== null ? exports.CEconItemPreviewDataBlock.fromPartial(object.iteminfo) : undefined; return message; } }; function createBaseCMsgGCCStrike15V2Client2GCEconPreviewDataBlockRequest() { return { paramS: Long.UZERO, paramA: Long.UZERO, paramD: Long.UZERO, paramM: Long.UZERO }; } exports.CMsgGCCStrike15V2Client2GCEconPreviewDataBlockRequest = { encode(message, writer = minimal_1.Writer.create()) { if (!message.paramS.isZero()) { writer.uint32(8).uint64(message.paramS); } if (!message.paramA.isZero()) { writer.uint32(16).uint64(message.paramA); } if (!message.paramD.isZero()) { writer.uint32(24).uint64(message.paramD); } if (!message.paramM.isZero()) { writer.uint32(32).uint64(message.paramM); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCMsgGCCStrike15V2Client2GCEconPreviewDataBlockRequest(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.paramS = reader.uint64(); break; case 2: message.paramA = reader.uint64(); break; case 3: message.paramD = reader.uint64(); break; case 4: message.paramM = reader.uint64(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { const message = createBaseCMsgGCCStrike15V2Client2GCEconPreviewDataBlockRequest(); message.paramS = object.paramS !== undefined && object.paramS !== null ? Long.fromValue(object.paramS) : Long.UZERO; message.paramA = object.paramA !== undefined && object.paramA !== null ? Long.fromValue(object.paramA) : Long.UZERO; message.paramD = object.paramD !== undefined && object.paramD !== null ? Long.fromValue(object.paramD) : Long.UZERO; message.paramM = object.paramM !== undefined && object.paramM !== null ? Long.fromValue(object.paramM) : Long.UZERO; return message; } }; function createBaseCMsgGCCStrike15V2Client2GCEconPreviewDataBlockResponse() { return { iteminfo: undefined }; } exports.CMsgGCCStrike15V2Client2GCEconPreviewDataBlockResponse = { encode(message, writer = minimal_1.Writer.create()) { if (message.iteminfo !== undefined) { exports.CEconItemPreviewDataBlock.encode(message.iteminfo, writer.uint32(10).fork()).ldelim(); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCMsgGCCStrike15V2Client2GCEconPreviewDataBlockResponse(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.iteminfo = exports.CEconItemPreviewDataBlock.decode(reader, reader.uint32()); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { const message = createBaseCMsgGCCStrike15V2Client2GCEconPreviewDataBlockResponse(); message.iteminfo = object.iteminfo !== undefined && object.iteminfo !== null ? exports.CEconItemPreviewDataBlock.fromPartial(object.iteminfo) : undefined; return message; } }; function createBaseCMsgGCCStrike15V2MatchListRequestCurrentLiveGames() { return {}; } exports.CMsgGCCStrike15V2MatchListRequestCurrentLiveGames = { encode(_, writer = minimal_1.Writer.create()) { return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCMsgGCCStrike15V2MatchListRequestCurrentLiveGames(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(_) { const message = createBaseCMsgGCCStrike15V2MatchListRequestCurrentLiveGames(); return message; } }; function createBaseCMsgGCCStrike15V2MatchListRequestLiveGameForUser() { return { accountid: 0 }; } exports.CMsgGCCStrike15V2MatchListRequestLiveGameForUser = { encode(message, writer = minimal_1.Writer.create()) { if (message.accountid !== 0) { writer.uint32(8).uint32(message.accountid); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCMsgGCCStrike15V2MatchListRequestLiveGameForUser(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.accountid = reader.uint32(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a; const message = createBaseCMsgGCCStrike15V2MatchListRequestLiveGameForUser(); message.accountid = (_a = object.accountid) !== null && _a !== void 0 ? _a : 0; return message; } }; function createBaseCMsgGCCStrike15V2MatchListRequestRecentUserGames() { return { accountid: 0 }; } exports.CMsgGCCStrike15V2MatchListRequestRecentUserGames = { encode(message, writer = minimal_1.Writer.create()) { if (message.accountid !== 0) { writer.uint32(8).uint32(message.accountid); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCMsgGCCStrike15V2MatchListRequestRecentUserGames(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.accountid = reader.uint32(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a; const message = createBaseCMsgGCCStrike15V2MatchListRequestRecentUserGames(); message.accountid = (_a = object.accountid) !== null && _a !== void 0 ? _a : 0; return message; } }; function createBaseCMsgGCCStrike15V2MatchListRequestTournamentGames() { return { eventid: 0 }; } exports.CMsgGCCStrike15V2MatchListRequestTournamentGames = { encode(message, writer = minimal_1.Writer.create()) { if (message.eventid !== 0) { writer.uint32(8).int32(message.eventid); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCMsgGCCStrike15V2MatchListRequestTournamentGames(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.eventid = reader.int32(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a; const message = createBaseCMsgGCCStrike15V2MatchListRequestTournamentGames(); message.eventid = (_a = object.eventid) !== null && _a !== void 0 ? _a : 0; return message; } }; function createBaseCMsgGCCStrike15V2MatchListRequestFullGameInfo() { return { matchid: Long.UZERO, outcomeid: Long.UZERO, token: 0 }; } exports.CMsgGCCStrike15V2MatchListRequestFullGameInfo = { encode(message, writer = minimal_1.Writer.create()) { if (!message.matchid.isZero()) { writer.uint32(8).uint64(message.matchid); } if (!message.outcomeid.isZero()) { writer.uint32(16).uint64(message.outcomeid); } if (message.token !== 0) { writer.uint32(24).uint32(message.token); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCMsgGCCStrike15V2MatchListRequestFullGameInfo(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.matchid = reader.uint64(); break; case 2: message.outcomeid = reader.uint64(); break; case 3: message.token = reader.uint32(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a; const message = createBaseCMsgGCCStrike15V2MatchListRequestFullGameInfo(); message.matchid = object.matchid !== undefined && object.matchid !== null ? Long.fromValue(object.matchid) : Long.UZERO; message.outcomeid = object.outcomeid !== undefined && object.outcomeid !== null ? Long.fromValue(object.outcomeid) : Long.UZERO; message.token = (_a = object.token) !== null && _a !== void 0 ? _a : 0; return message; } }; function createBaseCDataGCCStrike15V2MatchInfo() { return { matchid: Long.UZERO, matchtime: 0, watchablematchinfo: undefined, roundstatsLegacy: undefined, roundstatsall: [] }; } exports.CDataGCCStrike15V2MatchInfo = { encode(message, writer = minimal_1.Writer.create()) { if (!message.matchid.isZero()) { writer.uint32(8).uint64(message.matchid); } if (message.matchtime !== 0) { writer.uint32(16).uint32(message.matchtime); } if (message.watchablematchinfo !== undefined) { exports.WatchableMatchInfo.encode(message.watchablematchinfo, writer.uint32(26).fork()).ldelim(); } if (message.roundstatsLegacy !== undefined) { exports.CMsgGCCStrike15V2MatchmakingServerRoundStats.encode(message.roundstatsLegacy, writer.uint32(34).fork()).ldelim(); } for (const v of message.roundstatsall) { exports.CMsgGCCStrike15V2MatchmakingServerRoundStats.encode(v, writer.uint32(42).fork()).ldelim(); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCDataGCCStrike15V2MatchInfo(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.matchid = reader.uint64(); break; case 2: message.matchtime = reader.uint32(); break; case 3: message.watchablematchinfo = exports.WatchableMatchInfo.decode(reader, reader.uint32()); break; case 4: message.roundstatsLegacy = exports.CMsgGCCStrike15V2MatchmakingServerRoundStats.decode(reader, reader.uint32()); break; case 5: message.roundstatsall.push(exports.CMsgGCCStrike15V2MatchmakingServerRoundStats.decode(reader, reader.uint32())); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b; const message = createBaseCDataGCCStrike15V2MatchInfo(); message.matchid = object.matchid !== undefined && object.matchid !== null ? Long.fromValue(object.matchid) : Long.UZERO; message.matchtime = (_a = object.matchtime) !== null && _a !== void 0 ? _a : 0; message.watchablematchinfo = object.watchablematchinfo !== undefined && object.watchablematchinfo !== null ? exports.WatchableMatchInfo.fromPartial(object.watchablematchinfo) : undefined; message.roundstatsLegacy = object.roundstatsLegacy !== undefined && object.roundstatsLegacy !== null ? exports.CMsgGCCStrike15V2MatchmakingServerRoundStats.fromPartial(object.roundstatsLegacy) : undefined; message.roundstatsall = ((_b = object.roundstatsall) === null || _b === void 0 ? void 0 : _b.map(e => exports.CMsgGCCStrike15V2MatchmakingServerRoundStats.fromPartial(e))) || []; return message; } }; function createBaseCDataGCCStrike15V2TournamentGroupTeam() { return { teamId: 0, score: 0, correctpick: false }; } exports.CDataGCCStrike15V2TournamentGroupTeam = { encode(message, writer = minimal_1.Writer.create()) { if (message.teamId !== 0) { writer.uint32(8).int32(message.teamId); } if (message.score !== 0) { writer.uint32(16).int32(message.score); } if (message.correctpick === true) { writer.uint32(24).bool(message.correctpick); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCDataGCCStrike15V2TournamentGroupTeam(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.teamId = reader.int32(); break; case 2: message.score = reader.int32(); break; case 3: message.correctpick = reader.bool(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c; const message = createBaseCDataGCCStrike15V2TournamentGroupTeam(); message.teamId = (_a = object.teamId) !== null && _a !== void 0 ? _a : 0; message.score = (_b = object.score) !== null && _b !== void 0 ? _b : 0; message.correctpick = (_c = object.correctpick) !== null && _c !== void 0 ? _c : false; return message; } }; function createBaseCDataGCCStrike15V2TournamentGroup() { return { groupid: 0, name: "", desc: "", picksDeprecated: 0, teams: [], stageIds: [], picklockuntiltime: 0, pickableteams: 0, pointsPerPick: 0, picks: [] }; } exports.CDataGCCStrike15V2TournamentGroup = { encode(message, writer = minimal_1.Writer.create()) { if (message.groupid !== 0) { writer.uint32(8).uint32(message.groupid); } if (message.name !== "") { writer.uint32(18).string(message.name); } if (message.desc !== "") { writer.uint32(26).string(message.desc); } if (message.picksDeprecated !== 0) { writer.uint32(32).uint32(message.picksDeprecated); } for (const v of message.teams) { exports.CDataGCCStrike15V2TournamentGroupTeam.encode(v, writer.uint32(42).fork()).ldelim(); } writer.uint32(50).fork(); for (const v of message.stageIds) { writer.int32(v); } writer.ldelim(); if (message.picklockuntiltime !== 0) { writer.uint32(56).uint32(message.picklockuntiltime); } if (message.pickableteams !== 0) { writer.uint32(64).uint32(message.pickableteams); } if (message.pointsPerPick !== 0) { writer.uint32(72).uint32(message.pointsPerPick); } for (const v of message.picks) { exports.CDataGCCStrike15V2TournamentGroup_Picks.encode(v, writer.uint32(82).fork()).ldelim(); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCDataGCCStrike15V2TournamentGroup(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.groupid = reader.uint32(); break; case 2: message.name = reader.string(); break; case 3: message.desc = reader.string(); break; case 4: message.picksDeprecated = reader.uint32(); break; case 5: message.teams.push(exports.CDataGCCStrike15V2TournamentGroupTeam.decode(reader, reader.uint32())); break; case 6: if ((tag & 7) === 2) { const end2 = reader.uint32() + reader.pos; while (reader.pos < end2) { message.stageIds.push(reader.int32()); } } else { message.stageIds.push(reader.int32()); } break; case 7: message.picklockuntiltime = reader.uint32(); break; case 8: message.pickableteams = reader.uint32(); break; case 9: message.pointsPerPick = reader.uint32(); break; case 10: message.picks.push(exports.CDataGCCStrike15V2TournamentGroup_Picks.decode(reader, reader.uint32())); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k; const message = createBaseCDataGCCStrike15V2TournamentGroup(); message.groupid = (_a = object.groupid) !== null && _a !== void 0 ? _a : 0; message.name = (_b = object.name) !== null && _b !== void 0 ? _b : ""; message.desc = (_c = object.desc) !== null && _c !== void 0 ? _c : ""; message.picksDeprecated = (_d = object.picksDeprecated) !== null && _d !== void 0 ? _d : 0; message.teams = ((_e = object.teams) === null || _e === void 0 ? void 0 : _e.map(e => exports.CDataGCCStrike15V2TournamentGroupTeam.fromPartial(e))) || []; message.stageIds = ((_f = object.stageIds) === null || _f === void 0 ? void 0 : _f.map(e => e)) || []; message.picklockuntiltime = (_g = object.picklockuntiltime) !== null && _g !== void 0 ? _g : 0; message.pickableteams = (_h = object.pickableteams) !== null && _h !== void 0 ? _h : 0; message.pointsPerPick = (_j = object.pointsPerPick) !== null && _j !== void 0 ? _j : 0; message.picks = ((_k = object.picks) === null || _k === void 0 ? void 0 : _k.map(e => exports.CDataGCCStrike15V2TournamentGroup_Picks.fromPartial(e))) || []; return message; } }; function createBaseCDataGCCStrike15V2TournamentGroup_Picks() { return { pickids: [] }; } exports.CDataGCCStrike15V2TournamentGroup_Picks = { encode(message, writer = minimal_1.Writer.create()) { writer.uint32(10).fork(); for (const v of message.pickids) { writer.int32(v); } writer.ldelim(); return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCDataGCCStrike15V2TournamentGroup_Picks(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: if ((tag & 7) === 2) { const end2 = reader.uint32() + reader.pos; while (reader.pos < end2) { message.pickids.push(reader.int32()); } } else { message.pickids.push(reader.int32()); } break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a; const message = createBaseCDataGCCStrike15V2TournamentGroup_Picks(); message.pickids = ((_a = object.pickids) === null || _a === void 0 ? void 0 : _a.map(e => e)) || []; return message; } }; function createBaseCDataGCCStrike15V2TournamentSection() { return { sectionid: 0, name: "", desc: "", groups: [] }; } exports.CDataGCCStrike15V2TournamentSection = { encode(message, writer = minimal_1.Writer.create()) { if (message.sectionid !== 0) { writer.uint32(8).uint32(message.sectionid); } if (message.name !== "") { writer.uint32(18).string(message.name); } if (message.desc !== "") { writer.uint32(26).string(message.desc); } for (const v of message.groups) { exports.CDataGCCStrike15V2TournamentGroup.encode(v, writer.uint32(34).fork()).ldelim(); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCDataGCCStrike15V2TournamentSection(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.sectionid = reader.uint32(); break; case 2: message.name = reader.string(); break; case 3: message.desc = reader.string(); break; case 4: message.groups.push(exports.CDataGCCStrike15V2TournamentGroup.decode(reader, reader.uint32())); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c, _d; const message = createBaseCDataGCCStrike15V2TournamentSection(); message.sectionid = (_a = object.sectionid) !== null && _a !== void 0 ? _a : 0; message.name = (_b = object.name) !== null && _b !== void 0 ? _b : ""; message.desc = (_c = object.desc) !== null && _c !== void 0 ? _c : ""; message.groups = ((_d = object.groups) === null || _d === void 0 ? void 0 : _d.map(e => exports.CDataGCCStrike15V2TournamentGroup.fromPartial(e))) || []; return message; } }; function createBaseCDataGCCStrike15V2TournamentInfo() { return { sections: [], tournamentEvent: undefined, tournamentTeams: [] }; } exports.CDataGCCStrike15V2TournamentInfo = { encode(message, writer = minimal_1.Writer.create()) { for (const v of message.sections) { exports.CDataGCCStrike15V2TournamentSection.encode(v, writer.uint32(10).fork()).ldelim(); } if (message.tournamentEvent !== undefined) { exports.TournamentEvent.encode(message.tournamentEvent, writer.uint32(18).fork()).ldelim(); } for (const v of message.tournamentTeams) { exports.TournamentTeam.encode(v, writer.uint32(26).fork()).ldelim(); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCDataGCCStrike15V2TournamentInfo(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.sections.push(exports.CDataGCCStrike15V2TournamentSection.decode(reader, reader.uint32())); break; case 2: message.tournamentEvent = exports.TournamentEvent.decode(reader, reader.uint32()); break; case 3: message.tournamentTeams.push(exports.TournamentTeam.decode(reader, reader.uint32())); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b; const message = createBaseCDataGCCStrike15V2TournamentInfo(); message.sections = ((_a = object.sections) === null || _a === void 0 ? void 0 : _a.map(e => exports.CDataGCCStrike15V2TournamentSection.fromPartial(e))) || []; message.tournamentEvent = object.tournamentEvent !== undefined && object.tournamentEvent !== null ? exports.TournamentEvent.fromPartial(object.tournamentEvent) : undefined; message.tournamentTeams = ((_b = object.tournamentTeams) === null || _b === void 0 ? void 0 : _b.map(e => exports.TournamentTeam.fromPartial(e))) || []; return message; } }; function createBaseCMsgGCCStrike15V2MatchList() { return { msgrequestid: 0, accountid: 0, servertime: 0, matches: [], streams: [], tournamentinfo: undefined }; } exports.CMsgGCCStrike15V2MatchList = { encode(message, writer = minimal_1.Writer.create()) { if (message.msgrequestid !== 0) { writer.uint32(8).uint32(message.msgrequestid); } if (message.accountid !== 0) { writer.uint32(16).uint32(message.accountid); } if (message.servertime !== 0) { writer.uint32(24).uint32(message.servertime); } for (const v of message.matches) { exports.CDataGCCStrike15V2MatchInfo.encode(v, writer.uint32(34).fork()).ldelim(); } for (const v of message.streams) { exports.TournamentTeam.encode(v, writer.uint32(42).fork()).ldelim(); } if (message.tournamentinfo !== undefined) { exports.CDataGCCStrike15V2TournamentInfo.encode(message.tournamentinfo, writer.uint32(50).fork()).ldelim(); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCMsgGCCStrike15V2MatchList(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.msgrequestid = reader.uint32(); break; case 2: message.accountid = reader.uint32(); break; case 3: message.servertime = reader.uint32(); break; case 4: message.matches.push(exports.CDataGCCStrike15V2MatchInfo.decode(reader, reader.uint32())); break; case 5: message.streams.push(exports.TournamentTeam.decode(reader, reader.uint32())); break; case 6: message.tournamentinfo = exports.CDataGCCStrike15V2TournamentInfo.decode(reader, reader.uint32()); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c, _d, _e; const message = createBaseCMsgGCCStrike15V2MatchList(); message.msgrequestid = (_a = object.msgrequestid) !== null && _a !== void 0 ? _a : 0; message.accountid = (_b = object.accountid) !== null && _b !== void 0 ? _b : 0; message.servertime = (_c = object.servertime) !== null && _c !== void 0 ? _c : 0; message.matches = ((_d = object.matches) === null || _d === void 0 ? void 0 : _d.map(e => exports.CDataGCCStrike15V2MatchInfo.fromPartial(e))) || []; message.streams = ((_e = object.streams) === null || _e === void 0 ? void 0 : _e.map(e => exports.TournamentTeam.fromPartial(e))) || []; message.tournamentinfo = object.tournamentinfo !== undefined && object.tournamentinfo !== null ? exports.CDataGCCStrike15V2TournamentInfo.fromPartial(object.tournamentinfo) : undefined; return message; } }; function createBaseCMsgGCCStrike15V2MatchListTournamentOperatorMgmt() { return { eventid: 0, matches: [] }; } exports.CMsgGCCStrike15V2MatchListTournamentOperatorMgmt = { encode(message, writer = minimal_1.Writer.create()) { if (message.eventid !== 0) { writer.uint32(8).int32(message.eventid); } for (const v of message.matches) { exports.CDataGCCStrike15V2MatchInfo.encode(v, writer.uint32(18).fork()).ldelim(); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCMsgGCCStrike15V2MatchListTournamentOperatorMgmt(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.eventid = reader.int32(); break; case 2: message.matches.push(exports.CDataGCCStrike15V2MatchInfo.decode(reader, reader.uint32())); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b; const message = createBaseCMsgGCCStrike15V2MatchListTournamentOperatorMgmt(); message.eventid = (_a = object.eventid) !== null && _a !== void 0 ? _a : 0; message.matches = ((_b = object.matches) === null || _b === void 0 ? void 0 : _b.map(e => exports.CDataGCCStrike15V2MatchInfo.fromPartial(e))) || []; return message; } }; function createBaseCMsgGCCStrike15V2Predictions() { return { eventId: 0, groupMatchTeamPicks: [] }; } exports.CMsgGCCStrike15V2Predictions = { encode(message, writer = minimal_1.Writer.create()) { if (message.eventId !== 0) { writer.uint32(8).uint32(message.eventId); } for (const v of message.groupMatchTeamPicks) { exports.CMsgGCCStrike15V2Predictions_GroupMatchTeamPick.encode(v, writer.uint32(18).fork()).ldelim(); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCMsgGCCStrike15V2Predictions(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.eventId = reader.uint32(); break; case 2: message.groupMatchTeamPicks.push(exports.CMsgGCCStrike15V2Predictions_GroupMatchTeamPick.decode(reader, reader.uint32())); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b; const message = createBaseCMsgGCCStrike15V2Predictions(); message.eventId = (_a = object.eventId) !== null && _a !== void 0 ? _a : 0; message.groupMatchTeamPicks = ((_b = object.groupMatchTeamPicks) === null || _b === void 0 ? void 0 : _b.map(e => exports.CMsgGCCStrike15V2Predictions_GroupMatchTeamPick.fromPartial(e))) || []; return message; } }; function createBaseCMsgGCCStrike15V2Predictions_GroupMatchTeamPick() { return { sectionid: 0, groupid: 0, index: 0, teamid: 0, itemid: Long.UZERO }; } exports.CMsgGCCStrike15V2Predictions_GroupMatchTeamPick = { encode(message, writer = minimal_1.Writer.create()) { if (message.sectionid !== 0) { writer.uint32(8).int32(message.sectionid); } if (message.groupid !== 0) { writer.uint32(16).int32(message.groupid); } if (message.index !== 0) { writer.uint32(24).int32(message.index); } if (message.teamid !== 0) { writer.uint32(32).int32(message.teamid); } if (!message.itemid.isZero()) { writer.uint32(40).uint64(message.itemid); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCMsgGCCStrike15V2Predictions_GroupMatchTeamPick(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.sectionid = reader.int32(); break; case 2: message.groupid = reader.int32(); break; case 3: message.index = reader.int32(); break; case 4: message.teamid = reader.int32(); break; case 5: message.itemid = reader.uint64(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c, _d; const message = createBaseCMsgGCCStrike15V2Predictions_GroupMatchTeamPick(); message.sectionid = (_a = object.sectionid) !== null && _a !== void 0 ? _a : 0; message.groupid = (_b = object.groupid) !== null && _b !== void 0 ? _b : 0; message.index = (_c = object.index) !== null && _c !== void 0 ? _c : 0; message.teamid = (_d = object.teamid) !== null && _d !== void 0 ? _d : 0; message.itemid = object.itemid !== undefined && object.itemid !== null ? Long.fromValue(object.itemid) : Long.UZERO; return message; } }; function createBaseCMsgGCCStrike15V2Fantasy() { return { eventId: 0, teams: [] }; } exports.CMsgGCCStrike15V2Fantasy = { encode(message, writer = minimal_1.Writer.create()) { if (message.eventId !== 0) { writer.uint32(8).uint32(message.eventId); } for (const v of message.teams) { exports.CMsgGCCStrike15V2Fantasy_FantasyTeam.encode(v, writer.uint32(18).fork()).ldelim(); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCMsgGCCStrike15V2Fantasy(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.eventId = reader.uint32(); break; case 2: message.teams.push(exports.CMsgGCCStrike15V2Fantasy_FantasyTeam.decode(reader, reader.uint32())); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b; const message = createBaseCMsgGCCStrike15V2Fantasy(); message.eventId = (_a = object.eventId) !== null && _a !== void 0 ? _a : 0; message.teams = ((_b = object.teams) === null || _b === void 0 ? void 0 : _b.map(e => exports.CMsgGCCStrike15V2Fantasy_FantasyTeam.fromPartial(e))) || []; return message; } }; function createBaseCMsgGCCStrike15V2Fantasy_FantasySlot() { return { type: 0, pick: 0, itemid: Long.UZERO }; } exports.CMsgGCCStrike15V2Fantasy_FantasySlot = { encode(message, writer = minimal_1.Writer.create()) { if (message.type !== 0) { writer.uint32(8).int32(message.type); } if (message.pick !== 0) { writer.uint32(16).int32(message.pick); } if (!message.itemid.isZero()) { writer.uint32(24).uint64(message.itemid); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCMsgGCCStrike15V2Fantasy_FantasySlot(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.type = reader.int32(); break; case 2: message.pick = reader.int32(); break; case 3: message.itemid = reader.uint64(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b; const message = createBaseCMsgGCCStrike15V2Fantasy_FantasySlot(); message.type = (_a = object.type) !== null && _a !== void 0 ? _a : 0; message.pick = (_b = object.pick) !== null && _b !== void 0 ? _b : 0; message.itemid = object.itemid !== undefined && object.itemid !== null ? Long.fromValue(object.itemid) : Long.UZERO; return message; } }; function createBaseCMsgGCCStrike15V2Fantasy_FantasyTeam() { return { sectionid: 0, slots: [] }; } exports.CMsgGCCStrike15V2Fantasy_FantasyTeam = { encode(message, writer = minimal_1.Writer.create()) { if (message.sectionid !== 0) { writer.uint32(8).int32(message.sectionid); } for (const v of message.slots) { exports.CMsgGCCStrike15V2Fantasy_FantasySlot.encode(v, writer.uint32(18).fork()).ldelim(); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCMsgGCCStrike15V2Fantasy_FantasyTeam(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.sectionid = reader.int32(); break; case 2: message.slots.push(exports.CMsgGCCStrike15V2Fantasy_FantasySlot.decode(reader, reader.uint32())); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b; const message = createBaseCMsgGCCStrike15V2Fantasy_FantasyTeam(); message.sectionid = (_a = object.sectionid) !== null && _a !== void 0 ? _a : 0; message.slots = ((_b = object.slots) === null || _b === void 0 ? void 0 : _b.map(e => exports.CMsgGCCStrike15V2Fantasy_FantasySlot.fromPartial(e))) || []; return message; } }; function createBaseCAttributeString() { return { value: "" }; } exports.CAttributeString = { encode(message, writer = minimal_1.Writer.create()) { if (message.value !== "") { writer.uint32(10).string(message.value); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCAttributeString(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.value = reader.string(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a; const message = createBaseCAttributeString(); message.value = (_a = object.value) !== null && _a !== void 0 ? _a : ""; return message; } }; function createBaseCMsgCStrike15Welcome() { return { storeItemHash: 0, timeplayedconsecutively: 0, timeFirstPlayed: 0, lastTimePlayed: 0, lastIpAddress: 0, gscookieid: Long.UZERO, uniqueid: Long.UZERO }; } exports.CMsgCStrike15Welcome = { encode(message, writer = minimal_1.Writer.create()) { if (message.storeItemHash !== 0) { writer.uint32(40).uint32(message.storeItemHash); } if (message.timeplayedconsecutively !== 0) { writer.uint32(48).uint32(message.timeplayedconsecutively); } if (message.timeFirstPlayed !== 0) { writer.uint32(80).uint32(message.timeFirstPlayed); } if (message.lastTimePlayed !== 0) { writer.uint32(96).uint32(message.lastTimePlayed); } if (message.lastIpAddress !== 0) { writer.uint32(104).uint32(message.lastIpAddress); } if (!message.gscookieid.isZero()) { writer.uint32(144).uint64(message.gscookieid); } if (!message.uniqueid.isZero()) { writer.uint32(152).uint64(message.uniqueid); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCMsgCStrike15Welcome(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 5: message.storeItemHash = reader.uint32(); break; case 6: message.timeplayedconsecutively = reader.uint32(); break; case 10: message.timeFirstPlayed = reader.uint32(); break; case 12: message.lastTimePlayed = reader.uint32(); break; case 13: message.lastIpAddress = reader.uint32(); break; case 18: message.gscookieid = reader.uint64(); break; case 19: message.uniqueid = reader.uint64(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c, _d, _e; const message = createBaseCMsgCStrike15Welcome(); message.storeItemHash = (_a = object.storeItemHash) !== null && _a !== void 0 ? _a : 0; message.timeplayedconsecutively = (_b = object.timeplayedconsecutively) !== null && _b !== void 0 ? _b : 0; message.timeFirstPlayed = (_c = object.timeFirstPlayed) !== null && _c !== void 0 ? _c : 0; message.lastTimePlayed = (_d = object.lastTimePlayed) !== null && _d !== void 0 ? _d : 0; message.lastIpAddress = (_e = object.lastIpAddress) !== null && _e !== void 0 ? _e : 0; message.gscookieid = object.gscookieid !== undefined && object.gscookieid !== null ? Long.fromValue(object.gscookieid) : Long.UZERO; message.uniqueid = object.uniqueid !== undefined && object.uniqueid !== null ? Long.fromValue(object.uniqueid) : Long.UZERO; return message; } }; function createBaseCMsgGCCStrike15V2ClientVarValueNotificationInfo() { return { valueName: "", valueInt: 0, serverAddr: 0, serverPort: 0, chokedBlocks: [] }; } exports.CMsgGCCStrike15V2ClientVarValueNotificationInfo = { encode(message, writer = minimal_1.Writer.create()) { if (message.valueName !== "") { writer.uint32(10).string(message.valueName); } if (message.valueInt !== 0) { writer.uint32(16).int32(message.valueInt); } if (message.serverAddr !== 0) { writer.uint32(24).uint32(message.serverAddr); } if (message.serverPort !== 0) { writer.uint32(32).uint32(message.serverPort); } for (const v of message.chokedBlocks) { writer.uint32(42).string(v); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCMsgGCCStrike15V2ClientVarValueNotificationInfo(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.valueName = reader.string(); break; case 2: message.valueInt = reader.int32(); break; case 3: message.serverAddr = reader.uint32(); break; case 4: message.serverPort = reader.uint32(); break; case 5: message.chokedBlocks.push(reader.string()); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c, _d, _e; const message = createBaseCMsgGCCStrike15V2ClientVarValueNotificationInfo(); message.valueName = (_a = object.valueName) !== null && _a !== void 0 ? _a : ""; message.valueInt = (_b = object.valueInt) !== null && _b !== void 0 ? _b : 0; message.serverAddr = (_c = object.serverAddr) !== null && _c !== void 0 ? _c : 0; message.serverPort = (_d = object.serverPort) !== null && _d !== void 0 ? _d : 0; message.chokedBlocks = ((_e = object.chokedBlocks) === null || _e === void 0 ? void 0 : _e.map(e => e)) || []; return message; } }; function createBaseCMsgGCCStrike15V2ServerVarValueNotificationInfo() { return { accountid: 0, viewangles: [], type: 0, userdata: [] }; } exports.CMsgGCCStrike15V2ServerVarValueNotificationInfo = { encode(message, writer = minimal_1.Writer.create()) { if (message.accountid !== 0) { writer.uint32(8).uint32(message.accountid); } writer.uint32(18).fork(); for (const v of message.viewangles) { writer.uint32(v); } writer.ldelim(); if (message.type !== 0) { writer.uint32(24).uint32(message.type); } writer.uint32(34).fork(); for (const v of message.userdata) { writer.uint32(v); } writer.ldelim(); return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCMsgGCCStrike15V2ServerVarValueNotificationInfo(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.accountid = reader.uint32(); break; case 2: if ((tag & 7) === 2) { const end2 = reader.uint32() + reader.pos; while (reader.pos < end2) { message.viewangles.push(reader.uint32()); } } else { message.viewangles.push(reader.uint32()); } break; case 3: message.type = reader.uint32(); break; case 4: if ((tag & 7) === 2) { const end2 = reader.uint32() + reader.pos; while (reader.pos < end2) { message.userdata.push(reader.uint32()); } } else { message.userdata.push(reader.uint32()); } break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c, _d; const message = createBaseCMsgGCCStrike15V2ServerVarValueNotificationInfo(); message.accountid = (_a = object.accountid) !== null && _a !== void 0 ? _a : 0; message.viewangles = ((_b = object.viewangles) === null || _b === void 0 ? void 0 : _b.map(e => e)) || []; message.type = (_c = object.type) !== null && _c !== void 0 ? _c : 0; message.userdata = ((_d = object.userdata) === null || _d === void 0 ? void 0 : _d.map(e => e)) || []; return message; } }; function createBaseCMsgGCCStrike15V2GiftsLeaderboardRequest() { return {}; } exports.CMsgGCCStrike15V2GiftsLeaderboardRequest = { encode(_, writer = minimal_1.Writer.create()) { return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCMsgGCCStrike15V2GiftsLeaderboardRequest(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(_) { const message = createBaseCMsgGCCStrike15V2GiftsLeaderboardRequest(); return message; } }; function createBaseCMsgGCCStrike15V2GiftsLeaderboardResponse() { return { servertime: 0, timePeriodSeconds: 0, totalGiftsGiven: 0, totalGivers: 0, entries: [] }; } exports.CMsgGCCStrike15V2GiftsLeaderboardResponse = { encode(message, writer = minimal_1.Writer.create()) { if (message.servertime !== 0) { writer.uint32(8).uint32(message.servertime); } if (message.timePeriodSeconds !== 0) { writer.uint32(16).uint32(message.timePeriodSeconds); } if (message.totalGiftsGiven !== 0) { writer.uint32(24).uint32(message.totalGiftsGiven); } if (message.totalGivers !== 0) { writer.uint32(32).uint32(message.totalGivers); } for (const v of message.entries) { exports.CMsgGCCStrike15V2GiftsLeaderboardResponse_GiftLeaderboardEntry.encode(v, writer.uint32(42).fork()).ldelim(); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCMsgGCCStrike15V2GiftsLeaderboardResponse(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.servertime = reader.uint32(); break; case 2: message.timePeriodSeconds = reader.uint32(); break; case 3: message.totalGiftsGiven = reader.uint32(); break; case 4: message.totalGivers = reader.uint32(); break; case 5: message.entries.push(exports.CMsgGCCStrike15V2GiftsLeaderboardResponse_GiftLeaderboardEntry.decode(reader, reader.uint32())); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c, _d, _e; const message = createBaseCMsgGCCStrike15V2GiftsLeaderboardResponse(); message.servertime = (_a = object.servertime) !== null && _a !== void 0 ? _a : 0; message.timePeriodSeconds = (_b = object.timePeriodSeconds) !== null && _b !== void 0 ? _b : 0; message.totalGiftsGiven = (_c = object.totalGiftsGiven) !== null && _c !== void 0 ? _c : 0; message.totalGivers = (_d = object.totalGivers) !== null && _d !== void 0 ? _d : 0; message.entries = ((_e = object.entries) === null || _e === void 0 ? void 0 : _e.map(e => exports.CMsgGCCStrike15V2GiftsLeaderboardResponse_GiftLeaderboardEntry.fromPartial(e))) || []; return message; } }; function createBaseCMsgGCCStrike15V2GiftsLeaderboardResponse_GiftLeaderboardEntry() { return { accountid: 0, gifts: 0 }; } exports.CMsgGCCStrike15V2GiftsLeaderboardResponse_GiftLeaderboardEntry = { encode(message, writer = minimal_1.Writer.create()) { if (message.accountid !== 0) { writer.uint32(8).uint32(message.accountid); } if (message.gifts !== 0) { writer.uint32(16).uint32(message.gifts); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCMsgGCCStrike15V2GiftsLeaderboardResponse_GiftLeaderboardEntry(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.accountid = reader.uint32(); break; case 2: message.gifts = reader.uint32(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b; const message = createBaseCMsgGCCStrike15V2GiftsLeaderboardResponse_GiftLeaderboardEntry(); message.accountid = (_a = object.accountid) !== null && _a !== void 0 ? _a : 0; message.gifts = (_b = object.gifts) !== null && _b !== void 0 ? _b : 0; return message; } }; function createBaseCMsgGCCStrike15V2ClientSubmitSurveyVote() { return { surveyId: 0, vote: 0 }; } exports.CMsgGCCStrike15V2ClientSubmitSurveyVote = { encode(message, writer = minimal_1.Writer.create()) { if (message.surveyId !== 0) { writer.uint32(8).uint32(message.surveyId); } if (message.vote !== 0) { writer.uint32(16).uint32(message.vote); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCMsgGCCStrike15V2ClientSubmitSurveyVote(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.surveyId = reader.uint32(); break; case 2: message.vote = reader.uint32(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b; const message = createBaseCMsgGCCStrike15V2ClientSubmitSurveyVote(); message.surveyId = (_a = object.surveyId) !== null && _a !== void 0 ? _a : 0; message.vote = (_b = object.vote) !== null && _b !== void 0 ? _b : 0; return message; } }; function createBaseCMsgGCCStrike15V2Server2GCClientValidate() { return { accountid: 0 }; } exports.CMsgGCCStrike15V2Server2GCClientValidate = { encode(message, writer = minimal_1.Writer.create()) { if (message.accountid !== 0) { writer.uint32(8).uint32(message.accountid); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCMsgGCCStrike15V2Server2GCClientValidate(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.accountid = reader.uint32(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a; const message = createBaseCMsgGCCStrike15V2Server2GCClientValidate(); message.accountid = (_a = object.accountid) !== null && _a !== void 0 ? _a : 0; return message; } }; function createBaseCMsgGCCStrike15V2GC2ClientTournamentInfo() { return { eventid: 0, stageid: 0, gameType: 0, teamids: [] }; } exports.CMsgGCCStrike15V2GC2ClientTournamentInfo = { encode(message, writer = minimal_1.Writer.create()) { if (message.eventid !== 0) { writer.uint32(8).uint32(message.eventid); } if (message.stageid !== 0) { writer.uint32(16).uint32(message.stageid); } if (message.gameType !== 0) { writer.uint32(24).uint32(message.gameType); } writer.uint32(34).fork(); for (const v of message.teamids) { writer.uint32(v); } writer.ldelim(); return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCMsgGCCStrike15V2GC2ClientTournamentInfo(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.eventid = reader.uint32(); break; case 2: message.stageid = reader.uint32(); break; case 3: message.gameType = reader.uint32(); break; case 4: if ((tag & 7) === 2) { const end2 = reader.uint32() + reader.pos; while (reader.pos < end2) { message.teamids.push(reader.uint32()); } } else { message.teamids.push(reader.uint32()); } break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c, _d; const message = createBaseCMsgGCCStrike15V2GC2ClientTournamentInfo(); message.eventid = (_a = object.eventid) !== null && _a !== void 0 ? _a : 0; message.stageid = (_b = object.stageid) !== null && _b !== void 0 ? _b : 0; message.gameType = (_c = object.gameType) !== null && _c !== void 0 ? _c : 0; message.teamids = ((_d = object.teamids) === null || _d === void 0 ? void 0 : _d.map(e => e)) || []; return message; } }; function createBaseCSOEconCoupon() { return { entryid: 0, defidx: 0, expirationDate: 0 }; } exports.CSOEconCoupon = { encode(message, writer = minimal_1.Writer.create()) { if (message.entryid !== 0) { writer.uint32(8).uint32(message.entryid); } if (message.defidx !== 0) { writer.uint32(16).uint32(message.defidx); } if (message.expirationDate !== 0) { writer.uint32(29).fixed32(message.expirationDate); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCSOEconCoupon(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.entryid = reader.uint32(); break; case 2: message.defidx = reader.uint32(); break; case 3: message.expirationDate = reader.fixed32(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c; const message = createBaseCSOEconCoupon(); message.entryid = (_a = object.entryid) !== null && _a !== void 0 ? _a : 0; message.defidx = (_b = object.defidx) !== null && _b !== void 0 ? _b : 0; message.expirationDate = (_c = object.expirationDate) !== null && _c !== void 0 ? _c : 0; return message; } }; function createBaseCSOQuestProgress() { return { questid: 0, pointsRemaining: 0, bonusPoints: 0 }; } exports.CSOQuestProgress = { encode(message, writer = minimal_1.Writer.create()) { if (message.questid !== 0) { writer.uint32(8).uint32(message.questid); } if (message.pointsRemaining !== 0) { writer.uint32(16).uint32(message.pointsRemaining); } if (message.bonusPoints !== 0) { writer.uint32(24).uint32(message.bonusPoints); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCSOQuestProgress(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.questid = reader.uint32(); break; case 2: message.pointsRemaining = reader.uint32(); break; case 3: message.bonusPoints = reader.uint32(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c; const message = createBaseCSOQuestProgress(); message.questid = (_a = object.questid) !== null && _a !== void 0 ? _a : 0; message.pointsRemaining = (_b = object.pointsRemaining) !== null && _b !== void 0 ? _b : 0; message.bonusPoints = (_c = object.bonusPoints) !== null && _c !== void 0 ? _c : 0; return message; } }; function createBaseCSOAccountSeasonalOperation() { return { seasonValue: 0, tierUnlocked: 0, premiumTiers: 0, missionId: 0, missionsCompleted: 0, redeemableBalance: 0, seasonPassTime: 0 }; } exports.CSOAccountSeasonalOperation = { encode(message, writer = minimal_1.Writer.create()) { if (message.seasonValue !== 0) { writer.uint32(8).uint32(message.seasonValue); } if (message.tierUnlocked !== 0) { writer.uint32(16).uint32(message.tierUnlocked); } if (message.premiumTiers !== 0) { writer.uint32(24).uint32(message.premiumTiers); } if (message.missionId !== 0) { writer.uint32(32).uint32(message.missionId); } if (message.missionsCompleted !== 0) { writer.uint32(40).uint32(message.missionsCompleted); } if (message.redeemableBalance !== 0) { writer.uint32(48).uint32(message.redeemableBalance); } if (message.seasonPassTime !== 0) { writer.uint32(56).uint32(message.seasonPassTime); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCSOAccountSeasonalOperation(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.seasonValue = reader.uint32(); break; case 2: message.tierUnlocked = reader.uint32(); break; case 3: message.premiumTiers = reader.uint32(); break; case 4: message.missionId = reader.uint32(); break; case 5: message.missionsCompleted = reader.uint32(); break; case 6: message.redeemableBalance = reader.uint32(); break; case 7: message.seasonPassTime = reader.uint32(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c, _d, _e, _f, _g; const message = createBaseCSOAccountSeasonalOperation(); message.seasonValue = (_a = object.seasonValue) !== null && _a !== void 0 ? _a : 0; message.tierUnlocked = (_b = object.tierUnlocked) !== null && _b !== void 0 ? _b : 0; message.premiumTiers = (_c = object.premiumTiers) !== null && _c !== void 0 ? _c : 0; message.missionId = (_d = object.missionId) !== null && _d !== void 0 ? _d : 0; message.missionsCompleted = (_e = object.missionsCompleted) !== null && _e !== void 0 ? _e : 0; message.redeemableBalance = (_f = object.redeemableBalance) !== null && _f !== void 0 ? _f : 0; message.seasonPassTime = (_g = object.seasonPassTime) !== null && _g !== void 0 ? _g : 0; return message; } }; function createBaseCSOAccountRecurringSubscription() { return { timeNextCycle: 0, timeInitiated: 0 }; } exports.CSOAccountRecurringSubscription = { encode(message, writer = minimal_1.Writer.create()) { if (message.timeNextCycle !== 0) { writer.uint32(8).uint32(message.timeNextCycle); } if (message.timeInitiated !== 0) { writer.uint32(16).uint32(message.timeInitiated); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCSOAccountRecurringSubscription(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.timeNextCycle = reader.uint32(); break; case 2: message.timeInitiated = reader.uint32(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b; const message = createBaseCSOAccountRecurringSubscription(); message.timeNextCycle = (_a = object.timeNextCycle) !== null && _a !== void 0 ? _a : 0; message.timeInitiated = (_b = object.timeInitiated) !== null && _b !== void 0 ? _b : 0; return message; } }; function createBaseCSOPersonaDataPublic() { return { playerLevel: 0, commendation: undefined, elevatedState: false }; } exports.CSOPersonaDataPublic = { encode(message, writer = minimal_1.Writer.create()) { if (message.playerLevel !== 0) { writer.uint32(8).int32(message.playerLevel); } if (message.commendation !== undefined) { exports.PlayerCommendationInfo.encode(message.commendation, writer.uint32(18).fork()).ldelim(); } if (message.elevatedState === true) { writer.uint32(24).bool(message.elevatedState); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCSOPersonaDataPublic(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.playerLevel = reader.int32(); break; case 2: message.commendation = exports.PlayerCommendationInfo.decode(reader, reader.uint32()); break; case 3: message.elevatedState = reader.bool(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b; const message = createBaseCSOPersonaDataPublic(); message.playerLevel = (_a = object.playerLevel) !== null && _a !== void 0 ? _a : 0; message.commendation = object.commendation !== undefined && object.commendation !== null ? exports.PlayerCommendationInfo.fromPartial(object.commendation) : undefined; message.elevatedState = (_b = object.elevatedState) !== null && _b !== void 0 ? _b : false; return message; } }; function createBaseCMsgGCGlobalGameSubscribe() { return { ticket: Long.UZERO }; } exports.CMsgGCGlobalGameSubscribe = { encode(message, writer = minimal_1.Writer.create()) { if (!message.ticket.isZero()) { writer.uint32(8).uint64(message.ticket); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCMsgGCGlobalGameSubscribe(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.ticket = reader.uint64(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { const message = createBaseCMsgGCGlobalGameSubscribe(); message.ticket = object.ticket !== undefined && object.ticket !== null ? Long.fromValue(object.ticket) : Long.UZERO; return message; } }; function createBaseCMsgGCGlobalGameUnsubscribe() { return { timeleft: 0 }; } exports.CMsgGCGlobalGameUnsubscribe = { encode(message, writer = minimal_1.Writer.create()) { if (message.timeleft !== 0) { writer.uint32(8).int32(message.timeleft); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCMsgGCGlobalGameUnsubscribe(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.timeleft = reader.int32(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a; const message = createBaseCMsgGCGlobalGameUnsubscribe(); message.timeleft = (_a = object.timeleft) !== null && _a !== void 0 ? _a : 0; return message; } }; function createBaseCMsgGCGlobalGamePlay() { return { ticket: Long.UZERO, gametimems: 0, msperpoint: 0 }; } exports.CMsgGCGlobalGamePlay = { encode(message, writer = minimal_1.Writer.create()) { if (!message.ticket.isZero()) { writer.uint32(8).uint64(message.ticket); } if (message.gametimems !== 0) { writer.uint32(16).uint32(message.gametimems); } if (message.msperpoint !== 0) { writer.uint32(24).uint32(message.msperpoint); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCMsgGCGlobalGamePlay(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.ticket = reader.uint64(); break; case 2: message.gametimems = reader.uint32(); break; case 3: message.msperpoint = reader.uint32(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b; const message = createBaseCMsgGCGlobalGamePlay(); message.ticket = object.ticket !== undefined && object.ticket !== null ? Long.fromValue(object.ticket) : Long.UZERO; message.gametimems = (_a = object.gametimems) !== null && _a !== void 0 ? _a : 0; message.msperpoint = (_b = object.msperpoint) !== null && _b !== void 0 ? _b : 0; return message; } }; function createBaseCMsgGCCStrike15V2AcknowledgePenalty() { return { acknowledged: 0 }; } exports.CMsgGCCStrike15V2AcknowledgePenalty = { encode(message, writer = minimal_1.Writer.create()) { if (message.acknowledged !== 0) { writer.uint32(8).int32(message.acknowledged); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCMsgGCCStrike15V2AcknowledgePenalty(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.acknowledged = reader.int32(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a; const message = createBaseCMsgGCCStrike15V2AcknowledgePenalty(); message.acknowledged = (_a = object.acknowledged) !== null && _a !== void 0 ? _a : 0; return message; } }; function createBaseCMsgGCCStrike15V2Client2GCRequestPrestigeCoin() { return { defindex: 0, upgradeid: Long.UZERO, hours: 0, prestigetime: 0 }; } exports.CMsgGCCStrike15V2Client2GCRequestPrestigeCoin = { encode(message, writer = minimal_1.Writer.create()) { if (message.defindex !== 0) { writer.uint32(8).uint32(message.defindex); } if (!message.upgradeid.isZero()) { writer.uint32(16).uint64(message.upgradeid); } if (message.hours !== 0) { writer.uint32(24).uint32(message.hours); } if (message.prestigetime !== 0) { writer.uint32(32).uint32(message.prestigetime); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCMsgGCCStrike15V2Client2GCRequestPrestigeCoin(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.defindex = reader.uint32(); break; case 2: message.upgradeid = reader.uint64(); break; case 3: message.hours = reader.uint32(); break; case 4: message.prestigetime = reader.uint32(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c; const message = createBaseCMsgGCCStrike15V2Client2GCRequestPrestigeCoin(); message.defindex = (_a = object.defindex) !== null && _a !== void 0 ? _a : 0; message.upgradeid = object.upgradeid !== undefined && object.upgradeid !== null ? Long.fromValue(object.upgradeid) : Long.UZERO; message.hours = (_b = object.hours) !== null && _b !== void 0 ? _b : 0; message.prestigetime = (_c = object.prestigetime) !== null && _c !== void 0 ? _c : 0; return message; } }; function createBaseCMsgGCCStrike15V2Client2GCStreamUnlock() { return { ticket: Long.UZERO, os: 0 }; } exports.CMsgGCCStrike15V2Client2GCStreamUnlock = { encode(message, writer = minimal_1.Writer.create()) { if (!message.ticket.isZero()) { writer.uint32(8).uint64(message.ticket); } if (message.os !== 0) { writer.uint32(16).int32(message.os); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCMsgGCCStrike15V2Client2GCStreamUnlock(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.ticket = reader.uint64(); break; case 2: message.os = reader.int32(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a; const message = createBaseCMsgGCCStrike15V2Client2GCStreamUnlock(); message.ticket = object.ticket !== undefined && object.ticket !== null ? Long.fromValue(object.ticket) : Long.UZERO; message.os = (_a = object.os) !== null && _a !== void 0 ? _a : 0; return message; } }; function createBaseCMsgGCCStrike15V2ClientToGCRequestElevate() { return { stage: 0 }; } exports.CMsgGCCStrike15V2ClientToGCRequestElevate = { encode(message, writer = minimal_1.Writer.create()) { if (message.stage !== 0) { writer.uint32(8).uint32(message.stage); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCMsgGCCStrike15V2ClientToGCRequestElevate(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.stage = reader.uint32(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a; const message = createBaseCMsgGCCStrike15V2ClientToGCRequestElevate(); message.stage = (_a = object.stage) !== null && _a !== void 0 ? _a : 0; return message; } }; function createBaseCMsgGCCStrike15V2ClientToGCChat() { return { matchId: Long.UZERO, text: "" }; } exports.CMsgGCCStrike15V2ClientToGCChat = { encode(message, writer = minimal_1.Writer.create()) { if (!message.matchId.isZero()) { writer.uint32(8).uint64(message.matchId); } if (message.text !== "") { writer.uint32(18).string(message.text); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCMsgGCCStrike15V2ClientToGCChat(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.matchId = reader.uint64(); break; case 2: message.text = reader.string(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a; const message = createBaseCMsgGCCStrike15V2ClientToGCChat(); message.matchId = object.matchId !== undefined && object.matchId !== null ? Long.fromValue(object.matchId) : Long.UZERO; message.text = (_a = object.text) !== null && _a !== void 0 ? _a : ""; return message; } }; function createBaseCMsgGCCStrike15V2GCToClientChat() { return { accountId: 0, text: "" }; } exports.CMsgGCCStrike15V2GCToClientChat = { encode(message, writer = minimal_1.Writer.create()) { if (message.accountId !== 0) { writer.uint32(8).uint32(message.accountId); } if (message.text !== "") { writer.uint32(18).string(message.text); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCMsgGCCStrike15V2GCToClientChat(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.accountId = reader.uint32(); break; case 2: message.text = reader.string(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b; const message = createBaseCMsgGCCStrike15V2GCToClientChat(); message.accountId = (_a = object.accountId) !== null && _a !== void 0 ? _a : 0; message.text = (_b = object.text) !== null && _b !== void 0 ? _b : ""; return message; } }; function createBaseCMsgGCCStrike15V2ClientAuthKeyCode() { return { eventid: 0, code: "" }; } exports.CMsgGCCStrike15V2ClientAuthKeyCode = { encode(message, writer = minimal_1.Writer.create()) { if (message.eventid !== 0) { writer.uint32(8).uint32(message.eventid); } if (message.code !== "") { writer.uint32(18).string(message.code); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCMsgGCCStrike15V2ClientAuthKeyCode(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.eventid = reader.uint32(); break; case 2: message.code = reader.string(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b; const message = createBaseCMsgGCCStrike15V2ClientAuthKeyCode(); message.eventid = (_a = object.eventid) !== null && _a !== void 0 ? _a : 0; message.code = (_b = object.code) !== null && _b !== void 0 ? _b : ""; return message; } }; function createBaseCMsgGCCStrike15GotvSyncPacket() { return { data: undefined }; } exports.CMsgGCCStrike15GotvSyncPacket = { encode(message, writer = minimal_1.Writer.create()) { if (message.data !== undefined) { engine_gcmessages_1.CEngineGotvSyncPacket.encode(message.data, writer.uint32(10).fork()).ldelim(); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCMsgGCCStrike15GotvSyncPacket(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.data = engine_gcmessages_1.CEngineGotvSyncPacket.decode(reader, reader.uint32()); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { const message = createBaseCMsgGCCStrike15GotvSyncPacket(); message.data = object.data !== undefined && object.data !== null ? engine_gcmessages_1.CEngineGotvSyncPacket.fromPartial(object.data) : undefined; return message; } }; function createBasePlayerDecalDigitalSignature() { return { signature: new Uint8Array(), accountid: 0, rtime: 0, endpos: [], startpos: [], right: [], txDefidx: 0, entindex: 0, hitbox: 0, creationtime: 0, equipslot: 0, traceId: 0, normal: [], tintId: 0 }; } exports.PlayerDecalDigitalSignature = { encode(message, writer = minimal_1.Writer.create()) { if (message.signature.length !== 0) { writer.uint32(10).bytes(message.signature); } if (message.accountid !== 0) { writer.uint32(16).uint32(message.accountid); } if (message.rtime !== 0) { writer.uint32(24).uint32(message.rtime); } writer.uint32(34).fork(); for (const v of message.endpos) { writer.float(v); } writer.ldelim(); writer.uint32(42).fork(); for (const v of message.startpos) { writer.float(v); } writer.ldelim(); writer.uint32(50).fork(); for (const v of message.right) { writer.float(v); } writer.ldelim(); if (message.txDefidx !== 0) { writer.uint32(56).uint32(message.txDefidx); } if (message.entindex !== 0) { writer.uint32(64).int32(message.entindex); } if (message.hitbox !== 0) { writer.uint32(72).uint32(message.hitbox); } if (message.creationtime !== 0) { writer.uint32(85).float(message.creationtime); } if (message.equipslot !== 0) { writer.uint32(88).uint32(message.equipslot); } if (message.traceId !== 0) { writer.uint32(96).uint32(message.traceId); } writer.uint32(106).fork(); for (const v of message.normal) { writer.float(v); } writer.ldelim(); if (message.tintId !== 0) { writer.uint32(112).uint32(message.tintId); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBasePlayerDecalDigitalSignature(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.signature = reader.bytes(); break; case 2: message.accountid = reader.uint32(); break; case 3: message.rtime = reader.uint32(); break; case 4: if ((tag & 7) === 2) { const end2 = reader.uint32() + reader.pos; while (reader.pos < end2) { message.endpos.push(reader.float()); } } else { message.endpos.push(reader.float()); } break; case 5: if ((tag & 7) === 2) { const end2 = reader.uint32() + reader.pos; while (reader.pos < end2) { message.startpos.push(reader.float()); } } else { message.startpos.push(reader.float()); } break; case 6: if ((tag & 7) === 2) { const end2 = reader.uint32() + reader.pos; while (reader.pos < end2) { message.right.push(reader.float()); } } else { message.right.push(reader.float()); } break; case 7: message.txDefidx = reader.uint32(); break; case 8: message.entindex = reader.int32(); break; case 9: message.hitbox = reader.uint32(); break; case 10: message.creationtime = reader.float(); break; case 11: message.equipslot = reader.uint32(); break; case 12: message.traceId = reader.uint32(); break; case 13: if ((tag & 7) === 2) { const end2 = reader.uint32() + reader.pos; while (reader.pos < end2) { message.normal.push(reader.float()); } } else { message.normal.push(reader.float()); } break; case 14: message.tintId = reader.uint32(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p; const message = createBasePlayerDecalDigitalSignature(); message.signature = (_a = object.signature) !== null && _a !== void 0 ? _a : new Uint8Array(); message.accountid = (_b = object.accountid) !== null && _b !== void 0 ? _b : 0; message.rtime = (_c = object.rtime) !== null && _c !== void 0 ? _c : 0; message.endpos = ((_d = object.endpos) === null || _d === void 0 ? void 0 : _d.map(e => e)) || []; message.startpos = ((_e = object.startpos) === null || _e === void 0 ? void 0 : _e.map(e => e)) || []; message.right = ((_f = object.right) === null || _f === void 0 ? void 0 : _f.map(e => e)) || []; message.txDefidx = (_g = object.txDefidx) !== null && _g !== void 0 ? _g : 0; message.entindex = (_h = object.entindex) !== null && _h !== void 0 ? _h : 0; message.hitbox = (_j = object.hitbox) !== null && _j !== void 0 ? _j : 0; message.creationtime = (_k = object.creationtime) !== null && _k !== void 0 ? _k : 0; message.equipslot = (_l = object.equipslot) !== null && _l !== void 0 ? _l : 0; message.traceId = (_m = object.traceId) !== null && _m !== void 0 ? _m : 0; message.normal = ((_o = object.normal) === null || _o === void 0 ? void 0 : _o.map(e => e)) || []; message.tintId = (_p = object.tintId) !== null && _p !== void 0 ? _p : 0; return message; } }; function createBaseCMsgGCCStrike15V2ClientPlayerDecalSign() { return { data: undefined, itemid: Long.UZERO }; } exports.CMsgGCCStrike15V2ClientPlayerDecalSign = { encode(message, writer = minimal_1.Writer.create()) { if (message.data !== undefined) { exports.PlayerDecalDigitalSignature.encode(message.data, writer.uint32(10).fork()).ldelim(); } if (!message.itemid.isZero()) { writer.uint32(16).uint64(message.itemid); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCMsgGCCStrike15V2ClientPlayerDecalSign(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.data = exports.PlayerDecalDigitalSignature.decode(reader, reader.uint32()); break; case 2: message.itemid = reader.uint64(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { const message = createBaseCMsgGCCStrike15V2ClientPlayerDecalSign(); message.data = object.data !== undefined && object.data !== null ? exports.PlayerDecalDigitalSignature.fromPartial(object.data) : undefined; message.itemid = object.itemid !== undefined && object.itemid !== null ? Long.fromValue(object.itemid) : Long.UZERO; return message; } }; function createBaseCMsgGCCStrike15V2ClientLogonFatalError() { return { errorcode: 0, message: "", country: "" }; } exports.CMsgGCCStrike15V2ClientLogonFatalError = { encode(message, writer = minimal_1.Writer.create()) { if (message.errorcode !== 0) { writer.uint32(8).uint32(message.errorcode); } if (message.message !== "") { writer.uint32(18).string(message.message); } if (message.country !== "") { writer.uint32(26).string(message.country); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCMsgGCCStrike15V2ClientLogonFatalError(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.errorcode = reader.uint32(); break; case 2: message.message = reader.string(); break; case 3: message.country = reader.string(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c; const message = createBaseCMsgGCCStrike15V2ClientLogonFatalError(); message.errorcode = (_a = object.errorcode) !== null && _a !== void 0 ? _a : 0; message.message = (_b = object.message) !== null && _b !== void 0 ? _b : ""; message.country = (_c = object.country) !== null && _c !== void 0 ? _c : ""; return message; } }; function createBaseCMsgGCCStrike15V2ClientPollState() { return { pollid: 0, names: [], values: [] }; } exports.CMsgGCCStrike15V2ClientPollState = { encode(message, writer = minimal_1.Writer.create()) { if (message.pollid !== 0) { writer.uint32(8).uint32(message.pollid); } for (const v of message.names) { writer.uint32(18).string(v); } writer.uint32(26).fork(); for (const v of message.values) { writer.int32(v); } writer.ldelim(); return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCMsgGCCStrike15V2ClientPollState(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.pollid = reader.uint32(); break; case 2: message.names.push(reader.string()); break; case 3: if ((tag & 7) === 2) { const end2 = reader.uint32() + reader.pos; while (reader.pos < end2) { message.values.push(reader.int32()); } } else { message.values.push(reader.int32()); } break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c; const message = createBaseCMsgGCCStrike15V2ClientPollState(); message.pollid = (_a = object.pollid) !== null && _a !== void 0 ? _a : 0; message.names = ((_b = object.names) === null || _b === void 0 ? void 0 : _b.map(e => e)) || []; message.values = ((_c = object.values) === null || _c === void 0 ? void 0 : _c.map(e => e)) || []; return message; } }; function createBaseCMsgGCCStrike15V2PartyRegister() { return { id: 0, ver: 0, apr: 0, ark: 0, nby: 0, grp: 0, slots: 0, launcher: 0, gameType: 0 }; } exports.CMsgGCCStrike15V2PartyRegister = { encode(message, writer = minimal_1.Writer.create()) { if (message.id !== 0) { writer.uint32(8).uint32(message.id); } if (message.ver !== 0) { writer.uint32(16).uint32(message.ver); } if (message.apr !== 0) { writer.uint32(24).uint32(message.apr); } if (message.ark !== 0) { writer.uint32(32).uint32(message.ark); } if (message.nby !== 0) { writer.uint32(40).uint32(message.nby); } if (message.grp !== 0) { writer.uint32(48).uint32(message.grp); } if (message.slots !== 0) { writer.uint32(56).uint32(message.slots); } if (message.launcher !== 0) { writer.uint32(64).uint32(message.launcher); } if (message.gameType !== 0) { writer.uint32(72).uint32(message.gameType); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCMsgGCCStrike15V2PartyRegister(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.id = reader.uint32(); break; case 2: message.ver = reader.uint32(); break; case 3: message.apr = reader.uint32(); break; case 4: message.ark = reader.uint32(); break; case 5: message.nby = reader.uint32(); break; case 6: message.grp = reader.uint32(); break; case 7: message.slots = reader.uint32(); break; case 8: message.launcher = reader.uint32(); break; case 9: message.gameType = reader.uint32(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c, _d, _e, _f, _g, _h, _j; const message = createBaseCMsgGCCStrike15V2PartyRegister(); message.id = (_a = object.id) !== null && _a !== void 0 ? _a : 0; message.ver = (_b = object.ver) !== null && _b !== void 0 ? _b : 0; message.apr = (_c = object.apr) !== null && _c !== void 0 ? _c : 0; message.ark = (_d = object.ark) !== null && _d !== void 0 ? _d : 0; message.nby = (_e = object.nby) !== null && _e !== void 0 ? _e : 0; message.grp = (_f = object.grp) !== null && _f !== void 0 ? _f : 0; message.slots = (_g = object.slots) !== null && _g !== void 0 ? _g : 0; message.launcher = (_h = object.launcher) !== null && _h !== void 0 ? _h : 0; message.gameType = (_j = object.gameType) !== null && _j !== void 0 ? _j : 0; return message; } }; function createBaseCMsgGCCStrike15V2PartySearch() { return { ver: 0, apr: 0, ark: 0, grps: [], launcher: 0, gameType: 0 }; } exports.CMsgGCCStrike15V2PartySearch = { encode(message, writer = minimal_1.Writer.create()) { if (message.ver !== 0) { writer.uint32(8).uint32(message.ver); } if (message.apr !== 0) { writer.uint32(16).uint32(message.apr); } if (message.ark !== 0) { writer.uint32(24).uint32(message.ark); } writer.uint32(34).fork(); for (const v of message.grps) { writer.uint32(v); } writer.ldelim(); if (message.launcher !== 0) { writer.uint32(40).uint32(message.launcher); } if (message.gameType !== 0) { writer.uint32(48).uint32(message.gameType); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCMsgGCCStrike15V2PartySearch(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.ver = reader.uint32(); break; case 2: message.apr = reader.uint32(); break; case 3: message.ark = reader.uint32(); break; case 4: if ((tag & 7) === 2) { const end2 = reader.uint32() + reader.pos; while (reader.pos < end2) { message.grps.push(reader.uint32()); } } else { message.grps.push(reader.uint32()); } break; case 5: message.launcher = reader.uint32(); break; case 6: message.gameType = reader.uint32(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c, _d, _e, _f; const message = createBaseCMsgGCCStrike15V2PartySearch(); message.ver = (_a = object.ver) !== null && _a !== void 0 ? _a : 0; message.apr = (_b = object.apr) !== null && _b !== void 0 ? _b : 0; message.ark = (_c = object.ark) !== null && _c !== void 0 ? _c : 0; message.grps = ((_d = object.grps) === null || _d === void 0 ? void 0 : _d.map(e => e)) || []; message.launcher = (_e = object.launcher) !== null && _e !== void 0 ? _e : 0; message.gameType = (_f = object.gameType) !== null && _f !== void 0 ? _f : 0; return message; } }; function createBaseCMsgGCCStrike15V2PartySearchResults() { return { entries: [] }; } exports.CMsgGCCStrike15V2PartySearchResults = { encode(message, writer = minimal_1.Writer.create()) { for (const v of message.entries) { exports.CMsgGCCStrike15V2PartySearchResults_Entry.encode(v, writer.uint32(10).fork()).ldelim(); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCMsgGCCStrike15V2PartySearchResults(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.entries.push(exports.CMsgGCCStrike15V2PartySearchResults_Entry.decode(reader, reader.uint32())); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a; const message = createBaseCMsgGCCStrike15V2PartySearchResults(); message.entries = ((_a = object.entries) === null || _a === void 0 ? void 0 : _a.map(e => exports.CMsgGCCStrike15V2PartySearchResults_Entry.fromPartial(e))) || []; return message; } }; function createBaseCMsgGCCStrike15V2PartySearchResults_Entry() { return { id: 0, grp: 0, gameType: 0, apr: 0, ark: 0, loc: 0, accountid: 0 }; } exports.CMsgGCCStrike15V2PartySearchResults_Entry = { encode(message, writer = minimal_1.Writer.create()) { if (message.id !== 0) { writer.uint32(8).uint32(message.id); } if (message.grp !== 0) { writer.uint32(16).uint32(message.grp); } if (message.gameType !== 0) { writer.uint32(24).uint32(message.gameType); } if (message.apr !== 0) { writer.uint32(32).uint32(message.apr); } if (message.ark !== 0) { writer.uint32(40).uint32(message.ark); } if (message.loc !== 0) { writer.uint32(48).uint32(message.loc); } if (message.accountid !== 0) { writer.uint32(56).uint32(message.accountid); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCMsgGCCStrike15V2PartySearchResults_Entry(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.id = reader.uint32(); break; case 2: message.grp = reader.uint32(); break; case 3: message.gameType = reader.uint32(); break; case 4: message.apr = reader.uint32(); break; case 5: message.ark = reader.uint32(); break; case 6: message.loc = reader.uint32(); break; case 7: message.accountid = reader.uint32(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c, _d, _e, _f, _g; const message = createBaseCMsgGCCStrike15V2PartySearchResults_Entry(); message.id = (_a = object.id) !== null && _a !== void 0 ? _a : 0; message.grp = (_b = object.grp) !== null && _b !== void 0 ? _b : 0; message.gameType = (_c = object.gameType) !== null && _c !== void 0 ? _c : 0; message.apr = (_d = object.apr) !== null && _d !== void 0 ? _d : 0; message.ark = (_e = object.ark) !== null && _e !== void 0 ? _e : 0; message.loc = (_f = object.loc) !== null && _f !== void 0 ? _f : 0; message.accountid = (_g = object.accountid) !== null && _g !== void 0 ? _g : 0; return message; } }; function createBaseCMsgGCCStrike15V2PartyInvite() { return { accountid: 0, lobbyid: 0 }; } exports.CMsgGCCStrike15V2PartyInvite = { encode(message, writer = minimal_1.Writer.create()) { if (message.accountid !== 0) { writer.uint32(8).uint32(message.accountid); } if (message.lobbyid !== 0) { writer.uint32(16).uint32(message.lobbyid); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCMsgGCCStrike15V2PartyInvite(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.accountid = reader.uint32(); break; case 2: message.lobbyid = reader.uint32(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b; const message = createBaseCMsgGCCStrike15V2PartyInvite(); message.accountid = (_a = object.accountid) !== null && _a !== void 0 ? _a : 0; message.lobbyid = (_b = object.lobbyid) !== null && _b !== void 0 ? _b : 0; return message; } }; function createBaseCMsgGCCStrike15V2AccountRequestCoPlays() { return { players: [], servertime: 0 }; } exports.CMsgGCCStrike15V2AccountRequestCoPlays = { encode(message, writer = minimal_1.Writer.create()) { for (const v of message.players) { exports.CMsgGCCStrike15V2AccountRequestCoPlays_Player.encode(v, writer.uint32(10).fork()).ldelim(); } if (message.servertime !== 0) { writer.uint32(16).uint32(message.servertime); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCMsgGCCStrike15V2AccountRequestCoPlays(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.players.push(exports.CMsgGCCStrike15V2AccountRequestCoPlays_Player.decode(reader, reader.uint32())); break; case 2: message.servertime = reader.uint32(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b; const message = createBaseCMsgGCCStrike15V2AccountRequestCoPlays(); message.players = ((_a = object.players) === null || _a === void 0 ? void 0 : _a.map(e => exports.CMsgGCCStrike15V2AccountRequestCoPlays_Player.fromPartial(e))) || []; message.servertime = (_b = object.servertime) !== null && _b !== void 0 ? _b : 0; return message; } }; function createBaseCMsgGCCStrike15V2AccountRequestCoPlays_Player() { return { accountid: 0, rtcoplay: 0, online: false }; } exports.CMsgGCCStrike15V2AccountRequestCoPlays_Player = { encode(message, writer = minimal_1.Writer.create()) { if (message.accountid !== 0) { writer.uint32(8).uint32(message.accountid); } if (message.rtcoplay !== 0) { writer.uint32(16).uint32(message.rtcoplay); } if (message.online === true) { writer.uint32(24).bool(message.online); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCMsgGCCStrike15V2AccountRequestCoPlays_Player(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.accountid = reader.uint32(); break; case 2: message.rtcoplay = reader.uint32(); break; case 3: message.online = reader.bool(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c; const message = createBaseCMsgGCCStrike15V2AccountRequestCoPlays_Player(); message.accountid = (_a = object.accountid) !== null && _a !== void 0 ? _a : 0; message.rtcoplay = (_b = object.rtcoplay) !== null && _b !== void 0 ? _b : 0; message.online = (_c = object.online) !== null && _c !== void 0 ? _c : false; return message; } }; function createBaseCMsgGCCStrike15V2ClientToGCRequestTicket() { return { authorizedSteamId: Long.UZERO, authorizedPublicIp: 0, gameserverSteamId: Long.UZERO, gameserverSdrRouting: "" }; } exports.CMsgGCCStrike15V2ClientToGCRequestTicket = { encode(message, writer = minimal_1.Writer.create()) { if (!message.authorizedSteamId.isZero()) { writer.uint32(9).fixed64(message.authorizedSteamId); } if (message.authorizedPublicIp !== 0) { writer.uint32(21).fixed32(message.authorizedPublicIp); } if (!message.gameserverSteamId.isZero()) { writer.uint32(25).fixed64(message.gameserverSteamId); } if (message.gameserverSdrRouting !== "") { writer.uint32(42).string(message.gameserverSdrRouting); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCMsgGCCStrike15V2ClientToGCRequestTicket(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.authorizedSteamId = reader.fixed64(); break; case 2: message.authorizedPublicIp = reader.fixed32(); break; case 3: message.gameserverSteamId = reader.fixed64(); break; case 5: message.gameserverSdrRouting = reader.string(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b; const message = createBaseCMsgGCCStrike15V2ClientToGCRequestTicket(); message.authorizedSteamId = object.authorizedSteamId !== undefined && object.authorizedSteamId !== null ? Long.fromValue(object.authorizedSteamId) : Long.UZERO; message.authorizedPublicIp = (_a = object.authorizedPublicIp) !== null && _a !== void 0 ? _a : 0; message.gameserverSteamId = object.gameserverSteamId !== undefined && object.gameserverSteamId !== null ? Long.fromValue(object.gameserverSteamId) : Long.UZERO; message.gameserverSdrRouting = (_b = object.gameserverSdrRouting) !== null && _b !== void 0 ? _b : ""; return message; } }; function createBaseCMsgGCToClientSteamDatagramTicket() { return { serializedTicket: new Uint8Array() }; } exports.CMsgGCToClientSteamDatagramTicket = { encode(message, writer = minimal_1.Writer.create()) { if (message.serializedTicket.length !== 0) { writer.uint32(130).bytes(message.serializedTicket); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCMsgGCToClientSteamDatagramTicket(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 16: message.serializedTicket = reader.bytes(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a; const message = createBaseCMsgGCToClientSteamDatagramTicket(); message.serializedTicket = (_a = object.serializedTicket) !== null && _a !== void 0 ? _a : new Uint8Array(); return message; } }; function createBaseCMsgGCCStrike15V2ClientRequestOffers() { return {}; } exports.CMsgGCCStrike15V2ClientRequestOffers = { encode(_, writer = minimal_1.Writer.create()) { return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCMsgGCCStrike15V2ClientRequestOffers(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(_) { const message = createBaseCMsgGCCStrike15V2ClientRequestOffers(); return message; } }; function createBaseCMsgGCCStrike15V2ClientRequestSouvenir() { return { itemid: Long.UZERO, matchid: Long.UZERO, eventid: 0 }; } exports.CMsgGCCStrike15V2ClientRequestSouvenir = { encode(message, writer = minimal_1.Writer.create()) { if (!message.itemid.isZero()) { writer.uint32(8).uint64(message.itemid); } if (!message.matchid.isZero()) { writer.uint32(16).uint64(message.matchid); } if (message.eventid !== 0) { writer.uint32(24).int32(message.eventid); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCMsgGCCStrike15V2ClientRequestSouvenir(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.itemid = reader.uint64(); break; case 2: message.matchid = reader.uint64(); break; case 3: message.eventid = reader.int32(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a; const message = createBaseCMsgGCCStrike15V2ClientRequestSouvenir(); message.itemid = object.itemid !== undefined && object.itemid !== null ? Long.fromValue(object.itemid) : Long.UZERO; message.matchid = object.matchid !== undefined && object.matchid !== null ? Long.fromValue(object.matchid) : Long.UZERO; message.eventid = (_a = object.eventid) !== null && _a !== void 0 ? _a : 0; return message; } }; function createBaseCMsgGCCStrike15V2ClientAccountBalance() { return { amount: Long.UZERO, url: "" }; } exports.CMsgGCCStrike15V2ClientAccountBalance = { encode(message, writer = minimal_1.Writer.create()) { if (!message.amount.isZero()) { writer.uint32(8).uint64(message.amount); } if (message.url !== "") { writer.uint32(18).string(message.url); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCMsgGCCStrike15V2ClientAccountBalance(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.amount = reader.uint64(); break; case 2: message.url = reader.string(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a; const message = createBaseCMsgGCCStrike15V2ClientAccountBalance(); message.amount = object.amount !== undefined && object.amount !== null ? Long.fromValue(object.amount) : Long.UZERO; message.url = (_a = object.url) !== null && _a !== void 0 ? _a : ""; return message; } }; function createBaseCMsgGCCStrike15V2ClientPartyJoinRelay() { return { accountid: 0, lobbyid: Long.UZERO }; } exports.CMsgGCCStrike15V2ClientPartyJoinRelay = { encode(message, writer = minimal_1.Writer.create()) { if (message.accountid !== 0) { writer.uint32(8).uint32(message.accountid); } if (!message.lobbyid.isZero()) { writer.uint32(16).uint64(message.lobbyid); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCMsgGCCStrike15V2ClientPartyJoinRelay(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.accountid = reader.uint32(); break; case 2: message.lobbyid = reader.uint64(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a; const message = createBaseCMsgGCCStrike15V2ClientPartyJoinRelay(); message.accountid = (_a = object.accountid) !== null && _a !== void 0 ? _a : 0; message.lobbyid = object.lobbyid !== undefined && object.lobbyid !== null ? Long.fromValue(object.lobbyid) : Long.UZERO; return message; } }; function createBaseCMsgGCCStrike15V2ClientPartyWarning() { return { entries: [] }; } exports.CMsgGCCStrike15V2ClientPartyWarning = { encode(message, writer = minimal_1.Writer.create()) { for (const v of message.entries) { exports.CMsgGCCStrike15V2ClientPartyWarning_Entry.encode(v, writer.uint32(10).fork()).ldelim(); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCMsgGCCStrike15V2ClientPartyWarning(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.entries.push(exports.CMsgGCCStrike15V2ClientPartyWarning_Entry.decode(reader, reader.uint32())); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a; const message = createBaseCMsgGCCStrike15V2ClientPartyWarning(); message.entries = ((_a = object.entries) === null || _a === void 0 ? void 0 : _a.map(e => exports.CMsgGCCStrike15V2ClientPartyWarning_Entry.fromPartial(e))) || []; return message; } }; function createBaseCMsgGCCStrike15V2ClientPartyWarning_Entry() { return { accountid: 0, warntype: 0 }; } exports.CMsgGCCStrike15V2ClientPartyWarning_Entry = { encode(message, writer = minimal_1.Writer.create()) { if (message.accountid !== 0) { writer.uint32(8).uint32(message.accountid); } if (message.warntype !== 0) { writer.uint32(16).uint32(message.warntype); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCMsgGCCStrike15V2ClientPartyWarning_Entry(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.accountid = reader.uint32(); break; case 2: message.warntype = reader.uint32(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b; const message = createBaseCMsgGCCStrike15V2ClientPartyWarning_Entry(); message.accountid = (_a = object.accountid) !== null && _a !== void 0 ? _a : 0; message.warntype = (_b = object.warntype) !== null && _b !== void 0 ? _b : 0; return message; } }; function createBaseCMsgGCCStrike15V2SetEventFavorite() { return { eventid: Long.UZERO, isFavorite: false }; } exports.CMsgGCCStrike15V2SetEventFavorite = { encode(message, writer = minimal_1.Writer.create()) { if (!message.eventid.isZero()) { writer.uint32(8).uint64(message.eventid); } if (message.isFavorite === true) { writer.uint32(16).bool(message.isFavorite); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCMsgGCCStrike15V2SetEventFavorite(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.eventid = reader.uint64(); break; case 2: message.isFavorite = reader.bool(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a; const message = createBaseCMsgGCCStrike15V2SetEventFavorite(); message.eventid = object.eventid !== undefined && object.eventid !== null ? Long.fromValue(object.eventid) : Long.UZERO; message.isFavorite = (_a = object.isFavorite) !== null && _a !== void 0 ? _a : false; return message; } }; function createBaseCMsgGCCStrike15V2GetEventFavoritesRequest() { return { allEvents: false }; } exports.CMsgGCCStrike15V2GetEventFavoritesRequest = { encode(message, writer = minimal_1.Writer.create()) { if (message.allEvents === true) { writer.uint32(8).bool(message.allEvents); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCMsgGCCStrike15V2GetEventFavoritesRequest(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.allEvents = reader.bool(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a; const message = createBaseCMsgGCCStrike15V2GetEventFavoritesRequest(); message.allEvents = (_a = object.allEvents) !== null && _a !== void 0 ? _a : false; return message; } }; function createBaseCMsgGCCStrike15V2GetEventFavoritesResponse() { return { allEvents: false, jsonFavorites: "", jsonFeatured: "" }; } exports.CMsgGCCStrike15V2GetEventFavoritesResponse = { encode(message, writer = minimal_1.Writer.create()) { if (message.allEvents === true) { writer.uint32(8).bool(message.allEvents); } if (message.jsonFavorites !== "") { writer.uint32(18).string(message.jsonFavorites); } if (message.jsonFeatured !== "") { writer.uint32(26).string(message.jsonFeatured); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCMsgGCCStrike15V2GetEventFavoritesResponse(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.allEvents = reader.bool(); break; case 2: message.jsonFavorites = reader.string(); break; case 3: message.jsonFeatured = reader.string(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c; const message = createBaseCMsgGCCStrike15V2GetEventFavoritesResponse(); message.allEvents = (_a = object.allEvents) !== null && _a !== void 0 ? _a : false; message.jsonFavorites = (_b = object.jsonFavorites) !== null && _b !== void 0 ? _b : ""; message.jsonFeatured = (_c = object.jsonFeatured) !== null && _c !== void 0 ? _c : ""; return message; } }; function createBaseCMsgGCCStrike15V2ClientPerfReport() { return { entries: [] }; } exports.CMsgGCCStrike15V2ClientPerfReport = { encode(message, writer = minimal_1.Writer.create()) { for (const v of message.entries) { exports.CMsgGCCStrike15V2ClientPerfReport_Entry.encode(v, writer.uint32(10).fork()).ldelim(); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCMsgGCCStrike15V2ClientPerfReport(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.entries.push(exports.CMsgGCCStrike15V2ClientPerfReport_Entry.decode(reader, reader.uint32())); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a; const message = createBaseCMsgGCCStrike15V2ClientPerfReport(); message.entries = ((_a = object.entries) === null || _a === void 0 ? void 0 : _a.map(e => exports.CMsgGCCStrike15V2ClientPerfReport_Entry.fromPartial(e))) || []; return message; } }; function createBaseCMsgGCCStrike15V2ClientPerfReport_Entry() { return { perfcounter: 0, length: 0, reference: new Uint8Array(), actual: new Uint8Array(), sourceid: 0, status: 0 }; } exports.CMsgGCCStrike15V2ClientPerfReport_Entry = { encode(message, writer = minimal_1.Writer.create()) { if (message.perfcounter !== 0) { writer.uint32(8).uint32(message.perfcounter); } if (message.length !== 0) { writer.uint32(16).uint32(message.length); } if (message.reference.length !== 0) { writer.uint32(26).bytes(message.reference); } if (message.actual.length !== 0) { writer.uint32(34).bytes(message.actual); } if (message.sourceid !== 0) { writer.uint32(40).uint32(message.sourceid); } if (message.status !== 0) { writer.uint32(48).uint32(message.status); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCMsgGCCStrike15V2ClientPerfReport_Entry(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.perfcounter = reader.uint32(); break; case 2: message.length = reader.uint32(); break; case 3: message.reference = reader.bytes(); break; case 4: message.actual = reader.bytes(); break; case 5: message.sourceid = reader.uint32(); break; case 6: message.status = reader.uint32(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c, _d, _e, _f; const message = createBaseCMsgGCCStrike15V2ClientPerfReport_Entry(); message.perfcounter = (_a = object.perfcounter) !== null && _a !== void 0 ? _a : 0; message.length = (_b = object.length) !== null && _b !== void 0 ? _b : 0; message.reference = (_c = object.reference) !== null && _c !== void 0 ? _c : new Uint8Array(); message.actual = (_d = object.actual) !== null && _d !== void 0 ? _d : new Uint8Array(); message.sourceid = (_e = object.sourceid) !== null && _e !== void 0 ? _e : 0; message.status = (_f = object.status) !== null && _f !== void 0 ? _f : 0; return message; } }; function createBaseCVDiagnostic() { return { id: 0, extended: 0, value: Long.UZERO, stringValue: "" }; } exports.CVDiagnostic = { encode(message, writer = minimal_1.Writer.create()) { if (message.id !== 0) { writer.uint32(8).uint32(message.id); } if (message.extended !== 0) { writer.uint32(16).uint32(message.extended); } if (!message.value.isZero()) { writer.uint32(24).uint64(message.value); } if (message.stringValue !== "") { writer.uint32(34).string(message.stringValue); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCVDiagnostic(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.id = reader.uint32(); break; case 2: message.extended = reader.uint32(); break; case 3: message.value = reader.uint64(); break; case 4: message.stringValue = reader.string(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c; const message = createBaseCVDiagnostic(); message.id = (_a = object.id) !== null && _a !== void 0 ? _a : 0; message.extended = (_b = object.extended) !== null && _b !== void 0 ? _b : 0; message.value = object.value !== undefined && object.value !== null ? Long.fromValue(object.value) : Long.UZERO; message.stringValue = (_c = object.stringValue) !== null && _c !== void 0 ? _c : ""; return message; } }; function createBaseCMsgGCCStrike15V2ClientReportValidation() { return { fileReport: "", commandLine: "", totalFiles: 0, internalError: 0, trustTime: 0, countPending: 0, countCompleted: 0, processId: 0, osversion: 0, clientreportversion: 0, statusId: 0, diagnostic1: 0, diagnostic2: Long.UZERO, diagnostic3: Long.UZERO, lastLaunchData: "", reportCount: 0, clientTime: Long.UZERO, diagnostic4: Long.UZERO, diagnostic5: Long.UZERO, diagnostics: [] }; } exports.CMsgGCCStrike15V2ClientReportValidation = { encode(message, writer = minimal_1.Writer.create()) { if (message.fileReport !== "") { writer.uint32(10).string(message.fileReport); } if (message.commandLine !== "") { writer.uint32(18).string(message.commandLine); } if (message.totalFiles !== 0) { writer.uint32(24).uint32(message.totalFiles); } if (message.internalError !== 0) { writer.uint32(32).uint32(message.internalError); } if (message.trustTime !== 0) { writer.uint32(40).uint32(message.trustTime); } if (message.countPending !== 0) { writer.uint32(48).uint32(message.countPending); } if (message.countCompleted !== 0) { writer.uint32(56).uint32(message.countCompleted); } if (message.processId !== 0) { writer.uint32(64).uint32(message.processId); } if (message.osversion !== 0) { writer.uint32(72).int32(message.osversion); } if (message.clientreportversion !== 0) { writer.uint32(80).uint32(message.clientreportversion); } if (message.statusId !== 0) { writer.uint32(88).uint32(message.statusId); } if (message.diagnostic1 !== 0) { writer.uint32(96).uint32(message.diagnostic1); } if (!message.diagnostic2.isZero()) { writer.uint32(104).uint64(message.diagnostic2); } if (!message.diagnostic3.isZero()) { writer.uint32(112).uint64(message.diagnostic3); } if (message.lastLaunchData !== "") { writer.uint32(122).string(message.lastLaunchData); } if (message.reportCount !== 0) { writer.uint32(128).uint32(message.reportCount); } if (!message.clientTime.isZero()) { writer.uint32(136).uint64(message.clientTime); } if (!message.diagnostic4.isZero()) { writer.uint32(144).uint64(message.diagnostic4); } if (!message.diagnostic5.isZero()) { writer.uint32(152).uint64(message.diagnostic5); } for (const v of message.diagnostics) { exports.CVDiagnostic.encode(v, writer.uint32(162).fork()).ldelim(); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCMsgGCCStrike15V2ClientReportValidation(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.fileReport = reader.string(); break; case 2: message.commandLine = reader.string(); break; case 3: message.totalFiles = reader.uint32(); break; case 4: message.internalError = reader.uint32(); break; case 5: message.trustTime = reader.uint32(); break; case 6: message.countPending = reader.uint32(); break; case 7: message.countCompleted = reader.uint32(); break; case 8: message.processId = reader.uint32(); break; case 9: message.osversion = reader.int32(); break; case 10: message.clientreportversion = reader.uint32(); break; case 11: message.statusId = reader.uint32(); break; case 12: message.diagnostic1 = reader.uint32(); break; case 13: message.diagnostic2 = reader.uint64(); break; case 14: message.diagnostic3 = reader.uint64(); break; case 15: message.lastLaunchData = reader.string(); break; case 16: message.reportCount = reader.uint32(); break; case 17: message.clientTime = reader.uint64(); break; case 18: message.diagnostic4 = reader.uint64(); break; case 19: message.diagnostic5 = reader.uint64(); break; case 20: message.diagnostics.push(exports.CVDiagnostic.decode(reader, reader.uint32())); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q; const message = createBaseCMsgGCCStrike15V2ClientReportValidation(); message.fileReport = (_a = object.fileReport) !== null && _a !== void 0 ? _a : ""; message.commandLine = (_b = object.commandLine) !== null && _b !== void 0 ? _b : ""; message.totalFiles = (_c = object.totalFiles) !== null && _c !== void 0 ? _c : 0; message.internalError = (_d = object.internalError) !== null && _d !== void 0 ? _d : 0; message.trustTime = (_e = object.trustTime) !== null && _e !== void 0 ? _e : 0; message.countPending = (_f = object.countPending) !== null && _f !== void 0 ? _f : 0; message.countCompleted = (_g = object.countCompleted) !== null && _g !== void 0 ? _g : 0; message.processId = (_h = object.processId) !== null && _h !== void 0 ? _h : 0; message.osversion = (_j = object.osversion) !== null && _j !== void 0 ? _j : 0; message.clientreportversion = (_k = object.clientreportversion) !== null && _k !== void 0 ? _k : 0; message.statusId = (_l = object.statusId) !== null && _l !== void 0 ? _l : 0; message.diagnostic1 = (_m = object.diagnostic1) !== null && _m !== void 0 ? _m : 0; message.diagnostic2 = object.diagnostic2 !== undefined && object.diagnostic2 !== null ? Long.fromValue(object.diagnostic2) : Long.UZERO; message.diagnostic3 = object.diagnostic3 !== undefined && object.diagnostic3 !== null ? Long.fromValue(object.diagnostic3) : Long.UZERO; message.lastLaunchData = (_o = object.lastLaunchData) !== null && _o !== void 0 ? _o : ""; message.reportCount = (_p = object.reportCount) !== null && _p !== void 0 ? _p : 0; message.clientTime = object.clientTime !== undefined && object.clientTime !== null ? Long.fromValue(object.clientTime) : Long.UZERO; message.diagnostic4 = object.diagnostic4 !== undefined && object.diagnostic4 !== null ? Long.fromValue(object.diagnostic4) : Long.UZERO; message.diagnostic5 = object.diagnostic5 !== undefined && object.diagnostic5 !== null ? Long.fromValue(object.diagnostic5) : Long.UZERO; message.diagnostics = ((_q = object.diagnostics) === null || _q === void 0 ? void 0 : _q.map(e => exports.CVDiagnostic.fromPartial(e))) || []; return message; } }; function createBaseCMsgGCCStrike15V2GC2ClientRefuseSecureMode() { return { fileReport: "", offerInsecureMode: false, offerSecureMode: false, showUnsignedUi: false, kickUser: false, showTrustedUi: false, showWarningNotTrusted: false, showWarningNotTrusted2: false, filesPreventedTrusted: "" }; } exports.CMsgGCCStrike15V2GC2ClientRefuseSecureMode = { encode(message, writer = minimal_1.Writer.create()) { if (message.fileReport !== "") { writer.uint32(10).string(message.fileReport); } if (message.offerInsecureMode === true) { writer.uint32(16).bool(message.offerInsecureMode); } if (message.offerSecureMode === true) { writer.uint32(24).bool(message.offerSecureMode); } if (message.showUnsignedUi === true) { writer.uint32(32).bool(message.showUnsignedUi); } if (message.kickUser === true) { writer.uint32(40).bool(message.kickUser); } if (message.showTrustedUi === true) { writer.uint32(48).bool(message.showTrustedUi); } if (message.showWarningNotTrusted === true) { writer.uint32(56).bool(message.showWarningNotTrusted); } if (message.showWarningNotTrusted2 === true) { writer.uint32(64).bool(message.showWarningNotTrusted2); } if (message.filesPreventedTrusted !== "") { writer.uint32(74).string(message.filesPreventedTrusted); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCMsgGCCStrike15V2GC2ClientRefuseSecureMode(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.fileReport = reader.string(); break; case 2: message.offerInsecureMode = reader.bool(); break; case 3: message.offerSecureMode = reader.bool(); break; case 4: message.showUnsignedUi = reader.bool(); break; case 5: message.kickUser = reader.bool(); break; case 6: message.showTrustedUi = reader.bool(); break; case 7: message.showWarningNotTrusted = reader.bool(); break; case 8: message.showWarningNotTrusted2 = reader.bool(); break; case 9: message.filesPreventedTrusted = reader.string(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c, _d, _e, _f, _g, _h, _j; const message = createBaseCMsgGCCStrike15V2GC2ClientRefuseSecureMode(); message.fileReport = (_a = object.fileReport) !== null && _a !== void 0 ? _a : ""; message.offerInsecureMode = (_b = object.offerInsecureMode) !== null && _b !== void 0 ? _b : false; message.offerSecureMode = (_c = object.offerSecureMode) !== null && _c !== void 0 ? _c : false; message.showUnsignedUi = (_d = object.showUnsignedUi) !== null && _d !== void 0 ? _d : false; message.kickUser = (_e = object.kickUser) !== null && _e !== void 0 ? _e : false; message.showTrustedUi = (_f = object.showTrustedUi) !== null && _f !== void 0 ? _f : false; message.showWarningNotTrusted = (_g = object.showWarningNotTrusted) !== null && _g !== void 0 ? _g : false; message.showWarningNotTrusted2 = (_h = object.showWarningNotTrusted2) !== null && _h !== void 0 ? _h : false; message.filesPreventedTrusted = (_j = object.filesPreventedTrusted) !== null && _j !== void 0 ? _j : ""; return message; } }; function createBaseCMsgGCCStrike15V2GC2ClientRequestValidation() { return { fullReport: false, module: "" }; } exports.CMsgGCCStrike15V2GC2ClientRequestValidation = { encode(message, writer = minimal_1.Writer.create()) { if (message.fullReport === true) { writer.uint32(8).bool(message.fullReport); } if (message.module !== "") { writer.uint32(18).string(message.module); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCMsgGCCStrike15V2GC2ClientRequestValidation(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.fullReport = reader.bool(); break; case 2: message.module = reader.string(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b; const message = createBaseCMsgGCCStrike15V2GC2ClientRequestValidation(); message.fullReport = (_a = object.fullReport) !== null && _a !== void 0 ? _a : false; message.module = (_b = object.module) !== null && _b !== void 0 ? _b : ""; return message; } }; function createBaseCMsgGCCStrike15V2GC2ClientInitSystem() { return { load: false, name: "", outputname: "", keyData: new Uint8Array(), shaHash: new Uint8Array(), cookie: 0, manifest: "", systemPackage: new Uint8Array(), loadSystem: false }; } exports.CMsgGCCStrike15V2GC2ClientInitSystem = { encode(message, writer = minimal_1.Writer.create()) { if (message.load === true) { writer.uint32(8).bool(message.load); } if (message.name !== "") { writer.uint32(18).string(message.name); } if (message.outputname !== "") { writer.uint32(26).string(message.outputname); } if (message.keyData.length !== 0) { writer.uint32(34).bytes(message.keyData); } if (message.shaHash.length !== 0) { writer.uint32(42).bytes(message.shaHash); } if (message.cookie !== 0) { writer.uint32(48).int32(message.cookie); } if (message.manifest !== "") { writer.uint32(58).string(message.manifest); } if (message.systemPackage.length !== 0) { writer.uint32(66).bytes(message.systemPackage); } if (message.loadSystem === true) { writer.uint32(72).bool(message.loadSystem); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCMsgGCCStrike15V2GC2ClientInitSystem(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.load = reader.bool(); break; case 2: message.name = reader.string(); break; case 3: message.outputname = reader.string(); break; case 4: message.keyData = reader.bytes(); break; case 5: message.shaHash = reader.bytes(); break; case 6: message.cookie = reader.int32(); break; case 7: message.manifest = reader.string(); break; case 8: message.systemPackage = reader.bytes(); break; case 9: message.loadSystem = reader.bool(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c, _d, _e, _f, _g, _h, _j; const message = createBaseCMsgGCCStrike15V2GC2ClientInitSystem(); message.load = (_a = object.load) !== null && _a !== void 0 ? _a : false; message.name = (_b = object.name) !== null && _b !== void 0 ? _b : ""; message.outputname = (_c = object.outputname) !== null && _c !== void 0 ? _c : ""; message.keyData = (_d = object.keyData) !== null && _d !== void 0 ? _d : new Uint8Array(); message.shaHash = (_e = object.shaHash) !== null && _e !== void 0 ? _e : new Uint8Array(); message.cookie = (_f = object.cookie) !== null && _f !== void 0 ? _f : 0; message.manifest = (_g = object.manifest) !== null && _g !== void 0 ? _g : ""; message.systemPackage = (_h = object.systemPackage) !== null && _h !== void 0 ? _h : new Uint8Array(); message.loadSystem = (_j = object.loadSystem) !== null && _j !== void 0 ? _j : false; return message; } }; function createBaseCMsgGCCStrike15V2GC2ClientInitSystemResponse() { return { success: false, diagnostic: "", shaHash: new Uint8Array(), response: 0, errorCode1: 0, errorCode2: 0, handle: Long.ZERO, einitResult: 0, auxSystem1: 0, auxSystem2: 0 }; } exports.CMsgGCCStrike15V2GC2ClientInitSystemResponse = { encode(message, writer = minimal_1.Writer.create()) { if (message.success === true) { writer.uint32(8).bool(message.success); } if (message.diagnostic !== "") { writer.uint32(18).string(message.diagnostic); } if (message.shaHash.length !== 0) { writer.uint32(26).bytes(message.shaHash); } if (message.response !== 0) { writer.uint32(32).int32(message.response); } if (message.errorCode1 !== 0) { writer.uint32(40).int32(message.errorCode1); } if (message.errorCode2 !== 0) { writer.uint32(48).int32(message.errorCode2); } if (!message.handle.isZero()) { writer.uint32(56).int64(message.handle); } if (message.einitResult !== 0) { writer.uint32(64).int32(message.einitResult); } if (message.auxSystem1 !== 0) { writer.uint32(72).int32(message.auxSystem1); } if (message.auxSystem2 !== 0) { writer.uint32(80).int32(message.auxSystem2); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCMsgGCCStrike15V2GC2ClientInitSystemResponse(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.success = reader.bool(); break; case 2: message.diagnostic = reader.string(); break; case 3: message.shaHash = reader.bytes(); break; case 4: message.response = reader.int32(); break; case 5: message.errorCode1 = reader.int32(); break; case 6: message.errorCode2 = reader.int32(); break; case 7: message.handle = reader.int64(); break; case 8: message.einitResult = reader.int32(); break; case 9: message.auxSystem1 = reader.int32(); break; case 10: message.auxSystem2 = reader.int32(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c, _d, _e, _f, _g, _h, _j; const message = createBaseCMsgGCCStrike15V2GC2ClientInitSystemResponse(); message.success = (_a = object.success) !== null && _a !== void 0 ? _a : false; message.diagnostic = (_b = object.diagnostic) !== null && _b !== void 0 ? _b : ""; message.shaHash = (_c = object.shaHash) !== null && _c !== void 0 ? _c : new Uint8Array(); message.response = (_d = object.response) !== null && _d !== void 0 ? _d : 0; message.errorCode1 = (_e = object.errorCode1) !== null && _e !== void 0 ? _e : 0; message.errorCode2 = (_f = object.errorCode2) !== null && _f !== void 0 ? _f : 0; message.handle = object.handle !== undefined && object.handle !== null ? Long.fromValue(object.handle) : Long.ZERO; message.einitResult = (_g = object.einitResult) !== null && _g !== void 0 ? _g : 0; message.auxSystem1 = (_h = object.auxSystem1) !== null && _h !== void 0 ? _h : 0; message.auxSystem2 = (_j = object.auxSystem2) !== null && _j !== void 0 ? _j : 0; return message; } }; // If you get a compile-error about 'Constructor and ... have no overlap', // add '--ts_proto_opt=esModuleInterop=true' as a flag when calling 'protoc'. if (minimal_1.util.Long !== Long) { minimal_1.util.Long = Long; (0, minimal_1.configure)(); } },{"./engine_gcmessages":26,"long":712,"protobufjs/minimal":715}],25:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.CCSUsrMsgVoteStart = exports.CCSUsrMsgCallVoteFailed = exports.CCSUsrMsgXRankUpd = exports.CCSUsrMsgXRankGet = exports.CCSUsrMsgPlayerDecalDigitalSignature = exports.CCSUsrMsgScoreLeaderboardData = exports.CCSUsrMsgQuestProgress = exports.CCSUsrMsgDisplayInventory = exports.CCSUsrMsgPlayerStatsUpdate_Stat = exports.CCSUsrMsgPlayerStatsUpdate = exports.CCSUsrMsgMatchEndConditions = exports.CCSUsrMsgAchievementEvent = exports.CCSUsrMsgCurrentTimescale = exports.CCSUsrMsgDesiredTimescale = exports.CCSUsrMsgKillCam = exports.CCSUsrMsgReportHit = exports.CCSUsrMsgAdjustMoney = exports.CCSUsrMsgEntityOutlineHighlight = exports.CCSUsrMsgUpdateScreenHealthBar = exports.CCSUsrMsgWeaponSound = exports.CCSUsrMsgReloadEffect = exports.CCSUsrMsgSendPlayerItemFound = exports.CCSUsrMsgSendPlayerItemDrops = exports.CCSUsrMsgProcessSpottedEntityUpdate_SpottedEntityUpdate = exports.CCSUsrMsgProcessSpottedEntityUpdate = exports.CCSUsrMsgKeyHintText = exports.CCSUsrMsgHintText = exports.CCSUsrMsgRadioText = exports.CCSUsrMsgDamage = exports.CCSUsrMsgVoiceMask_PlayerMask = exports.CCSUsrMsgVoiceMask = exports.CCSUsrMsgRawAudio = exports.CCSUsrMsgSendAudio = exports.CCSUsrMsgCloseCaptionDirect = exports.CCSUsrMsgCloseCaption = exports.CCSUsrMsgRumble = exports.CCSUsrMsgFade = exports.CCSUsrMsgShake = exports.CCSUsrMsgHudMsg = exports.CCSUsrMsgTextMsg = exports.CCSUsrMsgSayText2 = exports.CCSUsrMsgSayText = exports.CCSUsrMsgHudText = exports.CCSUsrMsgTrain = exports.CCSUsrMsgGeiger = exports.CCSUsrMsgVGUIMenu_Subkey = exports.CCSUsrMsgVGUIMenu = exports.ECSUsrMsgDisconnectToLobbyAction = exports.ECstrike15UserMessages = exports.protobufPackage = void 0; exports.CCSUsrMsgUtilMsg = exports.CCSUsrMsgServerRankRevealAll = exports.CCSUsrMsgClientInfo = exports.CCSUsrMsgWarmupHasEnded = exports.CCSUsrMsgDisconnectToLobby = exports.CCSUsrMsgStopSpectatorMode = exports.CCSUsrMsgRequestState = exports.CCSUsrMsgGameTitle = exports.CCSUsrMsgResetHud = exports.CCSUsrMsgDeepStats = exports.CCSUsrMsgCurrentRoundOdds = exports.CCSUsrMsgRoundImpactScoreData_InitialConditions = exports.CCSUsrMsgRoundImpactScoreData_RisEvent_Damage = exports.CCSUsrMsgRoundImpactScoreData_RisEvent_Objective = exports.CCSUsrMsgRoundImpactScoreData_RisEvent_Victim = exports.CCSUsrMsgRoundImpactScoreData_RisEvent = exports.CCSUsrMsgRoundImpactScoreData = exports.CCSUsrMsgEndOfMatchAllPlayersData_PlayerData = exports.CCSUsrMsgEndOfMatchAllPlayersData_Accolade = exports.CCSUsrMsgEndOfMatchAllPlayersData = exports.CCSUsrMsgSurvivalStats_Damage = exports.CCSUsrMsgSurvivalStats_Placement = exports.CCSUsrMsgSurvivalStats_Fact = exports.CCSUsrMsgSurvivalStats = exports.CCSUsrMsgSSUI = exports.CCSUsrMsgRoundBackupFilenames = exports.CCSUsrMsgGlowPropTurnOff = exports.CCSUsrMsgItemDrop = exports.CCSUsrMsgMatchStatsUpdate = exports.CCSUsrMsgMarkAchievement = exports.CCSUsrMsgAmmoDenied = exports.CCSUsrMsgBarTime = exports.CCSUsrMsgShowMenu = exports.CCSUsrMsgItemPickup = exports.CCSUsrMsgXpUpdate = exports.CCSUsrMsgServerRankUpdate_RankUpdate = exports.CCSUsrMsgServerRankUpdate = exports.CCSUsrMsgSendLastKillerDamageToClient = exports.CCSUsrMsgVoteSetup = exports.CCSUsrMsgVoteFailed = exports.CCSUsrMsgVotePass = void 0; /* eslint-disable */ const minimal_1 = require("protobufjs/minimal"); const Long = require("long"); const netmessages_1 = require("./netmessages"); const cstrike15_gcmessages_1 = require("./cstrike15_gcmessages"); exports.protobufPackage = ""; var ECstrike15UserMessages; (function (ECstrike15UserMessages) { ECstrike15UserMessages[ECstrike15UserMessages["CS_UM_VGUIMenu"] = 1] = "CS_UM_VGUIMenu"; ECstrike15UserMessages[ECstrike15UserMessages["CS_UM_Geiger"] = 2] = "CS_UM_Geiger"; ECstrike15UserMessages[ECstrike15UserMessages["CS_UM_Train"] = 3] = "CS_UM_Train"; ECstrike15UserMessages[ECstrike15UserMessages["CS_UM_HudText"] = 4] = "CS_UM_HudText"; ECstrike15UserMessages[ECstrike15UserMessages["CS_UM_SayText"] = 5] = "CS_UM_SayText"; ECstrike15UserMessages[ECstrike15UserMessages["CS_UM_SayText2"] = 6] = "CS_UM_SayText2"; ECstrike15UserMessages[ECstrike15UserMessages["CS_UM_TextMsg"] = 7] = "CS_UM_TextMsg"; ECstrike15UserMessages[ECstrike15UserMessages["CS_UM_HudMsg"] = 8] = "CS_UM_HudMsg"; ECstrike15UserMessages[ECstrike15UserMessages["CS_UM_ResetHud"] = 9] = "CS_UM_ResetHud"; ECstrike15UserMessages[ECstrike15UserMessages["CS_UM_GameTitle"] = 10] = "CS_UM_GameTitle"; ECstrike15UserMessages[ECstrike15UserMessages["CS_UM_Shake"] = 12] = "CS_UM_Shake"; ECstrike15UserMessages[ECstrike15UserMessages["CS_UM_Fade"] = 13] = "CS_UM_Fade"; ECstrike15UserMessages[ECstrike15UserMessages["CS_UM_Rumble"] = 14] = "CS_UM_Rumble"; ECstrike15UserMessages[ECstrike15UserMessages["CS_UM_CloseCaption"] = 15] = "CS_UM_CloseCaption"; ECstrike15UserMessages[ECstrike15UserMessages["CS_UM_CloseCaptionDirect"] = 16] = "CS_UM_CloseCaptionDirect"; ECstrike15UserMessages[ECstrike15UserMessages["CS_UM_SendAudio"] = 17] = "CS_UM_SendAudio"; ECstrike15UserMessages[ECstrike15UserMessages["CS_UM_RawAudio"] = 18] = "CS_UM_RawAudio"; ECstrike15UserMessages[ECstrike15UserMessages["CS_UM_VoiceMask"] = 19] = "CS_UM_VoiceMask"; ECstrike15UserMessages[ECstrike15UserMessages["CS_UM_RequestState"] = 20] = "CS_UM_RequestState"; ECstrike15UserMessages[ECstrike15UserMessages["CS_UM_Damage"] = 21] = "CS_UM_Damage"; ECstrike15UserMessages[ECstrike15UserMessages["CS_UM_RadioText"] = 22] = "CS_UM_RadioText"; ECstrike15UserMessages[ECstrike15UserMessages["CS_UM_HintText"] = 23] = "CS_UM_HintText"; ECstrike15UserMessages[ECstrike15UserMessages["CS_UM_KeyHintText"] = 24] = "CS_UM_KeyHintText"; ECstrike15UserMessages[ECstrike15UserMessages["CS_UM_ProcessSpottedEntityUpdate"] = 25] = "CS_UM_ProcessSpottedEntityUpdate"; ECstrike15UserMessages[ECstrike15UserMessages["CS_UM_ReloadEffect"] = 26] = "CS_UM_ReloadEffect"; ECstrike15UserMessages[ECstrike15UserMessages["CS_UM_AdjustMoney"] = 27] = "CS_UM_AdjustMoney"; ECstrike15UserMessages[ECstrike15UserMessages["CS_UM_UpdateTeamMoney"] = 28] = "CS_UM_UpdateTeamMoney"; ECstrike15UserMessages[ECstrike15UserMessages["CS_UM_StopSpectatorMode"] = 29] = "CS_UM_StopSpectatorMode"; ECstrike15UserMessages[ECstrike15UserMessages["CS_UM_KillCam"] = 30] = "CS_UM_KillCam"; ECstrike15UserMessages[ECstrike15UserMessages["CS_UM_DesiredTimescale"] = 31] = "CS_UM_DesiredTimescale"; ECstrike15UserMessages[ECstrike15UserMessages["CS_UM_CurrentTimescale"] = 32] = "CS_UM_CurrentTimescale"; ECstrike15UserMessages[ECstrike15UserMessages["CS_UM_AchievementEvent"] = 33] = "CS_UM_AchievementEvent"; ECstrike15UserMessages[ECstrike15UserMessages["CS_UM_MatchEndConditions"] = 34] = "CS_UM_MatchEndConditions"; ECstrike15UserMessages[ECstrike15UserMessages["CS_UM_DisconnectToLobby"] = 35] = "CS_UM_DisconnectToLobby"; ECstrike15UserMessages[ECstrike15UserMessages["CS_UM_PlayerStatsUpdate"] = 36] = "CS_UM_PlayerStatsUpdate"; ECstrike15UserMessages[ECstrike15UserMessages["CS_UM_DisplayInventory"] = 37] = "CS_UM_DisplayInventory"; ECstrike15UserMessages[ECstrike15UserMessages["CS_UM_WarmupHasEnded"] = 38] = "CS_UM_WarmupHasEnded"; ECstrike15UserMessages[ECstrike15UserMessages["CS_UM_ClientInfo"] = 39] = "CS_UM_ClientInfo"; ECstrike15UserMessages[ECstrike15UserMessages["CS_UM_XRankGet"] = 40] = "CS_UM_XRankGet"; ECstrike15UserMessages[ECstrike15UserMessages["CS_UM_XRankUpd"] = 41] = "CS_UM_XRankUpd"; ECstrike15UserMessages[ECstrike15UserMessages["CS_UM_CallVoteFailed"] = 45] = "CS_UM_CallVoteFailed"; ECstrike15UserMessages[ECstrike15UserMessages["CS_UM_VoteStart"] = 46] = "CS_UM_VoteStart"; ECstrike15UserMessages[ECstrike15UserMessages["CS_UM_VotePass"] = 47] = "CS_UM_VotePass"; ECstrike15UserMessages[ECstrike15UserMessages["CS_UM_VoteFailed"] = 48] = "CS_UM_VoteFailed"; ECstrike15UserMessages[ECstrike15UserMessages["CS_UM_VoteSetup"] = 49] = "CS_UM_VoteSetup"; ECstrike15UserMessages[ECstrike15UserMessages["CS_UM_ServerRankRevealAll"] = 50] = "CS_UM_ServerRankRevealAll"; ECstrike15UserMessages[ECstrike15UserMessages["CS_UM_SendLastKillerDamageToClient"] = 51] = "CS_UM_SendLastKillerDamageToClient"; ECstrike15UserMessages[ECstrike15UserMessages["CS_UM_ServerRankUpdate"] = 52] = "CS_UM_ServerRankUpdate"; ECstrike15UserMessages[ECstrike15UserMessages["CS_UM_ItemPickup"] = 53] = "CS_UM_ItemPickup"; ECstrike15UserMessages[ECstrike15UserMessages["CS_UM_ShowMenu"] = 54] = "CS_UM_ShowMenu"; ECstrike15UserMessages[ECstrike15UserMessages["CS_UM_BarTime"] = 55] = "CS_UM_BarTime"; ECstrike15UserMessages[ECstrike15UserMessages["CS_UM_AmmoDenied"] = 56] = "CS_UM_AmmoDenied"; ECstrike15UserMessages[ECstrike15UserMessages["CS_UM_MarkAchievement"] = 57] = "CS_UM_MarkAchievement"; ECstrike15UserMessages[ECstrike15UserMessages["CS_UM_MatchStatsUpdate"] = 58] = "CS_UM_MatchStatsUpdate"; ECstrike15UserMessages[ECstrike15UserMessages["CS_UM_ItemDrop"] = 59] = "CS_UM_ItemDrop"; ECstrike15UserMessages[ECstrike15UserMessages["CS_UM_GlowPropTurnOff"] = 60] = "CS_UM_GlowPropTurnOff"; ECstrike15UserMessages[ECstrike15UserMessages["CS_UM_SendPlayerItemDrops"] = 61] = "CS_UM_SendPlayerItemDrops"; ECstrike15UserMessages[ECstrike15UserMessages["CS_UM_RoundBackupFilenames"] = 62] = "CS_UM_RoundBackupFilenames"; ECstrike15UserMessages[ECstrike15UserMessages["CS_UM_SendPlayerItemFound"] = 63] = "CS_UM_SendPlayerItemFound"; ECstrike15UserMessages[ECstrike15UserMessages["CS_UM_ReportHit"] = 64] = "CS_UM_ReportHit"; ECstrike15UserMessages[ECstrike15UserMessages["CS_UM_XpUpdate"] = 65] = "CS_UM_XpUpdate"; ECstrike15UserMessages[ECstrike15UserMessages["CS_UM_QuestProgress"] = 66] = "CS_UM_QuestProgress"; ECstrike15UserMessages[ECstrike15UserMessages["CS_UM_ScoreLeaderboardData"] = 67] = "CS_UM_ScoreLeaderboardData"; ECstrike15UserMessages[ECstrike15UserMessages["CS_UM_PlayerDecalDigitalSignature"] = 68] = "CS_UM_PlayerDecalDigitalSignature"; ECstrike15UserMessages[ECstrike15UserMessages["CS_UM_WeaponSound"] = 69] = "CS_UM_WeaponSound"; ECstrike15UserMessages[ECstrike15UserMessages["CS_UM_UpdateScreenHealthBar"] = 70] = "CS_UM_UpdateScreenHealthBar"; ECstrike15UserMessages[ECstrike15UserMessages["CS_UM_EntityOutlineHighlight"] = 71] = "CS_UM_EntityOutlineHighlight"; ECstrike15UserMessages[ECstrike15UserMessages["CS_UM_SSUI"] = 72] = "CS_UM_SSUI"; ECstrike15UserMessages[ECstrike15UserMessages["CS_UM_SurvivalStats"] = 73] = "CS_UM_SurvivalStats"; ECstrike15UserMessages[ECstrike15UserMessages["CS_UM_DisconnectToLobby2"] = 74] = "CS_UM_DisconnectToLobby2"; ECstrike15UserMessages[ECstrike15UserMessages["CS_UM_EndOfMatchAllPlayersData"] = 75] = "CS_UM_EndOfMatchAllPlayersData"; ECstrike15UserMessages[ECstrike15UserMessages["CS_UM_RoundImpactScoreData"] = 79] = "CS_UM_RoundImpactScoreData"; ECstrike15UserMessages[ECstrike15UserMessages["CS_UM_CurrentRoundOdds"] = 80] = "CS_UM_CurrentRoundOdds"; ECstrike15UserMessages[ECstrike15UserMessages["CS_UM_DeepStats"] = 81] = "CS_UM_DeepStats"; ECstrike15UserMessages[ECstrike15UserMessages["CS_UM_UtilMsg"] = 82] = "CS_UM_UtilMsg"; })(ECstrike15UserMessages = exports.ECstrike15UserMessages || (exports.ECstrike15UserMessages = {})); var ECSUsrMsgDisconnectToLobbyAction; (function (ECSUsrMsgDisconnectToLobbyAction) { ECSUsrMsgDisconnectToLobbyAction[ECSUsrMsgDisconnectToLobbyAction["k_ECSUsrMsg_DisconnectToLobby_Action_Default"] = 0] = "k_ECSUsrMsg_DisconnectToLobby_Action_Default"; ECSUsrMsgDisconnectToLobbyAction[ECSUsrMsgDisconnectToLobbyAction["k_ECSUsrMsg_DisconnectToLobby_Action_GoQueue"] = 1] = "k_ECSUsrMsg_DisconnectToLobby_Action_GoQueue"; })(ECSUsrMsgDisconnectToLobbyAction = exports.ECSUsrMsgDisconnectToLobbyAction || (exports.ECSUsrMsgDisconnectToLobbyAction = {})); function createBaseCCSUsrMsgVGUIMenu() { return { name: "", show: false, subkeys: [] }; } exports.CCSUsrMsgVGUIMenu = { encode(message, writer = minimal_1.Writer.create()) { if (message.name !== "") { writer.uint32(10).string(message.name); } if (message.show === true) { writer.uint32(16).bool(message.show); } for (const v of message.subkeys) { exports.CCSUsrMsgVGUIMenu_Subkey.encode(v, writer.uint32(26).fork()).ldelim(); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCCSUsrMsgVGUIMenu(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.name = reader.string(); break; case 2: message.show = reader.bool(); break; case 3: message.subkeys.push(exports.CCSUsrMsgVGUIMenu_Subkey.decode(reader, reader.uint32())); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c; const message = createBaseCCSUsrMsgVGUIMenu(); message.name = (_a = object.name) !== null && _a !== void 0 ? _a : ""; message.show = (_b = object.show) !== null && _b !== void 0 ? _b : false; message.subkeys = ((_c = object.subkeys) === null || _c === void 0 ? void 0 : _c.map(e => exports.CCSUsrMsgVGUIMenu_Subkey.fromPartial(e))) || []; return message; } }; function createBaseCCSUsrMsgVGUIMenu_Subkey() { return { name: "", str: "" }; } exports.CCSUsrMsgVGUIMenu_Subkey = { encode(message, writer = minimal_1.Writer.create()) { if (message.name !== "") { writer.uint32(10).string(message.name); } if (message.str !== "") { writer.uint32(18).string(message.str); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCCSUsrMsgVGUIMenu_Subkey(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.name = reader.string(); break; case 2: message.str = reader.string(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b; const message = createBaseCCSUsrMsgVGUIMenu_Subkey(); message.name = (_a = object.name) !== null && _a !== void 0 ? _a : ""; message.str = (_b = object.str) !== null && _b !== void 0 ? _b : ""; return message; } }; function createBaseCCSUsrMsgGeiger() { return { range: 0 }; } exports.CCSUsrMsgGeiger = { encode(message, writer = minimal_1.Writer.create()) { if (message.range !== 0) { writer.uint32(8).int32(message.range); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCCSUsrMsgGeiger(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.range = reader.int32(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a; const message = createBaseCCSUsrMsgGeiger(); message.range = (_a = object.range) !== null && _a !== void 0 ? _a : 0; return message; } }; function createBaseCCSUsrMsgTrain() { return { train: 0 }; } exports.CCSUsrMsgTrain = { encode(message, writer = minimal_1.Writer.create()) { if (message.train !== 0) { writer.uint32(8).int32(message.train); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCCSUsrMsgTrain(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.train = reader.int32(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a; const message = createBaseCCSUsrMsgTrain(); message.train = (_a = object.train) !== null && _a !== void 0 ? _a : 0; return message; } }; function createBaseCCSUsrMsgHudText() { return { text: "" }; } exports.CCSUsrMsgHudText = { encode(message, writer = minimal_1.Writer.create()) { if (message.text !== "") { writer.uint32(10).string(message.text); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCCSUsrMsgHudText(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.text = reader.string(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a; const message = createBaseCCSUsrMsgHudText(); message.text = (_a = object.text) !== null && _a !== void 0 ? _a : ""; return message; } }; function createBaseCCSUsrMsgSayText() { return { entIdx: 0, text: "", chat: false, textallchat: false }; } exports.CCSUsrMsgSayText = { encode(message, writer = minimal_1.Writer.create()) { if (message.entIdx !== 0) { writer.uint32(8).int32(message.entIdx); } if (message.text !== "") { writer.uint32(18).string(message.text); } if (message.chat === true) { writer.uint32(24).bool(message.chat); } if (message.textallchat === true) { writer.uint32(32).bool(message.textallchat); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCCSUsrMsgSayText(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.entIdx = reader.int32(); break; case 2: message.text = reader.string(); break; case 3: message.chat = reader.bool(); break; case 4: message.textallchat = reader.bool(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c, _d; const message = createBaseCCSUsrMsgSayText(); message.entIdx = (_a = object.entIdx) !== null && _a !== void 0 ? _a : 0; message.text = (_b = object.text) !== null && _b !== void 0 ? _b : ""; message.chat = (_c = object.chat) !== null && _c !== void 0 ? _c : false; message.textallchat = (_d = object.textallchat) !== null && _d !== void 0 ? _d : false; return message; } }; function createBaseCCSUsrMsgSayText2() { return { entIdx: 0, chat: false, msgName: "", params: [], textallchat: false }; } exports.CCSUsrMsgSayText2 = { encode(message, writer = minimal_1.Writer.create()) { if (message.entIdx !== 0) { writer.uint32(8).int32(message.entIdx); } if (message.chat === true) { writer.uint32(16).bool(message.chat); } if (message.msgName !== "") { writer.uint32(26).string(message.msgName); } for (const v of message.params) { writer.uint32(34).string(v); } if (message.textallchat === true) { writer.uint32(40).bool(message.textallchat); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCCSUsrMsgSayText2(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.entIdx = reader.int32(); break; case 2: message.chat = reader.bool(); break; case 3: message.msgName = reader.string(); break; case 4: message.params.push(reader.string()); break; case 5: message.textallchat = reader.bool(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c, _d, _e; const message = createBaseCCSUsrMsgSayText2(); message.entIdx = (_a = object.entIdx) !== null && _a !== void 0 ? _a : 0; message.chat = (_b = object.chat) !== null && _b !== void 0 ? _b : false; message.msgName = (_c = object.msgName) !== null && _c !== void 0 ? _c : ""; message.params = ((_d = object.params) === null || _d === void 0 ? void 0 : _d.map(e => e)) || []; message.textallchat = (_e = object.textallchat) !== null && _e !== void 0 ? _e : false; return message; } }; function createBaseCCSUsrMsgTextMsg() { return { msgDst: 0, params: [] }; } exports.CCSUsrMsgTextMsg = { encode(message, writer = minimal_1.Writer.create()) { if (message.msgDst !== 0) { writer.uint32(8).int32(message.msgDst); } for (const v of message.params) { writer.uint32(26).string(v); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCCSUsrMsgTextMsg(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.msgDst = reader.int32(); break; case 3: message.params.push(reader.string()); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b; const message = createBaseCCSUsrMsgTextMsg(); message.msgDst = (_a = object.msgDst) !== null && _a !== void 0 ? _a : 0; message.params = ((_b = object.params) === null || _b === void 0 ? void 0 : _b.map(e => e)) || []; return message; } }; function createBaseCCSUsrMsgHudMsg() { return { channel: 0, pos: undefined, clr1: undefined, clr2: undefined, effect: 0, fadeInTime: 0, fadeOutTime: 0, holdTime: 0, fxTime: 0, text: "" }; } exports.CCSUsrMsgHudMsg = { encode(message, writer = minimal_1.Writer.create()) { if (message.channel !== 0) { writer.uint32(8).int32(message.channel); } if (message.pos !== undefined) { netmessages_1.CMsgVector2D.encode(message.pos, writer.uint32(18).fork()).ldelim(); } if (message.clr1 !== undefined) { netmessages_1.CMsgRGBA.encode(message.clr1, writer.uint32(26).fork()).ldelim(); } if (message.clr2 !== undefined) { netmessages_1.CMsgRGBA.encode(message.clr2, writer.uint32(34).fork()).ldelim(); } if (message.effect !== 0) { writer.uint32(40).int32(message.effect); } if (message.fadeInTime !== 0) { writer.uint32(53).float(message.fadeInTime); } if (message.fadeOutTime !== 0) { writer.uint32(61).float(message.fadeOutTime); } if (message.holdTime !== 0) { writer.uint32(77).float(message.holdTime); } if (message.fxTime !== 0) { writer.uint32(85).float(message.fxTime); } if (message.text !== "") { writer.uint32(90).string(message.text); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCCSUsrMsgHudMsg(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.channel = reader.int32(); break; case 2: message.pos = netmessages_1.CMsgVector2D.decode(reader, reader.uint32()); break; case 3: message.clr1 = netmessages_1.CMsgRGBA.decode(reader, reader.uint32()); break; case 4: message.clr2 = netmessages_1.CMsgRGBA.decode(reader, reader.uint32()); break; case 5: message.effect = reader.int32(); break; case 6: message.fadeInTime = reader.float(); break; case 7: message.fadeOutTime = reader.float(); break; case 9: message.holdTime = reader.float(); break; case 10: message.fxTime = reader.float(); break; case 11: message.text = reader.string(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c, _d, _e, _f, _g; const message = createBaseCCSUsrMsgHudMsg(); message.channel = (_a = object.channel) !== null && _a !== void 0 ? _a : 0; message.pos = object.pos !== undefined && object.pos !== null ? netmessages_1.CMsgVector2D.fromPartial(object.pos) : undefined; message.clr1 = object.clr1 !== undefined && object.clr1 !== null ? netmessages_1.CMsgRGBA.fromPartial(object.clr1) : undefined; message.clr2 = object.clr2 !== undefined && object.clr2 !== null ? netmessages_1.CMsgRGBA.fromPartial(object.clr2) : undefined; message.effect = (_b = object.effect) !== null && _b !== void 0 ? _b : 0; message.fadeInTime = (_c = object.fadeInTime) !== null && _c !== void 0 ? _c : 0; message.fadeOutTime = (_d = object.fadeOutTime) !== null && _d !== void 0 ? _d : 0; message.holdTime = (_e = object.holdTime) !== null && _e !== void 0 ? _e : 0; message.fxTime = (_f = object.fxTime) !== null && _f !== void 0 ? _f : 0; message.text = (_g = object.text) !== null && _g !== void 0 ? _g : ""; return message; } }; function createBaseCCSUsrMsgShake() { return { command: 0, localAmplitude: 0, frequency: 0, duration: 0 }; } exports.CCSUsrMsgShake = { encode(message, writer = minimal_1.Writer.create()) { if (message.command !== 0) { writer.uint32(8).int32(message.command); } if (message.localAmplitude !== 0) { writer.uint32(21).float(message.localAmplitude); } if (message.frequency !== 0) { writer.uint32(29).float(message.frequency); } if (message.duration !== 0) { writer.uint32(37).float(message.duration); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCCSUsrMsgShake(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.command = reader.int32(); break; case 2: message.localAmplitude = reader.float(); break; case 3: message.frequency = reader.float(); break; case 4: message.duration = reader.float(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c, _d; const message = createBaseCCSUsrMsgShake(); message.command = (_a = object.command) !== null && _a !== void 0 ? _a : 0; message.localAmplitude = (_b = object.localAmplitude) !== null && _b !== void 0 ? _b : 0; message.frequency = (_c = object.frequency) !== null && _c !== void 0 ? _c : 0; message.duration = (_d = object.duration) !== null && _d !== void 0 ? _d : 0; return message; } }; function createBaseCCSUsrMsgFade() { return { duration: 0, holdTime: 0, flags: 0, clr: undefined }; } exports.CCSUsrMsgFade = { encode(message, writer = minimal_1.Writer.create()) { if (message.duration !== 0) { writer.uint32(8).int32(message.duration); } if (message.holdTime !== 0) { writer.uint32(16).int32(message.holdTime); } if (message.flags !== 0) { writer.uint32(24).int32(message.flags); } if (message.clr !== undefined) { netmessages_1.CMsgRGBA.encode(message.clr, writer.uint32(34).fork()).ldelim(); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCCSUsrMsgFade(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.duration = reader.int32(); break; case 2: message.holdTime = reader.int32(); break; case 3: message.flags = reader.int32(); break; case 4: message.clr = netmessages_1.CMsgRGBA.decode(reader, reader.uint32()); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c; const message = createBaseCCSUsrMsgFade(); message.duration = (_a = object.duration) !== null && _a !== void 0 ? _a : 0; message.holdTime = (_b = object.holdTime) !== null && _b !== void 0 ? _b : 0; message.flags = (_c = object.flags) !== null && _c !== void 0 ? _c : 0; message.clr = object.clr !== undefined && object.clr !== null ? netmessages_1.CMsgRGBA.fromPartial(object.clr) : undefined; return message; } }; function createBaseCCSUsrMsgRumble() { return { index: 0, data: 0, flags: 0 }; } exports.CCSUsrMsgRumble = { encode(message, writer = minimal_1.Writer.create()) { if (message.index !== 0) { writer.uint32(8).int32(message.index); } if (message.data !== 0) { writer.uint32(16).int32(message.data); } if (message.flags !== 0) { writer.uint32(24).int32(message.flags); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCCSUsrMsgRumble(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.index = reader.int32(); break; case 2: message.data = reader.int32(); break; case 3: message.flags = reader.int32(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c; const message = createBaseCCSUsrMsgRumble(); message.index = (_a = object.index) !== null && _a !== void 0 ? _a : 0; message.data = (_b = object.data) !== null && _b !== void 0 ? _b : 0; message.flags = (_c = object.flags) !== null && _c !== void 0 ? _c : 0; return message; } }; function createBaseCCSUsrMsgCloseCaption() { return { hash: 0, duration: 0, fromPlayer: false, cctoken: "" }; } exports.CCSUsrMsgCloseCaption = { encode(message, writer = minimal_1.Writer.create()) { if (message.hash !== 0) { writer.uint32(8).uint32(message.hash); } if (message.duration !== 0) { writer.uint32(16).int32(message.duration); } if (message.fromPlayer === true) { writer.uint32(24).bool(message.fromPlayer); } if (message.cctoken !== "") { writer.uint32(34).string(message.cctoken); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCCSUsrMsgCloseCaption(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.hash = reader.uint32(); break; case 2: message.duration = reader.int32(); break; case 3: message.fromPlayer = reader.bool(); break; case 4: message.cctoken = reader.string(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c, _d; const message = createBaseCCSUsrMsgCloseCaption(); message.hash = (_a = object.hash) !== null && _a !== void 0 ? _a : 0; message.duration = (_b = object.duration) !== null && _b !== void 0 ? _b : 0; message.fromPlayer = (_c = object.fromPlayer) !== null && _c !== void 0 ? _c : false; message.cctoken = (_d = object.cctoken) !== null && _d !== void 0 ? _d : ""; return message; } }; function createBaseCCSUsrMsgCloseCaptionDirect() { return { hash: 0, duration: 0, fromPlayer: false }; } exports.CCSUsrMsgCloseCaptionDirect = { encode(message, writer = minimal_1.Writer.create()) { if (message.hash !== 0) { writer.uint32(8).uint32(message.hash); } if (message.duration !== 0) { writer.uint32(16).int32(message.duration); } if (message.fromPlayer === true) { writer.uint32(24).bool(message.fromPlayer); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCCSUsrMsgCloseCaptionDirect(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.hash = reader.uint32(); break; case 2: message.duration = reader.int32(); break; case 3: message.fromPlayer = reader.bool(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c; const message = createBaseCCSUsrMsgCloseCaptionDirect(); message.hash = (_a = object.hash) !== null && _a !== void 0 ? _a : 0; message.duration = (_b = object.duration) !== null && _b !== void 0 ? _b : 0; message.fromPlayer = (_c = object.fromPlayer) !== null && _c !== void 0 ? _c : false; return message; } }; function createBaseCCSUsrMsgSendAudio() { return { radioSound: "" }; } exports.CCSUsrMsgSendAudio = { encode(message, writer = minimal_1.Writer.create()) { if (message.radioSound !== "") { writer.uint32(10).string(message.radioSound); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCCSUsrMsgSendAudio(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.radioSound = reader.string(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a; const message = createBaseCCSUsrMsgSendAudio(); message.radioSound = (_a = object.radioSound) !== null && _a !== void 0 ? _a : ""; return message; } }; function createBaseCCSUsrMsgRawAudio() { return { pitch: 0, entidx: 0, duration: 0, voiceFilename: "" }; } exports.CCSUsrMsgRawAudio = { encode(message, writer = minimal_1.Writer.create()) { if (message.pitch !== 0) { writer.uint32(8).int32(message.pitch); } if (message.entidx !== 0) { writer.uint32(16).int32(message.entidx); } if (message.duration !== 0) { writer.uint32(29).float(message.duration); } if (message.voiceFilename !== "") { writer.uint32(34).string(message.voiceFilename); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCCSUsrMsgRawAudio(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.pitch = reader.int32(); break; case 2: message.entidx = reader.int32(); break; case 3: message.duration = reader.float(); break; case 4: message.voiceFilename = reader.string(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c, _d; const message = createBaseCCSUsrMsgRawAudio(); message.pitch = (_a = object.pitch) !== null && _a !== void 0 ? _a : 0; message.entidx = (_b = object.entidx) !== null && _b !== void 0 ? _b : 0; message.duration = (_c = object.duration) !== null && _c !== void 0 ? _c : 0; message.voiceFilename = (_d = object.voiceFilename) !== null && _d !== void 0 ? _d : ""; return message; } }; function createBaseCCSUsrMsgVoiceMask() { return { playerMasks: [], playerModEnable: false }; } exports.CCSUsrMsgVoiceMask = { encode(message, writer = minimal_1.Writer.create()) { for (const v of message.playerMasks) { exports.CCSUsrMsgVoiceMask_PlayerMask.encode(v, writer.uint32(10).fork()).ldelim(); } if (message.playerModEnable === true) { writer.uint32(16).bool(message.playerModEnable); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCCSUsrMsgVoiceMask(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.playerMasks.push(exports.CCSUsrMsgVoiceMask_PlayerMask.decode(reader, reader.uint32())); break; case 2: message.playerModEnable = reader.bool(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b; const message = createBaseCCSUsrMsgVoiceMask(); message.playerMasks = ((_a = object.playerMasks) === null || _a === void 0 ? void 0 : _a.map(e => exports.CCSUsrMsgVoiceMask_PlayerMask.fromPartial(e))) || []; message.playerModEnable = (_b = object.playerModEnable) !== null && _b !== void 0 ? _b : false; return message; } }; function createBaseCCSUsrMsgVoiceMask_PlayerMask() { return { gameRulesMask: 0, banMasks: 0 }; } exports.CCSUsrMsgVoiceMask_PlayerMask = { encode(message, writer = minimal_1.Writer.create()) { if (message.gameRulesMask !== 0) { writer.uint32(8).int32(message.gameRulesMask); } if (message.banMasks !== 0) { writer.uint32(16).int32(message.banMasks); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCCSUsrMsgVoiceMask_PlayerMask(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.gameRulesMask = reader.int32(); break; case 2: message.banMasks = reader.int32(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b; const message = createBaseCCSUsrMsgVoiceMask_PlayerMask(); message.gameRulesMask = (_a = object.gameRulesMask) !== null && _a !== void 0 ? _a : 0; message.banMasks = (_b = object.banMasks) !== null && _b !== void 0 ? _b : 0; return message; } }; function createBaseCCSUsrMsgDamage() { return { amount: 0, inflictorWorldPos: undefined, victimEntindex: 0 }; } exports.CCSUsrMsgDamage = { encode(message, writer = minimal_1.Writer.create()) { if (message.amount !== 0) { writer.uint32(8).int32(message.amount); } if (message.inflictorWorldPos !== undefined) { netmessages_1.CMsgVector.encode(message.inflictorWorldPos, writer.uint32(18).fork()).ldelim(); } if (message.victimEntindex !== 0) { writer.uint32(24).int32(message.victimEntindex); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCCSUsrMsgDamage(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.amount = reader.int32(); break; case 2: message.inflictorWorldPos = netmessages_1.CMsgVector.decode(reader, reader.uint32()); break; case 3: message.victimEntindex = reader.int32(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b; const message = createBaseCCSUsrMsgDamage(); message.amount = (_a = object.amount) !== null && _a !== void 0 ? _a : 0; message.inflictorWorldPos = object.inflictorWorldPos !== undefined && object.inflictorWorldPos !== null ? netmessages_1.CMsgVector.fromPartial(object.inflictorWorldPos) : undefined; message.victimEntindex = (_b = object.victimEntindex) !== null && _b !== void 0 ? _b : 0; return message; } }; function createBaseCCSUsrMsgRadioText() { return { msgDst: 0, client: 0, msgName: "", params: [] }; } exports.CCSUsrMsgRadioText = { encode(message, writer = minimal_1.Writer.create()) { if (message.msgDst !== 0) { writer.uint32(8).int32(message.msgDst); } if (message.client !== 0) { writer.uint32(16).int32(message.client); } if (message.msgName !== "") { writer.uint32(26).string(message.msgName); } for (const v of message.params) { writer.uint32(34).string(v); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCCSUsrMsgRadioText(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.msgDst = reader.int32(); break; case 2: message.client = reader.int32(); break; case 3: message.msgName = reader.string(); break; case 4: message.params.push(reader.string()); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c, _d; const message = createBaseCCSUsrMsgRadioText(); message.msgDst = (_a = object.msgDst) !== null && _a !== void 0 ? _a : 0; message.client = (_b = object.client) !== null && _b !== void 0 ? _b : 0; message.msgName = (_c = object.msgName) !== null && _c !== void 0 ? _c : ""; message.params = ((_d = object.params) === null || _d === void 0 ? void 0 : _d.map(e => e)) || []; return message; } }; function createBaseCCSUsrMsgHintText() { return { text: "" }; } exports.CCSUsrMsgHintText = { encode(message, writer = minimal_1.Writer.create()) { if (message.text !== "") { writer.uint32(10).string(message.text); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCCSUsrMsgHintText(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.text = reader.string(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a; const message = createBaseCCSUsrMsgHintText(); message.text = (_a = object.text) !== null && _a !== void 0 ? _a : ""; return message; } }; function createBaseCCSUsrMsgKeyHintText() { return { hints: [] }; } exports.CCSUsrMsgKeyHintText = { encode(message, writer = minimal_1.Writer.create()) { for (const v of message.hints) { writer.uint32(10).string(v); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCCSUsrMsgKeyHintText(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.hints.push(reader.string()); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a; const message = createBaseCCSUsrMsgKeyHintText(); message.hints = ((_a = object.hints) === null || _a === void 0 ? void 0 : _a.map(e => e)) || []; return message; } }; function createBaseCCSUsrMsgProcessSpottedEntityUpdate() { return { newUpdate: false, entityUpdates: [] }; } exports.CCSUsrMsgProcessSpottedEntityUpdate = { encode(message, writer = minimal_1.Writer.create()) { if (message.newUpdate === true) { writer.uint32(8).bool(message.newUpdate); } for (const v of message.entityUpdates) { exports.CCSUsrMsgProcessSpottedEntityUpdate_SpottedEntityUpdate.encode(v, writer.uint32(18).fork()).ldelim(); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCCSUsrMsgProcessSpottedEntityUpdate(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.newUpdate = reader.bool(); break; case 2: message.entityUpdates.push(exports.CCSUsrMsgProcessSpottedEntityUpdate_SpottedEntityUpdate.decode(reader, reader.uint32())); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b; const message = createBaseCCSUsrMsgProcessSpottedEntityUpdate(); message.newUpdate = (_a = object.newUpdate) !== null && _a !== void 0 ? _a : false; message.entityUpdates = ((_b = object.entityUpdates) === null || _b === void 0 ? void 0 : _b.map(e => exports.CCSUsrMsgProcessSpottedEntityUpdate_SpottedEntityUpdate.fromPartial(e))) || []; return message; } }; function createBaseCCSUsrMsgProcessSpottedEntityUpdate_SpottedEntityUpdate() { return { entityIdx: 0, classId: 0, originX: 0, originY: 0, originZ: 0, angleY: 0, defuser: false, playerHasDefuser: false, playerHasC4: false }; } exports.CCSUsrMsgProcessSpottedEntityUpdate_SpottedEntityUpdate = { encode(message, writer = minimal_1.Writer.create()) { if (message.entityIdx !== 0) { writer.uint32(8).int32(message.entityIdx); } if (message.classId !== 0) { writer.uint32(16).int32(message.classId); } if (message.originX !== 0) { writer.uint32(24).int32(message.originX); } if (message.originY !== 0) { writer.uint32(32).int32(message.originY); } if (message.originZ !== 0) { writer.uint32(40).int32(message.originZ); } if (message.angleY !== 0) { writer.uint32(48).int32(message.angleY); } if (message.defuser === true) { writer.uint32(56).bool(message.defuser); } if (message.playerHasDefuser === true) { writer.uint32(64).bool(message.playerHasDefuser); } if (message.playerHasC4 === true) { writer.uint32(72).bool(message.playerHasC4); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCCSUsrMsgProcessSpottedEntityUpdate_SpottedEntityUpdate(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.entityIdx = reader.int32(); break; case 2: message.classId = reader.int32(); break; case 3: message.originX = reader.int32(); break; case 4: message.originY = reader.int32(); break; case 5: message.originZ = reader.int32(); break; case 6: message.angleY = reader.int32(); break; case 7: message.defuser = reader.bool(); break; case 8: message.playerHasDefuser = reader.bool(); break; case 9: message.playerHasC4 = reader.bool(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c, _d, _e, _f, _g, _h, _j; const message = createBaseCCSUsrMsgProcessSpottedEntityUpdate_SpottedEntityUpdate(); message.entityIdx = (_a = object.entityIdx) !== null && _a !== void 0 ? _a : 0; message.classId = (_b = object.classId) !== null && _b !== void 0 ? _b : 0; message.originX = (_c = object.originX) !== null && _c !== void 0 ? _c : 0; message.originY = (_d = object.originY) !== null && _d !== void 0 ? _d : 0; message.originZ = (_e = object.originZ) !== null && _e !== void 0 ? _e : 0; message.angleY = (_f = object.angleY) !== null && _f !== void 0 ? _f : 0; message.defuser = (_g = object.defuser) !== null && _g !== void 0 ? _g : false; message.playerHasDefuser = (_h = object.playerHasDefuser) !== null && _h !== void 0 ? _h : false; message.playerHasC4 = (_j = object.playerHasC4) !== null && _j !== void 0 ? _j : false; return message; } }; function createBaseCCSUsrMsgSendPlayerItemDrops() { return { entityUpdates: [] }; } exports.CCSUsrMsgSendPlayerItemDrops = { encode(message, writer = minimal_1.Writer.create()) { for (const v of message.entityUpdates) { cstrike15_gcmessages_1.CEconItemPreviewDataBlock.encode(v, writer.uint32(10).fork()).ldelim(); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCCSUsrMsgSendPlayerItemDrops(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.entityUpdates.push(cstrike15_gcmessages_1.CEconItemPreviewDataBlock.decode(reader, reader.uint32())); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a; const message = createBaseCCSUsrMsgSendPlayerItemDrops(); message.entityUpdates = ((_a = object.entityUpdates) === null || _a === void 0 ? void 0 : _a.map(e => cstrike15_gcmessages_1.CEconItemPreviewDataBlock.fromPartial(e))) || []; return message; } }; function createBaseCCSUsrMsgSendPlayerItemFound() { return { iteminfo: undefined, entindex: 0 }; } exports.CCSUsrMsgSendPlayerItemFound = { encode(message, writer = minimal_1.Writer.create()) { if (message.iteminfo !== undefined) { cstrike15_gcmessages_1.CEconItemPreviewDataBlock.encode(message.iteminfo, writer.uint32(10).fork()).ldelim(); } if (message.entindex !== 0) { writer.uint32(16).int32(message.entindex); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCCSUsrMsgSendPlayerItemFound(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.iteminfo = cstrike15_gcmessages_1.CEconItemPreviewDataBlock.decode(reader, reader.uint32()); break; case 2: message.entindex = reader.int32(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a; const message = createBaseCCSUsrMsgSendPlayerItemFound(); message.iteminfo = object.iteminfo !== undefined && object.iteminfo !== null ? cstrike15_gcmessages_1.CEconItemPreviewDataBlock.fromPartial(object.iteminfo) : undefined; message.entindex = (_a = object.entindex) !== null && _a !== void 0 ? _a : 0; return message; } }; function createBaseCCSUsrMsgReloadEffect() { return { entidx: 0, actanim: 0, originX: 0, originY: 0, originZ: 0 }; } exports.CCSUsrMsgReloadEffect = { encode(message, writer = minimal_1.Writer.create()) { if (message.entidx !== 0) { writer.uint32(8).int32(message.entidx); } if (message.actanim !== 0) { writer.uint32(16).int32(message.actanim); } if (message.originX !== 0) { writer.uint32(29).float(message.originX); } if (message.originY !== 0) { writer.uint32(37).float(message.originY); } if (message.originZ !== 0) { writer.uint32(45).float(message.originZ); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCCSUsrMsgReloadEffect(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.entidx = reader.int32(); break; case 2: message.actanim = reader.int32(); break; case 3: message.originX = reader.float(); break; case 4: message.originY = reader.float(); break; case 5: message.originZ = reader.float(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c, _d, _e; const message = createBaseCCSUsrMsgReloadEffect(); message.entidx = (_a = object.entidx) !== null && _a !== void 0 ? _a : 0; message.actanim = (_b = object.actanim) !== null && _b !== void 0 ? _b : 0; message.originX = (_c = object.originX) !== null && _c !== void 0 ? _c : 0; message.originY = (_d = object.originY) !== null && _d !== void 0 ? _d : 0; message.originZ = (_e = object.originZ) !== null && _e !== void 0 ? _e : 0; return message; } }; function createBaseCCSUsrMsgWeaponSound() { return { entidx: 0, originX: 0, originY: 0, originZ: 0, sound: "", timestamp: 0 }; } exports.CCSUsrMsgWeaponSound = { encode(message, writer = minimal_1.Writer.create()) { if (message.entidx !== 0) { writer.uint32(8).int32(message.entidx); } if (message.originX !== 0) { writer.uint32(21).float(message.originX); } if (message.originY !== 0) { writer.uint32(29).float(message.originY); } if (message.originZ !== 0) { writer.uint32(37).float(message.originZ); } if (message.sound !== "") { writer.uint32(42).string(message.sound); } if (message.timestamp !== 0) { writer.uint32(53).float(message.timestamp); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCCSUsrMsgWeaponSound(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.entidx = reader.int32(); break; case 2: message.originX = reader.float(); break; case 3: message.originY = reader.float(); break; case 4: message.originZ = reader.float(); break; case 5: message.sound = reader.string(); break; case 6: message.timestamp = reader.float(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c, _d, _e, _f; const message = createBaseCCSUsrMsgWeaponSound(); message.entidx = (_a = object.entidx) !== null && _a !== void 0 ? _a : 0; message.originX = (_b = object.originX) !== null && _b !== void 0 ? _b : 0; message.originY = (_c = object.originY) !== null && _c !== void 0 ? _c : 0; message.originZ = (_d = object.originZ) !== null && _d !== void 0 ? _d : 0; message.sound = (_e = object.sound) !== null && _e !== void 0 ? _e : ""; message.timestamp = (_f = object.timestamp) !== null && _f !== void 0 ? _f : 0; return message; } }; function createBaseCCSUsrMsgUpdateScreenHealthBar() { return { entidx: 0, healthratioOld: 0, healthratioNew: 0, style: 0 }; } exports.CCSUsrMsgUpdateScreenHealthBar = { encode(message, writer = minimal_1.Writer.create()) { if (message.entidx !== 0) { writer.uint32(8).int32(message.entidx); } if (message.healthratioOld !== 0) { writer.uint32(21).float(message.healthratioOld); } if (message.healthratioNew !== 0) { writer.uint32(29).float(message.healthratioNew); } if (message.style !== 0) { writer.uint32(32).int32(message.style); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCCSUsrMsgUpdateScreenHealthBar(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.entidx = reader.int32(); break; case 2: message.healthratioOld = reader.float(); break; case 3: message.healthratioNew = reader.float(); break; case 4: message.style = reader.int32(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c, _d; const message = createBaseCCSUsrMsgUpdateScreenHealthBar(); message.entidx = (_a = object.entidx) !== null && _a !== void 0 ? _a : 0; message.healthratioOld = (_b = object.healthratioOld) !== null && _b !== void 0 ? _b : 0; message.healthratioNew = (_c = object.healthratioNew) !== null && _c !== void 0 ? _c : 0; message.style = (_d = object.style) !== null && _d !== void 0 ? _d : 0; return message; } }; function createBaseCCSUsrMsgEntityOutlineHighlight() { return { entidx: 0, removehighlight: false }; } exports.CCSUsrMsgEntityOutlineHighlight = { encode(message, writer = minimal_1.Writer.create()) { if (message.entidx !== 0) { writer.uint32(8).int32(message.entidx); } if (message.removehighlight === true) { writer.uint32(16).bool(message.removehighlight); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCCSUsrMsgEntityOutlineHighlight(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.entidx = reader.int32(); break; case 2: message.removehighlight = reader.bool(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b; const message = createBaseCCSUsrMsgEntityOutlineHighlight(); message.entidx = (_a = object.entidx) !== null && _a !== void 0 ? _a : 0; message.removehighlight = (_b = object.removehighlight) !== null && _b !== void 0 ? _b : false; return message; } }; function createBaseCCSUsrMsgAdjustMoney() { return { amount: 0 }; } exports.CCSUsrMsgAdjustMoney = { encode(message, writer = minimal_1.Writer.create()) { if (message.amount !== 0) { writer.uint32(8).int32(message.amount); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCCSUsrMsgAdjustMoney(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.amount = reader.int32(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a; const message = createBaseCCSUsrMsgAdjustMoney(); message.amount = (_a = object.amount) !== null && _a !== void 0 ? _a : 0; return message; } }; function createBaseCCSUsrMsgReportHit() { return { posX: 0, posY: 0, timestamp: 0, posZ: 0 }; } exports.CCSUsrMsgReportHit = { encode(message, writer = minimal_1.Writer.create()) { if (message.posX !== 0) { writer.uint32(13).float(message.posX); } if (message.posY !== 0) { writer.uint32(21).float(message.posY); } if (message.timestamp !== 0) { writer.uint32(37).float(message.timestamp); } if (message.posZ !== 0) { writer.uint32(29).float(message.posZ); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCCSUsrMsgReportHit(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.posX = reader.float(); break; case 2: message.posY = reader.float(); break; case 4: message.timestamp = reader.float(); break; case 3: message.posZ = reader.float(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c, _d; const message = createBaseCCSUsrMsgReportHit(); message.posX = (_a = object.posX) !== null && _a !== void 0 ? _a : 0; message.posY = (_b = object.posY) !== null && _b !== void 0 ? _b : 0; message.timestamp = (_c = object.timestamp) !== null && _c !== void 0 ? _c : 0; message.posZ = (_d = object.posZ) !== null && _d !== void 0 ? _d : 0; return message; } }; function createBaseCCSUsrMsgKillCam() { return { obsMode: 0, firstTarget: 0, secondTarget: 0 }; } exports.CCSUsrMsgKillCam = { encode(message, writer = minimal_1.Writer.create()) { if (message.obsMode !== 0) { writer.uint32(8).int32(message.obsMode); } if (message.firstTarget !== 0) { writer.uint32(16).int32(message.firstTarget); } if (message.secondTarget !== 0) { writer.uint32(24).int32(message.secondTarget); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCCSUsrMsgKillCam(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.obsMode = reader.int32(); break; case 2: message.firstTarget = reader.int32(); break; case 3: message.secondTarget = reader.int32(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c; const message = createBaseCCSUsrMsgKillCam(); message.obsMode = (_a = object.obsMode) !== null && _a !== void 0 ? _a : 0; message.firstTarget = (_b = object.firstTarget) !== null && _b !== void 0 ? _b : 0; message.secondTarget = (_c = object.secondTarget) !== null && _c !== void 0 ? _c : 0; return message; } }; function createBaseCCSUsrMsgDesiredTimescale() { return { desiredTimescale: 0, durationRealtimeSec: 0, interpolatorType: 0, startBlendTime: 0 }; } exports.CCSUsrMsgDesiredTimescale = { encode(message, writer = minimal_1.Writer.create()) { if (message.desiredTimescale !== 0) { writer.uint32(13).float(message.desiredTimescale); } if (message.durationRealtimeSec !== 0) { writer.uint32(21).float(message.durationRealtimeSec); } if (message.interpolatorType !== 0) { writer.uint32(24).int32(message.interpolatorType); } if (message.startBlendTime !== 0) { writer.uint32(37).float(message.startBlendTime); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCCSUsrMsgDesiredTimescale(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.desiredTimescale = reader.float(); break; case 2: message.durationRealtimeSec = reader.float(); break; case 3: message.interpolatorType = reader.int32(); break; case 4: message.startBlendTime = reader.float(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c, _d; const message = createBaseCCSUsrMsgDesiredTimescale(); message.desiredTimescale = (_a = object.desiredTimescale) !== null && _a !== void 0 ? _a : 0; message.durationRealtimeSec = (_b = object.durationRealtimeSec) !== null && _b !== void 0 ? _b : 0; message.interpolatorType = (_c = object.interpolatorType) !== null && _c !== void 0 ? _c : 0; message.startBlendTime = (_d = object.startBlendTime) !== null && _d !== void 0 ? _d : 0; return message; } }; function createBaseCCSUsrMsgCurrentTimescale() { return { curTimescale: 0 }; } exports.CCSUsrMsgCurrentTimescale = { encode(message, writer = minimal_1.Writer.create()) { if (message.curTimescale !== 0) { writer.uint32(13).float(message.curTimescale); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCCSUsrMsgCurrentTimescale(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.curTimescale = reader.float(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a; const message = createBaseCCSUsrMsgCurrentTimescale(); message.curTimescale = (_a = object.curTimescale) !== null && _a !== void 0 ? _a : 0; return message; } }; function createBaseCCSUsrMsgAchievementEvent() { return { achievement: 0, count: 0, userId: 0 }; } exports.CCSUsrMsgAchievementEvent = { encode(message, writer = minimal_1.Writer.create()) { if (message.achievement !== 0) { writer.uint32(8).int32(message.achievement); } if (message.count !== 0) { writer.uint32(16).int32(message.count); } if (message.userId !== 0) { writer.uint32(24).int32(message.userId); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCCSUsrMsgAchievementEvent(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.achievement = reader.int32(); break; case 2: message.count = reader.int32(); break; case 3: message.userId = reader.int32(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c; const message = createBaseCCSUsrMsgAchievementEvent(); message.achievement = (_a = object.achievement) !== null && _a !== void 0 ? _a : 0; message.count = (_b = object.count) !== null && _b !== void 0 ? _b : 0; message.userId = (_c = object.userId) !== null && _c !== void 0 ? _c : 0; return message; } }; function createBaseCCSUsrMsgMatchEndConditions() { return { fraglimit: 0, mpMaxrounds: 0, mpWinlimit: 0, mpTimelimit: 0 }; } exports.CCSUsrMsgMatchEndConditions = { encode(message, writer = minimal_1.Writer.create()) { if (message.fraglimit !== 0) { writer.uint32(8).int32(message.fraglimit); } if (message.mpMaxrounds !== 0) { writer.uint32(16).int32(message.mpMaxrounds); } if (message.mpWinlimit !== 0) { writer.uint32(24).int32(message.mpWinlimit); } if (message.mpTimelimit !== 0) { writer.uint32(32).int32(message.mpTimelimit); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCCSUsrMsgMatchEndConditions(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.fraglimit = reader.int32(); break; case 2: message.mpMaxrounds = reader.int32(); break; case 3: message.mpWinlimit = reader.int32(); break; case 4: message.mpTimelimit = reader.int32(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c, _d; const message = createBaseCCSUsrMsgMatchEndConditions(); message.fraglimit = (_a = object.fraglimit) !== null && _a !== void 0 ? _a : 0; message.mpMaxrounds = (_b = object.mpMaxrounds) !== null && _b !== void 0 ? _b : 0; message.mpWinlimit = (_c = object.mpWinlimit) !== null && _c !== void 0 ? _c : 0; message.mpTimelimit = (_d = object.mpTimelimit) !== null && _d !== void 0 ? _d : 0; return message; } }; function createBaseCCSUsrMsgPlayerStatsUpdate() { return { version: 0, stats: [], userId: 0, crc: 0 }; } exports.CCSUsrMsgPlayerStatsUpdate = { encode(message, writer = minimal_1.Writer.create()) { if (message.version !== 0) { writer.uint32(8).int32(message.version); } for (const v of message.stats) { exports.CCSUsrMsgPlayerStatsUpdate_Stat.encode(v, writer.uint32(34).fork()).ldelim(); } if (message.userId !== 0) { writer.uint32(40).int32(message.userId); } if (message.crc !== 0) { writer.uint32(48).int32(message.crc); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCCSUsrMsgPlayerStatsUpdate(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.version = reader.int32(); break; case 4: message.stats.push(exports.CCSUsrMsgPlayerStatsUpdate_Stat.decode(reader, reader.uint32())); break; case 5: message.userId = reader.int32(); break; case 6: message.crc = reader.int32(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c, _d; const message = createBaseCCSUsrMsgPlayerStatsUpdate(); message.version = (_a = object.version) !== null && _a !== void 0 ? _a : 0; message.stats = ((_b = object.stats) === null || _b === void 0 ? void 0 : _b.map(e => exports.CCSUsrMsgPlayerStatsUpdate_Stat.fromPartial(e))) || []; message.userId = (_c = object.userId) !== null && _c !== void 0 ? _c : 0; message.crc = (_d = object.crc) !== null && _d !== void 0 ? _d : 0; return message; } }; function createBaseCCSUsrMsgPlayerStatsUpdate_Stat() { return { idx: 0, delta: 0 }; } exports.CCSUsrMsgPlayerStatsUpdate_Stat = { encode(message, writer = minimal_1.Writer.create()) { if (message.idx !== 0) { writer.uint32(8).int32(message.idx); } if (message.delta !== 0) { writer.uint32(16).int32(message.delta); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCCSUsrMsgPlayerStatsUpdate_Stat(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.idx = reader.int32(); break; case 2: message.delta = reader.int32(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b; const message = createBaseCCSUsrMsgPlayerStatsUpdate_Stat(); message.idx = (_a = object.idx) !== null && _a !== void 0 ? _a : 0; message.delta = (_b = object.delta) !== null && _b !== void 0 ? _b : 0; return message; } }; function createBaseCCSUsrMsgDisplayInventory() { return { display: false, userId: 0 }; } exports.CCSUsrMsgDisplayInventory = { encode(message, writer = minimal_1.Writer.create()) { if (message.display === true) { writer.uint32(8).bool(message.display); } if (message.userId !== 0) { writer.uint32(16).int32(message.userId); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCCSUsrMsgDisplayInventory(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.display = reader.bool(); break; case 2: message.userId = reader.int32(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b; const message = createBaseCCSUsrMsgDisplayInventory(); message.display = (_a = object.display) !== null && _a !== void 0 ? _a : false; message.userId = (_b = object.userId) !== null && _b !== void 0 ? _b : 0; return message; } }; function createBaseCCSUsrMsgQuestProgress() { return { questId: 0, normalPoints: 0, bonusPoints: 0, isEventQuest: false }; } exports.CCSUsrMsgQuestProgress = { encode(message, writer = minimal_1.Writer.create()) { if (message.questId !== 0) { writer.uint32(8).uint32(message.questId); } if (message.normalPoints !== 0) { writer.uint32(16).uint32(message.normalPoints); } if (message.bonusPoints !== 0) { writer.uint32(24).uint32(message.bonusPoints); } if (message.isEventQuest === true) { writer.uint32(32).bool(message.isEventQuest); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCCSUsrMsgQuestProgress(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.questId = reader.uint32(); break; case 2: message.normalPoints = reader.uint32(); break; case 3: message.bonusPoints = reader.uint32(); break; case 4: message.isEventQuest = reader.bool(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c, _d; const message = createBaseCCSUsrMsgQuestProgress(); message.questId = (_a = object.questId) !== null && _a !== void 0 ? _a : 0; message.normalPoints = (_b = object.normalPoints) !== null && _b !== void 0 ? _b : 0; message.bonusPoints = (_c = object.bonusPoints) !== null && _c !== void 0 ? _c : 0; message.isEventQuest = (_d = object.isEventQuest) !== null && _d !== void 0 ? _d : false; return message; } }; function createBaseCCSUsrMsgScoreLeaderboardData() { return { data: undefined }; } exports.CCSUsrMsgScoreLeaderboardData = { encode(message, writer = minimal_1.Writer.create()) { if (message.data !== undefined) { cstrike15_gcmessages_1.ScoreLeaderboardData.encode(message.data, writer.uint32(10).fork()).ldelim(); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCCSUsrMsgScoreLeaderboardData(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.data = cstrike15_gcmessages_1.ScoreLeaderboardData.decode(reader, reader.uint32()); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { const message = createBaseCCSUsrMsgScoreLeaderboardData(); message.data = object.data !== undefined && object.data !== null ? cstrike15_gcmessages_1.ScoreLeaderboardData.fromPartial(object.data) : undefined; return message; } }; function createBaseCCSUsrMsgPlayerDecalDigitalSignature() { return { data: undefined }; } exports.CCSUsrMsgPlayerDecalDigitalSignature = { encode(message, writer = minimal_1.Writer.create()) { if (message.data !== undefined) { cstrike15_gcmessages_1.PlayerDecalDigitalSignature.encode(message.data, writer.uint32(10).fork()).ldelim(); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCCSUsrMsgPlayerDecalDigitalSignature(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.data = cstrike15_gcmessages_1.PlayerDecalDigitalSignature.decode(reader, reader.uint32()); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { const message = createBaseCCSUsrMsgPlayerDecalDigitalSignature(); message.data = object.data !== undefined && object.data !== null ? cstrike15_gcmessages_1.PlayerDecalDigitalSignature.fromPartial(object.data) : undefined; return message; } }; function createBaseCCSUsrMsgXRankGet() { return { modeIdx: 0, controller: 0 }; } exports.CCSUsrMsgXRankGet = { encode(message, writer = minimal_1.Writer.create()) { if (message.modeIdx !== 0) { writer.uint32(8).int32(message.modeIdx); } if (message.controller !== 0) { writer.uint32(16).int32(message.controller); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCCSUsrMsgXRankGet(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.modeIdx = reader.int32(); break; case 2: message.controller = reader.int32(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b; const message = createBaseCCSUsrMsgXRankGet(); message.modeIdx = (_a = object.modeIdx) !== null && _a !== void 0 ? _a : 0; message.controller = (_b = object.controller) !== null && _b !== void 0 ? _b : 0; return message; } }; function createBaseCCSUsrMsgXRankUpd() { return { modeIdx: 0, controller: 0, ranking: 0 }; } exports.CCSUsrMsgXRankUpd = { encode(message, writer = minimal_1.Writer.create()) { if (message.modeIdx !== 0) { writer.uint32(8).int32(message.modeIdx); } if (message.controller !== 0) { writer.uint32(16).int32(message.controller); } if (message.ranking !== 0) { writer.uint32(24).int32(message.ranking); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCCSUsrMsgXRankUpd(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.modeIdx = reader.int32(); break; case 2: message.controller = reader.int32(); break; case 3: message.ranking = reader.int32(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c; const message = createBaseCCSUsrMsgXRankUpd(); message.modeIdx = (_a = object.modeIdx) !== null && _a !== void 0 ? _a : 0; message.controller = (_b = object.controller) !== null && _b !== void 0 ? _b : 0; message.ranking = (_c = object.ranking) !== null && _c !== void 0 ? _c : 0; return message; } }; function createBaseCCSUsrMsgCallVoteFailed() { return { reason: 0, time: 0 }; } exports.CCSUsrMsgCallVoteFailed = { encode(message, writer = minimal_1.Writer.create()) { if (message.reason !== 0) { writer.uint32(8).int32(message.reason); } if (message.time !== 0) { writer.uint32(16).int32(message.time); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCCSUsrMsgCallVoteFailed(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.reason = reader.int32(); break; case 2: message.time = reader.int32(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b; const message = createBaseCCSUsrMsgCallVoteFailed(); message.reason = (_a = object.reason) !== null && _a !== void 0 ? _a : 0; message.time = (_b = object.time) !== null && _b !== void 0 ? _b : 0; return message; } }; function createBaseCCSUsrMsgVoteStart() { return { team: 0, entIdx: 0, voteType: 0, dispStr: "", detailsStr: "", otherTeamStr: "", isYesNoVote: false, entidxTarget: 0 }; } exports.CCSUsrMsgVoteStart = { encode(message, writer = minimal_1.Writer.create()) { if (message.team !== 0) { writer.uint32(8).int32(message.team); } if (message.entIdx !== 0) { writer.uint32(16).int32(message.entIdx); } if (message.voteType !== 0) { writer.uint32(24).int32(message.voteType); } if (message.dispStr !== "") { writer.uint32(34).string(message.dispStr); } if (message.detailsStr !== "") { writer.uint32(42).string(message.detailsStr); } if (message.otherTeamStr !== "") { writer.uint32(50).string(message.otherTeamStr); } if (message.isYesNoVote === true) { writer.uint32(56).bool(message.isYesNoVote); } if (message.entidxTarget !== 0) { writer.uint32(64).int32(message.entidxTarget); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCCSUsrMsgVoteStart(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.team = reader.int32(); break; case 2: message.entIdx = reader.int32(); break; case 3: message.voteType = reader.int32(); break; case 4: message.dispStr = reader.string(); break; case 5: message.detailsStr = reader.string(); break; case 6: message.otherTeamStr = reader.string(); break; case 7: message.isYesNoVote = reader.bool(); break; case 8: message.entidxTarget = reader.int32(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c, _d, _e, _f, _g, _h; const message = createBaseCCSUsrMsgVoteStart(); message.team = (_a = object.team) !== null && _a !== void 0 ? _a : 0; message.entIdx = (_b = object.entIdx) !== null && _b !== void 0 ? _b : 0; message.voteType = (_c = object.voteType) !== null && _c !== void 0 ? _c : 0; message.dispStr = (_d = object.dispStr) !== null && _d !== void 0 ? _d : ""; message.detailsStr = (_e = object.detailsStr) !== null && _e !== void 0 ? _e : ""; message.otherTeamStr = (_f = object.otherTeamStr) !== null && _f !== void 0 ? _f : ""; message.isYesNoVote = (_g = object.isYesNoVote) !== null && _g !== void 0 ? _g : false; message.entidxTarget = (_h = object.entidxTarget) !== null && _h !== void 0 ? _h : 0; return message; } }; function createBaseCCSUsrMsgVotePass() { return { team: 0, voteType: 0, dispStr: "", detailsStr: "" }; } exports.CCSUsrMsgVotePass = { encode(message, writer = minimal_1.Writer.create()) { if (message.team !== 0) { writer.uint32(8).int32(message.team); } if (message.voteType !== 0) { writer.uint32(16).int32(message.voteType); } if (message.dispStr !== "") { writer.uint32(26).string(message.dispStr); } if (message.detailsStr !== "") { writer.uint32(34).string(message.detailsStr); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCCSUsrMsgVotePass(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.team = reader.int32(); break; case 2: message.voteType = reader.int32(); break; case 3: message.dispStr = reader.string(); break; case 4: message.detailsStr = reader.string(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c, _d; const message = createBaseCCSUsrMsgVotePass(); message.team = (_a = object.team) !== null && _a !== void 0 ? _a : 0; message.voteType = (_b = object.voteType) !== null && _b !== void 0 ? _b : 0; message.dispStr = (_c = object.dispStr) !== null && _c !== void 0 ? _c : ""; message.detailsStr = (_d = object.detailsStr) !== null && _d !== void 0 ? _d : ""; return message; } }; function createBaseCCSUsrMsgVoteFailed() { return { team: 0, reason: 0 }; } exports.CCSUsrMsgVoteFailed = { encode(message, writer = minimal_1.Writer.create()) { if (message.team !== 0) { writer.uint32(8).int32(message.team); } if (message.reason !== 0) { writer.uint32(16).int32(message.reason); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCCSUsrMsgVoteFailed(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.team = reader.int32(); break; case 2: message.reason = reader.int32(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b; const message = createBaseCCSUsrMsgVoteFailed(); message.team = (_a = object.team) !== null && _a !== void 0 ? _a : 0; message.reason = (_b = object.reason) !== null && _b !== void 0 ? _b : 0; return message; } }; function createBaseCCSUsrMsgVoteSetup() { return { potentialIssues: [] }; } exports.CCSUsrMsgVoteSetup = { encode(message, writer = minimal_1.Writer.create()) { for (const v of message.potentialIssues) { writer.uint32(10).string(v); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCCSUsrMsgVoteSetup(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.potentialIssues.push(reader.string()); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a; const message = createBaseCCSUsrMsgVoteSetup(); message.potentialIssues = ((_a = object.potentialIssues) === null || _a === void 0 ? void 0 : _a.map(e => e)) || []; return message; } }; function createBaseCCSUsrMsgSendLastKillerDamageToClient() { return { numHitsGiven: 0, damageGiven: 0, numHitsTaken: 0, damageTaken: 0 }; } exports.CCSUsrMsgSendLastKillerDamageToClient = { encode(message, writer = minimal_1.Writer.create()) { if (message.numHitsGiven !== 0) { writer.uint32(8).int32(message.numHitsGiven); } if (message.damageGiven !== 0) { writer.uint32(16).int32(message.damageGiven); } if (message.numHitsTaken !== 0) { writer.uint32(24).int32(message.numHitsTaken); } if (message.damageTaken !== 0) { writer.uint32(32).int32(message.damageTaken); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCCSUsrMsgSendLastKillerDamageToClient(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.numHitsGiven = reader.int32(); break; case 2: message.damageGiven = reader.int32(); break; case 3: message.numHitsTaken = reader.int32(); break; case 4: message.damageTaken = reader.int32(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c, _d; const message = createBaseCCSUsrMsgSendLastKillerDamageToClient(); message.numHitsGiven = (_a = object.numHitsGiven) !== null && _a !== void 0 ? _a : 0; message.damageGiven = (_b = object.damageGiven) !== null && _b !== void 0 ? _b : 0; message.numHitsTaken = (_c = object.numHitsTaken) !== null && _c !== void 0 ? _c : 0; message.damageTaken = (_d = object.damageTaken) !== null && _d !== void 0 ? _d : 0; return message; } }; function createBaseCCSUsrMsgServerRankUpdate() { return { rankUpdate: [] }; } exports.CCSUsrMsgServerRankUpdate = { encode(message, writer = minimal_1.Writer.create()) { for (const v of message.rankUpdate) { exports.CCSUsrMsgServerRankUpdate_RankUpdate.encode(v, writer.uint32(10).fork()).ldelim(); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCCSUsrMsgServerRankUpdate(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.rankUpdate.push(exports.CCSUsrMsgServerRankUpdate_RankUpdate.decode(reader, reader.uint32())); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a; const message = createBaseCCSUsrMsgServerRankUpdate(); message.rankUpdate = ((_a = object.rankUpdate) === null || _a === void 0 ? void 0 : _a.map(e => exports.CCSUsrMsgServerRankUpdate_RankUpdate.fromPartial(e))) || []; return message; } }; function createBaseCCSUsrMsgServerRankUpdate_RankUpdate() { return { accountId: 0, rankOld: 0, rankNew: 0, numWins: 0, rankChange: 0, rankTypeId: 0 }; } exports.CCSUsrMsgServerRankUpdate_RankUpdate = { encode(message, writer = minimal_1.Writer.create()) { if (message.accountId !== 0) { writer.uint32(8).int32(message.accountId); } if (message.rankOld !== 0) { writer.uint32(16).int32(message.rankOld); } if (message.rankNew !== 0) { writer.uint32(24).int32(message.rankNew); } if (message.numWins !== 0) { writer.uint32(32).int32(message.numWins); } if (message.rankChange !== 0) { writer.uint32(45).float(message.rankChange); } if (message.rankTypeId !== 0) { writer.uint32(48).int32(message.rankTypeId); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCCSUsrMsgServerRankUpdate_RankUpdate(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.accountId = reader.int32(); break; case 2: message.rankOld = reader.int32(); break; case 3: message.rankNew = reader.int32(); break; case 4: message.numWins = reader.int32(); break; case 5: message.rankChange = reader.float(); break; case 6: message.rankTypeId = reader.int32(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c, _d, _e, _f; const message = createBaseCCSUsrMsgServerRankUpdate_RankUpdate(); message.accountId = (_a = object.accountId) !== null && _a !== void 0 ? _a : 0; message.rankOld = (_b = object.rankOld) !== null && _b !== void 0 ? _b : 0; message.rankNew = (_c = object.rankNew) !== null && _c !== void 0 ? _c : 0; message.numWins = (_d = object.numWins) !== null && _d !== void 0 ? _d : 0; message.rankChange = (_e = object.rankChange) !== null && _e !== void 0 ? _e : 0; message.rankTypeId = (_f = object.rankTypeId) !== null && _f !== void 0 ? _f : 0; return message; } }; function createBaseCCSUsrMsgXpUpdate() { return { data: undefined }; } exports.CCSUsrMsgXpUpdate = { encode(message, writer = minimal_1.Writer.create()) { if (message.data !== undefined) { cstrike15_gcmessages_1.CMsgGCCstrike15V2GC2ServerNotifyXPRewarded.encode(message.data, writer.uint32(10).fork()).ldelim(); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCCSUsrMsgXpUpdate(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.data = cstrike15_gcmessages_1.CMsgGCCstrike15V2GC2ServerNotifyXPRewarded.decode(reader, reader.uint32()); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { const message = createBaseCCSUsrMsgXpUpdate(); message.data = object.data !== undefined && object.data !== null ? cstrike15_gcmessages_1.CMsgGCCstrike15V2GC2ServerNotifyXPRewarded.fromPartial(object.data) : undefined; return message; } }; function createBaseCCSUsrMsgItemPickup() { return { item: "" }; } exports.CCSUsrMsgItemPickup = { encode(message, writer = minimal_1.Writer.create()) { if (message.item !== "") { writer.uint32(10).string(message.item); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCCSUsrMsgItemPickup(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.item = reader.string(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a; const message = createBaseCCSUsrMsgItemPickup(); message.item = (_a = object.item) !== null && _a !== void 0 ? _a : ""; return message; } }; function createBaseCCSUsrMsgShowMenu() { return { bitsValidSlots: 0, displayTime: 0, menuString: "" }; } exports.CCSUsrMsgShowMenu = { encode(message, writer = minimal_1.Writer.create()) { if (message.bitsValidSlots !== 0) { writer.uint32(8).int32(message.bitsValidSlots); } if (message.displayTime !== 0) { writer.uint32(16).int32(message.displayTime); } if (message.menuString !== "") { writer.uint32(26).string(message.menuString); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCCSUsrMsgShowMenu(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.bitsValidSlots = reader.int32(); break; case 2: message.displayTime = reader.int32(); break; case 3: message.menuString = reader.string(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c; const message = createBaseCCSUsrMsgShowMenu(); message.bitsValidSlots = (_a = object.bitsValidSlots) !== null && _a !== void 0 ? _a : 0; message.displayTime = (_b = object.displayTime) !== null && _b !== void 0 ? _b : 0; message.menuString = (_c = object.menuString) !== null && _c !== void 0 ? _c : ""; return message; } }; function createBaseCCSUsrMsgBarTime() { return { time: "" }; } exports.CCSUsrMsgBarTime = { encode(message, writer = minimal_1.Writer.create()) { if (message.time !== "") { writer.uint32(10).string(message.time); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCCSUsrMsgBarTime(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.time = reader.string(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a; const message = createBaseCCSUsrMsgBarTime(); message.time = (_a = object.time) !== null && _a !== void 0 ? _a : ""; return message; } }; function createBaseCCSUsrMsgAmmoDenied() { return { ammoIdx: 0 }; } exports.CCSUsrMsgAmmoDenied = { encode(message, writer = minimal_1.Writer.create()) { if (message.ammoIdx !== 0) { writer.uint32(8).int32(message.ammoIdx); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCCSUsrMsgAmmoDenied(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.ammoIdx = reader.int32(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a; const message = createBaseCCSUsrMsgAmmoDenied(); message.ammoIdx = (_a = object.ammoIdx) !== null && _a !== void 0 ? _a : 0; return message; } }; function createBaseCCSUsrMsgMarkAchievement() { return { achievement: "" }; } exports.CCSUsrMsgMarkAchievement = { encode(message, writer = minimal_1.Writer.create()) { if (message.achievement !== "") { writer.uint32(10).string(message.achievement); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCCSUsrMsgMarkAchievement(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.achievement = reader.string(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a; const message = createBaseCCSUsrMsgMarkAchievement(); message.achievement = (_a = object.achievement) !== null && _a !== void 0 ? _a : ""; return message; } }; function createBaseCCSUsrMsgMatchStatsUpdate() { return { update: "" }; } exports.CCSUsrMsgMatchStatsUpdate = { encode(message, writer = minimal_1.Writer.create()) { if (message.update !== "") { writer.uint32(10).string(message.update); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCCSUsrMsgMatchStatsUpdate(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.update = reader.string(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a; const message = createBaseCCSUsrMsgMatchStatsUpdate(); message.update = (_a = object.update) !== null && _a !== void 0 ? _a : ""; return message; } }; function createBaseCCSUsrMsgItemDrop() { return { itemid: Long.ZERO, death: false }; } exports.CCSUsrMsgItemDrop = { encode(message, writer = minimal_1.Writer.create()) { if (!message.itemid.isZero()) { writer.uint32(8).int64(message.itemid); } if (message.death === true) { writer.uint32(16).bool(message.death); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCCSUsrMsgItemDrop(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.itemid = reader.int64(); break; case 2: message.death = reader.bool(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a; const message = createBaseCCSUsrMsgItemDrop(); message.itemid = object.itemid !== undefined && object.itemid !== null ? Long.fromValue(object.itemid) : Long.ZERO; message.death = (_a = object.death) !== null && _a !== void 0 ? _a : false; return message; } }; function createBaseCCSUsrMsgGlowPropTurnOff() { return { entidx: 0 }; } exports.CCSUsrMsgGlowPropTurnOff = { encode(message, writer = minimal_1.Writer.create()) { if (message.entidx !== 0) { writer.uint32(8).int32(message.entidx); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCCSUsrMsgGlowPropTurnOff(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.entidx = reader.int32(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a; const message = createBaseCCSUsrMsgGlowPropTurnOff(); message.entidx = (_a = object.entidx) !== null && _a !== void 0 ? _a : 0; return message; } }; function createBaseCCSUsrMsgRoundBackupFilenames() { return { count: 0, index: 0, filename: "", nicename: "" }; } exports.CCSUsrMsgRoundBackupFilenames = { encode(message, writer = minimal_1.Writer.create()) { if (message.count !== 0) { writer.uint32(8).int32(message.count); } if (message.index !== 0) { writer.uint32(16).int32(message.index); } if (message.filename !== "") { writer.uint32(26).string(message.filename); } if (message.nicename !== "") { writer.uint32(34).string(message.nicename); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCCSUsrMsgRoundBackupFilenames(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.count = reader.int32(); break; case 2: message.index = reader.int32(); break; case 3: message.filename = reader.string(); break; case 4: message.nicename = reader.string(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c, _d; const message = createBaseCCSUsrMsgRoundBackupFilenames(); message.count = (_a = object.count) !== null && _a !== void 0 ? _a : 0; message.index = (_b = object.index) !== null && _b !== void 0 ? _b : 0; message.filename = (_c = object.filename) !== null && _c !== void 0 ? _c : ""; message.nicename = (_d = object.nicename) !== null && _d !== void 0 ? _d : ""; return message; } }; function createBaseCCSUsrMsgSSUI() { return { show: false, startTime: 0, endTime: 0 }; } exports.CCSUsrMsgSSUI = { encode(message, writer = minimal_1.Writer.create()) { if (message.show === true) { writer.uint32(8).bool(message.show); } if (message.startTime !== 0) { writer.uint32(21).float(message.startTime); } if (message.endTime !== 0) { writer.uint32(29).float(message.endTime); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCCSUsrMsgSSUI(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.show = reader.bool(); break; case 2: message.startTime = reader.float(); break; case 3: message.endTime = reader.float(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c; const message = createBaseCCSUsrMsgSSUI(); message.show = (_a = object.show) !== null && _a !== void 0 ? _a : false; message.startTime = (_b = object.startTime) !== null && _b !== void 0 ? _b : 0; message.endTime = (_c = object.endTime) !== null && _c !== void 0 ? _c : 0; return message; } }; function createBaseCCSUsrMsgSurvivalStats() { return { xuid: Long.UZERO, facts: [], users: [], damages: [], ticknumber: 0 }; } exports.CCSUsrMsgSurvivalStats = { encode(message, writer = minimal_1.Writer.create()) { if (!message.xuid.isZero()) { writer.uint32(8).uint64(message.xuid); } for (const v of message.facts) { exports.CCSUsrMsgSurvivalStats_Fact.encode(v, writer.uint32(18).fork()).ldelim(); } for (const v of message.users) { exports.CCSUsrMsgSurvivalStats_Placement.encode(v, writer.uint32(26).fork()).ldelim(); } for (const v of message.damages) { exports.CCSUsrMsgSurvivalStats_Damage.encode(v, writer.uint32(42).fork()).ldelim(); } if (message.ticknumber !== 0) { writer.uint32(32).int32(message.ticknumber); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCCSUsrMsgSurvivalStats(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.xuid = reader.uint64(); break; case 2: message.facts.push(exports.CCSUsrMsgSurvivalStats_Fact.decode(reader, reader.uint32())); break; case 3: message.users.push(exports.CCSUsrMsgSurvivalStats_Placement.decode(reader, reader.uint32())); break; case 5: message.damages.push(exports.CCSUsrMsgSurvivalStats_Damage.decode(reader, reader.uint32())); break; case 4: message.ticknumber = reader.int32(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c, _d; const message = createBaseCCSUsrMsgSurvivalStats(); message.xuid = object.xuid !== undefined && object.xuid !== null ? Long.fromValue(object.xuid) : Long.UZERO; message.facts = ((_a = object.facts) === null || _a === void 0 ? void 0 : _a.map(e => exports.CCSUsrMsgSurvivalStats_Fact.fromPartial(e))) || []; message.users = ((_b = object.users) === null || _b === void 0 ? void 0 : _b.map(e => exports.CCSUsrMsgSurvivalStats_Placement.fromPartial(e))) || []; message.damages = ((_c = object.damages) === null || _c === void 0 ? void 0 : _c.map(e => exports.CCSUsrMsgSurvivalStats_Damage.fromPartial(e))) || []; message.ticknumber = (_d = object.ticknumber) !== null && _d !== void 0 ? _d : 0; return message; } }; function createBaseCCSUsrMsgSurvivalStats_Fact() { return { type: 0, display: 0, value: 0, interestingness: 0 }; } exports.CCSUsrMsgSurvivalStats_Fact = { encode(message, writer = minimal_1.Writer.create()) { if (message.type !== 0) { writer.uint32(8).int32(message.type); } if (message.display !== 0) { writer.uint32(16).int32(message.display); } if (message.value !== 0) { writer.uint32(24).int32(message.value); } if (message.interestingness !== 0) { writer.uint32(37).float(message.interestingness); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCCSUsrMsgSurvivalStats_Fact(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.type = reader.int32(); break; case 2: message.display = reader.int32(); break; case 3: message.value = reader.int32(); break; case 4: message.interestingness = reader.float(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c, _d; const message = createBaseCCSUsrMsgSurvivalStats_Fact(); message.type = (_a = object.type) !== null && _a !== void 0 ? _a : 0; message.display = (_b = object.display) !== null && _b !== void 0 ? _b : 0; message.value = (_c = object.value) !== null && _c !== void 0 ? _c : 0; message.interestingness = (_d = object.interestingness) !== null && _d !== void 0 ? _d : 0; return message; } }; function createBaseCCSUsrMsgSurvivalStats_Placement() { return { xuid: Long.UZERO, teamnumber: 0, placement: 0 }; } exports.CCSUsrMsgSurvivalStats_Placement = { encode(message, writer = minimal_1.Writer.create()) { if (!message.xuid.isZero()) { writer.uint32(8).uint64(message.xuid); } if (message.teamnumber !== 0) { writer.uint32(16).int32(message.teamnumber); } if (message.placement !== 0) { writer.uint32(24).int32(message.placement); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCCSUsrMsgSurvivalStats_Placement(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.xuid = reader.uint64(); break; case 2: message.teamnumber = reader.int32(); break; case 3: message.placement = reader.int32(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b; const message = createBaseCCSUsrMsgSurvivalStats_Placement(); message.xuid = object.xuid !== undefined && object.xuid !== null ? Long.fromValue(object.xuid) : Long.UZERO; message.teamnumber = (_a = object.teamnumber) !== null && _a !== void 0 ? _a : 0; message.placement = (_b = object.placement) !== null && _b !== void 0 ? _b : 0; return message; } }; function createBaseCCSUsrMsgSurvivalStats_Damage() { return { xuid: Long.UZERO, to: 0, toHits: 0, from: 0, fromHits: 0 }; } exports.CCSUsrMsgSurvivalStats_Damage = { encode(message, writer = minimal_1.Writer.create()) { if (!message.xuid.isZero()) { writer.uint32(8).uint64(message.xuid); } if (message.to !== 0) { writer.uint32(16).int32(message.to); } if (message.toHits !== 0) { writer.uint32(24).int32(message.toHits); } if (message.from !== 0) { writer.uint32(32).int32(message.from); } if (message.fromHits !== 0) { writer.uint32(40).int32(message.fromHits); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCCSUsrMsgSurvivalStats_Damage(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.xuid = reader.uint64(); break; case 2: message.to = reader.int32(); break; case 3: message.toHits = reader.int32(); break; case 4: message.from = reader.int32(); break; case 5: message.fromHits = reader.int32(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c, _d; const message = createBaseCCSUsrMsgSurvivalStats_Damage(); message.xuid = object.xuid !== undefined && object.xuid !== null ? Long.fromValue(object.xuid) : Long.UZERO; message.to = (_a = object.to) !== null && _a !== void 0 ? _a : 0; message.toHits = (_b = object.toHits) !== null && _b !== void 0 ? _b : 0; message.from = (_c = object.from) !== null && _c !== void 0 ? _c : 0; message.fromHits = (_d = object.fromHits) !== null && _d !== void 0 ? _d : 0; return message; } }; function createBaseCCSUsrMsgEndOfMatchAllPlayersData() { return { allplayerdata: [], scene: 0 }; } exports.CCSUsrMsgEndOfMatchAllPlayersData = { encode(message, writer = minimal_1.Writer.create()) { for (const v of message.allplayerdata) { exports.CCSUsrMsgEndOfMatchAllPlayersData_PlayerData.encode(v, writer.uint32(10).fork()).ldelim(); } if (message.scene !== 0) { writer.uint32(16).int32(message.scene); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCCSUsrMsgEndOfMatchAllPlayersData(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.allplayerdata.push(exports.CCSUsrMsgEndOfMatchAllPlayersData_PlayerData.decode(reader, reader.uint32())); break; case 2: message.scene = reader.int32(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b; const message = createBaseCCSUsrMsgEndOfMatchAllPlayersData(); message.allplayerdata = ((_a = object.allplayerdata) === null || _a === void 0 ? void 0 : _a.map(e => exports.CCSUsrMsgEndOfMatchAllPlayersData_PlayerData.fromPartial(e))) || []; message.scene = (_b = object.scene) !== null && _b !== void 0 ? _b : 0; return message; } }; function createBaseCCSUsrMsgEndOfMatchAllPlayersData_Accolade() { return { eaccolade: 0, value: 0, position: 0 }; } exports.CCSUsrMsgEndOfMatchAllPlayersData_Accolade = { encode(message, writer = minimal_1.Writer.create()) { if (message.eaccolade !== 0) { writer.uint32(8).int32(message.eaccolade); } if (message.value !== 0) { writer.uint32(21).float(message.value); } if (message.position !== 0) { writer.uint32(24).int32(message.position); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCCSUsrMsgEndOfMatchAllPlayersData_Accolade(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.eaccolade = reader.int32(); break; case 2: message.value = reader.float(); break; case 3: message.position = reader.int32(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c; const message = createBaseCCSUsrMsgEndOfMatchAllPlayersData_Accolade(); message.eaccolade = (_a = object.eaccolade) !== null && _a !== void 0 ? _a : 0; message.value = (_b = object.value) !== null && _b !== void 0 ? _b : 0; message.position = (_c = object.position) !== null && _c !== void 0 ? _c : 0; return message; } }; function createBaseCCSUsrMsgEndOfMatchAllPlayersData_PlayerData() { return { entindex: 0, xuid: Long.UZERO, name: "", teamnumber: 0, nomination: undefined, items: [], playercolor: 0, isbot: false }; } exports.CCSUsrMsgEndOfMatchAllPlayersData_PlayerData = { encode(message, writer = minimal_1.Writer.create()) { if (message.entindex !== 0) { writer.uint32(8).int32(message.entindex); } if (!message.xuid.isZero()) { writer.uint32(16).uint64(message.xuid); } if (message.name !== "") { writer.uint32(26).string(message.name); } if (message.teamnumber !== 0) { writer.uint32(32).int32(message.teamnumber); } if (message.nomination !== undefined) { exports.CCSUsrMsgEndOfMatchAllPlayersData_Accolade.encode(message.nomination, writer.uint32(42).fork()).ldelim(); } for (const v of message.items) { cstrike15_gcmessages_1.CEconItemPreviewDataBlock.encode(v, writer.uint32(50).fork()).ldelim(); } if (message.playercolor !== 0) { writer.uint32(56).int32(message.playercolor); } if (message.isbot === true) { writer.uint32(64).bool(message.isbot); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCCSUsrMsgEndOfMatchAllPlayersData_PlayerData(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.entindex = reader.int32(); break; case 2: message.xuid = reader.uint64(); break; case 3: message.name = reader.string(); break; case 4: message.teamnumber = reader.int32(); break; case 5: message.nomination = exports.CCSUsrMsgEndOfMatchAllPlayersData_Accolade.decode(reader, reader.uint32()); break; case 6: message.items.push(cstrike15_gcmessages_1.CEconItemPreviewDataBlock.decode(reader, reader.uint32())); break; case 7: message.playercolor = reader.int32(); break; case 8: message.isbot = reader.bool(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c, _d, _e, _f; const message = createBaseCCSUsrMsgEndOfMatchAllPlayersData_PlayerData(); message.entindex = (_a = object.entindex) !== null && _a !== void 0 ? _a : 0; message.xuid = object.xuid !== undefined && object.xuid !== null ? Long.fromValue(object.xuid) : Long.UZERO; message.name = (_b = object.name) !== null && _b !== void 0 ? _b : ""; message.teamnumber = (_c = object.teamnumber) !== null && _c !== void 0 ? _c : 0; message.nomination = object.nomination !== undefined && object.nomination !== null ? exports.CCSUsrMsgEndOfMatchAllPlayersData_Accolade.fromPartial(object.nomination) : undefined; message.items = ((_d = object.items) === null || _d === void 0 ? void 0 : _d.map(e => cstrike15_gcmessages_1.CEconItemPreviewDataBlock.fromPartial(e))) || []; message.playercolor = (_e = object.playercolor) !== null && _e !== void 0 ? _e : 0; message.isbot = (_f = object.isbot) !== null && _f !== void 0 ? _f : false; return message; } }; function createBaseCCSUsrMsgRoundImpactScoreData() { return { initConditions: undefined, allRisEventData: [] }; } exports.CCSUsrMsgRoundImpactScoreData = { encode(message, writer = minimal_1.Writer.create()) { if (message.initConditions !== undefined) { exports.CCSUsrMsgRoundImpactScoreData_InitialConditions.encode(message.initConditions, writer.uint32(10).fork()).ldelim(); } for (const v of message.allRisEventData) { exports.CCSUsrMsgRoundImpactScoreData_RisEvent.encode(v, writer.uint32(18).fork()).ldelim(); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCCSUsrMsgRoundImpactScoreData(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.initConditions = exports.CCSUsrMsgRoundImpactScoreData_InitialConditions.decode(reader, reader.uint32()); break; case 2: message.allRisEventData.push(exports.CCSUsrMsgRoundImpactScoreData_RisEvent.decode(reader, reader.uint32())); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a; const message = createBaseCCSUsrMsgRoundImpactScoreData(); message.initConditions = object.initConditions !== undefined && object.initConditions !== null ? exports.CCSUsrMsgRoundImpactScoreData_InitialConditions.fromPartial(object.initConditions) : undefined; message.allRisEventData = ((_a = object.allRisEventData) === null || _a === void 0 ? void 0 : _a.map(e => exports.CCSUsrMsgRoundImpactScoreData_RisEvent.fromPartial(e))) || []; return message; } }; function createBaseCCSUsrMsgRoundImpactScoreData_RisEvent() { return { timestamp: 0, terroristOdds: 0, ctAlive: 0, tAlive: 0, victimData: undefined, objectiveData: undefined, allDamageData: [] }; } exports.CCSUsrMsgRoundImpactScoreData_RisEvent = { encode(message, writer = minimal_1.Writer.create()) { if (message.timestamp !== 0) { writer.uint32(13).float(message.timestamp); } if (message.terroristOdds !== 0) { writer.uint32(16).int32(message.terroristOdds); } if (message.ctAlive !== 0) { writer.uint32(24).int32(message.ctAlive); } if (message.tAlive !== 0) { writer.uint32(32).int32(message.tAlive); } if (message.victimData !== undefined) { exports.CCSUsrMsgRoundImpactScoreData_RisEvent_Victim.encode(message.victimData, writer.uint32(42).fork()).ldelim(); } if (message.objectiveData !== undefined) { exports.CCSUsrMsgRoundImpactScoreData_RisEvent_Objective.encode(message.objectiveData, writer.uint32(50).fork()).ldelim(); } for (const v of message.allDamageData) { exports.CCSUsrMsgRoundImpactScoreData_RisEvent_Damage.encode(v, writer.uint32(58).fork()).ldelim(); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCCSUsrMsgRoundImpactScoreData_RisEvent(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.timestamp = reader.float(); break; case 2: message.terroristOdds = reader.int32(); break; case 3: message.ctAlive = reader.int32(); break; case 4: message.tAlive = reader.int32(); break; case 5: message.victimData = exports.CCSUsrMsgRoundImpactScoreData_RisEvent_Victim.decode(reader, reader.uint32()); break; case 6: message.objectiveData = exports.CCSUsrMsgRoundImpactScoreData_RisEvent_Objective.decode(reader, reader.uint32()); break; case 7: message.allDamageData.push(exports.CCSUsrMsgRoundImpactScoreData_RisEvent_Damage.decode(reader, reader.uint32())); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c, _d, _e; const message = createBaseCCSUsrMsgRoundImpactScoreData_RisEvent(); message.timestamp = (_a = object.timestamp) !== null && _a !== void 0 ? _a : 0; message.terroristOdds = (_b = object.terroristOdds) !== null && _b !== void 0 ? _b : 0; message.ctAlive = (_c = object.ctAlive) !== null && _c !== void 0 ? _c : 0; message.tAlive = (_d = object.tAlive) !== null && _d !== void 0 ? _d : 0; message.victimData = object.victimData !== undefined && object.victimData !== null ? exports.CCSUsrMsgRoundImpactScoreData_RisEvent_Victim.fromPartial(object.victimData) : undefined; message.objectiveData = object.objectiveData !== undefined && object.objectiveData !== null ? exports.CCSUsrMsgRoundImpactScoreData_RisEvent_Objective.fromPartial(object.objectiveData) : undefined; message.allDamageData = ((_e = object.allDamageData) === null || _e === void 0 ? void 0 : _e.map(e => exports.CCSUsrMsgRoundImpactScoreData_RisEvent_Damage.fromPartial(e))) || []; return message; } }; function createBaseCCSUsrMsgRoundImpactScoreData_RisEvent_Victim() { return { teamNumber: 0, entindex: 0, xuid: Long.UZERO, color: 0, isBot: false, isDead: false }; } exports.CCSUsrMsgRoundImpactScoreData_RisEvent_Victim = { encode(message, writer = minimal_1.Writer.create()) { if (message.teamNumber !== 0) { writer.uint32(8).int32(message.teamNumber); } if (message.entindex !== 0) { writer.uint32(16).int32(message.entindex); } if (!message.xuid.isZero()) { writer.uint32(24).uint64(message.xuid); } if (message.color !== 0) { writer.uint32(32).int32(message.color); } if (message.isBot === true) { writer.uint32(40).bool(message.isBot); } if (message.isDead === true) { writer.uint32(48).bool(message.isDead); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCCSUsrMsgRoundImpactScoreData_RisEvent_Victim(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.teamNumber = reader.int32(); break; case 2: message.entindex = reader.int32(); break; case 3: message.xuid = reader.uint64(); break; case 4: message.color = reader.int32(); break; case 5: message.isBot = reader.bool(); break; case 6: message.isDead = reader.bool(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c, _d, _e; const message = createBaseCCSUsrMsgRoundImpactScoreData_RisEvent_Victim(); message.teamNumber = (_a = object.teamNumber) !== null && _a !== void 0 ? _a : 0; message.entindex = (_b = object.entindex) !== null && _b !== void 0 ? _b : 0; message.xuid = object.xuid !== undefined && object.xuid !== null ? Long.fromValue(object.xuid) : Long.UZERO; message.color = (_c = object.color) !== null && _c !== void 0 ? _c : 0; message.isBot = (_d = object.isBot) !== null && _d !== void 0 ? _d : false; message.isDead = (_e = object.isDead) !== null && _e !== void 0 ? _e : false; return message; } }; function createBaseCCSUsrMsgRoundImpactScoreData_RisEvent_Objective() { return { type: 0 }; } exports.CCSUsrMsgRoundImpactScoreData_RisEvent_Objective = { encode(message, writer = minimal_1.Writer.create()) { if (message.type !== 0) { writer.uint32(8).int32(message.type); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCCSUsrMsgRoundImpactScoreData_RisEvent_Objective(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.type = reader.int32(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a; const message = createBaseCCSUsrMsgRoundImpactScoreData_RisEvent_Objective(); message.type = (_a = object.type) !== null && _a !== void 0 ? _a : 0; return message; } }; function createBaseCCSUsrMsgRoundImpactScoreData_RisEvent_Damage() { return { targetEntindex: 0, targetXuid: Long.UZERO, healthRemoved: 0, numHits: 0, returnHealthRemoved: 0, numReturnHits: 0 }; } exports.CCSUsrMsgRoundImpactScoreData_RisEvent_Damage = { encode(message, writer = minimal_1.Writer.create()) { if (message.targetEntindex !== 0) { writer.uint32(8).int32(message.targetEntindex); } if (!message.targetXuid.isZero()) { writer.uint32(16).uint64(message.targetXuid); } if (message.healthRemoved !== 0) { writer.uint32(24).int32(message.healthRemoved); } if (message.numHits !== 0) { writer.uint32(32).int32(message.numHits); } if (message.returnHealthRemoved !== 0) { writer.uint32(40).int32(message.returnHealthRemoved); } if (message.numReturnHits !== 0) { writer.uint32(48).int32(message.numReturnHits); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCCSUsrMsgRoundImpactScoreData_RisEvent_Damage(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.targetEntindex = reader.int32(); break; case 2: message.targetXuid = reader.uint64(); break; case 3: message.healthRemoved = reader.int32(); break; case 4: message.numHits = reader.int32(); break; case 5: message.returnHealthRemoved = reader.int32(); break; case 6: message.numReturnHits = reader.int32(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c, _d, _e; const message = createBaseCCSUsrMsgRoundImpactScoreData_RisEvent_Damage(); message.targetEntindex = (_a = object.targetEntindex) !== null && _a !== void 0 ? _a : 0; message.targetXuid = object.targetXuid !== undefined && object.targetXuid !== null ? Long.fromValue(object.targetXuid) : Long.UZERO; message.healthRemoved = (_b = object.healthRemoved) !== null && _b !== void 0 ? _b : 0; message.numHits = (_c = object.numHits) !== null && _c !== void 0 ? _c : 0; message.returnHealthRemoved = (_d = object.returnHealthRemoved) !== null && _d !== void 0 ? _d : 0; message.numReturnHits = (_e = object.numReturnHits) !== null && _e !== void 0 ? _e : 0; return message; } }; function createBaseCCSUsrMsgRoundImpactScoreData_InitialConditions() { return { ctEquipValue: 0, tEquipValue: 0, terroristOdds: 0 }; } exports.CCSUsrMsgRoundImpactScoreData_InitialConditions = { encode(message, writer = minimal_1.Writer.create()) { if (message.ctEquipValue !== 0) { writer.uint32(8).int32(message.ctEquipValue); } if (message.tEquipValue !== 0) { writer.uint32(16).int32(message.tEquipValue); } if (message.terroristOdds !== 0) { writer.uint32(24).int32(message.terroristOdds); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCCSUsrMsgRoundImpactScoreData_InitialConditions(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.ctEquipValue = reader.int32(); break; case 2: message.tEquipValue = reader.int32(); break; case 3: message.terroristOdds = reader.int32(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c; const message = createBaseCCSUsrMsgRoundImpactScoreData_InitialConditions(); message.ctEquipValue = (_a = object.ctEquipValue) !== null && _a !== void 0 ? _a : 0; message.tEquipValue = (_b = object.tEquipValue) !== null && _b !== void 0 ? _b : 0; message.terroristOdds = (_c = object.terroristOdds) !== null && _c !== void 0 ? _c : 0; return message; } }; function createBaseCCSUsrMsgCurrentRoundOdds() { return { odds: 0 }; } exports.CCSUsrMsgCurrentRoundOdds = { encode(message, writer = minimal_1.Writer.create()) { if (message.odds !== 0) { writer.uint32(8).int32(message.odds); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCCSUsrMsgCurrentRoundOdds(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.odds = reader.int32(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a; const message = createBaseCCSUsrMsgCurrentRoundOdds(); message.odds = (_a = object.odds) !== null && _a !== void 0 ? _a : 0; return message; } }; function createBaseCCSUsrMsgDeepStats() { return { stats: undefined }; } exports.CCSUsrMsgDeepStats = { encode(message, writer = minimal_1.Writer.create()) { if (message.stats !== undefined) { cstrike15_gcmessages_1.CMsgGCCStrike15ClientDeepStats.encode(message.stats, writer.uint32(10).fork()).ldelim(); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCCSUsrMsgDeepStats(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.stats = cstrike15_gcmessages_1.CMsgGCCStrike15ClientDeepStats.decode(reader, reader.uint32()); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { const message = createBaseCCSUsrMsgDeepStats(); message.stats = object.stats !== undefined && object.stats !== null ? cstrike15_gcmessages_1.CMsgGCCStrike15ClientDeepStats.fromPartial(object.stats) : undefined; return message; } }; function createBaseCCSUsrMsgResetHud() { return { reset: false }; } exports.CCSUsrMsgResetHud = { encode(message, writer = minimal_1.Writer.create()) { if (message.reset === true) { writer.uint32(8).bool(message.reset); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCCSUsrMsgResetHud(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.reset = reader.bool(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a; const message = createBaseCCSUsrMsgResetHud(); message.reset = (_a = object.reset) !== null && _a !== void 0 ? _a : false; return message; } }; function createBaseCCSUsrMsgGameTitle() { return { dummy: 0 }; } exports.CCSUsrMsgGameTitle = { encode(message, writer = minimal_1.Writer.create()) { if (message.dummy !== 0) { writer.uint32(8).int32(message.dummy); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCCSUsrMsgGameTitle(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.dummy = reader.int32(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a; const message = createBaseCCSUsrMsgGameTitle(); message.dummy = (_a = object.dummy) !== null && _a !== void 0 ? _a : 0; return message; } }; function createBaseCCSUsrMsgRequestState() { return { dummy: 0 }; } exports.CCSUsrMsgRequestState = { encode(message, writer = minimal_1.Writer.create()) { if (message.dummy !== 0) { writer.uint32(8).int32(message.dummy); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCCSUsrMsgRequestState(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.dummy = reader.int32(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a; const message = createBaseCCSUsrMsgRequestState(); message.dummy = (_a = object.dummy) !== null && _a !== void 0 ? _a : 0; return message; } }; function createBaseCCSUsrMsgStopSpectatorMode() { return { dummy: 0 }; } exports.CCSUsrMsgStopSpectatorMode = { encode(message, writer = minimal_1.Writer.create()) { if (message.dummy !== 0) { writer.uint32(8).int32(message.dummy); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCCSUsrMsgStopSpectatorMode(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.dummy = reader.int32(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a; const message = createBaseCCSUsrMsgStopSpectatorMode(); message.dummy = (_a = object.dummy) !== null && _a !== void 0 ? _a : 0; return message; } }; function createBaseCCSUsrMsgDisconnectToLobby() { return { dummy: 0 }; } exports.CCSUsrMsgDisconnectToLobby = { encode(message, writer = minimal_1.Writer.create()) { if (message.dummy !== 0) { writer.uint32(8).int32(message.dummy); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCCSUsrMsgDisconnectToLobby(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.dummy = reader.int32(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a; const message = createBaseCCSUsrMsgDisconnectToLobby(); message.dummy = (_a = object.dummy) !== null && _a !== void 0 ? _a : 0; return message; } }; function createBaseCCSUsrMsgWarmupHasEnded() { return { dummy: 0 }; } exports.CCSUsrMsgWarmupHasEnded = { encode(message, writer = minimal_1.Writer.create()) { if (message.dummy !== 0) { writer.uint32(8).int32(message.dummy); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCCSUsrMsgWarmupHasEnded(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.dummy = reader.int32(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a; const message = createBaseCCSUsrMsgWarmupHasEnded(); message.dummy = (_a = object.dummy) !== null && _a !== void 0 ? _a : 0; return message; } }; function createBaseCCSUsrMsgClientInfo() { return { dummy: 0 }; } exports.CCSUsrMsgClientInfo = { encode(message, writer = minimal_1.Writer.create()) { if (message.dummy !== 0) { writer.uint32(8).int32(message.dummy); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCCSUsrMsgClientInfo(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.dummy = reader.int32(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a; const message = createBaseCCSUsrMsgClientInfo(); message.dummy = (_a = object.dummy) !== null && _a !== void 0 ? _a : 0; return message; } }; function createBaseCCSUsrMsgServerRankRevealAll() { return { secondsTillShutdown: 0, reservation: undefined }; } exports.CCSUsrMsgServerRankRevealAll = { encode(message, writer = minimal_1.Writer.create()) { if (message.secondsTillShutdown !== 0) { writer.uint32(8).int32(message.secondsTillShutdown); } if (message.reservation !== undefined) { cstrike15_gcmessages_1.CMsgGCCStrike15V2MatchmakingGC2ServerReserve.encode(message.reservation, writer.uint32(18).fork()).ldelim(); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCCSUsrMsgServerRankRevealAll(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.secondsTillShutdown = reader.int32(); break; case 2: message.reservation = cstrike15_gcmessages_1.CMsgGCCStrike15V2MatchmakingGC2ServerReserve.decode(reader, reader.uint32()); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a; const message = createBaseCCSUsrMsgServerRankRevealAll(); message.secondsTillShutdown = (_a = object.secondsTillShutdown) !== null && _a !== void 0 ? _a : 0; message.reservation = object.reservation !== undefined && object.reservation !== null ? cstrike15_gcmessages_1.CMsgGCCStrike15V2MatchmakingGC2ServerReserve.fromPartial(object.reservation) : undefined; return message; } }; function createBaseCCSUsrMsgUtilMsg() { return { utilAction: "", util1: 0, util2: 0, util3: 0, util4: 0, util5: 0 }; } exports.CCSUsrMsgUtilMsg = { encode(message, writer = minimal_1.Writer.create()) { if (message.utilAction !== "") { writer.uint32(10).string(message.utilAction); } if (message.util1 !== 0) { writer.uint32(16).int32(message.util1); } if (message.util2 !== 0) { writer.uint32(24).int32(message.util2); } if (message.util3 !== 0) { writer.uint32(32).int32(message.util3); } if (message.util4 !== 0) { writer.uint32(40).int32(message.util4); } if (message.util5 !== 0) { writer.uint32(48).int32(message.util5); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCCSUsrMsgUtilMsg(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.utilAction = reader.string(); break; case 2: message.util1 = reader.int32(); break; case 3: message.util2 = reader.int32(); break; case 4: message.util3 = reader.int32(); break; case 5: message.util4 = reader.int32(); break; case 6: message.util5 = reader.int32(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c, _d, _e, _f; const message = createBaseCCSUsrMsgUtilMsg(); message.utilAction = (_a = object.utilAction) !== null && _a !== void 0 ? _a : ""; message.util1 = (_b = object.util1) !== null && _b !== void 0 ? _b : 0; message.util2 = (_c = object.util2) !== null && _c !== void 0 ? _c : 0; message.util3 = (_d = object.util3) !== null && _d !== void 0 ? _d : 0; message.util4 = (_e = object.util4) !== null && _e !== void 0 ? _e : 0; message.util5 = (_f = object.util5) !== null && _f !== void 0 ? _f : 0; return message; } }; // If you get a compile-error about 'Constructor and ... have no overlap', // add '--ts_proto_opt=esModuleInterop=true' as a flag when calling 'protoc'. if (minimal_1.util.Long !== Long) { minimal_1.util.Long = Long; (0, minimal_1.configure)(); } },{"./cstrike15_gcmessages":24,"./netmessages":27,"long":712,"protobufjs/minimal":715}],26:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.CEngineGotvSyncPacket = exports.protobufPackage = void 0; /* eslint-disable */ const minimal_1 = require("protobufjs/minimal"); const Long = require("long"); exports.protobufPackage = ""; function createBaseCEngineGotvSyncPacket() { return { matchId: Long.UZERO, instanceId: 0, signupfragment: 0, currentfragment: 0, tickrate: 0, tick: 0, rtdelay: 0, rcvage: 0, keyframeInterval: 0, cdndelay: 0 }; } exports.CEngineGotvSyncPacket = { encode(message, writer = minimal_1.Writer.create()) { if (!message.matchId.isZero()) { writer.uint32(8).uint64(message.matchId); } if (message.instanceId !== 0) { writer.uint32(16).uint32(message.instanceId); } if (message.signupfragment !== 0) { writer.uint32(24).uint32(message.signupfragment); } if (message.currentfragment !== 0) { writer.uint32(32).uint32(message.currentfragment); } if (message.tickrate !== 0) { writer.uint32(45).float(message.tickrate); } if (message.tick !== 0) { writer.uint32(48).uint32(message.tick); } if (message.rtdelay !== 0) { writer.uint32(69).float(message.rtdelay); } if (message.rcvage !== 0) { writer.uint32(77).float(message.rcvage); } if (message.keyframeInterval !== 0) { writer.uint32(85).float(message.keyframeInterval); } if (message.cdndelay !== 0) { writer.uint32(88).uint32(message.cdndelay); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCEngineGotvSyncPacket(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.matchId = reader.uint64(); break; case 2: message.instanceId = reader.uint32(); break; case 3: message.signupfragment = reader.uint32(); break; case 4: message.currentfragment = reader.uint32(); break; case 5: message.tickrate = reader.float(); break; case 6: message.tick = reader.uint32(); break; case 8: message.rtdelay = reader.float(); break; case 9: message.rcvage = reader.float(); break; case 10: message.keyframeInterval = reader.float(); break; case 11: message.cdndelay = reader.uint32(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c, _d, _e, _f, _g, _h, _j; const message = createBaseCEngineGotvSyncPacket(); message.matchId = object.matchId !== undefined && object.matchId !== null ? Long.fromValue(object.matchId) : Long.UZERO; message.instanceId = (_a = object.instanceId) !== null && _a !== void 0 ? _a : 0; message.signupfragment = (_b = object.signupfragment) !== null && _b !== void 0 ? _b : 0; message.currentfragment = (_c = object.currentfragment) !== null && _c !== void 0 ? _c : 0; message.tickrate = (_d = object.tickrate) !== null && _d !== void 0 ? _d : 0; message.tick = (_e = object.tick) !== null && _e !== void 0 ? _e : 0; message.rtdelay = (_f = object.rtdelay) !== null && _f !== void 0 ? _f : 0; message.rcvage = (_g = object.rcvage) !== null && _g !== void 0 ? _g : 0; message.keyframeInterval = (_h = object.keyframeInterval) !== null && _h !== void 0 ? _h : 0; message.cdndelay = (_j = object.cdndelay) !== null && _j !== void 0 ? _j : 0; return message; } }; // If you get a compile-error about 'Constructor and ... have no overlap', // add '--ts_proto_opt=esModuleInterop=true' as a flag when calling 'protoc'. if (minimal_1.util.Long !== Long) { minimal_1.util.Long = Long; (0, minimal_1.configure)(); } },{"long":712,"protobufjs/minimal":715}],27:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.CSVCMsgGetCvarValue = exports.CSVCMsgSplitScreen = exports.CSVCMsgBSPDecal = exports.CSVCMsgPrefetch = exports.CSVCMsgCrosshairAngle = exports.CSVCMsgFixAngle = exports.CSVCMsgVoiceData = exports.CSVCMsgVoiceInit = exports.CSVCMsgUpdateStringTable = exports.CSVCMsgCreateStringTable = exports.CSVCMsgSetView = exports.CSVCMsgSetPause = exports.CSVCMsgPrint = exports.CSVCMsgSendTable_sendpropT = exports.CSVCMsgSendTable = exports.CSVCMsgClassInfo_classT = exports.CSVCMsgClassInfo = exports.CSVCMsgServerInfo = exports.CCLCMsgCmdKeyValues = exports.CCLCMsgSplitPlayerConnect = exports.CCLCMsgLoadingProgress = exports.CCLCMsgFileCRCCheck = exports.CCLCMsgRespondCvarValue = exports.CCLCMsgListenEvents = exports.CCLCMsgBaselineAck = exports.CCLCMsgVoiceData = exports.CCLCMsgMove = exports.CCLCMsgClientInfo = exports.CNETMsgPlayerAvatarData = exports.CNETMsgSplitScreenUser = exports.CNETMsgFile = exports.CNETMsgDisconnect = exports.CNETMsgNOP = exports.CNETMsgSetConVar = exports.CMsgCVars_CVar = exports.CMsgCVars = exports.CNETMsgSignonState = exports.CNETMsgStringCmd = exports.CNETMsgTick = exports.CMsgRGBA = exports.CMsgQAngle = exports.CMsgVector2D = exports.CMsgVector = exports.ReplayEventTypeT = exports.SVCMessages = exports.ESplitScreenMessageType = exports.VoiceDataFormatT = exports.CLCMessages = exports.NETMessages = exports.protobufPackage = void 0; exports.CSVCMsgBroadcastCommand = exports.CCLCMsgHltvReplay = exports.CSVCMsgHltvReplay = exports.CSVCMsgEncryptedData = exports.CSVCMsgCmdKeyValues = exports.CSVCMsgEntityMsg = exports.CSVCMsgSounds_sounddataT = exports.CSVCMsgSounds = exports.CSVCMsgPacketEntities = exports.CSVCMsgTempEntities = exports.CSVCMsgGameEventList_descriptorT = exports.CSVCMsgGameEventList_keyT = exports.CSVCMsgGameEventList = exports.CSVCMsgGameEvent_keyT = exports.CSVCMsgGameEvent = exports.CSVCMsgPaintmapData = exports.CSVCMsgUserMessage = exports.CSVCMsgMenu = void 0; /* eslint-disable */ const minimal_1 = require("protobufjs/minimal"); const Long = require("long"); exports.protobufPackage = ""; var NETMessages; (function (NETMessages) { NETMessages[NETMessages["net_NOP"] = 0] = "net_NOP"; NETMessages[NETMessages["net_Disconnect"] = 1] = "net_Disconnect"; NETMessages[NETMessages["net_File"] = 2] = "net_File"; NETMessages[NETMessages["net_SplitScreenUser"] = 3] = "net_SplitScreenUser"; NETMessages[NETMessages["net_Tick"] = 4] = "net_Tick"; NETMessages[NETMessages["net_StringCmd"] = 5] = "net_StringCmd"; NETMessages[NETMessages["net_SetConVar"] = 6] = "net_SetConVar"; NETMessages[NETMessages["net_SignonState"] = 7] = "net_SignonState"; NETMessages[NETMessages["net_PlayerAvatarData"] = 100] = "net_PlayerAvatarData"; })(NETMessages = exports.NETMessages || (exports.NETMessages = {})); var CLCMessages; (function (CLCMessages) { CLCMessages[CLCMessages["clc_ClientInfo"] = 8] = "clc_ClientInfo"; CLCMessages[CLCMessages["clc_Move"] = 9] = "clc_Move"; CLCMessages[CLCMessages["clc_VoiceData"] = 10] = "clc_VoiceData"; CLCMessages[CLCMessages["clc_BaselineAck"] = 11] = "clc_BaselineAck"; CLCMessages[CLCMessages["clc_ListenEvents"] = 12] = "clc_ListenEvents"; CLCMessages[CLCMessages["clc_RespondCvarValue"] = 13] = "clc_RespondCvarValue"; CLCMessages[CLCMessages["clc_FileCRCCheck"] = 14] = "clc_FileCRCCheck"; CLCMessages[CLCMessages["clc_LoadingProgress"] = 15] = "clc_LoadingProgress"; CLCMessages[CLCMessages["clc_SplitPlayerConnect"] = 16] = "clc_SplitPlayerConnect"; CLCMessages[CLCMessages["clc_ClientMessage"] = 17] = "clc_ClientMessage"; CLCMessages[CLCMessages["clc_CmdKeyValues"] = 18] = "clc_CmdKeyValues"; CLCMessages[CLCMessages["clc_HltvReplay"] = 20] = "clc_HltvReplay"; })(CLCMessages = exports.CLCMessages || (exports.CLCMessages = {})); var VoiceDataFormatT; (function (VoiceDataFormatT) { VoiceDataFormatT[VoiceDataFormatT["VOICEDATA_FORMAT_STEAM"] = 0] = "VOICEDATA_FORMAT_STEAM"; VoiceDataFormatT[VoiceDataFormatT["VOICEDATA_FORMAT_ENGINE"] = 1] = "VOICEDATA_FORMAT_ENGINE"; })(VoiceDataFormatT = exports.VoiceDataFormatT || (exports.VoiceDataFormatT = {})); var ESplitScreenMessageType; (function (ESplitScreenMessageType) { ESplitScreenMessageType[ESplitScreenMessageType["MSG_SPLITSCREEN_ADDUSER"] = 0] = "MSG_SPLITSCREEN_ADDUSER"; ESplitScreenMessageType[ESplitScreenMessageType["MSG_SPLITSCREEN_REMOVEUSER"] = 1] = "MSG_SPLITSCREEN_REMOVEUSER"; ESplitScreenMessageType[ESplitScreenMessageType["MSG_SPLITSCREEN_TYPE_BITS"] = 1] = "MSG_SPLITSCREEN_TYPE_BITS"; })(ESplitScreenMessageType = exports.ESplitScreenMessageType || (exports.ESplitScreenMessageType = {})); var SVCMessages; (function (SVCMessages) { SVCMessages[SVCMessages["svc_ServerInfo"] = 8] = "svc_ServerInfo"; SVCMessages[SVCMessages["svc_SendTable"] = 9] = "svc_SendTable"; SVCMessages[SVCMessages["svc_ClassInfo"] = 10] = "svc_ClassInfo"; SVCMessages[SVCMessages["svc_SetPause"] = 11] = "svc_SetPause"; SVCMessages[SVCMessages["svc_CreateStringTable"] = 12] = "svc_CreateStringTable"; SVCMessages[SVCMessages["svc_UpdateStringTable"] = 13] = "svc_UpdateStringTable"; SVCMessages[SVCMessages["svc_VoiceInit"] = 14] = "svc_VoiceInit"; SVCMessages[SVCMessages["svc_VoiceData"] = 15] = "svc_VoiceData"; SVCMessages[SVCMessages["svc_Print"] = 16] = "svc_Print"; SVCMessages[SVCMessages["svc_Sounds"] = 17] = "svc_Sounds"; SVCMessages[SVCMessages["svc_SetView"] = 18] = "svc_SetView"; SVCMessages[SVCMessages["svc_FixAngle"] = 19] = "svc_FixAngle"; SVCMessages[SVCMessages["svc_CrosshairAngle"] = 20] = "svc_CrosshairAngle"; SVCMessages[SVCMessages["svc_BSPDecal"] = 21] = "svc_BSPDecal"; SVCMessages[SVCMessages["svc_SplitScreen"] = 22] = "svc_SplitScreen"; SVCMessages[SVCMessages["svc_UserMessage"] = 23] = "svc_UserMessage"; SVCMessages[SVCMessages["svc_EntityMessage"] = 24] = "svc_EntityMessage"; SVCMessages[SVCMessages["svc_GameEvent"] = 25] = "svc_GameEvent"; SVCMessages[SVCMessages["svc_PacketEntities"] = 26] = "svc_PacketEntities"; SVCMessages[SVCMessages["svc_TempEntities"] = 27] = "svc_TempEntities"; SVCMessages[SVCMessages["svc_Prefetch"] = 28] = "svc_Prefetch"; SVCMessages[SVCMessages["svc_Menu"] = 29] = "svc_Menu"; SVCMessages[SVCMessages["svc_GameEventList"] = 30] = "svc_GameEventList"; SVCMessages[SVCMessages["svc_GetCvarValue"] = 31] = "svc_GetCvarValue"; SVCMessages[SVCMessages["svc_PaintmapData"] = 33] = "svc_PaintmapData"; SVCMessages[SVCMessages["svc_CmdKeyValues"] = 34] = "svc_CmdKeyValues"; SVCMessages[SVCMessages["svc_EncryptedData"] = 35] = "svc_EncryptedData"; SVCMessages[SVCMessages["svc_HltvReplay"] = 36] = "svc_HltvReplay"; SVCMessages[SVCMessages["svc_Broadcast_Command"] = 38] = "svc_Broadcast_Command"; })(SVCMessages = exports.SVCMessages || (exports.SVCMessages = {})); var ReplayEventTypeT; (function (ReplayEventTypeT) { ReplayEventTypeT[ReplayEventTypeT["REPLAY_EVENT_CANCEL"] = 0] = "REPLAY_EVENT_CANCEL"; ReplayEventTypeT[ReplayEventTypeT["REPLAY_EVENT_DEATH"] = 1] = "REPLAY_EVENT_DEATH"; ReplayEventTypeT[ReplayEventTypeT["REPLAY_EVENT_GENERIC"] = 2] = "REPLAY_EVENT_GENERIC"; ReplayEventTypeT[ReplayEventTypeT["REPLAY_EVENT_STUCK_NEED_FULL_UPDATE"] = 3] = "REPLAY_EVENT_STUCK_NEED_FULL_UPDATE"; })(ReplayEventTypeT = exports.ReplayEventTypeT || (exports.ReplayEventTypeT = {})); function createBaseCMsgVector() { return { x: 0, y: 0, z: 0 }; } exports.CMsgVector = { encode(message, writer = minimal_1.Writer.create()) { if (message.x !== 0) { writer.uint32(13).float(message.x); } if (message.y !== 0) { writer.uint32(21).float(message.y); } if (message.z !== 0) { writer.uint32(29).float(message.z); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCMsgVector(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.x = reader.float(); break; case 2: message.y = reader.float(); break; case 3: message.z = reader.float(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c; const message = createBaseCMsgVector(); message.x = (_a = object.x) !== null && _a !== void 0 ? _a : 0; message.y = (_b = object.y) !== null && _b !== void 0 ? _b : 0; message.z = (_c = object.z) !== null && _c !== void 0 ? _c : 0; return message; } }; function createBaseCMsgVector2D() { return { x: 0, y: 0 }; } exports.CMsgVector2D = { encode(message, writer = minimal_1.Writer.create()) { if (message.x !== 0) { writer.uint32(13).float(message.x); } if (message.y !== 0) { writer.uint32(21).float(message.y); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCMsgVector2D(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.x = reader.float(); break; case 2: message.y = reader.float(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b; const message = createBaseCMsgVector2D(); message.x = (_a = object.x) !== null && _a !== void 0 ? _a : 0; message.y = (_b = object.y) !== null && _b !== void 0 ? _b : 0; return message; } }; function createBaseCMsgQAngle() { return { x: 0, y: 0, z: 0 }; } exports.CMsgQAngle = { encode(message, writer = minimal_1.Writer.create()) { if (message.x !== 0) { writer.uint32(13).float(message.x); } if (message.y !== 0) { writer.uint32(21).float(message.y); } if (message.z !== 0) { writer.uint32(29).float(message.z); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCMsgQAngle(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.x = reader.float(); break; case 2: message.y = reader.float(); break; case 3: message.z = reader.float(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c; const message = createBaseCMsgQAngle(); message.x = (_a = object.x) !== null && _a !== void 0 ? _a : 0; message.y = (_b = object.y) !== null && _b !== void 0 ? _b : 0; message.z = (_c = object.z) !== null && _c !== void 0 ? _c : 0; return message; } }; function createBaseCMsgRGBA() { return { r: 0, g: 0, b: 0, a: 0 }; } exports.CMsgRGBA = { encode(message, writer = minimal_1.Writer.create()) { if (message.r !== 0) { writer.uint32(8).int32(message.r); } if (message.g !== 0) { writer.uint32(16).int32(message.g); } if (message.b !== 0) { writer.uint32(24).int32(message.b); } if (message.a !== 0) { writer.uint32(32).int32(message.a); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCMsgRGBA(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.r = reader.int32(); break; case 2: message.g = reader.int32(); break; case 3: message.b = reader.int32(); break; case 4: message.a = reader.int32(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c, _d; const message = createBaseCMsgRGBA(); message.r = (_a = object.r) !== null && _a !== void 0 ? _a : 0; message.g = (_b = object.g) !== null && _b !== void 0 ? _b : 0; message.b = (_c = object.b) !== null && _c !== void 0 ? _c : 0; message.a = (_d = object.a) !== null && _d !== void 0 ? _d : 0; return message; } }; function createBaseCNETMsgTick() { return { tick: 0, hostComputationtime: 0, hostComputationtimeStdDeviation: 0, hostFramestarttimeStdDeviation: 0, hltvReplayFlags: 0 }; } exports.CNETMsgTick = { encode(message, writer = minimal_1.Writer.create()) { if (message.tick !== 0) { writer.uint32(8).uint32(message.tick); } if (message.hostComputationtime !== 0) { writer.uint32(32).uint32(message.hostComputationtime); } if (message.hostComputationtimeStdDeviation !== 0) { writer.uint32(40).uint32(message.hostComputationtimeStdDeviation); } if (message.hostFramestarttimeStdDeviation !== 0) { writer.uint32(48).uint32(message.hostFramestarttimeStdDeviation); } if (message.hltvReplayFlags !== 0) { writer.uint32(56).uint32(message.hltvReplayFlags); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCNETMsgTick(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.tick = reader.uint32(); break; case 4: message.hostComputationtime = reader.uint32(); break; case 5: message.hostComputationtimeStdDeviation = reader.uint32(); break; case 6: message.hostFramestarttimeStdDeviation = reader.uint32(); break; case 7: message.hltvReplayFlags = reader.uint32(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c, _d, _e; const message = createBaseCNETMsgTick(); message.tick = (_a = object.tick) !== null && _a !== void 0 ? _a : 0; message.hostComputationtime = (_b = object.hostComputationtime) !== null && _b !== void 0 ? _b : 0; message.hostComputationtimeStdDeviation = (_c = object.hostComputationtimeStdDeviation) !== null && _c !== void 0 ? _c : 0; message.hostFramestarttimeStdDeviation = (_d = object.hostFramestarttimeStdDeviation) !== null && _d !== void 0 ? _d : 0; message.hltvReplayFlags = (_e = object.hltvReplayFlags) !== null && _e !== void 0 ? _e : 0; return message; } }; function createBaseCNETMsgStringCmd() { return { command: "" }; } exports.CNETMsgStringCmd = { encode(message, writer = minimal_1.Writer.create()) { if (message.command !== "") { writer.uint32(10).string(message.command); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCNETMsgStringCmd(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.command = reader.string(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a; const message = createBaseCNETMsgStringCmd(); message.command = (_a = object.command) !== null && _a !== void 0 ? _a : ""; return message; } }; function createBaseCNETMsgSignonState() { return { signonState: 0, spawnCount: 0, numServerPlayers: 0, playersNetworkids: [], mapName: "" }; } exports.CNETMsgSignonState = { encode(message, writer = minimal_1.Writer.create()) { if (message.signonState !== 0) { writer.uint32(8).uint32(message.signonState); } if (message.spawnCount !== 0) { writer.uint32(16).uint32(message.spawnCount); } if (message.numServerPlayers !== 0) { writer.uint32(24).uint32(message.numServerPlayers); } for (const v of message.playersNetworkids) { writer.uint32(34).string(v); } if (message.mapName !== "") { writer.uint32(42).string(message.mapName); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCNETMsgSignonState(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.signonState = reader.uint32(); break; case 2: message.spawnCount = reader.uint32(); break; case 3: message.numServerPlayers = reader.uint32(); break; case 4: message.playersNetworkids.push(reader.string()); break; case 5: message.mapName = reader.string(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c, _d, _e; const message = createBaseCNETMsgSignonState(); message.signonState = (_a = object.signonState) !== null && _a !== void 0 ? _a : 0; message.spawnCount = (_b = object.spawnCount) !== null && _b !== void 0 ? _b : 0; message.numServerPlayers = (_c = object.numServerPlayers) !== null && _c !== void 0 ? _c : 0; message.playersNetworkids = ((_d = object.playersNetworkids) === null || _d === void 0 ? void 0 : _d.map(e => e)) || []; message.mapName = (_e = object.mapName) !== null && _e !== void 0 ? _e : ""; return message; } }; function createBaseCMsgCVars() { return { cvars: [] }; } exports.CMsgCVars = { encode(message, writer = minimal_1.Writer.create()) { for (const v of message.cvars) { exports.CMsgCVars_CVar.encode(v, writer.uint32(10).fork()).ldelim(); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCMsgCVars(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.cvars.push(exports.CMsgCVars_CVar.decode(reader, reader.uint32())); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a; const message = createBaseCMsgCVars(); message.cvars = ((_a = object.cvars) === null || _a === void 0 ? void 0 : _a.map(e => exports.CMsgCVars_CVar.fromPartial(e))) || []; return message; } }; function createBaseCMsgCVars_CVar() { return { name: "", value: "", dictionaryName: 0 }; } exports.CMsgCVars_CVar = { encode(message, writer = minimal_1.Writer.create()) { if (message.name !== "") { writer.uint32(10).string(message.name); } if (message.value !== "") { writer.uint32(18).string(message.value); } if (message.dictionaryName !== 0) { writer.uint32(24).uint32(message.dictionaryName); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCMsgCVars_CVar(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.name = reader.string(); break; case 2: message.value = reader.string(); break; case 3: message.dictionaryName = reader.uint32(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c; const message = createBaseCMsgCVars_CVar(); message.name = (_a = object.name) !== null && _a !== void 0 ? _a : ""; message.value = (_b = object.value) !== null && _b !== void 0 ? _b : ""; message.dictionaryName = (_c = object.dictionaryName) !== null && _c !== void 0 ? _c : 0; return message; } }; function createBaseCNETMsgSetConVar() { return { convars: undefined }; } exports.CNETMsgSetConVar = { encode(message, writer = minimal_1.Writer.create()) { if (message.convars !== undefined) { exports.CMsgCVars.encode(message.convars, writer.uint32(10).fork()).ldelim(); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCNETMsgSetConVar(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.convars = exports.CMsgCVars.decode(reader, reader.uint32()); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { const message = createBaseCNETMsgSetConVar(); message.convars = object.convars !== undefined && object.convars !== null ? exports.CMsgCVars.fromPartial(object.convars) : undefined; return message; } }; function createBaseCNETMsgNOP() { return {}; } exports.CNETMsgNOP = { encode(_, writer = minimal_1.Writer.create()) { return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCNETMsgNOP(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(_) { const message = createBaseCNETMsgNOP(); return message; } }; function createBaseCNETMsgDisconnect() { return { text: "" }; } exports.CNETMsgDisconnect = { encode(message, writer = minimal_1.Writer.create()) { if (message.text !== "") { writer.uint32(10).string(message.text); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCNETMsgDisconnect(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.text = reader.string(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a; const message = createBaseCNETMsgDisconnect(); message.text = (_a = object.text) !== null && _a !== void 0 ? _a : ""; return message; } }; function createBaseCNETMsgFile() { return { transferId: 0, fileName: "", isReplayDemoFile: false, deny: false }; } exports.CNETMsgFile = { encode(message, writer = minimal_1.Writer.create()) { if (message.transferId !== 0) { writer.uint32(8).int32(message.transferId); } if (message.fileName !== "") { writer.uint32(18).string(message.fileName); } if (message.isReplayDemoFile === true) { writer.uint32(24).bool(message.isReplayDemoFile); } if (message.deny === true) { writer.uint32(32).bool(message.deny); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCNETMsgFile(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.transferId = reader.int32(); break; case 2: message.fileName = reader.string(); break; case 3: message.isReplayDemoFile = reader.bool(); break; case 4: message.deny = reader.bool(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c, _d; const message = createBaseCNETMsgFile(); message.transferId = (_a = object.transferId) !== null && _a !== void 0 ? _a : 0; message.fileName = (_b = object.fileName) !== null && _b !== void 0 ? _b : ""; message.isReplayDemoFile = (_c = object.isReplayDemoFile) !== null && _c !== void 0 ? _c : false; message.deny = (_d = object.deny) !== null && _d !== void 0 ? _d : false; return message; } }; function createBaseCNETMsgSplitScreenUser() { return { slot: 0 }; } exports.CNETMsgSplitScreenUser = { encode(message, writer = minimal_1.Writer.create()) { if (message.slot !== 0) { writer.uint32(8).int32(message.slot); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCNETMsgSplitScreenUser(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.slot = reader.int32(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a; const message = createBaseCNETMsgSplitScreenUser(); message.slot = (_a = object.slot) !== null && _a !== void 0 ? _a : 0; return message; } }; function createBaseCNETMsgPlayerAvatarData() { return { accountid: 0, rgb: new Uint8Array() }; } exports.CNETMsgPlayerAvatarData = { encode(message, writer = minimal_1.Writer.create()) { if (message.accountid !== 0) { writer.uint32(8).uint32(message.accountid); } if (message.rgb.length !== 0) { writer.uint32(18).bytes(message.rgb); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCNETMsgPlayerAvatarData(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.accountid = reader.uint32(); break; case 2: message.rgb = reader.bytes(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b; const message = createBaseCNETMsgPlayerAvatarData(); message.accountid = (_a = object.accountid) !== null && _a !== void 0 ? _a : 0; message.rgb = (_b = object.rgb) !== null && _b !== void 0 ? _b : new Uint8Array(); return message; } }; function createBaseCCLCMsgClientInfo() { return { sendTableCrc: 0, serverCount: 0, isHltv: false, isReplay: false, friendsId: 0, friendsName: "", customFiles: [] }; } exports.CCLCMsgClientInfo = { encode(message, writer = minimal_1.Writer.create()) { if (message.sendTableCrc !== 0) { writer.uint32(13).fixed32(message.sendTableCrc); } if (message.serverCount !== 0) { writer.uint32(16).uint32(message.serverCount); } if (message.isHltv === true) { writer.uint32(24).bool(message.isHltv); } if (message.isReplay === true) { writer.uint32(32).bool(message.isReplay); } if (message.friendsId !== 0) { writer.uint32(40).uint32(message.friendsId); } if (message.friendsName !== "") { writer.uint32(50).string(message.friendsName); } writer.uint32(58).fork(); for (const v of message.customFiles) { writer.fixed32(v); } writer.ldelim(); return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCCLCMsgClientInfo(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.sendTableCrc = reader.fixed32(); break; case 2: message.serverCount = reader.uint32(); break; case 3: message.isHltv = reader.bool(); break; case 4: message.isReplay = reader.bool(); break; case 5: message.friendsId = reader.uint32(); break; case 6: message.friendsName = reader.string(); break; case 7: if ((tag & 7) === 2) { const end2 = reader.uint32() + reader.pos; while (reader.pos < end2) { message.customFiles.push(reader.fixed32()); } } else { message.customFiles.push(reader.fixed32()); } break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c, _d, _e, _f, _g; const message = createBaseCCLCMsgClientInfo(); message.sendTableCrc = (_a = object.sendTableCrc) !== null && _a !== void 0 ? _a : 0; message.serverCount = (_b = object.serverCount) !== null && _b !== void 0 ? _b : 0; message.isHltv = (_c = object.isHltv) !== null && _c !== void 0 ? _c : false; message.isReplay = (_d = object.isReplay) !== null && _d !== void 0 ? _d : false; message.friendsId = (_e = object.friendsId) !== null && _e !== void 0 ? _e : 0; message.friendsName = (_f = object.friendsName) !== null && _f !== void 0 ? _f : ""; message.customFiles = ((_g = object.customFiles) === null || _g === void 0 ? void 0 : _g.map(e => e)) || []; return message; } }; function createBaseCCLCMsgMove() { return { numBackupCommands: 0, numNewCommands: 0, data: new Uint8Array() }; } exports.CCLCMsgMove = { encode(message, writer = minimal_1.Writer.create()) { if (message.numBackupCommands !== 0) { writer.uint32(8).uint32(message.numBackupCommands); } if (message.numNewCommands !== 0) { writer.uint32(16).uint32(message.numNewCommands); } if (message.data.length !== 0) { writer.uint32(26).bytes(message.data); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCCLCMsgMove(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.numBackupCommands = reader.uint32(); break; case 2: message.numNewCommands = reader.uint32(); break; case 3: message.data = reader.bytes(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c; const message = createBaseCCLCMsgMove(); message.numBackupCommands = (_a = object.numBackupCommands) !== null && _a !== void 0 ? _a : 0; message.numNewCommands = (_b = object.numNewCommands) !== null && _b !== void 0 ? _b : 0; message.data = (_c = object.data) !== null && _c !== void 0 ? _c : new Uint8Array(); return message; } }; function createBaseCCLCMsgVoiceData() { return { data: new Uint8Array(), xuid: Long.UZERO, format: 0, sequenceBytes: 0, sectionNumber: 0, uncompressedSampleOffset: 0 }; } exports.CCLCMsgVoiceData = { encode(message, writer = minimal_1.Writer.create()) { if (message.data.length !== 0) { writer.uint32(10).bytes(message.data); } if (!message.xuid.isZero()) { writer.uint32(17).fixed64(message.xuid); } if (message.format !== 0) { writer.uint32(24).int32(message.format); } if (message.sequenceBytes !== 0) { writer.uint32(32).int32(message.sequenceBytes); } if (message.sectionNumber !== 0) { writer.uint32(40).uint32(message.sectionNumber); } if (message.uncompressedSampleOffset !== 0) { writer.uint32(48).uint32(message.uncompressedSampleOffset); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCCLCMsgVoiceData(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.data = reader.bytes(); break; case 2: message.xuid = reader.fixed64(); break; case 3: message.format = reader.int32(); break; case 4: message.sequenceBytes = reader.int32(); break; case 5: message.sectionNumber = reader.uint32(); break; case 6: message.uncompressedSampleOffset = reader.uint32(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c, _d, _e; const message = createBaseCCLCMsgVoiceData(); message.data = (_a = object.data) !== null && _a !== void 0 ? _a : new Uint8Array(); message.xuid = object.xuid !== undefined && object.xuid !== null ? Long.fromValue(object.xuid) : Long.UZERO; message.format = (_b = object.format) !== null && _b !== void 0 ? _b : 0; message.sequenceBytes = (_c = object.sequenceBytes) !== null && _c !== void 0 ? _c : 0; message.sectionNumber = (_d = object.sectionNumber) !== null && _d !== void 0 ? _d : 0; message.uncompressedSampleOffset = (_e = object.uncompressedSampleOffset) !== null && _e !== void 0 ? _e : 0; return message; } }; function createBaseCCLCMsgBaselineAck() { return { baselineTick: 0, baselineNr: 0 }; } exports.CCLCMsgBaselineAck = { encode(message, writer = minimal_1.Writer.create()) { if (message.baselineTick !== 0) { writer.uint32(8).int32(message.baselineTick); } if (message.baselineNr !== 0) { writer.uint32(16).int32(message.baselineNr); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCCLCMsgBaselineAck(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.baselineTick = reader.int32(); break; case 2: message.baselineNr = reader.int32(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b; const message = createBaseCCLCMsgBaselineAck(); message.baselineTick = (_a = object.baselineTick) !== null && _a !== void 0 ? _a : 0; message.baselineNr = (_b = object.baselineNr) !== null && _b !== void 0 ? _b : 0; return message; } }; function createBaseCCLCMsgListenEvents() { return { eventMask: [] }; } exports.CCLCMsgListenEvents = { encode(message, writer = minimal_1.Writer.create()) { writer.uint32(10).fork(); for (const v of message.eventMask) { writer.fixed32(v); } writer.ldelim(); return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCCLCMsgListenEvents(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: if ((tag & 7) === 2) { const end2 = reader.uint32() + reader.pos; while (reader.pos < end2) { message.eventMask.push(reader.fixed32()); } } else { message.eventMask.push(reader.fixed32()); } break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a; const message = createBaseCCLCMsgListenEvents(); message.eventMask = ((_a = object.eventMask) === null || _a === void 0 ? void 0 : _a.map(e => e)) || []; return message; } }; function createBaseCCLCMsgRespondCvarValue() { return { cookie: 0, statusCode: 0, name: "", value: "" }; } exports.CCLCMsgRespondCvarValue = { encode(message, writer = minimal_1.Writer.create()) { if (message.cookie !== 0) { writer.uint32(8).int32(message.cookie); } if (message.statusCode !== 0) { writer.uint32(16).int32(message.statusCode); } if (message.name !== "") { writer.uint32(26).string(message.name); } if (message.value !== "") { writer.uint32(34).string(message.value); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCCLCMsgRespondCvarValue(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.cookie = reader.int32(); break; case 2: message.statusCode = reader.int32(); break; case 3: message.name = reader.string(); break; case 4: message.value = reader.string(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c, _d; const message = createBaseCCLCMsgRespondCvarValue(); message.cookie = (_a = object.cookie) !== null && _a !== void 0 ? _a : 0; message.statusCode = (_b = object.statusCode) !== null && _b !== void 0 ? _b : 0; message.name = (_c = object.name) !== null && _c !== void 0 ? _c : ""; message.value = (_d = object.value) !== null && _d !== void 0 ? _d : ""; return message; } }; function createBaseCCLCMsgFileCRCCheck() { return { codePath: 0, path: "", codeFilename: 0, filename: "", fileFraction: 0, md5: new Uint8Array(), crc: 0, fileHashType: 0, fileLen: 0, packFileId: 0, packFileNumber: 0 }; } exports.CCLCMsgFileCRCCheck = { encode(message, writer = minimal_1.Writer.create()) { if (message.codePath !== 0) { writer.uint32(8).int32(message.codePath); } if (message.path !== "") { writer.uint32(18).string(message.path); } if (message.codeFilename !== 0) { writer.uint32(24).int32(message.codeFilename); } if (message.filename !== "") { writer.uint32(34).string(message.filename); } if (message.fileFraction !== 0) { writer.uint32(40).int32(message.fileFraction); } if (message.md5.length !== 0) { writer.uint32(50).bytes(message.md5); } if (message.crc !== 0) { writer.uint32(56).uint32(message.crc); } if (message.fileHashType !== 0) { writer.uint32(64).int32(message.fileHashType); } if (message.fileLen !== 0) { writer.uint32(72).int32(message.fileLen); } if (message.packFileId !== 0) { writer.uint32(80).int32(message.packFileId); } if (message.packFileNumber !== 0) { writer.uint32(88).int32(message.packFileNumber); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCCLCMsgFileCRCCheck(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.codePath = reader.int32(); break; case 2: message.path = reader.string(); break; case 3: message.codeFilename = reader.int32(); break; case 4: message.filename = reader.string(); break; case 5: message.fileFraction = reader.int32(); break; case 6: message.md5 = reader.bytes(); break; case 7: message.crc = reader.uint32(); break; case 8: message.fileHashType = reader.int32(); break; case 9: message.fileLen = reader.int32(); break; case 10: message.packFileId = reader.int32(); break; case 11: message.packFileNumber = reader.int32(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l; const message = createBaseCCLCMsgFileCRCCheck(); message.codePath = (_a = object.codePath) !== null && _a !== void 0 ? _a : 0; message.path = (_b = object.path) !== null && _b !== void 0 ? _b : ""; message.codeFilename = (_c = object.codeFilename) !== null && _c !== void 0 ? _c : 0; message.filename = (_d = object.filename) !== null && _d !== void 0 ? _d : ""; message.fileFraction = (_e = object.fileFraction) !== null && _e !== void 0 ? _e : 0; message.md5 = (_f = object.md5) !== null && _f !== void 0 ? _f : new Uint8Array(); message.crc = (_g = object.crc) !== null && _g !== void 0 ? _g : 0; message.fileHashType = (_h = object.fileHashType) !== null && _h !== void 0 ? _h : 0; message.fileLen = (_j = object.fileLen) !== null && _j !== void 0 ? _j : 0; message.packFileId = (_k = object.packFileId) !== null && _k !== void 0 ? _k : 0; message.packFileNumber = (_l = object.packFileNumber) !== null && _l !== void 0 ? _l : 0; return message; } }; function createBaseCCLCMsgLoadingProgress() { return { progress: 0 }; } exports.CCLCMsgLoadingProgress = { encode(message, writer = minimal_1.Writer.create()) { if (message.progress !== 0) { writer.uint32(8).int32(message.progress); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCCLCMsgLoadingProgress(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.progress = reader.int32(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a; const message = createBaseCCLCMsgLoadingProgress(); message.progress = (_a = object.progress) !== null && _a !== void 0 ? _a : 0; return message; } }; function createBaseCCLCMsgSplitPlayerConnect() { return { convars: undefined }; } exports.CCLCMsgSplitPlayerConnect = { encode(message, writer = minimal_1.Writer.create()) { if (message.convars !== undefined) { exports.CMsgCVars.encode(message.convars, writer.uint32(10).fork()).ldelim(); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCCLCMsgSplitPlayerConnect(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.convars = exports.CMsgCVars.decode(reader, reader.uint32()); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { const message = createBaseCCLCMsgSplitPlayerConnect(); message.convars = object.convars !== undefined && object.convars !== null ? exports.CMsgCVars.fromPartial(object.convars) : undefined; return message; } }; function createBaseCCLCMsgCmdKeyValues() { return { keyvalues: new Uint8Array() }; } exports.CCLCMsgCmdKeyValues = { encode(message, writer = minimal_1.Writer.create()) { if (message.keyvalues.length !== 0) { writer.uint32(10).bytes(message.keyvalues); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCCLCMsgCmdKeyValues(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.keyvalues = reader.bytes(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a; const message = createBaseCCLCMsgCmdKeyValues(); message.keyvalues = (_a = object.keyvalues) !== null && _a !== void 0 ? _a : new Uint8Array(); return message; } }; function createBaseCSVCMsgServerInfo() { return { protocol: 0, serverCount: 0, isDedicated: false, isOfficialValveServer: false, isHltv: false, isReplay: false, isRedirectingToProxyRelay: false, cOs: 0, mapCrc: 0, clientCrc: 0, stringTableCrc: 0, maxClients: 0, maxClasses: 0, playerSlot: 0, tickInterval: 0, gameDir: "", mapName: "", mapGroupName: "", skyName: "", hostName: "", publicIp: 0, ugcMapId: Long.UZERO }; } exports.CSVCMsgServerInfo = { encode(message, writer = minimal_1.Writer.create()) { if (message.protocol !== 0) { writer.uint32(8).int32(message.protocol); } if (message.serverCount !== 0) { writer.uint32(16).int32(message.serverCount); } if (message.isDedicated === true) { writer.uint32(24).bool(message.isDedicated); } if (message.isOfficialValveServer === true) { writer.uint32(32).bool(message.isOfficialValveServer); } if (message.isHltv === true) { writer.uint32(40).bool(message.isHltv); } if (message.isReplay === true) { writer.uint32(48).bool(message.isReplay); } if (message.isRedirectingToProxyRelay === true) { writer.uint32(168).bool(message.isRedirectingToProxyRelay); } if (message.cOs !== 0) { writer.uint32(56).int32(message.cOs); } if (message.mapCrc !== 0) { writer.uint32(69).fixed32(message.mapCrc); } if (message.clientCrc !== 0) { writer.uint32(77).fixed32(message.clientCrc); } if (message.stringTableCrc !== 0) { writer.uint32(85).fixed32(message.stringTableCrc); } if (message.maxClients !== 0) { writer.uint32(88).int32(message.maxClients); } if (message.maxClasses !== 0) { writer.uint32(96).int32(message.maxClasses); } if (message.playerSlot !== 0) { writer.uint32(104).int32(message.playerSlot); } if (message.tickInterval !== 0) { writer.uint32(117).float(message.tickInterval); } if (message.gameDir !== "") { writer.uint32(122).string(message.gameDir); } if (message.mapName !== "") { writer.uint32(130).string(message.mapName); } if (message.mapGroupName !== "") { writer.uint32(138).string(message.mapGroupName); } if (message.skyName !== "") { writer.uint32(146).string(message.skyName); } if (message.hostName !== "") { writer.uint32(154).string(message.hostName); } if (message.publicIp !== 0) { writer.uint32(160).uint32(message.publicIp); } if (!message.ugcMapId.isZero()) { writer.uint32(176).uint64(message.ugcMapId); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCSVCMsgServerInfo(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.protocol = reader.int32(); break; case 2: message.serverCount = reader.int32(); break; case 3: message.isDedicated = reader.bool(); break; case 4: message.isOfficialValveServer = reader.bool(); break; case 5: message.isHltv = reader.bool(); break; case 6: message.isReplay = reader.bool(); break; case 21: message.isRedirectingToProxyRelay = reader.bool(); break; case 7: message.cOs = reader.int32(); break; case 8: message.mapCrc = reader.fixed32(); break; case 9: message.clientCrc = reader.fixed32(); break; case 10: message.stringTableCrc = reader.fixed32(); break; case 11: message.maxClients = reader.int32(); break; case 12: message.maxClasses = reader.int32(); break; case 13: message.playerSlot = reader.int32(); break; case 14: message.tickInterval = reader.float(); break; case 15: message.gameDir = reader.string(); break; case 16: message.mapName = reader.string(); break; case 17: message.mapGroupName = reader.string(); break; case 18: message.skyName = reader.string(); break; case 19: message.hostName = reader.string(); break; case 20: message.publicIp = reader.uint32(); break; case 22: message.ugcMapId = reader.uint64(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w; const message = createBaseCSVCMsgServerInfo(); message.protocol = (_a = object.protocol) !== null && _a !== void 0 ? _a : 0; message.serverCount = (_b = object.serverCount) !== null && _b !== void 0 ? _b : 0; message.isDedicated = (_c = object.isDedicated) !== null && _c !== void 0 ? _c : false; message.isOfficialValveServer = (_d = object.isOfficialValveServer) !== null && _d !== void 0 ? _d : false; message.isHltv = (_e = object.isHltv) !== null && _e !== void 0 ? _e : false; message.isReplay = (_f = object.isReplay) !== null && _f !== void 0 ? _f : false; message.isRedirectingToProxyRelay = (_g = object.isRedirectingToProxyRelay) !== null && _g !== void 0 ? _g : false; message.cOs = (_h = object.cOs) !== null && _h !== void 0 ? _h : 0; message.mapCrc = (_j = object.mapCrc) !== null && _j !== void 0 ? _j : 0; message.clientCrc = (_k = object.clientCrc) !== null && _k !== void 0 ? _k : 0; message.stringTableCrc = (_l = object.stringTableCrc) !== null && _l !== void 0 ? _l : 0; message.maxClients = (_m = object.maxClients) !== null && _m !== void 0 ? _m : 0; message.maxClasses = (_o = object.maxClasses) !== null && _o !== void 0 ? _o : 0; message.playerSlot = (_p = object.playerSlot) !== null && _p !== void 0 ? _p : 0; message.tickInterval = (_q = object.tickInterval) !== null && _q !== void 0 ? _q : 0; message.gameDir = (_r = object.gameDir) !== null && _r !== void 0 ? _r : ""; message.mapName = (_s = object.mapName) !== null && _s !== void 0 ? _s : ""; message.mapGroupName = (_t = object.mapGroupName) !== null && _t !== void 0 ? _t : ""; message.skyName = (_u = object.skyName) !== null && _u !== void 0 ? _u : ""; message.hostName = (_v = object.hostName) !== null && _v !== void 0 ? _v : ""; message.publicIp = (_w = object.publicIp) !== null && _w !== void 0 ? _w : 0; message.ugcMapId = object.ugcMapId !== undefined && object.ugcMapId !== null ? Long.fromValue(object.ugcMapId) : Long.UZERO; return message; } }; function createBaseCSVCMsgClassInfo() { return { createOnClient: false, classes: [] }; } exports.CSVCMsgClassInfo = { encode(message, writer = minimal_1.Writer.create()) { if (message.createOnClient === true) { writer.uint32(8).bool(message.createOnClient); } for (const v of message.classes) { exports.CSVCMsgClassInfo_classT.encode(v, writer.uint32(18).fork()).ldelim(); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCSVCMsgClassInfo(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.createOnClient = reader.bool(); break; case 2: message.classes.push(exports.CSVCMsgClassInfo_classT.decode(reader, reader.uint32())); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b; const message = createBaseCSVCMsgClassInfo(); message.createOnClient = (_a = object.createOnClient) !== null && _a !== void 0 ? _a : false; message.classes = ((_b = object.classes) === null || _b === void 0 ? void 0 : _b.map(e => exports.CSVCMsgClassInfo_classT.fromPartial(e))) || []; return message; } }; function createBaseCSVCMsgClassInfo_classT() { return { classId: 0, dataTableName: "", className: "" }; } exports.CSVCMsgClassInfo_classT = { encode(message, writer = minimal_1.Writer.create()) { if (message.classId !== 0) { writer.uint32(8).int32(message.classId); } if (message.dataTableName !== "") { writer.uint32(18).string(message.dataTableName); } if (message.className !== "") { writer.uint32(26).string(message.className); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCSVCMsgClassInfo_classT(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.classId = reader.int32(); break; case 2: message.dataTableName = reader.string(); break; case 3: message.className = reader.string(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c; const message = createBaseCSVCMsgClassInfo_classT(); message.classId = (_a = object.classId) !== null && _a !== void 0 ? _a : 0; message.dataTableName = (_b = object.dataTableName) !== null && _b !== void 0 ? _b : ""; message.className = (_c = object.className) !== null && _c !== void 0 ? _c : ""; return message; } }; function createBaseCSVCMsgSendTable() { return { isEnd: false, netTableName: "", needsDecoder: false, props: [] }; } exports.CSVCMsgSendTable = { encode(message, writer = minimal_1.Writer.create()) { if (message.isEnd === true) { writer.uint32(8).bool(message.isEnd); } if (message.netTableName !== "") { writer.uint32(18).string(message.netTableName); } if (message.needsDecoder === true) { writer.uint32(24).bool(message.needsDecoder); } for (const v of message.props) { exports.CSVCMsgSendTable_sendpropT.encode(v, writer.uint32(34).fork()).ldelim(); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCSVCMsgSendTable(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.isEnd = reader.bool(); break; case 2: message.netTableName = reader.string(); break; case 3: message.needsDecoder = reader.bool(); break; case 4: message.props.push(exports.CSVCMsgSendTable_sendpropT.decode(reader, reader.uint32())); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c, _d; const message = createBaseCSVCMsgSendTable(); message.isEnd = (_a = object.isEnd) !== null && _a !== void 0 ? _a : false; message.netTableName = (_b = object.netTableName) !== null && _b !== void 0 ? _b : ""; message.needsDecoder = (_c = object.needsDecoder) !== null && _c !== void 0 ? _c : false; message.props = ((_d = object.props) === null || _d === void 0 ? void 0 : _d.map(e => exports.CSVCMsgSendTable_sendpropT.fromPartial(e))) || []; return message; } }; function createBaseCSVCMsgSendTable_sendpropT() { return { type: 0, varName: "", flags: 0, priority: 0, dtName: "", numElements: 0, lowValue: 0, highValue: 0, numBits: 0 }; } exports.CSVCMsgSendTable_sendpropT = { encode(message, writer = minimal_1.Writer.create()) { if (message.type !== 0) { writer.uint32(8).int32(message.type); } if (message.varName !== "") { writer.uint32(18).string(message.varName); } if (message.flags !== 0) { writer.uint32(24).int32(message.flags); } if (message.priority !== 0) { writer.uint32(32).int32(message.priority); } if (message.dtName !== "") { writer.uint32(42).string(message.dtName); } if (message.numElements !== 0) { writer.uint32(48).int32(message.numElements); } if (message.lowValue !== 0) { writer.uint32(61).float(message.lowValue); } if (message.highValue !== 0) { writer.uint32(69).float(message.highValue); } if (message.numBits !== 0) { writer.uint32(72).int32(message.numBits); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCSVCMsgSendTable_sendpropT(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.type = reader.int32(); break; case 2: message.varName = reader.string(); break; case 3: message.flags = reader.int32(); break; case 4: message.priority = reader.int32(); break; case 5: message.dtName = reader.string(); break; case 6: message.numElements = reader.int32(); break; case 7: message.lowValue = reader.float(); break; case 8: message.highValue = reader.float(); break; case 9: message.numBits = reader.int32(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c, _d, _e, _f, _g, _h, _j; const message = createBaseCSVCMsgSendTable_sendpropT(); message.type = (_a = object.type) !== null && _a !== void 0 ? _a : 0; message.varName = (_b = object.varName) !== null && _b !== void 0 ? _b : ""; message.flags = (_c = object.flags) !== null && _c !== void 0 ? _c : 0; message.priority = (_d = object.priority) !== null && _d !== void 0 ? _d : 0; message.dtName = (_e = object.dtName) !== null && _e !== void 0 ? _e : ""; message.numElements = (_f = object.numElements) !== null && _f !== void 0 ? _f : 0; message.lowValue = (_g = object.lowValue) !== null && _g !== void 0 ? _g : 0; message.highValue = (_h = object.highValue) !== null && _h !== void 0 ? _h : 0; message.numBits = (_j = object.numBits) !== null && _j !== void 0 ? _j : 0; return message; } }; function createBaseCSVCMsgPrint() { return { text: "" }; } exports.CSVCMsgPrint = { encode(message, writer = minimal_1.Writer.create()) { if (message.text !== "") { writer.uint32(10).string(message.text); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCSVCMsgPrint(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.text = reader.string(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a; const message = createBaseCSVCMsgPrint(); message.text = (_a = object.text) !== null && _a !== void 0 ? _a : ""; return message; } }; function createBaseCSVCMsgSetPause() { return { paused: false }; } exports.CSVCMsgSetPause = { encode(message, writer = minimal_1.Writer.create()) { if (message.paused === true) { writer.uint32(8).bool(message.paused); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCSVCMsgSetPause(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.paused = reader.bool(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a; const message = createBaseCSVCMsgSetPause(); message.paused = (_a = object.paused) !== null && _a !== void 0 ? _a : false; return message; } }; function createBaseCSVCMsgSetView() { return { entityIndex: 0 }; } exports.CSVCMsgSetView = { encode(message, writer = minimal_1.Writer.create()) { if (message.entityIndex !== 0) { writer.uint32(8).int32(message.entityIndex); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCSVCMsgSetView(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.entityIndex = reader.int32(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a; const message = createBaseCSVCMsgSetView(); message.entityIndex = (_a = object.entityIndex) !== null && _a !== void 0 ? _a : 0; return message; } }; function createBaseCSVCMsgCreateStringTable() { return { name: "", maxEntries: 0, numEntries: 0, userDataFixedSize: false, userDataSize: 0, userDataSizeBits: 0, flags: 0, stringData: new Uint8Array() }; } exports.CSVCMsgCreateStringTable = { encode(message, writer = minimal_1.Writer.create()) { if (message.name !== "") { writer.uint32(10).string(message.name); } if (message.maxEntries !== 0) { writer.uint32(16).int32(message.maxEntries); } if (message.numEntries !== 0) { writer.uint32(24).int32(message.numEntries); } if (message.userDataFixedSize === true) { writer.uint32(32).bool(message.userDataFixedSize); } if (message.userDataSize !== 0) { writer.uint32(40).int32(message.userDataSize); } if (message.userDataSizeBits !== 0) { writer.uint32(48).int32(message.userDataSizeBits); } if (message.flags !== 0) { writer.uint32(56).int32(message.flags); } if (message.stringData.length !== 0) { writer.uint32(66).bytes(message.stringData); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCSVCMsgCreateStringTable(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.name = reader.string(); break; case 2: message.maxEntries = reader.int32(); break; case 3: message.numEntries = reader.int32(); break; case 4: message.userDataFixedSize = reader.bool(); break; case 5: message.userDataSize = reader.int32(); break; case 6: message.userDataSizeBits = reader.int32(); break; case 7: message.flags = reader.int32(); break; case 8: message.stringData = reader.bytes(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c, _d, _e, _f, _g, _h; const message = createBaseCSVCMsgCreateStringTable(); message.name = (_a = object.name) !== null && _a !== void 0 ? _a : ""; message.maxEntries = (_b = object.maxEntries) !== null && _b !== void 0 ? _b : 0; message.numEntries = (_c = object.numEntries) !== null && _c !== void 0 ? _c : 0; message.userDataFixedSize = (_d = object.userDataFixedSize) !== null && _d !== void 0 ? _d : false; message.userDataSize = (_e = object.userDataSize) !== null && _e !== void 0 ? _e : 0; message.userDataSizeBits = (_f = object.userDataSizeBits) !== null && _f !== void 0 ? _f : 0; message.flags = (_g = object.flags) !== null && _g !== void 0 ? _g : 0; message.stringData = (_h = object.stringData) !== null && _h !== void 0 ? _h : new Uint8Array(); return message; } }; function createBaseCSVCMsgUpdateStringTable() { return { tableId: 0, numChangedEntries: 0, stringData: new Uint8Array() }; } exports.CSVCMsgUpdateStringTable = { encode(message, writer = minimal_1.Writer.create()) { if (message.tableId !== 0) { writer.uint32(8).int32(message.tableId); } if (message.numChangedEntries !== 0) { writer.uint32(16).int32(message.numChangedEntries); } if (message.stringData.length !== 0) { writer.uint32(26).bytes(message.stringData); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCSVCMsgUpdateStringTable(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.tableId = reader.int32(); break; case 2: message.numChangedEntries = reader.int32(); break; case 3: message.stringData = reader.bytes(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c; const message = createBaseCSVCMsgUpdateStringTable(); message.tableId = (_a = object.tableId) !== null && _a !== void 0 ? _a : 0; message.numChangedEntries = (_b = object.numChangedEntries) !== null && _b !== void 0 ? _b : 0; message.stringData = (_c = object.stringData) !== null && _c !== void 0 ? _c : new Uint8Array(); return message; } }; function createBaseCSVCMsgVoiceInit() { return { quality: 0, codec: "", version: 0 }; } exports.CSVCMsgVoiceInit = { encode(message, writer = minimal_1.Writer.create()) { if (message.quality !== 0) { writer.uint32(8).int32(message.quality); } if (message.codec !== "") { writer.uint32(18).string(message.codec); } if (message.version !== 0) { writer.uint32(24).int32(message.version); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCSVCMsgVoiceInit(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.quality = reader.int32(); break; case 2: message.codec = reader.string(); break; case 3: message.version = reader.int32(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c; const message = createBaseCSVCMsgVoiceInit(); message.quality = (_a = object.quality) !== null && _a !== void 0 ? _a : 0; message.codec = (_b = object.codec) !== null && _b !== void 0 ? _b : ""; message.version = (_c = object.version) !== null && _c !== void 0 ? _c : 0; return message; } }; function createBaseCSVCMsgVoiceData() { return { client: 0, proximity: false, xuid: Long.UZERO, audibleMask: 0, voiceData: new Uint8Array(), caster: false, format: 0, sequenceBytes: 0, sectionNumber: 0, uncompressedSampleOffset: 0 }; } exports.CSVCMsgVoiceData = { encode(message, writer = minimal_1.Writer.create()) { if (message.client !== 0) { writer.uint32(8).int32(message.client); } if (message.proximity === true) { writer.uint32(16).bool(message.proximity); } if (!message.xuid.isZero()) { writer.uint32(25).fixed64(message.xuid); } if (message.audibleMask !== 0) { writer.uint32(32).int32(message.audibleMask); } if (message.voiceData.length !== 0) { writer.uint32(42).bytes(message.voiceData); } if (message.caster === true) { writer.uint32(48).bool(message.caster); } if (message.format !== 0) { writer.uint32(56).int32(message.format); } if (message.sequenceBytes !== 0) { writer.uint32(64).int32(message.sequenceBytes); } if (message.sectionNumber !== 0) { writer.uint32(72).uint32(message.sectionNumber); } if (message.uncompressedSampleOffset !== 0) { writer.uint32(80).uint32(message.uncompressedSampleOffset); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCSVCMsgVoiceData(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.client = reader.int32(); break; case 2: message.proximity = reader.bool(); break; case 3: message.xuid = reader.fixed64(); break; case 4: message.audibleMask = reader.int32(); break; case 5: message.voiceData = reader.bytes(); break; case 6: message.caster = reader.bool(); break; case 7: message.format = reader.int32(); break; case 8: message.sequenceBytes = reader.int32(); break; case 9: message.sectionNumber = reader.uint32(); break; case 10: message.uncompressedSampleOffset = reader.uint32(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c, _d, _e, _f, _g, _h, _j; const message = createBaseCSVCMsgVoiceData(); message.client = (_a = object.client) !== null && _a !== void 0 ? _a : 0; message.proximity = (_b = object.proximity) !== null && _b !== void 0 ? _b : false; message.xuid = object.xuid !== undefined && object.xuid !== null ? Long.fromValue(object.xuid) : Long.UZERO; message.audibleMask = (_c = object.audibleMask) !== null && _c !== void 0 ? _c : 0; message.voiceData = (_d = object.voiceData) !== null && _d !== void 0 ? _d : new Uint8Array(); message.caster = (_e = object.caster) !== null && _e !== void 0 ? _e : false; message.format = (_f = object.format) !== null && _f !== void 0 ? _f : 0; message.sequenceBytes = (_g = object.sequenceBytes) !== null && _g !== void 0 ? _g : 0; message.sectionNumber = (_h = object.sectionNumber) !== null && _h !== void 0 ? _h : 0; message.uncompressedSampleOffset = (_j = object.uncompressedSampleOffset) !== null && _j !== void 0 ? _j : 0; return message; } }; function createBaseCSVCMsgFixAngle() { return { relative: false, angle: undefined }; } exports.CSVCMsgFixAngle = { encode(message, writer = minimal_1.Writer.create()) { if (message.relative === true) { writer.uint32(8).bool(message.relative); } if (message.angle !== undefined) { exports.CMsgQAngle.encode(message.angle, writer.uint32(18).fork()).ldelim(); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCSVCMsgFixAngle(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.relative = reader.bool(); break; case 2: message.angle = exports.CMsgQAngle.decode(reader, reader.uint32()); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a; const message = createBaseCSVCMsgFixAngle(); message.relative = (_a = object.relative) !== null && _a !== void 0 ? _a : false; message.angle = object.angle !== undefined && object.angle !== null ? exports.CMsgQAngle.fromPartial(object.angle) : undefined; return message; } }; function createBaseCSVCMsgCrosshairAngle() { return { angle: undefined }; } exports.CSVCMsgCrosshairAngle = { encode(message, writer = minimal_1.Writer.create()) { if (message.angle !== undefined) { exports.CMsgQAngle.encode(message.angle, writer.uint32(10).fork()).ldelim(); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCSVCMsgCrosshairAngle(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.angle = exports.CMsgQAngle.decode(reader, reader.uint32()); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { const message = createBaseCSVCMsgCrosshairAngle(); message.angle = object.angle !== undefined && object.angle !== null ? exports.CMsgQAngle.fromPartial(object.angle) : undefined; return message; } }; function createBaseCSVCMsgPrefetch() { return { soundIndex: 0 }; } exports.CSVCMsgPrefetch = { encode(message, writer = minimal_1.Writer.create()) { if (message.soundIndex !== 0) { writer.uint32(8).int32(message.soundIndex); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCSVCMsgPrefetch(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.soundIndex = reader.int32(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a; const message = createBaseCSVCMsgPrefetch(); message.soundIndex = (_a = object.soundIndex) !== null && _a !== void 0 ? _a : 0; return message; } }; function createBaseCSVCMsgBSPDecal() { return { pos: undefined, decalTextureIndex: 0, entityIndex: 0, modelIndex: 0, lowPriority: false }; } exports.CSVCMsgBSPDecal = { encode(message, writer = minimal_1.Writer.create()) { if (message.pos !== undefined) { exports.CMsgVector.encode(message.pos, writer.uint32(10).fork()).ldelim(); } if (message.decalTextureIndex !== 0) { writer.uint32(16).int32(message.decalTextureIndex); } if (message.entityIndex !== 0) { writer.uint32(24).int32(message.entityIndex); } if (message.modelIndex !== 0) { writer.uint32(32).int32(message.modelIndex); } if (message.lowPriority === true) { writer.uint32(40).bool(message.lowPriority); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCSVCMsgBSPDecal(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.pos = exports.CMsgVector.decode(reader, reader.uint32()); break; case 2: message.decalTextureIndex = reader.int32(); break; case 3: message.entityIndex = reader.int32(); break; case 4: message.modelIndex = reader.int32(); break; case 5: message.lowPriority = reader.bool(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c, _d; const message = createBaseCSVCMsgBSPDecal(); message.pos = object.pos !== undefined && object.pos !== null ? exports.CMsgVector.fromPartial(object.pos) : undefined; message.decalTextureIndex = (_a = object.decalTextureIndex) !== null && _a !== void 0 ? _a : 0; message.entityIndex = (_b = object.entityIndex) !== null && _b !== void 0 ? _b : 0; message.modelIndex = (_c = object.modelIndex) !== null && _c !== void 0 ? _c : 0; message.lowPriority = (_d = object.lowPriority) !== null && _d !== void 0 ? _d : false; return message; } }; function createBaseCSVCMsgSplitScreen() { return { type: 0, slot: 0, playerIndex: 0 }; } exports.CSVCMsgSplitScreen = { encode(message, writer = minimal_1.Writer.create()) { if (message.type !== 0) { writer.uint32(8).int32(message.type); } if (message.slot !== 0) { writer.uint32(16).int32(message.slot); } if (message.playerIndex !== 0) { writer.uint32(24).int32(message.playerIndex); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCSVCMsgSplitScreen(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.type = reader.int32(); break; case 2: message.slot = reader.int32(); break; case 3: message.playerIndex = reader.int32(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c; const message = createBaseCSVCMsgSplitScreen(); message.type = (_a = object.type) !== null && _a !== void 0 ? _a : 0; message.slot = (_b = object.slot) !== null && _b !== void 0 ? _b : 0; message.playerIndex = (_c = object.playerIndex) !== null && _c !== void 0 ? _c : 0; return message; } }; function createBaseCSVCMsgGetCvarValue() { return { cookie: 0, cvarName: "" }; } exports.CSVCMsgGetCvarValue = { encode(message, writer = minimal_1.Writer.create()) { if (message.cookie !== 0) { writer.uint32(8).int32(message.cookie); } if (message.cvarName !== "") { writer.uint32(18).string(message.cvarName); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCSVCMsgGetCvarValue(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.cookie = reader.int32(); break; case 2: message.cvarName = reader.string(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b; const message = createBaseCSVCMsgGetCvarValue(); message.cookie = (_a = object.cookie) !== null && _a !== void 0 ? _a : 0; message.cvarName = (_b = object.cvarName) !== null && _b !== void 0 ? _b : ""; return message; } }; function createBaseCSVCMsgMenu() { return { dialogType: 0, menuKeyValues: new Uint8Array() }; } exports.CSVCMsgMenu = { encode(message, writer = minimal_1.Writer.create()) { if (message.dialogType !== 0) { writer.uint32(8).int32(message.dialogType); } if (message.menuKeyValues.length !== 0) { writer.uint32(18).bytes(message.menuKeyValues); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCSVCMsgMenu(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.dialogType = reader.int32(); break; case 2: message.menuKeyValues = reader.bytes(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b; const message = createBaseCSVCMsgMenu(); message.dialogType = (_a = object.dialogType) !== null && _a !== void 0 ? _a : 0; message.menuKeyValues = (_b = object.menuKeyValues) !== null && _b !== void 0 ? _b : new Uint8Array(); return message; } }; function createBaseCSVCMsgUserMessage() { return { msgType: 0, msgData: new Uint8Array(), passthrough: 0 }; } exports.CSVCMsgUserMessage = { encode(message, writer = minimal_1.Writer.create()) { if (message.msgType !== 0) { writer.uint32(8).int32(message.msgType); } if (message.msgData.length !== 0) { writer.uint32(18).bytes(message.msgData); } if (message.passthrough !== 0) { writer.uint32(24).int32(message.passthrough); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCSVCMsgUserMessage(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.msgType = reader.int32(); break; case 2: message.msgData = reader.bytes(); break; case 3: message.passthrough = reader.int32(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c; const message = createBaseCSVCMsgUserMessage(); message.msgType = (_a = object.msgType) !== null && _a !== void 0 ? _a : 0; message.msgData = (_b = object.msgData) !== null && _b !== void 0 ? _b : new Uint8Array(); message.passthrough = (_c = object.passthrough) !== null && _c !== void 0 ? _c : 0; return message; } }; function createBaseCSVCMsgPaintmapData() { return { paintmap: new Uint8Array() }; } exports.CSVCMsgPaintmapData = { encode(message, writer = minimal_1.Writer.create()) { if (message.paintmap.length !== 0) { writer.uint32(10).bytes(message.paintmap); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCSVCMsgPaintmapData(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.paintmap = reader.bytes(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a; const message = createBaseCSVCMsgPaintmapData(); message.paintmap = (_a = object.paintmap) !== null && _a !== void 0 ? _a : new Uint8Array(); return message; } }; function createBaseCSVCMsgGameEvent() { return { eventName: "", eventid: 0, keys: [], passthrough: 0 }; } exports.CSVCMsgGameEvent = { encode(message, writer = minimal_1.Writer.create()) { if (message.eventName !== "") { writer.uint32(10).string(message.eventName); } if (message.eventid !== 0) { writer.uint32(16).int32(message.eventid); } for (const v of message.keys) { exports.CSVCMsgGameEvent_keyT.encode(v, writer.uint32(26).fork()).ldelim(); } if (message.passthrough !== 0) { writer.uint32(32).int32(message.passthrough); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCSVCMsgGameEvent(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.eventName = reader.string(); break; case 2: message.eventid = reader.int32(); break; case 3: message.keys.push(exports.CSVCMsgGameEvent_keyT.decode(reader, reader.uint32())); break; case 4: message.passthrough = reader.int32(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c, _d; const message = createBaseCSVCMsgGameEvent(); message.eventName = (_a = object.eventName) !== null && _a !== void 0 ? _a : ""; message.eventid = (_b = object.eventid) !== null && _b !== void 0 ? _b : 0; message.keys = ((_c = object.keys) === null || _c === void 0 ? void 0 : _c.map(e => exports.CSVCMsgGameEvent_keyT.fromPartial(e))) || []; message.passthrough = (_d = object.passthrough) !== null && _d !== void 0 ? _d : 0; return message; } }; function createBaseCSVCMsgGameEvent_keyT() { return { type: 0, valString: "", valFloat: 0, valLong: 0, valShort: 0, valByte: 0, valBool: false, valUint64: Long.UZERO, valWstring: new Uint8Array() }; } exports.CSVCMsgGameEvent_keyT = { encode(message, writer = minimal_1.Writer.create()) { if (message.type !== 0) { writer.uint32(8).int32(message.type); } if (message.valString !== "") { writer.uint32(18).string(message.valString); } if (message.valFloat !== 0) { writer.uint32(29).float(message.valFloat); } if (message.valLong !== 0) { writer.uint32(32).int32(message.valLong); } if (message.valShort !== 0) { writer.uint32(40).int32(message.valShort); } if (message.valByte !== 0) { writer.uint32(48).int32(message.valByte); } if (message.valBool === true) { writer.uint32(56).bool(message.valBool); } if (!message.valUint64.isZero()) { writer.uint32(64).uint64(message.valUint64); } if (message.valWstring.length !== 0) { writer.uint32(74).bytes(message.valWstring); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCSVCMsgGameEvent_keyT(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.type = reader.int32(); break; case 2: message.valString = reader.string(); break; case 3: message.valFloat = reader.float(); break; case 4: message.valLong = reader.int32(); break; case 5: message.valShort = reader.int32(); break; case 6: message.valByte = reader.int32(); break; case 7: message.valBool = reader.bool(); break; case 8: message.valUint64 = reader.uint64(); break; case 9: message.valWstring = reader.bytes(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c, _d, _e, _f, _g, _h; const message = createBaseCSVCMsgGameEvent_keyT(); message.type = (_a = object.type) !== null && _a !== void 0 ? _a : 0; message.valString = (_b = object.valString) !== null && _b !== void 0 ? _b : ""; message.valFloat = (_c = object.valFloat) !== null && _c !== void 0 ? _c : 0; message.valLong = (_d = object.valLong) !== null && _d !== void 0 ? _d : 0; message.valShort = (_e = object.valShort) !== null && _e !== void 0 ? _e : 0; message.valByte = (_f = object.valByte) !== null && _f !== void 0 ? _f : 0; message.valBool = (_g = object.valBool) !== null && _g !== void 0 ? _g : false; message.valUint64 = object.valUint64 !== undefined && object.valUint64 !== null ? Long.fromValue(object.valUint64) : Long.UZERO; message.valWstring = (_h = object.valWstring) !== null && _h !== void 0 ? _h : new Uint8Array(); return message; } }; function createBaseCSVCMsgGameEventList() { return { descriptors: [] }; } exports.CSVCMsgGameEventList = { encode(message, writer = minimal_1.Writer.create()) { for (const v of message.descriptors) { exports.CSVCMsgGameEventList_descriptorT.encode(v, writer.uint32(10).fork()).ldelim(); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCSVCMsgGameEventList(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.descriptors.push(exports.CSVCMsgGameEventList_descriptorT.decode(reader, reader.uint32())); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a; const message = createBaseCSVCMsgGameEventList(); message.descriptors = ((_a = object.descriptors) === null || _a === void 0 ? void 0 : _a.map(e => exports.CSVCMsgGameEventList_descriptorT.fromPartial(e))) || []; return message; } }; function createBaseCSVCMsgGameEventList_keyT() { return { type: 0, name: "" }; } exports.CSVCMsgGameEventList_keyT = { encode(message, writer = minimal_1.Writer.create()) { if (message.type !== 0) { writer.uint32(8).int32(message.type); } if (message.name !== "") { writer.uint32(18).string(message.name); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCSVCMsgGameEventList_keyT(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.type = reader.int32(); break; case 2: message.name = reader.string(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b; const message = createBaseCSVCMsgGameEventList_keyT(); message.type = (_a = object.type) !== null && _a !== void 0 ? _a : 0; message.name = (_b = object.name) !== null && _b !== void 0 ? _b : ""; return message; } }; function createBaseCSVCMsgGameEventList_descriptorT() { return { eventid: 0, name: "", keys: [] }; } exports.CSVCMsgGameEventList_descriptorT = { encode(message, writer = minimal_1.Writer.create()) { if (message.eventid !== 0) { writer.uint32(8).int32(message.eventid); } if (message.name !== "") { writer.uint32(18).string(message.name); } for (const v of message.keys) { exports.CSVCMsgGameEventList_keyT.encode(v, writer.uint32(26).fork()).ldelim(); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCSVCMsgGameEventList_descriptorT(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.eventid = reader.int32(); break; case 2: message.name = reader.string(); break; case 3: message.keys.push(exports.CSVCMsgGameEventList_keyT.decode(reader, reader.uint32())); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c; const message = createBaseCSVCMsgGameEventList_descriptorT(); message.eventid = (_a = object.eventid) !== null && _a !== void 0 ? _a : 0; message.name = (_b = object.name) !== null && _b !== void 0 ? _b : ""; message.keys = ((_c = object.keys) === null || _c === void 0 ? void 0 : _c.map(e => exports.CSVCMsgGameEventList_keyT.fromPartial(e))) || []; return message; } }; function createBaseCSVCMsgTempEntities() { return { reliable: false, numEntries: 0, entityData: new Uint8Array() }; } exports.CSVCMsgTempEntities = { encode(message, writer = minimal_1.Writer.create()) { if (message.reliable === true) { writer.uint32(8).bool(message.reliable); } if (message.numEntries !== 0) { writer.uint32(16).int32(message.numEntries); } if (message.entityData.length !== 0) { writer.uint32(26).bytes(message.entityData); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCSVCMsgTempEntities(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.reliable = reader.bool(); break; case 2: message.numEntries = reader.int32(); break; case 3: message.entityData = reader.bytes(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c; const message = createBaseCSVCMsgTempEntities(); message.reliable = (_a = object.reliable) !== null && _a !== void 0 ? _a : false; message.numEntries = (_b = object.numEntries) !== null && _b !== void 0 ? _b : 0; message.entityData = (_c = object.entityData) !== null && _c !== void 0 ? _c : new Uint8Array(); return message; } }; function createBaseCSVCMsgPacketEntities() { return { maxEntries: 0, updatedEntries: 0, isDelta: false, updateBaseline: false, baseline: 0, deltaFrom: 0, entityData: new Uint8Array() }; } exports.CSVCMsgPacketEntities = { encode(message, writer = minimal_1.Writer.create()) { if (message.maxEntries !== 0) { writer.uint32(8).int32(message.maxEntries); } if (message.updatedEntries !== 0) { writer.uint32(16).int32(message.updatedEntries); } if (message.isDelta === true) { writer.uint32(24).bool(message.isDelta); } if (message.updateBaseline === true) { writer.uint32(32).bool(message.updateBaseline); } if (message.baseline !== 0) { writer.uint32(40).int32(message.baseline); } if (message.deltaFrom !== 0) { writer.uint32(48).int32(message.deltaFrom); } if (message.entityData.length !== 0) { writer.uint32(58).bytes(message.entityData); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCSVCMsgPacketEntities(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.maxEntries = reader.int32(); break; case 2: message.updatedEntries = reader.int32(); break; case 3: message.isDelta = reader.bool(); break; case 4: message.updateBaseline = reader.bool(); break; case 5: message.baseline = reader.int32(); break; case 6: message.deltaFrom = reader.int32(); break; case 7: message.entityData = reader.bytes(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c, _d, _e, _f, _g; const message = createBaseCSVCMsgPacketEntities(); message.maxEntries = (_a = object.maxEntries) !== null && _a !== void 0 ? _a : 0; message.updatedEntries = (_b = object.updatedEntries) !== null && _b !== void 0 ? _b : 0; message.isDelta = (_c = object.isDelta) !== null && _c !== void 0 ? _c : false; message.updateBaseline = (_d = object.updateBaseline) !== null && _d !== void 0 ? _d : false; message.baseline = (_e = object.baseline) !== null && _e !== void 0 ? _e : 0; message.deltaFrom = (_f = object.deltaFrom) !== null && _f !== void 0 ? _f : 0; message.entityData = (_g = object.entityData) !== null && _g !== void 0 ? _g : new Uint8Array(); return message; } }; function createBaseCSVCMsgSounds() { return { reliableSound: false, sounds: [] }; } exports.CSVCMsgSounds = { encode(message, writer = minimal_1.Writer.create()) { if (message.reliableSound === true) { writer.uint32(8).bool(message.reliableSound); } for (const v of message.sounds) { exports.CSVCMsgSounds_sounddataT.encode(v, writer.uint32(18).fork()).ldelim(); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCSVCMsgSounds(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.reliableSound = reader.bool(); break; case 2: message.sounds.push(exports.CSVCMsgSounds_sounddataT.decode(reader, reader.uint32())); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b; const message = createBaseCSVCMsgSounds(); message.reliableSound = (_a = object.reliableSound) !== null && _a !== void 0 ? _a : false; message.sounds = ((_b = object.sounds) === null || _b === void 0 ? void 0 : _b.map(e => exports.CSVCMsgSounds_sounddataT.fromPartial(e))) || []; return message; } }; function createBaseCSVCMsgSounds_sounddataT() { return { originX: 0, originY: 0, originZ: 0, volume: 0, delayValue: 0, sequenceNumber: 0, entityIndex: 0, channel: 0, pitch: 0, flags: 0, soundNum: 0, soundNumHandle: 0, speakerEntity: 0, randomSeed: 0, soundLevel: 0, isSentence: false, isAmbient: false }; } exports.CSVCMsgSounds_sounddataT = { encode(message, writer = minimal_1.Writer.create()) { if (message.originX !== 0) { writer.uint32(8).sint32(message.originX); } if (message.originY !== 0) { writer.uint32(16).sint32(message.originY); } if (message.originZ !== 0) { writer.uint32(24).sint32(message.originZ); } if (message.volume !== 0) { writer.uint32(32).uint32(message.volume); } if (message.delayValue !== 0) { writer.uint32(45).float(message.delayValue); } if (message.sequenceNumber !== 0) { writer.uint32(48).int32(message.sequenceNumber); } if (message.entityIndex !== 0) { writer.uint32(56).int32(message.entityIndex); } if (message.channel !== 0) { writer.uint32(64).int32(message.channel); } if (message.pitch !== 0) { writer.uint32(72).int32(message.pitch); } if (message.flags !== 0) { writer.uint32(80).int32(message.flags); } if (message.soundNum !== 0) { writer.uint32(88).uint32(message.soundNum); } if (message.soundNumHandle !== 0) { writer.uint32(101).fixed32(message.soundNumHandle); } if (message.speakerEntity !== 0) { writer.uint32(104).int32(message.speakerEntity); } if (message.randomSeed !== 0) { writer.uint32(112).int32(message.randomSeed); } if (message.soundLevel !== 0) { writer.uint32(120).int32(message.soundLevel); } if (message.isSentence === true) { writer.uint32(128).bool(message.isSentence); } if (message.isAmbient === true) { writer.uint32(136).bool(message.isAmbient); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCSVCMsgSounds_sounddataT(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.originX = reader.sint32(); break; case 2: message.originY = reader.sint32(); break; case 3: message.originZ = reader.sint32(); break; case 4: message.volume = reader.uint32(); break; case 5: message.delayValue = reader.float(); break; case 6: message.sequenceNumber = reader.int32(); break; case 7: message.entityIndex = reader.int32(); break; case 8: message.channel = reader.int32(); break; case 9: message.pitch = reader.int32(); break; case 10: message.flags = reader.int32(); break; case 11: message.soundNum = reader.uint32(); break; case 12: message.soundNumHandle = reader.fixed32(); break; case 13: message.speakerEntity = reader.int32(); break; case 14: message.randomSeed = reader.int32(); break; case 15: message.soundLevel = reader.int32(); break; case 16: message.isSentence = reader.bool(); break; case 17: message.isAmbient = reader.bool(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s; const message = createBaseCSVCMsgSounds_sounddataT(); message.originX = (_a = object.originX) !== null && _a !== void 0 ? _a : 0; message.originY = (_b = object.originY) !== null && _b !== void 0 ? _b : 0; message.originZ = (_c = object.originZ) !== null && _c !== void 0 ? _c : 0; message.volume = (_d = object.volume) !== null && _d !== void 0 ? _d : 0; message.delayValue = (_e = object.delayValue) !== null && _e !== void 0 ? _e : 0; message.sequenceNumber = (_f = object.sequenceNumber) !== null && _f !== void 0 ? _f : 0; message.entityIndex = (_g = object.entityIndex) !== null && _g !== void 0 ? _g : 0; message.channel = (_h = object.channel) !== null && _h !== void 0 ? _h : 0; message.pitch = (_j = object.pitch) !== null && _j !== void 0 ? _j : 0; message.flags = (_k = object.flags) !== null && _k !== void 0 ? _k : 0; message.soundNum = (_l = object.soundNum) !== null && _l !== void 0 ? _l : 0; message.soundNumHandle = (_m = object.soundNumHandle) !== null && _m !== void 0 ? _m : 0; message.speakerEntity = (_o = object.speakerEntity) !== null && _o !== void 0 ? _o : 0; message.randomSeed = (_p = object.randomSeed) !== null && _p !== void 0 ? _p : 0; message.soundLevel = (_q = object.soundLevel) !== null && _q !== void 0 ? _q : 0; message.isSentence = (_r = object.isSentence) !== null && _r !== void 0 ? _r : false; message.isAmbient = (_s = object.isAmbient) !== null && _s !== void 0 ? _s : false; return message; } }; function createBaseCSVCMsgEntityMsg() { return { entIndex: 0, classId: 0, entData: new Uint8Array() }; } exports.CSVCMsgEntityMsg = { encode(message, writer = minimal_1.Writer.create()) { if (message.entIndex !== 0) { writer.uint32(8).int32(message.entIndex); } if (message.classId !== 0) { writer.uint32(16).int32(message.classId); } if (message.entData.length !== 0) { writer.uint32(26).bytes(message.entData); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCSVCMsgEntityMsg(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.entIndex = reader.int32(); break; case 2: message.classId = reader.int32(); break; case 3: message.entData = reader.bytes(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c; const message = createBaseCSVCMsgEntityMsg(); message.entIndex = (_a = object.entIndex) !== null && _a !== void 0 ? _a : 0; message.classId = (_b = object.classId) !== null && _b !== void 0 ? _b : 0; message.entData = (_c = object.entData) !== null && _c !== void 0 ? _c : new Uint8Array(); return message; } }; function createBaseCSVCMsgCmdKeyValues() { return { keyvalues: new Uint8Array() }; } exports.CSVCMsgCmdKeyValues = { encode(message, writer = minimal_1.Writer.create()) { if (message.keyvalues.length !== 0) { writer.uint32(10).bytes(message.keyvalues); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCSVCMsgCmdKeyValues(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.keyvalues = reader.bytes(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a; const message = createBaseCSVCMsgCmdKeyValues(); message.keyvalues = (_a = object.keyvalues) !== null && _a !== void 0 ? _a : new Uint8Array(); return message; } }; function createBaseCSVCMsgEncryptedData() { return { encrypted: new Uint8Array(), keyType: 0 }; } exports.CSVCMsgEncryptedData = { encode(message, writer = minimal_1.Writer.create()) { if (message.encrypted.length !== 0) { writer.uint32(10).bytes(message.encrypted); } if (message.keyType !== 0) { writer.uint32(16).int32(message.keyType); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCSVCMsgEncryptedData(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.encrypted = reader.bytes(); break; case 2: message.keyType = reader.int32(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b; const message = createBaseCSVCMsgEncryptedData(); message.encrypted = (_a = object.encrypted) !== null && _a !== void 0 ? _a : new Uint8Array(); message.keyType = (_b = object.keyType) !== null && _b !== void 0 ? _b : 0; return message; } }; function createBaseCSVCMsgHltvReplay() { return { delay: 0, primaryTarget: 0, replayStopAt: 0, replayStartAt: 0, replaySlowdownBegin: 0, replaySlowdownEnd: 0, replaySlowdownRate: 0 }; } exports.CSVCMsgHltvReplay = { encode(message, writer = minimal_1.Writer.create()) { if (message.delay !== 0) { writer.uint32(8).int32(message.delay); } if (message.primaryTarget !== 0) { writer.uint32(16).int32(message.primaryTarget); } if (message.replayStopAt !== 0) { writer.uint32(24).int32(message.replayStopAt); } if (message.replayStartAt !== 0) { writer.uint32(32).int32(message.replayStartAt); } if (message.replaySlowdownBegin !== 0) { writer.uint32(40).int32(message.replaySlowdownBegin); } if (message.replaySlowdownEnd !== 0) { writer.uint32(48).int32(message.replaySlowdownEnd); } if (message.replaySlowdownRate !== 0) { writer.uint32(61).float(message.replaySlowdownRate); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCSVCMsgHltvReplay(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.delay = reader.int32(); break; case 2: message.primaryTarget = reader.int32(); break; case 3: message.replayStopAt = reader.int32(); break; case 4: message.replayStartAt = reader.int32(); break; case 5: message.replaySlowdownBegin = reader.int32(); break; case 6: message.replaySlowdownEnd = reader.int32(); break; case 7: message.replaySlowdownRate = reader.float(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c, _d, _e, _f, _g; const message = createBaseCSVCMsgHltvReplay(); message.delay = (_a = object.delay) !== null && _a !== void 0 ? _a : 0; message.primaryTarget = (_b = object.primaryTarget) !== null && _b !== void 0 ? _b : 0; message.replayStopAt = (_c = object.replayStopAt) !== null && _c !== void 0 ? _c : 0; message.replayStartAt = (_d = object.replayStartAt) !== null && _d !== void 0 ? _d : 0; message.replaySlowdownBegin = (_e = object.replaySlowdownBegin) !== null && _e !== void 0 ? _e : 0; message.replaySlowdownEnd = (_f = object.replaySlowdownEnd) !== null && _f !== void 0 ? _f : 0; message.replaySlowdownRate = (_g = object.replaySlowdownRate) !== null && _g !== void 0 ? _g : 0; return message; } }; function createBaseCCLCMsgHltvReplay() { return { request: 0, slowdownLength: 0, slowdownRate: 0, primaryTargetEntIndex: 0, eventTime: 0 }; } exports.CCLCMsgHltvReplay = { encode(message, writer = minimal_1.Writer.create()) { if (message.request !== 0) { writer.uint32(8).int32(message.request); } if (message.slowdownLength !== 0) { writer.uint32(21).float(message.slowdownLength); } if (message.slowdownRate !== 0) { writer.uint32(29).float(message.slowdownRate); } if (message.primaryTargetEntIndex !== 0) { writer.uint32(32).int32(message.primaryTargetEntIndex); } if (message.eventTime !== 0) { writer.uint32(45).float(message.eventTime); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCCLCMsgHltvReplay(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.request = reader.int32(); break; case 2: message.slowdownLength = reader.float(); break; case 3: message.slowdownRate = reader.float(); break; case 4: message.primaryTargetEntIndex = reader.int32(); break; case 5: message.eventTime = reader.float(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a, _b, _c, _d, _e; const message = createBaseCCLCMsgHltvReplay(); message.request = (_a = object.request) !== null && _a !== void 0 ? _a : 0; message.slowdownLength = (_b = object.slowdownLength) !== null && _b !== void 0 ? _b : 0; message.slowdownRate = (_c = object.slowdownRate) !== null && _c !== void 0 ? _c : 0; message.primaryTargetEntIndex = (_d = object.primaryTargetEntIndex) !== null && _d !== void 0 ? _d : 0; message.eventTime = (_e = object.eventTime) !== null && _e !== void 0 ? _e : 0; return message; } }; function createBaseCSVCMsgBroadcastCommand() { return { cmd: "" }; } exports.CSVCMsgBroadcastCommand = { encode(message, writer = minimal_1.Writer.create()) { if (message.cmd !== "") { writer.uint32(10).string(message.cmd); } return writer; }, decode(input, length) { const reader = input instanceof minimal_1.Reader ? input : new minimal_1.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCSVCMsgBroadcastCommand(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: message.cmd = reader.string(); break; default: reader.skipType(tag & 7); break; } } return message; }, fromPartial(object) { var _a; const message = createBaseCSVCMsgBroadcastCommand(); message.cmd = (_a = object.cmd) !== null && _a !== void 0 ? _a : ""; return message; } }; // If you get a compile-error about 'Constructor and ... have no overlap', // add '--ts_proto_opt=esModuleInterop=true' as a flag when calling 'protoc'. if (minimal_1.util.Long !== Long) { minimal_1.util.Long = Long; (0, minimal_1.configure)(); } },{"long":712,"protobufjs/minimal":715}],28:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.decodeShareCode = void 0; const bigInt = require("big-integer"); const DICTIONARY = "ABCDEFGHJKLMNOPQRSTUVWXYZabcdefhijkmnopqrstuvwxyz23456789"; function decodeShareCode(shareCode) { if (!/^CSGO(-[\w]{5}){5}$/.exec(shareCode)) throw new Error(`invalid share code: ${shareCode}`); const code = shareCode.substring(5).replace(/-/g, ""); let big = bigInt.zero; for (let i = code.length - 1; i >= 0; --i) { big = big.multiply(DICTIONARY.length).plus(DICTIONARY.indexOf(code[i])); } const array = big.toArray(256).value; if (array.length === 18) { array.unshift(0); } return array; } exports.decodeShareCode = decodeShareCode; },{"big-integer":78}],29:[function(require,module,exports){ (function (Buffer){(function (){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.StringTables = void 0; const assert = require("assert"); const ByteBuffer = require("bytebuffer"); const events_1 = require("events"); const Long = require("long"); const assert_exists_1 = require("./assert-exists"); const consts = require("./consts"); const consts_1 = require("./consts"); const bitbuffer_1 = require("./ext/bitbuffer"); function parseUserInfoData(buf) { const bytebuf = ByteBuffer.wrap(buf, ByteBuffer.BIG_ENDIAN); bytebuf.skip(8); const hi = bytebuf.readUint32(); const lo = bytebuf.readUint32(); const xuid = Long.fromBits(lo, hi); const name = bytebuf .readString(consts_1.MAX_PLAYER_NAME_LENGTH, ByteBuffer.METRICS_BYTES) .split("\0", 2)[0]; const userId = bytebuf.readUint32(); const guid = bytebuf .readString(consts_1.SIGNED_GUID_LEN + 1, ByteBuffer.METRICS_BYTES) .split("\0", 2)[0]; bytebuf.skip(3); const friendsId = bytebuf.readUint32(); const friendsName = bytebuf .readString(consts_1.MAX_PLAYER_NAME_LENGTH, ByteBuffer.METRICS_BYTES) .split("\0", 2)[0]; const fakePlayer = bytebuf.readByte() !== 0; bytebuf.skip(3); const isHltv = bytebuf.readByte() !== 0; bytebuf.skip(3); return { xuid, name, userId, guid, friendsId, friendsName, fakePlayer, isHltv }; } /** * Handles string tables for a demo file. */ class StringTables extends events_1.EventEmitter { constructor() { super(); this.tables = []; /** * User data handlers. Transform raw buffer into any other value. * By default, `userinfo` user data is transformed to {@link PlayerInfo} * objects. */ this.userDataCallbacks = { userinfo: parseUserInfoData }; } listen(messageEvents) { messageEvents.on("svc_UpdateStringTable", this._handleUpdateStringTable.bind(this)); messageEvents.on("svc_CreateStringTable", this._handleCreateStringTable.bind(this)); } findTableByName(name) { return this.tables.find(table => table.name === name); } handleStringTables(bitbuf) { const numTables = bitbuf.readUInt8(); for (let i = 0; i < numTables; ++i) { const tableName = bitbuf.readCString(); this._handleStringTable(tableName, bitbuf); } } _handleStringTable(name, bitbuf) { var _a; const userDataCallback = this.userDataCallbacks[name]; const table = (0, assert_exists_1.default)(this.findTableByName(name)); const numEntries = bitbuf.readUInt16(); for (let entryIndex = 0; entryIndex < numEntries; ++entryIndex) { const entry = bitbuf.readCString(); let userData = null; // has user data? if (bitbuf.readOneBit()) { const userDataSize = bitbuf.readUInt16(); const userDataBuf = bitbuf.readBytes(userDataSize); userData = userDataCallback === undefined ? userDataBuf : userDataCallback(userDataBuf); } const oldUserData = (_a = table.entries[entryIndex]) === null || _a === void 0 ? void 0 : _a.userData; table.entries[entryIndex] = { entry, userData }; this.emit("update", { table, entryIndex, entry, userData, oldUserData }); } // parse client-side entries if (bitbuf.readOneBit()) { const numStrings = bitbuf.readUInt16(); for (let i = 0; i < numStrings; ++i) { // eslint-disable-next-line @typescript-eslint/no-unused-vars const entry = bitbuf.readCString(); let userData = null; if (bitbuf.readOneBit()) { const userDataSize = bitbuf.readUInt16(); const userDataBuf = bitbuf.readBytes(userDataSize); // eslint-disable-next-line @typescript-eslint/no-unused-vars userData = userDataCallback === undefined ? userDataBuf : userDataCallback(userDataBuf); } // TODO: do something with client-side entries } } // table is ready this.emit("postcreate", table); } _parseStringTableUpdate(bitbuf, table, entries) { const history = []; const entryBits = Math.ceil(Math.log2(table.maxEntries)); const userDataCallback = this.userDataCallbacks[table.name]; assert(!bitbuf.readOneBit(), "dictionary encoding unsupported"); let entryIndex = -1; for (let i = 0; i < entries; ++i) { entryIndex += 1; if (!bitbuf.readOneBit()) { entryIndex = bitbuf.readUBits(entryBits); } assert(entryIndex >= 0 && entryIndex < table.maxEntries, "bogus string index"); const existingEntry = table.entries[entryIndex]; let entry = null; // has the entry changed? if (bitbuf.readOneBit()) { // substring check if (bitbuf.readOneBit()) { const index = bitbuf.readUBits(5); const bytesToCopy = bitbuf.readUBits(consts.SUBSTRING_BITS); const last = history[index]; if (last == null) { throw new Error("string table entry is delta from non existent entry"); } const subStr = last.slice(0, bytesToCopy); const suffix = bitbuf.readCString(); entry = subStr + suffix; } else { entry = bitbuf.readCString(); } } else { // If the string itself hasn't changed, this entry must already exist entry = (0, assert_exists_1.default)(existingEntry).entry; } // read in the user data let userData = null; if (bitbuf.readOneBit()) { // don't read the length, it's fixed length and the length was networked down already if (table.userDataFixedSize) { const userDataArray = [bitbuf.readUBits(table.userDataSizeBits)]; userData = Buffer.from(userDataArray); } else { const bytes = bitbuf.readUBits(consts.MAX_USERDATA_BITS); userData = bitbuf.readBytes(bytes); } if (userDataCallback !== undefined) { userData = userDataCallback(userData); } } else { userData = existingEntry === null || existingEntry === void 0 ? void 0 : existingEntry.userData; } const oldUserData = existingEntry === null || existingEntry === void 0 ? void 0 : existingEntry.userData; table.entries[entryIndex] = { entry, userData }; // add to history if (history.length > 31) { history.shift(); } history.push(entry); this.emit("update", { table, entryIndex, entry, userData, oldUserData }); } } _handleCreateStringTable(msg) { const bitbuf = bitbuffer_1.BitStream.from(msg.stringData); // table shouldn't already exist assert(this.findTableByName(msg.name) === undefined, "table already exists"); assert(msg.userDataSize === Math.ceil(msg.userDataSizeBits / 8), "invalid user data byte size"); assert(msg.userDataSizeBits <= 32, "userdata value too large"); // create an empty table const table = { name: msg.name, entries: [], userDataSizeBits: msg.userDataSizeBits, userDataFixedSize: msg.userDataFixedSize, maxEntries: msg.maxEntries }; this.emit("create", table); this._parseStringTableUpdate(bitbuf, table, msg.numEntries); this.tables.push(table); } _handleUpdateStringTable(msg) { const bitbuf = bitbuffer_1.BitStream.from(msg.stringData); const table = (0, assert_exists_1.default)(this.tables[msg.tableId], "bad table index"); this._parseStringTableUpdate(bitbuf, table, msg.numChangedEntries); } } exports.StringTables = StringTables; }).call(this)}).call(this,require("buffer").Buffer) },{"./assert-exists":2,"./consts":3,"./ext/bitbuffer":18,"assert":73,"buffer":81,"bytebuffer":83,"events":84,"long":712}],30:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const assert = require("assert"); const projectile_1 = require("../entities/projectile"); const supplement = { emits: ["grenadeTrajectory"], setup: function grenadeTrajectory(demo) { const trajectories = new Map(); function onEntityCreate(event) { // We only care about grenade projectiles if (!(event.entity instanceof projectile_1.Projectile)) return; assert(!trajectories.has(event.entity.index)); trajectories.set(event.entity.index, [event.entity.position]); } function onEntityRemove(event) { // If a projectile was thrown just before round end, // it would be deleted before detonating. trajectories.delete(event.index); } function onEntityChange(event) { const index = event.entity.index; if (!trajectories.has(index)) return; const projectile = event.entity; for (const change of event.changes) { if (change.varName !== "m_nBounces") continue; const oldValue = (change.oldValue || 0); const newValue = change.newValue; if (newValue > oldValue) { trajectories.get(index).push(projectile.position); } } } function onGrenadeDetonateEvent(event) { const projectile = event.entity; // todo: when could this be null? const trajectory = trajectories.get(event.entityid); trajectory.push(projectile.position); demo.emit("grenadeTrajectory", { projectile, thrower: event.player, trajectory }); } function onMolotovDetonate({ projectile, thrower }) { // todo: when could this be null? const trajectory = trajectories.get(projectile.index); trajectory.push(projectile.position); demo.emit("grenadeTrajectory", { projectile, thrower, trajectory }); } demo.on("molotovDetonate", onMolotovDetonate); demo.entities.on("create", onEntityCreate); demo.entities.on("change", onEntityChange); demo.entities.on("remove", onEntityRemove); demo.gameEvents.on("decoy_detonate", onGrenadeDetonateEvent); demo.gameEvents.on("flashbang_detonate", onGrenadeDetonateEvent); demo.gameEvents.on("hegrenade_detonate", onGrenadeDetonateEvent); demo.gameEvents.on("smokegrenade_detonate", onGrenadeDetonateEvent); return () => { demo.off("molotovDetonate", onMolotovDetonate); demo.entities.off("create", onEntityCreate); demo.entities.off("change", onEntityChange); demo.entities.off("remove", onEntityRemove); demo.gameEvents.off("decoy_detonate", onGrenadeDetonateEvent); demo.gameEvents.off("flashbang_detonate", onGrenadeDetonateEvent); demo.gameEvents.off("hegrenade_detonate", onGrenadeDetonateEvent); demo.gameEvents.off("smokegrenade_detonate", onGrenadeDetonateEvent); }; } }; exports.default = supplement; },{"../entities/projectile":13,"assert":73}],31:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const player_1 = require("../entities/player"); const itemdefs_1 = require("../entities/itemdefs"); const equipmentIdMap = { "50": "Kevlar", "51": "Assault Suit", "55": "Defuser" }; const supplement = { emits: ["itemPurchase"], setup: function purchase(demo) { let pendingPurchases = []; // Wait until tick end to find the entity. // m_iWeaponPurchasesThisRound is always updated before the weapon entity is created. function onTickEnd() { for (const pending of pendingPurchases) { // Some items won't have an entity representation, e.g. kevlar. let weapon = pending.player.weapons.find(w => w.itemIndex === pending.weaponId); // todo: why does molotov need remapping to incendiary? if (!weapon && pending.weaponId === 46) { weapon = pending.player.weapons.find(w => w.itemIndex === 48); } demo.emit("itemPurchase", { ...pending, weapon }); } pendingPurchases = []; } function onEntityChange(e) { var _a; if (!(e.entity instanceof player_1.Player)) return; // PERF: add ability to listen on specific tables for (const change of e.changes) { if (change.tableName !== "m_iWeaponPurchasesThisRound") continue; const weaponId = parseInt(change.varName, 10); const oldValue = (change.oldValue || 0); const newValue = change.newValue; const count = newValue - oldValue; if (count > 0) { pendingPurchases.push({ player: e.entity, weaponId, itemName: ((_a = itemdefs_1.itemDefinitionIndexMap[weaponId]) === null || _a === void 0 ? void 0 : _a.itemName) || equipmentIdMap[weaponId] || "Unknown", count, weapon: undefined }); } } } demo.on("tickend", onTickEnd); demo.entities.on("change", onEntityChange); return () => { demo.off("tickend", onTickEnd); demo.entities.off("change", onEntityChange); }; } }; exports.default = supplement; },{"../entities/itemdefs":10,"../entities/player":12}],32:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const consts_1 = require("../consts"); const molotovLoop = 1051353634; // murmurhash.v2("molotov.loop", 1146049601) const supplement = { emits: ["molotovDetonate"], setup: function molotovDetonate(demo) { if (demo.currentTick >= 0) { throw new Error("molotovDetonate event listeners must be added before parsing starts."); } // Find the index of the fire loop sound. // This is emitted when the grenade is thrown, and then stopped when it detonates. let fireLoopSoundIndex = -1; function onStringTableUpdate(e) { if (e.table.name === "soundprecache") { if (e.entry === "weapons/molotov/fire_loop_1.wav") { fireLoopSoundIndex = e.entryIndex; } } } // Cache the molotov projectile class. // Note that this entity is shared between molotov and incendiary grenades. let molotovProjectileClass = -1; function onDataTablesReady() { molotovProjectileClass = demo.entities.serverClasses.findIndex(sc => sc.name === "CMolotovProjectile"); } function onSound(e) { if (fireLoopSoundIndex < 0 || molotovProjectileClass < 0) return; for (const sound of e.sounds) { // We only care about the fire loop sound if (sound.soundNumHandle === 0) { if (sound.soundNum !== fireLoopSoundIndex) continue; } else { // todo: never actually see this if (sound.soundNumHandle !== molotovLoop) continue; } // The loop sound starts when the grenade is thrown, // and is stopped on detonation. if ((sound.flags & consts_1.SND_STOP) === 0) continue; const projectile = demo.entities.entities.get(sound.entityIndex); if (!projectile) continue; // This sound is also stopped on the resulting inferno // (i.e. the flames produced by a detonated fire grenade). if (projectile.classId === molotovProjectileClass) { const thrower = projectile.owner; demo.emit("molotovDetonate", { thrower, projectile }); } } } demo.stringTables.on("update", onStringTableUpdate); demo.entities.on("datatablesready", onDataTablesReady); demo.on("svc_Sounds", onSound); return () => { demo.stringTables.off("update", onStringTableUpdate); demo.entities.off("datatablesready", onDataTablesReady); demo.off("svc_Sounds", onSound); }; } }; exports.default = supplement; },{"../consts":3}],33:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.UserMessages = void 0; const assert = require("assert"); const events_1 = require("events"); const usermessagetypes_1 = require("./usermessagetypes"); /** * Handles user messages for a demo file. */ class UserMessages extends events_1.EventEmitter { listen(demo) { demo.on("svc_UserMessage", this._handleUserMessage.bind(this)); } _handleUserMessage(msg) { const um = usermessagetypes_1.userMessages[msg.msgType]; if (!um) { return; } if (this.listenerCount(um.name) || this.listenerCount("message")) { const msgInst = um.class.decode(msg.msgData); assert(msgInst, "unable to decode user message"); this.emit(um.name, msgInst); this.emit("message", { name: um.name, msg: msgInst }); } } } exports.UserMessages = UserMessages; },{"./usermessagetypes":34,"assert":73,"events":84}],34:[function(require,module,exports){ "use strict"; // DO NOT MODIFY! // Auto-generated by ./generators/usermessagetypes.ts Object.defineProperty(exports, "__esModule", { value: true }); exports.userMessages = void 0; const um = require("./protobufs/cstrike15_usermessages"); exports.userMessages = []; exports.userMessages[um.ECstrike15UserMessages.CS_UM_VGUIMenu] = { name: "VGUIMenu", class: um.CCSUsrMsgVGUIMenu }; exports.userMessages[um.ECstrike15UserMessages.CS_UM_Geiger] = { name: "Geiger", class: um.CCSUsrMsgGeiger }; exports.userMessages[um.ECstrike15UserMessages.CS_UM_Train] = { name: "Train", class: um.CCSUsrMsgTrain }; exports.userMessages[um.ECstrike15UserMessages.CS_UM_HudText] = { name: "HudText", class: um.CCSUsrMsgHudText }; exports.userMessages[um.ECstrike15UserMessages.CS_UM_SayText] = { name: "SayText", class: um.CCSUsrMsgSayText }; exports.userMessages[um.ECstrike15UserMessages.CS_UM_SayText2] = { name: "SayText2", class: um.CCSUsrMsgSayText2 }; exports.userMessages[um.ECstrike15UserMessages.CS_UM_TextMsg] = { name: "TextMsg", class: um.CCSUsrMsgTextMsg }; exports.userMessages[um.ECstrike15UserMessages.CS_UM_HudMsg] = { name: "HudMsg", class: um.CCSUsrMsgHudMsg }; exports.userMessages[um.ECstrike15UserMessages.CS_UM_ResetHud] = { name: "ResetHud", class: um.CCSUsrMsgResetHud }; exports.userMessages[um.ECstrike15UserMessages.CS_UM_GameTitle] = { name: "GameTitle", class: um.CCSUsrMsgGameTitle }; exports.userMessages[um.ECstrike15UserMessages.CS_UM_Shake] = { name: "Shake", class: um.CCSUsrMsgShake }; exports.userMessages[um.ECstrike15UserMessages.CS_UM_Fade] = { name: "Fade", class: um.CCSUsrMsgFade }; exports.userMessages[um.ECstrike15UserMessages.CS_UM_Rumble] = { name: "Rumble", class: um.CCSUsrMsgRumble }; exports.userMessages[um.ECstrike15UserMessages.CS_UM_CloseCaption] = { name: "CloseCaption", class: um.CCSUsrMsgCloseCaption }; exports.userMessages[um.ECstrike15UserMessages.CS_UM_CloseCaptionDirect] = { name: "CloseCaptionDirect", class: um.CCSUsrMsgCloseCaptionDirect }; exports.userMessages[um.ECstrike15UserMessages.CS_UM_SendAudio] = { name: "SendAudio", class: um.CCSUsrMsgSendAudio }; exports.userMessages[um.ECstrike15UserMessages.CS_UM_RawAudio] = { name: "RawAudio", class: um.CCSUsrMsgRawAudio }; exports.userMessages[um.ECstrike15UserMessages.CS_UM_VoiceMask] = { name: "VoiceMask", class: um.CCSUsrMsgVoiceMask }; exports.userMessages[um.ECstrike15UserMessages.CS_UM_RequestState] = { name: "RequestState", class: um.CCSUsrMsgRequestState }; exports.userMessages[um.ECstrike15UserMessages.CS_UM_Damage] = { name: "Damage", class: um.CCSUsrMsgDamage }; exports.userMessages[um.ECstrike15UserMessages.CS_UM_RadioText] = { name: "RadioText", class: um.CCSUsrMsgRadioText }; exports.userMessages[um.ECstrike15UserMessages.CS_UM_HintText] = { name: "HintText", class: um.CCSUsrMsgHintText }; exports.userMessages[um.ECstrike15UserMessages.CS_UM_KeyHintText] = { name: "KeyHintText", class: um.CCSUsrMsgKeyHintText }; exports.userMessages[um.ECstrike15UserMessages.CS_UM_ProcessSpottedEntityUpdate] = { name: "ProcessSpottedEntityUpdate", class: um.CCSUsrMsgProcessSpottedEntityUpdate }; exports.userMessages[um.ECstrike15UserMessages.CS_UM_ReloadEffect] = { name: "ReloadEffect", class: um.CCSUsrMsgReloadEffect }; exports.userMessages[um.ECstrike15UserMessages.CS_UM_AdjustMoney] = { name: "AdjustMoney", class: um.CCSUsrMsgAdjustMoney }; exports.userMessages[um.ECstrike15UserMessages.CS_UM_StopSpectatorMode] = { name: "StopSpectatorMode", class: um.CCSUsrMsgStopSpectatorMode }; exports.userMessages[um.ECstrike15UserMessages.CS_UM_KillCam] = { name: "KillCam", class: um.CCSUsrMsgKillCam }; exports.userMessages[um.ECstrike15UserMessages.CS_UM_DesiredTimescale] = { name: "DesiredTimescale", class: um.CCSUsrMsgDesiredTimescale }; exports.userMessages[um.ECstrike15UserMessages.CS_UM_CurrentTimescale] = { name: "CurrentTimescale", class: um.CCSUsrMsgCurrentTimescale }; exports.userMessages[um.ECstrike15UserMessages.CS_UM_AchievementEvent] = { name: "AchievementEvent", class: um.CCSUsrMsgAchievementEvent }; exports.userMessages[um.ECstrike15UserMessages.CS_UM_MatchEndConditions] = { name: "MatchEndConditions", class: um.CCSUsrMsgMatchEndConditions }; exports.userMessages[um.ECstrike15UserMessages.CS_UM_DisconnectToLobby] = { name: "DisconnectToLobby", class: um.CCSUsrMsgDisconnectToLobby }; exports.userMessages[um.ECstrike15UserMessages.CS_UM_PlayerStatsUpdate] = { name: "PlayerStatsUpdate", class: um.CCSUsrMsgPlayerStatsUpdate }; exports.userMessages[um.ECstrike15UserMessages.CS_UM_DisplayInventory] = { name: "DisplayInventory", class: um.CCSUsrMsgDisplayInventory }; exports.userMessages[um.ECstrike15UserMessages.CS_UM_WarmupHasEnded] = { name: "WarmupHasEnded", class: um.CCSUsrMsgWarmupHasEnded }; exports.userMessages[um.ECstrike15UserMessages.CS_UM_ClientInfo] = { name: "ClientInfo", class: um.CCSUsrMsgClientInfo }; exports.userMessages[um.ECstrike15UserMessages.CS_UM_XRankGet] = { name: "XRankGet", class: um.CCSUsrMsgXRankGet }; exports.userMessages[um.ECstrike15UserMessages.CS_UM_XRankUpd] = { name: "XRankUpd", class: um.CCSUsrMsgXRankUpd }; exports.userMessages[um.ECstrike15UserMessages.CS_UM_CallVoteFailed] = { name: "CallVoteFailed", class: um.CCSUsrMsgCallVoteFailed }; exports.userMessages[um.ECstrike15UserMessages.CS_UM_VoteStart] = { name: "VoteStart", class: um.CCSUsrMsgVoteStart }; exports.userMessages[um.ECstrike15UserMessages.CS_UM_VotePass] = { name: "VotePass", class: um.CCSUsrMsgVotePass }; exports.userMessages[um.ECstrike15UserMessages.CS_UM_VoteFailed] = { name: "VoteFailed", class: um.CCSUsrMsgVoteFailed }; exports.userMessages[um.ECstrike15UserMessages.CS_UM_VoteSetup] = { name: "VoteSetup", class: um.CCSUsrMsgVoteSetup }; exports.userMessages[um.ECstrike15UserMessages.CS_UM_ServerRankRevealAll] = { name: "ServerRankRevealAll", class: um.CCSUsrMsgServerRankRevealAll }; exports.userMessages[um.ECstrike15UserMessages.CS_UM_SendLastKillerDamageToClient] = { name: "SendLastKillerDamageToClient", class: um.CCSUsrMsgSendLastKillerDamageToClient }; exports.userMessages[um.ECstrike15UserMessages.CS_UM_ServerRankUpdate] = { name: "ServerRankUpdate", class: um.CCSUsrMsgServerRankUpdate }; exports.userMessages[um.ECstrike15UserMessages.CS_UM_ItemPickup] = { name: "ItemPickup", class: um.CCSUsrMsgItemPickup }; exports.userMessages[um.ECstrike15UserMessages.CS_UM_ShowMenu] = { name: "ShowMenu", class: um.CCSUsrMsgShowMenu }; exports.userMessages[um.ECstrike15UserMessages.CS_UM_BarTime] = { name: "BarTime", class: um.CCSUsrMsgBarTime }; exports.userMessages[um.ECstrike15UserMessages.CS_UM_AmmoDenied] = { name: "AmmoDenied", class: um.CCSUsrMsgAmmoDenied }; exports.userMessages[um.ECstrike15UserMessages.CS_UM_MarkAchievement] = { name: "MarkAchievement", class: um.CCSUsrMsgMarkAchievement }; exports.userMessages[um.ECstrike15UserMessages.CS_UM_MatchStatsUpdate] = { name: "MatchStatsUpdate", class: um.CCSUsrMsgMatchStatsUpdate }; exports.userMessages[um.ECstrike15UserMessages.CS_UM_ItemDrop] = { name: "ItemDrop", class: um.CCSUsrMsgItemDrop }; exports.userMessages[um.ECstrike15UserMessages.CS_UM_GlowPropTurnOff] = { name: "GlowPropTurnOff", class: um.CCSUsrMsgGlowPropTurnOff }; exports.userMessages[um.ECstrike15UserMessages.CS_UM_SendPlayerItemDrops] = { name: "SendPlayerItemDrops", class: um.CCSUsrMsgSendPlayerItemDrops }; exports.userMessages[um.ECstrike15UserMessages.CS_UM_RoundBackupFilenames] = { name: "RoundBackupFilenames", class: um.CCSUsrMsgRoundBackupFilenames }; exports.userMessages[um.ECstrike15UserMessages.CS_UM_SendPlayerItemFound] = { name: "SendPlayerItemFound", class: um.CCSUsrMsgSendPlayerItemFound }; exports.userMessages[um.ECstrike15UserMessages.CS_UM_ReportHit] = { name: "ReportHit", class: um.CCSUsrMsgReportHit }; exports.userMessages[um.ECstrike15UserMessages.CS_UM_XpUpdate] = { name: "XpUpdate", class: um.CCSUsrMsgXpUpdate }; exports.userMessages[um.ECstrike15UserMessages.CS_UM_QuestProgress] = { name: "QuestProgress", class: um.CCSUsrMsgQuestProgress }; exports.userMessages[um.ECstrike15UserMessages.CS_UM_ScoreLeaderboardData] = { name: "ScoreLeaderboardData", class: um.CCSUsrMsgScoreLeaderboardData }; exports.userMessages[um.ECstrike15UserMessages.CS_UM_PlayerDecalDigitalSignature] = { name: "PlayerDecalDigitalSignature", class: um.CCSUsrMsgPlayerDecalDigitalSignature }; exports.userMessages[um.ECstrike15UserMessages.CS_UM_WeaponSound] = { name: "WeaponSound", class: um.CCSUsrMsgWeaponSound }; exports.userMessages[um.ECstrike15UserMessages.CS_UM_UpdateScreenHealthBar] = { name: "UpdateScreenHealthBar", class: um.CCSUsrMsgUpdateScreenHealthBar }; exports.userMessages[um.ECstrike15UserMessages.CS_UM_EntityOutlineHighlight] = { name: "EntityOutlineHighlight", class: um.CCSUsrMsgEntityOutlineHighlight }; exports.userMessages[um.ECstrike15UserMessages.CS_UM_SSUI] = { name: "SSUI", class: um.CCSUsrMsgSSUI }; exports.userMessages[um.ECstrike15UserMessages.CS_UM_SurvivalStats] = { name: "SurvivalStats", class: um.CCSUsrMsgSurvivalStats }; exports.userMessages[um.ECstrike15UserMessages.CS_UM_EndOfMatchAllPlayersData] = { name: "EndOfMatchAllPlayersData", class: um.CCSUsrMsgEndOfMatchAllPlayersData }; exports.userMessages[um.ECstrike15UserMessages.CS_UM_RoundImpactScoreData] = { name: "RoundImpactScoreData", class: um.CCSUsrMsgRoundImpactScoreData }; exports.userMessages[um.ECstrike15UserMessages.CS_UM_CurrentRoundOdds] = { name: "CurrentRoundOdds", class: um.CCSUsrMsgCurrentRoundOdds }; exports.userMessages[um.ECstrike15UserMessages.CS_UM_DeepStats] = { name: "DeepStats", class: um.CCSUsrMsgDeepStats }; exports.userMessages[um.ECstrike15UserMessages.CS_UM_UtilMsg] = { name: "UtilMsg", class: um.CCSUsrMsgUtilMsg }; },{"./protobufs/cstrike15_usermessages":25}],35:[function(require,module,exports){ var AwaitValue = require("./AwaitValue.js"); function AsyncGenerator(gen) { var front, back; function send(key, arg) { return new Promise(function (resolve, reject) { var request = { key: key, arg: arg, resolve: resolve, reject: reject, next: null }; if (back) { back = back.next = request; } else { front = back = request; resume(key, arg); } }); } function resume(key, arg) { try { var result = gen[key](arg); var value = result.value; var wrappedAwait = value instanceof AwaitValue; Promise.resolve(wrappedAwait ? value.wrapped : value).then(function (arg) { if (wrappedAwait) { resume(key === "return" ? "return" : "next", arg); return; } settle(result.done ? "return" : "normal", arg); }, function (err) { resume("throw", err); }); } catch (err) { settle("throw", err); } } function settle(type, value) { switch (type) { case "return": front.resolve({ value: value, done: true }); break; case "throw": front.reject(value); break; default: front.resolve({ value: value, done: false }); break; } front = front.next; if (front) { resume(front.key, front.arg); } else { back = null; } } this._invoke = send; if (typeof gen["return"] !== "function") { this["return"] = undefined; } } AsyncGenerator.prototype[typeof Symbol === "function" && Symbol.asyncIterator || "@@asyncIterator"] = function () { return this; }; AsyncGenerator.prototype.next = function (arg) { return this._invoke("next", arg); }; AsyncGenerator.prototype["throw"] = function (arg) { return this._invoke("throw", arg); }; AsyncGenerator.prototype["return"] = function (arg) { return this._invoke("return", arg); }; module.exports = AsyncGenerator, module.exports.__esModule = true, module.exports["default"] = module.exports; },{"./AwaitValue.js":36}],36:[function(require,module,exports){ function _AwaitValue(value) { this.wrapped = value; } module.exports = _AwaitValue, module.exports.__esModule = true, module.exports["default"] = module.exports; },{}],37:[function(require,module,exports){ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } module.exports = _arrayLikeToArray, module.exports.__esModule = true, module.exports["default"] = module.exports; },{}],38:[function(require,module,exports){ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } module.exports = _arrayWithHoles, module.exports.__esModule = true, module.exports["default"] = module.exports; },{}],39:[function(require,module,exports){ var arrayLikeToArray = require("./arrayLikeToArray.js"); function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return arrayLikeToArray(arr); } module.exports = _arrayWithoutHoles, module.exports.__esModule = true, module.exports["default"] = module.exports; },{"./arrayLikeToArray.js":37}],40:[function(require,module,exports){ function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } module.exports = _assertThisInitialized, module.exports.__esModule = true, module.exports["default"] = module.exports; },{}],41:[function(require,module,exports){ function _asyncGeneratorDelegate(inner, awaitWrap) { var iter = {}, waiting = false; function pump(key, value) { waiting = true; value = new Promise(function (resolve) { resolve(inner[key](value)); }); return { done: false, value: awaitWrap(value) }; } ; iter[typeof Symbol !== "undefined" && Symbol.iterator || "@@iterator"] = function () { return this; }; iter.next = function (value) { if (waiting) { waiting = false; return value; } return pump("next", value); }; if (typeof inner["throw"] === "function") { iter["throw"] = function (value) { if (waiting) { waiting = false; throw value; } return pump("throw", value); }; } if (typeof inner["return"] === "function") { iter["return"] = function (value) { if (waiting) { waiting = false; return value; } return pump("return", value); }; } return iter; } module.exports = _asyncGeneratorDelegate, module.exports.__esModule = true, module.exports["default"] = module.exports; },{}],42:[function(require,module,exports){ function _asyncIterator(iterable) { var method, async, sync, retry = 2; for ("undefined" != typeof Symbol && (async = Symbol.asyncIterator, sync = Symbol.iterator); retry--;) { if (async && null != (method = iterable[async])) return method.call(iterable); if (sync && null != (method = iterable[sync])) return new AsyncFromSyncIterator(method.call(iterable)); async = "@@asyncIterator", sync = "@@iterator"; } throw new TypeError("Object is not async iterable"); } function AsyncFromSyncIterator(s) { function AsyncFromSyncIteratorContinuation(r) { if (Object(r) !== r) return Promise.reject(new TypeError(r + " is not an object.")); var done = r.done; return Promise.resolve(r.value).then(function (value) { return { value: value, done: done }; }); } return AsyncFromSyncIterator = function AsyncFromSyncIterator(s) { this.s = s, this.n = s.next; }, AsyncFromSyncIterator.prototype = { s: null, n: null, next: function next() { return AsyncFromSyncIteratorContinuation(this.n.apply(this.s, arguments)); }, "return": function _return(value) { var ret = this.s["return"]; return void 0 === ret ? Promise.resolve({ value: value, done: !0 }) : AsyncFromSyncIteratorContinuation(ret.apply(this.s, arguments)); }, "throw": function _throw(value) { var thr = this.s["return"]; return void 0 === thr ? Promise.reject(value) : AsyncFromSyncIteratorContinuation(thr.apply(this.s, arguments)); } }, new AsyncFromSyncIterator(s); } module.exports = _asyncIterator, module.exports.__esModule = true, module.exports["default"] = module.exports; },{}],43:[function(require,module,exports){ function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } } function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; } module.exports = _asyncToGenerator, module.exports.__esModule = true, module.exports["default"] = module.exports; },{}],44:[function(require,module,exports){ var AwaitValue = require("./AwaitValue.js"); function _awaitAsyncGenerator(value) { return new AwaitValue(value); } module.exports = _awaitAsyncGenerator, module.exports.__esModule = true, module.exports["default"] = module.exports; },{"./AwaitValue.js":36}],45:[function(require,module,exports){ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } module.exports = _classCallCheck, module.exports.__esModule = true, module.exports["default"] = module.exports; },{}],46:[function(require,module,exports){ var setPrototypeOf = require("./setPrototypeOf.js"); var isNativeReflectConstruct = require("./isNativeReflectConstruct.js"); function _construct(Parent, args, Class) { if (isNativeReflectConstruct()) { module.exports = _construct = Reflect.construct, module.exports.__esModule = true, module.exports["default"] = module.exports; } else { module.exports = _construct = function _construct(Parent, args, Class) { var a = [null]; a.push.apply(a, args); var Constructor = Function.bind.apply(Parent, a); var instance = new Constructor(); if (Class) setPrototypeOf(instance, Class.prototype); return instance; }, module.exports.__esModule = true, module.exports["default"] = module.exports; } return _construct.apply(null, arguments); } module.exports = _construct, module.exports.__esModule = true, module.exports["default"] = module.exports; },{"./isNativeReflectConstruct.js":52,"./setPrototypeOf.js":58}],47:[function(require,module,exports){ function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } module.exports = _createClass, module.exports.__esModule = true, module.exports["default"] = module.exports; },{}],48:[function(require,module,exports){ function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } module.exports = _defineProperty, module.exports.__esModule = true, module.exports["default"] = module.exports; },{}],49:[function(require,module,exports){ var superPropBase = require("./superPropBase.js"); function _get() { if (typeof Reflect !== "undefined" && Reflect.get) { module.exports = _get = Reflect.get, module.exports.__esModule = true, module.exports["default"] = module.exports; } else { module.exports = _get = function _get(target, property, receiver) { var base = superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }, module.exports.__esModule = true, module.exports["default"] = module.exports; } return _get.apply(this, arguments); } module.exports = _get, module.exports.__esModule = true, module.exports["default"] = module.exports; },{"./superPropBase.js":60}],50:[function(require,module,exports){ function _getPrototypeOf(o) { module.exports = _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }, module.exports.__esModule = true, module.exports["default"] = module.exports; return _getPrototypeOf(o); } module.exports = _getPrototypeOf, module.exports.__esModule = true, module.exports["default"] = module.exports; },{}],51:[function(require,module,exports){ var setPrototypeOf = require("./setPrototypeOf.js"); function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) setPrototypeOf(subClass, superClass); } module.exports = _inherits, module.exports.__esModule = true, module.exports["default"] = module.exports; },{"./setPrototypeOf.js":58}],52:[function(require,module,exports){ function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } module.exports = _isNativeReflectConstruct, module.exports.__esModule = true, module.exports["default"] = module.exports; },{}],53:[function(require,module,exports){ function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); } module.exports = _iterableToArray, module.exports.__esModule = true, module.exports["default"] = module.exports; },{}],54:[function(require,module,exports){ function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } module.exports = _iterableToArrayLimit, module.exports.__esModule = true, module.exports["default"] = module.exports; },{}],55:[function(require,module,exports){ function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } module.exports = _nonIterableRest, module.exports.__esModule = true, module.exports["default"] = module.exports; },{}],56:[function(require,module,exports){ function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } module.exports = _nonIterableSpread, module.exports.__esModule = true, module.exports["default"] = module.exports; },{}],57:[function(require,module,exports){ var _typeof = require("./typeof.js")["default"]; var assertThisInitialized = require("./assertThisInitialized.js"); function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return assertThisInitialized(self); } module.exports = _possibleConstructorReturn, module.exports.__esModule = true, module.exports["default"] = module.exports; },{"./assertThisInitialized.js":40,"./typeof.js":62}],58:[function(require,module,exports){ function _setPrototypeOf(o, p) { module.exports = _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }, module.exports.__esModule = true, module.exports["default"] = module.exports; return _setPrototypeOf(o, p); } module.exports = _setPrototypeOf, module.exports.__esModule = true, module.exports["default"] = module.exports; },{}],59:[function(require,module,exports){ var arrayWithHoles = require("./arrayWithHoles.js"); var iterableToArrayLimit = require("./iterableToArrayLimit.js"); var unsupportedIterableToArray = require("./unsupportedIterableToArray.js"); var nonIterableRest = require("./nonIterableRest.js"); function _slicedToArray(arr, i) { return arrayWithHoles(arr) || iterableToArrayLimit(arr, i) || unsupportedIterableToArray(arr, i) || nonIterableRest(); } module.exports = _slicedToArray, module.exports.__esModule = true, module.exports["default"] = module.exports; },{"./arrayWithHoles.js":38,"./iterableToArrayLimit.js":54,"./nonIterableRest.js":55,"./unsupportedIterableToArray.js":63}],60:[function(require,module,exports){ var getPrototypeOf = require("./getPrototypeOf.js"); function _superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = getPrototypeOf(object); if (object === null) break; } return object; } module.exports = _superPropBase, module.exports.__esModule = true, module.exports["default"] = module.exports; },{"./getPrototypeOf.js":50}],61:[function(require,module,exports){ var arrayWithoutHoles = require("./arrayWithoutHoles.js"); var iterableToArray = require("./iterableToArray.js"); var unsupportedIterableToArray = require("./unsupportedIterableToArray.js"); var nonIterableSpread = require("./nonIterableSpread.js"); function _toConsumableArray(arr) { return arrayWithoutHoles(arr) || iterableToArray(arr) || unsupportedIterableToArray(arr) || nonIterableSpread(); } module.exports = _toConsumableArray, module.exports.__esModule = true, module.exports["default"] = module.exports; },{"./arrayWithoutHoles.js":39,"./iterableToArray.js":53,"./nonIterableSpread.js":56,"./unsupportedIterableToArray.js":63}],62:[function(require,module,exports){ function _typeof(obj) { "@babel/helpers - typeof"; return (module.exports = _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, module.exports.__esModule = true, module.exports["default"] = module.exports), _typeof(obj); } module.exports = _typeof, module.exports.__esModule = true, module.exports["default"] = module.exports; },{}],63:[function(require,module,exports){ var arrayLikeToArray = require("./arrayLikeToArray.js"); function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return arrayLikeToArray(o, minLen); } module.exports = _unsupportedIterableToArray, module.exports.__esModule = true, module.exports["default"] = module.exports; },{"./arrayLikeToArray.js":37}],64:[function(require,module,exports){ var AsyncGenerator = require("./AsyncGenerator.js"); function _wrapAsyncGenerator(fn) { return function () { return new AsyncGenerator(fn.apply(this, arguments)); }; } module.exports = _wrapAsyncGenerator, module.exports.__esModule = true, module.exports["default"] = module.exports; },{"./AsyncGenerator.js":35}],65:[function(require,module,exports){ module.exports = require("regenerator-runtime"); },{"regenerator-runtime":730}],66:[function(require,module,exports){ "use strict"; module.exports = asPromise; /** * Callback as used by {@link util.asPromise}. * @typedef asPromiseCallback * @type {function} * @param {Error|null} error Error, if any * @param {...*} params Additional arguments * @returns {undefined} */ /** * Returns a promise from a node-style callback function. * @memberof util * @param {asPromiseCallback} fn Function to call * @param {*} ctx Function context * @param {...*} params Function arguments * @returns {Promise<*>} Promisified function */ function asPromise(fn, ctx/*, varargs */) { var params = new Array(arguments.length - 1), offset = 0, index = 2, pending = true; while (index < arguments.length) params[offset++] = arguments[index++]; return new Promise(function executor(resolve, reject) { params[offset] = function callback(err/*, varargs */) { if (pending) { pending = false; if (err) reject(err); else { var params = new Array(arguments.length - 1), offset = 0; while (offset < params.length) params[offset++] = arguments[offset]; resolve.apply(null, params); } } }; try { fn.apply(ctx || null, params); } catch (err) { if (pending) { pending = false; reject(err); } } }); } },{}],67:[function(require,module,exports){ "use strict"; /** * A minimal base64 implementation for number arrays. * @memberof util * @namespace */ var base64 = exports; /** * Calculates the byte length of a base64 encoded string. * @param {string} string Base64 encoded string * @returns {number} Byte length */ base64.length = function length(string) { var p = string.length; if (!p) return 0; var n = 0; while (--p % 4 > 1 && string.charAt(p) === "=") ++n; return Math.ceil(string.length * 3) / 4 - n; }; // Base64 encoding table var b64 = new Array(64); // Base64 decoding table var s64 = new Array(123); // 65..90, 97..122, 48..57, 43, 47 for (var i = 0; i < 64;) s64[b64[i] = i < 26 ? i + 65 : i < 52 ? i + 71 : i < 62 ? i - 4 : i - 59 | 43] = i++; /** * Encodes a buffer to a base64 encoded string. * @param {Uint8Array} buffer Source buffer * @param {number} start Source start * @param {number} end Source end * @returns {string} Base64 encoded string */ base64.encode = function encode(buffer, start, end) { var parts = null, chunk = []; var i = 0, // output index j = 0, // goto index t; // temporary while (start < end) { var b = buffer[start++]; switch (j) { case 0: chunk[i++] = b64[b >> 2]; t = (b & 3) << 4; j = 1; break; case 1: chunk[i++] = b64[t | b >> 4]; t = (b & 15) << 2; j = 2; break; case 2: chunk[i++] = b64[t | b >> 6]; chunk[i++] = b64[b & 63]; j = 0; break; } if (i > 8191) { (parts || (parts = [])).push(String.fromCharCode.apply(String, chunk)); i = 0; } } if (j) { chunk[i++] = b64[t]; chunk[i++] = 61; if (j === 1) chunk[i++] = 61; } if (parts) { if (i) parts.push(String.fromCharCode.apply(String, chunk.slice(0, i))); return parts.join(""); } return String.fromCharCode.apply(String, chunk.slice(0, i)); }; var invalidEncoding = "invalid encoding"; /** * Decodes a base64 encoded string to a buffer. * @param {string} string Source string * @param {Uint8Array} buffer Destination buffer * @param {number} offset Destination offset * @returns {number} Number of bytes written * @throws {Error} If encoding is invalid */ base64.decode = function decode(string, buffer, offset) { var start = offset; var j = 0, // goto index t; // temporary for (var i = 0; i < string.length;) { var c = string.charCodeAt(i++); if (c === 61 && j > 1) break; if ((c = s64[c]) === undefined) throw Error(invalidEncoding); switch (j) { case 0: t = c; j = 1; break; case 1: buffer[offset++] = t << 2 | (c & 48) >> 4; t = c; j = 2; break; case 2: buffer[offset++] = (t & 15) << 4 | (c & 60) >> 2; t = c; j = 3; break; case 3: buffer[offset++] = (t & 3) << 6 | c; j = 0; break; } } if (j === 1) throw Error(invalidEncoding); return offset - start; }; /** * Tests if the specified string appears to be base64 encoded. * @param {string} string String to test * @returns {boolean} `true` if probably base64 encoded, otherwise false */ base64.test = function test(string) { return /^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/.test(string); }; },{}],68:[function(require,module,exports){ "use strict"; module.exports = EventEmitter; /** * Constructs a new event emitter instance. * @classdesc A minimal event emitter. * @memberof util * @constructor */ function EventEmitter() { /** * Registered listeners. * @type {Object.} * @private */ this._listeners = {}; } /** * Registers an event listener. * @param {string} evt Event name * @param {function} fn Listener * @param {*} [ctx] Listener context * @returns {util.EventEmitter} `this` */ EventEmitter.prototype.on = function on(evt, fn, ctx) { (this._listeners[evt] || (this._listeners[evt] = [])).push({ fn : fn, ctx : ctx || this }); return this; }; /** * Removes an event listener or any matching listeners if arguments are omitted. * @param {string} [evt] Event name. Removes all listeners if omitted. * @param {function} [fn] Listener to remove. Removes all listeners of `evt` if omitted. * @returns {util.EventEmitter} `this` */ EventEmitter.prototype.off = function off(evt, fn) { if (evt === undefined) this._listeners = {}; else { if (fn === undefined) this._listeners[evt] = []; else { var listeners = this._listeners[evt]; for (var i = 0; i < listeners.length;) if (listeners[i].fn === fn) listeners.splice(i, 1); else ++i; } } return this; }; /** * Emits an event by calling its listeners with the specified arguments. * @param {string} evt Event name * @param {...*} args Arguments * @returns {util.EventEmitter} `this` */ EventEmitter.prototype.emit = function emit(evt) { var listeners = this._listeners[evt]; if (listeners) { var args = [], i = 1; for (; i < arguments.length;) args.push(arguments[i++]); for (i = 0; i < listeners.length;) listeners[i].fn.apply(listeners[i++].ctx, args); } return this; }; },{}],69:[function(require,module,exports){ "use strict"; module.exports = factory(factory); /** * Reads / writes floats / doubles from / to buffers. * @name util.float * @namespace */ /** * Writes a 32 bit float to a buffer using little endian byte order. * @name util.float.writeFloatLE * @function * @param {number} val Value to write * @param {Uint8Array} buf Target buffer * @param {number} pos Target buffer offset * @returns {undefined} */ /** * Writes a 32 bit float to a buffer using big endian byte order. * @name util.float.writeFloatBE * @function * @param {number} val Value to write * @param {Uint8Array} buf Target buffer * @param {number} pos Target buffer offset * @returns {undefined} */ /** * Reads a 32 bit float from a buffer using little endian byte order. * @name util.float.readFloatLE * @function * @param {Uint8Array} buf Source buffer * @param {number} pos Source buffer offset * @returns {number} Value read */ /** * Reads a 32 bit float from a buffer using big endian byte order. * @name util.float.readFloatBE * @function * @param {Uint8Array} buf Source buffer * @param {number} pos Source buffer offset * @returns {number} Value read */ /** * Writes a 64 bit double to a buffer using little endian byte order. * @name util.float.writeDoubleLE * @function * @param {number} val Value to write * @param {Uint8Array} buf Target buffer * @param {number} pos Target buffer offset * @returns {undefined} */ /** * Writes a 64 bit double to a buffer using big endian byte order. * @name util.float.writeDoubleBE * @function * @param {number} val Value to write * @param {Uint8Array} buf Target buffer * @param {number} pos Target buffer offset * @returns {undefined} */ /** * Reads a 64 bit double from a buffer using little endian byte order. * @name util.float.readDoubleLE * @function * @param {Uint8Array} buf Source buffer * @param {number} pos Source buffer offset * @returns {number} Value read */ /** * Reads a 64 bit double from a buffer using big endian byte order. * @name util.float.readDoubleBE * @function * @param {Uint8Array} buf Source buffer * @param {number} pos Source buffer offset * @returns {number} Value read */ // Factory function for the purpose of node-based testing in modified global environments function factory(exports) { // float: typed array if (typeof Float32Array !== "undefined") (function() { var f32 = new Float32Array([ -0 ]), f8b = new Uint8Array(f32.buffer), le = f8b[3] === 128; function writeFloat_f32_cpy(val, buf, pos) { f32[0] = val; buf[pos ] = f8b[0]; buf[pos + 1] = f8b[1]; buf[pos + 2] = f8b[2]; buf[pos + 3] = f8b[3]; } function writeFloat_f32_rev(val, buf, pos) { f32[0] = val; buf[pos ] = f8b[3]; buf[pos + 1] = f8b[2]; buf[pos + 2] = f8b[1]; buf[pos + 3] = f8b[0]; } /* istanbul ignore next */ exports.writeFloatLE = le ? writeFloat_f32_cpy : writeFloat_f32_rev; /* istanbul ignore next */ exports.writeFloatBE = le ? writeFloat_f32_rev : writeFloat_f32_cpy; function readFloat_f32_cpy(buf, pos) { f8b[0] = buf[pos ]; f8b[1] = buf[pos + 1]; f8b[2] = buf[pos + 2]; f8b[3] = buf[pos + 3]; return f32[0]; } function readFloat_f32_rev(buf, pos) { f8b[3] = buf[pos ]; f8b[2] = buf[pos + 1]; f8b[1] = buf[pos + 2]; f8b[0] = buf[pos + 3]; return f32[0]; } /* istanbul ignore next */ exports.readFloatLE = le ? readFloat_f32_cpy : readFloat_f32_rev; /* istanbul ignore next */ exports.readFloatBE = le ? readFloat_f32_rev : readFloat_f32_cpy; // float: ieee754 })(); else (function() { function writeFloat_ieee754(writeUint, val, buf, pos) { var sign = val < 0 ? 1 : 0; if (sign) val = -val; if (val === 0) writeUint(1 / val > 0 ? /* positive */ 0 : /* negative 0 */ 2147483648, buf, pos); else if (isNaN(val)) writeUint(2143289344, buf, pos); else if (val > 3.4028234663852886e+38) // +-Infinity writeUint((sign << 31 | 2139095040) >>> 0, buf, pos); else if (val < 1.1754943508222875e-38) // denormal writeUint((sign << 31 | Math.round(val / 1.401298464324817e-45)) >>> 0, buf, pos); else { var exponent = Math.floor(Math.log(val) / Math.LN2), mantissa = Math.round(val * Math.pow(2, -exponent) * 8388608) & 8388607; writeUint((sign << 31 | exponent + 127 << 23 | mantissa) >>> 0, buf, pos); } } exports.writeFloatLE = writeFloat_ieee754.bind(null, writeUintLE); exports.writeFloatBE = writeFloat_ieee754.bind(null, writeUintBE); function readFloat_ieee754(readUint, buf, pos) { var uint = readUint(buf, pos), sign = (uint >> 31) * 2 + 1, exponent = uint >>> 23 & 255, mantissa = uint & 8388607; return exponent === 255 ? mantissa ? NaN : sign * Infinity : exponent === 0 // denormal ? sign * 1.401298464324817e-45 * mantissa : sign * Math.pow(2, exponent - 150) * (mantissa + 8388608); } exports.readFloatLE = readFloat_ieee754.bind(null, readUintLE); exports.readFloatBE = readFloat_ieee754.bind(null, readUintBE); })(); // double: typed array if (typeof Float64Array !== "undefined") (function() { var f64 = new Float64Array([-0]), f8b = new Uint8Array(f64.buffer), le = f8b[7] === 128; function writeDouble_f64_cpy(val, buf, pos) { f64[0] = val; buf[pos ] = f8b[0]; buf[pos + 1] = f8b[1]; buf[pos + 2] = f8b[2]; buf[pos + 3] = f8b[3]; buf[pos + 4] = f8b[4]; buf[pos + 5] = f8b[5]; buf[pos + 6] = f8b[6]; buf[pos + 7] = f8b[7]; } function writeDouble_f64_rev(val, buf, pos) { f64[0] = val; buf[pos ] = f8b[7]; buf[pos + 1] = f8b[6]; buf[pos + 2] = f8b[5]; buf[pos + 3] = f8b[4]; buf[pos + 4] = f8b[3]; buf[pos + 5] = f8b[2]; buf[pos + 6] = f8b[1]; buf[pos + 7] = f8b[0]; } /* istanbul ignore next */ exports.writeDoubleLE = le ? writeDouble_f64_cpy : writeDouble_f64_rev; /* istanbul ignore next */ exports.writeDoubleBE = le ? writeDouble_f64_rev : writeDouble_f64_cpy; function readDouble_f64_cpy(buf, pos) { f8b[0] = buf[pos ]; f8b[1] = buf[pos + 1]; f8b[2] = buf[pos + 2]; f8b[3] = buf[pos + 3]; f8b[4] = buf[pos + 4]; f8b[5] = buf[pos + 5]; f8b[6] = buf[pos + 6]; f8b[7] = buf[pos + 7]; return f64[0]; } function readDouble_f64_rev(buf, pos) { f8b[7] = buf[pos ]; f8b[6] = buf[pos + 1]; f8b[5] = buf[pos + 2]; f8b[4] = buf[pos + 3]; f8b[3] = buf[pos + 4]; f8b[2] = buf[pos + 5]; f8b[1] = buf[pos + 6]; f8b[0] = buf[pos + 7]; return f64[0]; } /* istanbul ignore next */ exports.readDoubleLE = le ? readDouble_f64_cpy : readDouble_f64_rev; /* istanbul ignore next */ exports.readDoubleBE = le ? readDouble_f64_rev : readDouble_f64_cpy; // double: ieee754 })(); else (function() { function writeDouble_ieee754(writeUint, off0, off1, val, buf, pos) { var sign = val < 0 ? 1 : 0; if (sign) val = -val; if (val === 0) { writeUint(0, buf, pos + off0); writeUint(1 / val > 0 ? /* positive */ 0 : /* negative 0 */ 2147483648, buf, pos + off1); } else if (isNaN(val)) { writeUint(0, buf, pos + off0); writeUint(2146959360, buf, pos + off1); } else if (val > 1.7976931348623157e+308) { // +-Infinity writeUint(0, buf, pos + off0); writeUint((sign << 31 | 2146435072) >>> 0, buf, pos + off1); } else { var mantissa; if (val < 2.2250738585072014e-308) { // denormal mantissa = val / 5e-324; writeUint(mantissa >>> 0, buf, pos + off0); writeUint((sign << 31 | mantissa / 4294967296) >>> 0, buf, pos + off1); } else { var exponent = Math.floor(Math.log(val) / Math.LN2); if (exponent === 1024) exponent = 1023; mantissa = val * Math.pow(2, -exponent); writeUint(mantissa * 4503599627370496 >>> 0, buf, pos + off0); writeUint((sign << 31 | exponent + 1023 << 20 | mantissa * 1048576 & 1048575) >>> 0, buf, pos + off1); } } } exports.writeDoubleLE = writeDouble_ieee754.bind(null, writeUintLE, 0, 4); exports.writeDoubleBE = writeDouble_ieee754.bind(null, writeUintBE, 4, 0); function readDouble_ieee754(readUint, off0, off1, buf, pos) { var lo = readUint(buf, pos + off0), hi = readUint(buf, pos + off1); var sign = (hi >> 31) * 2 + 1, exponent = hi >>> 20 & 2047, mantissa = 4294967296 * (hi & 1048575) + lo; return exponent === 2047 ? mantissa ? NaN : sign * Infinity : exponent === 0 // denormal ? sign * 5e-324 * mantissa : sign * Math.pow(2, exponent - 1075) * (mantissa + 4503599627370496); } exports.readDoubleLE = readDouble_ieee754.bind(null, readUintLE, 0, 4); exports.readDoubleBE = readDouble_ieee754.bind(null, readUintBE, 4, 0); })(); return exports; } // uint helpers function writeUintLE(val, buf, pos) { buf[pos ] = val & 255; buf[pos + 1] = val >>> 8 & 255; buf[pos + 2] = val >>> 16 & 255; buf[pos + 3] = val >>> 24; } function writeUintBE(val, buf, pos) { buf[pos ] = val >>> 24; buf[pos + 1] = val >>> 16 & 255; buf[pos + 2] = val >>> 8 & 255; buf[pos + 3] = val & 255; } function readUintLE(buf, pos) { return (buf[pos ] | buf[pos + 1] << 8 | buf[pos + 2] << 16 | buf[pos + 3] << 24) >>> 0; } function readUintBE(buf, pos) { return (buf[pos ] << 24 | buf[pos + 1] << 16 | buf[pos + 2] << 8 | buf[pos + 3]) >>> 0; } },{}],70:[function(require,module,exports){ "use strict"; module.exports = inquire; /** * Requires a module only if available. * @memberof util * @param {string} moduleName Module to require * @returns {?Object} Required module if available and not empty, otherwise `null` */ function inquire(moduleName) { try { var mod = eval("quire".replace(/^/,"re"))(moduleName); // eslint-disable-line no-eval if (mod && (mod.length || Object.keys(mod).length)) return mod; } catch (e) {} // eslint-disable-line no-empty return null; } },{}],71:[function(require,module,exports){ "use strict"; module.exports = pool; /** * An allocator as used by {@link util.pool}. * @typedef PoolAllocator * @type {function} * @param {number} size Buffer size * @returns {Uint8Array} Buffer */ /** * A slicer as used by {@link util.pool}. * @typedef PoolSlicer * @type {function} * @param {number} start Start offset * @param {number} end End offset * @returns {Uint8Array} Buffer slice * @this {Uint8Array} */ /** * A general purpose buffer pool. * @memberof util * @function * @param {PoolAllocator} alloc Allocator * @param {PoolSlicer} slice Slicer * @param {number} [size=8192] Slab size * @returns {PoolAllocator} Pooled allocator */ function pool(alloc, slice, size) { var SIZE = size || 8192; var MAX = SIZE >>> 1; var slab = null; var offset = SIZE; return function pool_alloc(size) { if (size < 1 || size > MAX) return alloc(size); if (offset + size > SIZE) { slab = alloc(SIZE); offset = 0; } var buf = slice.call(slab, offset, offset += size); if (offset & 7) // align to 32 bit offset = (offset | 7) + 1; return buf; }; } },{}],72:[function(require,module,exports){ "use strict"; /** * A minimal UTF8 implementation for number arrays. * @memberof util * @namespace */ var utf8 = exports; /** * Calculates the UTF8 byte length of a string. * @param {string} string String * @returns {number} Byte length */ utf8.length = function utf8_length(string) { var len = 0, c = 0; for (var i = 0; i < string.length; ++i) { c = string.charCodeAt(i); if (c < 128) len += 1; else if (c < 2048) len += 2; else if ((c & 0xFC00) === 0xD800 && (string.charCodeAt(i + 1) & 0xFC00) === 0xDC00) { ++i; len += 4; } else len += 3; } return len; }; /** * Reads UTF8 bytes as a string. * @param {Uint8Array} buffer Source buffer * @param {number} start Source start * @param {number} end Source end * @returns {string} String read */ utf8.read = function utf8_read(buffer, start, end) { var len = end - start; if (len < 1) return ""; var parts = null, chunk = [], i = 0, // char offset t; // temporary while (start < end) { t = buffer[start++]; if (t < 128) chunk[i++] = t; else if (t > 191 && t < 224) chunk[i++] = (t & 31) << 6 | buffer[start++] & 63; else if (t > 239 && t < 365) { t = ((t & 7) << 18 | (buffer[start++] & 63) << 12 | (buffer[start++] & 63) << 6 | buffer[start++] & 63) - 0x10000; chunk[i++] = 0xD800 + (t >> 10); chunk[i++] = 0xDC00 + (t & 1023); } else chunk[i++] = (t & 15) << 12 | (buffer[start++] & 63) << 6 | buffer[start++] & 63; if (i > 8191) { (parts || (parts = [])).push(String.fromCharCode.apply(String, chunk)); i = 0; } } if (parts) { if (i) parts.push(String.fromCharCode.apply(String, chunk.slice(0, i))); return parts.join(""); } return String.fromCharCode.apply(String, chunk.slice(0, i)); }; /** * Writes a string as UTF8 bytes. * @param {string} string Source string * @param {Uint8Array} buffer Destination buffer * @param {number} offset Destination offset * @returns {number} Bytes written */ utf8.write = function utf8_write(string, buffer, offset) { var start = offset, c1, // character 1 c2; // character 2 for (var i = 0; i < string.length; ++i) { c1 = string.charCodeAt(i); if (c1 < 128) { buffer[offset++] = c1; } else if (c1 < 2048) { buffer[offset++] = c1 >> 6 | 192; buffer[offset++] = c1 & 63 | 128; } else if ((c1 & 0xFC00) === 0xD800 && ((c2 = string.charCodeAt(i + 1)) & 0xFC00) === 0xDC00) { c1 = 0x10000 + ((c1 & 0x03FF) << 10) + (c2 & 0x03FF); ++i; buffer[offset++] = c1 >> 18 | 240; buffer[offset++] = c1 >> 12 & 63 | 128; buffer[offset++] = c1 >> 6 & 63 | 128; buffer[offset++] = c1 & 63 | 128; } else { buffer[offset++] = c1 >> 12 | 224; buffer[offset++] = c1 >> 6 & 63 | 128; buffer[offset++] = c1 & 63 | 128; } } return offset - start; }; },{}],73:[function(require,module,exports){ (function (global){(function (){ 'use strict'; var objectAssign = require('object-assign'); // compare and isBuffer taken from https://github.com/feross/buffer/blob/680e9e5e488f22aac27599a57dc844a6315928dd/index.js // original notice: /*! * The buffer module from node.js, for the browser. * * @author Feross Aboukhadijeh * @license MIT */ function compare(a, b) { if (a === b) { return 0; } var x = a.length; var y = b.length; for (var i = 0, len = Math.min(x, y); i < len; ++i) { if (a[i] !== b[i]) { x = a[i]; y = b[i]; break; } } if (x < y) { return -1; } if (y < x) { return 1; } return 0; } function isBuffer(b) { if (global.Buffer && typeof global.Buffer.isBuffer === 'function') { return global.Buffer.isBuffer(b); } return !!(b != null && b._isBuffer); } // based on node assert, original notice: // NB: The URL to the CommonJS spec is kept just for tradition. // node-assert has evolved a lot since then, both in API and behavior. // http://wiki.commonjs.org/wiki/Unit_Testing/1.0 // // THIS IS NOT TESTED NOR LIKELY TO WORK OUTSIDE V8! // // Originally from narwhal.js (http://narwhaljs.org) // Copyright (c) 2009 Thomas Robinson <280north.com> // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the 'Software'), to // deal in the Software without restriction, including without limitation the // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or // sell copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN // ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. var util = require('util/'); var hasOwn = Object.prototype.hasOwnProperty; var pSlice = Array.prototype.slice; var functionsHaveNames = (function () { return function foo() {}.name === 'foo'; }()); function pToString (obj) { return Object.prototype.toString.call(obj); } function isView(arrbuf) { if (isBuffer(arrbuf)) { return false; } if (typeof global.ArrayBuffer !== 'function') { return false; } if (typeof ArrayBuffer.isView === 'function') { return ArrayBuffer.isView(arrbuf); } if (!arrbuf) { return false; } if (arrbuf instanceof DataView) { return true; } if (arrbuf.buffer && arrbuf.buffer instanceof ArrayBuffer) { return true; } return false; } // 1. The assert module provides functions that throw // AssertionError's when particular conditions are not met. The // assert module must conform to the following interface. var assert = module.exports = ok; // 2. The AssertionError is defined in assert. // new assert.AssertionError({ message: message, // actual: actual, // expected: expected }) var regex = /\s*function\s+([^\(\s]*)\s*/; // based on https://github.com/ljharb/function.prototype.name/blob/adeeeec8bfcc6068b187d7d9fb3d5bb1d3a30899/implementation.js function getName(func) { if (!util.isFunction(func)) { return; } if (functionsHaveNames) { return func.name; } var str = func.toString(); var match = str.match(regex); return match && match[1]; } assert.AssertionError = function AssertionError(options) { this.name = 'AssertionError'; this.actual = options.actual; this.expected = options.expected; this.operator = options.operator; if (options.message) { this.message = options.message; this.generatedMessage = false; } else { this.message = getMessage(this); this.generatedMessage = true; } var stackStartFunction = options.stackStartFunction || fail; if (Error.captureStackTrace) { Error.captureStackTrace(this, stackStartFunction); } else { // non v8 browsers so we can have a stacktrace var err = new Error(); if (err.stack) { var out = err.stack; // try to strip useless frames var fn_name = getName(stackStartFunction); var idx = out.indexOf('\n' + fn_name); if (idx >= 0) { // once we have located the function frame // we need to strip out everything before it (and its line) var next_line = out.indexOf('\n', idx + 1); out = out.substring(next_line + 1); } this.stack = out; } } }; // assert.AssertionError instanceof Error util.inherits(assert.AssertionError, Error); function truncate(s, n) { if (typeof s === 'string') { return s.length < n ? s : s.slice(0, n); } else { return s; } } function inspect(something) { if (functionsHaveNames || !util.isFunction(something)) { return util.inspect(something); } var rawname = getName(something); var name = rawname ? ': ' + rawname : ''; return '[Function' + name + ']'; } function getMessage(self) { return truncate(inspect(self.actual), 128) + ' ' + self.operator + ' ' + truncate(inspect(self.expected), 128); } // At present only the three keys mentioned above are used and // understood by the spec. Implementations or sub modules can pass // other keys to the AssertionError's constructor - they will be // ignored. // 3. All of the following functions must throw an AssertionError // when a corresponding condition is not met, with a message that // may be undefined if not provided. All assertion methods provide // both the actual and expected values to the assertion error for // display purposes. function fail(actual, expected, message, operator, stackStartFunction) { throw new assert.AssertionError({ message: message, actual: actual, expected: expected, operator: operator, stackStartFunction: stackStartFunction }); } // EXTENSION! allows for well behaved errors defined elsewhere. assert.fail = fail; // 4. Pure assertion tests whether a value is truthy, as determined // by !!guard. // assert.ok(guard, message_opt); // This statement is equivalent to assert.equal(true, !!guard, // message_opt);. To test strictly for the value true, use // assert.strictEqual(true, guard, message_opt);. function ok(value, message) { if (!value) fail(value, true, message, '==', assert.ok); } assert.ok = ok; // 5. The equality assertion tests shallow, coercive equality with // ==. // assert.equal(actual, expected, message_opt); assert.equal = function equal(actual, expected, message) { if (actual != expected) fail(actual, expected, message, '==', assert.equal); }; // 6. The non-equality assertion tests for whether two objects are not equal // with != assert.notEqual(actual, expected, message_opt); assert.notEqual = function notEqual(actual, expected, message) { if (actual == expected) { fail(actual, expected, message, '!=', assert.notEqual); } }; // 7. The equivalence assertion tests a deep equality relation. // assert.deepEqual(actual, expected, message_opt); assert.deepEqual = function deepEqual(actual, expected, message) { if (!_deepEqual(actual, expected, false)) { fail(actual, expected, message, 'deepEqual', assert.deepEqual); } }; assert.deepStrictEqual = function deepStrictEqual(actual, expected, message) { if (!_deepEqual(actual, expected, true)) { fail(actual, expected, message, 'deepStrictEqual', assert.deepStrictEqual); } }; function _deepEqual(actual, expected, strict, memos) { // 7.1. All identical values are equivalent, as determined by ===. if (actual === expected) { return true; } else if (isBuffer(actual) && isBuffer(expected)) { return compare(actual, expected) === 0; // 7.2. If the expected value is a Date object, the actual value is // equivalent if it is also a Date object that refers to the same time. } else if (util.isDate(actual) && util.isDate(expected)) { return actual.getTime() === expected.getTime(); // 7.3 If the expected value is a RegExp object, the actual value is // equivalent if it is also a RegExp object with the same source and // properties (`global`, `multiline`, `lastIndex`, `ignoreCase`). } else if (util.isRegExp(actual) && util.isRegExp(expected)) { return actual.source === expected.source && actual.global === expected.global && actual.multiline === expected.multiline && actual.lastIndex === expected.lastIndex && actual.ignoreCase === expected.ignoreCase; // 7.4. Other pairs that do not both pass typeof value == 'object', // equivalence is determined by ==. } else if ((actual === null || typeof actual !== 'object') && (expected === null || typeof expected !== 'object')) { return strict ? actual === expected : actual == expected; // If both values are instances of typed arrays, wrap their underlying // ArrayBuffers in a Buffer each to increase performance // This optimization requires the arrays to have the same type as checked by // Object.prototype.toString (aka pToString). Never perform binary // comparisons for Float*Arrays, though, since e.g. +0 === -0 but their // bit patterns are not identical. } else if (isView(actual) && isView(expected) && pToString(actual) === pToString(expected) && !(actual instanceof Float32Array || actual instanceof Float64Array)) { return compare(new Uint8Array(actual.buffer), new Uint8Array(expected.buffer)) === 0; // 7.5 For all other Object pairs, including Array objects, equivalence is // determined by having the same number of owned properties (as verified // with Object.prototype.hasOwnProperty.call), the same set of keys // (although not necessarily the same order), equivalent values for every // corresponding key, and an identical 'prototype' property. Note: this // accounts for both named and indexed properties on Arrays. } else if (isBuffer(actual) !== isBuffer(expected)) { return false; } else { memos = memos || {actual: [], expected: []}; var actualIndex = memos.actual.indexOf(actual); if (actualIndex !== -1) { if (actualIndex === memos.expected.indexOf(expected)) { return true; } } memos.actual.push(actual); memos.expected.push(expected); return objEquiv(actual, expected, strict, memos); } } function isArguments(object) { return Object.prototype.toString.call(object) == '[object Arguments]'; } function objEquiv(a, b, strict, actualVisitedObjects) { if (a === null || a === undefined || b === null || b === undefined) return false; // if one is a primitive, the other must be same if (util.isPrimitive(a) || util.isPrimitive(b)) return a === b; if (strict && Object.getPrototypeOf(a) !== Object.getPrototypeOf(b)) return false; var aIsArgs = isArguments(a); var bIsArgs = isArguments(b); if ((aIsArgs && !bIsArgs) || (!aIsArgs && bIsArgs)) return false; if (aIsArgs) { a = pSlice.call(a); b = pSlice.call(b); return _deepEqual(a, b, strict); } var ka = objectKeys(a); var kb = objectKeys(b); var key, i; // having the same number of owned properties (keys incorporates // hasOwnProperty) if (ka.length !== kb.length) return false; //the same set of keys (although not necessarily the same order), ka.sort(); kb.sort(); //~~~cheap key test for (i = ka.length - 1; i >= 0; i--) { if (ka[i] !== kb[i]) return false; } //equivalent values for every corresponding key, and //~~~possibly expensive deep test for (i = ka.length - 1; i >= 0; i--) { key = ka[i]; if (!_deepEqual(a[key], b[key], strict, actualVisitedObjects)) return false; } return true; } // 8. The non-equivalence assertion tests for any deep inequality. // assert.notDeepEqual(actual, expected, message_opt); assert.notDeepEqual = function notDeepEqual(actual, expected, message) { if (_deepEqual(actual, expected, false)) { fail(actual, expected, message, 'notDeepEqual', assert.notDeepEqual); } }; assert.notDeepStrictEqual = notDeepStrictEqual; function notDeepStrictEqual(actual, expected, message) { if (_deepEqual(actual, expected, true)) { fail(actual, expected, message, 'notDeepStrictEqual', notDeepStrictEqual); } } // 9. The strict equality assertion tests strict equality, as determined by ===. // assert.strictEqual(actual, expected, message_opt); assert.strictEqual = function strictEqual(actual, expected, message) { if (actual !== expected) { fail(actual, expected, message, '===', assert.strictEqual); } }; // 10. The strict non-equality assertion tests for strict inequality, as // determined by !==. assert.notStrictEqual(actual, expected, message_opt); assert.notStrictEqual = function notStrictEqual(actual, expected, message) { if (actual === expected) { fail(actual, expected, message, '!==', assert.notStrictEqual); } }; function expectedException(actual, expected) { if (!actual || !expected) { return false; } if (Object.prototype.toString.call(expected) == '[object RegExp]') { return expected.test(actual); } try { if (actual instanceof expected) { return true; } } catch (e) { // Ignore. The instanceof check doesn't work for arrow functions. } if (Error.isPrototypeOf(expected)) { return false; } return expected.call({}, actual) === true; } function _tryBlock(block) { var error; try { block(); } catch (e) { error = e; } return error; } function _throws(shouldThrow, block, expected, message) { var actual; if (typeof block !== 'function') { throw new TypeError('"block" argument must be a function'); } if (typeof expected === 'string') { message = expected; expected = null; } actual = _tryBlock(block); message = (expected && expected.name ? ' (' + expected.name + ').' : '.') + (message ? ' ' + message : '.'); if (shouldThrow && !actual) { fail(actual, expected, 'Missing expected exception' + message); } var userProvidedMessage = typeof message === 'string'; var isUnwantedException = !shouldThrow && util.isError(actual); var isUnexpectedException = !shouldThrow && actual && !expected; if ((isUnwantedException && userProvidedMessage && expectedException(actual, expected)) || isUnexpectedException) { fail(actual, expected, 'Got unwanted exception' + message); } if ((shouldThrow && actual && expected && !expectedException(actual, expected)) || (!shouldThrow && actual)) { throw actual; } } // 11. Expected to throw an error: // assert.throws(block, Error_opt, message_opt); assert.throws = function(block, /*optional*/error, /*optional*/message) { _throws(true, block, error, message); }; // EXTENSION! This is annoying to write outside this module. assert.doesNotThrow = function(block, /*optional*/error, /*optional*/message) { _throws(false, block, error, message); }; assert.ifError = function(err) { if (err) throw err; }; // Expose a strict only variant of assert function strict(value, message) { if (!value) fail(value, true, message, '==', strict); } assert.strict = objectAssign(strict, assert, { equal: assert.strictEqual, deepEqual: assert.deepStrictEqual, notEqual: assert.notStrictEqual, notDeepEqual: assert.notDeepStrictEqual }); assert.strict.strict = assert.strict; var objectKeys = Object.keys || function (obj) { var keys = []; for (var key in obj) { if (hasOwn.call(obj, key)) keys.push(key); } return keys; }; }).call(this)}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) },{"object-assign":713,"util/":76}],74:[function(require,module,exports){ if (typeof Object.create === 'function') { // implementation from standard node.js 'util' module module.exports = function inherits(ctor, superCtor) { ctor.super_ = superCtor ctor.prototype = Object.create(superCtor.prototype, { constructor: { value: ctor, enumerable: false, writable: true, configurable: true } }); }; } else { // old school shim for old browsers module.exports = function inherits(ctor, superCtor) { ctor.super_ = superCtor var TempCtor = function () {} TempCtor.prototype = superCtor.prototype ctor.prototype = new TempCtor() ctor.prototype.constructor = ctor } } },{}],75:[function(require,module,exports){ module.exports = function isBuffer(arg) { return arg && typeof arg === 'object' && typeof arg.copy === 'function' && typeof arg.fill === 'function' && typeof arg.readUInt8 === 'function'; } },{}],76:[function(require,module,exports){ (function (process,global){(function (){ // Copyright Joyent, Inc. and other Node contributors. // // Permission is hereby granted, free of charge, to any person obtaining a // copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to permit // persons to whom the Software is furnished to do so, subject to the // following conditions: // // The above copyright notice and this permission notice shall be included // in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE // USE OR OTHER DEALINGS IN THE SOFTWARE. var formatRegExp = /%[sdj%]/g; exports.format = function(f) { if (!isString(f)) { var objects = []; for (var i = 0; i < arguments.length; i++) { objects.push(inspect(arguments[i])); } return objects.join(' '); } var i = 1; var args = arguments; var len = args.length; var str = String(f).replace(formatRegExp, function(x) { if (x === '%%') return '%'; if (i >= len) return x; switch (x) { case '%s': return String(args[i++]); case '%d': return Number(args[i++]); case '%j': try { return JSON.stringify(args[i++]); } catch (_) { return '[Circular]'; } default: return x; } }); for (var x = args[i]; i < len; x = args[++i]) { if (isNull(x) || !isObject(x)) { str += ' ' + x; } else { str += ' ' + inspect(x); } } return str; }; // Mark that a method should not be used. // Returns a modified function which warns once by default. // If --no-deprecation is set, then it is a no-op. exports.deprecate = function(fn, msg) { // Allow for deprecating things in the process of starting up. if (isUndefined(global.process)) { return function() { return exports.deprecate(fn, msg).apply(this, arguments); }; } if (process.noDeprecation === true) { return fn; } var warned = false; function deprecated() { if (!warned) { if (process.throwDeprecation) { throw new Error(msg); } else if (process.traceDeprecation) { console.trace(msg); } else { console.error(msg); } warned = true; } return fn.apply(this, arguments); } return deprecated; }; var debugs = {}; var debugEnviron; exports.debuglog = function(set) { if (isUndefined(debugEnviron)) debugEnviron = process.env.NODE_DEBUG || ''; set = set.toUpperCase(); if (!debugs[set]) { if (new RegExp('\\b' + set + '\\b', 'i').test(debugEnviron)) { var pid = process.pid; debugs[set] = function() { var msg = exports.format.apply(exports, arguments); console.error('%s %d: %s', set, pid, msg); }; } else { debugs[set] = function() {}; } } return debugs[set]; }; /** * Echos the value of a value. Trys to print the value out * in the best way possible given the different types. * * @param {Object} obj The object to print out. * @param {Object} opts Optional options object that alters the output. */ /* legacy: obj, showHidden, depth, colors*/ function inspect(obj, opts) { // default options var ctx = { seen: [], stylize: stylizeNoColor }; // legacy... if (arguments.length >= 3) ctx.depth = arguments[2]; if (arguments.length >= 4) ctx.colors = arguments[3]; if (isBoolean(opts)) { // legacy... ctx.showHidden = opts; } else if (opts) { // got an "options" object exports._extend(ctx, opts); } // set default options if (isUndefined(ctx.showHidden)) ctx.showHidden = false; if (isUndefined(ctx.depth)) ctx.depth = 2; if (isUndefined(ctx.colors)) ctx.colors = false; if (isUndefined(ctx.customInspect)) ctx.customInspect = true; if (ctx.colors) ctx.stylize = stylizeWithColor; return formatValue(ctx, obj, ctx.depth); } exports.inspect = inspect; // http://en.wikipedia.org/wiki/ANSI_escape_code#graphics inspect.colors = { 'bold' : [1, 22], 'italic' : [3, 23], 'underline' : [4, 24], 'inverse' : [7, 27], 'white' : [37, 39], 'grey' : [90, 39], 'black' : [30, 39], 'blue' : [34, 39], 'cyan' : [36, 39], 'green' : [32, 39], 'magenta' : [35, 39], 'red' : [31, 39], 'yellow' : [33, 39] }; // Don't use 'blue' not visible on cmd.exe inspect.styles = { 'special': 'cyan', 'number': 'yellow', 'boolean': 'yellow', 'undefined': 'grey', 'null': 'bold', 'string': 'green', 'date': 'magenta', // "name": intentionally not styling 'regexp': 'red' }; function stylizeWithColor(str, styleType) { var style = inspect.styles[styleType]; if (style) { return '\u001b[' + inspect.colors[style][0] + 'm' + str + '\u001b[' + inspect.colors[style][1] + 'm'; } else { return str; } } function stylizeNoColor(str, styleType) { return str; } function arrayToHash(array) { var hash = {}; array.forEach(function(val, idx) { hash[val] = true; }); return hash; } function formatValue(ctx, value, recurseTimes) { // Provide a hook for user-specified inspect functions. // Check that value is an object with an inspect function on it if (ctx.customInspect && value && isFunction(value.inspect) && // Filter out the util module, it's inspect function is special value.inspect !== exports.inspect && // Also filter out any prototype objects using the circular check. !(value.constructor && value.constructor.prototype === value)) { var ret = value.inspect(recurseTimes, ctx); if (!isString(ret)) { ret = formatValue(ctx, ret, recurseTimes); } return ret; } // Primitive types cannot have properties var primitive = formatPrimitive(ctx, value); if (primitive) { return primitive; } // Look up the keys of the object. var keys = Object.keys(value); var visibleKeys = arrayToHash(keys); if (ctx.showHidden) { keys = Object.getOwnPropertyNames(value); } // IE doesn't make error fields non-enumerable // http://msdn.microsoft.com/en-us/library/ie/dww52sbt(v=vs.94).aspx if (isError(value) && (keys.indexOf('message') >= 0 || keys.indexOf('description') >= 0)) { return formatError(value); } // Some type of object without properties can be shortcutted. if (keys.length === 0) { if (isFunction(value)) { var name = value.name ? ': ' + value.name : ''; return ctx.stylize('[Function' + name + ']', 'special'); } if (isRegExp(value)) { return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp'); } if (isDate(value)) { return ctx.stylize(Date.prototype.toString.call(value), 'date'); } if (isError(value)) { return formatError(value); } } var base = '', array = false, braces = ['{', '}']; // Make Array say that they are Array if (isArray(value)) { array = true; braces = ['[', ']']; } // Make functions say that they are functions if (isFunction(value)) { var n = value.name ? ': ' + value.name : ''; base = ' [Function' + n + ']'; } // Make RegExps say that they are RegExps if (isRegExp(value)) { base = ' ' + RegExp.prototype.toString.call(value); } // Make dates with properties first say the date if (isDate(value)) { base = ' ' + Date.prototype.toUTCString.call(value); } // Make error with message first say the error if (isError(value)) { base = ' ' + formatError(value); } if (keys.length === 0 && (!array || value.length == 0)) { return braces[0] + base + braces[1]; } if (recurseTimes < 0) { if (isRegExp(value)) { return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp'); } else { return ctx.stylize('[Object]', 'special'); } } ctx.seen.push(value); var output; if (array) { output = formatArray(ctx, value, recurseTimes, visibleKeys, keys); } else { output = keys.map(function(key) { return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array); }); } ctx.seen.pop(); return reduceToSingleString(output, base, braces); } function formatPrimitive(ctx, value) { if (isUndefined(value)) return ctx.stylize('undefined', 'undefined'); if (isString(value)) { var simple = '\'' + JSON.stringify(value).replace(/^"|"$/g, '') .replace(/'/g, "\\'") .replace(/\\"/g, '"') + '\''; return ctx.stylize(simple, 'string'); } if (isNumber(value)) return ctx.stylize('' + value, 'number'); if (isBoolean(value)) return ctx.stylize('' + value, 'boolean'); // For some reason typeof null is "object", so special case here. if (isNull(value)) return ctx.stylize('null', 'null'); } function formatError(value) { return '[' + Error.prototype.toString.call(value) + ']'; } function formatArray(ctx, value, recurseTimes, visibleKeys, keys) { var output = []; for (var i = 0, l = value.length; i < l; ++i) { if (hasOwnProperty(value, String(i))) { output.push(formatProperty(ctx, value, recurseTimes, visibleKeys, String(i), true)); } else { output.push(''); } } keys.forEach(function(key) { if (!key.match(/^\d+$/)) { output.push(formatProperty(ctx, value, recurseTimes, visibleKeys, key, true)); } }); return output; } function formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) { var name, str, desc; desc = Object.getOwnPropertyDescriptor(value, key) || { value: value[key] }; if (desc.get) { if (desc.set) { str = ctx.stylize('[Getter/Setter]', 'special'); } else { str = ctx.stylize('[Getter]', 'special'); } } else { if (desc.set) { str = ctx.stylize('[Setter]', 'special'); } } if (!hasOwnProperty(visibleKeys, key)) { name = '[' + key + ']'; } if (!str) { if (ctx.seen.indexOf(desc.value) < 0) { if (isNull(recurseTimes)) { str = formatValue(ctx, desc.value, null); } else { str = formatValue(ctx, desc.value, recurseTimes - 1); } if (str.indexOf('\n') > -1) { if (array) { str = str.split('\n').map(function(line) { return ' ' + line; }).join('\n').substr(2); } else { str = '\n' + str.split('\n').map(function(line) { return ' ' + line; }).join('\n'); } } } else { str = ctx.stylize('[Circular]', 'special'); } } if (isUndefined(name)) { if (array && key.match(/^\d+$/)) { return str; } name = JSON.stringify('' + key); if (name.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)) { name = name.substr(1, name.length - 2); name = ctx.stylize(name, 'name'); } else { name = name.replace(/'/g, "\\'") .replace(/\\"/g, '"') .replace(/(^"|"$)/g, "'"); name = ctx.stylize(name, 'string'); } } return name + ': ' + str; } function reduceToSingleString(output, base, braces) { var numLinesEst = 0; var length = output.reduce(function(prev, cur) { numLinesEst++; if (cur.indexOf('\n') >= 0) numLinesEst++; return prev + cur.replace(/\u001b\[\d\d?m/g, '').length + 1; }, 0); if (length > 60) { return braces[0] + (base === '' ? '' : base + '\n ') + ' ' + output.join(',\n ') + ' ' + braces[1]; } return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1]; } // NOTE: These type checking functions intentionally don't use `instanceof` // because it is fragile and can be easily faked with `Object.create()`. function isArray(ar) { return Array.isArray(ar); } exports.isArray = isArray; function isBoolean(arg) { return typeof arg === 'boolean'; } exports.isBoolean = isBoolean; function isNull(arg) { return arg === null; } exports.isNull = isNull; function isNullOrUndefined(arg) { return arg == null; } exports.isNullOrUndefined = isNullOrUndefined; function isNumber(arg) { return typeof arg === 'number'; } exports.isNumber = isNumber; function isString(arg) { return typeof arg === 'string'; } exports.isString = isString; function isSymbol(arg) { return typeof arg === 'symbol'; } exports.isSymbol = isSymbol; function isUndefined(arg) { return arg === void 0; } exports.isUndefined = isUndefined; function isRegExp(re) { return isObject(re) && objectToString(re) === '[object RegExp]'; } exports.isRegExp = isRegExp; function isObject(arg) { return typeof arg === 'object' && arg !== null; } exports.isObject = isObject; function isDate(d) { return isObject(d) && objectToString(d) === '[object Date]'; } exports.isDate = isDate; function isError(e) { return isObject(e) && (objectToString(e) === '[object Error]' || e instanceof Error); } exports.isError = isError; function isFunction(arg) { return typeof arg === 'function'; } exports.isFunction = isFunction; function isPrimitive(arg) { return arg === null || typeof arg === 'boolean' || typeof arg === 'number' || typeof arg === 'string' || typeof arg === 'symbol' || // ES6 symbol typeof arg === 'undefined'; } exports.isPrimitive = isPrimitive; exports.isBuffer = require('./support/isBuffer'); function objectToString(o) { return Object.prototype.toString.call(o); } function pad(n) { return n < 10 ? '0' + n.toString(10) : n.toString(10); } var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']; // 26 Feb 16:19:34 function timestamp() { var d = new Date(); var time = [pad(d.getHours()), pad(d.getMinutes()), pad(d.getSeconds())].join(':'); return [d.getDate(), months[d.getMonth()], time].join(' '); } // log is just a thin wrapper to console.log that prepends a timestamp exports.log = function() { console.log('%s - %s', timestamp(), exports.format.apply(exports, arguments)); }; /** * Inherit the prototype methods from one constructor into another. * * The Function.prototype.inherits from lang.js rewritten as a standalone * function (not on Function.prototype). NOTE: If this file is to be loaded * during bootstrapping this function needs to be rewritten using some native * functions as prototype setup using normal JavaScript does not work as * expected during bootstrapping (see mirror.js in r114903). * * @param {function} ctor Constructor function which needs to inherit the * prototype. * @param {function} superCtor Constructor function to inherit prototype from. */ exports.inherits = require('inherits'); exports._extend = function(origin, add) { // Don't do anything if add isn't an object if (!add || !isObject(add)) return origin; var keys = Object.keys(add); var i = keys.length; while (i--) { origin[keys[i]] = add[keys[i]]; } return origin; }; function hasOwnProperty(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); } }).call(this)}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) },{"./support/isBuffer":75,"_process":714,"inherits":74}],77:[function(require,module,exports){ 'use strict' exports.byteLength = byteLength exports.toByteArray = toByteArray exports.fromByteArray = fromByteArray var lookup = [] var revLookup = [] var Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array var code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/' for (var i = 0, len = code.length; i < len; ++i) { lookup[i] = code[i] revLookup[code.charCodeAt(i)] = i } // Support decoding URL-safe base64 strings, as Node.js does. // See: https://en.wikipedia.org/wiki/Base64#URL_applications revLookup['-'.charCodeAt(0)] = 62 revLookup['_'.charCodeAt(0)] = 63 function getLens (b64) { var len = b64.length if (len % 4 > 0) { throw new Error('Invalid string. Length must be a multiple of 4') } // Trim off extra bytes after placeholder bytes are found // See: https://github.com/beatgammit/base64-js/issues/42 var validLen = b64.indexOf('=') if (validLen === -1) validLen = len var placeHoldersLen = validLen === len ? 0 : 4 - (validLen % 4) return [validLen, placeHoldersLen] } // base64 is 4/3 + up to two characters of the original data function byteLength (b64) { var lens = getLens(b64) var validLen = lens[0] var placeHoldersLen = lens[1] return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen } function _byteLength (b64, validLen, placeHoldersLen) { return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen } function toByteArray (b64) { var tmp var lens = getLens(b64) var validLen = lens[0] var placeHoldersLen = lens[1] var arr = new Arr(_byteLength(b64, validLen, placeHoldersLen)) var curByte = 0 // if there are placeholders, only get up to the last complete 4 chars var len = placeHoldersLen > 0 ? validLen - 4 : validLen var i for (i = 0; i < len; i += 4) { tmp = (revLookup[b64.charCodeAt(i)] << 18) | (revLookup[b64.charCodeAt(i + 1)] << 12) | (revLookup[b64.charCodeAt(i + 2)] << 6) | revLookup[b64.charCodeAt(i + 3)] arr[curByte++] = (tmp >> 16) & 0xFF arr[curByte++] = (tmp >> 8) & 0xFF arr[curByte++] = tmp & 0xFF } if (placeHoldersLen === 2) { tmp = (revLookup[b64.charCodeAt(i)] << 2) | (revLookup[b64.charCodeAt(i + 1)] >> 4) arr[curByte++] = tmp & 0xFF } if (placeHoldersLen === 1) { tmp = (revLookup[b64.charCodeAt(i)] << 10) | (revLookup[b64.charCodeAt(i + 1)] << 4) | (revLookup[b64.charCodeAt(i + 2)] >> 2) arr[curByte++] = (tmp >> 8) & 0xFF arr[curByte++] = tmp & 0xFF } return arr } function tripletToBase64 (num) { return lookup[num >> 18 & 0x3F] + lookup[num >> 12 & 0x3F] + lookup[num >> 6 & 0x3F] + lookup[num & 0x3F] } function encodeChunk (uint8, start, end) { var tmp var output = [] for (var i = start; i < end; i += 3) { tmp = ((uint8[i] << 16) & 0xFF0000) + ((uint8[i + 1] << 8) & 0xFF00) + (uint8[i + 2] & 0xFF) output.push(tripletToBase64(tmp)) } return output.join('') } function fromByteArray (uint8) { var tmp var len = uint8.length var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes var parts = [] var maxChunkLength = 16383 // must be multiple of 3 // go through the array every three bytes, we'll deal with trailing stuff later for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) { parts.push(encodeChunk(uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength))) } // pad the end with zeros, but make sure to not forget the extra bytes if (extraBytes === 1) { tmp = uint8[len - 1] parts.push( lookup[tmp >> 2] + lookup[(tmp << 4) & 0x3F] + '==' ) } else if (extraBytes === 2) { tmp = (uint8[len - 2] << 8) + uint8[len - 1] parts.push( lookup[tmp >> 10] + lookup[(tmp >> 4) & 0x3F] + lookup[(tmp << 2) & 0x3F] + '=' ) } return parts.join('') } },{}],78:[function(require,module,exports){ var bigInt = (function (undefined) { "use strict"; var BASE = 1e7, LOG_BASE = 7, MAX_INT = 9007199254740992, MAX_INT_ARR = smallToArray(MAX_INT), DEFAULT_ALPHABET = "0123456789abcdefghijklmnopqrstuvwxyz"; var supportsNativeBigInt = typeof BigInt === "function"; function Integer(v, radix, alphabet, caseSensitive) { if (typeof v === "undefined") return Integer[0]; if (typeof radix !== "undefined") return +radix === 10 && !alphabet ? parseValue(v) : parseBase(v, radix, alphabet, caseSensitive); return parseValue(v); } function BigInteger(value, sign) { this.value = value; this.sign = sign; this.isSmall = false; } BigInteger.prototype = Object.create(Integer.prototype); function SmallInteger(value) { this.value = value; this.sign = value < 0; this.isSmall = true; } SmallInteger.prototype = Object.create(Integer.prototype); function NativeBigInt(value) { this.value = value; } NativeBigInt.prototype = Object.create(Integer.prototype); function isPrecise(n) { return -MAX_INT < n && n < MAX_INT; } function smallToArray(n) { // For performance reasons doesn't reference BASE, need to change this function if BASE changes if (n < 1e7) return [n]; if (n < 1e14) return [n % 1e7, Math.floor(n / 1e7)]; return [n % 1e7, Math.floor(n / 1e7) % 1e7, Math.floor(n / 1e14)]; } function arrayToSmall(arr) { // If BASE changes this function may need to change trim(arr); var length = arr.length; if (length < 4 && compareAbs(arr, MAX_INT_ARR) < 0) { switch (length) { case 0: return 0; case 1: return arr[0]; case 2: return arr[0] + arr[1] * BASE; default: return arr[0] + (arr[1] + arr[2] * BASE) * BASE; } } return arr; } function trim(v) { var i = v.length; while (v[--i] === 0); v.length = i + 1; } function createArray(length) { // function shamelessly stolen from Yaffle's library https://github.com/Yaffle/BigInteger var x = new Array(length); var i = -1; while (++i < length) { x[i] = 0; } return x; } function truncate(n) { if (n > 0) return Math.floor(n); return Math.ceil(n); } function add(a, b) { // assumes a and b are arrays with a.length >= b.length var l_a = a.length, l_b = b.length, r = new Array(l_a), carry = 0, base = BASE, sum, i; for (i = 0; i < l_b; i++) { sum = a[i] + b[i] + carry; carry = sum >= base ? 1 : 0; r[i] = sum - carry * base; } while (i < l_a) { sum = a[i] + carry; carry = sum === base ? 1 : 0; r[i++] = sum - carry * base; } if (carry > 0) r.push(carry); return r; } function addAny(a, b) { if (a.length >= b.length) return add(a, b); return add(b, a); } function addSmall(a, carry) { // assumes a is array, carry is number with 0 <= carry < MAX_INT var l = a.length, r = new Array(l), base = BASE, sum, i; for (i = 0; i < l; i++) { sum = a[i] - base + carry; carry = Math.floor(sum / base); r[i] = sum - carry * base; carry += 1; } while (carry > 0) { r[i++] = carry % base; carry = Math.floor(carry / base); } return r; } BigInteger.prototype.add = function (v) { var n = parseValue(v); if (this.sign !== n.sign) { return this.subtract(n.negate()); } var a = this.value, b = n.value; if (n.isSmall) { return new BigInteger(addSmall(a, Math.abs(b)), this.sign); } return new BigInteger(addAny(a, b), this.sign); }; BigInteger.prototype.plus = BigInteger.prototype.add; SmallInteger.prototype.add = function (v) { var n = parseValue(v); var a = this.value; if (a < 0 !== n.sign) { return this.subtract(n.negate()); } var b = n.value; if (n.isSmall) { if (isPrecise(a + b)) return new SmallInteger(a + b); b = smallToArray(Math.abs(b)); } return new BigInteger(addSmall(b, Math.abs(a)), a < 0); }; SmallInteger.prototype.plus = SmallInteger.prototype.add; NativeBigInt.prototype.add = function (v) { return new NativeBigInt(this.value + parseValue(v).value); } NativeBigInt.prototype.plus = NativeBigInt.prototype.add; function subtract(a, b) { // assumes a and b are arrays with a >= b var a_l = a.length, b_l = b.length, r = new Array(a_l), borrow = 0, base = BASE, i, difference; for (i = 0; i < b_l; i++) { difference = a[i] - borrow - b[i]; if (difference < 0) { difference += base; borrow = 1; } else borrow = 0; r[i] = difference; } for (i = b_l; i < a_l; i++) { difference = a[i] - borrow; if (difference < 0) difference += base; else { r[i++] = difference; break; } r[i] = difference; } for (; i < a_l; i++) { r[i] = a[i]; } trim(r); return r; } function subtractAny(a, b, sign) { var value; if (compareAbs(a, b) >= 0) { value = subtract(a, b); } else { value = subtract(b, a); sign = !sign; } value = arrayToSmall(value); if (typeof value === "number") { if (sign) value = -value; return new SmallInteger(value); } return new BigInteger(value, sign); } function subtractSmall(a, b, sign) { // assumes a is array, b is number with 0 <= b < MAX_INT var l = a.length, r = new Array(l), carry = -b, base = BASE, i, difference; for (i = 0; i < l; i++) { difference = a[i] + carry; carry = Math.floor(difference / base); difference %= base; r[i] = difference < 0 ? difference + base : difference; } r = arrayToSmall(r); if (typeof r === "number") { if (sign) r = -r; return new SmallInteger(r); } return new BigInteger(r, sign); } BigInteger.prototype.subtract = function (v) { var n = parseValue(v); if (this.sign !== n.sign) { return this.add(n.negate()); } var a = this.value, b = n.value; if (n.isSmall) return subtractSmall(a, Math.abs(b), this.sign); return subtractAny(a, b, this.sign); }; BigInteger.prototype.minus = BigInteger.prototype.subtract; SmallInteger.prototype.subtract = function (v) { var n = parseValue(v); var a = this.value; if (a < 0 !== n.sign) { return this.add(n.negate()); } var b = n.value; if (n.isSmall) { return new SmallInteger(a - b); } return subtractSmall(b, Math.abs(a), a >= 0); }; SmallInteger.prototype.minus = SmallInteger.prototype.subtract; NativeBigInt.prototype.subtract = function (v) { return new NativeBigInt(this.value - parseValue(v).value); } NativeBigInt.prototype.minus = NativeBigInt.prototype.subtract; BigInteger.prototype.negate = function () { return new BigInteger(this.value, !this.sign); }; SmallInteger.prototype.negate = function () { var sign = this.sign; var small = new SmallInteger(-this.value); small.sign = !sign; return small; }; NativeBigInt.prototype.negate = function () { return new NativeBigInt(-this.value); } BigInteger.prototype.abs = function () { return new BigInteger(this.value, false); }; SmallInteger.prototype.abs = function () { return new SmallInteger(Math.abs(this.value)); }; NativeBigInt.prototype.abs = function () { return new NativeBigInt(this.value >= 0 ? this.value : -this.value); } function multiplyLong(a, b) { var a_l = a.length, b_l = b.length, l = a_l + b_l, r = createArray(l), base = BASE, product, carry, i, a_i, b_j; for (i = 0; i < a_l; ++i) { a_i = a[i]; for (var j = 0; j < b_l; ++j) { b_j = b[j]; product = a_i * b_j + r[i + j]; carry = Math.floor(product / base); r[i + j] = product - carry * base; r[i + j + 1] += carry; } } trim(r); return r; } function multiplySmall(a, b) { // assumes a is array, b is number with |b| < BASE var l = a.length, r = new Array(l), base = BASE, carry = 0, product, i; for (i = 0; i < l; i++) { product = a[i] * b + carry; carry = Math.floor(product / base); r[i] = product - carry * base; } while (carry > 0) { r[i++] = carry % base; carry = Math.floor(carry / base); } return r; } function shiftLeft(x, n) { var r = []; while (n-- > 0) r.push(0); return r.concat(x); } function multiplyKaratsuba(x, y) { var n = Math.max(x.length, y.length); if (n <= 30) return multiplyLong(x, y); n = Math.ceil(n / 2); var b = x.slice(n), a = x.slice(0, n), d = y.slice(n), c = y.slice(0, n); var ac = multiplyKaratsuba(a, c), bd = multiplyKaratsuba(b, d), abcd = multiplyKaratsuba(addAny(a, b), addAny(c, d)); var product = addAny(addAny(ac, shiftLeft(subtract(subtract(abcd, ac), bd), n)), shiftLeft(bd, 2 * n)); trim(product); return product; } // The following function is derived from a surface fit of a graph plotting the performance difference // between long multiplication and karatsuba multiplication versus the lengths of the two arrays. function useKaratsuba(l1, l2) { return -0.012 * l1 - 0.012 * l2 + 0.000015 * l1 * l2 > 0; } BigInteger.prototype.multiply = function (v) { var n = parseValue(v), a = this.value, b = n.value, sign = this.sign !== n.sign, abs; if (n.isSmall) { if (b === 0) return Integer[0]; if (b === 1) return this; if (b === -1) return this.negate(); abs = Math.abs(b); if (abs < BASE) { return new BigInteger(multiplySmall(a, abs), sign); } b = smallToArray(abs); } if (useKaratsuba(a.length, b.length)) // Karatsuba is only faster for certain array sizes return new BigInteger(multiplyKaratsuba(a, b), sign); return new BigInteger(multiplyLong(a, b), sign); }; BigInteger.prototype.times = BigInteger.prototype.multiply; function multiplySmallAndArray(a, b, sign) { // a >= 0 if (a < BASE) { return new BigInteger(multiplySmall(b, a), sign); } return new BigInteger(multiplyLong(b, smallToArray(a)), sign); } SmallInteger.prototype._multiplyBySmall = function (a) { if (isPrecise(a.value * this.value)) { return new SmallInteger(a.value * this.value); } return multiplySmallAndArray(Math.abs(a.value), smallToArray(Math.abs(this.value)), this.sign !== a.sign); }; BigInteger.prototype._multiplyBySmall = function (a) { if (a.value === 0) return Integer[0]; if (a.value === 1) return this; if (a.value === -1) return this.negate(); return multiplySmallAndArray(Math.abs(a.value), this.value, this.sign !== a.sign); }; SmallInteger.prototype.multiply = function (v) { return parseValue(v)._multiplyBySmall(this); }; SmallInteger.prototype.times = SmallInteger.prototype.multiply; NativeBigInt.prototype.multiply = function (v) { return new NativeBigInt(this.value * parseValue(v).value); } NativeBigInt.prototype.times = NativeBigInt.prototype.multiply; function square(a) { //console.assert(2 * BASE * BASE < MAX_INT); var l = a.length, r = createArray(l + l), base = BASE, product, carry, i, a_i, a_j; for (i = 0; i < l; i++) { a_i = a[i]; carry = 0 - a_i * a_i; for (var j = i; j < l; j++) { a_j = a[j]; product = 2 * (a_i * a_j) + r[i + j] + carry; carry = Math.floor(product / base); r[i + j] = product - carry * base; } r[i + l] = carry; } trim(r); return r; } BigInteger.prototype.square = function () { return new BigInteger(square(this.value), false); }; SmallInteger.prototype.square = function () { var value = this.value * this.value; if (isPrecise(value)) return new SmallInteger(value); return new BigInteger(square(smallToArray(Math.abs(this.value))), false); }; NativeBigInt.prototype.square = function (v) { return new NativeBigInt(this.value * this.value); } function divMod1(a, b) { // Left over from previous version. Performs faster than divMod2 on smaller input sizes. var a_l = a.length, b_l = b.length, base = BASE, result = createArray(b.length), divisorMostSignificantDigit = b[b_l - 1], // normalization lambda = Math.ceil(base / (2 * divisorMostSignificantDigit)), remainder = multiplySmall(a, lambda), divisor = multiplySmall(b, lambda), quotientDigit, shift, carry, borrow, i, l, q; if (remainder.length <= a_l) remainder.push(0); divisor.push(0); divisorMostSignificantDigit = divisor[b_l - 1]; for (shift = a_l - b_l; shift >= 0; shift--) { quotientDigit = base - 1; if (remainder[shift + b_l] !== divisorMostSignificantDigit) { quotientDigit = Math.floor((remainder[shift + b_l] * base + remainder[shift + b_l - 1]) / divisorMostSignificantDigit); } // quotientDigit <= base - 1 carry = 0; borrow = 0; l = divisor.length; for (i = 0; i < l; i++) { carry += quotientDigit * divisor[i]; q = Math.floor(carry / base); borrow += remainder[shift + i] - (carry - q * base); carry = q; if (borrow < 0) { remainder[shift + i] = borrow + base; borrow = -1; } else { remainder[shift + i] = borrow; borrow = 0; } } while (borrow !== 0) { quotientDigit -= 1; carry = 0; for (i = 0; i < l; i++) { carry += remainder[shift + i] - base + divisor[i]; if (carry < 0) { remainder[shift + i] = carry + base; carry = 0; } else { remainder[shift + i] = carry; carry = 1; } } borrow += carry; } result[shift] = quotientDigit; } // denormalization remainder = divModSmall(remainder, lambda)[0]; return [arrayToSmall(result), arrayToSmall(remainder)]; } function divMod2(a, b) { // Implementation idea shamelessly stolen from Silent Matt's library http://silentmatt.com/biginteger/ // Performs faster than divMod1 on larger input sizes. var a_l = a.length, b_l = b.length, result = [], part = [], base = BASE, guess, xlen, highx, highy, check; while (a_l) { part.unshift(a[--a_l]); trim(part); if (compareAbs(part, b) < 0) { result.push(0); continue; } xlen = part.length; highx = part[xlen - 1] * base + part[xlen - 2]; highy = b[b_l - 1] * base + b[b_l - 2]; if (xlen > b_l) { highx = (highx + 1) * base; } guess = Math.ceil(highx / highy); do { check = multiplySmall(b, guess); if (compareAbs(check, part) <= 0) break; guess--; } while (guess); result.push(guess); part = subtract(part, check); } result.reverse(); return [arrayToSmall(result), arrayToSmall(part)]; } function divModSmall(value, lambda) { var length = value.length, quotient = createArray(length), base = BASE, i, q, remainder, divisor; remainder = 0; for (i = length - 1; i >= 0; --i) { divisor = remainder * base + value[i]; q = truncate(divisor / lambda); remainder = divisor - q * lambda; quotient[i] = q | 0; } return [quotient, remainder | 0]; } function divModAny(self, v) { var value, n = parseValue(v); if (supportsNativeBigInt) { return [new NativeBigInt(self.value / n.value), new NativeBigInt(self.value % n.value)]; } var a = self.value, b = n.value; var quotient; if (b === 0) throw new Error("Cannot divide by zero"); if (self.isSmall) { if (n.isSmall) { return [new SmallInteger(truncate(a / b)), new SmallInteger(a % b)]; } return [Integer[0], self]; } if (n.isSmall) { if (b === 1) return [self, Integer[0]]; if (b == -1) return [self.negate(), Integer[0]]; var abs = Math.abs(b); if (abs < BASE) { value = divModSmall(a, abs); quotient = arrayToSmall(value[0]); var remainder = value[1]; if (self.sign) remainder = -remainder; if (typeof quotient === "number") { if (self.sign !== n.sign) quotient = -quotient; return [new SmallInteger(quotient), new SmallInteger(remainder)]; } return [new BigInteger(quotient, self.sign !== n.sign), new SmallInteger(remainder)]; } b = smallToArray(abs); } var comparison = compareAbs(a, b); if (comparison === -1) return [Integer[0], self]; if (comparison === 0) return [Integer[self.sign === n.sign ? 1 : -1], Integer[0]]; // divMod1 is faster on smaller input sizes if (a.length + b.length <= 200) value = divMod1(a, b); else value = divMod2(a, b); quotient = value[0]; var qSign = self.sign !== n.sign, mod = value[1], mSign = self.sign; if (typeof quotient === "number") { if (qSign) quotient = -quotient; quotient = new SmallInteger(quotient); } else quotient = new BigInteger(quotient, qSign); if (typeof mod === "number") { if (mSign) mod = -mod; mod = new SmallInteger(mod); } else mod = new BigInteger(mod, mSign); return [quotient, mod]; } BigInteger.prototype.divmod = function (v) { var result = divModAny(this, v); return { quotient: result[0], remainder: result[1] }; }; NativeBigInt.prototype.divmod = SmallInteger.prototype.divmod = BigInteger.prototype.divmod; BigInteger.prototype.divide = function (v) { return divModAny(this, v)[0]; }; NativeBigInt.prototype.over = NativeBigInt.prototype.divide = function (v) { return new NativeBigInt(this.value / parseValue(v).value); }; SmallInteger.prototype.over = SmallInteger.prototype.divide = BigInteger.prototype.over = BigInteger.prototype.divide; BigInteger.prototype.mod = function (v) { return divModAny(this, v)[1]; }; NativeBigInt.prototype.mod = NativeBigInt.prototype.remainder = function (v) { return new NativeBigInt(this.value % parseValue(v).value); }; SmallInteger.prototype.remainder = SmallInteger.prototype.mod = BigInteger.prototype.remainder = BigInteger.prototype.mod; BigInteger.prototype.pow = function (v) { var n = parseValue(v), a = this.value, b = n.value, value, x, y; if (b === 0) return Integer[1]; if (a === 0) return Integer[0]; if (a === 1) return Integer[1]; if (a === -1) return n.isEven() ? Integer[1] : Integer[-1]; if (n.sign) { return Integer[0]; } if (!n.isSmall) throw new Error("The exponent " + n.toString() + " is too large."); if (this.isSmall) { if (isPrecise(value = Math.pow(a, b))) return new SmallInteger(truncate(value)); } x = this; y = Integer[1]; while (true) { if (b & 1 === 1) { y = y.times(x); --b; } if (b === 0) break; b /= 2; x = x.square(); } return y; }; SmallInteger.prototype.pow = BigInteger.prototype.pow; NativeBigInt.prototype.pow = function (v) { var n = parseValue(v); var a = this.value, b = n.value; var _0 = BigInt(0), _1 = BigInt(1), _2 = BigInt(2); if (b === _0) return Integer[1]; if (a === _0) return Integer[0]; if (a === _1) return Integer[1]; if (a === BigInt(-1)) return n.isEven() ? Integer[1] : Integer[-1]; if (n.isNegative()) return new NativeBigInt(_0); var x = this; var y = Integer[1]; while (true) { if ((b & _1) === _1) { y = y.times(x); --b; } if (b === _0) break; b /= _2; x = x.square(); } return y; } BigInteger.prototype.modPow = function (exp, mod) { exp = parseValue(exp); mod = parseValue(mod); if (mod.isZero()) throw new Error("Cannot take modPow with modulus 0"); var r = Integer[1], base = this.mod(mod); if (exp.isNegative()) { exp = exp.multiply(Integer[-1]); base = base.modInv(mod); } while (exp.isPositive()) { if (base.isZero()) return Integer[0]; if (exp.isOdd()) r = r.multiply(base).mod(mod); exp = exp.divide(2); base = base.square().mod(mod); } return r; }; NativeBigInt.prototype.modPow = SmallInteger.prototype.modPow = BigInteger.prototype.modPow; function compareAbs(a, b) { if (a.length !== b.length) { return a.length > b.length ? 1 : -1; } for (var i = a.length - 1; i >= 0; i--) { if (a[i] !== b[i]) return a[i] > b[i] ? 1 : -1; } return 0; } BigInteger.prototype.compareAbs = function (v) { var n = parseValue(v), a = this.value, b = n.value; if (n.isSmall) return 1; return compareAbs(a, b); }; SmallInteger.prototype.compareAbs = function (v) { var n = parseValue(v), a = Math.abs(this.value), b = n.value; if (n.isSmall) { b = Math.abs(b); return a === b ? 0 : a > b ? 1 : -1; } return -1; }; NativeBigInt.prototype.compareAbs = function (v) { var a = this.value; var b = parseValue(v).value; a = a >= 0 ? a : -a; b = b >= 0 ? b : -b; return a === b ? 0 : a > b ? 1 : -1; } BigInteger.prototype.compare = function (v) { // See discussion about comparison with Infinity: // https://github.com/peterolson/BigInteger.js/issues/61 if (v === Infinity) { return -1; } if (v === -Infinity) { return 1; } var n = parseValue(v), a = this.value, b = n.value; if (this.sign !== n.sign) { return n.sign ? 1 : -1; } if (n.isSmall) { return this.sign ? -1 : 1; } return compareAbs(a, b) * (this.sign ? -1 : 1); }; BigInteger.prototype.compareTo = BigInteger.prototype.compare; SmallInteger.prototype.compare = function (v) { if (v === Infinity) { return -1; } if (v === -Infinity) { return 1; } var n = parseValue(v), a = this.value, b = n.value; if (n.isSmall) { return a == b ? 0 : a > b ? 1 : -1; } if (a < 0 !== n.sign) { return a < 0 ? -1 : 1; } return a < 0 ? 1 : -1; }; SmallInteger.prototype.compareTo = SmallInteger.prototype.compare; NativeBigInt.prototype.compare = function (v) { if (v === Infinity) { return -1; } if (v === -Infinity) { return 1; } var a = this.value; var b = parseValue(v).value; return a === b ? 0 : a > b ? 1 : -1; } NativeBigInt.prototype.compareTo = NativeBigInt.prototype.compare; BigInteger.prototype.equals = function (v) { return this.compare(v) === 0; }; NativeBigInt.prototype.eq = NativeBigInt.prototype.equals = SmallInteger.prototype.eq = SmallInteger.prototype.equals = BigInteger.prototype.eq = BigInteger.prototype.equals; BigInteger.prototype.notEquals = function (v) { return this.compare(v) !== 0; }; NativeBigInt.prototype.neq = NativeBigInt.prototype.notEquals = SmallInteger.prototype.neq = SmallInteger.prototype.notEquals = BigInteger.prototype.neq = BigInteger.prototype.notEquals; BigInteger.prototype.greater = function (v) { return this.compare(v) > 0; }; NativeBigInt.prototype.gt = NativeBigInt.prototype.greater = SmallInteger.prototype.gt = SmallInteger.prototype.greater = BigInteger.prototype.gt = BigInteger.prototype.greater; BigInteger.prototype.lesser = function (v) { return this.compare(v) < 0; }; NativeBigInt.prototype.lt = NativeBigInt.prototype.lesser = SmallInteger.prototype.lt = SmallInteger.prototype.lesser = BigInteger.prototype.lt = BigInteger.prototype.lesser; BigInteger.prototype.greaterOrEquals = function (v) { return this.compare(v) >= 0; }; NativeBigInt.prototype.geq = NativeBigInt.prototype.greaterOrEquals = SmallInteger.prototype.geq = SmallInteger.prototype.greaterOrEquals = BigInteger.prototype.geq = BigInteger.prototype.greaterOrEquals; BigInteger.prototype.lesserOrEquals = function (v) { return this.compare(v) <= 0; }; NativeBigInt.prototype.leq = NativeBigInt.prototype.lesserOrEquals = SmallInteger.prototype.leq = SmallInteger.prototype.lesserOrEquals = BigInteger.prototype.leq = BigInteger.prototype.lesserOrEquals; BigInteger.prototype.isEven = function () { return (this.value[0] & 1) === 0; }; SmallInteger.prototype.isEven = function () { return (this.value & 1) === 0; }; NativeBigInt.prototype.isEven = function () { return (this.value & BigInt(1)) === BigInt(0); } BigInteger.prototype.isOdd = function () { return (this.value[0] & 1) === 1; }; SmallInteger.prototype.isOdd = function () { return (this.value & 1) === 1; }; NativeBigInt.prototype.isOdd = function () { return (this.value & BigInt(1)) === BigInt(1); } BigInteger.prototype.isPositive = function () { return !this.sign; }; SmallInteger.prototype.isPositive = function () { return this.value > 0; }; NativeBigInt.prototype.isPositive = SmallInteger.prototype.isPositive; BigInteger.prototype.isNegative = function () { return this.sign; }; SmallInteger.prototype.isNegative = function () { return this.value < 0; }; NativeBigInt.prototype.isNegative = SmallInteger.prototype.isNegative; BigInteger.prototype.isUnit = function () { return false; }; SmallInteger.prototype.isUnit = function () { return Math.abs(this.value) === 1; }; NativeBigInt.prototype.isUnit = function () { return this.abs().value === BigInt(1); } BigInteger.prototype.isZero = function () { return false; }; SmallInteger.prototype.isZero = function () { return this.value === 0; }; NativeBigInt.prototype.isZero = function () { return this.value === BigInt(0); } BigInteger.prototype.isDivisibleBy = function (v) { var n = parseValue(v); if (n.isZero()) return false; if (n.isUnit()) return true; if (n.compareAbs(2) === 0) return this.isEven(); return this.mod(n).isZero(); }; NativeBigInt.prototype.isDivisibleBy = SmallInteger.prototype.isDivisibleBy = BigInteger.prototype.isDivisibleBy; function isBasicPrime(v) { var n = v.abs(); if (n.isUnit()) return false; if (n.equals(2) || n.equals(3) || n.equals(5)) return true; if (n.isEven() || n.isDivisibleBy(3) || n.isDivisibleBy(5)) return false; if (n.lesser(49)) return true; // we don't know if it's prime: let the other functions figure it out } function millerRabinTest(n, a) { var nPrev = n.prev(), b = nPrev, r = 0, d, t, i, x; while (b.isEven()) b = b.divide(2), r++; next: for (i = 0; i < a.length; i++) { if (n.lesser(a[i])) continue; x = bigInt(a[i]).modPow(b, n); if (x.isUnit() || x.equals(nPrev)) continue; for (d = r - 1; d != 0; d--) { x = x.square().mod(n); if (x.isUnit()) return false; if (x.equals(nPrev)) continue next; } return false; } return true; } // Set "strict" to true to force GRH-supported lower bound of 2*log(N)^2 BigInteger.prototype.isPrime = function (strict) { var isPrime = isBasicPrime(this); if (isPrime !== undefined) return isPrime; var n = this.abs(); var bits = n.bitLength(); if (bits <= 64) return millerRabinTest(n, [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37]); var logN = Math.log(2) * bits.toJSNumber(); var t = Math.ceil((strict === true) ? (2 * Math.pow(logN, 2)) : logN); for (var a = [], i = 0; i < t; i++) { a.push(bigInt(i + 2)); } return millerRabinTest(n, a); }; NativeBigInt.prototype.isPrime = SmallInteger.prototype.isPrime = BigInteger.prototype.isPrime; BigInteger.prototype.isProbablePrime = function (iterations, rng) { var isPrime = isBasicPrime(this); if (isPrime !== undefined) return isPrime; var n = this.abs(); var t = iterations === undefined ? 5 : iterations; for (var a = [], i = 0; i < t; i++) { a.push(bigInt.randBetween(2, n.minus(2), rng)); } return millerRabinTest(n, a); }; NativeBigInt.prototype.isProbablePrime = SmallInteger.prototype.isProbablePrime = BigInteger.prototype.isProbablePrime; BigInteger.prototype.modInv = function (n) { var t = bigInt.zero, newT = bigInt.one, r = parseValue(n), newR = this.abs(), q, lastT, lastR; while (!newR.isZero()) { q = r.divide(newR); lastT = t; lastR = r; t = newT; r = newR; newT = lastT.subtract(q.multiply(newT)); newR = lastR.subtract(q.multiply(newR)); } if (!r.isUnit()) throw new Error(this.toString() + " and " + n.toString() + " are not co-prime"); if (t.compare(0) === -1) { t = t.add(n); } if (this.isNegative()) { return t.negate(); } return t; }; NativeBigInt.prototype.modInv = SmallInteger.prototype.modInv = BigInteger.prototype.modInv; BigInteger.prototype.next = function () { var value = this.value; if (this.sign) { return subtractSmall(value, 1, this.sign); } return new BigInteger(addSmall(value, 1), this.sign); }; SmallInteger.prototype.next = function () { var value = this.value; if (value + 1 < MAX_INT) return new SmallInteger(value + 1); return new BigInteger(MAX_INT_ARR, false); }; NativeBigInt.prototype.next = function () { return new NativeBigInt(this.value + BigInt(1)); } BigInteger.prototype.prev = function () { var value = this.value; if (this.sign) { return new BigInteger(addSmall(value, 1), true); } return subtractSmall(value, 1, this.sign); }; SmallInteger.prototype.prev = function () { var value = this.value; if (value - 1 > -MAX_INT) return new SmallInteger(value - 1); return new BigInteger(MAX_INT_ARR, true); }; NativeBigInt.prototype.prev = function () { return new NativeBigInt(this.value - BigInt(1)); } var powersOfTwo = [1]; while (2 * powersOfTwo[powersOfTwo.length - 1] <= BASE) powersOfTwo.push(2 * powersOfTwo[powersOfTwo.length - 1]); var powers2Length = powersOfTwo.length, highestPower2 = powersOfTwo[powers2Length - 1]; function shift_isSmall(n) { return Math.abs(n) <= BASE; } BigInteger.prototype.shiftLeft = function (v) { var n = parseValue(v).toJSNumber(); if (!shift_isSmall(n)) { throw new Error(String(n) + " is too large for shifting."); } if (n < 0) return this.shiftRight(-n); var result = this; if (result.isZero()) return result; while (n >= powers2Length) { result = result.multiply(highestPower2); n -= powers2Length - 1; } return result.multiply(powersOfTwo[n]); }; NativeBigInt.prototype.shiftLeft = SmallInteger.prototype.shiftLeft = BigInteger.prototype.shiftLeft; BigInteger.prototype.shiftRight = function (v) { var remQuo; var n = parseValue(v).toJSNumber(); if (!shift_isSmall(n)) { throw new Error(String(n) + " is too large for shifting."); } if (n < 0) return this.shiftLeft(-n); var result = this; while (n >= powers2Length) { if (result.isZero() || (result.isNegative() && result.isUnit())) return result; remQuo = divModAny(result, highestPower2); result = remQuo[1].isNegative() ? remQuo[0].prev() : remQuo[0]; n -= powers2Length - 1; } remQuo = divModAny(result, powersOfTwo[n]); return remQuo[1].isNegative() ? remQuo[0].prev() : remQuo[0]; }; NativeBigInt.prototype.shiftRight = SmallInteger.prototype.shiftRight = BigInteger.prototype.shiftRight; function bitwise(x, y, fn) { y = parseValue(y); var xSign = x.isNegative(), ySign = y.isNegative(); var xRem = xSign ? x.not() : x, yRem = ySign ? y.not() : y; var xDigit = 0, yDigit = 0; var xDivMod = null, yDivMod = null; var result = []; while (!xRem.isZero() || !yRem.isZero()) { xDivMod = divModAny(xRem, highestPower2); xDigit = xDivMod[1].toJSNumber(); if (xSign) { xDigit = highestPower2 - 1 - xDigit; // two's complement for negative numbers } yDivMod = divModAny(yRem, highestPower2); yDigit = yDivMod[1].toJSNumber(); if (ySign) { yDigit = highestPower2 - 1 - yDigit; // two's complement for negative numbers } xRem = xDivMod[0]; yRem = yDivMod[0]; result.push(fn(xDigit, yDigit)); } var sum = fn(xSign ? 1 : 0, ySign ? 1 : 0) !== 0 ? bigInt(-1) : bigInt(0); for (var i = result.length - 1; i >= 0; i -= 1) { sum = sum.multiply(highestPower2).add(bigInt(result[i])); } return sum; } BigInteger.prototype.not = function () { return this.negate().prev(); }; NativeBigInt.prototype.not = SmallInteger.prototype.not = BigInteger.prototype.not; BigInteger.prototype.and = function (n) { return bitwise(this, n, function (a, b) { return a & b; }); }; NativeBigInt.prototype.and = SmallInteger.prototype.and = BigInteger.prototype.and; BigInteger.prototype.or = function (n) { return bitwise(this, n, function (a, b) { return a | b; }); }; NativeBigInt.prototype.or = SmallInteger.prototype.or = BigInteger.prototype.or; BigInteger.prototype.xor = function (n) { return bitwise(this, n, function (a, b) { return a ^ b; }); }; NativeBigInt.prototype.xor = SmallInteger.prototype.xor = BigInteger.prototype.xor; var LOBMASK_I = 1 << 30, LOBMASK_BI = (BASE & -BASE) * (BASE & -BASE) | LOBMASK_I; function roughLOB(n) { // get lowestOneBit (rough) // SmallInteger: return Min(lowestOneBit(n), 1 << 30) // BigInteger: return Min(lowestOneBit(n), 1 << 14) [BASE=1e7] var v = n.value, x = typeof v === "number" ? v | LOBMASK_I : typeof v === "bigint" ? v | BigInt(LOBMASK_I) : v[0] + v[1] * BASE | LOBMASK_BI; return x & -x; } function integerLogarithm(value, base) { if (base.compareTo(value) <= 0) { var tmp = integerLogarithm(value, base.square(base)); var p = tmp.p; var e = tmp.e; var t = p.multiply(base); return t.compareTo(value) <= 0 ? { p: t, e: e * 2 + 1 } : { p: p, e: e * 2 }; } return { p: bigInt(1), e: 0 }; } BigInteger.prototype.bitLength = function () { var n = this; if (n.compareTo(bigInt(0)) < 0) { n = n.negate().subtract(bigInt(1)); } if (n.compareTo(bigInt(0)) === 0) { return bigInt(0); } return bigInt(integerLogarithm(n, bigInt(2)).e).add(bigInt(1)); } NativeBigInt.prototype.bitLength = SmallInteger.prototype.bitLength = BigInteger.prototype.bitLength; function max(a, b) { a = parseValue(a); b = parseValue(b); return a.greater(b) ? a : b; } function min(a, b) { a = parseValue(a); b = parseValue(b); return a.lesser(b) ? a : b; } function gcd(a, b) { a = parseValue(a).abs(); b = parseValue(b).abs(); if (a.equals(b)) return a; if (a.isZero()) return b; if (b.isZero()) return a; var c = Integer[1], d, t; while (a.isEven() && b.isEven()) { d = min(roughLOB(a), roughLOB(b)); a = a.divide(d); b = b.divide(d); c = c.multiply(d); } while (a.isEven()) { a = a.divide(roughLOB(a)); } do { while (b.isEven()) { b = b.divide(roughLOB(b)); } if (a.greater(b)) { t = b; b = a; a = t; } b = b.subtract(a); } while (!b.isZero()); return c.isUnit() ? a : a.multiply(c); } function lcm(a, b) { a = parseValue(a).abs(); b = parseValue(b).abs(); return a.divide(gcd(a, b)).multiply(b); } function randBetween(a, b, rng) { a = parseValue(a); b = parseValue(b); var usedRNG = rng || Math.random; var low = min(a, b), high = max(a, b); var range = high.subtract(low).add(1); if (range.isSmall) return low.add(Math.floor(usedRNG() * range)); var digits = toBase(range, BASE).value; var result = [], restricted = true; for (var i = 0; i < digits.length; i++) { var top = restricted ? digits[i] + (i + 1 < digits.length ? digits[i + 1] / BASE : 0) : BASE; var digit = truncate(usedRNG() * top); result.push(digit); if (digit < digits[i]) restricted = false; } return low.add(Integer.fromArray(result, BASE, false)); } var parseBase = function (text, base, alphabet, caseSensitive) { alphabet = alphabet || DEFAULT_ALPHABET; text = String(text); if (!caseSensitive) { text = text.toLowerCase(); alphabet = alphabet.toLowerCase(); } var length = text.length; var i; var absBase = Math.abs(base); var alphabetValues = {}; for (i = 0; i < alphabet.length; i++) { alphabetValues[alphabet[i]] = i; } for (i = 0; i < length; i++) { var c = text[i]; if (c === "-") continue; if (c in alphabetValues) { if (alphabetValues[c] >= absBase) { if (c === "1" && absBase === 1) continue; throw new Error(c + " is not a valid digit in base " + base + "."); } } } base = parseValue(base); var digits = []; var isNegative = text[0] === "-"; for (i = isNegative ? 1 : 0; i < text.length; i++) { var c = text[i]; if (c in alphabetValues) digits.push(parseValue(alphabetValues[c])); else if (c === "<") { var start = i; do { i++; } while (text[i] !== ">" && i < text.length); digits.push(parseValue(text.slice(start + 1, i))); } else throw new Error(c + " is not a valid character"); } return parseBaseFromArray(digits, base, isNegative); }; function parseBaseFromArray(digits, base, isNegative) { var val = Integer[0], pow = Integer[1], i; for (i = digits.length - 1; i >= 0; i--) { val = val.add(digits[i].times(pow)); pow = pow.times(base); } return isNegative ? val.negate() : val; } function stringify(digit, alphabet) { alphabet = alphabet || DEFAULT_ALPHABET; if (digit < alphabet.length) { return alphabet[digit]; } return "<" + digit + ">"; } function toBase(n, base) { base = bigInt(base); if (base.isZero()) { if (n.isZero()) return { value: [0], isNegative: false }; throw new Error("Cannot convert nonzero numbers to base 0."); } if (base.equals(-1)) { if (n.isZero()) return { value: [0], isNegative: false }; if (n.isNegative()) return { value: [].concat.apply([], Array.apply(null, Array(-n.toJSNumber())) .map(Array.prototype.valueOf, [1, 0]) ), isNegative: false }; var arr = Array.apply(null, Array(n.toJSNumber() - 1)) .map(Array.prototype.valueOf, [0, 1]); arr.unshift([1]); return { value: [].concat.apply([], arr), isNegative: false }; } var neg = false; if (n.isNegative() && base.isPositive()) { neg = true; n = n.abs(); } if (base.isUnit()) { if (n.isZero()) return { value: [0], isNegative: false }; return { value: Array.apply(null, Array(n.toJSNumber())) .map(Number.prototype.valueOf, 1), isNegative: neg }; } var out = []; var left = n, divmod; while (left.isNegative() || left.compareAbs(base) >= 0) { divmod = left.divmod(base); left = divmod.quotient; var digit = divmod.remainder; if (digit.isNegative()) { digit = base.minus(digit).abs(); left = left.next(); } out.push(digit.toJSNumber()); } out.push(left.toJSNumber()); return { value: out.reverse(), isNegative: neg }; } function toBaseString(n, base, alphabet) { var arr = toBase(n, base); return (arr.isNegative ? "-" : "") + arr.value.map(function (x) { return stringify(x, alphabet); }).join(''); } BigInteger.prototype.toArray = function (radix) { return toBase(this, radix); }; SmallInteger.prototype.toArray = function (radix) { return toBase(this, radix); }; NativeBigInt.prototype.toArray = function (radix) { return toBase(this, radix); }; BigInteger.prototype.toString = function (radix, alphabet) { if (radix === undefined) radix = 10; if (radix !== 10) return toBaseString(this, radix, alphabet); var v = this.value, l = v.length, str = String(v[--l]), zeros = "0000000", digit; while (--l >= 0) { digit = String(v[l]); str += zeros.slice(digit.length) + digit; } var sign = this.sign ? "-" : ""; return sign + str; }; SmallInteger.prototype.toString = function (radix, alphabet) { if (radix === undefined) radix = 10; if (radix != 10) return toBaseString(this, radix, alphabet); return String(this.value); }; NativeBigInt.prototype.toString = SmallInteger.prototype.toString; NativeBigInt.prototype.toJSON = BigInteger.prototype.toJSON = SmallInteger.prototype.toJSON = function () { return this.toString(); } BigInteger.prototype.valueOf = function () { return parseInt(this.toString(), 10); }; BigInteger.prototype.toJSNumber = BigInteger.prototype.valueOf; SmallInteger.prototype.valueOf = function () { return this.value; }; SmallInteger.prototype.toJSNumber = SmallInteger.prototype.valueOf; NativeBigInt.prototype.valueOf = NativeBigInt.prototype.toJSNumber = function () { return parseInt(this.toString(), 10); } function parseStringValue(v) { if (isPrecise(+v)) { var x = +v; if (x === truncate(x)) return supportsNativeBigInt ? new NativeBigInt(BigInt(x)) : new SmallInteger(x); throw new Error("Invalid integer: " + v); } var sign = v[0] === "-"; if (sign) v = v.slice(1); var split = v.split(/e/i); if (split.length > 2) throw new Error("Invalid integer: " + split.join("e")); if (split.length === 2) { var exp = split[1]; if (exp[0] === "+") exp = exp.slice(1); exp = +exp; if (exp !== truncate(exp) || !isPrecise(exp)) throw new Error("Invalid integer: " + exp + " is not a valid exponent."); var text = split[0]; var decimalPlace = text.indexOf("."); if (decimalPlace >= 0) { exp -= text.length - decimalPlace - 1; text = text.slice(0, decimalPlace) + text.slice(decimalPlace + 1); } if (exp < 0) throw new Error("Cannot include negative exponent part for integers"); text += (new Array(exp + 1)).join("0"); v = text; } var isValid = /^([0-9][0-9]*)$/.test(v); if (!isValid) throw new Error("Invalid integer: " + v); if (supportsNativeBigInt) { return new NativeBigInt(BigInt(sign ? "-" + v : v)); } var r = [], max = v.length, l = LOG_BASE, min = max - l; while (max > 0) { r.push(+v.slice(min, max)); min -= l; if (min < 0) min = 0; max -= l; } trim(r); return new BigInteger(r, sign); } function parseNumberValue(v) { if (supportsNativeBigInt) { return new NativeBigInt(BigInt(v)); } if (isPrecise(v)) { if (v !== truncate(v)) throw new Error(v + " is not an integer."); return new SmallInteger(v); } return parseStringValue(v.toString()); } function parseValue(v) { if (typeof v === "number") { return parseNumberValue(v); } if (typeof v === "string") { return parseStringValue(v); } if (typeof v === "bigint") { return new NativeBigInt(v); } return v; } // Pre-define numbers in range [-999,999] for (var i = 0; i < 1000; i++) { Integer[i] = parseValue(i); if (i > 0) Integer[-i] = parseValue(-i); } // Backwards compatibility Integer.one = Integer[1]; Integer.zero = Integer[0]; Integer.minusOne = Integer[-1]; Integer.max = max; Integer.min = min; Integer.gcd = gcd; Integer.lcm = lcm; Integer.isInstance = function (x) { return x instanceof BigInteger || x instanceof SmallInteger || x instanceof NativeBigInt; }; Integer.randBetween = randBetween; Integer.fromArray = function (digits, base, isNegative) { return parseBaseFromArray(digits.map(parseValue), parseValue(base || 10), isNegative); }; return Integer; })(); // Node.js check if (typeof module !== "undefined" && module.hasOwnProperty("exports")) { module.exports = bigInt; } //amd check if (typeof define === "function" && define.amd) { define( function () { return bigInt; }); } },{}],79:[function(require,module,exports){ (function (Buffer){(function (){ (function (root) { /********************************************************** * * BitView * * BitView provides a similar interface to the standard * DataView, but with support for bit-level reads / writes. * **********************************************************/ var BitView = function (source, byteOffset, byteLength) { var isBuffer = source instanceof ArrayBuffer || (typeof Buffer !== 'undefined' && source instanceof Buffer); if (!isBuffer) { throw new Error('Must specify a valid ArrayBuffer or Buffer.'); } byteOffset = byteOffset || 0; byteLength = byteLength || source.byteLength /* ArrayBuffer */ || source.length /* Buffer */; this._buffer = source; this._view = new Uint8Array(this._buffer, byteOffset, byteLength); }; // Used to massage fp values so we can operate on them // at the bit level. BitView._scratch = new DataView(new ArrayBuffer(8)); Object.defineProperty(BitView.prototype, 'buffer', { get: function () { return this._buffer; }, enumerable: true, configurable: false }); Object.defineProperty(BitView.prototype, 'byteLength', { get: function () { return this._view.length; }, enumerable: true, configurable: false }); BitView.prototype._getBit = function (offset) { return this._view[offset >> 3] >> (offset & 7) & 0x1; }; BitView.prototype._setBit = function (offset, on) { if (on) { this._view[offset >> 3] |= 1 << (offset & 7); } else { this._view[offset >> 3] &= ~(1 << (offset & 7)); } }; BitView.prototype.getBits = function (offset, bits, signed) { var available = (this._view.length * 8 - offset); if (bits > available) { throw new Error('Cannot get ' + bits + ' bit(s) from offset ' + offset + ', ' + available + ' available'); } var value = 0; for (var i = 0; i < bits;) { var read; // Read an entire byte if we can. if ((bits - i) >= 8 && ((offset & 7) === 0)) { value |= (this._view[offset >> 3] << i); read = 8; } else { value |= (this._getBit(offset) << i); read = 1; } offset += read; i += read; } if (signed) { // If we're not working with a full 32 bits, check the // imaginary MSB for this bit count and convert to a // valid 32-bit signed value if set. if (bits !== 32 && value & (1 << (bits - 1))) { value |= -1 ^ ((1 << bits) - 1); } return value; } return value >>> 0; }; BitView.prototype.setBits = function (offset, value, bits) { var available = (this._view.length * 8 - offset); if (bits > available) { throw new Error('Cannot set ' + bits + ' bit(s) from offset ' + offset + ', ' + available + ' available'); } for (var i = 0; i < bits;) { var wrote; // Write an entire byte if we can. if ((bits - i) >= 8 && ((offset & 7) === 0)) { this._view[offset >> 3] = value & 0xFF; wrote = 8; } else { this._setBit(offset, value & 0x1); wrote = 1; } value = (value >> wrote); offset += wrote; i += wrote; } }; BitView.prototype.getInt8 = function (offset) { return this.getBits(offset, 8, true); }; BitView.prototype.getUint8 = function (offset) { return this.getBits(offset, 8, false); }; BitView.prototype.getInt16 = function (offset) { return this.getBits(offset, 16, true); }; BitView.prototype.getUint16 = function (offset) { return this.getBits(offset, 16, false); }; BitView.prototype.getInt32 = function (offset) { return this.getBits(offset, 32, true); }; BitView.prototype.getUint32 = function (offset) { return this.getBits(offset, 32, false); }; BitView.prototype.getFloat32 = function (offset) { BitView._scratch.setUint32(0, this.getUint32(offset)); return BitView._scratch.getFloat32(0); }; BitView.prototype.getFloat64 = function (offset) { BitView._scratch.setUint32(0, this.getUint32(offset)); // DataView offset is in bytes. BitView._scratch.setUint32(4, this.getUint32(offset+32)); return BitView._scratch.getFloat64(0); }; BitView.prototype.setInt8 = BitView.prototype.setUint8 = function (offset, value) { this.setBits(offset, value, 8); }; BitView.prototype.setInt16 = BitView.prototype.setUint16 = function (offset, value) { this.setBits(offset, value, 16); }; BitView.prototype.setInt32 = BitView.prototype.setUint32 = function (offset, value) { this.setBits(offset, value, 32); }; BitView.prototype.setFloat32 = function (offset, value) { BitView._scratch.setFloat32(0, value); this.setBits(offset, BitView._scratch.getUint32(0), 32); }; BitView.prototype.setFloat64 = function (offset, value) { BitView._scratch.setFloat64(0, value); this.setBits(offset, BitView._scratch.getUint32(0), 32); this.setBits(offset+32, BitView._scratch.getUint32(4), 32); }; /********************************************************** * * BitStream * * Small wrapper for a BitView to maintain your position, * as well as to handle reading / writing of string data * to the underlying buffer. * **********************************************************/ var reader = function (name, size) { return function () { var val = this._view[name](this._index); this._index += size; return val; }; }; var writer = function (name, size) { return function (value) { this._view[name](this._index, value); this._index += size; }; }; function readASCIIString(stream, bytes) { var i = 0; var chars = []; var append = true; // Read while we still have space available, or until we've // hit the fixed byte length passed in. while (!bytes || (bytes && i < bytes)) { var c = stream.readUint8(); // Stop appending chars once we hit 0x00 if (c === 0x00) { append = false; // If we don't have a fixed length to read, break out now. if (!bytes) { break; } } if (append) { chars.push(c); } i++; } // Convert char code array back to string. return chars.map(function (x) { return String.fromCharCode(x); }).join(''); } function writeASCIIString(stream, string, bytes) { var length = bytes || string.length + 1; // + 1 for NULL for (var i = 0; i < length; i++) { stream.writeUint8(i < string.length ? string.charCodeAt(i) : 0x00); } } var BitStream = function (source, byteOffset, byteLength) { var isBuffer = source instanceof ArrayBuffer || (typeof Buffer !== 'undefined' && source instanceof Buffer); if (!(source instanceof BitView) && !isBuffer) { throw new Error('Must specify a valid BitView, ArrayBuffer or Buffer'); } if (isBuffer) { this._view = new BitView(source, byteOffset, byteLength); } else { this._view = source; } this._index = 0; }; Object.defineProperty(BitStream.prototype, 'byteIndex', { // Ceil the returned value, over compensating for the amount of // bits written to the stream. get: function () { return Math.ceil(this._index / 8); }, set: function (val) { this._index = val * 8; }, enumerable: true, configurable: true }); Object.defineProperty(BitStream.prototype, 'buffer', { get: function () { return this._view.buffer; }, enumerable: true, configurable: false }); Object.defineProperty(BitStream.prototype, 'view', { get: function () { return this._view; }, enumerable: true, configurable: false }); BitStream.prototype.readBits = function (bits, signed) { var val = this._view.getBits(this._index, bits, signed); this._index += bits; return val; }; BitStream.prototype.writeBits = function (value, bits) { this._view.setBits(this._index, value, bits); this._index += bits; }; BitStream.prototype.readInt8 = reader('getInt8', 8); BitStream.prototype.readUint8 = reader('getUint8', 8); BitStream.prototype.readInt16 = reader('getInt16', 16); BitStream.prototype.readUint16 = reader('getUint16', 16); BitStream.prototype.readInt32 = reader('getInt32', 32); BitStream.prototype.readUint32 = reader('getUint32', 32); BitStream.prototype.readFloat32 = reader('getFloat32', 32); BitStream.prototype.readFloat64 = reader('getFloat64', 64); BitStream.prototype.writeInt8 = writer('setInt8', 8); BitStream.prototype.writeUint8 = writer('setUint8', 8); BitStream.prototype.writeInt16 = writer('setInt16', 16); BitStream.prototype.writeUint16 = writer('setUint16', 16); BitStream.prototype.writeInt32 = writer('setInt32', 32); BitStream.prototype.writeUint32 = writer('setUint32', 32); BitStream.prototype.writeFloat32 = writer('setFloat32', 32); BitStream.prototype.writeFloat64 = writer('setFloat64', 64); BitStream.prototype.readASCIIString = function (bytes) { return readASCIIString(this, bytes); }; BitStream.prototype.writeASCIIString = function (string, bytes) { writeASCIIString(this, string, bytes); }; // AMD / RequireJS if (typeof define !== 'undefined' && define.amd) { define(function () { return { BitView: BitView, BitStream: BitStream }; }); } // Node.js else if (typeof module !== 'undefined' && module.exports) { module.exports = { BitView: BitView, BitStream: BitStream }; } }(this)); }).call(this)}).call(this,require("buffer").Buffer) },{"buffer":81}],80:[function(require,module,exports){ },{}],81:[function(require,module,exports){ (function (Buffer){(function (){ /*! * The buffer module from node.js, for the browser. * * @author Feross Aboukhadijeh * @license MIT */ /* eslint-disable no-proto */ 'use strict' var base64 = require('base64-js') var ieee754 = require('ieee754') exports.Buffer = Buffer exports.SlowBuffer = SlowBuffer exports.INSPECT_MAX_BYTES = 50 var K_MAX_LENGTH = 0x7fffffff exports.kMaxLength = K_MAX_LENGTH /** * If `Buffer.TYPED_ARRAY_SUPPORT`: * === true Use Uint8Array implementation (fastest) * === false Print warning and recommend using `buffer` v4.x which has an Object * implementation (most compatible, even IE6) * * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+, * Opera 11.6+, iOS 4.2+. * * We report that the browser does not support typed arrays if the are not subclassable * using __proto__. Firefox 4-29 lacks support for adding new properties to `Uint8Array` * (See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438). IE 10 lacks support * for __proto__ and has a buggy typed array implementation. */ Buffer.TYPED_ARRAY_SUPPORT = typedArraySupport() if (!Buffer.TYPED_ARRAY_SUPPORT && typeof console !== 'undefined' && typeof console.error === 'function') { console.error( 'This browser lacks typed array (Uint8Array) support which is required by ' + '`buffer` v5.x. Use `buffer` v4.x if you require old browser support.' ) } function typedArraySupport () { // Can typed array instances can be augmented? try { var arr = new Uint8Array(1) arr.__proto__ = { __proto__: Uint8Array.prototype, foo: function () { return 42 } } return arr.foo() === 42 } catch (e) { return false } } Object.defineProperty(Buffer.prototype, 'parent', { enumerable: true, get: function () { if (!Buffer.isBuffer(this)) return undefined return this.buffer } }) Object.defineProperty(Buffer.prototype, 'offset', { enumerable: true, get: function () { if (!Buffer.isBuffer(this)) return undefined return this.byteOffset } }) function createBuffer (length) { if (length > K_MAX_LENGTH) { throw new RangeError('The value "' + length + '" is invalid for option "size"') } // Return an augmented `Uint8Array` instance var buf = new Uint8Array(length) buf.__proto__ = Buffer.prototype return buf } /** * The Buffer constructor returns instances of `Uint8Array` that have their * prototype changed to `Buffer.prototype`. Furthermore, `Buffer` is a subclass of * `Uint8Array`, so the returned instances will have all the node `Buffer` methods * and the `Uint8Array` methods. Square bracket notation works as expected -- it * returns a single octet. * * The `Uint8Array` prototype remains unmodified. */ function Buffer (arg, encodingOrOffset, length) { // Common case. if (typeof arg === 'number') { if (typeof encodingOrOffset === 'string') { throw new TypeError( 'The "string" argument must be of type string. Received type number' ) } return allocUnsafe(arg) } return from(arg, encodingOrOffset, length) } // Fix subarray() in ES2016. See: https://github.com/feross/buffer/pull/97 if (typeof Symbol !== 'undefined' && Symbol.species != null && Buffer[Symbol.species] === Buffer) { Object.defineProperty(Buffer, Symbol.species, { value: null, configurable: true, enumerable: false, writable: false }) } Buffer.poolSize = 8192 // not used by this implementation function from (value, encodingOrOffset, length) { if (typeof value === 'string') { return fromString(value, encodingOrOffset) } if (ArrayBuffer.isView(value)) { return fromArrayLike(value) } if (value == null) { throw TypeError( 'The first argument must be one of type string, Buffer, ArrayBuffer, Array, ' + 'or Array-like Object. Received type ' + (typeof value) ) } if (isInstance(value, ArrayBuffer) || (value && isInstance(value.buffer, ArrayBuffer))) { return fromArrayBuffer(value, encodingOrOffset, length) } if (typeof value === 'number') { throw new TypeError( 'The "value" argument must not be of type number. Received type number' ) } var valueOf = value.valueOf && value.valueOf() if (valueOf != null && valueOf !== value) { return Buffer.from(valueOf, encodingOrOffset, length) } var b = fromObject(value) if (b) return b if (typeof Symbol !== 'undefined' && Symbol.toPrimitive != null && typeof value[Symbol.toPrimitive] === 'function') { return Buffer.from( value[Symbol.toPrimitive]('string'), encodingOrOffset, length ) } throw new TypeError( 'The first argument must be one of type string, Buffer, ArrayBuffer, Array, ' + 'or Array-like Object. Received type ' + (typeof value) ) } /** * Functionally equivalent to Buffer(arg, encoding) but throws a TypeError * if value is a number. * Buffer.from(str[, encoding]) * Buffer.from(array) * Buffer.from(buffer) * Buffer.from(arrayBuffer[, byteOffset[, length]]) **/ Buffer.from = function (value, encodingOrOffset, length) { return from(value, encodingOrOffset, length) } // Note: Change prototype *after* Buffer.from is defined to workaround Chrome bug: // https://github.com/feross/buffer/pull/148 Buffer.prototype.__proto__ = Uint8Array.prototype Buffer.__proto__ = Uint8Array function assertSize (size) { if (typeof size !== 'number') { throw new TypeError('"size" argument must be of type number') } else if (size < 0) { throw new RangeError('The value "' + size + '" is invalid for option "size"') } } function alloc (size, fill, encoding) { assertSize(size) if (size <= 0) { return createBuffer(size) } if (fill !== undefined) { // Only pay attention to encoding if it's a string. This // prevents accidentally sending in a number that would // be interpretted as a start offset. return typeof encoding === 'string' ? createBuffer(size).fill(fill, encoding) : createBuffer(size).fill(fill) } return createBuffer(size) } /** * Creates a new filled Buffer instance. * alloc(size[, fill[, encoding]]) **/ Buffer.alloc = function (size, fill, encoding) { return alloc(size, fill, encoding) } function allocUnsafe (size) { assertSize(size) return createBuffer(size < 0 ? 0 : checked(size) | 0) } /** * Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance. * */ Buffer.allocUnsafe = function (size) { return allocUnsafe(size) } /** * Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance. */ Buffer.allocUnsafeSlow = function (size) { return allocUnsafe(size) } function fromString (string, encoding) { if (typeof encoding !== 'string' || encoding === '') { encoding = 'utf8' } if (!Buffer.isEncoding(encoding)) { throw new TypeError('Unknown encoding: ' + encoding) } var length = byteLength(string, encoding) | 0 var buf = createBuffer(length) var actual = buf.write(string, encoding) if (actual !== length) { // Writing a hex string, for example, that contains invalid characters will // cause everything after the first invalid character to be ignored. (e.g. // 'abxxcd' will be treated as 'ab') buf = buf.slice(0, actual) } return buf } function fromArrayLike (array) { var length = array.length < 0 ? 0 : checked(array.length) | 0 var buf = createBuffer(length) for (var i = 0; i < length; i += 1) { buf[i] = array[i] & 255 } return buf } function fromArrayBuffer (array, byteOffset, length) { if (byteOffset < 0 || array.byteLength < byteOffset) { throw new RangeError('"offset" is outside of buffer bounds') } if (array.byteLength < byteOffset + (length || 0)) { throw new RangeError('"length" is outside of buffer bounds') } var buf if (byteOffset === undefined && length === undefined) { buf = new Uint8Array(array) } else if (length === undefined) { buf = new Uint8Array(array, byteOffset) } else { buf = new Uint8Array(array, byteOffset, length) } // Return an augmented `Uint8Array` instance buf.__proto__ = Buffer.prototype return buf } function fromObject (obj) { if (Buffer.isBuffer(obj)) { var len = checked(obj.length) | 0 var buf = createBuffer(len) if (buf.length === 0) { return buf } obj.copy(buf, 0, 0, len) return buf } if (obj.length !== undefined) { if (typeof obj.length !== 'number' || numberIsNaN(obj.length)) { return createBuffer(0) } return fromArrayLike(obj) } if (obj.type === 'Buffer' && Array.isArray(obj.data)) { return fromArrayLike(obj.data) } } function checked (length) { // Note: cannot use `length < K_MAX_LENGTH` here because that fails when // length is NaN (which is otherwise coerced to zero.) if (length >= K_MAX_LENGTH) { throw new RangeError('Attempt to allocate Buffer larger than maximum ' + 'size: 0x' + K_MAX_LENGTH.toString(16) + ' bytes') } return length | 0 } function SlowBuffer (length) { if (+length != length) { // eslint-disable-line eqeqeq length = 0 } return Buffer.alloc(+length) } Buffer.isBuffer = function isBuffer (b) { return b != null && b._isBuffer === true && b !== Buffer.prototype // so Buffer.isBuffer(Buffer.prototype) will be false } Buffer.compare = function compare (a, b) { if (isInstance(a, Uint8Array)) a = Buffer.from(a, a.offset, a.byteLength) if (isInstance(b, Uint8Array)) b = Buffer.from(b, b.offset, b.byteLength) if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) { throw new TypeError( 'The "buf1", "buf2" arguments must be one of type Buffer or Uint8Array' ) } if (a === b) return 0 var x = a.length var y = b.length for (var i = 0, len = Math.min(x, y); i < len; ++i) { if (a[i] !== b[i]) { x = a[i] y = b[i] break } } if (x < y) return -1 if (y < x) return 1 return 0 } Buffer.isEncoding = function isEncoding (encoding) { switch (String(encoding).toLowerCase()) { case 'hex': case 'utf8': case 'utf-8': case 'ascii': case 'latin1': case 'binary': case 'base64': case 'ucs2': case 'ucs-2': case 'utf16le': case 'utf-16le': return true default: return false } } Buffer.concat = function concat (list, length) { if (!Array.isArray(list)) { throw new TypeError('"list" argument must be an Array of Buffers') } if (list.length === 0) { return Buffer.alloc(0) } var i if (length === undefined) { length = 0 for (i = 0; i < list.length; ++i) { length += list[i].length } } var buffer = Buffer.allocUnsafe(length) var pos = 0 for (i = 0; i < list.length; ++i) { var buf = list[i] if (isInstance(buf, Uint8Array)) { buf = Buffer.from(buf) } if (!Buffer.isBuffer(buf)) { throw new TypeError('"list" argument must be an Array of Buffers') } buf.copy(buffer, pos) pos += buf.length } return buffer } function byteLength (string, encoding) { if (Buffer.isBuffer(string)) { return string.length } if (ArrayBuffer.isView(string) || isInstance(string, ArrayBuffer)) { return string.byteLength } if (typeof string !== 'string') { throw new TypeError( 'The "string" argument must be one of type string, Buffer, or ArrayBuffer. ' + 'Received type ' + typeof string ) } var len = string.length var mustMatch = (arguments.length > 2 && arguments[2] === true) if (!mustMatch && len === 0) return 0 // Use a for loop to avoid recursion var loweredCase = false for (;;) { switch (encoding) { case 'ascii': case 'latin1': case 'binary': return len case 'utf8': case 'utf-8': return utf8ToBytes(string).length case 'ucs2': case 'ucs-2': case 'utf16le': case 'utf-16le': return len * 2 case 'hex': return len >>> 1 case 'base64': return base64ToBytes(string).length default: if (loweredCase) { return mustMatch ? -1 : utf8ToBytes(string).length // assume utf8 } encoding = ('' + encoding).toLowerCase() loweredCase = true } } } Buffer.byteLength = byteLength function slowToString (encoding, start, end) { var loweredCase = false // No need to verify that "this.length <= MAX_UINT32" since it's a read-only // property of a typed array. // This behaves neither like String nor Uint8Array in that we set start/end // to their upper/lower bounds if the value passed is out of range. // undefined is handled specially as per ECMA-262 6th Edition, // Section 13.3.3.7 Runtime Semantics: KeyedBindingInitialization. if (start === undefined || start < 0) { start = 0 } // Return early if start > this.length. Done here to prevent potential uint32 // coercion fail below. if (start > this.length) { return '' } if (end === undefined || end > this.length) { end = this.length } if (end <= 0) { return '' } // Force coersion to uint32. This will also coerce falsey/NaN values to 0. end >>>= 0 start >>>= 0 if (end <= start) { return '' } if (!encoding) encoding = 'utf8' while (true) { switch (encoding) { case 'hex': return hexSlice(this, start, end) case 'utf8': case 'utf-8': return utf8Slice(this, start, end) case 'ascii': return asciiSlice(this, start, end) case 'latin1': case 'binary': return latin1Slice(this, start, end) case 'base64': return base64Slice(this, start, end) case 'ucs2': case 'ucs-2': case 'utf16le': case 'utf-16le': return utf16leSlice(this, start, end) default: if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding) encoding = (encoding + '').toLowerCase() loweredCase = true } } } // This property is used by `Buffer.isBuffer` (and the `is-buffer` npm package) // to detect a Buffer instance. It's not possible to use `instanceof Buffer` // reliably in a browserify context because there could be multiple different // copies of the 'buffer' package in use. This method works even for Buffer // instances that were created from another copy of the `buffer` package. // See: https://github.com/feross/buffer/issues/154 Buffer.prototype._isBuffer = true function swap (b, n, m) { var i = b[n] b[n] = b[m] b[m] = i } Buffer.prototype.swap16 = function swap16 () { var len = this.length if (len % 2 !== 0) { throw new RangeError('Buffer size must be a multiple of 16-bits') } for (var i = 0; i < len; i += 2) { swap(this, i, i + 1) } return this } Buffer.prototype.swap32 = function swap32 () { var len = this.length if (len % 4 !== 0) { throw new RangeError('Buffer size must be a multiple of 32-bits') } for (var i = 0; i < len; i += 4) { swap(this, i, i + 3) swap(this, i + 1, i + 2) } return this } Buffer.prototype.swap64 = function swap64 () { var len = this.length if (len % 8 !== 0) { throw new RangeError('Buffer size must be a multiple of 64-bits') } for (var i = 0; i < len; i += 8) { swap(this, i, i + 7) swap(this, i + 1, i + 6) swap(this, i + 2, i + 5) swap(this, i + 3, i + 4) } return this } Buffer.prototype.toString = function toString () { var length = this.length if (length === 0) return '' if (arguments.length === 0) return utf8Slice(this, 0, length) return slowToString.apply(this, arguments) } Buffer.prototype.toLocaleString = Buffer.prototype.toString Buffer.prototype.equals = function equals (b) { if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer') if (this === b) return true return Buffer.compare(this, b) === 0 } Buffer.prototype.inspect = function inspect () { var str = '' var max = exports.INSPECT_MAX_BYTES str = this.toString('hex', 0, max).replace(/(.{2})/g, '$1 ').trim() if (this.length > max) str += ' ... ' return '' } Buffer.prototype.compare = function compare (target, start, end, thisStart, thisEnd) { if (isInstance(target, Uint8Array)) { target = Buffer.from(target, target.offset, target.byteLength) } if (!Buffer.isBuffer(target)) { throw new TypeError( 'The "target" argument must be one of type Buffer or Uint8Array. ' + 'Received type ' + (typeof target) ) } if (start === undefined) { start = 0 } if (end === undefined) { end = target ? target.length : 0 } if (thisStart === undefined) { thisStart = 0 } if (thisEnd === undefined) { thisEnd = this.length } if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) { throw new RangeError('out of range index') } if (thisStart >= thisEnd && start >= end) { return 0 } if (thisStart >= thisEnd) { return -1 } if (start >= end) { return 1 } start >>>= 0 end >>>= 0 thisStart >>>= 0 thisEnd >>>= 0 if (this === target) return 0 var x = thisEnd - thisStart var y = end - start var len = Math.min(x, y) var thisCopy = this.slice(thisStart, thisEnd) var targetCopy = target.slice(start, end) for (var i = 0; i < len; ++i) { if (thisCopy[i] !== targetCopy[i]) { x = thisCopy[i] y = targetCopy[i] break } } if (x < y) return -1 if (y < x) return 1 return 0 } // Finds either the first index of `val` in `buffer` at offset >= `byteOffset`, // OR the last index of `val` in `buffer` at offset <= `byteOffset`. // // Arguments: // - buffer - a Buffer to search // - val - a string, Buffer, or number // - byteOffset - an index into `buffer`; will be clamped to an int32 // - encoding - an optional encoding, relevant is val is a string // - dir - true for indexOf, false for lastIndexOf function bidirectionalIndexOf (buffer, val, byteOffset, encoding, dir) { // Empty buffer means no match if (buffer.length === 0) return -1 // Normalize byteOffset if (typeof byteOffset === 'string') { encoding = byteOffset byteOffset = 0 } else if (byteOffset > 0x7fffffff) { byteOffset = 0x7fffffff } else if (byteOffset < -0x80000000) { byteOffset = -0x80000000 } byteOffset = +byteOffset // Coerce to Number. if (numberIsNaN(byteOffset)) { // byteOffset: it it's undefined, null, NaN, "foo", etc, search whole buffer byteOffset = dir ? 0 : (buffer.length - 1) } // Normalize byteOffset: negative offsets start from the end of the buffer if (byteOffset < 0) byteOffset = buffer.length + byteOffset if (byteOffset >= buffer.length) { if (dir) return -1 else byteOffset = buffer.length - 1 } else if (byteOffset < 0) { if (dir) byteOffset = 0 else return -1 } // Normalize val if (typeof val === 'string') { val = Buffer.from(val, encoding) } // Finally, search either indexOf (if dir is true) or lastIndexOf if (Buffer.isBuffer(val)) { // Special case: looking for empty string/buffer always fails if (val.length === 0) { return -1 } return arrayIndexOf(buffer, val, byteOffset, encoding, dir) } else if (typeof val === 'number') { val = val & 0xFF // Search for a byte value [0-255] if (typeof Uint8Array.prototype.indexOf === 'function') { if (dir) { return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset) } else { return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset) } } return arrayIndexOf(buffer, [ val ], byteOffset, encoding, dir) } throw new TypeError('val must be string, number or Buffer') } function arrayIndexOf (arr, val, byteOffset, encoding, dir) { var indexSize = 1 var arrLength = arr.length var valLength = val.length if (encoding !== undefined) { encoding = String(encoding).toLowerCase() if (encoding === 'ucs2' || encoding === 'ucs-2' || encoding === 'utf16le' || encoding === 'utf-16le') { if (arr.length < 2 || val.length < 2) { return -1 } indexSize = 2 arrLength /= 2 valLength /= 2 byteOffset /= 2 } } function read (buf, i) { if (indexSize === 1) { return buf[i] } else { return buf.readUInt16BE(i * indexSize) } } var i if (dir) { var foundIndex = -1 for (i = byteOffset; i < arrLength; i++) { if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) { if (foundIndex === -1) foundIndex = i if (i - foundIndex + 1 === valLength) return foundIndex * indexSize } else { if (foundIndex !== -1) i -= i - foundIndex foundIndex = -1 } } } else { if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength for (i = byteOffset; i >= 0; i--) { var found = true for (var j = 0; j < valLength; j++) { if (read(arr, i + j) !== read(val, j)) { found = false break } } if (found) return i } } return -1 } Buffer.prototype.includes = function includes (val, byteOffset, encoding) { return this.indexOf(val, byteOffset, encoding) !== -1 } Buffer.prototype.indexOf = function indexOf (val, byteOffset, encoding) { return bidirectionalIndexOf(this, val, byteOffset, encoding, true) } Buffer.prototype.lastIndexOf = function lastIndexOf (val, byteOffset, encoding) { return bidirectionalIndexOf(this, val, byteOffset, encoding, false) } function hexWrite (buf, string, offset, length) { offset = Number(offset) || 0 var remaining = buf.length - offset if (!length) { length = remaining } else { length = Number(length) if (length > remaining) { length = remaining } } var strLen = string.length if (length > strLen / 2) { length = strLen / 2 } for (var i = 0; i < length; ++i) { var parsed = parseInt(string.substr(i * 2, 2), 16) if (numberIsNaN(parsed)) return i buf[offset + i] = parsed } return i } function utf8Write (buf, string, offset, length) { return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length) } function asciiWrite (buf, string, offset, length) { return blitBuffer(asciiToBytes(string), buf, offset, length) } function latin1Write (buf, string, offset, length) { return asciiWrite(buf, string, offset, length) } function base64Write (buf, string, offset, length) { return blitBuffer(base64ToBytes(string), buf, offset, length) } function ucs2Write (buf, string, offset, length) { return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length) } Buffer.prototype.write = function write (string, offset, length, encoding) { // Buffer#write(string) if (offset === undefined) { encoding = 'utf8' length = this.length offset = 0 // Buffer#write(string, encoding) } else if (length === undefined && typeof offset === 'string') { encoding = offset length = this.length offset = 0 // Buffer#write(string, offset[, length][, encoding]) } else if (isFinite(offset)) { offset = offset >>> 0 if (isFinite(length)) { length = length >>> 0 if (encoding === undefined) encoding = 'utf8' } else { encoding = length length = undefined } } else { throw new Error( 'Buffer.write(string, encoding, offset[, length]) is no longer supported' ) } var remaining = this.length - offset if (length === undefined || length > remaining) length = remaining if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) { throw new RangeError('Attempt to write outside buffer bounds') } if (!encoding) encoding = 'utf8' var loweredCase = false for (;;) { switch (encoding) { case 'hex': return hexWrite(this, string, offset, length) case 'utf8': case 'utf-8': return utf8Write(this, string, offset, length) case 'ascii': return asciiWrite(this, string, offset, length) case 'latin1': case 'binary': return latin1Write(this, string, offset, length) case 'base64': // Warning: maxLength not taken into account in base64Write return base64Write(this, string, offset, length) case 'ucs2': case 'ucs-2': case 'utf16le': case 'utf-16le': return ucs2Write(this, string, offset, length) default: if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding) encoding = ('' + encoding).toLowerCase() loweredCase = true } } } Buffer.prototype.toJSON = function toJSON () { return { type: 'Buffer', data: Array.prototype.slice.call(this._arr || this, 0) } } function base64Slice (buf, start, end) { if (start === 0 && end === buf.length) { return base64.fromByteArray(buf) } else { return base64.fromByteArray(buf.slice(start, end)) } } function utf8Slice (buf, start, end) { end = Math.min(buf.length, end) var res = [] var i = start while (i < end) { var firstByte = buf[i] var codePoint = null var bytesPerSequence = (firstByte > 0xEF) ? 4 : (firstByte > 0xDF) ? 3 : (firstByte > 0xBF) ? 2 : 1 if (i + bytesPerSequence <= end) { var secondByte, thirdByte, fourthByte, tempCodePoint switch (bytesPerSequence) { case 1: if (firstByte < 0x80) { codePoint = firstByte } break case 2: secondByte = buf[i + 1] if ((secondByte & 0xC0) === 0x80) { tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F) if (tempCodePoint > 0x7F) { codePoint = tempCodePoint } } break case 3: secondByte = buf[i + 1] thirdByte = buf[i + 2] if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) { tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F) if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) { codePoint = tempCodePoint } } break case 4: secondByte = buf[i + 1] thirdByte = buf[i + 2] fourthByte = buf[i + 3] if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) { tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F) if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) { codePoint = tempCodePoint } } } } if (codePoint === null) { // we did not generate a valid codePoint so insert a // replacement char (U+FFFD) and advance only 1 byte codePoint = 0xFFFD bytesPerSequence = 1 } else if (codePoint > 0xFFFF) { // encode to utf16 (surrogate pair dance) codePoint -= 0x10000 res.push(codePoint >>> 10 & 0x3FF | 0xD800) codePoint = 0xDC00 | codePoint & 0x3FF } res.push(codePoint) i += bytesPerSequence } return decodeCodePointsArray(res) } // Based on http://stackoverflow.com/a/22747272/680742, the browser with // the lowest limit is Chrome, with 0x10000 args. // We go 1 magnitude less, for safety var MAX_ARGUMENTS_LENGTH = 0x1000 function decodeCodePointsArray (codePoints) { var len = codePoints.length if (len <= MAX_ARGUMENTS_LENGTH) { return String.fromCharCode.apply(String, codePoints) // avoid extra slice() } // Decode in chunks to avoid "call stack size exceeded". var res = '' var i = 0 while (i < len) { res += String.fromCharCode.apply( String, codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH) ) } return res } function asciiSlice (buf, start, end) { var ret = '' end = Math.min(buf.length, end) for (var i = start; i < end; ++i) { ret += String.fromCharCode(buf[i] & 0x7F) } return ret } function latin1Slice (buf, start, end) { var ret = '' end = Math.min(buf.length, end) for (var i = start; i < end; ++i) { ret += String.fromCharCode(buf[i]) } return ret } function hexSlice (buf, start, end) { var len = buf.length if (!start || start < 0) start = 0 if (!end || end < 0 || end > len) end = len var out = '' for (var i = start; i < end; ++i) { out += toHex(buf[i]) } return out } function utf16leSlice (buf, start, end) { var bytes = buf.slice(start, end) var res = '' for (var i = 0; i < bytes.length; i += 2) { res += String.fromCharCode(bytes[i] + (bytes[i + 1] * 256)) } return res } Buffer.prototype.slice = function slice (start, end) { var len = this.length start = ~~start end = end === undefined ? len : ~~end if (start < 0) { start += len if (start < 0) start = 0 } else if (start > len) { start = len } if (end < 0) { end += len if (end < 0) end = 0 } else if (end > len) { end = len } if (end < start) end = start var newBuf = this.subarray(start, end) // Return an augmented `Uint8Array` instance newBuf.__proto__ = Buffer.prototype return newBuf } /* * Need to make sure that buffer isn't trying to write out of bounds. */ function checkOffset (offset, ext, length) { if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint') if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length') } Buffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) { offset = offset >>> 0 byteLength = byteLength >>> 0 if (!noAssert) checkOffset(offset, byteLength, this.length) var val = this[offset] var mul = 1 var i = 0 while (++i < byteLength && (mul *= 0x100)) { val += this[offset + i] * mul } return val } Buffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) { offset = offset >>> 0 byteLength = byteLength >>> 0 if (!noAssert) { checkOffset(offset, byteLength, this.length) } var val = this[offset + --byteLength] var mul = 1 while (byteLength > 0 && (mul *= 0x100)) { val += this[offset + --byteLength] * mul } return val } Buffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) { offset = offset >>> 0 if (!noAssert) checkOffset(offset, 1, this.length) return this[offset] } Buffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) { offset = offset >>> 0 if (!noAssert) checkOffset(offset, 2, this.length) return this[offset] | (this[offset + 1] << 8) } Buffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) { offset = offset >>> 0 if (!noAssert) checkOffset(offset, 2, this.length) return (this[offset] << 8) | this[offset + 1] } Buffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) { offset = offset >>> 0 if (!noAssert) checkOffset(offset, 4, this.length) return ((this[offset]) | (this[offset + 1] << 8) | (this[offset + 2] << 16)) + (this[offset + 3] * 0x1000000) } Buffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) { offset = offset >>> 0 if (!noAssert) checkOffset(offset, 4, this.length) return (this[offset] * 0x1000000) + ((this[offset + 1] << 16) | (this[offset + 2] << 8) | this[offset + 3]) } Buffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) { offset = offset >>> 0 byteLength = byteLength >>> 0 if (!noAssert) checkOffset(offset, byteLength, this.length) var val = this[offset] var mul = 1 var i = 0 while (++i < byteLength && (mul *= 0x100)) { val += this[offset + i] * mul } mul *= 0x80 if (val >= mul) val -= Math.pow(2, 8 * byteLength) return val } Buffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) { offset = offset >>> 0 byteLength = byteLength >>> 0 if (!noAssert) checkOffset(offset, byteLength, this.length) var i = byteLength var mul = 1 var val = this[offset + --i] while (i > 0 && (mul *= 0x100)) { val += this[offset + --i] * mul } mul *= 0x80 if (val >= mul) val -= Math.pow(2, 8 * byteLength) return val } Buffer.prototype.readInt8 = function readInt8 (offset, noAssert) { offset = offset >>> 0 if (!noAssert) checkOffset(offset, 1, this.length) if (!(this[offset] & 0x80)) return (this[offset]) return ((0xff - this[offset] + 1) * -1) } Buffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) { offset = offset >>> 0 if (!noAssert) checkOffset(offset, 2, this.length) var val = this[offset] | (this[offset + 1] << 8) return (val & 0x8000) ? val | 0xFFFF0000 : val } Buffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) { offset = offset >>> 0 if (!noAssert) checkOffset(offset, 2, this.length) var val = this[offset + 1] | (this[offset] << 8) return (val & 0x8000) ? val | 0xFFFF0000 : val } Buffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) { offset = offset >>> 0 if (!noAssert) checkOffset(offset, 4, this.length) return (this[offset]) | (this[offset + 1] << 8) | (this[offset + 2] << 16) | (this[offset + 3] << 24) } Buffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) { offset = offset >>> 0 if (!noAssert) checkOffset(offset, 4, this.length) return (this[offset] << 24) | (this[offset + 1] << 16) | (this[offset + 2] << 8) | (this[offset + 3]) } Buffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) { offset = offset >>> 0 if (!noAssert) checkOffset(offset, 4, this.length) return ieee754.read(this, offset, true, 23, 4) } Buffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) { offset = offset >>> 0 if (!noAssert) checkOffset(offset, 4, this.length) return ieee754.read(this, offset, false, 23, 4) } Buffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) { offset = offset >>> 0 if (!noAssert) checkOffset(offset, 8, this.length) return ieee754.read(this, offset, true, 52, 8) } Buffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) { offset = offset >>> 0 if (!noAssert) checkOffset(offset, 8, this.length) return ieee754.read(this, offset, false, 52, 8) } function checkInt (buf, value, offset, ext, max, min) { if (!Buffer.isBuffer(buf)) throw new TypeError('"buffer" argument must be a Buffer instance') if (value > max || value < min) throw new RangeError('"value" argument is out of bounds') if (offset + ext > buf.length) throw new RangeError('Index out of range') } Buffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) { value = +value offset = offset >>> 0 byteLength = byteLength >>> 0 if (!noAssert) { var maxBytes = Math.pow(2, 8 * byteLength) - 1 checkInt(this, value, offset, byteLength, maxBytes, 0) } var mul = 1 var i = 0 this[offset] = value & 0xFF while (++i < byteLength && (mul *= 0x100)) { this[offset + i] = (value / mul) & 0xFF } return offset + byteLength } Buffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) { value = +value offset = offset >>> 0 byteLength = byteLength >>> 0 if (!noAssert) { var maxBytes = Math.pow(2, 8 * byteLength) - 1 checkInt(this, value, offset, byteLength, maxBytes, 0) } var i = byteLength - 1 var mul = 1 this[offset + i] = value & 0xFF while (--i >= 0 && (mul *= 0x100)) { this[offset + i] = (value / mul) & 0xFF } return offset + byteLength } Buffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) { value = +value offset = offset >>> 0 if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0) this[offset] = (value & 0xff) return offset + 1 } Buffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) { value = +value offset = offset >>> 0 if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0) this[offset] = (value & 0xff) this[offset + 1] = (value >>> 8) return offset + 2 } Buffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) { value = +value offset = offset >>> 0 if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0) this[offset] = (value >>> 8) this[offset + 1] = (value & 0xff) return offset + 2 } Buffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) { value = +value offset = offset >>> 0 if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0) this[offset + 3] = (value >>> 24) this[offset + 2] = (value >>> 16) this[offset + 1] = (value >>> 8) this[offset] = (value & 0xff) return offset + 4 } Buffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) { value = +value offset = offset >>> 0 if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0) this[offset] = (value >>> 24) this[offset + 1] = (value >>> 16) this[offset + 2] = (value >>> 8) this[offset + 3] = (value & 0xff) return offset + 4 } Buffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) { value = +value offset = offset >>> 0 if (!noAssert) { var limit = Math.pow(2, (8 * byteLength) - 1) checkInt(this, value, offset, byteLength, limit - 1, -limit) } var i = 0 var mul = 1 var sub = 0 this[offset] = value & 0xFF while (++i < byteLength && (mul *= 0x100)) { if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) { sub = 1 } this[offset + i] = ((value / mul) >> 0) - sub & 0xFF } return offset + byteLength } Buffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) { value = +value offset = offset >>> 0 if (!noAssert) { var limit = Math.pow(2, (8 * byteLength) - 1) checkInt(this, value, offset, byteLength, limit - 1, -limit) } var i = byteLength - 1 var mul = 1 var sub = 0 this[offset + i] = value & 0xFF while (--i >= 0 && (mul *= 0x100)) { if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) { sub = 1 } this[offset + i] = ((value / mul) >> 0) - sub & 0xFF } return offset + byteLength } Buffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) { value = +value offset = offset >>> 0 if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80) if (value < 0) value = 0xff + value + 1 this[offset] = (value & 0xff) return offset + 1 } Buffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) { value = +value offset = offset >>> 0 if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000) this[offset] = (value & 0xff) this[offset + 1] = (value >>> 8) return offset + 2 } Buffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) { value = +value offset = offset >>> 0 if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000) this[offset] = (value >>> 8) this[offset + 1] = (value & 0xff) return offset + 2 } Buffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) { value = +value offset = offset >>> 0 if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000) this[offset] = (value & 0xff) this[offset + 1] = (value >>> 8) this[offset + 2] = (value >>> 16) this[offset + 3] = (value >>> 24) return offset + 4 } Buffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) { value = +value offset = offset >>> 0 if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000) if (value < 0) value = 0xffffffff + value + 1 this[offset] = (value >>> 24) this[offset + 1] = (value >>> 16) this[offset + 2] = (value >>> 8) this[offset + 3] = (value & 0xff) return offset + 4 } function checkIEEE754 (buf, value, offset, ext, max, min) { if (offset + ext > buf.length) throw new RangeError('Index out of range') if (offset < 0) throw new RangeError('Index out of range') } function writeFloat (buf, value, offset, littleEndian, noAssert) { value = +value offset = offset >>> 0 if (!noAssert) { checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38) } ieee754.write(buf, value, offset, littleEndian, 23, 4) return offset + 4 } Buffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) { return writeFloat(this, value, offset, true, noAssert) } Buffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) { return writeFloat(this, value, offset, false, noAssert) } function writeDouble (buf, value, offset, littleEndian, noAssert) { value = +value offset = offset >>> 0 if (!noAssert) { checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308) } ieee754.write(buf, value, offset, littleEndian, 52, 8) return offset + 8 } Buffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) { return writeDouble(this, value, offset, true, noAssert) } Buffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) { return writeDouble(this, value, offset, false, noAssert) } // copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length) Buffer.prototype.copy = function copy (target, targetStart, start, end) { if (!Buffer.isBuffer(target)) throw new TypeError('argument should be a Buffer') if (!start) start = 0 if (!end && end !== 0) end = this.length if (targetStart >= target.length) targetStart = target.length if (!targetStart) targetStart = 0 if (end > 0 && end < start) end = start // Copy 0 bytes; we're done if (end === start) return 0 if (target.length === 0 || this.length === 0) return 0 // Fatal error conditions if (targetStart < 0) { throw new RangeError('targetStart out of bounds') } if (start < 0 || start >= this.length) throw new RangeError('Index out of range') if (end < 0) throw new RangeError('sourceEnd out of bounds') // Are we oob? if (end > this.length) end = this.length if (target.length - targetStart < end - start) { end = target.length - targetStart + start } var len = end - start if (this === target && typeof Uint8Array.prototype.copyWithin === 'function') { // Use built-in when available, missing from IE11 this.copyWithin(targetStart, start, end) } else if (this === target && start < targetStart && targetStart < end) { // descending copy from end for (var i = len - 1; i >= 0; --i) { target[i + targetStart] = this[i + start] } } else { Uint8Array.prototype.set.call( target, this.subarray(start, end), targetStart ) } return len } // Usage: // buffer.fill(number[, offset[, end]]) // buffer.fill(buffer[, offset[, end]]) // buffer.fill(string[, offset[, end]][, encoding]) Buffer.prototype.fill = function fill (val, start, end, encoding) { // Handle string cases: if (typeof val === 'string') { if (typeof start === 'string') { encoding = start start = 0 end = this.length } else if (typeof end === 'string') { encoding = end end = this.length } if (encoding !== undefined && typeof encoding !== 'string') { throw new TypeError('encoding must be a string') } if (typeof encoding === 'string' && !Buffer.isEncoding(encoding)) { throw new TypeError('Unknown encoding: ' + encoding) } if (val.length === 1) { var code = val.charCodeAt(0) if ((encoding === 'utf8' && code < 128) || encoding === 'latin1') { // Fast path: If `val` fits into a single byte, use that numeric value. val = code } } } else if (typeof val === 'number') { val = val & 255 } // Invalid ranges are not set to a default, so can range check early. if (start < 0 || this.length < start || this.length < end) { throw new RangeError('Out of range index') } if (end <= start) { return this } start = start >>> 0 end = end === undefined ? this.length : end >>> 0 if (!val) val = 0 var i if (typeof val === 'number') { for (i = start; i < end; ++i) { this[i] = val } } else { var bytes = Buffer.isBuffer(val) ? val : Buffer.from(val, encoding) var len = bytes.length if (len === 0) { throw new TypeError('The value "' + val + '" is invalid for argument "value"') } for (i = 0; i < end - start; ++i) { this[i + start] = bytes[i % len] } } return this } // HELPER FUNCTIONS // ================ var INVALID_BASE64_RE = /[^+/0-9A-Za-z-_]/g function base64clean (str) { // Node takes equal signs as end of the Base64 encoding str = str.split('=')[0] // Node strips out invalid characters like \n and \t from the string, base64-js does not str = str.trim().replace(INVALID_BASE64_RE, '') // Node converts strings with length < 2 to '' if (str.length < 2) return '' // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not while (str.length % 4 !== 0) { str = str + '=' } return str } function toHex (n) { if (n < 16) return '0' + n.toString(16) return n.toString(16) } function utf8ToBytes (string, units) { units = units || Infinity var codePoint var length = string.length var leadSurrogate = null var bytes = [] for (var i = 0; i < length; ++i) { codePoint = string.charCodeAt(i) // is surrogate component if (codePoint > 0xD7FF && codePoint < 0xE000) { // last char was a lead if (!leadSurrogate) { // no lead yet if (codePoint > 0xDBFF) { // unexpected trail if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) continue } else if (i + 1 === length) { // unpaired lead if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) continue } // valid lead leadSurrogate = codePoint continue } // 2 leads in a row if (codePoint < 0xDC00) { if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) leadSurrogate = codePoint continue } // valid surrogate pair codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000 } else if (leadSurrogate) { // valid bmp char, but last char was a lead if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) } leadSurrogate = null // encode utf8 if (codePoint < 0x80) { if ((units -= 1) < 0) break bytes.push(codePoint) } else if (codePoint < 0x800) { if ((units -= 2) < 0) break bytes.push( codePoint >> 0x6 | 0xC0, codePoint & 0x3F | 0x80 ) } else if (codePoint < 0x10000) { if ((units -= 3) < 0) break bytes.push( codePoint >> 0xC | 0xE0, codePoint >> 0x6 & 0x3F | 0x80, codePoint & 0x3F | 0x80 ) } else if (codePoint < 0x110000) { if ((units -= 4) < 0) break bytes.push( codePoint >> 0x12 | 0xF0, codePoint >> 0xC & 0x3F | 0x80, codePoint >> 0x6 & 0x3F | 0x80, codePoint & 0x3F | 0x80 ) } else { throw new Error('Invalid code point') } } return bytes } function asciiToBytes (str) { var byteArray = [] for (var i = 0; i < str.length; ++i) { // Node's code seems to be doing this and not & 0x7F.. byteArray.push(str.charCodeAt(i) & 0xFF) } return byteArray } function utf16leToBytes (str, units) { var c, hi, lo var byteArray = [] for (var i = 0; i < str.length; ++i) { if ((units -= 2) < 0) break c = str.charCodeAt(i) hi = c >> 8 lo = c % 256 byteArray.push(lo) byteArray.push(hi) } return byteArray } function base64ToBytes (str) { return base64.toByteArray(base64clean(str)) } function blitBuffer (src, dst, offset, length) { for (var i = 0; i < length; ++i) { if ((i + offset >= dst.length) || (i >= src.length)) break dst[i + offset] = src[i] } return i } // ArrayBuffer or Uint8Array objects from other contexts (i.e. iframes) do not pass // the `instanceof` check but they should be treated as of that type. // See: https://github.com/feross/buffer/issues/166 function isInstance (obj, type) { return obj instanceof type || (obj != null && obj.constructor != null && obj.constructor.name != null && obj.constructor.name === type.name) } function numberIsNaN (obj) { // For IE11 support return obj !== obj // eslint-disable-line no-self-compare } }).call(this)}).call(this,require("buffer").Buffer) },{"base64-js":77,"buffer":81,"ieee754":86}],82:[function(require,module,exports){ module.exports = { "100": "Continue", "101": "Switching Protocols", "102": "Processing", "200": "OK", "201": "Created", "202": "Accepted", "203": "Non-Authoritative Information", "204": "No Content", "205": "Reset Content", "206": "Partial Content", "207": "Multi-Status", "208": "Already Reported", "226": "IM Used", "300": "Multiple Choices", "301": "Moved Permanently", "302": "Found", "303": "See Other", "304": "Not Modified", "305": "Use Proxy", "307": "Temporary Redirect", "308": "Permanent Redirect", "400": "Bad Request", "401": "Unauthorized", "402": "Payment Required", "403": "Forbidden", "404": "Not Found", "405": "Method Not Allowed", "406": "Not Acceptable", "407": "Proxy Authentication Required", "408": "Request Timeout", "409": "Conflict", "410": "Gone", "411": "Length Required", "412": "Precondition Failed", "413": "Payload Too Large", "414": "URI Too Long", "415": "Unsupported Media Type", "416": "Range Not Satisfiable", "417": "Expectation Failed", "418": "I'm a teapot", "421": "Misdirected Request", "422": "Unprocessable Entity", "423": "Locked", "424": "Failed Dependency", "425": "Unordered Collection", "426": "Upgrade Required", "428": "Precondition Required", "429": "Too Many Requests", "431": "Request Header Fields Too Large", "451": "Unavailable For Legal Reasons", "500": "Internal Server Error", "501": "Not Implemented", "502": "Bad Gateway", "503": "Service Unavailable", "504": "Gateway Timeout", "505": "HTTP Version Not Supported", "506": "Variant Also Negotiates", "507": "Insufficient Storage", "508": "Loop Detected", "509": "Bandwidth Limit Exceeded", "510": "Not Extended", "511": "Network Authentication Required" } },{}],83:[function(require,module,exports){ /* Copyright 2013-2014 Daniel Wirtz Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ /** * @license bytebuffer.js (c) 2015 Daniel Wirtz * Backing buffer: ArrayBuffer, Accessor: Uint8Array * Released under the Apache License, Version 2.0 * see: https://github.com/dcodeIO/bytebuffer.js for details */ (function(global, factory) { /* AMD */ if (typeof define === 'function' && define["amd"]) define(["long"], factory); /* CommonJS */ else if (typeof require === 'function' && typeof module === "object" && module && module["exports"]) module['exports'] = (function() { var Long; try { Long = require("long"); } catch (e) {} return factory(Long); })(); /* Global */ else (global["dcodeIO"] = global["dcodeIO"] || {})["ByteBuffer"] = factory(global["dcodeIO"]["Long"]); })(this, function(Long) { "use strict"; /** * Constructs a new ByteBuffer. * @class The swiss army knife for binary data in JavaScript. * @exports ByteBuffer * @constructor * @param {number=} capacity Initial capacity. Defaults to {@link ByteBuffer.DEFAULT_CAPACITY}. * @param {boolean=} littleEndian Whether to use little or big endian byte order. Defaults to * {@link ByteBuffer.DEFAULT_ENDIAN}. * @param {boolean=} noAssert Whether to skip assertions of offsets and values. Defaults to * {@link ByteBuffer.DEFAULT_NOASSERT}. * @expose */ var ByteBuffer = function(capacity, littleEndian, noAssert) { if (typeof capacity === 'undefined') capacity = ByteBuffer.DEFAULT_CAPACITY; if (typeof littleEndian === 'undefined') littleEndian = ByteBuffer.DEFAULT_ENDIAN; if (typeof noAssert === 'undefined') noAssert = ByteBuffer.DEFAULT_NOASSERT; if (!noAssert) { capacity = capacity | 0; if (capacity < 0) throw RangeError("Illegal capacity"); littleEndian = !!littleEndian; noAssert = !!noAssert; } /** * Backing ArrayBuffer. * @type {!ArrayBuffer} * @expose */ this.buffer = capacity === 0 ? EMPTY_BUFFER : new ArrayBuffer(capacity); /** * Uint8Array utilized to manipulate the backing buffer. Becomes `null` if the backing buffer has a capacity of `0`. * @type {?Uint8Array} * @expose */ this.view = capacity === 0 ? null : new Uint8Array(this.buffer); /** * Absolute read/write offset. * @type {number} * @expose * @see ByteBuffer#flip * @see ByteBuffer#clear */ this.offset = 0; /** * Marked offset. * @type {number} * @expose * @see ByteBuffer#mark * @see ByteBuffer#reset */ this.markedOffset = -1; /** * Absolute limit of the contained data. Set to the backing buffer's capacity upon allocation. * @type {number} * @expose * @see ByteBuffer#flip * @see ByteBuffer#clear */ this.limit = capacity; /** * Whether to use little endian byte order, defaults to `false` for big endian. * @type {boolean} * @expose */ this.littleEndian = littleEndian; /** * Whether to skip assertions of offsets and values, defaults to `false`. * @type {boolean} * @expose */ this.noAssert = noAssert; }; /** * ByteBuffer version. * @type {string} * @const * @expose */ ByteBuffer.VERSION = "5.0.1"; /** * Little endian constant that can be used instead of its boolean value. Evaluates to `true`. * @type {boolean} * @const * @expose */ ByteBuffer.LITTLE_ENDIAN = true; /** * Big endian constant that can be used instead of its boolean value. Evaluates to `false`. * @type {boolean} * @const * @expose */ ByteBuffer.BIG_ENDIAN = false; /** * Default initial capacity of `16`. * @type {number} * @expose */ ByteBuffer.DEFAULT_CAPACITY = 16; /** * Default endianess of `false` for big endian. * @type {boolean} * @expose */ ByteBuffer.DEFAULT_ENDIAN = ByteBuffer.BIG_ENDIAN; /** * Default no assertions flag of `false`. * @type {boolean} * @expose */ ByteBuffer.DEFAULT_NOASSERT = false; /** * A `Long` class for representing a 64-bit two's-complement integer value. May be `null` if Long.js has not been loaded * and int64 support is not available. * @type {?Long} * @const * @see https://github.com/dcodeIO/long.js * @expose */ ByteBuffer.Long = Long || null; /** * @alias ByteBuffer.prototype * @inner */ var ByteBufferPrototype = ByteBuffer.prototype; /** * An indicator used to reliably determine if an object is a ByteBuffer or not. * @type {boolean} * @const * @expose * @private */ ByteBufferPrototype.__isByteBuffer__; Object.defineProperty(ByteBufferPrototype, "__isByteBuffer__", { value: true, enumerable: false, configurable: false }); // helpers /** * @type {!ArrayBuffer} * @inner */ var EMPTY_BUFFER = new ArrayBuffer(0); /** * String.fromCharCode reference for compile-time renaming. * @type {function(...number):string} * @inner */ var stringFromCharCode = String.fromCharCode; /** * Creates a source function for a string. * @param {string} s String to read from * @returns {function():number|null} Source function returning the next char code respectively `null` if there are * no more characters left. * @throws {TypeError} If the argument is invalid * @inner */ function stringSource(s) { var i=0; return function() { return i < s.length ? s.charCodeAt(i++) : null; }; } /** * Creates a destination function for a string. * @returns {function(number=):undefined|string} Destination function successively called with the next char code. * Returns the final string when called without arguments. * @inner */ function stringDestination() { var cs = [], ps = []; return function() { if (arguments.length === 0) return ps.join('')+stringFromCharCode.apply(String, cs); if (cs.length + arguments.length > 1024) ps.push(stringFromCharCode.apply(String, cs)), cs.length = 0; Array.prototype.push.apply(cs, arguments); }; } /** * Gets the accessor type. * @returns {Function} `Buffer` under node.js, `Uint8Array` respectively `DataView` in the browser (classes) * @expose */ ByteBuffer.accessor = function() { return Uint8Array; }; /** * Allocates a new ByteBuffer backed by a buffer of the specified capacity. * @param {number=} capacity Initial capacity. Defaults to {@link ByteBuffer.DEFAULT_CAPACITY}. * @param {boolean=} littleEndian Whether to use little or big endian byte order. Defaults to * {@link ByteBuffer.DEFAULT_ENDIAN}. * @param {boolean=} noAssert Whether to skip assertions of offsets and values. Defaults to * {@link ByteBuffer.DEFAULT_NOASSERT}. * @returns {!ByteBuffer} * @expose */ ByteBuffer.allocate = function(capacity, littleEndian, noAssert) { return new ByteBuffer(capacity, littleEndian, noAssert); }; /** * Concatenates multiple ByteBuffers into one. * @param {!Array.} buffers Buffers to concatenate * @param {(string|boolean)=} encoding String encoding if `buffers` contains a string ("base64", "hex", "binary", * defaults to "utf8") * @param {boolean=} littleEndian Whether to use little or big endian byte order for the resulting ByteBuffer. Defaults * to {@link ByteBuffer.DEFAULT_ENDIAN}. * @param {boolean=} noAssert Whether to skip assertions of offsets and values for the resulting ByteBuffer. Defaults to * {@link ByteBuffer.DEFAULT_NOASSERT}. * @returns {!ByteBuffer} Concatenated ByteBuffer * @expose */ ByteBuffer.concat = function(buffers, encoding, littleEndian, noAssert) { if (typeof encoding === 'boolean' || typeof encoding !== 'string') { noAssert = littleEndian; littleEndian = encoding; encoding = undefined; } var capacity = 0; for (var i=0, k=buffers.length, length; i 0) capacity += length; } if (capacity === 0) return new ByteBuffer(0, littleEndian, noAssert); var bb = new ByteBuffer(capacity, littleEndian, noAssert), bi; i=0; while (i} buffer Anything that can be wrapped * @param {(string|boolean)=} encoding String encoding if `buffer` is a string ("base64", "hex", "binary", defaults to * "utf8") * @param {boolean=} littleEndian Whether to use little or big endian byte order. Defaults to * {@link ByteBuffer.DEFAULT_ENDIAN}. * @param {boolean=} noAssert Whether to skip assertions of offsets and values. Defaults to * {@link ByteBuffer.DEFAULT_NOASSERT}. * @returns {!ByteBuffer} A ByteBuffer wrapping `buffer` * @expose */ ByteBuffer.wrap = function(buffer, encoding, littleEndian, noAssert) { if (typeof encoding !== 'string') { noAssert = littleEndian; littleEndian = encoding; encoding = undefined; } if (typeof buffer === 'string') { if (typeof encoding === 'undefined') encoding = "utf8"; switch (encoding) { case "base64": return ByteBuffer.fromBase64(buffer, littleEndian); case "hex": return ByteBuffer.fromHex(buffer, littleEndian); case "binary": return ByteBuffer.fromBinary(buffer, littleEndian); case "utf8": return ByteBuffer.fromUTF8(buffer, littleEndian); case "debug": return ByteBuffer.fromDebug(buffer, littleEndian); default: throw Error("Unsupported encoding: "+encoding); } } if (buffer === null || typeof buffer !== 'object') throw TypeError("Illegal buffer"); var bb; if (ByteBuffer.isByteBuffer(buffer)) { bb = ByteBufferPrototype.clone.call(buffer); bb.markedOffset = -1; return bb; } if (buffer instanceof Uint8Array) { // Extract ArrayBuffer from Uint8Array bb = new ByteBuffer(0, littleEndian, noAssert); if (buffer.length > 0) { // Avoid references to more than one EMPTY_BUFFER bb.buffer = buffer.buffer; bb.offset = buffer.byteOffset; bb.limit = buffer.byteOffset + buffer.byteLength; bb.view = new Uint8Array(buffer.buffer); } } else if (buffer instanceof ArrayBuffer) { // Reuse ArrayBuffer bb = new ByteBuffer(0, littleEndian, noAssert); if (buffer.byteLength > 0) { bb.buffer = buffer; bb.offset = 0; bb.limit = buffer.byteLength; bb.view = buffer.byteLength > 0 ? new Uint8Array(buffer) : null; } } else if (Object.prototype.toString.call(buffer) === "[object Array]") { // Create from octets bb = new ByteBuffer(buffer.length, littleEndian, noAssert); bb.limit = buffer.length; for (var i=0; i} value Array of booleans to write * @param {number=} offset Offset to read from. Will use and increase {@link ByteBuffer#offset} by `length` if omitted. * @returns {!ByteBuffer} * @expose */ ByteBufferPrototype.writeBitSet = function(value, offset) { var relative = typeof offset === 'undefined'; if (relative) offset = this.offset; if (!this.noAssert) { if (!(value instanceof Array)) throw TypeError("Illegal BitSet: Not an array"); if (typeof offset !== 'number' || offset % 1 !== 0) throw TypeError("Illegal offset: "+offset+" (not an integer)"); offset >>>= 0; if (offset < 0 || offset + 0 > this.buffer.byteLength) throw RangeError("Illegal offset: 0 <= "+offset+" (+"+0+") <= "+this.buffer.byteLength); } var start = offset, bits = value.length, bytes = (bits >> 3), bit = 0, k; offset += this.writeVarint32(bits,offset); while(bytes--) { k = (!!value[bit++] & 1) | ((!!value[bit++] & 1) << 1) | ((!!value[bit++] & 1) << 2) | ((!!value[bit++] & 1) << 3) | ((!!value[bit++] & 1) << 4) | ((!!value[bit++] & 1) << 5) | ((!!value[bit++] & 1) << 6) | ((!!value[bit++] & 1) << 7); this.writeByte(k,offset++); } if(bit < bits) { var m = 0; k = 0; while(bit < bits) k = k | ((!!value[bit++] & 1) << (m++)); this.writeByte(k,offset++); } if (relative) { this.offset = offset; return this; } return offset - start; } /** * Reads a BitSet as an array of booleans. * @param {number=} offset Offset to read from. Will use and increase {@link ByteBuffer#offset} by `length` if omitted. * @returns {Array * @expose */ ByteBufferPrototype.readBitSet = function(offset) { var relative = typeof offset === 'undefined'; if (relative) offset = this.offset; var ret = this.readVarint32(offset), bits = ret.value, bytes = (bits >> 3), bit = 0, value = [], k; offset += ret.length; while(bytes--) { k = this.readByte(offset++); value[bit++] = !!(k & 0x01); value[bit++] = !!(k & 0x02); value[bit++] = !!(k & 0x04); value[bit++] = !!(k & 0x08); value[bit++] = !!(k & 0x10); value[bit++] = !!(k & 0x20); value[bit++] = !!(k & 0x40); value[bit++] = !!(k & 0x80); } if(bit < bits) { var m = 0; k = this.readByte(offset++); while(bit < bits) value[bit++] = !!((k >> (m++)) & 1); } if (relative) { this.offset = offset; } return value; } /** * Reads the specified number of bytes. * @param {number} length Number of bytes to read * @param {number=} offset Offset to read from. Will use and increase {@link ByteBuffer#offset} by `length` if omitted. * @returns {!ByteBuffer} * @expose */ ByteBufferPrototype.readBytes = function(length, offset) { var relative = typeof offset === 'undefined'; if (relative) offset = this.offset; if (!this.noAssert) { if (typeof offset !== 'number' || offset % 1 !== 0) throw TypeError("Illegal offset: "+offset+" (not an integer)"); offset >>>= 0; if (offset < 0 || offset + length > this.buffer.byteLength) throw RangeError("Illegal offset: 0 <= "+offset+" (+"+length+") <= "+this.buffer.byteLength); } var slice = this.slice(offset, offset + length); if (relative) this.offset += length; return slice; }; /** * Writes a payload of bytes. This is an alias of {@link ByteBuffer#append}. * @function * @param {!ByteBuffer|!ArrayBuffer|!Uint8Array|string} source Data to write. If `source` is a ByteBuffer, its offsets * will be modified according to the performed read operation. * @param {(string|number)=} encoding Encoding if `data` is a string ("base64", "hex", "binary", defaults to "utf8") * @param {number=} offset Offset to write to. Will use and increase {@link ByteBuffer#offset} by the number of bytes * written if omitted. * @returns {!ByteBuffer} this * @expose */ ByteBufferPrototype.writeBytes = ByteBufferPrototype.append; // types/ints/int8 /** * Writes an 8bit signed integer. * @param {number} value Value to write * @param {number=} offset Offset to write to. Will use and advance {@link ByteBuffer#offset} by `1` if omitted. * @returns {!ByteBuffer} this * @expose */ ByteBufferPrototype.writeInt8 = function(value, offset) { var relative = typeof offset === 'undefined'; if (relative) offset = this.offset; if (!this.noAssert) { if (typeof value !== 'number' || value % 1 !== 0) throw TypeError("Illegal value: "+value+" (not an integer)"); value |= 0; if (typeof offset !== 'number' || offset % 1 !== 0) throw TypeError("Illegal offset: "+offset+" (not an integer)"); offset >>>= 0; if (offset < 0 || offset + 0 > this.buffer.byteLength) throw RangeError("Illegal offset: 0 <= "+offset+" (+"+0+") <= "+this.buffer.byteLength); } offset += 1; var capacity0 = this.buffer.byteLength; if (offset > capacity0) this.resize((capacity0 *= 2) > offset ? capacity0 : offset); offset -= 1; this.view[offset] = value; if (relative) this.offset += 1; return this; }; /** * Writes an 8bit signed integer. This is an alias of {@link ByteBuffer#writeInt8}. * @function * @param {number} value Value to write * @param {number=} offset Offset to write to. Will use and advance {@link ByteBuffer#offset} by `1` if omitted. * @returns {!ByteBuffer} this * @expose */ ByteBufferPrototype.writeByte = ByteBufferPrototype.writeInt8; /** * Reads an 8bit signed integer. * @param {number=} offset Offset to read from. Will use and advance {@link ByteBuffer#offset} by `1` if omitted. * @returns {number} Value read * @expose */ ByteBufferPrototype.readInt8 = function(offset) { var relative = typeof offset === 'undefined'; if (relative) offset = this.offset; if (!this.noAssert) { if (typeof offset !== 'number' || offset % 1 !== 0) throw TypeError("Illegal offset: "+offset+" (not an integer)"); offset >>>= 0; if (offset < 0 || offset + 1 > this.buffer.byteLength) throw RangeError("Illegal offset: 0 <= "+offset+" (+"+1+") <= "+this.buffer.byteLength); } var value = this.view[offset]; if ((value & 0x80) === 0x80) value = -(0xFF - value + 1); // Cast to signed if (relative) this.offset += 1; return value; }; /** * Reads an 8bit signed integer. This is an alias of {@link ByteBuffer#readInt8}. * @function * @param {number=} offset Offset to read from. Will use and advance {@link ByteBuffer#offset} by `1` if omitted. * @returns {number} Value read * @expose */ ByteBufferPrototype.readByte = ByteBufferPrototype.readInt8; /** * Writes an 8bit unsigned integer. * @param {number} value Value to write * @param {number=} offset Offset to write to. Will use and advance {@link ByteBuffer#offset} by `1` if omitted. * @returns {!ByteBuffer} this * @expose */ ByteBufferPrototype.writeUint8 = function(value, offset) { var relative = typeof offset === 'undefined'; if (relative) offset = this.offset; if (!this.noAssert) { if (typeof value !== 'number' || value % 1 !== 0) throw TypeError("Illegal value: "+value+" (not an integer)"); value >>>= 0; if (typeof offset !== 'number' || offset % 1 !== 0) throw TypeError("Illegal offset: "+offset+" (not an integer)"); offset >>>= 0; if (offset < 0 || offset + 0 > this.buffer.byteLength) throw RangeError("Illegal offset: 0 <= "+offset+" (+"+0+") <= "+this.buffer.byteLength); } offset += 1; var capacity1 = this.buffer.byteLength; if (offset > capacity1) this.resize((capacity1 *= 2) > offset ? capacity1 : offset); offset -= 1; this.view[offset] = value; if (relative) this.offset += 1; return this; }; /** * Writes an 8bit unsigned integer. This is an alias of {@link ByteBuffer#writeUint8}. * @function * @param {number} value Value to write * @param {number=} offset Offset to write to. Will use and advance {@link ByteBuffer#offset} by `1` if omitted. * @returns {!ByteBuffer} this * @expose */ ByteBufferPrototype.writeUInt8 = ByteBufferPrototype.writeUint8; /** * Reads an 8bit unsigned integer. * @param {number=} offset Offset to read from. Will use and advance {@link ByteBuffer#offset} by `1` if omitted. * @returns {number} Value read * @expose */ ByteBufferPrototype.readUint8 = function(offset) { var relative = typeof offset === 'undefined'; if (relative) offset = this.offset; if (!this.noAssert) { if (typeof offset !== 'number' || offset % 1 !== 0) throw TypeError("Illegal offset: "+offset+" (not an integer)"); offset >>>= 0; if (offset < 0 || offset + 1 > this.buffer.byteLength) throw RangeError("Illegal offset: 0 <= "+offset+" (+"+1+") <= "+this.buffer.byteLength); } var value = this.view[offset]; if (relative) this.offset += 1; return value; }; /** * Reads an 8bit unsigned integer. This is an alias of {@link ByteBuffer#readUint8}. * @function * @param {number=} offset Offset to read from. Will use and advance {@link ByteBuffer#offset} by `1` if omitted. * @returns {number} Value read * @expose */ ByteBufferPrototype.readUInt8 = ByteBufferPrototype.readUint8; // types/ints/int16 /** * Writes a 16bit signed integer. * @param {number} value Value to write * @param {number=} offset Offset to write to. Will use and advance {@link ByteBuffer#offset} by `2` if omitted. * @throws {TypeError} If `offset` or `value` is not a valid number * @throws {RangeError} If `offset` is out of bounds * @expose */ ByteBufferPrototype.writeInt16 = function(value, offset) { var relative = typeof offset === 'undefined'; if (relative) offset = this.offset; if (!this.noAssert) { if (typeof value !== 'number' || value % 1 !== 0) throw TypeError("Illegal value: "+value+" (not an integer)"); value |= 0; if (typeof offset !== 'number' || offset % 1 !== 0) throw TypeError("Illegal offset: "+offset+" (not an integer)"); offset >>>= 0; if (offset < 0 || offset + 0 > this.buffer.byteLength) throw RangeError("Illegal offset: 0 <= "+offset+" (+"+0+") <= "+this.buffer.byteLength); } offset += 2; var capacity2 = this.buffer.byteLength; if (offset > capacity2) this.resize((capacity2 *= 2) > offset ? capacity2 : offset); offset -= 2; if (this.littleEndian) { this.view[offset+1] = (value & 0xFF00) >>> 8; this.view[offset ] = value & 0x00FF; } else { this.view[offset] = (value & 0xFF00) >>> 8; this.view[offset+1] = value & 0x00FF; } if (relative) this.offset += 2; return this; }; /** * Writes a 16bit signed integer. This is an alias of {@link ByteBuffer#writeInt16}. * @function * @param {number} value Value to write * @param {number=} offset Offset to write to. Will use and advance {@link ByteBuffer#offset} by `2` if omitted. * @throws {TypeError} If `offset` or `value` is not a valid number * @throws {RangeError} If `offset` is out of bounds * @expose */ ByteBufferPrototype.writeShort = ByteBufferPrototype.writeInt16; /** * Reads a 16bit signed integer. * @param {number=} offset Offset to read from. Will use and advance {@link ByteBuffer#offset} by `2` if omitted. * @returns {number} Value read * @throws {TypeError} If `offset` is not a valid number * @throws {RangeError} If `offset` is out of bounds * @expose */ ByteBufferPrototype.readInt16 = function(offset) { var relative = typeof offset === 'undefined'; if (relative) offset = this.offset; if (!this.noAssert) { if (typeof offset !== 'number' || offset % 1 !== 0) throw TypeError("Illegal offset: "+offset+" (not an integer)"); offset >>>= 0; if (offset < 0 || offset + 2 > this.buffer.byteLength) throw RangeError("Illegal offset: 0 <= "+offset+" (+"+2+") <= "+this.buffer.byteLength); } var value = 0; if (this.littleEndian) { value = this.view[offset ]; value |= this.view[offset+1] << 8; } else { value = this.view[offset ] << 8; value |= this.view[offset+1]; } if ((value & 0x8000) === 0x8000) value = -(0xFFFF - value + 1); // Cast to signed if (relative) this.offset += 2; return value; }; /** * Reads a 16bit signed integer. This is an alias of {@link ByteBuffer#readInt16}. * @function * @param {number=} offset Offset to read from. Will use and advance {@link ByteBuffer#offset} by `2` if omitted. * @returns {number} Value read * @throws {TypeError} If `offset` is not a valid number * @throws {RangeError} If `offset` is out of bounds * @expose */ ByteBufferPrototype.readShort = ByteBufferPrototype.readInt16; /** * Writes a 16bit unsigned integer. * @param {number} value Value to write * @param {number=} offset Offset to write to. Will use and advance {@link ByteBuffer#offset} by `2` if omitted. * @throws {TypeError} If `offset` or `value` is not a valid number * @throws {RangeError} If `offset` is out of bounds * @expose */ ByteBufferPrototype.writeUint16 = function(value, offset) { var relative = typeof offset === 'undefined'; if (relative) offset = this.offset; if (!this.noAssert) { if (typeof value !== 'number' || value % 1 !== 0) throw TypeError("Illegal value: "+value+" (not an integer)"); value >>>= 0; if (typeof offset !== 'number' || offset % 1 !== 0) throw TypeError("Illegal offset: "+offset+" (not an integer)"); offset >>>= 0; if (offset < 0 || offset + 0 > this.buffer.byteLength) throw RangeError("Illegal offset: 0 <= "+offset+" (+"+0+") <= "+this.buffer.byteLength); } offset += 2; var capacity3 = this.buffer.byteLength; if (offset > capacity3) this.resize((capacity3 *= 2) > offset ? capacity3 : offset); offset -= 2; if (this.littleEndian) { this.view[offset+1] = (value & 0xFF00) >>> 8; this.view[offset ] = value & 0x00FF; } else { this.view[offset] = (value & 0xFF00) >>> 8; this.view[offset+1] = value & 0x00FF; } if (relative) this.offset += 2; return this; }; /** * Writes a 16bit unsigned integer. This is an alias of {@link ByteBuffer#writeUint16}. * @function * @param {number} value Value to write * @param {number=} offset Offset to write to. Will use and advance {@link ByteBuffer#offset} by `2` if omitted. * @throws {TypeError} If `offset` or `value` is not a valid number * @throws {RangeError} If `offset` is out of bounds * @expose */ ByteBufferPrototype.writeUInt16 = ByteBufferPrototype.writeUint16; /** * Reads a 16bit unsigned integer. * @param {number=} offset Offset to read from. Will use and advance {@link ByteBuffer#offset} by `2` if omitted. * @returns {number} Value read * @throws {TypeError} If `offset` is not a valid number * @throws {RangeError} If `offset` is out of bounds * @expose */ ByteBufferPrototype.readUint16 = function(offset) { var relative = typeof offset === 'undefined'; if (relative) offset = this.offset; if (!this.noAssert) { if (typeof offset !== 'number' || offset % 1 !== 0) throw TypeError("Illegal offset: "+offset+" (not an integer)"); offset >>>= 0; if (offset < 0 || offset + 2 > this.buffer.byteLength) throw RangeError("Illegal offset: 0 <= "+offset+" (+"+2+") <= "+this.buffer.byteLength); } var value = 0; if (this.littleEndian) { value = this.view[offset ]; value |= this.view[offset+1] << 8; } else { value = this.view[offset ] << 8; value |= this.view[offset+1]; } if (relative) this.offset += 2; return value; }; /** * Reads a 16bit unsigned integer. This is an alias of {@link ByteBuffer#readUint16}. * @function * @param {number=} offset Offset to read from. Will use and advance {@link ByteBuffer#offset} by `2` if omitted. * @returns {number} Value read * @throws {TypeError} If `offset` is not a valid number * @throws {RangeError} If `offset` is out of bounds * @expose */ ByteBufferPrototype.readUInt16 = ByteBufferPrototype.readUint16; // types/ints/int32 /** * Writes a 32bit signed integer. * @param {number} value Value to write * @param {number=} offset Offset to write to. Will use and increase {@link ByteBuffer#offset} by `4` if omitted. * @expose */ ByteBufferPrototype.writeInt32 = function(value, offset) { var relative = typeof offset === 'undefined'; if (relative) offset = this.offset; if (!this.noAssert) { if (typeof value !== 'number' || value % 1 !== 0) throw TypeError("Illegal value: "+value+" (not an integer)"); value |= 0; if (typeof offset !== 'number' || offset % 1 !== 0) throw TypeError("Illegal offset: "+offset+" (not an integer)"); offset >>>= 0; if (offset < 0 || offset + 0 > this.buffer.byteLength) throw RangeError("Illegal offset: 0 <= "+offset+" (+"+0+") <= "+this.buffer.byteLength); } offset += 4; var capacity4 = this.buffer.byteLength; if (offset > capacity4) this.resize((capacity4 *= 2) > offset ? capacity4 : offset); offset -= 4; if (this.littleEndian) { this.view[offset+3] = (value >>> 24) & 0xFF; this.view[offset+2] = (value >>> 16) & 0xFF; this.view[offset+1] = (value >>> 8) & 0xFF; this.view[offset ] = value & 0xFF; } else { this.view[offset ] = (value >>> 24) & 0xFF; this.view[offset+1] = (value >>> 16) & 0xFF; this.view[offset+2] = (value >>> 8) & 0xFF; this.view[offset+3] = value & 0xFF; } if (relative) this.offset += 4; return this; }; /** * Writes a 32bit signed integer. This is an alias of {@link ByteBuffer#writeInt32}. * @param {number} value Value to write * @param {number=} offset Offset to write to. Will use and increase {@link ByteBuffer#offset} by `4` if omitted. * @expose */ ByteBufferPrototype.writeInt = ByteBufferPrototype.writeInt32; /** * Reads a 32bit signed integer. * @param {number=} offset Offset to read from. Will use and increase {@link ByteBuffer#offset} by `4` if omitted. * @returns {number} Value read * @expose */ ByteBufferPrototype.readInt32 = function(offset) { var relative = typeof offset === 'undefined'; if (relative) offset = this.offset; if (!this.noAssert) { if (typeof offset !== 'number' || offset % 1 !== 0) throw TypeError("Illegal offset: "+offset+" (not an integer)"); offset >>>= 0; if (offset < 0 || offset + 4 > this.buffer.byteLength) throw RangeError("Illegal offset: 0 <= "+offset+" (+"+4+") <= "+this.buffer.byteLength); } var value = 0; if (this.littleEndian) { value = this.view[offset+2] << 16; value |= this.view[offset+1] << 8; value |= this.view[offset ]; value += this.view[offset+3] << 24 >>> 0; } else { value = this.view[offset+1] << 16; value |= this.view[offset+2] << 8; value |= this.view[offset+3]; value += this.view[offset ] << 24 >>> 0; } value |= 0; // Cast to signed if (relative) this.offset += 4; return value; }; /** * Reads a 32bit signed integer. This is an alias of {@link ByteBuffer#readInt32}. * @param {number=} offset Offset to read from. Will use and advance {@link ByteBuffer#offset} by `4` if omitted. * @returns {number} Value read * @expose */ ByteBufferPrototype.readInt = ByteBufferPrototype.readInt32; /** * Writes a 32bit unsigned integer. * @param {number} value Value to write * @param {number=} offset Offset to write to. Will use and increase {@link ByteBuffer#offset} by `4` if omitted. * @expose */ ByteBufferPrototype.writeUint32 = function(value, offset) { var relative = typeof offset === 'undefined'; if (relative) offset = this.offset; if (!this.noAssert) { if (typeof value !== 'number' || value % 1 !== 0) throw TypeError("Illegal value: "+value+" (not an integer)"); value >>>= 0; if (typeof offset !== 'number' || offset % 1 !== 0) throw TypeError("Illegal offset: "+offset+" (not an integer)"); offset >>>= 0; if (offset < 0 || offset + 0 > this.buffer.byteLength) throw RangeError("Illegal offset: 0 <= "+offset+" (+"+0+") <= "+this.buffer.byteLength); } offset += 4; var capacity5 = this.buffer.byteLength; if (offset > capacity5) this.resize((capacity5 *= 2) > offset ? capacity5 : offset); offset -= 4; if (this.littleEndian) { this.view[offset+3] = (value >>> 24) & 0xFF; this.view[offset+2] = (value >>> 16) & 0xFF; this.view[offset+1] = (value >>> 8) & 0xFF; this.view[offset ] = value & 0xFF; } else { this.view[offset ] = (value >>> 24) & 0xFF; this.view[offset+1] = (value >>> 16) & 0xFF; this.view[offset+2] = (value >>> 8) & 0xFF; this.view[offset+3] = value & 0xFF; } if (relative) this.offset += 4; return this; }; /** * Writes a 32bit unsigned integer. This is an alias of {@link ByteBuffer#writeUint32}. * @function * @param {number} value Value to write * @param {number=} offset Offset to write to. Will use and increase {@link ByteBuffer#offset} by `4` if omitted. * @expose */ ByteBufferPrototype.writeUInt32 = ByteBufferPrototype.writeUint32; /** * Reads a 32bit unsigned integer. * @param {number=} offset Offset to read from. Will use and increase {@link ByteBuffer#offset} by `4` if omitted. * @returns {number} Value read * @expose */ ByteBufferPrototype.readUint32 = function(offset) { var relative = typeof offset === 'undefined'; if (relative) offset = this.offset; if (!this.noAssert) { if (typeof offset !== 'number' || offset % 1 !== 0) throw TypeError("Illegal offset: "+offset+" (not an integer)"); offset >>>= 0; if (offset < 0 || offset + 4 > this.buffer.byteLength) throw RangeError("Illegal offset: 0 <= "+offset+" (+"+4+") <= "+this.buffer.byteLength); } var value = 0; if (this.littleEndian) { value = this.view[offset+2] << 16; value |= this.view[offset+1] << 8; value |= this.view[offset ]; value += this.view[offset+3] << 24 >>> 0; } else { value = this.view[offset+1] << 16; value |= this.view[offset+2] << 8; value |= this.view[offset+3]; value += this.view[offset ] << 24 >>> 0; } if (relative) this.offset += 4; return value; }; /** * Reads a 32bit unsigned integer. This is an alias of {@link ByteBuffer#readUint32}. * @function * @param {number=} offset Offset to read from. Will use and increase {@link ByteBuffer#offset} by `4` if omitted. * @returns {number} Value read * @expose */ ByteBufferPrototype.readUInt32 = ByteBufferPrototype.readUint32; // types/ints/int64 if (Long) { /** * Writes a 64bit signed integer. * @param {number|!Long} value Value to write * @param {number=} offset Offset to write to. Will use and increase {@link ByteBuffer#offset} by `8` if omitted. * @returns {!ByteBuffer} this * @expose */ ByteBufferPrototype.writeInt64 = function(value, offset) { var relative = typeof offset === 'undefined'; if (relative) offset = this.offset; if (!this.noAssert) { if (typeof value === 'number') value = Long.fromNumber(value); else if (typeof value === 'string') value = Long.fromString(value); else if (!(value && value instanceof Long)) throw TypeError("Illegal value: "+value+" (not an integer or Long)"); if (typeof offset !== 'number' || offset % 1 !== 0) throw TypeError("Illegal offset: "+offset+" (not an integer)"); offset >>>= 0; if (offset < 0 || offset + 0 > this.buffer.byteLength) throw RangeError("Illegal offset: 0 <= "+offset+" (+"+0+") <= "+this.buffer.byteLength); } if (typeof value === 'number') value = Long.fromNumber(value); else if (typeof value === 'string') value = Long.fromString(value); offset += 8; var capacity6 = this.buffer.byteLength; if (offset > capacity6) this.resize((capacity6 *= 2) > offset ? capacity6 : offset); offset -= 8; var lo = value.low, hi = value.high; if (this.littleEndian) { this.view[offset+3] = (lo >>> 24) & 0xFF; this.view[offset+2] = (lo >>> 16) & 0xFF; this.view[offset+1] = (lo >>> 8) & 0xFF; this.view[offset ] = lo & 0xFF; offset += 4; this.view[offset+3] = (hi >>> 24) & 0xFF; this.view[offset+2] = (hi >>> 16) & 0xFF; this.view[offset+1] = (hi >>> 8) & 0xFF; this.view[offset ] = hi & 0xFF; } else { this.view[offset ] = (hi >>> 24) & 0xFF; this.view[offset+1] = (hi >>> 16) & 0xFF; this.view[offset+2] = (hi >>> 8) & 0xFF; this.view[offset+3] = hi & 0xFF; offset += 4; this.view[offset ] = (lo >>> 24) & 0xFF; this.view[offset+1] = (lo >>> 16) & 0xFF; this.view[offset+2] = (lo >>> 8) & 0xFF; this.view[offset+3] = lo & 0xFF; } if (relative) this.offset += 8; return this; }; /** * Writes a 64bit signed integer. This is an alias of {@link ByteBuffer#writeInt64}. * @param {number|!Long} value Value to write * @param {number=} offset Offset to write to. Will use and increase {@link ByteBuffer#offset} by `8` if omitted. * @returns {!ByteBuffer} this * @expose */ ByteBufferPrototype.writeLong = ByteBufferPrototype.writeInt64; /** * Reads a 64bit signed integer. * @param {number=} offset Offset to read from. Will use and increase {@link ByteBuffer#offset} by `8` if omitted. * @returns {!Long} * @expose */ ByteBufferPrototype.readInt64 = function(offset) { var relative = typeof offset === 'undefined'; if (relative) offset = this.offset; if (!this.noAssert) { if (typeof offset !== 'number' || offset % 1 !== 0) throw TypeError("Illegal offset: "+offset+" (not an integer)"); offset >>>= 0; if (offset < 0 || offset + 8 > this.buffer.byteLength) throw RangeError("Illegal offset: 0 <= "+offset+" (+"+8+") <= "+this.buffer.byteLength); } var lo = 0, hi = 0; if (this.littleEndian) { lo = this.view[offset+2] << 16; lo |= this.view[offset+1] << 8; lo |= this.view[offset ]; lo += this.view[offset+3] << 24 >>> 0; offset += 4; hi = this.view[offset+2] << 16; hi |= this.view[offset+1] << 8; hi |= this.view[offset ]; hi += this.view[offset+3] << 24 >>> 0; } else { hi = this.view[offset+1] << 16; hi |= this.view[offset+2] << 8; hi |= this.view[offset+3]; hi += this.view[offset ] << 24 >>> 0; offset += 4; lo = this.view[offset+1] << 16; lo |= this.view[offset+2] << 8; lo |= this.view[offset+3]; lo += this.view[offset ] << 24 >>> 0; } var value = new Long(lo, hi, false); if (relative) this.offset += 8; return value; }; /** * Reads a 64bit signed integer. This is an alias of {@link ByteBuffer#readInt64}. * @param {number=} offset Offset to read from. Will use and increase {@link ByteBuffer#offset} by `8` if omitted. * @returns {!Long} * @expose */ ByteBufferPrototype.readLong = ByteBufferPrototype.readInt64; /** * Writes a 64bit unsigned integer. * @param {number|!Long} value Value to write * @param {number=} offset Offset to write to. Will use and increase {@link ByteBuffer#offset} by `8` if omitted. * @returns {!ByteBuffer} this * @expose */ ByteBufferPrototype.writeUint64 = function(value, offset) { var relative = typeof offset === 'undefined'; if (relative) offset = this.offset; if (!this.noAssert) { if (typeof value === 'number') value = Long.fromNumber(value); else if (typeof value === 'string') value = Long.fromString(value); else if (!(value && value instanceof Long)) throw TypeError("Illegal value: "+value+" (not an integer or Long)"); if (typeof offset !== 'number' || offset % 1 !== 0) throw TypeError("Illegal offset: "+offset+" (not an integer)"); offset >>>= 0; if (offset < 0 || offset + 0 > this.buffer.byteLength) throw RangeError("Illegal offset: 0 <= "+offset+" (+"+0+") <= "+this.buffer.byteLength); } if (typeof value === 'number') value = Long.fromNumber(value); else if (typeof value === 'string') value = Long.fromString(value); offset += 8; var capacity7 = this.buffer.byteLength; if (offset > capacity7) this.resize((capacity7 *= 2) > offset ? capacity7 : offset); offset -= 8; var lo = value.low, hi = value.high; if (this.littleEndian) { this.view[offset+3] = (lo >>> 24) & 0xFF; this.view[offset+2] = (lo >>> 16) & 0xFF; this.view[offset+1] = (lo >>> 8) & 0xFF; this.view[offset ] = lo & 0xFF; offset += 4; this.view[offset+3] = (hi >>> 24) & 0xFF; this.view[offset+2] = (hi >>> 16) & 0xFF; this.view[offset+1] = (hi >>> 8) & 0xFF; this.view[offset ] = hi & 0xFF; } else { this.view[offset ] = (hi >>> 24) & 0xFF; this.view[offset+1] = (hi >>> 16) & 0xFF; this.view[offset+2] = (hi >>> 8) & 0xFF; this.view[offset+3] = hi & 0xFF; offset += 4; this.view[offset ] = (lo >>> 24) & 0xFF; this.view[offset+1] = (lo >>> 16) & 0xFF; this.view[offset+2] = (lo >>> 8) & 0xFF; this.view[offset+3] = lo & 0xFF; } if (relative) this.offset += 8; return this; }; /** * Writes a 64bit unsigned integer. This is an alias of {@link ByteBuffer#writeUint64}. * @function * @param {number|!Long} value Value to write * @param {number=} offset Offset to write to. Will use and increase {@link ByteBuffer#offset} by `8` if omitted. * @returns {!ByteBuffer} this * @expose */ ByteBufferPrototype.writeUInt64 = ByteBufferPrototype.writeUint64; /** * Reads a 64bit unsigned integer. * @param {number=} offset Offset to read from. Will use and increase {@link ByteBuffer#offset} by `8` if omitted. * @returns {!Long} * @expose */ ByteBufferPrototype.readUint64 = function(offset) { var relative = typeof offset === 'undefined'; if (relative) offset = this.offset; if (!this.noAssert) { if (typeof offset !== 'number' || offset % 1 !== 0) throw TypeError("Illegal offset: "+offset+" (not an integer)"); offset >>>= 0; if (offset < 0 || offset + 8 > this.buffer.byteLength) throw RangeError("Illegal offset: 0 <= "+offset+" (+"+8+") <= "+this.buffer.byteLength); } var lo = 0, hi = 0; if (this.littleEndian) { lo = this.view[offset+2] << 16; lo |= this.view[offset+1] << 8; lo |= this.view[offset ]; lo += this.view[offset+3] << 24 >>> 0; offset += 4; hi = this.view[offset+2] << 16; hi |= this.view[offset+1] << 8; hi |= this.view[offset ]; hi += this.view[offset+3] << 24 >>> 0; } else { hi = this.view[offset+1] << 16; hi |= this.view[offset+2] << 8; hi |= this.view[offset+3]; hi += this.view[offset ] << 24 >>> 0; offset += 4; lo = this.view[offset+1] << 16; lo |= this.view[offset+2] << 8; lo |= this.view[offset+3]; lo += this.view[offset ] << 24 >>> 0; } var value = new Long(lo, hi, true); if (relative) this.offset += 8; return value; }; /** * Reads a 64bit unsigned integer. This is an alias of {@link ByteBuffer#readUint64}. * @function * @param {number=} offset Offset to read from. Will use and increase {@link ByteBuffer#offset} by `8` if omitted. * @returns {!Long} * @expose */ ByteBufferPrototype.readUInt64 = ByteBufferPrototype.readUint64; } // Long // types/floats/float32 /* ieee754 - https://github.com/feross/ieee754 The MIT License (MIT) Copyright (c) Feross Aboukhadijeh Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /** * Reads an IEEE754 float from a byte array. * @param {!Array} buffer * @param {number} offset * @param {boolean} isLE * @param {number} mLen * @param {number} nBytes * @returns {number} * @inner */ function ieee754_read(buffer, offset, isLE, mLen, nBytes) { var e, m, eLen = nBytes * 8 - mLen - 1, eMax = (1 << eLen) - 1, eBias = eMax >> 1, nBits = -7, i = isLE ? (nBytes - 1) : 0, d = isLE ? -1 : 1, s = buffer[offset + i]; i += d; e = s & ((1 << (-nBits)) - 1); s >>= (-nBits); nBits += eLen; for (; nBits > 0; e = e * 256 + buffer[offset + i], i += d, nBits -= 8) {} m = e & ((1 << (-nBits)) - 1); e >>= (-nBits); nBits += mLen; for (; nBits > 0; m = m * 256 + buffer[offset + i], i += d, nBits -= 8) {} if (e === 0) { e = 1 - eBias; } else if (e === eMax) { return m ? NaN : ((s ? -1 : 1) * Infinity); } else { m = m + Math.pow(2, mLen); e = e - eBias; } return (s ? -1 : 1) * m * Math.pow(2, e - mLen); } /** * Writes an IEEE754 float to a byte array. * @param {!Array} buffer * @param {number} value * @param {number} offset * @param {boolean} isLE * @param {number} mLen * @param {number} nBytes * @inner */ function ieee754_write(buffer, value, offset, isLE, mLen, nBytes) { var e, m, c, eLen = nBytes * 8 - mLen - 1, eMax = (1 << eLen) - 1, eBias = eMax >> 1, rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0), i = isLE ? 0 : (nBytes - 1), d = isLE ? 1 : -1, s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0; value = Math.abs(value); if (isNaN(value) || value === Infinity) { m = isNaN(value) ? 1 : 0; e = eMax; } else { e = Math.floor(Math.log(value) / Math.LN2); if (value * (c = Math.pow(2, -e)) < 1) { e--; c *= 2; } if (e + eBias >= 1) { value += rt / c; } else { value += rt * Math.pow(2, 1 - eBias); } if (value * c >= 2) { e++; c /= 2; } if (e + eBias >= eMax) { m = 0; e = eMax; } else if (e + eBias >= 1) { m = (value * c - 1) * Math.pow(2, mLen); e = e + eBias; } else { m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen); e = 0; } } for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {} e = (e << mLen) | m; eLen += mLen; for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {} buffer[offset + i - d] |= s * 128; } /** * Writes a 32bit float. * @param {number} value Value to write * @param {number=} offset Offset to write to. Will use and increase {@link ByteBuffer#offset} by `4` if omitted. * @returns {!ByteBuffer} this * @expose */ ByteBufferPrototype.writeFloat32 = function(value, offset) { var relative = typeof offset === 'undefined'; if (relative) offset = this.offset; if (!this.noAssert) { if (typeof value !== 'number') throw TypeError("Illegal value: "+value+" (not a number)"); if (typeof offset !== 'number' || offset % 1 !== 0) throw TypeError("Illegal offset: "+offset+" (not an integer)"); offset >>>= 0; if (offset < 0 || offset + 0 > this.buffer.byteLength) throw RangeError("Illegal offset: 0 <= "+offset+" (+"+0+") <= "+this.buffer.byteLength); } offset += 4; var capacity8 = this.buffer.byteLength; if (offset > capacity8) this.resize((capacity8 *= 2) > offset ? capacity8 : offset); offset -= 4; ieee754_write(this.view, value, offset, this.littleEndian, 23, 4); if (relative) this.offset += 4; return this; }; /** * Writes a 32bit float. This is an alias of {@link ByteBuffer#writeFloat32}. * @function * @param {number} value Value to write * @param {number=} offset Offset to write to. Will use and increase {@link ByteBuffer#offset} by `4` if omitted. * @returns {!ByteBuffer} this * @expose */ ByteBufferPrototype.writeFloat = ByteBufferPrototype.writeFloat32; /** * Reads a 32bit float. * @param {number=} offset Offset to read from. Will use and increase {@link ByteBuffer#offset} by `4` if omitted. * @returns {number} * @expose */ ByteBufferPrototype.readFloat32 = function(offset) { var relative = typeof offset === 'undefined'; if (relative) offset = this.offset; if (!this.noAssert) { if (typeof offset !== 'number' || offset % 1 !== 0) throw TypeError("Illegal offset: "+offset+" (not an integer)"); offset >>>= 0; if (offset < 0 || offset + 4 > this.buffer.byteLength) throw RangeError("Illegal offset: 0 <= "+offset+" (+"+4+") <= "+this.buffer.byteLength); } var value = ieee754_read(this.view, offset, this.littleEndian, 23, 4); if (relative) this.offset += 4; return value; }; /** * Reads a 32bit float. This is an alias of {@link ByteBuffer#readFloat32}. * @function * @param {number=} offset Offset to read from. Will use and increase {@link ByteBuffer#offset} by `4` if omitted. * @returns {number} * @expose */ ByteBufferPrototype.readFloat = ByteBufferPrototype.readFloat32; // types/floats/float64 /** * Writes a 64bit float. * @param {number} value Value to write * @param {number=} offset Offset to write to. Will use and increase {@link ByteBuffer#offset} by `8` if omitted. * @returns {!ByteBuffer} this * @expose */ ByteBufferPrototype.writeFloat64 = function(value, offset) { var relative = typeof offset === 'undefined'; if (relative) offset = this.offset; if (!this.noAssert) { if (typeof value !== 'number') throw TypeError("Illegal value: "+value+" (not a number)"); if (typeof offset !== 'number' || offset % 1 !== 0) throw TypeError("Illegal offset: "+offset+" (not an integer)"); offset >>>= 0; if (offset < 0 || offset + 0 > this.buffer.byteLength) throw RangeError("Illegal offset: 0 <= "+offset+" (+"+0+") <= "+this.buffer.byteLength); } offset += 8; var capacity9 = this.buffer.byteLength; if (offset > capacity9) this.resize((capacity9 *= 2) > offset ? capacity9 : offset); offset -= 8; ieee754_write(this.view, value, offset, this.littleEndian, 52, 8); if (relative) this.offset += 8; return this; }; /** * Writes a 64bit float. This is an alias of {@link ByteBuffer#writeFloat64}. * @function * @param {number} value Value to write * @param {number=} offset Offset to write to. Will use and increase {@link ByteBuffer#offset} by `8` if omitted. * @returns {!ByteBuffer} this * @expose */ ByteBufferPrototype.writeDouble = ByteBufferPrototype.writeFloat64; /** * Reads a 64bit float. * @param {number=} offset Offset to read from. Will use and increase {@link ByteBuffer#offset} by `8` if omitted. * @returns {number} * @expose */ ByteBufferPrototype.readFloat64 = function(offset) { var relative = typeof offset === 'undefined'; if (relative) offset = this.offset; if (!this.noAssert) { if (typeof offset !== 'number' || offset % 1 !== 0) throw TypeError("Illegal offset: "+offset+" (not an integer)"); offset >>>= 0; if (offset < 0 || offset + 8 > this.buffer.byteLength) throw RangeError("Illegal offset: 0 <= "+offset+" (+"+8+") <= "+this.buffer.byteLength); } var value = ieee754_read(this.view, offset, this.littleEndian, 52, 8); if (relative) this.offset += 8; return value; }; /** * Reads a 64bit float. This is an alias of {@link ByteBuffer#readFloat64}. * @function * @param {number=} offset Offset to read from. Will use and increase {@link ByteBuffer#offset} by `8` if omitted. * @returns {number} * @expose */ ByteBufferPrototype.readDouble = ByteBufferPrototype.readFloat64; // types/varints/varint32 /** * Maximum number of bytes required to store a 32bit base 128 variable-length integer. * @type {number} * @const * @expose */ ByteBuffer.MAX_VARINT32_BYTES = 5; /** * Calculates the actual number of bytes required to store a 32bit base 128 variable-length integer. * @param {number} value Value to encode * @returns {number} Number of bytes required. Capped to {@link ByteBuffer.MAX_VARINT32_BYTES} * @expose */ ByteBuffer.calculateVarint32 = function(value) { // ref: src/google/protobuf/io/coded_stream.cc value = value >>> 0; if (value < 1 << 7 ) return 1; else if (value < 1 << 14) return 2; else if (value < 1 << 21) return 3; else if (value < 1 << 28) return 4; else return 5; }; /** * Zigzag encodes a signed 32bit integer so that it can be effectively used with varint encoding. * @param {number} n Signed 32bit integer * @returns {number} Unsigned zigzag encoded 32bit integer * @expose */ ByteBuffer.zigZagEncode32 = function(n) { return (((n |= 0) << 1) ^ (n >> 31)) >>> 0; // ref: src/google/protobuf/wire_format_lite.h }; /** * Decodes a zigzag encoded signed 32bit integer. * @param {number} n Unsigned zigzag encoded 32bit integer * @returns {number} Signed 32bit integer * @expose */ ByteBuffer.zigZagDecode32 = function(n) { return ((n >>> 1) ^ -(n & 1)) | 0; // // ref: src/google/protobuf/wire_format_lite.h }; /** * Writes a 32bit base 128 variable-length integer. * @param {number} value Value to write * @param {number=} offset Offset to write to. Will use and increase {@link ByteBuffer#offset} by the number of bytes * written if omitted. * @returns {!ByteBuffer|number} this if `offset` is omitted, else the actual number of bytes written * @expose */ ByteBufferPrototype.writeVarint32 = function(value, offset) { var relative = typeof offset === 'undefined'; if (relative) offset = this.offset; if (!this.noAssert) { if (typeof value !== 'number' || value % 1 !== 0) throw TypeError("Illegal value: "+value+" (not an integer)"); value |= 0; if (typeof offset !== 'number' || offset % 1 !== 0) throw TypeError("Illegal offset: "+offset+" (not an integer)"); offset >>>= 0; if (offset < 0 || offset + 0 > this.buffer.byteLength) throw RangeError("Illegal offset: 0 <= "+offset+" (+"+0+") <= "+this.buffer.byteLength); } var size = ByteBuffer.calculateVarint32(value), b; offset += size; var capacity10 = this.buffer.byteLength; if (offset > capacity10) this.resize((capacity10 *= 2) > offset ? capacity10 : offset); offset -= size; value >>>= 0; while (value >= 0x80) { b = (value & 0x7f) | 0x80; this.view[offset++] = b; value >>>= 7; } this.view[offset++] = value; if (relative) { this.offset = offset; return this; } return size; }; /** * Writes a zig-zag encoded (signed) 32bit base 128 variable-length integer. * @param {number} value Value to write * @param {number=} offset Offset to write to. Will use and increase {@link ByteBuffer#offset} by the number of bytes * written if omitted. * @returns {!ByteBuffer|number} this if `offset` is omitted, else the actual number of bytes written * @expose */ ByteBufferPrototype.writeVarint32ZigZag = function(value, offset) { return this.writeVarint32(ByteBuffer.zigZagEncode32(value), offset); }; /** * Reads a 32bit base 128 variable-length integer. * @param {number=} offset Offset to read from. Will use and increase {@link ByteBuffer#offset} by the number of bytes * written if omitted. * @returns {number|!{value: number, length: number}} The value read if offset is omitted, else the value read * and the actual number of bytes read. * @throws {Error} If it's not a valid varint. Has a property `truncated = true` if there is not enough data available * to fully decode the varint. * @expose */ ByteBufferPrototype.readVarint32 = function(offset) { var relative = typeof offset === 'undefined'; if (relative) offset = this.offset; if (!this.noAssert) { if (typeof offset !== 'number' || offset % 1 !== 0) throw TypeError("Illegal offset: "+offset+" (not an integer)"); offset >>>= 0; if (offset < 0 || offset + 1 > this.buffer.byteLength) throw RangeError("Illegal offset: 0 <= "+offset+" (+"+1+") <= "+this.buffer.byteLength); } var c = 0, value = 0 >>> 0, b; do { if (!this.noAssert && offset > this.limit) { var err = Error("Truncated"); err['truncated'] = true; throw err; } b = this.view[offset++]; if (c < 5) value |= (b & 0x7f) << (7*c); ++c; } while ((b & 0x80) !== 0); value |= 0; if (relative) { this.offset = offset; return value; } return { "value": value, "length": c }; }; /** * Reads a zig-zag encoded (signed) 32bit base 128 variable-length integer. * @param {number=} offset Offset to read from. Will use and increase {@link ByteBuffer#offset} by the number of bytes * written if omitted. * @returns {number|!{value: number, length: number}} The value read if offset is omitted, else the value read * and the actual number of bytes read. * @throws {Error} If it's not a valid varint * @expose */ ByteBufferPrototype.readVarint32ZigZag = function(offset) { var val = this.readVarint32(offset); if (typeof val === 'object') val["value"] = ByteBuffer.zigZagDecode32(val["value"]); else val = ByteBuffer.zigZagDecode32(val); return val; }; // types/varints/varint64 if (Long) { /** * Maximum number of bytes required to store a 64bit base 128 variable-length integer. * @type {number} * @const * @expose */ ByteBuffer.MAX_VARINT64_BYTES = 10; /** * Calculates the actual number of bytes required to store a 64bit base 128 variable-length integer. * @param {number|!Long} value Value to encode * @returns {number} Number of bytes required. Capped to {@link ByteBuffer.MAX_VARINT64_BYTES} * @expose */ ByteBuffer.calculateVarint64 = function(value) { if (typeof value === 'number') value = Long.fromNumber(value); else if (typeof value === 'string') value = Long.fromString(value); // ref: src/google/protobuf/io/coded_stream.cc var part0 = value.toInt() >>> 0, part1 = value.shiftRightUnsigned(28).toInt() >>> 0, part2 = value.shiftRightUnsigned(56).toInt() >>> 0; if (part2 == 0) { if (part1 == 0) { if (part0 < 1 << 14) return part0 < 1 << 7 ? 1 : 2; else return part0 < 1 << 21 ? 3 : 4; } else { if (part1 < 1 << 14) return part1 < 1 << 7 ? 5 : 6; else return part1 < 1 << 21 ? 7 : 8; } } else return part2 < 1 << 7 ? 9 : 10; }; /** * Zigzag encodes a signed 64bit integer so that it can be effectively used with varint encoding. * @param {number|!Long} value Signed long * @returns {!Long} Unsigned zigzag encoded long * @expose */ ByteBuffer.zigZagEncode64 = function(value) { if (typeof value === 'number') value = Long.fromNumber(value, false); else if (typeof value === 'string') value = Long.fromString(value, false); else if (value.unsigned !== false) value = value.toSigned(); // ref: src/google/protobuf/wire_format_lite.h return value.shiftLeft(1).xor(value.shiftRight(63)).toUnsigned(); }; /** * Decodes a zigzag encoded signed 64bit integer. * @param {!Long|number} value Unsigned zigzag encoded long or JavaScript number * @returns {!Long} Signed long * @expose */ ByteBuffer.zigZagDecode64 = function(value) { if (typeof value === 'number') value = Long.fromNumber(value, false); else if (typeof value === 'string') value = Long.fromString(value, false); else if (value.unsigned !== false) value = value.toSigned(); // ref: src/google/protobuf/wire_format_lite.h return value.shiftRightUnsigned(1).xor(value.and(Long.ONE).toSigned().negate()).toSigned(); }; /** * Writes a 64bit base 128 variable-length integer. * @param {number|Long} value Value to write * @param {number=} offset Offset to write to. Will use and increase {@link ByteBuffer#offset} by the number of bytes * written if omitted. * @returns {!ByteBuffer|number} `this` if offset is omitted, else the actual number of bytes written. * @expose */ ByteBufferPrototype.writeVarint64 = function(value, offset) { var relative = typeof offset === 'undefined'; if (relative) offset = this.offset; if (!this.noAssert) { if (typeof value === 'number') value = Long.fromNumber(value); else if (typeof value === 'string') value = Long.fromString(value); else if (!(value && value instanceof Long)) throw TypeError("Illegal value: "+value+" (not an integer or Long)"); if (typeof offset !== 'number' || offset % 1 !== 0) throw TypeError("Illegal offset: "+offset+" (not an integer)"); offset >>>= 0; if (offset < 0 || offset + 0 > this.buffer.byteLength) throw RangeError("Illegal offset: 0 <= "+offset+" (+"+0+") <= "+this.buffer.byteLength); } if (typeof value === 'number') value = Long.fromNumber(value, false); else if (typeof value === 'string') value = Long.fromString(value, false); else if (value.unsigned !== false) value = value.toSigned(); var size = ByteBuffer.calculateVarint64(value), part0 = value.toInt() >>> 0, part1 = value.shiftRightUnsigned(28).toInt() >>> 0, part2 = value.shiftRightUnsigned(56).toInt() >>> 0; offset += size; var capacity11 = this.buffer.byteLength; if (offset > capacity11) this.resize((capacity11 *= 2) > offset ? capacity11 : offset); offset -= size; switch (size) { case 10: this.view[offset+9] = (part2 >>> 7) & 0x01; case 9 : this.view[offset+8] = size !== 9 ? (part2 ) | 0x80 : (part2 ) & 0x7F; case 8 : this.view[offset+7] = size !== 8 ? (part1 >>> 21) | 0x80 : (part1 >>> 21) & 0x7F; case 7 : this.view[offset+6] = size !== 7 ? (part1 >>> 14) | 0x80 : (part1 >>> 14) & 0x7F; case 6 : this.view[offset+5] = size !== 6 ? (part1 >>> 7) | 0x80 : (part1 >>> 7) & 0x7F; case 5 : this.view[offset+4] = size !== 5 ? (part1 ) | 0x80 : (part1 ) & 0x7F; case 4 : this.view[offset+3] = size !== 4 ? (part0 >>> 21) | 0x80 : (part0 >>> 21) & 0x7F; case 3 : this.view[offset+2] = size !== 3 ? (part0 >>> 14) | 0x80 : (part0 >>> 14) & 0x7F; case 2 : this.view[offset+1] = size !== 2 ? (part0 >>> 7) | 0x80 : (part0 >>> 7) & 0x7F; case 1 : this.view[offset ] = size !== 1 ? (part0 ) | 0x80 : (part0 ) & 0x7F; } if (relative) { this.offset += size; return this; } else { return size; } }; /** * Writes a zig-zag encoded 64bit base 128 variable-length integer. * @param {number|Long} value Value to write * @param {number=} offset Offset to write to. Will use and increase {@link ByteBuffer#offset} by the number of bytes * written if omitted. * @returns {!ByteBuffer|number} `this` if offset is omitted, else the actual number of bytes written. * @expose */ ByteBufferPrototype.writeVarint64ZigZag = function(value, offset) { return this.writeVarint64(ByteBuffer.zigZagEncode64(value), offset); }; /** * Reads a 64bit base 128 variable-length integer. Requires Long.js. * @param {number=} offset Offset to read from. Will use and increase {@link ByteBuffer#offset} by the number of bytes * read if omitted. * @returns {!Long|!{value: Long, length: number}} The value read if offset is omitted, else the value read and * the actual number of bytes read. * @throws {Error} If it's not a valid varint * @expose */ ByteBufferPrototype.readVarint64 = function(offset) { var relative = typeof offset === 'undefined'; if (relative) offset = this.offset; if (!this.noAssert) { if (typeof offset !== 'number' || offset % 1 !== 0) throw TypeError("Illegal offset: "+offset+" (not an integer)"); offset >>>= 0; if (offset < 0 || offset + 1 > this.buffer.byteLength) throw RangeError("Illegal offset: 0 <= "+offset+" (+"+1+") <= "+this.buffer.byteLength); } // ref: src/google/protobuf/io/coded_stream.cc var start = offset, part0 = 0, part1 = 0, part2 = 0, b = 0; b = this.view[offset++]; part0 = (b & 0x7F) ; if ( b & 0x80 ) { b = this.view[offset++]; part0 |= (b & 0x7F) << 7; if ((b & 0x80) || (this.noAssert && typeof b === 'undefined')) { b = this.view[offset++]; part0 |= (b & 0x7F) << 14; if ((b & 0x80) || (this.noAssert && typeof b === 'undefined')) { b = this.view[offset++]; part0 |= (b & 0x7F) << 21; if ((b & 0x80) || (this.noAssert && typeof b === 'undefined')) { b = this.view[offset++]; part1 = (b & 0x7F) ; if ((b & 0x80) || (this.noAssert && typeof b === 'undefined')) { b = this.view[offset++]; part1 |= (b & 0x7F) << 7; if ((b & 0x80) || (this.noAssert && typeof b === 'undefined')) { b = this.view[offset++]; part1 |= (b & 0x7F) << 14; if ((b & 0x80) || (this.noAssert && typeof b === 'undefined')) { b = this.view[offset++]; part1 |= (b & 0x7F) << 21; if ((b & 0x80) || (this.noAssert && typeof b === 'undefined')) { b = this.view[offset++]; part2 = (b & 0x7F) ; if ((b & 0x80) || (this.noAssert && typeof b === 'undefined')) { b = this.view[offset++]; part2 |= (b & 0x7F) << 7; if ((b & 0x80) || (this.noAssert && typeof b === 'undefined')) { throw Error("Buffer overrun"); }}}}}}}}}} var value = Long.fromBits(part0 | (part1 << 28), (part1 >>> 4) | (part2) << 24, false); if (relative) { this.offset = offset; return value; } else { return { 'value': value, 'length': offset-start }; } }; /** * Reads a zig-zag encoded 64bit base 128 variable-length integer. Requires Long.js. * @param {number=} offset Offset to read from. Will use and increase {@link ByteBuffer#offset} by the number of bytes * read if omitted. * @returns {!Long|!{value: Long, length: number}} The value read if offset is omitted, else the value read and * the actual number of bytes read. * @throws {Error} If it's not a valid varint * @expose */ ByteBufferPrototype.readVarint64ZigZag = function(offset) { var val = this.readVarint64(offset); if (val && val['value'] instanceof Long) val["value"] = ByteBuffer.zigZagDecode64(val["value"]); else val = ByteBuffer.zigZagDecode64(val); return val; }; } // Long // types/strings/cstring /** * Writes a NULL-terminated UTF8 encoded string. For this to work the specified string must not contain any NULL * characters itself. * @param {string} str String to write * @param {number=} offset Offset to write to. Will use and increase {@link ByteBuffer#offset} by the number of bytes * contained in `str` + 1 if omitted. * @returns {!ByteBuffer|number} this if offset is omitted, else the actual number of bytes written * @expose */ ByteBufferPrototype.writeCString = function(str, offset) { var relative = typeof offset === 'undefined'; if (relative) offset = this.offset; var i, k = str.length; if (!this.noAssert) { if (typeof str !== 'string') throw TypeError("Illegal str: Not a string"); for (i=0; i>>= 0; if (offset < 0 || offset + 0 > this.buffer.byteLength) throw RangeError("Illegal offset: 0 <= "+offset+" (+"+0+") <= "+this.buffer.byteLength); } // UTF8 strings do not contain zero bytes in between except for the zero character, so: k = utfx.calculateUTF16asUTF8(stringSource(str))[1]; offset += k+1; var capacity12 = this.buffer.byteLength; if (offset > capacity12) this.resize((capacity12 *= 2) > offset ? capacity12 : offset); offset -= k+1; utfx.encodeUTF16toUTF8(stringSource(str), function(b) { this.view[offset++] = b; }.bind(this)); this.view[offset++] = 0; if (relative) { this.offset = offset; return this; } return k; }; /** * Reads a NULL-terminated UTF8 encoded string. For this to work the string read must not contain any NULL characters * itself. * @param {number=} offset Offset to read from. Will use and increase {@link ByteBuffer#offset} by the number of bytes * read if omitted. * @returns {string|!{string: string, length: number}} The string read if offset is omitted, else the string * read and the actual number of bytes read. * @expose */ ByteBufferPrototype.readCString = function(offset) { var relative = typeof offset === 'undefined'; if (relative) offset = this.offset; if (!this.noAssert) { if (typeof offset !== 'number' || offset % 1 !== 0) throw TypeError("Illegal offset: "+offset+" (not an integer)"); offset >>>= 0; if (offset < 0 || offset + 1 > this.buffer.byteLength) throw RangeError("Illegal offset: 0 <= "+offset+" (+"+1+") <= "+this.buffer.byteLength); } var start = offset, temp; // UTF8 strings do not contain zero bytes in between except for the zero character itself, so: var sd, b = -1; utfx.decodeUTF8toUTF16(function() { if (b === 0) return null; if (offset >= this.limit) throw RangeError("Illegal range: Truncated data, "+offset+" < "+this.limit); b = this.view[offset++]; return b === 0 ? null : b; }.bind(this), sd = stringDestination(), true); if (relative) { this.offset = offset; return sd(); } else { return { "string": sd(), "length": offset - start }; } }; // types/strings/istring /** * Writes a length as uint32 prefixed UTF8 encoded string. * @param {string} str String to write * @param {number=} offset Offset to write to. Will use and increase {@link ByteBuffer#offset} by the number of bytes * written if omitted. * @returns {!ByteBuffer|number} `this` if `offset` is omitted, else the actual number of bytes written * @expose * @see ByteBuffer#writeVarint32 */ ByteBufferPrototype.writeIString = function(str, offset) { var relative = typeof offset === 'undefined'; if (relative) offset = this.offset; if (!this.noAssert) { if (typeof str !== 'string') throw TypeError("Illegal str: Not a string"); if (typeof offset !== 'number' || offset % 1 !== 0) throw TypeError("Illegal offset: "+offset+" (not an integer)"); offset >>>= 0; if (offset < 0 || offset + 0 > this.buffer.byteLength) throw RangeError("Illegal offset: 0 <= "+offset+" (+"+0+") <= "+this.buffer.byteLength); } var start = offset, k; k = utfx.calculateUTF16asUTF8(stringSource(str), this.noAssert)[1]; offset += 4+k; var capacity13 = this.buffer.byteLength; if (offset > capacity13) this.resize((capacity13 *= 2) > offset ? capacity13 : offset); offset -= 4+k; if (this.littleEndian) { this.view[offset+3] = (k >>> 24) & 0xFF; this.view[offset+2] = (k >>> 16) & 0xFF; this.view[offset+1] = (k >>> 8) & 0xFF; this.view[offset ] = k & 0xFF; } else { this.view[offset ] = (k >>> 24) & 0xFF; this.view[offset+1] = (k >>> 16) & 0xFF; this.view[offset+2] = (k >>> 8) & 0xFF; this.view[offset+3] = k & 0xFF; } offset += 4; utfx.encodeUTF16toUTF8(stringSource(str), function(b) { this.view[offset++] = b; }.bind(this)); if (offset !== start + 4 + k) throw RangeError("Illegal range: Truncated data, "+offset+" == "+(offset+4+k)); if (relative) { this.offset = offset; return this; } return offset - start; }; /** * Reads a length as uint32 prefixed UTF8 encoded string. * @param {number=} offset Offset to read from. Will use and increase {@link ByteBuffer#offset} by the number of bytes * read if omitted. * @returns {string|!{string: string, length: number}} The string read if offset is omitted, else the string * read and the actual number of bytes read. * @expose * @see ByteBuffer#readVarint32 */ ByteBufferPrototype.readIString = function(offset) { var relative = typeof offset === 'undefined'; if (relative) offset = this.offset; if (!this.noAssert) { if (typeof offset !== 'number' || offset % 1 !== 0) throw TypeError("Illegal offset: "+offset+" (not an integer)"); offset >>>= 0; if (offset < 0 || offset + 4 > this.buffer.byteLength) throw RangeError("Illegal offset: 0 <= "+offset+" (+"+4+") <= "+this.buffer.byteLength); } var start = offset; var len = this.readUint32(offset); var str = this.readUTF8String(len, ByteBuffer.METRICS_BYTES, offset += 4); offset += str['length']; if (relative) { this.offset = offset; return str['string']; } else { return { 'string': str['string'], 'length': offset - start }; } }; // types/strings/utf8string /** * Metrics representing number of UTF8 characters. Evaluates to `c`. * @type {string} * @const * @expose */ ByteBuffer.METRICS_CHARS = 'c'; /** * Metrics representing number of bytes. Evaluates to `b`. * @type {string} * @const * @expose */ ByteBuffer.METRICS_BYTES = 'b'; /** * Writes an UTF8 encoded string. * @param {string} str String to write * @param {number=} offset Offset to write to. Will use and increase {@link ByteBuffer#offset} if omitted. * @returns {!ByteBuffer|number} this if offset is omitted, else the actual number of bytes written. * @expose */ ByteBufferPrototype.writeUTF8String = function(str, offset) { var relative = typeof offset === 'undefined'; if (relative) offset = this.offset; if (!this.noAssert) { if (typeof offset !== 'number' || offset % 1 !== 0) throw TypeError("Illegal offset: "+offset+" (not an integer)"); offset >>>= 0; if (offset < 0 || offset + 0 > this.buffer.byteLength) throw RangeError("Illegal offset: 0 <= "+offset+" (+"+0+") <= "+this.buffer.byteLength); } var k; var start = offset; k = utfx.calculateUTF16asUTF8(stringSource(str))[1]; offset += k; var capacity14 = this.buffer.byteLength; if (offset > capacity14) this.resize((capacity14 *= 2) > offset ? capacity14 : offset); offset -= k; utfx.encodeUTF16toUTF8(stringSource(str), function(b) { this.view[offset++] = b; }.bind(this)); if (relative) { this.offset = offset; return this; } return offset - start; }; /** * Writes an UTF8 encoded string. This is an alias of {@link ByteBuffer#writeUTF8String}. * @function * @param {string} str String to write * @param {number=} offset Offset to write to. Will use and increase {@link ByteBuffer#offset} if omitted. * @returns {!ByteBuffer|number} this if offset is omitted, else the actual number of bytes written. * @expose */ ByteBufferPrototype.writeString = ByteBufferPrototype.writeUTF8String; /** * Calculates the number of UTF8 characters of a string. JavaScript itself uses UTF-16, so that a string's * `length` property does not reflect its actual UTF8 size if it contains code points larger than 0xFFFF. * @param {string} str String to calculate * @returns {number} Number of UTF8 characters * @expose */ ByteBuffer.calculateUTF8Chars = function(str) { return utfx.calculateUTF16asUTF8(stringSource(str))[0]; }; /** * Calculates the number of UTF8 bytes of a string. * @param {string} str String to calculate * @returns {number} Number of UTF8 bytes * @expose */ ByteBuffer.calculateUTF8Bytes = function(str) { return utfx.calculateUTF16asUTF8(stringSource(str))[1]; }; /** * Calculates the number of UTF8 bytes of a string. This is an alias of {@link ByteBuffer.calculateUTF8Bytes}. * @function * @param {string} str String to calculate * @returns {number} Number of UTF8 bytes * @expose */ ByteBuffer.calculateString = ByteBuffer.calculateUTF8Bytes; /** * Reads an UTF8 encoded string. * @param {number} length Number of characters or bytes to read. * @param {string=} metrics Metrics specifying what `length` is meant to count. Defaults to * {@link ByteBuffer.METRICS_CHARS}. * @param {number=} offset Offset to read from. Will use and increase {@link ByteBuffer#offset} by the number of bytes * read if omitted. * @returns {string|!{string: string, length: number}} The string read if offset is omitted, else the string * read and the actual number of bytes read. * @expose */ ByteBufferPrototype.readUTF8String = function(length, metrics, offset) { if (typeof metrics === 'number') { offset = metrics; metrics = undefined; } var relative = typeof offset === 'undefined'; if (relative) offset = this.offset; if (typeof metrics === 'undefined') metrics = ByteBuffer.METRICS_CHARS; if (!this.noAssert) { if (typeof length !== 'number' || length % 1 !== 0) throw TypeError("Illegal length: "+length+" (not an integer)"); length |= 0; if (typeof offset !== 'number' || offset % 1 !== 0) throw TypeError("Illegal offset: "+offset+" (not an integer)"); offset >>>= 0; if (offset < 0 || offset + 0 > this.buffer.byteLength) throw RangeError("Illegal offset: 0 <= "+offset+" (+"+0+") <= "+this.buffer.byteLength); } var i = 0, start = offset, sd; if (metrics === ByteBuffer.METRICS_CHARS) { // The same for node and the browser sd = stringDestination(); utfx.decodeUTF8(function() { return i < length && offset < this.limit ? this.view[offset++] : null; }.bind(this), function(cp) { ++i; utfx.UTF8toUTF16(cp, sd); }); if (i !== length) throw RangeError("Illegal range: Truncated data, "+i+" == "+length); if (relative) { this.offset = offset; return sd(); } else { return { "string": sd(), "length": offset - start }; } } else if (metrics === ByteBuffer.METRICS_BYTES) { if (!this.noAssert) { if (typeof offset !== 'number' || offset % 1 !== 0) throw TypeError("Illegal offset: "+offset+" (not an integer)"); offset >>>= 0; if (offset < 0 || offset + length > this.buffer.byteLength) throw RangeError("Illegal offset: 0 <= "+offset+" (+"+length+") <= "+this.buffer.byteLength); } var k = offset + length; utfx.decodeUTF8toUTF16(function() { return offset < k ? this.view[offset++] : null; }.bind(this), sd = stringDestination(), this.noAssert); if (offset !== k) throw RangeError("Illegal range: Truncated data, "+offset+" == "+k); if (relative) { this.offset = offset; return sd(); } else { return { 'string': sd(), 'length': offset - start }; } } else throw TypeError("Unsupported metrics: "+metrics); }; /** * Reads an UTF8 encoded string. This is an alias of {@link ByteBuffer#readUTF8String}. * @function * @param {number} length Number of characters or bytes to read * @param {number=} metrics Metrics specifying what `n` is meant to count. Defaults to * {@link ByteBuffer.METRICS_CHARS}. * @param {number=} offset Offset to read from. Will use and increase {@link ByteBuffer#offset} by the number of bytes * read if omitted. * @returns {string|!{string: string, length: number}} The string read if offset is omitted, else the string * read and the actual number of bytes read. * @expose */ ByteBufferPrototype.readString = ByteBufferPrototype.readUTF8String; // types/strings/vstring /** * Writes a length as varint32 prefixed UTF8 encoded string. * @param {string} str String to write * @param {number=} offset Offset to write to. Will use and increase {@link ByteBuffer#offset} by the number of bytes * written if omitted. * @returns {!ByteBuffer|number} `this` if `offset` is omitted, else the actual number of bytes written * @expose * @see ByteBuffer#writeVarint32 */ ByteBufferPrototype.writeVString = function(str, offset) { var relative = typeof offset === 'undefined'; if (relative) offset = this.offset; if (!this.noAssert) { if (typeof str !== 'string') throw TypeError("Illegal str: Not a string"); if (typeof offset !== 'number' || offset % 1 !== 0) throw TypeError("Illegal offset: "+offset+" (not an integer)"); offset >>>= 0; if (offset < 0 || offset + 0 > this.buffer.byteLength) throw RangeError("Illegal offset: 0 <= "+offset+" (+"+0+") <= "+this.buffer.byteLength); } var start = offset, k, l; k = utfx.calculateUTF16asUTF8(stringSource(str), this.noAssert)[1]; l = ByteBuffer.calculateVarint32(k); offset += l+k; var capacity15 = this.buffer.byteLength; if (offset > capacity15) this.resize((capacity15 *= 2) > offset ? capacity15 : offset); offset -= l+k; offset += this.writeVarint32(k, offset); utfx.encodeUTF16toUTF8(stringSource(str), function(b) { this.view[offset++] = b; }.bind(this)); if (offset !== start+k+l) throw RangeError("Illegal range: Truncated data, "+offset+" == "+(offset+k+l)); if (relative) { this.offset = offset; return this; } return offset - start; }; /** * Reads a length as varint32 prefixed UTF8 encoded string. * @param {number=} offset Offset to read from. Will use and increase {@link ByteBuffer#offset} by the number of bytes * read if omitted. * @returns {string|!{string: string, length: number}} The string read if offset is omitted, else the string * read and the actual number of bytes read. * @expose * @see ByteBuffer#readVarint32 */ ByteBufferPrototype.readVString = function(offset) { var relative = typeof offset === 'undefined'; if (relative) offset = this.offset; if (!this.noAssert) { if (typeof offset !== 'number' || offset % 1 !== 0) throw TypeError("Illegal offset: "+offset+" (not an integer)"); offset >>>= 0; if (offset < 0 || offset + 1 > this.buffer.byteLength) throw RangeError("Illegal offset: 0 <= "+offset+" (+"+1+") <= "+this.buffer.byteLength); } var start = offset; var len = this.readVarint32(offset); var str = this.readUTF8String(len['value'], ByteBuffer.METRICS_BYTES, offset += len['length']); offset += str['length']; if (relative) { this.offset = offset; return str['string']; } else { return { 'string': str['string'], 'length': offset - start }; } }; /** * Appends some data to this ByteBuffer. This will overwrite any contents behind the specified offset up to the appended * data's length. * @param {!ByteBuffer|!ArrayBuffer|!Uint8Array|string} source Data to append. If `source` is a ByteBuffer, its offsets * will be modified according to the performed read operation. * @param {(string|number)=} encoding Encoding if `data` is a string ("base64", "hex", "binary", defaults to "utf8") * @param {number=} offset Offset to append at. Will use and increase {@link ByteBuffer#offset} by the number of bytes * written if omitted. * @returns {!ByteBuffer} this * @expose * @example A relative `<01 02>03.append(<04 05>)` will result in `<01 02 04 05>, 04 05|` * @example An absolute `<01 02>03.append(04 05>, 1)` will result in `<01 04>05, 04 05|` */ ByteBufferPrototype.append = function(source, encoding, offset) { if (typeof encoding === 'number' || typeof encoding !== 'string') { offset = encoding; encoding = undefined; } var relative = typeof offset === 'undefined'; if (relative) offset = this.offset; if (!this.noAssert) { if (typeof offset !== 'number' || offset % 1 !== 0) throw TypeError("Illegal offset: "+offset+" (not an integer)"); offset >>>= 0; if (offset < 0 || offset + 0 > this.buffer.byteLength) throw RangeError("Illegal offset: 0 <= "+offset+" (+"+0+") <= "+this.buffer.byteLength); } if (!(source instanceof ByteBuffer)) source = ByteBuffer.wrap(source, encoding); var length = source.limit - source.offset; if (length <= 0) return this; // Nothing to append offset += length; var capacity16 = this.buffer.byteLength; if (offset > capacity16) this.resize((capacity16 *= 2) > offset ? capacity16 : offset); offset -= length; this.view.set(source.view.subarray(source.offset, source.limit), offset); source.offset += length; if (relative) this.offset += length; return this; }; /** * Appends this ByteBuffer's contents to another ByteBuffer. This will overwrite any contents at and after the specified offset up to the length of this ByteBuffer's data. * @param {!ByteBuffer} target Target ByteBuffer * @param {number=} offset Offset to append to. Will use and increase {@link ByteBuffer#offset} by the number of bytes * read if omitted. * @returns {!ByteBuffer} this * @expose * @see ByteBuffer#append */ ByteBufferPrototype.appendTo = function(target, offset) { target.append(this, offset); return this; }; /** * Enables or disables assertions of argument types and offsets. Assertions are enabled by default but you can opt to * disable them if your code already makes sure that everything is valid. * @param {boolean} assert `true` to enable assertions, otherwise `false` * @returns {!ByteBuffer} this * @expose */ ByteBufferPrototype.assert = function(assert) { this.noAssert = !assert; return this; }; /** * Gets the capacity of this ByteBuffer's backing buffer. * @returns {number} Capacity of the backing buffer * @expose */ ByteBufferPrototype.capacity = function() { return this.buffer.byteLength; }; /** * Clears this ByteBuffer's offsets by setting {@link ByteBuffer#offset} to `0` and {@link ByteBuffer#limit} to the * backing buffer's capacity. Discards {@link ByteBuffer#markedOffset}. * @returns {!ByteBuffer} this * @expose */ ByteBufferPrototype.clear = function() { this.offset = 0; this.limit = this.buffer.byteLength; this.markedOffset = -1; return this; }; /** * Creates a cloned instance of this ByteBuffer, preset with this ByteBuffer's values for {@link ByteBuffer#offset}, * {@link ByteBuffer#markedOffset} and {@link ByteBuffer#limit}. * @param {boolean=} copy Whether to copy the backing buffer or to return another view on the same, defaults to `false` * @returns {!ByteBuffer} Cloned instance * @expose */ ByteBufferPrototype.clone = function(copy) { var bb = new ByteBuffer(0, this.littleEndian, this.noAssert); if (copy) { bb.buffer = new ArrayBuffer(this.buffer.byteLength); bb.view = new Uint8Array(bb.buffer); } else { bb.buffer = this.buffer; bb.view = this.view; } bb.offset = this.offset; bb.markedOffset = this.markedOffset; bb.limit = this.limit; return bb; }; /** * Compacts this ByteBuffer to be backed by a {@link ByteBuffer#buffer} of its contents' length. Contents are the bytes * between {@link ByteBuffer#offset} and {@link ByteBuffer#limit}. Will set `offset = 0` and `limit = capacity` and * adapt {@link ByteBuffer#markedOffset} to the same relative position if set. * @param {number=} begin Offset to start at, defaults to {@link ByteBuffer#offset} * @param {number=} end Offset to end at, defaults to {@link ByteBuffer#limit} * @returns {!ByteBuffer} this * @expose */ ByteBufferPrototype.compact = function(begin, end) { if (typeof begin === 'undefined') begin = this.offset; if (typeof end === 'undefined') end = this.limit; if (!this.noAssert) { if (typeof begin !== 'number' || begin % 1 !== 0) throw TypeError("Illegal begin: Not an integer"); begin >>>= 0; if (typeof end !== 'number' || end % 1 !== 0) throw TypeError("Illegal end: Not an integer"); end >>>= 0; if (begin < 0 || begin > end || end > this.buffer.byteLength) throw RangeError("Illegal range: 0 <= "+begin+" <= "+end+" <= "+this.buffer.byteLength); } if (begin === 0 && end === this.buffer.byteLength) return this; // Already compacted var len = end - begin; if (len === 0) { this.buffer = EMPTY_BUFFER; this.view = null; if (this.markedOffset >= 0) this.markedOffset -= begin; this.offset = 0; this.limit = 0; return this; } var buffer = new ArrayBuffer(len); var view = new Uint8Array(buffer); view.set(this.view.subarray(begin, end)); this.buffer = buffer; this.view = view; if (this.markedOffset >= 0) this.markedOffset -= begin; this.offset = 0; this.limit = len; return this; }; /** * Creates a copy of this ByteBuffer's contents. Contents are the bytes between {@link ByteBuffer#offset} and * {@link ByteBuffer#limit}. * @param {number=} begin Begin offset, defaults to {@link ByteBuffer#offset}. * @param {number=} end End offset, defaults to {@link ByteBuffer#limit}. * @returns {!ByteBuffer} Copy * @expose */ ByteBufferPrototype.copy = function(begin, end) { if (typeof begin === 'undefined') begin = this.offset; if (typeof end === 'undefined') end = this.limit; if (!this.noAssert) { if (typeof begin !== 'number' || begin % 1 !== 0) throw TypeError("Illegal begin: Not an integer"); begin >>>= 0; if (typeof end !== 'number' || end % 1 !== 0) throw TypeError("Illegal end: Not an integer"); end >>>= 0; if (begin < 0 || begin > end || end > this.buffer.byteLength) throw RangeError("Illegal range: 0 <= "+begin+" <= "+end+" <= "+this.buffer.byteLength); } if (begin === end) return new ByteBuffer(0, this.littleEndian, this.noAssert); var capacity = end - begin, bb = new ByteBuffer(capacity, this.littleEndian, this.noAssert); bb.offset = 0; bb.limit = capacity; if (bb.markedOffset >= 0) bb.markedOffset -= begin; this.copyTo(bb, 0, begin, end); return bb; }; /** * Copies this ByteBuffer's contents to another ByteBuffer. Contents are the bytes between {@link ByteBuffer#offset} and * {@link ByteBuffer#limit}. * @param {!ByteBuffer} target Target ByteBuffer * @param {number=} targetOffset Offset to copy to. Will use and increase the target's {@link ByteBuffer#offset} * by the number of bytes copied if omitted. * @param {number=} sourceOffset Offset to start copying from. Will use and increase {@link ByteBuffer#offset} by the * number of bytes copied if omitted. * @param {number=} sourceLimit Offset to end copying from, defaults to {@link ByteBuffer#limit} * @returns {!ByteBuffer} this * @expose */ ByteBufferPrototype.copyTo = function(target, targetOffset, sourceOffset, sourceLimit) { var relative, targetRelative; if (!this.noAssert) { if (!ByteBuffer.isByteBuffer(target)) throw TypeError("Illegal target: Not a ByteBuffer"); } targetOffset = (targetRelative = typeof targetOffset === 'undefined') ? target.offset : targetOffset | 0; sourceOffset = (relative = typeof sourceOffset === 'undefined') ? this.offset : sourceOffset | 0; sourceLimit = typeof sourceLimit === 'undefined' ? this.limit : sourceLimit | 0; if (targetOffset < 0 || targetOffset > target.buffer.byteLength) throw RangeError("Illegal target range: 0 <= "+targetOffset+" <= "+target.buffer.byteLength); if (sourceOffset < 0 || sourceLimit > this.buffer.byteLength) throw RangeError("Illegal source range: 0 <= "+sourceOffset+" <= "+this.buffer.byteLength); var len = sourceLimit - sourceOffset; if (len === 0) return target; // Nothing to copy target.ensureCapacity(targetOffset + len); target.view.set(this.view.subarray(sourceOffset, sourceLimit), targetOffset); if (relative) this.offset += len; if (targetRelative) target.offset += len; return this; }; /** * Makes sure that this ByteBuffer is backed by a {@link ByteBuffer#buffer} of at least the specified capacity. If the * current capacity is exceeded, it will be doubled. If double the current capacity is less than the required capacity, * the required capacity will be used instead. * @param {number} capacity Required capacity * @returns {!ByteBuffer} this * @expose */ ByteBufferPrototype.ensureCapacity = function(capacity) { var current = this.buffer.byteLength; if (current < capacity) return this.resize((current *= 2) > capacity ? current : capacity); return this; }; /** * Overwrites this ByteBuffer's contents with the specified value. Contents are the bytes between * {@link ByteBuffer#offset} and {@link ByteBuffer#limit}. * @param {number|string} value Byte value to fill with. If given as a string, the first character is used. * @param {number=} begin Begin offset. Will use and increase {@link ByteBuffer#offset} by the number of bytes * written if omitted. defaults to {@link ByteBuffer#offset}. * @param {number=} end End offset, defaults to {@link ByteBuffer#limit}. * @returns {!ByteBuffer} this * @expose * @example `someByteBuffer.clear().fill(0)` fills the entire backing buffer with zeroes */ ByteBufferPrototype.fill = function(value, begin, end) { var relative = typeof begin === 'undefined'; if (relative) begin = this.offset; if (typeof value === 'string' && value.length > 0) value = value.charCodeAt(0); if (typeof begin === 'undefined') begin = this.offset; if (typeof end === 'undefined') end = this.limit; if (!this.noAssert) { if (typeof value !== 'number' || value % 1 !== 0) throw TypeError("Illegal value: "+value+" (not an integer)"); value |= 0; if (typeof begin !== 'number' || begin % 1 !== 0) throw TypeError("Illegal begin: Not an integer"); begin >>>= 0; if (typeof end !== 'number' || end % 1 !== 0) throw TypeError("Illegal end: Not an integer"); end >>>= 0; if (begin < 0 || begin > end || end > this.buffer.byteLength) throw RangeError("Illegal range: 0 <= "+begin+" <= "+end+" <= "+this.buffer.byteLength); } if (begin >= end) return this; // Nothing to fill while (begin < end) this.view[begin++] = value; if (relative) this.offset = begin; return this; }; /** * Makes this ByteBuffer ready for a new sequence of write or relative read operations. Sets `limit = offset` and * `offset = 0`. Make sure always to flip a ByteBuffer when all relative read or write operations are complete. * @returns {!ByteBuffer} this * @expose */ ByteBufferPrototype.flip = function() { this.limit = this.offset; this.offset = 0; return this; }; /** * Marks an offset on this ByteBuffer to be used later. * @param {number=} offset Offset to mark. Defaults to {@link ByteBuffer#offset}. * @returns {!ByteBuffer} this * @throws {TypeError} If `offset` is not a valid number * @throws {RangeError} If `offset` is out of bounds * @see ByteBuffer#reset * @expose */ ByteBufferPrototype.mark = function(offset) { offset = typeof offset === 'undefined' ? this.offset : offset; if (!this.noAssert) { if (typeof offset !== 'number' || offset % 1 !== 0) throw TypeError("Illegal offset: "+offset+" (not an integer)"); offset >>>= 0; if (offset < 0 || offset + 0 > this.buffer.byteLength) throw RangeError("Illegal offset: 0 <= "+offset+" (+"+0+") <= "+this.buffer.byteLength); } this.markedOffset = offset; return this; }; /** * Sets the byte order. * @param {boolean} littleEndian `true` for little endian byte order, `false` for big endian * @returns {!ByteBuffer} this * @expose */ ByteBufferPrototype.order = function(littleEndian) { if (!this.noAssert) { if (typeof littleEndian !== 'boolean') throw TypeError("Illegal littleEndian: Not a boolean"); } this.littleEndian = !!littleEndian; return this; }; /** * Switches (to) little endian byte order. * @param {boolean=} littleEndian Defaults to `true`, otherwise uses big endian * @returns {!ByteBuffer} this * @expose */ ByteBufferPrototype.LE = function(littleEndian) { this.littleEndian = typeof littleEndian !== 'undefined' ? !!littleEndian : true; return this; }; /** * Switches (to) big endian byte order. * @param {boolean=} bigEndian Defaults to `true`, otherwise uses little endian * @returns {!ByteBuffer} this * @expose */ ByteBufferPrototype.BE = function(bigEndian) { this.littleEndian = typeof bigEndian !== 'undefined' ? !bigEndian : false; return this; }; /** * Prepends some data to this ByteBuffer. This will overwrite any contents before the specified offset up to the * prepended data's length. If there is not enough space available before the specified `offset`, the backing buffer * will be resized and its contents moved accordingly. * @param {!ByteBuffer|string|!ArrayBuffer} source Data to prepend. If `source` is a ByteBuffer, its offset will be * modified according to the performed read operation. * @param {(string|number)=} encoding Encoding if `data` is a string ("base64", "hex", "binary", defaults to "utf8") * @param {number=} offset Offset to prepend at. Will use and decrease {@link ByteBuffer#offset} by the number of bytes * prepended if omitted. * @returns {!ByteBuffer} this * @expose * @example A relative `00<01 02 03>.prepend(<04 05>)` results in `<04 05 01 02 03>, 04 05|` * @example An absolute `00<01 02 03>.prepend(<04 05>, 2)` results in `04<05 02 03>, 04 05|` */ ByteBufferPrototype.prepend = function(source, encoding, offset) { if (typeof encoding === 'number' || typeof encoding !== 'string') { offset = encoding; encoding = undefined; } var relative = typeof offset === 'undefined'; if (relative) offset = this.offset; if (!this.noAssert) { if (typeof offset !== 'number' || offset % 1 !== 0) throw TypeError("Illegal offset: "+offset+" (not an integer)"); offset >>>= 0; if (offset < 0 || offset + 0 > this.buffer.byteLength) throw RangeError("Illegal offset: 0 <= "+offset+" (+"+0+") <= "+this.buffer.byteLength); } if (!(source instanceof ByteBuffer)) source = ByteBuffer.wrap(source, encoding); var len = source.limit - source.offset; if (len <= 0) return this; // Nothing to prepend var diff = len - offset; if (diff > 0) { // Not enough space before offset, so resize + move var buffer = new ArrayBuffer(this.buffer.byteLength + diff); var view = new Uint8Array(buffer); view.set(this.view.subarray(offset, this.buffer.byteLength), len); this.buffer = buffer; this.view = view; this.offset += diff; if (this.markedOffset >= 0) this.markedOffset += diff; this.limit += diff; offset += diff; } else { var arrayView = new Uint8Array(this.buffer); } this.view.set(source.view.subarray(source.offset, source.limit), offset - len); source.offset = source.limit; if (relative) this.offset -= len; return this; }; /** * Prepends this ByteBuffer to another ByteBuffer. This will overwrite any contents before the specified offset up to the * prepended data's length. If there is not enough space available before the specified `offset`, the backing buffer * will be resized and its contents moved accordingly. * @param {!ByteBuffer} target Target ByteBuffer * @param {number=} offset Offset to prepend at. Will use and decrease {@link ByteBuffer#offset} by the number of bytes * prepended if omitted. * @returns {!ByteBuffer} this * @expose * @see ByteBuffer#prepend */ ByteBufferPrototype.prependTo = function(target, offset) { target.prepend(this, offset); return this; }; /** * Prints debug information about this ByteBuffer's contents. * @param {function(string)=} out Output function to call, defaults to console.log * @expose */ ByteBufferPrototype.printDebug = function(out) { if (typeof out !== 'function') out = console.log.bind(console); out( this.toString()+"\n"+ "-------------------------------------------------------------------\n"+ this.toDebug(/* columns */ true) ); }; /** * Gets the number of remaining readable bytes. Contents are the bytes between {@link ByteBuffer#offset} and * {@link ByteBuffer#limit}, so this returns `limit - offset`. * @returns {number} Remaining readable bytes. May be negative if `offset > limit`. * @expose */ ByteBufferPrototype.remaining = function() { return this.limit - this.offset; }; /** * Resets this ByteBuffer's {@link ByteBuffer#offset}. If an offset has been marked through {@link ByteBuffer#mark} * before, `offset` will be set to {@link ByteBuffer#markedOffset}, which will then be discarded. If no offset has been * marked, sets `offset = 0`. * @returns {!ByteBuffer} this * @see ByteBuffer#mark * @expose */ ByteBufferPrototype.reset = function() { if (this.markedOffset >= 0) { this.offset = this.markedOffset; this.markedOffset = -1; } else { this.offset = 0; } return this; }; /** * Resizes this ByteBuffer to be backed by a buffer of at least the given capacity. Will do nothing if already that * large or larger. * @param {number} capacity Capacity required * @returns {!ByteBuffer} this * @throws {TypeError} If `capacity` is not a number * @throws {RangeError} If `capacity < 0` * @expose */ ByteBufferPrototype.resize = function(capacity) { if (!this.noAssert) { if (typeof capacity !== 'number' || capacity % 1 !== 0) throw TypeError("Illegal capacity: "+capacity+" (not an integer)"); capacity |= 0; if (capacity < 0) throw RangeError("Illegal capacity: 0 <= "+capacity); } if (this.buffer.byteLength < capacity) { var buffer = new ArrayBuffer(capacity); var view = new Uint8Array(buffer); view.set(this.view); this.buffer = buffer; this.view = view; } return this; }; /** * Reverses this ByteBuffer's contents. * @param {number=} begin Offset to start at, defaults to {@link ByteBuffer#offset} * @param {number=} end Offset to end at, defaults to {@link ByteBuffer#limit} * @returns {!ByteBuffer} this * @expose */ ByteBufferPrototype.reverse = function(begin, end) { if (typeof begin === 'undefined') begin = this.offset; if (typeof end === 'undefined') end = this.limit; if (!this.noAssert) { if (typeof begin !== 'number' || begin % 1 !== 0) throw TypeError("Illegal begin: Not an integer"); begin >>>= 0; if (typeof end !== 'number' || end % 1 !== 0) throw TypeError("Illegal end: Not an integer"); end >>>= 0; if (begin < 0 || begin > end || end > this.buffer.byteLength) throw RangeError("Illegal range: 0 <= "+begin+" <= "+end+" <= "+this.buffer.byteLength); } if (begin === end) return this; // Nothing to reverse Array.prototype.reverse.call(this.view.subarray(begin, end)); return this; }; /** * Skips the next `length` bytes. This will just advance * @param {number} length Number of bytes to skip. May also be negative to move the offset back. * @returns {!ByteBuffer} this * @expose */ ByteBufferPrototype.skip = function(length) { if (!this.noAssert) { if (typeof length !== 'number' || length % 1 !== 0) throw TypeError("Illegal length: "+length+" (not an integer)"); length |= 0; } var offset = this.offset + length; if (!this.noAssert) { if (offset < 0 || offset > this.buffer.byteLength) throw RangeError("Illegal length: 0 <= "+this.offset+" + "+length+" <= "+this.buffer.byteLength); } this.offset = offset; return this; }; /** * Slices this ByteBuffer by creating a cloned instance with `offset = begin` and `limit = end`. * @param {number=} begin Begin offset, defaults to {@link ByteBuffer#offset}. * @param {number=} end End offset, defaults to {@link ByteBuffer#limit}. * @returns {!ByteBuffer} Clone of this ByteBuffer with slicing applied, backed by the same {@link ByteBuffer#buffer} * @expose */ ByteBufferPrototype.slice = function(begin, end) { if (typeof begin === 'undefined') begin = this.offset; if (typeof end === 'undefined') end = this.limit; if (!this.noAssert) { if (typeof begin !== 'number' || begin % 1 !== 0) throw TypeError("Illegal begin: Not an integer"); begin >>>= 0; if (typeof end !== 'number' || end % 1 !== 0) throw TypeError("Illegal end: Not an integer"); end >>>= 0; if (begin < 0 || begin > end || end > this.buffer.byteLength) throw RangeError("Illegal range: 0 <= "+begin+" <= "+end+" <= "+this.buffer.byteLength); } var bb = this.clone(); bb.offset = begin; bb.limit = end; return bb; }; /** * Returns a copy of the backing buffer that contains this ByteBuffer's contents. Contents are the bytes between * {@link ByteBuffer#offset} and {@link ByteBuffer#limit}. * @param {boolean=} forceCopy If `true` returns a copy, otherwise returns a view referencing the same memory if * possible. Defaults to `false` * @returns {!ArrayBuffer} Contents as an ArrayBuffer * @expose */ ByteBufferPrototype.toBuffer = function(forceCopy) { var offset = this.offset, limit = this.limit; if (!this.noAssert) { if (typeof offset !== 'number' || offset % 1 !== 0) throw TypeError("Illegal offset: Not an integer"); offset >>>= 0; if (typeof limit !== 'number' || limit % 1 !== 0) throw TypeError("Illegal limit: Not an integer"); limit >>>= 0; if (offset < 0 || offset > limit || limit > this.buffer.byteLength) throw RangeError("Illegal range: 0 <= "+offset+" <= "+limit+" <= "+this.buffer.byteLength); } // NOTE: It's not possible to have another ArrayBuffer reference the same memory as the backing buffer. This is // possible with Uint8Array#subarray only, but we have to return an ArrayBuffer by contract. So: if (!forceCopy && offset === 0 && limit === this.buffer.byteLength) return this.buffer; if (offset === limit) return EMPTY_BUFFER; var buffer = new ArrayBuffer(limit - offset); new Uint8Array(buffer).set(new Uint8Array(this.buffer).subarray(offset, limit), 0); return buffer; }; /** * Returns a raw buffer compacted to contain this ByteBuffer's contents. Contents are the bytes between * {@link ByteBuffer#offset} and {@link ByteBuffer#limit}. This is an alias of {@link ByteBuffer#toBuffer}. * @function * @param {boolean=} forceCopy If `true` returns a copy, otherwise returns a view referencing the same memory. * Defaults to `false` * @returns {!ArrayBuffer} Contents as an ArrayBuffer * @expose */ ByteBufferPrototype.toArrayBuffer = ByteBufferPrototype.toBuffer; /** * Converts the ByteBuffer's contents to a string. * @param {string=} encoding Output encoding. Returns an informative string representation if omitted but also allows * direct conversion to "utf8", "hex", "base64" and "binary" encoding. "debug" returns a hex representation with * highlighted offsets. * @param {number=} begin Offset to begin at, defaults to {@link ByteBuffer#offset} * @param {number=} end Offset to end at, defaults to {@link ByteBuffer#limit} * @returns {string} String representation * @throws {Error} If `encoding` is invalid * @expose */ ByteBufferPrototype.toString = function(encoding, begin, end) { if (typeof encoding === 'undefined') return "ByteBufferAB(offset="+this.offset+",markedOffset="+this.markedOffset+",limit="+this.limit+",capacity="+this.capacity()+")"; if (typeof encoding === 'number') encoding = "utf8", begin = encoding, end = begin; switch (encoding) { case "utf8": return this.toUTF8(begin, end); case "base64": return this.toBase64(begin, end); case "hex": return this.toHex(begin, end); case "binary": return this.toBinary(begin, end); case "debug": return this.toDebug(); case "columns": return this.toColumns(); default: throw Error("Unsupported encoding: "+encoding); } }; // lxiv-embeddable /** * lxiv-embeddable (c) 2014 Daniel Wirtz * Released under the Apache License, Version 2.0 * see: https://github.com/dcodeIO/lxiv for details */ var lxiv = function() { "use strict"; /** * lxiv namespace. * @type {!Object.} * @exports lxiv */ var lxiv = {}; /** * Character codes for output. * @type {!Array.} * @inner */ var aout = [ 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 43, 47 ]; /** * Character codes for input. * @type {!Array.} * @inner */ var ain = []; for (var i=0, k=aout.length; i>2)&0x3f]); t = (b&0x3)<<4; if ((b = src()) !== null) { t |= (b>>4)&0xf; dst(aout[(t|((b>>4)&0xf))&0x3f]); t = (b&0xf)<<2; if ((b = src()) !== null) dst(aout[(t|((b>>6)&0x3))&0x3f]), dst(aout[b&0x3f]); else dst(aout[t&0x3f]), dst(61); } else dst(aout[t&0x3f]), dst(61), dst(61); } }; /** * Decodes base64 char codes to bytes. * @param {!function():number|null} src Characters source as a function returning the next char code respectively * `null` if there are no more characters left. * @param {!function(number)} dst Bytes destination as a function successively called with the next byte. * @throws {Error} If a character code is invalid */ lxiv.decode = function(src, dst) { var c, t1, t2; function fail(c) { throw Error("Illegal character code: "+c); } while ((c = src()) !== null) { t1 = ain[c]; if (typeof t1 === 'undefined') fail(c); if ((c = src()) !== null) { t2 = ain[c]; if (typeof t2 === 'undefined') fail(c); dst((t1<<2)>>>0|(t2&0x30)>>4); if ((c = src()) !== null) { t1 = ain[c]; if (typeof t1 === 'undefined') if (c === 61) break; else fail(c); dst(((t2&0xf)<<4)>>>0|(t1&0x3c)>>2); if ((c = src()) !== null) { t2 = ain[c]; if (typeof t2 === 'undefined') if (c === 61) break; else fail(c); dst(((t1&0x3)<<6)>>>0|t2); } } } } }; /** * Tests if a string is valid base64. * @param {string} str String to test * @returns {boolean} `true` if valid, otherwise `false` */ lxiv.test = function(str) { return /^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/.test(str); }; return lxiv; }(); // encodings/base64 /** * Encodes this ByteBuffer's contents to a base64 encoded string. * @param {number=} begin Offset to begin at, defaults to {@link ByteBuffer#offset}. * @param {number=} end Offset to end at, defaults to {@link ByteBuffer#limit}. * @returns {string} Base64 encoded string * @throws {RangeError} If `begin` or `end` is out of bounds * @expose */ ByteBufferPrototype.toBase64 = function(begin, end) { if (typeof begin === 'undefined') begin = this.offset; if (typeof end === 'undefined') end = this.limit; begin = begin | 0; end = end | 0; if (begin < 0 || end > this.capacity || begin > end) throw RangeError("begin, end"); var sd; lxiv.encode(function() { return begin < end ? this.view[begin++] : null; }.bind(this), sd = stringDestination()); return sd(); }; /** * Decodes a base64 encoded string to a ByteBuffer. * @param {string} str String to decode * @param {boolean=} littleEndian Whether to use little or big endian byte order. Defaults to * {@link ByteBuffer.DEFAULT_ENDIAN}. * @returns {!ByteBuffer} ByteBuffer * @expose */ ByteBuffer.fromBase64 = function(str, littleEndian) { if (typeof str !== 'string') throw TypeError("str"); var bb = new ByteBuffer(str.length/4*3, littleEndian), i = 0; lxiv.decode(stringSource(str), function(b) { bb.view[i++] = b; }); bb.limit = i; return bb; }; /** * Encodes a binary string to base64 like `window.btoa` does. * @param {string} str Binary string * @returns {string} Base64 encoded string * @see https://developer.mozilla.org/en-US/docs/Web/API/Window.btoa * @expose */ ByteBuffer.btoa = function(str) { return ByteBuffer.fromBinary(str).toBase64(); }; /** * Decodes a base64 encoded string to binary like `window.atob` does. * @param {string} b64 Base64 encoded string * @returns {string} Binary string * @see https://developer.mozilla.org/en-US/docs/Web/API/Window.atob * @expose */ ByteBuffer.atob = function(b64) { return ByteBuffer.fromBase64(b64).toBinary(); }; // encodings/binary /** * Encodes this ByteBuffer to a binary encoded string, that is using only characters 0x00-0xFF as bytes. * @param {number=} begin Offset to begin at. Defaults to {@link ByteBuffer#offset}. * @param {number=} end Offset to end at. Defaults to {@link ByteBuffer#limit}. * @returns {string} Binary encoded string * @throws {RangeError} If `offset > limit` * @expose */ ByteBufferPrototype.toBinary = function(begin, end) { if (typeof begin === 'undefined') begin = this.offset; if (typeof end === 'undefined') end = this.limit; begin |= 0; end |= 0; if (begin < 0 || end > this.capacity() || begin > end) throw RangeError("begin, end"); if (begin === end) return ""; var chars = [], parts = []; while (begin < end) { chars.push(this.view[begin++]); if (chars.length >= 1024) parts.push(String.fromCharCode.apply(String, chars)), chars = []; } return parts.join('') + String.fromCharCode.apply(String, chars); }; /** * Decodes a binary encoded string, that is using only characters 0x00-0xFF as bytes, to a ByteBuffer. * @param {string} str String to decode * @param {boolean=} littleEndian Whether to use little or big endian byte order. Defaults to * {@link ByteBuffer.DEFAULT_ENDIAN}. * @returns {!ByteBuffer} ByteBuffer * @expose */ ByteBuffer.fromBinary = function(str, littleEndian) { if (typeof str !== 'string') throw TypeError("str"); var i = 0, k = str.length, charCode, bb = new ByteBuffer(k, littleEndian); while (i 0xff) throw RangeError("illegal char code: "+charCode); bb.view[i++] = charCode; } bb.limit = k; return bb; }; // encodings/debug /** * Encodes this ByteBuffer to a hex encoded string with marked offsets. Offset symbols are: * * `<` : offset, * * `'` : markedOffset, * * `>` : limit, * * `|` : offset and limit, * * `[` : offset and markedOffset, * * `]` : markedOffset and limit, * * `!` : offset, markedOffset and limit * @param {boolean=} columns If `true` returns two columns hex + ascii, defaults to `false` * @returns {string|!Array.} Debug string or array of lines if `asArray = true` * @expose * @example `>00'01 02<03` contains four bytes with `limit=0, markedOffset=1, offset=3` * @example `00[01 02 03>` contains four bytes with `offset=markedOffset=1, limit=4` * @example `00|01 02 03` contains four bytes with `offset=limit=1, markedOffset=-1` * @example `|` contains zero bytes with `offset=limit=0, markedOffset=-1` */ ByteBufferPrototype.toDebug = function(columns) { var i = -1, k = this.buffer.byteLength, b, hex = "", asc = "", out = ""; while (i 32 && b < 127 ? String.fromCharCode(b) : '.'; } ++i; if (columns) { if (i > 0 && i % 16 === 0 && i !== k) { while (hex.length < 3*16+3) hex += " "; out += hex+asc+"\n"; hex = asc = ""; } } if (i === this.offset && i === this.limit) hex += i === this.markedOffset ? "!" : "|"; else if (i === this.offset) hex += i === this.markedOffset ? "[" : "<"; else if (i === this.limit) hex += i === this.markedOffset ? "]" : ">"; else hex += i === this.markedOffset ? "'" : (columns || (i !== 0 && i !== k) ? " " : ""); } if (columns && hex !== " ") { while (hex.length < 3*16+3) hex += " "; out += hex + asc + "\n"; } return columns ? out : hex; }; /** * Decodes a hex encoded string with marked offsets to a ByteBuffer. * @param {string} str Debug string to decode (not be generated with `columns = true`) * @param {boolean=} littleEndian Whether to use little or big endian byte order. Defaults to * {@link ByteBuffer.DEFAULT_ENDIAN}. * @param {boolean=} noAssert Whether to skip assertions of offsets and values. Defaults to * {@link ByteBuffer.DEFAULT_NOASSERT}. * @returns {!ByteBuffer} ByteBuffer * @expose * @see ByteBuffer#toDebug */ ByteBuffer.fromDebug = function(str, littleEndian, noAssert) { var k = str.length, bb = new ByteBuffer(((k+1)/3)|0, littleEndian, noAssert); var i = 0, j = 0, ch, b, rs = false, // Require symbol next ho = false, hm = false, hl = false, // Already has offset (ho), markedOffset (hm), limit (hl)? fail = false; while (i': if (!noAssert) { if (hl) { fail = true; break; } hl = true; } bb.limit = j; rs = false; break; case "'": if (!noAssert) { if (hm) { fail = true; break; } hm = true; } bb.markedOffset = j; rs = false; break; case ' ': rs = false; break; default: if (!noAssert) { if (rs) { fail = true; break; } } b = parseInt(ch+str.charAt(i++), 16); if (!noAssert) { if (isNaN(b) || b < 0 || b > 255) throw TypeError("Illegal str: Not a debug encoded string"); } bb.view[j++] = b; rs = true; } if (fail) throw TypeError("Illegal str: Invalid symbol at "+i); } if (!noAssert) { if (!ho || !hl) throw TypeError("Illegal str: Missing offset or limit"); if (j>>= 0; if (typeof end !== 'number' || end % 1 !== 0) throw TypeError("Illegal end: Not an integer"); end >>>= 0; if (begin < 0 || begin > end || end > this.buffer.byteLength) throw RangeError("Illegal range: 0 <= "+begin+" <= "+end+" <= "+this.buffer.byteLength); } var out = new Array(end - begin), b; while (begin < end) { b = this.view[begin++]; if (b < 0x10) out.push("0", b.toString(16)); else out.push(b.toString(16)); } return out.join(''); }; /** * Decodes a hex encoded string to a ByteBuffer. * @param {string} str String to decode * @param {boolean=} littleEndian Whether to use little or big endian byte order. Defaults to * {@link ByteBuffer.DEFAULT_ENDIAN}. * @param {boolean=} noAssert Whether to skip assertions of offsets and values. Defaults to * {@link ByteBuffer.DEFAULT_NOASSERT}. * @returns {!ByteBuffer} ByteBuffer * @expose */ ByteBuffer.fromHex = function(str, littleEndian, noAssert) { if (!noAssert) { if (typeof str !== 'string') throw TypeError("Illegal str: Not a string"); if (str.length % 2 !== 0) throw TypeError("Illegal str: Length not a multiple of 2"); } var k = str.length, bb = new ByteBuffer((k / 2) | 0, littleEndian), b; for (var i=0, j=0; i 255) throw TypeError("Illegal str: Contains non-hex characters"); bb.view[j++] = b; } bb.limit = j; return bb; }; // utfx-embeddable /** * utfx-embeddable (c) 2014 Daniel Wirtz * Released under the Apache License, Version 2.0 * see: https://github.com/dcodeIO/utfx for details */ var utfx = function() { "use strict"; /** * utfx namespace. * @inner * @type {!Object.} */ var utfx = {}; /** * Maximum valid code point. * @type {number} * @const */ utfx.MAX_CODEPOINT = 0x10FFFF; /** * Encodes UTF8 code points to UTF8 bytes. * @param {(!function():number|null) | number} src Code points source, either as a function returning the next code point * respectively `null` if there are no more code points left or a single numeric code point. * @param {!function(number)} dst Bytes destination as a function successively called with the next byte */ utfx.encodeUTF8 = function(src, dst) { var cp = null; if (typeof src === 'number') cp = src, src = function() { return null; }; while (cp !== null || (cp = src()) !== null) { if (cp < 0x80) dst(cp&0x7F); else if (cp < 0x800) dst(((cp>>6)&0x1F)|0xC0), dst((cp&0x3F)|0x80); else if (cp < 0x10000) dst(((cp>>12)&0x0F)|0xE0), dst(((cp>>6)&0x3F)|0x80), dst((cp&0x3F)|0x80); else dst(((cp>>18)&0x07)|0xF0), dst(((cp>>12)&0x3F)|0x80), dst(((cp>>6)&0x3F)|0x80), dst((cp&0x3F)|0x80); cp = null; } }; /** * Decodes UTF8 bytes to UTF8 code points. * @param {!function():number|null} src Bytes source as a function returning the next byte respectively `null` if there * are no more bytes left. * @param {!function(number)} dst Code points destination as a function successively called with each decoded code point. * @throws {RangeError} If a starting byte is invalid in UTF8 * @throws {Error} If the last sequence is truncated. Has an array property `bytes` holding the * remaining bytes. */ utfx.decodeUTF8 = function(src, dst) { var a, b, c, d, fail = function(b) { b = b.slice(0, b.indexOf(null)); var err = Error(b.toString()); err.name = "TruncatedError"; err['bytes'] = b; throw err; }; while ((a = src()) !== null) { if ((a&0x80) === 0) dst(a); else if ((a&0xE0) === 0xC0) ((b = src()) === null) && fail([a, b]), dst(((a&0x1F)<<6) | (b&0x3F)); else if ((a&0xF0) === 0xE0) ((b=src()) === null || (c=src()) === null) && fail([a, b, c]), dst(((a&0x0F)<<12) | ((b&0x3F)<<6) | (c&0x3F)); else if ((a&0xF8) === 0xF0) ((b=src()) === null || (c=src()) === null || (d=src()) === null) && fail([a, b, c ,d]), dst(((a&0x07)<<18) | ((b&0x3F)<<12) | ((c&0x3F)<<6) | (d&0x3F)); else throw RangeError("Illegal starting byte: "+a); } }; /** * Converts UTF16 characters to UTF8 code points. * @param {!function():number|null} src Characters source as a function returning the next char code respectively * `null` if there are no more characters left. * @param {!function(number)} dst Code points destination as a function successively called with each converted code * point. */ utfx.UTF16toUTF8 = function(src, dst) { var c1, c2 = null; while (true) { if ((c1 = c2 !== null ? c2 : src()) === null) break; if (c1 >= 0xD800 && c1 <= 0xDFFF) { if ((c2 = src()) !== null) { if (c2 >= 0xDC00 && c2 <= 0xDFFF) { dst((c1-0xD800)*0x400+c2-0xDC00+0x10000); c2 = null; continue; } } } dst(c1); } if (c2 !== null) dst(c2); }; /** * Converts UTF8 code points to UTF16 characters. * @param {(!function():number|null) | number} src Code points source, either as a function returning the next code point * respectively `null` if there are no more code points left or a single numeric code point. * @param {!function(number)} dst Characters destination as a function successively called with each converted char code. * @throws {RangeError} If a code point is out of range */ utfx.UTF8toUTF16 = function(src, dst) { var cp = null; if (typeof src === 'number') cp = src, src = function() { return null; }; while (cp !== null || (cp = src()) !== null) { if (cp <= 0xFFFF) dst(cp); else cp -= 0x10000, dst((cp>>10)+0xD800), dst((cp%0x400)+0xDC00); cp = null; } }; /** * Converts and encodes UTF16 characters to UTF8 bytes. * @param {!function():number|null} src Characters source as a function returning the next char code respectively `null` * if there are no more characters left. * @param {!function(number)} dst Bytes destination as a function successively called with the next byte. */ utfx.encodeUTF16toUTF8 = function(src, dst) { utfx.UTF16toUTF8(src, function(cp) { utfx.encodeUTF8(cp, dst); }); }; /** * Decodes and converts UTF8 bytes to UTF16 characters. * @param {!function():number|null} src Bytes source as a function returning the next byte respectively `null` if there * are no more bytes left. * @param {!function(number)} dst Characters destination as a function successively called with each converted char code. * @throws {RangeError} If a starting byte is invalid in UTF8 * @throws {Error} If the last sequence is truncated. Has an array property `bytes` holding the remaining bytes. */ utfx.decodeUTF8toUTF16 = function(src, dst) { utfx.decodeUTF8(src, function(cp) { utfx.UTF8toUTF16(cp, dst); }); }; /** * Calculates the byte length of an UTF8 code point. * @param {number} cp UTF8 code point * @returns {number} Byte length */ utfx.calculateCodePoint = function(cp) { return (cp < 0x80) ? 1 : (cp < 0x800) ? 2 : (cp < 0x10000) ? 3 : 4; }; /** * Calculates the number of UTF8 bytes required to store UTF8 code points. * @param {(!function():number|null)} src Code points source as a function returning the next code point respectively * `null` if there are no more code points left. * @returns {number} The number of UTF8 bytes required */ utfx.calculateUTF8 = function(src) { var cp, l=0; while ((cp = src()) !== null) l += (cp < 0x80) ? 1 : (cp < 0x800) ? 2 : (cp < 0x10000) ? 3 : 4; return l; }; /** * Calculates the number of UTF8 code points respectively UTF8 bytes required to store UTF16 char codes. * @param {(!function():number|null)} src Characters source as a function returning the next char code respectively * `null` if there are no more characters left. * @returns {!Array.} The number of UTF8 code points at index 0 and the number of UTF8 bytes required at index 1. */ utfx.calculateUTF16asUTF8 = function(src) { var n=0, l=0; utfx.UTF16toUTF8(src, function(cp) { ++n; l += (cp < 0x80) ? 1 : (cp < 0x800) ? 2 : (cp < 0x10000) ? 3 : 4; }); return [n,l]; }; return utfx; }(); // encodings/utf8 /** * Encodes this ByteBuffer's contents between {@link ByteBuffer#offset} and {@link ByteBuffer#limit} to an UTF8 encoded * string. * @returns {string} Hex encoded string * @throws {RangeError} If `offset > limit` * @expose */ ByteBufferPrototype.toUTF8 = function(begin, end) { if (typeof begin === 'undefined') begin = this.offset; if (typeof end === 'undefined') end = this.limit; if (!this.noAssert) { if (typeof begin !== 'number' || begin % 1 !== 0) throw TypeError("Illegal begin: Not an integer"); begin >>>= 0; if (typeof end !== 'number' || end % 1 !== 0) throw TypeError("Illegal end: Not an integer"); end >>>= 0; if (begin < 0 || begin > end || end > this.buffer.byteLength) throw RangeError("Illegal range: 0 <= "+begin+" <= "+end+" <= "+this.buffer.byteLength); } var sd; try { utfx.decodeUTF8toUTF16(function() { return begin < end ? this.view[begin++] : null; }.bind(this), sd = stringDestination()); } catch (e) { if (begin !== end) throw RangeError("Illegal range: Truncated data, "+begin+" != "+end); } return sd(); }; /** * Decodes an UTF8 encoded string to a ByteBuffer. * @param {string} str String to decode * @param {boolean=} littleEndian Whether to use little or big endian byte order. Defaults to * {@link ByteBuffer.DEFAULT_ENDIAN}. * @param {boolean=} noAssert Whether to skip assertions of offsets and values. Defaults to * {@link ByteBuffer.DEFAULT_NOASSERT}. * @returns {!ByteBuffer} ByteBuffer * @expose */ ByteBuffer.fromUTF8 = function(str, littleEndian, noAssert) { if (!noAssert) if (typeof str !== 'string') throw TypeError("Illegal str: Not a string"); var bb = new ByteBuffer(utfx.calculateUTF16asUTF8(stringSource(str), true)[1], littleEndian, noAssert), i = 0; utfx.encodeUTF16toUTF8(stringSource(str), function(b) { bb.view[i++] = b; }); bb.limit = i; return bb; }; return ByteBuffer; }); },{"long":712}],84:[function(require,module,exports){ // Copyright Joyent, Inc. and other Node contributors. // // Permission is hereby granted, free of charge, to any person obtaining a // copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to permit // persons to whom the Software is furnished to do so, subject to the // following conditions: // // The above copyright notice and this permission notice shall be included // in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE // USE OR OTHER DEALINGS IN THE SOFTWARE. var objectCreate = Object.create || objectCreatePolyfill var objectKeys = Object.keys || objectKeysPolyfill var bind = Function.prototype.bind || functionBindPolyfill function EventEmitter() { if (!this._events || !Object.prototype.hasOwnProperty.call(this, '_events')) { this._events = objectCreate(null); this._eventsCount = 0; } this._maxListeners = this._maxListeners || undefined; } module.exports = EventEmitter; // Backwards-compat with node 0.10.x EventEmitter.EventEmitter = EventEmitter; EventEmitter.prototype._events = undefined; EventEmitter.prototype._maxListeners = undefined; // By default EventEmitters will print a warning if more than 10 listeners are // added to it. This is a useful default which helps finding memory leaks. var defaultMaxListeners = 10; var hasDefineProperty; try { var o = {}; if (Object.defineProperty) Object.defineProperty(o, 'x', { value: 0 }); hasDefineProperty = o.x === 0; } catch (err) { hasDefineProperty = false } if (hasDefineProperty) { Object.defineProperty(EventEmitter, 'defaultMaxListeners', { enumerable: true, get: function() { return defaultMaxListeners; }, set: function(arg) { // check whether the input is a positive number (whose value is zero or // greater and not a NaN). if (typeof arg !== 'number' || arg < 0 || arg !== arg) throw new TypeError('"defaultMaxListeners" must be a positive number'); defaultMaxListeners = arg; } }); } else { EventEmitter.defaultMaxListeners = defaultMaxListeners; } // Obviously not all Emitters should be limited to 10. This function allows // that to be increased. Set to zero for unlimited. EventEmitter.prototype.setMaxListeners = function setMaxListeners(n) { if (typeof n !== 'number' || n < 0 || isNaN(n)) throw new TypeError('"n" argument must be a positive number'); this._maxListeners = n; return this; }; function $getMaxListeners(that) { if (that._maxListeners === undefined) return EventEmitter.defaultMaxListeners; return that._maxListeners; } EventEmitter.prototype.getMaxListeners = function getMaxListeners() { return $getMaxListeners(this); }; // These standalone emit* functions are used to optimize calling of event // handlers for fast cases because emit() itself often has a variable number of // arguments and can be deoptimized because of that. These functions always have // the same number of arguments and thus do not get deoptimized, so the code // inside them can execute faster. function emitNone(handler, isFn, self) { if (isFn) handler.call(self); else { var len = handler.length; var listeners = arrayClone(handler, len); for (var i = 0; i < len; ++i) listeners[i].call(self); } } function emitOne(handler, isFn, self, arg1) { if (isFn) handler.call(self, arg1); else { var len = handler.length; var listeners = arrayClone(handler, len); for (var i = 0; i < len; ++i) listeners[i].call(self, arg1); } } function emitTwo(handler, isFn, self, arg1, arg2) { if (isFn) handler.call(self, arg1, arg2); else { var len = handler.length; var listeners = arrayClone(handler, len); for (var i = 0; i < len; ++i) listeners[i].call(self, arg1, arg2); } } function emitThree(handler, isFn, self, arg1, arg2, arg3) { if (isFn) handler.call(self, arg1, arg2, arg3); else { var len = handler.length; var listeners = arrayClone(handler, len); for (var i = 0; i < len; ++i) listeners[i].call(self, arg1, arg2, arg3); } } function emitMany(handler, isFn, self, args) { if (isFn) handler.apply(self, args); else { var len = handler.length; var listeners = arrayClone(handler, len); for (var i = 0; i < len; ++i) listeners[i].apply(self, args); } } EventEmitter.prototype.emit = function emit(type) { var er, handler, len, args, i, events; var doError = (type === 'error'); events = this._events; if (events) doError = (doError && events.error == null); else if (!doError) return false; // If there is no 'error' event listener then throw. if (doError) { if (arguments.length > 1) er = arguments[1]; if (er instanceof Error) { throw er; // Unhandled 'error' event } else { // At least give some kind of context to the user var err = new Error('Unhandled "error" event. (' + er + ')'); err.context = er; throw err; } return false; } handler = events[type]; if (!handler) return false; var isFn = typeof handler === 'function'; len = arguments.length; switch (len) { // fast cases case 1: emitNone(handler, isFn, this); break; case 2: emitOne(handler, isFn, this, arguments[1]); break; case 3: emitTwo(handler, isFn, this, arguments[1], arguments[2]); break; case 4: emitThree(handler, isFn, this, arguments[1], arguments[2], arguments[3]); break; // slower default: args = new Array(len - 1); for (i = 1; i < len; i++) args[i - 1] = arguments[i]; emitMany(handler, isFn, this, args); } return true; }; function _addListener(target, type, listener, prepend) { var m; var events; var existing; if (typeof listener !== 'function') throw new TypeError('"listener" argument must be a function'); events = target._events; if (!events) { events = target._events = objectCreate(null); target._eventsCount = 0; } else { // To avoid recursion in the case that type === "newListener"! Before // adding it to the listeners, first emit "newListener". if (events.newListener) { target.emit('newListener', type, listener.listener ? listener.listener : listener); // Re-assign `events` because a newListener handler could have caused the // this._events to be assigned to a new object events = target._events; } existing = events[type]; } if (!existing) { // Optimize the case of one listener. Don't need the extra array object. existing = events[type] = listener; ++target._eventsCount; } else { if (typeof existing === 'function') { // Adding the second element, need to change to array. existing = events[type] = prepend ? [listener, existing] : [existing, listener]; } else { // If we've already got an array, just append. if (prepend) { existing.unshift(listener); } else { existing.push(listener); } } // Check for listener leak if (!existing.warned) { m = $getMaxListeners(target); if (m && m > 0 && existing.length > m) { existing.warned = true; var w = new Error('Possible EventEmitter memory leak detected. ' + existing.length + ' "' + String(type) + '" listeners ' + 'added. Use emitter.setMaxListeners() to ' + 'increase limit.'); w.name = 'MaxListenersExceededWarning'; w.emitter = target; w.type = type; w.count = existing.length; if (typeof console === 'object' && console.warn) { console.warn('%s: %s', w.name, w.message); } } } } return target; } EventEmitter.prototype.addListener = function addListener(type, listener) { return _addListener(this, type, listener, false); }; EventEmitter.prototype.on = EventEmitter.prototype.addListener; EventEmitter.prototype.prependListener = function prependListener(type, listener) { return _addListener(this, type, listener, true); }; function onceWrapper() { if (!this.fired) { this.target.removeListener(this.type, this.wrapFn); this.fired = true; switch (arguments.length) { case 0: return this.listener.call(this.target); case 1: return this.listener.call(this.target, arguments[0]); case 2: return this.listener.call(this.target, arguments[0], arguments[1]); case 3: return this.listener.call(this.target, arguments[0], arguments[1], arguments[2]); default: var args = new Array(arguments.length); for (var i = 0; i < args.length; ++i) args[i] = arguments[i]; this.listener.apply(this.target, args); } } } function _onceWrap(target, type, listener) { var state = { fired: false, wrapFn: undefined, target: target, type: type, listener: listener }; var wrapped = bind.call(onceWrapper, state); wrapped.listener = listener; state.wrapFn = wrapped; return wrapped; } EventEmitter.prototype.once = function once(type, listener) { if (typeof listener !== 'function') throw new TypeError('"listener" argument must be a function'); this.on(type, _onceWrap(this, type, listener)); return this; }; EventEmitter.prototype.prependOnceListener = function prependOnceListener(type, listener) { if (typeof listener !== 'function') throw new TypeError('"listener" argument must be a function'); this.prependListener(type, _onceWrap(this, type, listener)); return this; }; // Emits a 'removeListener' event if and only if the listener was removed. EventEmitter.prototype.removeListener = function removeListener(type, listener) { var list, events, position, i, originalListener; if (typeof listener !== 'function') throw new TypeError('"listener" argument must be a function'); events = this._events; if (!events) return this; list = events[type]; if (!list) return this; if (list === listener || list.listener === listener) { if (--this._eventsCount === 0) this._events = objectCreate(null); else { delete events[type]; if (events.removeListener) this.emit('removeListener', type, list.listener || listener); } } else if (typeof list !== 'function') { position = -1; for (i = list.length - 1; i >= 0; i--) { if (list[i] === listener || list[i].listener === listener) { originalListener = list[i].listener; position = i; break; } } if (position < 0) return this; if (position === 0) list.shift(); else spliceOne(list, position); if (list.length === 1) events[type] = list[0]; if (events.removeListener) this.emit('removeListener', type, originalListener || listener); } return this; }; EventEmitter.prototype.removeAllListeners = function removeAllListeners(type) { var listeners, events, i; events = this._events; if (!events) return this; // not listening for removeListener, no need to emit if (!events.removeListener) { if (arguments.length === 0) { this._events = objectCreate(null); this._eventsCount = 0; } else if (events[type]) { if (--this._eventsCount === 0) this._events = objectCreate(null); else delete events[type]; } return this; } // emit removeListener for all listeners on all events if (arguments.length === 0) { var keys = objectKeys(events); var key; for (i = 0; i < keys.length; ++i) { key = keys[i]; if (key === 'removeListener') continue; this.removeAllListeners(key); } this.removeAllListeners('removeListener'); this._events = objectCreate(null); this._eventsCount = 0; return this; } listeners = events[type]; if (typeof listeners === 'function') { this.removeListener(type, listeners); } else if (listeners) { // LIFO order for (i = listeners.length - 1; i >= 0; i--) { this.removeListener(type, listeners[i]); } } return this; }; function _listeners(target, type, unwrap) { var events = target._events; if (!events) return []; var evlistener = events[type]; if (!evlistener) return []; if (typeof evlistener === 'function') return unwrap ? [evlistener.listener || evlistener] : [evlistener]; return unwrap ? unwrapListeners(evlistener) : arrayClone(evlistener, evlistener.length); } EventEmitter.prototype.listeners = function listeners(type) { return _listeners(this, type, true); }; EventEmitter.prototype.rawListeners = function rawListeners(type) { return _listeners(this, type, false); }; EventEmitter.listenerCount = function(emitter, type) { if (typeof emitter.listenerCount === 'function') { return emitter.listenerCount(type); } else { return listenerCount.call(emitter, type); } }; EventEmitter.prototype.listenerCount = listenerCount; function listenerCount(type) { var events = this._events; if (events) { var evlistener = events[type]; if (typeof evlistener === 'function') { return 1; } else if (evlistener) { return evlistener.length; } } return 0; } EventEmitter.prototype.eventNames = function eventNames() { return this._eventsCount > 0 ? Reflect.ownKeys(this._events) : []; }; // About 1.5x faster than the two-arg version of Array#splice(). function spliceOne(list, index) { for (var i = index, k = i + 1, n = list.length; k < n; i += 1, k += 1) list[i] = list[k]; list.pop(); } function arrayClone(arr, n) { var copy = new Array(n); for (var i = 0; i < n; ++i) copy[i] = arr[i]; return copy; } function unwrapListeners(arr) { var ret = new Array(arr.length); for (var i = 0; i < ret.length; ++i) { ret[i] = arr[i].listener || arr[i]; } return ret; } function objectCreatePolyfill(proto) { var F = function() {}; F.prototype = proto; return new F; } function objectKeysPolyfill(obj) { var keys = []; for (var k in obj) if (Object.prototype.hasOwnProperty.call(obj, k)) { keys.push(k); } return k; } function functionBindPolyfill(context) { var fn = this; return function () { return fn.apply(context, arguments); }; } },{}],85:[function(require,module,exports){ var http = require('http') var url = require('url') var https = module.exports for (var key in http) { if (http.hasOwnProperty(key)) https[key] = http[key] } https.request = function (params, cb) { params = validateParams(params) return http.request.call(this, params, cb) } https.get = function (params, cb) { params = validateParams(params) return http.get.call(this, params, cb) } function validateParams (params) { if (typeof params === 'string') { params = url.parse(params) } if (!params.protocol) { params.protocol = 'https:' } if (params.protocol !== 'https:') { throw new Error('Protocol "' + params.protocol + '" not supported. Expected "https:"') } return params } },{"http":732,"url":753}],86:[function(require,module,exports){ /*! ieee754. BSD-3-Clause License. Feross Aboukhadijeh */ exports.read = function (buffer, offset, isLE, mLen, nBytes) { var e, m var eLen = (nBytes * 8) - mLen - 1 var eMax = (1 << eLen) - 1 var eBias = eMax >> 1 var nBits = -7 var i = isLE ? (nBytes - 1) : 0 var d = isLE ? -1 : 1 var s = buffer[offset + i] i += d e = s & ((1 << (-nBits)) - 1) s >>= (-nBits) nBits += eLen for (; nBits > 0; e = (e * 256) + buffer[offset + i], i += d, nBits -= 8) {} m = e & ((1 << (-nBits)) - 1) e >>= (-nBits) nBits += mLen for (; nBits > 0; m = (m * 256) + buffer[offset + i], i += d, nBits -= 8) {} if (e === 0) { e = 1 - eBias } else if (e === eMax) { return m ? NaN : ((s ? -1 : 1) * Infinity) } else { m = m + Math.pow(2, mLen) e = e - eBias } return (s ? -1 : 1) * m * Math.pow(2, e - mLen) } exports.write = function (buffer, value, offset, isLE, mLen, nBytes) { var e, m, c var eLen = (nBytes * 8) - mLen - 1 var eMax = (1 << eLen) - 1 var eBias = eMax >> 1 var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0) var i = isLE ? 0 : (nBytes - 1) var d = isLE ? 1 : -1 var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0 value = Math.abs(value) if (isNaN(value) || value === Infinity) { m = isNaN(value) ? 1 : 0 e = eMax } else { e = Math.floor(Math.log(value) / Math.LN2) if (value * (c = Math.pow(2, -e)) < 1) { e-- c *= 2 } if (e + eBias >= 1) { value += rt / c } else { value += rt * Math.pow(2, 1 - eBias) } if (value * c >= 2) { e++ c /= 2 } if (e + eBias >= eMax) { m = 0 e = eMax } else if (e + eBias >= 1) { m = ((value * c) - 1) * Math.pow(2, mLen) e = e + eBias } else { m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen) e = 0 } } for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {} e = (e << mLen) | m eLen += mLen for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {} buffer[offset + i - d] |= s * 128 } },{}],87:[function(require,module,exports){ /** * MIT License * * Copyright (c) 2014-present, Lee Byron and other contributors. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all * copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ (function (global, factory) { typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : typeof define === 'function' && define.amd ? define(['exports'], factory) : (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.Immutable = {})); }(this, (function (exports) { 'use strict'; var DELETE = 'delete'; // Constants describing the size of trie nodes. var SHIFT = 5; // Resulted in best performance after ______? var SIZE = 1 << SHIFT; var MASK = SIZE - 1; // A consistent shared value representing "not set" which equals nothing other // than itself, and nothing that could be provided externally. var NOT_SET = {}; // Boolean references, Rough equivalent of `bool &`. function MakeRef() { return { value: false }; } function SetRef(ref) { if (ref) { ref.value = true; } } // A function which returns a value representing an "owner" for transient writes // to tries. The return value will only ever equal itself, and will not equal // the return of any subsequent call of this function. function OwnerID() {} function ensureSize(iter) { if (iter.size === undefined) { iter.size = iter.__iterate(returnTrue); } return iter.size; } function wrapIndex(iter, index) { // This implements "is array index" which the ECMAString spec defines as: // // A String property name P is an array index if and only if // ToString(ToUint32(P)) is equal to P and ToUint32(P) is not equal // to 2^32−1. // // http://www.ecma-international.org/ecma-262/6.0/#sec-array-exotic-objects if (typeof index !== 'number') { var uint32Index = index >>> 0; // N >>> 0 is shorthand for ToUint32 if ('' + uint32Index !== index || uint32Index === 4294967295) { return NaN; } index = uint32Index; } return index < 0 ? ensureSize(iter) + index : index; } function returnTrue() { return true; } function wholeSlice(begin, end, size) { return ( ((begin === 0 && !isNeg(begin)) || (size !== undefined && begin <= -size)) && (end === undefined || (size !== undefined && end >= size)) ); } function resolveBegin(begin, size) { return resolveIndex(begin, size, 0); } function resolveEnd(end, size) { return resolveIndex(end, size, size); } function resolveIndex(index, size, defaultIndex) { // Sanitize indices using this shorthand for ToInt32(argument) // http://www.ecma-international.org/ecma-262/6.0/#sec-toint32 return index === undefined ? defaultIndex : isNeg(index) ? size === Infinity ? size : Math.max(0, size + index) | 0 : size === undefined || size === index ? index : Math.min(size, index) | 0; } function isNeg(value) { // Account for -0 which is negative, but not less than 0. return value < 0 || (value === 0 && 1 / value === -Infinity); } var IS_COLLECTION_SYMBOL = '@@__IMMUTABLE_ITERABLE__@@'; function isCollection(maybeCollection) { return Boolean(maybeCollection && maybeCollection[IS_COLLECTION_SYMBOL]); } var IS_KEYED_SYMBOL = '@@__IMMUTABLE_KEYED__@@'; function isKeyed(maybeKeyed) { return Boolean(maybeKeyed && maybeKeyed[IS_KEYED_SYMBOL]); } var IS_INDEXED_SYMBOL = '@@__IMMUTABLE_INDEXED__@@'; function isIndexed(maybeIndexed) { return Boolean(maybeIndexed && maybeIndexed[IS_INDEXED_SYMBOL]); } function isAssociative(maybeAssociative) { return isKeyed(maybeAssociative) || isIndexed(maybeAssociative); } var Collection = function Collection(value) { return isCollection(value) ? value : Seq(value); }; var KeyedCollection = /*@__PURE__*/(function (Collection) { function KeyedCollection(value) { return isKeyed(value) ? value : KeyedSeq(value); } if ( Collection ) KeyedCollection.__proto__ = Collection; KeyedCollection.prototype = Object.create( Collection && Collection.prototype ); KeyedCollection.prototype.constructor = KeyedCollection; return KeyedCollection; }(Collection)); var IndexedCollection = /*@__PURE__*/(function (Collection) { function IndexedCollection(value) { return isIndexed(value) ? value : IndexedSeq(value); } if ( Collection ) IndexedCollection.__proto__ = Collection; IndexedCollection.prototype = Object.create( Collection && Collection.prototype ); IndexedCollection.prototype.constructor = IndexedCollection; return IndexedCollection; }(Collection)); var SetCollection = /*@__PURE__*/(function (Collection) { function SetCollection(value) { return isCollection(value) && !isAssociative(value) ? value : SetSeq(value); } if ( Collection ) SetCollection.__proto__ = Collection; SetCollection.prototype = Object.create( Collection && Collection.prototype ); SetCollection.prototype.constructor = SetCollection; return SetCollection; }(Collection)); Collection.Keyed = KeyedCollection; Collection.Indexed = IndexedCollection; Collection.Set = SetCollection; var IS_SEQ_SYMBOL = '@@__IMMUTABLE_SEQ__@@'; function isSeq(maybeSeq) { return Boolean(maybeSeq && maybeSeq[IS_SEQ_SYMBOL]); } var IS_RECORD_SYMBOL = '@@__IMMUTABLE_RECORD__@@'; function isRecord(maybeRecord) { return Boolean(maybeRecord && maybeRecord[IS_RECORD_SYMBOL]); } function isImmutable(maybeImmutable) { return isCollection(maybeImmutable) || isRecord(maybeImmutable); } var IS_ORDERED_SYMBOL = '@@__IMMUTABLE_ORDERED__@@'; function isOrdered(maybeOrdered) { return Boolean(maybeOrdered && maybeOrdered[IS_ORDERED_SYMBOL]); } var ITERATE_KEYS = 0; var ITERATE_VALUES = 1; var ITERATE_ENTRIES = 2; var REAL_ITERATOR_SYMBOL = typeof Symbol === 'function' && Symbol.iterator; var FAUX_ITERATOR_SYMBOL = '@@iterator'; var ITERATOR_SYMBOL = REAL_ITERATOR_SYMBOL || FAUX_ITERATOR_SYMBOL; var Iterator = function Iterator(next) { this.next = next; }; Iterator.prototype.toString = function toString () { return '[Iterator]'; }; Iterator.KEYS = ITERATE_KEYS; Iterator.VALUES = ITERATE_VALUES; Iterator.ENTRIES = ITERATE_ENTRIES; Iterator.prototype.inspect = Iterator.prototype.toSource = function () { return this.toString(); }; Iterator.prototype[ITERATOR_SYMBOL] = function () { return this; }; function iteratorValue(type, k, v, iteratorResult) { var value = type === 0 ? k : type === 1 ? v : [k, v]; iteratorResult ? (iteratorResult.value = value) : (iteratorResult = { value: value, done: false, }); return iteratorResult; } function iteratorDone() { return { value: undefined, done: true }; } function hasIterator(maybeIterable) { if (Array.isArray(maybeIterable)) { // IE11 trick as it does not support `Symbol.iterator` return true; } return !!getIteratorFn(maybeIterable); } function isIterator(maybeIterator) { return maybeIterator && typeof maybeIterator.next === 'function'; } function getIterator(iterable) { var iteratorFn = getIteratorFn(iterable); return iteratorFn && iteratorFn.call(iterable); } function getIteratorFn(iterable) { var iteratorFn = iterable && ((REAL_ITERATOR_SYMBOL && iterable[REAL_ITERATOR_SYMBOL]) || iterable[FAUX_ITERATOR_SYMBOL]); if (typeof iteratorFn === 'function') { return iteratorFn; } } function isEntriesIterable(maybeIterable) { var iteratorFn = getIteratorFn(maybeIterable); return iteratorFn && iteratorFn === maybeIterable.entries; } function isKeysIterable(maybeIterable) { var iteratorFn = getIteratorFn(maybeIterable); return iteratorFn && iteratorFn === maybeIterable.keys; } var hasOwnProperty = Object.prototype.hasOwnProperty; function isArrayLike(value) { if (Array.isArray(value) || typeof value === 'string') { return true; } return ( value && typeof value === 'object' && Number.isInteger(value.length) && value.length >= 0 && (value.length === 0 ? // Only {length: 0} is considered Array-like. Object.keys(value).length === 1 : // An object is only Array-like if it has a property where the last value // in the array-like may be found (which could be undefined). value.hasOwnProperty(value.length - 1)) ); } var Seq = /*@__PURE__*/(function (Collection) { function Seq(value) { return value === undefined || value === null ? emptySequence() : isImmutable(value) ? value.toSeq() : seqFromValue(value); } if ( Collection ) Seq.__proto__ = Collection; Seq.prototype = Object.create( Collection && Collection.prototype ); Seq.prototype.constructor = Seq; Seq.prototype.toSeq = function toSeq () { return this; }; Seq.prototype.toString = function toString () { return this.__toString('Seq {', '}'); }; Seq.prototype.cacheResult = function cacheResult () { if (!this._cache && this.__iterateUncached) { this._cache = this.entrySeq().toArray(); this.size = this._cache.length; } return this; }; // abstract __iterateUncached(fn, reverse) Seq.prototype.__iterate = function __iterate (fn, reverse) { var cache = this._cache; if (cache) { var size = cache.length; var i = 0; while (i !== size) { var entry = cache[reverse ? size - ++i : i++]; if (fn(entry[1], entry[0], this) === false) { break; } } return i; } return this.__iterateUncached(fn, reverse); }; // abstract __iteratorUncached(type, reverse) Seq.prototype.__iterator = function __iterator (type, reverse) { var cache = this._cache; if (cache) { var size = cache.length; var i = 0; return new Iterator(function () { if (i === size) { return iteratorDone(); } var entry = cache[reverse ? size - ++i : i++]; return iteratorValue(type, entry[0], entry[1]); }); } return this.__iteratorUncached(type, reverse); }; return Seq; }(Collection)); var KeyedSeq = /*@__PURE__*/(function (Seq) { function KeyedSeq(value) { return value === undefined || value === null ? emptySequence().toKeyedSeq() : isCollection(value) ? isKeyed(value) ? value.toSeq() : value.fromEntrySeq() : isRecord(value) ? value.toSeq() : keyedSeqFromValue(value); } if ( Seq ) KeyedSeq.__proto__ = Seq; KeyedSeq.prototype = Object.create( Seq && Seq.prototype ); KeyedSeq.prototype.constructor = KeyedSeq; KeyedSeq.prototype.toKeyedSeq = function toKeyedSeq () { return this; }; return KeyedSeq; }(Seq)); var IndexedSeq = /*@__PURE__*/(function (Seq) { function IndexedSeq(value) { return value === undefined || value === null ? emptySequence() : isCollection(value) ? isKeyed(value) ? value.entrySeq() : value.toIndexedSeq() : isRecord(value) ? value.toSeq().entrySeq() : indexedSeqFromValue(value); } if ( Seq ) IndexedSeq.__proto__ = Seq; IndexedSeq.prototype = Object.create( Seq && Seq.prototype ); IndexedSeq.prototype.constructor = IndexedSeq; IndexedSeq.of = function of (/*...values*/) { return IndexedSeq(arguments); }; IndexedSeq.prototype.toIndexedSeq = function toIndexedSeq () { return this; }; IndexedSeq.prototype.toString = function toString () { return this.__toString('Seq [', ']'); }; return IndexedSeq; }(Seq)); var SetSeq = /*@__PURE__*/(function (Seq) { function SetSeq(value) { return ( isCollection(value) && !isAssociative(value) ? value : IndexedSeq(value) ).toSetSeq(); } if ( Seq ) SetSeq.__proto__ = Seq; SetSeq.prototype = Object.create( Seq && Seq.prototype ); SetSeq.prototype.constructor = SetSeq; SetSeq.of = function of (/*...values*/) { return SetSeq(arguments); }; SetSeq.prototype.toSetSeq = function toSetSeq () { return this; }; return SetSeq; }(Seq)); Seq.isSeq = isSeq; Seq.Keyed = KeyedSeq; Seq.Set = SetSeq; Seq.Indexed = IndexedSeq; Seq.prototype[IS_SEQ_SYMBOL] = true; // #pragma Root Sequences var ArraySeq = /*@__PURE__*/(function (IndexedSeq) { function ArraySeq(array) { this._array = array; this.size = array.length; } if ( IndexedSeq ) ArraySeq.__proto__ = IndexedSeq; ArraySeq.prototype = Object.create( IndexedSeq && IndexedSeq.prototype ); ArraySeq.prototype.constructor = ArraySeq; ArraySeq.prototype.get = function get (index, notSetValue) { return this.has(index) ? this._array[wrapIndex(this, index)] : notSetValue; }; ArraySeq.prototype.__iterate = function __iterate (fn, reverse) { var array = this._array; var size = array.length; var i = 0; while (i !== size) { var ii = reverse ? size - ++i : i++; if (fn(array[ii], ii, this) === false) { break; } } return i; }; ArraySeq.prototype.__iterator = function __iterator (type, reverse) { var array = this._array; var size = array.length; var i = 0; return new Iterator(function () { if (i === size) { return iteratorDone(); } var ii = reverse ? size - ++i : i++; return iteratorValue(type, ii, array[ii]); }); }; return ArraySeq; }(IndexedSeq)); var ObjectSeq = /*@__PURE__*/(function (KeyedSeq) { function ObjectSeq(object) { var keys = Object.keys(object).concat( Object.getOwnPropertySymbols ? Object.getOwnPropertySymbols(object) : [] ); this._object = object; this._keys = keys; this.size = keys.length; } if ( KeyedSeq ) ObjectSeq.__proto__ = KeyedSeq; ObjectSeq.prototype = Object.create( KeyedSeq && KeyedSeq.prototype ); ObjectSeq.prototype.constructor = ObjectSeq; ObjectSeq.prototype.get = function get (key, notSetValue) { if (notSetValue !== undefined && !this.has(key)) { return notSetValue; } return this._object[key]; }; ObjectSeq.prototype.has = function has (key) { return hasOwnProperty.call(this._object, key); }; ObjectSeq.prototype.__iterate = function __iterate (fn, reverse) { var object = this._object; var keys = this._keys; var size = keys.length; var i = 0; while (i !== size) { var key = keys[reverse ? size - ++i : i++]; if (fn(object[key], key, this) === false) { break; } } return i; }; ObjectSeq.prototype.__iterator = function __iterator (type, reverse) { var object = this._object; var keys = this._keys; var size = keys.length; var i = 0; return new Iterator(function () { if (i === size) { return iteratorDone(); } var key = keys[reverse ? size - ++i : i++]; return iteratorValue(type, key, object[key]); }); }; return ObjectSeq; }(KeyedSeq)); ObjectSeq.prototype[IS_ORDERED_SYMBOL] = true; var CollectionSeq = /*@__PURE__*/(function (IndexedSeq) { function CollectionSeq(collection) { this._collection = collection; this.size = collection.length || collection.size; } if ( IndexedSeq ) CollectionSeq.__proto__ = IndexedSeq; CollectionSeq.prototype = Object.create( IndexedSeq && IndexedSeq.prototype ); CollectionSeq.prototype.constructor = CollectionSeq; CollectionSeq.prototype.__iterateUncached = function __iterateUncached (fn, reverse) { if (reverse) { return this.cacheResult().__iterate(fn, reverse); } var collection = this._collection; var iterator = getIterator(collection); var iterations = 0; if (isIterator(iterator)) { var step; while (!(step = iterator.next()).done) { if (fn(step.value, iterations++, this) === false) { break; } } } return iterations; }; CollectionSeq.prototype.__iteratorUncached = function __iteratorUncached (type, reverse) { if (reverse) { return this.cacheResult().__iterator(type, reverse); } var collection = this._collection; var iterator = getIterator(collection); if (!isIterator(iterator)) { return new Iterator(iteratorDone); } var iterations = 0; return new Iterator(function () { var step = iterator.next(); return step.done ? step : iteratorValue(type, iterations++, step.value); }); }; return CollectionSeq; }(IndexedSeq)); // # pragma Helper functions var EMPTY_SEQ; function emptySequence() { return EMPTY_SEQ || (EMPTY_SEQ = new ArraySeq([])); } function keyedSeqFromValue(value) { var seq = maybeIndexedSeqFromValue(value); if (seq) { return seq.fromEntrySeq(); } if (typeof value === 'object') { return new ObjectSeq(value); } throw new TypeError( 'Expected Array or collection object of [k, v] entries, or keyed object: ' + value ); } function indexedSeqFromValue(value) { var seq = maybeIndexedSeqFromValue(value); if (seq) { return seq; } throw new TypeError( 'Expected Array or collection object of values: ' + value ); } function seqFromValue(value) { var seq = maybeIndexedSeqFromValue(value); if (seq) { return isEntriesIterable(value) ? seq.fromEntrySeq() : isKeysIterable(value) ? seq.toSetSeq() : seq; } if (typeof value === 'object') { return new ObjectSeq(value); } throw new TypeError( 'Expected Array or collection object of values, or keyed object: ' + value ); } function maybeIndexedSeqFromValue(value) { return isArrayLike(value) ? new ArraySeq(value) : hasIterator(value) ? new CollectionSeq(value) : undefined; } var IS_MAP_SYMBOL = '@@__IMMUTABLE_MAP__@@'; function isMap(maybeMap) { return Boolean(maybeMap && maybeMap[IS_MAP_SYMBOL]); } function isOrderedMap(maybeOrderedMap) { return isMap(maybeOrderedMap) && isOrdered(maybeOrderedMap); } function isValueObject(maybeValue) { return Boolean( maybeValue && typeof maybeValue.equals === 'function' && typeof maybeValue.hashCode === 'function' ); } /** * An extension of the "same-value" algorithm as [described for use by ES6 Map * and Set](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map#Key_equality) * * NaN is considered the same as NaN, however -0 and 0 are considered the same * value, which is different from the algorithm described by * [`Object.is`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is). * * This is extended further to allow Objects to describe the values they * represent, by way of `valueOf` or `equals` (and `hashCode`). * * Note: because of this extension, the key equality of Immutable.Map and the * value equality of Immutable.Set will differ from ES6 Map and Set. * * ### Defining custom values * * The easiest way to describe the value an object represents is by implementing * `valueOf`. For example, `Date` represents a value by returning a unix * timestamp for `valueOf`: * * var date1 = new Date(1234567890000); // Fri Feb 13 2009 ... * var date2 = new Date(1234567890000); * date1.valueOf(); // 1234567890000 * assert( date1 !== date2 ); * assert( Immutable.is( date1, date2 ) ); * * Note: overriding `valueOf` may have other implications if you use this object * where JavaScript expects a primitive, such as implicit string coercion. * * For more complex types, especially collections, implementing `valueOf` may * not be performant. An alternative is to implement `equals` and `hashCode`. * * `equals` takes another object, presumably of similar type, and returns true * if it is equal. Equality is symmetrical, so the same result should be * returned if this and the argument are flipped. * * assert( a.equals(b) === b.equals(a) ); * * `hashCode` returns a 32bit integer number representing the object which will * be used to determine how to store the value object in a Map or Set. You must * provide both or neither methods, one must not exist without the other. * * Also, an important relationship between these methods must be upheld: if two * values are equal, they *must* return the same hashCode. If the values are not * equal, they might have the same hashCode; this is called a hash collision, * and while undesirable for performance reasons, it is acceptable. * * if (a.equals(b)) { * assert( a.hashCode() === b.hashCode() ); * } * * All Immutable collections are Value Objects: they implement `equals()` * and `hashCode()`. */ function is(valueA, valueB) { if (valueA === valueB || (valueA !== valueA && valueB !== valueB)) { return true; } if (!valueA || !valueB) { return false; } if ( typeof valueA.valueOf === 'function' && typeof valueB.valueOf === 'function' ) { valueA = valueA.valueOf(); valueB = valueB.valueOf(); if (valueA === valueB || (valueA !== valueA && valueB !== valueB)) { return true; } if (!valueA || !valueB) { return false; } } return !!( isValueObject(valueA) && isValueObject(valueB) && valueA.equals(valueB) ); } var imul = typeof Math.imul === 'function' && Math.imul(0xffffffff, 2) === -2 ? Math.imul : function imul(a, b) { a |= 0; // int b |= 0; // int var c = a & 0xffff; var d = b & 0xffff; // Shift by 0 fixes the sign on the high part. return (c * d + ((((a >>> 16) * d + c * (b >>> 16)) << 16) >>> 0)) | 0; // int }; // v8 has an optimization for storing 31-bit signed numbers. // Values which have either 00 or 11 as the high order bits qualify. // This function drops the highest order bit in a signed number, maintaining // the sign bit. function smi(i32) { return ((i32 >>> 1) & 0x40000000) | (i32 & 0xbfffffff); } var defaultValueOf = Object.prototype.valueOf; function hash(o) { if (o == null) { return hashNullish(o); } if (typeof o.hashCode === 'function') { // Drop any high bits from accidentally long hash codes. return smi(o.hashCode(o)); } var v = valueOf(o); if (v == null) { return hashNullish(v); } switch (typeof v) { case 'boolean': // The hash values for built-in constants are a 1 value for each 5-byte // shift region expect for the first, which encodes the value. This // reduces the odds of a hash collision for these common values. return v ? 0x42108421 : 0x42108420; case 'number': return hashNumber(v); case 'string': return v.length > STRING_HASH_CACHE_MIN_STRLEN ? cachedHashString(v) : hashString(v); case 'object': case 'function': return hashJSObj(v); case 'symbol': return hashSymbol(v); default: if (typeof v.toString === 'function') { return hashString(v.toString()); } throw new Error('Value type ' + typeof v + ' cannot be hashed.'); } } function hashNullish(nullish) { return nullish === null ? 0x42108422 : /* undefined */ 0x42108423; } // Compress arbitrarily large numbers into smi hashes. function hashNumber(n) { if (n !== n || n === Infinity) { return 0; } var hash = n | 0; if (hash !== n) { hash ^= n * 0xffffffff; } while (n > 0xffffffff) { n /= 0xffffffff; hash ^= n; } return smi(hash); } function cachedHashString(string) { var hashed = stringHashCache[string]; if (hashed === undefined) { hashed = hashString(string); if (STRING_HASH_CACHE_SIZE === STRING_HASH_CACHE_MAX_SIZE) { STRING_HASH_CACHE_SIZE = 0; stringHashCache = {}; } STRING_HASH_CACHE_SIZE++; stringHashCache[string] = hashed; } return hashed; } // http://jsperf.com/hashing-strings function hashString(string) { // This is the hash from JVM // The hash code for a string is computed as // s[0] * 31 ^ (n - 1) + s[1] * 31 ^ (n - 2) + ... + s[n - 1], // where s[i] is the ith character of the string and n is the length of // the string. We "mod" the result to make it between 0 (inclusive) and 2^31 // (exclusive) by dropping high bits. var hashed = 0; for (var ii = 0; ii < string.length; ii++) { hashed = (31 * hashed + string.charCodeAt(ii)) | 0; } return smi(hashed); } function hashSymbol(sym) { var hashed = symbolMap[sym]; if (hashed !== undefined) { return hashed; } hashed = nextHash(); symbolMap[sym] = hashed; return hashed; } function hashJSObj(obj) { var hashed; if (usingWeakMap) { hashed = weakMap.get(obj); if (hashed !== undefined) { return hashed; } } hashed = obj[UID_HASH_KEY]; if (hashed !== undefined) { return hashed; } if (!canDefineProperty) { hashed = obj.propertyIsEnumerable && obj.propertyIsEnumerable[UID_HASH_KEY]; if (hashed !== undefined) { return hashed; } hashed = getIENodeHash(obj); if (hashed !== undefined) { return hashed; } } hashed = nextHash(); if (usingWeakMap) { weakMap.set(obj, hashed); } else if (isExtensible !== undefined && isExtensible(obj) === false) { throw new Error('Non-extensible objects are not allowed as keys.'); } else if (canDefineProperty) { Object.defineProperty(obj, UID_HASH_KEY, { enumerable: false, configurable: false, writable: false, value: hashed, }); } else if ( obj.propertyIsEnumerable !== undefined && obj.propertyIsEnumerable === obj.constructor.prototype.propertyIsEnumerable ) { // Since we can't define a non-enumerable property on the object // we'll hijack one of the less-used non-enumerable properties to // save our hash on it. Since this is a function it will not show up in // `JSON.stringify` which is what we want. obj.propertyIsEnumerable = function () { return this.constructor.prototype.propertyIsEnumerable.apply( this, arguments ); }; obj.propertyIsEnumerable[UID_HASH_KEY] = hashed; } else if (obj.nodeType !== undefined) { // At this point we couldn't get the IE `uniqueID` to use as a hash // and we couldn't use a non-enumerable property to exploit the // dontEnum bug so we simply add the `UID_HASH_KEY` on the node // itself. obj[UID_HASH_KEY] = hashed; } else { throw new Error('Unable to set a non-enumerable property on object.'); } return hashed; } // Get references to ES5 object methods. var isExtensible = Object.isExtensible; // True if Object.defineProperty works as expected. IE8 fails this test. var canDefineProperty = (function () { try { Object.defineProperty({}, '@', {}); return true; } catch (e) { return false; } })(); // IE has a `uniqueID` property on DOM nodes. We can construct the hash from it // and avoid memory leaks from the IE cloneNode bug. function getIENodeHash(node) { if (node && node.nodeType > 0) { switch (node.nodeType) { case 1: // Element return node.uniqueID; case 9: // Document return node.documentElement && node.documentElement.uniqueID; } } } function valueOf(obj) { return obj.valueOf !== defaultValueOf && typeof obj.valueOf === 'function' ? obj.valueOf(obj) : obj; } function nextHash() { var nextHash = ++_objHashUID; if (_objHashUID & 0x40000000) { _objHashUID = 0; } return nextHash; } // If possible, use a WeakMap. var usingWeakMap = typeof WeakMap === 'function'; var weakMap; if (usingWeakMap) { weakMap = new WeakMap(); } var symbolMap = Object.create(null); var _objHashUID = 0; var UID_HASH_KEY = '__immutablehash__'; if (typeof Symbol === 'function') { UID_HASH_KEY = Symbol(UID_HASH_KEY); } var STRING_HASH_CACHE_MIN_STRLEN = 16; var STRING_HASH_CACHE_MAX_SIZE = 255; var STRING_HASH_CACHE_SIZE = 0; var stringHashCache = {}; var ToKeyedSequence = /*@__PURE__*/(function (KeyedSeq) { function ToKeyedSequence(indexed, useKeys) { this._iter = indexed; this._useKeys = useKeys; this.size = indexed.size; } if ( KeyedSeq ) ToKeyedSequence.__proto__ = KeyedSeq; ToKeyedSequence.prototype = Object.create( KeyedSeq && KeyedSeq.prototype ); ToKeyedSequence.prototype.constructor = ToKeyedSequence; ToKeyedSequence.prototype.get = function get (key, notSetValue) { return this._iter.get(key, notSetValue); }; ToKeyedSequence.prototype.has = function has (key) { return this._iter.has(key); }; ToKeyedSequence.prototype.valueSeq = function valueSeq () { return this._iter.valueSeq(); }; ToKeyedSequence.prototype.reverse = function reverse () { var this$1$1 = this; var reversedSequence = reverseFactory(this, true); if (!this._useKeys) { reversedSequence.valueSeq = function () { return this$1$1._iter.toSeq().reverse(); }; } return reversedSequence; }; ToKeyedSequence.prototype.map = function map (mapper, context) { var this$1$1 = this; var mappedSequence = mapFactory(this, mapper, context); if (!this._useKeys) { mappedSequence.valueSeq = function () { return this$1$1._iter.toSeq().map(mapper, context); }; } return mappedSequence; }; ToKeyedSequence.prototype.__iterate = function __iterate (fn, reverse) { var this$1$1 = this; return this._iter.__iterate(function (v, k) { return fn(v, k, this$1$1); }, reverse); }; ToKeyedSequence.prototype.__iterator = function __iterator (type, reverse) { return this._iter.__iterator(type, reverse); }; return ToKeyedSequence; }(KeyedSeq)); ToKeyedSequence.prototype[IS_ORDERED_SYMBOL] = true; var ToIndexedSequence = /*@__PURE__*/(function (IndexedSeq) { function ToIndexedSequence(iter) { this._iter = iter; this.size = iter.size; } if ( IndexedSeq ) ToIndexedSequence.__proto__ = IndexedSeq; ToIndexedSequence.prototype = Object.create( IndexedSeq && IndexedSeq.prototype ); ToIndexedSequence.prototype.constructor = ToIndexedSequence; ToIndexedSequence.prototype.includes = function includes (value) { return this._iter.includes(value); }; ToIndexedSequence.prototype.__iterate = function __iterate (fn, reverse) { var this$1$1 = this; var i = 0; reverse && ensureSize(this); return this._iter.__iterate( function (v) { return fn(v, reverse ? this$1$1.size - ++i : i++, this$1$1); }, reverse ); }; ToIndexedSequence.prototype.__iterator = function __iterator (type, reverse) { var this$1$1 = this; var iterator = this._iter.__iterator(ITERATE_VALUES, reverse); var i = 0; reverse && ensureSize(this); return new Iterator(function () { var step = iterator.next(); return step.done ? step : iteratorValue( type, reverse ? this$1$1.size - ++i : i++, step.value, step ); }); }; return ToIndexedSequence; }(IndexedSeq)); var ToSetSequence = /*@__PURE__*/(function (SetSeq) { function ToSetSequence(iter) { this._iter = iter; this.size = iter.size; } if ( SetSeq ) ToSetSequence.__proto__ = SetSeq; ToSetSequence.prototype = Object.create( SetSeq && SetSeq.prototype ); ToSetSequence.prototype.constructor = ToSetSequence; ToSetSequence.prototype.has = function has (key) { return this._iter.includes(key); }; ToSetSequence.prototype.__iterate = function __iterate (fn, reverse) { var this$1$1 = this; return this._iter.__iterate(function (v) { return fn(v, v, this$1$1); }, reverse); }; ToSetSequence.prototype.__iterator = function __iterator (type, reverse) { var iterator = this._iter.__iterator(ITERATE_VALUES, reverse); return new Iterator(function () { var step = iterator.next(); return step.done ? step : iteratorValue(type, step.value, step.value, step); }); }; return ToSetSequence; }(SetSeq)); var FromEntriesSequence = /*@__PURE__*/(function (KeyedSeq) { function FromEntriesSequence(entries) { this._iter = entries; this.size = entries.size; } if ( KeyedSeq ) FromEntriesSequence.__proto__ = KeyedSeq; FromEntriesSequence.prototype = Object.create( KeyedSeq && KeyedSeq.prototype ); FromEntriesSequence.prototype.constructor = FromEntriesSequence; FromEntriesSequence.prototype.entrySeq = function entrySeq () { return this._iter.toSeq(); }; FromEntriesSequence.prototype.__iterate = function __iterate (fn, reverse) { var this$1$1 = this; return this._iter.__iterate(function (entry) { // Check if entry exists first so array access doesn't throw for holes // in the parent iteration. if (entry) { validateEntry(entry); var indexedCollection = isCollection(entry); return fn( indexedCollection ? entry.get(1) : entry[1], indexedCollection ? entry.get(0) : entry[0], this$1$1 ); } }, reverse); }; FromEntriesSequence.prototype.__iterator = function __iterator (type, reverse) { var iterator = this._iter.__iterator(ITERATE_VALUES, reverse); return new Iterator(function () { while (true) { var step = iterator.next(); if (step.done) { return step; } var entry = step.value; // Check if entry exists first so array access doesn't throw for holes // in the parent iteration. if (entry) { validateEntry(entry); var indexedCollection = isCollection(entry); return iteratorValue( type, indexedCollection ? entry.get(0) : entry[0], indexedCollection ? entry.get(1) : entry[1], step ); } } }); }; return FromEntriesSequence; }(KeyedSeq)); ToIndexedSequence.prototype.cacheResult = ToKeyedSequence.prototype.cacheResult = ToSetSequence.prototype.cacheResult = FromEntriesSequence.prototype.cacheResult = cacheResultThrough; function flipFactory(collection) { var flipSequence = makeSequence(collection); flipSequence._iter = collection; flipSequence.size = collection.size; flipSequence.flip = function () { return collection; }; flipSequence.reverse = function () { var reversedSequence = collection.reverse.apply(this); // super.reverse() reversedSequence.flip = function () { return collection.reverse(); }; return reversedSequence; }; flipSequence.has = function (key) { return collection.includes(key); }; flipSequence.includes = function (key) { return collection.has(key); }; flipSequence.cacheResult = cacheResultThrough; flipSequence.__iterateUncached = function (fn, reverse) { var this$1$1 = this; return collection.__iterate(function (v, k) { return fn(k, v, this$1$1) !== false; }, reverse); }; flipSequence.__iteratorUncached = function (type, reverse) { if (type === ITERATE_ENTRIES) { var iterator = collection.__iterator(type, reverse); return new Iterator(function () { var step = iterator.next(); if (!step.done) { var k = step.value[0]; step.value[0] = step.value[1]; step.value[1] = k; } return step; }); } return collection.__iterator( type === ITERATE_VALUES ? ITERATE_KEYS : ITERATE_VALUES, reverse ); }; return flipSequence; } function mapFactory(collection, mapper, context) { var mappedSequence = makeSequence(collection); mappedSequence.size = collection.size; mappedSequence.has = function (key) { return collection.has(key); }; mappedSequence.get = function (key, notSetValue) { var v = collection.get(key, NOT_SET); return v === NOT_SET ? notSetValue : mapper.call(context, v, key, collection); }; mappedSequence.__iterateUncached = function (fn, reverse) { var this$1$1 = this; return collection.__iterate( function (v, k, c) { return fn(mapper.call(context, v, k, c), k, this$1$1) !== false; }, reverse ); }; mappedSequence.__iteratorUncached = function (type, reverse) { var iterator = collection.__iterator(ITERATE_ENTRIES, reverse); return new Iterator(function () { var step = iterator.next(); if (step.done) { return step; } var entry = step.value; var key = entry[0]; return iteratorValue( type, key, mapper.call(context, entry[1], key, collection), step ); }); }; return mappedSequence; } function reverseFactory(collection, useKeys) { var this$1$1 = this; var reversedSequence = makeSequence(collection); reversedSequence._iter = collection; reversedSequence.size = collection.size; reversedSequence.reverse = function () { return collection; }; if (collection.flip) { reversedSequence.flip = function () { var flipSequence = flipFactory(collection); flipSequence.reverse = function () { return collection.flip(); }; return flipSequence; }; } reversedSequence.get = function (key, notSetValue) { return collection.get(useKeys ? key : -1 - key, notSetValue); }; reversedSequence.has = function (key) { return collection.has(useKeys ? key : -1 - key); }; reversedSequence.includes = function (value) { return collection.includes(value); }; reversedSequence.cacheResult = cacheResultThrough; reversedSequence.__iterate = function (fn, reverse) { var this$1$1 = this; var i = 0; reverse && ensureSize(collection); return collection.__iterate( function (v, k) { return fn(v, useKeys ? k : reverse ? this$1$1.size - ++i : i++, this$1$1); }, !reverse ); }; reversedSequence.__iterator = function (type, reverse) { var i = 0; reverse && ensureSize(collection); var iterator = collection.__iterator(ITERATE_ENTRIES, !reverse); return new Iterator(function () { var step = iterator.next(); if (step.done) { return step; } var entry = step.value; return iteratorValue( type, useKeys ? entry[0] : reverse ? this$1$1.size - ++i : i++, entry[1], step ); }); }; return reversedSequence; } function filterFactory(collection, predicate, context, useKeys) { var filterSequence = makeSequence(collection); if (useKeys) { filterSequence.has = function (key) { var v = collection.get(key, NOT_SET); return v !== NOT_SET && !!predicate.call(context, v, key, collection); }; filterSequence.get = function (key, notSetValue) { var v = collection.get(key, NOT_SET); return v !== NOT_SET && predicate.call(context, v, key, collection) ? v : notSetValue; }; } filterSequence.__iterateUncached = function (fn, reverse) { var this$1$1 = this; var iterations = 0; collection.__iterate(function (v, k, c) { if (predicate.call(context, v, k, c)) { iterations++; return fn(v, useKeys ? k : iterations - 1, this$1$1); } }, reverse); return iterations; }; filterSequence.__iteratorUncached = function (type, reverse) { var iterator = collection.__iterator(ITERATE_ENTRIES, reverse); var iterations = 0; return new Iterator(function () { while (true) { var step = iterator.next(); if (step.done) { return step; } var entry = step.value; var key = entry[0]; var value = entry[1]; if (predicate.call(context, value, key, collection)) { return iteratorValue(type, useKeys ? key : iterations++, value, step); } } }); }; return filterSequence; } function countByFactory(collection, grouper, context) { var groups = Map().asMutable(); collection.__iterate(function (v, k) { groups.update(grouper.call(context, v, k, collection), 0, function (a) { return a + 1; }); }); return groups.asImmutable(); } function groupByFactory(collection, grouper, context) { var isKeyedIter = isKeyed(collection); var groups = (isOrdered(collection) ? OrderedMap() : Map()).asMutable(); collection.__iterate(function (v, k) { groups.update( grouper.call(context, v, k, collection), function (a) { return ((a = a || []), a.push(isKeyedIter ? [k, v] : v), a); } ); }); var coerce = collectionClass(collection); return groups.map(function (arr) { return reify(collection, coerce(arr)); }).asImmutable(); } function sliceFactory(collection, begin, end, useKeys) { var originalSize = collection.size; if (wholeSlice(begin, end, originalSize)) { return collection; } var resolvedBegin = resolveBegin(begin, originalSize); var resolvedEnd = resolveEnd(end, originalSize); // begin or end will be NaN if they were provided as negative numbers and // this collection's size is unknown. In that case, cache first so there is // a known size and these do not resolve to NaN. if (resolvedBegin !== resolvedBegin || resolvedEnd !== resolvedEnd) { return sliceFactory(collection.toSeq().cacheResult(), begin, end, useKeys); } // Note: resolvedEnd is undefined when the original sequence's length is // unknown and this slice did not supply an end and should contain all // elements after resolvedBegin. // In that case, resolvedSize will be NaN and sliceSize will remain undefined. var resolvedSize = resolvedEnd - resolvedBegin; var sliceSize; if (resolvedSize === resolvedSize) { sliceSize = resolvedSize < 0 ? 0 : resolvedSize; } var sliceSeq = makeSequence(collection); // If collection.size is undefined, the size of the realized sliceSeq is // unknown at this point unless the number of items to slice is 0 sliceSeq.size = sliceSize === 0 ? sliceSize : (collection.size && sliceSize) || undefined; if (!useKeys && isSeq(collection) && sliceSize >= 0) { sliceSeq.get = function (index, notSetValue) { index = wrapIndex(this, index); return index >= 0 && index < sliceSize ? collection.get(index + resolvedBegin, notSetValue) : notSetValue; }; } sliceSeq.__iterateUncached = function (fn, reverse) { var this$1$1 = this; if (sliceSize === 0) { return 0; } if (reverse) { return this.cacheResult().__iterate(fn, reverse); } var skipped = 0; var isSkipping = true; var iterations = 0; collection.__iterate(function (v, k) { if (!(isSkipping && (isSkipping = skipped++ < resolvedBegin))) { iterations++; return ( fn(v, useKeys ? k : iterations - 1, this$1$1) !== false && iterations !== sliceSize ); } }); return iterations; }; sliceSeq.__iteratorUncached = function (type, reverse) { if (sliceSize !== 0 && reverse) { return this.cacheResult().__iterator(type, reverse); } // Don't bother instantiating parent iterator if taking 0. if (sliceSize === 0) { return new Iterator(iteratorDone); } var iterator = collection.__iterator(type, reverse); var skipped = 0; var iterations = 0; return new Iterator(function () { while (skipped++ < resolvedBegin) { iterator.next(); } if (++iterations > sliceSize) { return iteratorDone(); } var step = iterator.next(); if (useKeys || type === ITERATE_VALUES || step.done) { return step; } if (type === ITERATE_KEYS) { return iteratorValue(type, iterations - 1, undefined, step); } return iteratorValue(type, iterations - 1, step.value[1], step); }); }; return sliceSeq; } function takeWhileFactory(collection, predicate, context) { var takeSequence = makeSequence(collection); takeSequence.__iterateUncached = function (fn, reverse) { var this$1$1 = this; if (reverse) { return this.cacheResult().__iterate(fn, reverse); } var iterations = 0; collection.__iterate( function (v, k, c) { return predicate.call(context, v, k, c) && ++iterations && fn(v, k, this$1$1); } ); return iterations; }; takeSequence.__iteratorUncached = function (type, reverse) { var this$1$1 = this; if (reverse) { return this.cacheResult().__iterator(type, reverse); } var iterator = collection.__iterator(ITERATE_ENTRIES, reverse); var iterating = true; return new Iterator(function () { if (!iterating) { return iteratorDone(); } var step = iterator.next(); if (step.done) { return step; } var entry = step.value; var k = entry[0]; var v = entry[1]; if (!predicate.call(context, v, k, this$1$1)) { iterating = false; return iteratorDone(); } return type === ITERATE_ENTRIES ? step : iteratorValue(type, k, v, step); }); }; return takeSequence; } function skipWhileFactory(collection, predicate, context, useKeys) { var skipSequence = makeSequence(collection); skipSequence.__iterateUncached = function (fn, reverse) { var this$1$1 = this; if (reverse) { return this.cacheResult().__iterate(fn, reverse); } var isSkipping = true; var iterations = 0; collection.__iterate(function (v, k, c) { if (!(isSkipping && (isSkipping = predicate.call(context, v, k, c)))) { iterations++; return fn(v, useKeys ? k : iterations - 1, this$1$1); } }); return iterations; }; skipSequence.__iteratorUncached = function (type, reverse) { var this$1$1 = this; if (reverse) { return this.cacheResult().__iterator(type, reverse); } var iterator = collection.__iterator(ITERATE_ENTRIES, reverse); var skipping = true; var iterations = 0; return new Iterator(function () { var step; var k; var v; do { step = iterator.next(); if (step.done) { if (useKeys || type === ITERATE_VALUES) { return step; } if (type === ITERATE_KEYS) { return iteratorValue(type, iterations++, undefined, step); } return iteratorValue(type, iterations++, step.value[1], step); } var entry = step.value; k = entry[0]; v = entry[1]; skipping && (skipping = predicate.call(context, v, k, this$1$1)); } while (skipping); return type === ITERATE_ENTRIES ? step : iteratorValue(type, k, v, step); }); }; return skipSequence; } function concatFactory(collection, values) { var isKeyedCollection = isKeyed(collection); var iters = [collection] .concat(values) .map(function (v) { if (!isCollection(v)) { v = isKeyedCollection ? keyedSeqFromValue(v) : indexedSeqFromValue(Array.isArray(v) ? v : [v]); } else if (isKeyedCollection) { v = KeyedCollection(v); } return v; }) .filter(function (v) { return v.size !== 0; }); if (iters.length === 0) { return collection; } if (iters.length === 1) { var singleton = iters[0]; if ( singleton === collection || (isKeyedCollection && isKeyed(singleton)) || (isIndexed(collection) && isIndexed(singleton)) ) { return singleton; } } var concatSeq = new ArraySeq(iters); if (isKeyedCollection) { concatSeq = concatSeq.toKeyedSeq(); } else if (!isIndexed(collection)) { concatSeq = concatSeq.toSetSeq(); } concatSeq = concatSeq.flatten(true); concatSeq.size = iters.reduce(function (sum, seq) { if (sum !== undefined) { var size = seq.size; if (size !== undefined) { return sum + size; } } }, 0); return concatSeq; } function flattenFactory(collection, depth, useKeys) { var flatSequence = makeSequence(collection); flatSequence.__iterateUncached = function (fn, reverse) { if (reverse) { return this.cacheResult().__iterate(fn, reverse); } var iterations = 0; var stopped = false; function flatDeep(iter, currentDepth) { iter.__iterate(function (v, k) { if ((!depth || currentDepth < depth) && isCollection(v)) { flatDeep(v, currentDepth + 1); } else { iterations++; if (fn(v, useKeys ? k : iterations - 1, flatSequence) === false) { stopped = true; } } return !stopped; }, reverse); } flatDeep(collection, 0); return iterations; }; flatSequence.__iteratorUncached = function (type, reverse) { if (reverse) { return this.cacheResult().__iterator(type, reverse); } var iterator = collection.__iterator(type, reverse); var stack = []; var iterations = 0; return new Iterator(function () { while (iterator) { var step = iterator.next(); if (step.done !== false) { iterator = stack.pop(); continue; } var v = step.value; if (type === ITERATE_ENTRIES) { v = v[1]; } if ((!depth || stack.length < depth) && isCollection(v)) { stack.push(iterator); iterator = v.__iterator(type, reverse); } else { return useKeys ? step : iteratorValue(type, iterations++, v, step); } } return iteratorDone(); }); }; return flatSequence; } function flatMapFactory(collection, mapper, context) { var coerce = collectionClass(collection); return collection .toSeq() .map(function (v, k) { return coerce(mapper.call(context, v, k, collection)); }) .flatten(true); } function interposeFactory(collection, separator) { var interposedSequence = makeSequence(collection); interposedSequence.size = collection.size && collection.size * 2 - 1; interposedSequence.__iterateUncached = function (fn, reverse) { var this$1$1 = this; var iterations = 0; collection.__iterate( function (v) { return (!iterations || fn(separator, iterations++, this$1$1) !== false) && fn(v, iterations++, this$1$1) !== false; }, reverse ); return iterations; }; interposedSequence.__iteratorUncached = function (type, reverse) { var iterator = collection.__iterator(ITERATE_VALUES, reverse); var iterations = 0; var step; return new Iterator(function () { if (!step || iterations % 2) { step = iterator.next(); if (step.done) { return step; } } return iterations % 2 ? iteratorValue(type, iterations++, separator) : iteratorValue(type, iterations++, step.value, step); }); }; return interposedSequence; } function sortFactory(collection, comparator, mapper) { if (!comparator) { comparator = defaultComparator; } var isKeyedCollection = isKeyed(collection); var index = 0; var entries = collection .toSeq() .map(function (v, k) { return [k, v, index++, mapper ? mapper(v, k, collection) : v]; }) .valueSeq() .toArray(); entries .sort(function (a, b) { return comparator(a[3], b[3]) || a[2] - b[2]; }) .forEach( isKeyedCollection ? function (v, i) { entries[i].length = 2; } : function (v, i) { entries[i] = v[1]; } ); return isKeyedCollection ? KeyedSeq(entries) : isIndexed(collection) ? IndexedSeq(entries) : SetSeq(entries); } function maxFactory(collection, comparator, mapper) { if (!comparator) { comparator = defaultComparator; } if (mapper) { var entry = collection .toSeq() .map(function (v, k) { return [v, mapper(v, k, collection)]; }) .reduce(function (a, b) { return (maxCompare(comparator, a[1], b[1]) ? b : a); }); return entry && entry[0]; } return collection.reduce(function (a, b) { return (maxCompare(comparator, a, b) ? b : a); }); } function maxCompare(comparator, a, b) { var comp = comparator(b, a); // b is considered the new max if the comparator declares them equal, but // they are not equal and b is in fact a nullish value. return ( (comp === 0 && b !== a && (b === undefined || b === null || b !== b)) || comp > 0 ); } function zipWithFactory(keyIter, zipper, iters, zipAll) { var zipSequence = makeSequence(keyIter); var sizes = new ArraySeq(iters).map(function (i) { return i.size; }); zipSequence.size = zipAll ? sizes.max() : sizes.min(); // Note: this a generic base implementation of __iterate in terms of // __iterator which may be more generically useful in the future. zipSequence.__iterate = function (fn, reverse) { /* generic: var iterator = this.__iterator(ITERATE_ENTRIES, reverse); var step; var iterations = 0; while (!(step = iterator.next()).done) { iterations++; if (fn(step.value[1], step.value[0], this) === false) { break; } } return iterations; */ // indexed: var iterator = this.__iterator(ITERATE_VALUES, reverse); var step; var iterations = 0; while (!(step = iterator.next()).done) { if (fn(step.value, iterations++, this) === false) { break; } } return iterations; }; zipSequence.__iteratorUncached = function (type, reverse) { var iterators = iters.map( function (i) { return ((i = Collection(i)), getIterator(reverse ? i.reverse() : i)); } ); var iterations = 0; var isDone = false; return new Iterator(function () { var steps; if (!isDone) { steps = iterators.map(function (i) { return i.next(); }); isDone = zipAll ? steps.every(function (s) { return s.done; }) : steps.some(function (s) { return s.done; }); } if (isDone) { return iteratorDone(); } return iteratorValue( type, iterations++, zipper.apply( null, steps.map(function (s) { return s.value; }) ) ); }); }; return zipSequence; } // #pragma Helper Functions function reify(iter, seq) { return iter === seq ? iter : isSeq(iter) ? seq : iter.constructor(seq); } function validateEntry(entry) { if (entry !== Object(entry)) { throw new TypeError('Expected [K, V] tuple: ' + entry); } } function collectionClass(collection) { return isKeyed(collection) ? KeyedCollection : isIndexed(collection) ? IndexedCollection : SetCollection; } function makeSequence(collection) { return Object.create( (isKeyed(collection) ? KeyedSeq : isIndexed(collection) ? IndexedSeq : SetSeq ).prototype ); } function cacheResultThrough() { if (this._iter.cacheResult) { this._iter.cacheResult(); this.size = this._iter.size; return this; } return Seq.prototype.cacheResult.call(this); } function defaultComparator(a, b) { if (a === undefined && b === undefined) { return 0; } if (a === undefined) { return 1; } if (b === undefined) { return -1; } return a > b ? 1 : a < b ? -1 : 0; } function arrCopy(arr, offset) { offset = offset || 0; var len = Math.max(0, arr.length - offset); var newArr = new Array(len); for (var ii = 0; ii < len; ii++) { newArr[ii] = arr[ii + offset]; } return newArr; } function invariant(condition, error) { if (!condition) { throw new Error(error); } } function assertNotInfinite(size) { invariant( size !== Infinity, 'Cannot perform this action with an infinite size.' ); } function coerceKeyPath(keyPath) { if (isArrayLike(keyPath) && typeof keyPath !== 'string') { return keyPath; } if (isOrdered(keyPath)) { return keyPath.toArray(); } throw new TypeError( 'Invalid keyPath: expected Ordered Collection or Array: ' + keyPath ); } var toString = Object.prototype.toString; function isPlainObject(value) { // The base prototype's toString deals with Argument objects and native namespaces like Math if ( !value || typeof value !== 'object' || toString.call(value) !== '[object Object]' ) { return false; } var proto = Object.getPrototypeOf(value); if (proto === null) { return true; } // Iteratively going up the prototype chain is needed for cross-realm environments (differing contexts, iframes, etc) var parentProto = proto; var nextProto = Object.getPrototypeOf(proto); while (nextProto !== null) { parentProto = nextProto; nextProto = Object.getPrototypeOf(parentProto); } return parentProto === proto; } /** * Returns true if the value is a potentially-persistent data structure, either * provided by Immutable.js or a plain Array or Object. */ function isDataStructure(value) { return ( typeof value === 'object' && (isImmutable(value) || Array.isArray(value) || isPlainObject(value)) ); } function quoteString(value) { try { return typeof value === 'string' ? JSON.stringify(value) : String(value); } catch (_ignoreError) { return JSON.stringify(value); } } function has(collection, key) { return isImmutable(collection) ? collection.has(key) : isDataStructure(collection) && hasOwnProperty.call(collection, key); } function get(collection, key, notSetValue) { return isImmutable(collection) ? collection.get(key, notSetValue) : !has(collection, key) ? notSetValue : typeof collection.get === 'function' ? collection.get(key) : collection[key]; } function shallowCopy(from) { if (Array.isArray(from)) { return arrCopy(from); } var to = {}; for (var key in from) { if (hasOwnProperty.call(from, key)) { to[key] = from[key]; } } return to; } function remove(collection, key) { if (!isDataStructure(collection)) { throw new TypeError( 'Cannot update non-data-structure value: ' + collection ); } if (isImmutable(collection)) { if (!collection.remove) { throw new TypeError( 'Cannot update immutable value without .remove() method: ' + collection ); } return collection.remove(key); } if (!hasOwnProperty.call(collection, key)) { return collection; } var collectionCopy = shallowCopy(collection); if (Array.isArray(collectionCopy)) { collectionCopy.splice(key, 1); } else { delete collectionCopy[key]; } return collectionCopy; } function set(collection, key, value) { if (!isDataStructure(collection)) { throw new TypeError( 'Cannot update non-data-structure value: ' + collection ); } if (isImmutable(collection)) { if (!collection.set) { throw new TypeError( 'Cannot update immutable value without .set() method: ' + collection ); } return collection.set(key, value); } if (hasOwnProperty.call(collection, key) && value === collection[key]) { return collection; } var collectionCopy = shallowCopy(collection); collectionCopy[key] = value; return collectionCopy; } function updateIn$1(collection, keyPath, notSetValue, updater) { if (!updater) { updater = notSetValue; notSetValue = undefined; } var updatedValue = updateInDeeply( isImmutable(collection), collection, coerceKeyPath(keyPath), 0, notSetValue, updater ); return updatedValue === NOT_SET ? notSetValue : updatedValue; } function updateInDeeply( inImmutable, existing, keyPath, i, notSetValue, updater ) { var wasNotSet = existing === NOT_SET; if (i === keyPath.length) { var existingValue = wasNotSet ? notSetValue : existing; var newValue = updater(existingValue); return newValue === existingValue ? existing : newValue; } if (!wasNotSet && !isDataStructure(existing)) { throw new TypeError( 'Cannot update within non-data-structure value in path [' + keyPath.slice(0, i).map(quoteString) + ']: ' + existing ); } var key = keyPath[i]; var nextExisting = wasNotSet ? NOT_SET : get(existing, key, NOT_SET); var nextUpdated = updateInDeeply( nextExisting === NOT_SET ? inImmutable : isImmutable(nextExisting), nextExisting, keyPath, i + 1, notSetValue, updater ); return nextUpdated === nextExisting ? existing : nextUpdated === NOT_SET ? remove(existing, key) : set( wasNotSet ? (inImmutable ? emptyMap() : {}) : existing, key, nextUpdated ); } function setIn$1(collection, keyPath, value) { return updateIn$1(collection, keyPath, NOT_SET, function () { return value; }); } function setIn(keyPath, v) { return setIn$1(this, keyPath, v); } function removeIn(collection, keyPath) { return updateIn$1(collection, keyPath, function () { return NOT_SET; }); } function deleteIn(keyPath) { return removeIn(this, keyPath); } function update$1(collection, key, notSetValue, updater) { return updateIn$1(collection, [key], notSetValue, updater); } function update(key, notSetValue, updater) { return arguments.length === 1 ? key(this) : update$1(this, key, notSetValue, updater); } function updateIn(keyPath, notSetValue, updater) { return updateIn$1(this, keyPath, notSetValue, updater); } function merge$1() { var iters = [], len = arguments.length; while ( len-- ) iters[ len ] = arguments[ len ]; return mergeIntoKeyedWith(this, iters); } function mergeWith$1(merger) { var iters = [], len = arguments.length - 1; while ( len-- > 0 ) iters[ len ] = arguments[ len + 1 ]; if (typeof merger !== 'function') { throw new TypeError('Invalid merger function: ' + merger); } return mergeIntoKeyedWith(this, iters, merger); } function mergeIntoKeyedWith(collection, collections, merger) { var iters = []; for (var ii = 0; ii < collections.length; ii++) { var collection$1 = KeyedCollection(collections[ii]); if (collection$1.size !== 0) { iters.push(collection$1); } } if (iters.length === 0) { return collection; } if ( collection.toSeq().size === 0 && !collection.__ownerID && iters.length === 1 ) { return collection.constructor(iters[0]); } return collection.withMutations(function (collection) { var mergeIntoCollection = merger ? function (value, key) { update$1(collection, key, NOT_SET, function (oldVal) { return oldVal === NOT_SET ? value : merger(oldVal, value, key); } ); } : function (value, key) { collection.set(key, value); }; for (var ii = 0; ii < iters.length; ii++) { iters[ii].forEach(mergeIntoCollection); } }); } function merge(collection) { var sources = [], len = arguments.length - 1; while ( len-- > 0 ) sources[ len ] = arguments[ len + 1 ]; return mergeWithSources(collection, sources); } function mergeWith(merger, collection) { var sources = [], len = arguments.length - 2; while ( len-- > 0 ) sources[ len ] = arguments[ len + 2 ]; return mergeWithSources(collection, sources, merger); } function mergeDeep$1(collection) { var sources = [], len = arguments.length - 1; while ( len-- > 0 ) sources[ len ] = arguments[ len + 1 ]; return mergeDeepWithSources(collection, sources); } function mergeDeepWith$1(merger, collection) { var sources = [], len = arguments.length - 2; while ( len-- > 0 ) sources[ len ] = arguments[ len + 2 ]; return mergeDeepWithSources(collection, sources, merger); } function mergeDeepWithSources(collection, sources, merger) { return mergeWithSources(collection, sources, deepMergerWith(merger)); } function mergeWithSources(collection, sources, merger) { if (!isDataStructure(collection)) { throw new TypeError( 'Cannot merge into non-data-structure value: ' + collection ); } if (isImmutable(collection)) { return typeof merger === 'function' && collection.mergeWith ? collection.mergeWith.apply(collection, [ merger ].concat( sources )) : collection.merge ? collection.merge.apply(collection, sources) : collection.concat.apply(collection, sources); } var isArray = Array.isArray(collection); var merged = collection; var Collection = isArray ? IndexedCollection : KeyedCollection; var mergeItem = isArray ? function (value) { // Copy on write if (merged === collection) { merged = shallowCopy(merged); } merged.push(value); } : function (value, key) { var hasVal = hasOwnProperty.call(merged, key); var nextVal = hasVal && merger ? merger(merged[key], value, key) : value; if (!hasVal || nextVal !== merged[key]) { // Copy on write if (merged === collection) { merged = shallowCopy(merged); } merged[key] = nextVal; } }; for (var i = 0; i < sources.length; i++) { Collection(sources[i]).forEach(mergeItem); } return merged; } function deepMergerWith(merger) { function deepMerger(oldValue, newValue, key) { return isDataStructure(oldValue) && isDataStructure(newValue) && areMergeable(oldValue, newValue) ? mergeWithSources(oldValue, [newValue], deepMerger) : merger ? merger(oldValue, newValue, key) : newValue; } return deepMerger; } /** * It's unclear what the desired behavior is for merging two collections that * fall into separate categories between keyed, indexed, or set-like, so we only * consider them mergeable if they fall into the same category. */ function areMergeable(oldDataStructure, newDataStructure) { var oldSeq = Seq(oldDataStructure); var newSeq = Seq(newDataStructure); // This logic assumes that a sequence can only fall into one of the three // categories mentioned above (since there's no `isSetLike()` method). return ( isIndexed(oldSeq) === isIndexed(newSeq) && isKeyed(oldSeq) === isKeyed(newSeq) ); } function mergeDeep() { var iters = [], len = arguments.length; while ( len-- ) iters[ len ] = arguments[ len ]; return mergeDeepWithSources(this, iters); } function mergeDeepWith(merger) { var iters = [], len = arguments.length - 1; while ( len-- > 0 ) iters[ len ] = arguments[ len + 1 ]; return mergeDeepWithSources(this, iters, merger); } function mergeIn(keyPath) { var iters = [], len = arguments.length - 1; while ( len-- > 0 ) iters[ len ] = arguments[ len + 1 ]; return updateIn$1(this, keyPath, emptyMap(), function (m) { return mergeWithSources(m, iters); }); } function mergeDeepIn(keyPath) { var iters = [], len = arguments.length - 1; while ( len-- > 0 ) iters[ len ] = arguments[ len + 1 ]; return updateIn$1(this, keyPath, emptyMap(), function (m) { return mergeDeepWithSources(m, iters); } ); } function withMutations(fn) { var mutable = this.asMutable(); fn(mutable); return mutable.wasAltered() ? mutable.__ensureOwner(this.__ownerID) : this; } function asMutable() { return this.__ownerID ? this : this.__ensureOwner(new OwnerID()); } function asImmutable() { return this.__ensureOwner(); } function wasAltered() { return this.__altered; } var Map = /*@__PURE__*/(function (KeyedCollection) { function Map(value) { return value === undefined || value === null ? emptyMap() : isMap(value) && !isOrdered(value) ? value : emptyMap().withMutations(function (map) { var iter = KeyedCollection(value); assertNotInfinite(iter.size); iter.forEach(function (v, k) { return map.set(k, v); }); }); } if ( KeyedCollection ) Map.__proto__ = KeyedCollection; Map.prototype = Object.create( KeyedCollection && KeyedCollection.prototype ); Map.prototype.constructor = Map; Map.of = function of () { var keyValues = [], len = arguments.length; while ( len-- ) keyValues[ len ] = arguments[ len ]; return emptyMap().withMutations(function (map) { for (var i = 0; i < keyValues.length; i += 2) { if (i + 1 >= keyValues.length) { throw new Error('Missing value for key: ' + keyValues[i]); } map.set(keyValues[i], keyValues[i + 1]); } }); }; Map.prototype.toString = function toString () { return this.__toString('Map {', '}'); }; // @pragma Access Map.prototype.get = function get (k, notSetValue) { return this._root ? this._root.get(0, undefined, k, notSetValue) : notSetValue; }; // @pragma Modification Map.prototype.set = function set (k, v) { return updateMap(this, k, v); }; Map.prototype.remove = function remove (k) { return updateMap(this, k, NOT_SET); }; Map.prototype.deleteAll = function deleteAll (keys) { var collection = Collection(keys); if (collection.size === 0) { return this; } return this.withMutations(function (map) { collection.forEach(function (key) { return map.remove(key); }); }); }; Map.prototype.clear = function clear () { if (this.size === 0) { return this; } if (this.__ownerID) { this.size = 0; this._root = null; this.__hash = undefined; this.__altered = true; return this; } return emptyMap(); }; // @pragma Composition Map.prototype.sort = function sort (comparator) { // Late binding return OrderedMap(sortFactory(this, comparator)); }; Map.prototype.sortBy = function sortBy (mapper, comparator) { // Late binding return OrderedMap(sortFactory(this, comparator, mapper)); }; Map.prototype.map = function map (mapper, context) { var this$1$1 = this; return this.withMutations(function (map) { map.forEach(function (value, key) { map.set(key, mapper.call(context, value, key, this$1$1)); }); }); }; // @pragma Mutability Map.prototype.__iterator = function __iterator (type, reverse) { return new MapIterator(this, type, reverse); }; Map.prototype.__iterate = function __iterate (fn, reverse) { var this$1$1 = this; var iterations = 0; this._root && this._root.iterate(function (entry) { iterations++; return fn(entry[1], entry[0], this$1$1); }, reverse); return iterations; }; Map.prototype.__ensureOwner = function __ensureOwner (ownerID) { if (ownerID === this.__ownerID) { return this; } if (!ownerID) { if (this.size === 0) { return emptyMap(); } this.__ownerID = ownerID; this.__altered = false; return this; } return makeMap(this.size, this._root, ownerID, this.__hash); }; return Map; }(KeyedCollection)); Map.isMap = isMap; var MapPrototype = Map.prototype; MapPrototype[IS_MAP_SYMBOL] = true; MapPrototype[DELETE] = MapPrototype.remove; MapPrototype.removeAll = MapPrototype.deleteAll; MapPrototype.setIn = setIn; MapPrototype.removeIn = MapPrototype.deleteIn = deleteIn; MapPrototype.update = update; MapPrototype.updateIn = updateIn; MapPrototype.merge = MapPrototype.concat = merge$1; MapPrototype.mergeWith = mergeWith$1; MapPrototype.mergeDeep = mergeDeep; MapPrototype.mergeDeepWith = mergeDeepWith; MapPrototype.mergeIn = mergeIn; MapPrototype.mergeDeepIn = mergeDeepIn; MapPrototype.withMutations = withMutations; MapPrototype.wasAltered = wasAltered; MapPrototype.asImmutable = asImmutable; MapPrototype['@@transducer/init'] = MapPrototype.asMutable = asMutable; MapPrototype['@@transducer/step'] = function (result, arr) { return result.set(arr[0], arr[1]); }; MapPrototype['@@transducer/result'] = function (obj) { return obj.asImmutable(); }; // #pragma Trie Nodes var ArrayMapNode = function ArrayMapNode(ownerID, entries) { this.ownerID = ownerID; this.entries = entries; }; ArrayMapNode.prototype.get = function get (shift, keyHash, key, notSetValue) { var entries = this.entries; for (var ii = 0, len = entries.length; ii < len; ii++) { if (is(key, entries[ii][0])) { return entries[ii][1]; } } return notSetValue; }; ArrayMapNode.prototype.update = function update (ownerID, shift, keyHash, key, value, didChangeSize, didAlter) { var removed = value === NOT_SET; var entries = this.entries; var idx = 0; var len = entries.length; for (; idx < len; idx++) { if (is(key, entries[idx][0])) { break; } } var exists = idx < len; if (exists ? entries[idx][1] === value : removed) { return this; } SetRef(didAlter); (removed || !exists) && SetRef(didChangeSize); if (removed && entries.length === 1) { return; // undefined } if (!exists && !removed && entries.length >= MAX_ARRAY_MAP_SIZE) { return createNodes(ownerID, entries, key, value); } var isEditable = ownerID && ownerID === this.ownerID; var newEntries = isEditable ? entries : arrCopy(entries); if (exists) { if (removed) { idx === len - 1 ? newEntries.pop() : (newEntries[idx] = newEntries.pop()); } else { newEntries[idx] = [key, value]; } } else { newEntries.push([key, value]); } if (isEditable) { this.entries = newEntries; return this; } return new ArrayMapNode(ownerID, newEntries); }; var BitmapIndexedNode = function BitmapIndexedNode(ownerID, bitmap, nodes) { this.ownerID = ownerID; this.bitmap = bitmap; this.nodes = nodes; }; BitmapIndexedNode.prototype.get = function get (shift, keyHash, key, notSetValue) { if (keyHash === undefined) { keyHash = hash(key); } var bit = 1 << ((shift === 0 ? keyHash : keyHash >>> shift) & MASK); var bitmap = this.bitmap; return (bitmap & bit) === 0 ? notSetValue : this.nodes[popCount(bitmap & (bit - 1))].get( shift + SHIFT, keyHash, key, notSetValue ); }; BitmapIndexedNode.prototype.update = function update (ownerID, shift, keyHash, key, value, didChangeSize, didAlter) { if (keyHash === undefined) { keyHash = hash(key); } var keyHashFrag = (shift === 0 ? keyHash : keyHash >>> shift) & MASK; var bit = 1 << keyHashFrag; var bitmap = this.bitmap; var exists = (bitmap & bit) !== 0; if (!exists && value === NOT_SET) { return this; } var idx = popCount(bitmap & (bit - 1)); var nodes = this.nodes; var node = exists ? nodes[idx] : undefined; var newNode = updateNode( node, ownerID, shift + SHIFT, keyHash, key, value, didChangeSize, didAlter ); if (newNode === node) { return this; } if (!exists && newNode && nodes.length >= MAX_BITMAP_INDEXED_SIZE) { return expandNodes(ownerID, nodes, bitmap, keyHashFrag, newNode); } if ( exists && !newNode && nodes.length === 2 && isLeafNode(nodes[idx ^ 1]) ) { return nodes[idx ^ 1]; } if (exists && newNode && nodes.length === 1 && isLeafNode(newNode)) { return newNode; } var isEditable = ownerID && ownerID === this.ownerID; var newBitmap = exists ? (newNode ? bitmap : bitmap ^ bit) : bitmap | bit; var newNodes = exists ? newNode ? setAt(nodes, idx, newNode, isEditable) : spliceOut(nodes, idx, isEditable) : spliceIn(nodes, idx, newNode, isEditable); if (isEditable) { this.bitmap = newBitmap; this.nodes = newNodes; return this; } return new BitmapIndexedNode(ownerID, newBitmap, newNodes); }; var HashArrayMapNode = function HashArrayMapNode(ownerID, count, nodes) { this.ownerID = ownerID; this.count = count; this.nodes = nodes; }; HashArrayMapNode.prototype.get = function get (shift, keyHash, key, notSetValue) { if (keyHash === undefined) { keyHash = hash(key); } var idx = (shift === 0 ? keyHash : keyHash >>> shift) & MASK; var node = this.nodes[idx]; return node ? node.get(shift + SHIFT, keyHash, key, notSetValue) : notSetValue; }; HashArrayMapNode.prototype.update = function update (ownerID, shift, keyHash, key, value, didChangeSize, didAlter) { if (keyHash === undefined) { keyHash = hash(key); } var idx = (shift === 0 ? keyHash : keyHash >>> shift) & MASK; var removed = value === NOT_SET; var nodes = this.nodes; var node = nodes[idx]; if (removed && !node) { return this; } var newNode = updateNode( node, ownerID, shift + SHIFT, keyHash, key, value, didChangeSize, didAlter ); if (newNode === node) { return this; } var newCount = this.count; if (!node) { newCount++; } else if (!newNode) { newCount--; if (newCount < MIN_HASH_ARRAY_MAP_SIZE) { return packNodes(ownerID, nodes, newCount, idx); } } var isEditable = ownerID && ownerID === this.ownerID; var newNodes = setAt(nodes, idx, newNode, isEditable); if (isEditable) { this.count = newCount; this.nodes = newNodes; return this; } return new HashArrayMapNode(ownerID, newCount, newNodes); }; var HashCollisionNode = function HashCollisionNode(ownerID, keyHash, entries) { this.ownerID = ownerID; this.keyHash = keyHash; this.entries = entries; }; HashCollisionNode.prototype.get = function get (shift, keyHash, key, notSetValue) { var entries = this.entries; for (var ii = 0, len = entries.length; ii < len; ii++) { if (is(key, entries[ii][0])) { return entries[ii][1]; } } return notSetValue; }; HashCollisionNode.prototype.update = function update (ownerID, shift, keyHash, key, value, didChangeSize, didAlter) { if (keyHash === undefined) { keyHash = hash(key); } var removed = value === NOT_SET; if (keyHash !== this.keyHash) { if (removed) { return this; } SetRef(didAlter); SetRef(didChangeSize); return mergeIntoNode(this, ownerID, shift, keyHash, [key, value]); } var entries = this.entries; var idx = 0; var len = entries.length; for (; idx < len; idx++) { if (is(key, entries[idx][0])) { break; } } var exists = idx < len; if (exists ? entries[idx][1] === value : removed) { return this; } SetRef(didAlter); (removed || !exists) && SetRef(didChangeSize); if (removed && len === 2) { return new ValueNode(ownerID, this.keyHash, entries[idx ^ 1]); } var isEditable = ownerID && ownerID === this.ownerID; var newEntries = isEditable ? entries : arrCopy(entries); if (exists) { if (removed) { idx === len - 1 ? newEntries.pop() : (newEntries[idx] = newEntries.pop()); } else { newEntries[idx] = [key, value]; } } else { newEntries.push([key, value]); } if (isEditable) { this.entries = newEntries; return this; } return new HashCollisionNode(ownerID, this.keyHash, newEntries); }; var ValueNode = function ValueNode(ownerID, keyHash, entry) { this.ownerID = ownerID; this.keyHash = keyHash; this.entry = entry; }; ValueNode.prototype.get = function get (shift, keyHash, key, notSetValue) { return is(key, this.entry[0]) ? this.entry[1] : notSetValue; }; ValueNode.prototype.update = function update (ownerID, shift, keyHash, key, value, didChangeSize, didAlter) { var removed = value === NOT_SET; var keyMatch = is(key, this.entry[0]); if (keyMatch ? value === this.entry[1] : removed) { return this; } SetRef(didAlter); if (removed) { SetRef(didChangeSize); return; // undefined } if (keyMatch) { if (ownerID && ownerID === this.ownerID) { this.entry[1] = value; return this; } return new ValueNode(ownerID, this.keyHash, [key, value]); } SetRef(didChangeSize); return mergeIntoNode(this, ownerID, shift, hash(key), [key, value]); }; // #pragma Iterators ArrayMapNode.prototype.iterate = HashCollisionNode.prototype.iterate = function (fn, reverse) { var entries = this.entries; for (var ii = 0, maxIndex = entries.length - 1; ii <= maxIndex; ii++) { if (fn(entries[reverse ? maxIndex - ii : ii]) === false) { return false; } } }; BitmapIndexedNode.prototype.iterate = HashArrayMapNode.prototype.iterate = function (fn, reverse) { var nodes = this.nodes; for (var ii = 0, maxIndex = nodes.length - 1; ii <= maxIndex; ii++) { var node = nodes[reverse ? maxIndex - ii : ii]; if (node && node.iterate(fn, reverse) === false) { return false; } } }; // eslint-disable-next-line no-unused-vars ValueNode.prototype.iterate = function (fn, reverse) { return fn(this.entry); }; var MapIterator = /*@__PURE__*/(function (Iterator) { function MapIterator(map, type, reverse) { this._type = type; this._reverse = reverse; this._stack = map._root && mapIteratorFrame(map._root); } if ( Iterator ) MapIterator.__proto__ = Iterator; MapIterator.prototype = Object.create( Iterator && Iterator.prototype ); MapIterator.prototype.constructor = MapIterator; MapIterator.prototype.next = function next () { var type = this._type; var stack = this._stack; while (stack) { var node = stack.node; var index = stack.index++; var maxIndex = (void 0); if (node.entry) { if (index === 0) { return mapIteratorValue(type, node.entry); } } else if (node.entries) { maxIndex = node.entries.length - 1; if (index <= maxIndex) { return mapIteratorValue( type, node.entries[this._reverse ? maxIndex - index : index] ); } } else { maxIndex = node.nodes.length - 1; if (index <= maxIndex) { var subNode = node.nodes[this._reverse ? maxIndex - index : index]; if (subNode) { if (subNode.entry) { return mapIteratorValue(type, subNode.entry); } stack = this._stack = mapIteratorFrame(subNode, stack); } continue; } } stack = this._stack = this._stack.__prev; } return iteratorDone(); }; return MapIterator; }(Iterator)); function mapIteratorValue(type, entry) { return iteratorValue(type, entry[0], entry[1]); } function mapIteratorFrame(node, prev) { return { node: node, index: 0, __prev: prev, }; } function makeMap(size, root, ownerID, hash) { var map = Object.create(MapPrototype); map.size = size; map._root = root; map.__ownerID = ownerID; map.__hash = hash; map.__altered = false; return map; } var EMPTY_MAP; function emptyMap() { return EMPTY_MAP || (EMPTY_MAP = makeMap(0)); } function updateMap(map, k, v) { var newRoot; var newSize; if (!map._root) { if (v === NOT_SET) { return map; } newSize = 1; newRoot = new ArrayMapNode(map.__ownerID, [[k, v]]); } else { var didChangeSize = MakeRef(); var didAlter = MakeRef(); newRoot = updateNode( map._root, map.__ownerID, 0, undefined, k, v, didChangeSize, didAlter ); if (!didAlter.value) { return map; } newSize = map.size + (didChangeSize.value ? (v === NOT_SET ? -1 : 1) : 0); } if (map.__ownerID) { map.size = newSize; map._root = newRoot; map.__hash = undefined; map.__altered = true; return map; } return newRoot ? makeMap(newSize, newRoot) : emptyMap(); } function updateNode( node, ownerID, shift, keyHash, key, value, didChangeSize, didAlter ) { if (!node) { if (value === NOT_SET) { return node; } SetRef(didAlter); SetRef(didChangeSize); return new ValueNode(ownerID, keyHash, [key, value]); } return node.update( ownerID, shift, keyHash, key, value, didChangeSize, didAlter ); } function isLeafNode(node) { return ( node.constructor === ValueNode || node.constructor === HashCollisionNode ); } function mergeIntoNode(node, ownerID, shift, keyHash, entry) { if (node.keyHash === keyHash) { return new HashCollisionNode(ownerID, keyHash, [node.entry, entry]); } var idx1 = (shift === 0 ? node.keyHash : node.keyHash >>> shift) & MASK; var idx2 = (shift === 0 ? keyHash : keyHash >>> shift) & MASK; var newNode; var nodes = idx1 === idx2 ? [mergeIntoNode(node, ownerID, shift + SHIFT, keyHash, entry)] : ((newNode = new ValueNode(ownerID, keyHash, entry)), idx1 < idx2 ? [node, newNode] : [newNode, node]); return new BitmapIndexedNode(ownerID, (1 << idx1) | (1 << idx2), nodes); } function createNodes(ownerID, entries, key, value) { if (!ownerID) { ownerID = new OwnerID(); } var node = new ValueNode(ownerID, hash(key), [key, value]); for (var ii = 0; ii < entries.length; ii++) { var entry = entries[ii]; node = node.update(ownerID, 0, undefined, entry[0], entry[1]); } return node; } function packNodes(ownerID, nodes, count, excluding) { var bitmap = 0; var packedII = 0; var packedNodes = new Array(count); for (var ii = 0, bit = 1, len = nodes.length; ii < len; ii++, bit <<= 1) { var node = nodes[ii]; if (node !== undefined && ii !== excluding) { bitmap |= bit; packedNodes[packedII++] = node; } } return new BitmapIndexedNode(ownerID, bitmap, packedNodes); } function expandNodes(ownerID, nodes, bitmap, including, node) { var count = 0; var expandedNodes = new Array(SIZE); for (var ii = 0; bitmap !== 0; ii++, bitmap >>>= 1) { expandedNodes[ii] = bitmap & 1 ? nodes[count++] : undefined; } expandedNodes[including] = node; return new HashArrayMapNode(ownerID, count + 1, expandedNodes); } function popCount(x) { x -= (x >> 1) & 0x55555555; x = (x & 0x33333333) + ((x >> 2) & 0x33333333); x = (x + (x >> 4)) & 0x0f0f0f0f; x += x >> 8; x += x >> 16; return x & 0x7f; } function setAt(array, idx, val, canEdit) { var newArray = canEdit ? array : arrCopy(array); newArray[idx] = val; return newArray; } function spliceIn(array, idx, val, canEdit) { var newLen = array.length + 1; if (canEdit && idx + 1 === newLen) { array[idx] = val; return array; } var newArray = new Array(newLen); var after = 0; for (var ii = 0; ii < newLen; ii++) { if (ii === idx) { newArray[ii] = val; after = -1; } else { newArray[ii] = array[ii + after]; } } return newArray; } function spliceOut(array, idx, canEdit) { var newLen = array.length - 1; if (canEdit && idx === newLen) { array.pop(); return array; } var newArray = new Array(newLen); var after = 0; for (var ii = 0; ii < newLen; ii++) { if (ii === idx) { after = 1; } newArray[ii] = array[ii + after]; } return newArray; } var MAX_ARRAY_MAP_SIZE = SIZE / 4; var MAX_BITMAP_INDEXED_SIZE = SIZE / 2; var MIN_HASH_ARRAY_MAP_SIZE = SIZE / 4; var IS_LIST_SYMBOL = '@@__IMMUTABLE_LIST__@@'; function isList(maybeList) { return Boolean(maybeList && maybeList[IS_LIST_SYMBOL]); } var List = /*@__PURE__*/(function (IndexedCollection) { function List(value) { var empty = emptyList(); if (value === undefined || value === null) { return empty; } if (isList(value)) { return value; } var iter = IndexedCollection(value); var size = iter.size; if (size === 0) { return empty; } assertNotInfinite(size); if (size > 0 && size < SIZE) { return makeList(0, size, SHIFT, null, new VNode(iter.toArray())); } return empty.withMutations(function (list) { list.setSize(size); iter.forEach(function (v, i) { return list.set(i, v); }); }); } if ( IndexedCollection ) List.__proto__ = IndexedCollection; List.prototype = Object.create( IndexedCollection && IndexedCollection.prototype ); List.prototype.constructor = List; List.of = function of (/*...values*/) { return this(arguments); }; List.prototype.toString = function toString () { return this.__toString('List [', ']'); }; // @pragma Access List.prototype.get = function get (index, notSetValue) { index = wrapIndex(this, index); if (index >= 0 && index < this.size) { index += this._origin; var node = listNodeFor(this, index); return node && node.array[index & MASK]; } return notSetValue; }; // @pragma Modification List.prototype.set = function set (index, value) { return updateList(this, index, value); }; List.prototype.remove = function remove (index) { return !this.has(index) ? this : index === 0 ? this.shift() : index === this.size - 1 ? this.pop() : this.splice(index, 1); }; List.prototype.insert = function insert (index, value) { return this.splice(index, 0, value); }; List.prototype.clear = function clear () { if (this.size === 0) { return this; } if (this.__ownerID) { this.size = this._origin = this._capacity = 0; this._level = SHIFT; this._root = this._tail = this.__hash = undefined; this.__altered = true; return this; } return emptyList(); }; List.prototype.push = function push (/*...values*/) { var values = arguments; var oldSize = this.size; return this.withMutations(function (list) { setListBounds(list, 0, oldSize + values.length); for (var ii = 0; ii < values.length; ii++) { list.set(oldSize + ii, values[ii]); } }); }; List.prototype.pop = function pop () { return setListBounds(this, 0, -1); }; List.prototype.unshift = function unshift (/*...values*/) { var values = arguments; return this.withMutations(function (list) { setListBounds(list, -values.length); for (var ii = 0; ii < values.length; ii++) { list.set(ii, values[ii]); } }); }; List.prototype.shift = function shift () { return setListBounds(this, 1); }; // @pragma Composition List.prototype.concat = function concat (/*...collections*/) { var arguments$1 = arguments; var seqs = []; for (var i = 0; i < arguments.length; i++) { var argument = arguments$1[i]; var seq = IndexedCollection( typeof argument !== 'string' && hasIterator(argument) ? argument : [argument] ); if (seq.size !== 0) { seqs.push(seq); } } if (seqs.length === 0) { return this; } if (this.size === 0 && !this.__ownerID && seqs.length === 1) { return this.constructor(seqs[0]); } return this.withMutations(function (list) { seqs.forEach(function (seq) { return seq.forEach(function (value) { return list.push(value); }); }); }); }; List.prototype.setSize = function setSize (size) { return setListBounds(this, 0, size); }; List.prototype.map = function map (mapper, context) { var this$1$1 = this; return this.withMutations(function (list) { for (var i = 0; i < this$1$1.size; i++) { list.set(i, mapper.call(context, list.get(i), i, this$1$1)); } }); }; // @pragma Iteration List.prototype.slice = function slice (begin, end) { var size = this.size; if (wholeSlice(begin, end, size)) { return this; } return setListBounds( this, resolveBegin(begin, size), resolveEnd(end, size) ); }; List.prototype.__iterator = function __iterator (type, reverse) { var index = reverse ? this.size : 0; var values = iterateList(this, reverse); return new Iterator(function () { var value = values(); return value === DONE ? iteratorDone() : iteratorValue(type, reverse ? --index : index++, value); }); }; List.prototype.__iterate = function __iterate (fn, reverse) { var index = reverse ? this.size : 0; var values = iterateList(this, reverse); var value; while ((value = values()) !== DONE) { if (fn(value, reverse ? --index : index++, this) === false) { break; } } return index; }; List.prototype.__ensureOwner = function __ensureOwner (ownerID) { if (ownerID === this.__ownerID) { return this; } if (!ownerID) { if (this.size === 0) { return emptyList(); } this.__ownerID = ownerID; this.__altered = false; return this; } return makeList( this._origin, this._capacity, this._level, this._root, this._tail, ownerID, this.__hash ); }; return List; }(IndexedCollection)); List.isList = isList; var ListPrototype = List.prototype; ListPrototype[IS_LIST_SYMBOL] = true; ListPrototype[DELETE] = ListPrototype.remove; ListPrototype.merge = ListPrototype.concat; ListPrototype.setIn = setIn; ListPrototype.deleteIn = ListPrototype.removeIn = deleteIn; ListPrototype.update = update; ListPrototype.updateIn = updateIn; ListPrototype.mergeIn = mergeIn; ListPrototype.mergeDeepIn = mergeDeepIn; ListPrototype.withMutations = withMutations; ListPrototype.wasAltered = wasAltered; ListPrototype.asImmutable = asImmutable; ListPrototype['@@transducer/init'] = ListPrototype.asMutable = asMutable; ListPrototype['@@transducer/step'] = function (result, arr) { return result.push(arr); }; ListPrototype['@@transducer/result'] = function (obj) { return obj.asImmutable(); }; var VNode = function VNode(array, ownerID) { this.array = array; this.ownerID = ownerID; }; // TODO: seems like these methods are very similar VNode.prototype.removeBefore = function removeBefore (ownerID, level, index) { if (index === level ? 1 << level : this.array.length === 0) { return this; } var originIndex = (index >>> level) & MASK; if (originIndex >= this.array.length) { return new VNode([], ownerID); } var removingFirst = originIndex === 0; var newChild; if (level > 0) { var oldChild = this.array[originIndex]; newChild = oldChild && oldChild.removeBefore(ownerID, level - SHIFT, index); if (newChild === oldChild && removingFirst) { return this; } } if (removingFirst && !newChild) { return this; } var editable = editableVNode(this, ownerID); if (!removingFirst) { for (var ii = 0; ii < originIndex; ii++) { editable.array[ii] = undefined; } } if (newChild) { editable.array[originIndex] = newChild; } return editable; }; VNode.prototype.removeAfter = function removeAfter (ownerID, level, index) { if (index === (level ? 1 << level : 0) || this.array.length === 0) { return this; } var sizeIndex = ((index - 1) >>> level) & MASK; if (sizeIndex >= this.array.length) { return this; } var newChild; if (level > 0) { var oldChild = this.array[sizeIndex]; newChild = oldChild && oldChild.removeAfter(ownerID, level - SHIFT, index); if (newChild === oldChild && sizeIndex === this.array.length - 1) { return this; } } var editable = editableVNode(this, ownerID); editable.array.splice(sizeIndex + 1); if (newChild) { editable.array[sizeIndex] = newChild; } return editable; }; var DONE = {}; function iterateList(list, reverse) { var left = list._origin; var right = list._capacity; var tailPos = getTailOffset(right); var tail = list._tail; return iterateNodeOrLeaf(list._root, list._level, 0); function iterateNodeOrLeaf(node, level, offset) { return level === 0 ? iterateLeaf(node, offset) : iterateNode(node, level, offset); } function iterateLeaf(node, offset) { var array = offset === tailPos ? tail && tail.array : node && node.array; var from = offset > left ? 0 : left - offset; var to = right - offset; if (to > SIZE) { to = SIZE; } return function () { if (from === to) { return DONE; } var idx = reverse ? --to : from++; return array && array[idx]; }; } function iterateNode(node, level, offset) { var values; var array = node && node.array; var from = offset > left ? 0 : (left - offset) >> level; var to = ((right - offset) >> level) + 1; if (to > SIZE) { to = SIZE; } return function () { while (true) { if (values) { var value = values(); if (value !== DONE) { return value; } values = null; } if (from === to) { return DONE; } var idx = reverse ? --to : from++; values = iterateNodeOrLeaf( array && array[idx], level - SHIFT, offset + (idx << level) ); } }; } } function makeList(origin, capacity, level, root, tail, ownerID, hash) { var list = Object.create(ListPrototype); list.size = capacity - origin; list._origin = origin; list._capacity = capacity; list._level = level; list._root = root; list._tail = tail; list.__ownerID = ownerID; list.__hash = hash; list.__altered = false; return list; } var EMPTY_LIST; function emptyList() { return EMPTY_LIST || (EMPTY_LIST = makeList(0, 0, SHIFT)); } function updateList(list, index, value) { index = wrapIndex(list, index); if (index !== index) { return list; } if (index >= list.size || index < 0) { return list.withMutations(function (list) { index < 0 ? setListBounds(list, index).set(0, value) : setListBounds(list, 0, index + 1).set(index, value); }); } index += list._origin; var newTail = list._tail; var newRoot = list._root; var didAlter = MakeRef(); if (index >= getTailOffset(list._capacity)) { newTail = updateVNode(newTail, list.__ownerID, 0, index, value, didAlter); } else { newRoot = updateVNode( newRoot, list.__ownerID, list._level, index, value, didAlter ); } if (!didAlter.value) { return list; } if (list.__ownerID) { list._root = newRoot; list._tail = newTail; list.__hash = undefined; list.__altered = true; return list; } return makeList(list._origin, list._capacity, list._level, newRoot, newTail); } function updateVNode(node, ownerID, level, index, value, didAlter) { var idx = (index >>> level) & MASK; var nodeHas = node && idx < node.array.length; if (!nodeHas && value === undefined) { return node; } var newNode; if (level > 0) { var lowerNode = node && node.array[idx]; var newLowerNode = updateVNode( lowerNode, ownerID, level - SHIFT, index, value, didAlter ); if (newLowerNode === lowerNode) { return node; } newNode = editableVNode(node, ownerID); newNode.array[idx] = newLowerNode; return newNode; } if (nodeHas && node.array[idx] === value) { return node; } if (didAlter) { SetRef(didAlter); } newNode = editableVNode(node, ownerID); if (value === undefined && idx === newNode.array.length - 1) { newNode.array.pop(); } else { newNode.array[idx] = value; } return newNode; } function editableVNode(node, ownerID) { if (ownerID && node && ownerID === node.ownerID) { return node; } return new VNode(node ? node.array.slice() : [], ownerID); } function listNodeFor(list, rawIndex) { if (rawIndex >= getTailOffset(list._capacity)) { return list._tail; } if (rawIndex < 1 << (list._level + SHIFT)) { var node = list._root; var level = list._level; while (node && level > 0) { node = node.array[(rawIndex >>> level) & MASK]; level -= SHIFT; } return node; } } function setListBounds(list, begin, end) { // Sanitize begin & end using this shorthand for ToInt32(argument) // http://www.ecma-international.org/ecma-262/6.0/#sec-toint32 if (begin !== undefined) { begin |= 0; } if (end !== undefined) { end |= 0; } var owner = list.__ownerID || new OwnerID(); var oldOrigin = list._origin; var oldCapacity = list._capacity; var newOrigin = oldOrigin + begin; var newCapacity = end === undefined ? oldCapacity : end < 0 ? oldCapacity + end : oldOrigin + end; if (newOrigin === oldOrigin && newCapacity === oldCapacity) { return list; } // If it's going to end after it starts, it's empty. if (newOrigin >= newCapacity) { return list.clear(); } var newLevel = list._level; var newRoot = list._root; // New origin might need creating a higher root. var offsetShift = 0; while (newOrigin + offsetShift < 0) { newRoot = new VNode( newRoot && newRoot.array.length ? [undefined, newRoot] : [], owner ); newLevel += SHIFT; offsetShift += 1 << newLevel; } if (offsetShift) { newOrigin += offsetShift; oldOrigin += offsetShift; newCapacity += offsetShift; oldCapacity += offsetShift; } var oldTailOffset = getTailOffset(oldCapacity); var newTailOffset = getTailOffset(newCapacity); // New size might need creating a higher root. while (newTailOffset >= 1 << (newLevel + SHIFT)) { newRoot = new VNode( newRoot && newRoot.array.length ? [newRoot] : [], owner ); newLevel += SHIFT; } // Locate or create the new tail. var oldTail = list._tail; var newTail = newTailOffset < oldTailOffset ? listNodeFor(list, newCapacity - 1) : newTailOffset > oldTailOffset ? new VNode([], owner) : oldTail; // Merge Tail into tree. if ( oldTail && newTailOffset > oldTailOffset && newOrigin < oldCapacity && oldTail.array.length ) { newRoot = editableVNode(newRoot, owner); var node = newRoot; for (var level = newLevel; level > SHIFT; level -= SHIFT) { var idx = (oldTailOffset >>> level) & MASK; node = node.array[idx] = editableVNode(node.array[idx], owner); } node.array[(oldTailOffset >>> SHIFT) & MASK] = oldTail; } // If the size has been reduced, there's a chance the tail needs to be trimmed. if (newCapacity < oldCapacity) { newTail = newTail && newTail.removeAfter(owner, 0, newCapacity); } // If the new origin is within the tail, then we do not need a root. if (newOrigin >= newTailOffset) { newOrigin -= newTailOffset; newCapacity -= newTailOffset; newLevel = SHIFT; newRoot = null; newTail = newTail && newTail.removeBefore(owner, 0, newOrigin); // Otherwise, if the root has been trimmed, garbage collect. } else if (newOrigin > oldOrigin || newTailOffset < oldTailOffset) { offsetShift = 0; // Identify the new top root node of the subtree of the old root. while (newRoot) { var beginIndex = (newOrigin >>> newLevel) & MASK; if ((beginIndex !== newTailOffset >>> newLevel) & MASK) { break; } if (beginIndex) { offsetShift += (1 << newLevel) * beginIndex; } newLevel -= SHIFT; newRoot = newRoot.array[beginIndex]; } // Trim the new sides of the new root. if (newRoot && newOrigin > oldOrigin) { newRoot = newRoot.removeBefore(owner, newLevel, newOrigin - offsetShift); } if (newRoot && newTailOffset < oldTailOffset) { newRoot = newRoot.removeAfter( owner, newLevel, newTailOffset - offsetShift ); } if (offsetShift) { newOrigin -= offsetShift; newCapacity -= offsetShift; } } if (list.__ownerID) { list.size = newCapacity - newOrigin; list._origin = newOrigin; list._capacity = newCapacity; list._level = newLevel; list._root = newRoot; list._tail = newTail; list.__hash = undefined; list.__altered = true; return list; } return makeList(newOrigin, newCapacity, newLevel, newRoot, newTail); } function getTailOffset(size) { return size < SIZE ? 0 : ((size - 1) >>> SHIFT) << SHIFT; } var OrderedMap = /*@__PURE__*/(function (Map) { function OrderedMap(value) { return value === undefined || value === null ? emptyOrderedMap() : isOrderedMap(value) ? value : emptyOrderedMap().withMutations(function (map) { var iter = KeyedCollection(value); assertNotInfinite(iter.size); iter.forEach(function (v, k) { return map.set(k, v); }); }); } if ( Map ) OrderedMap.__proto__ = Map; OrderedMap.prototype = Object.create( Map && Map.prototype ); OrderedMap.prototype.constructor = OrderedMap; OrderedMap.of = function of (/*...values*/) { return this(arguments); }; OrderedMap.prototype.toString = function toString () { return this.__toString('OrderedMap {', '}'); }; // @pragma Access OrderedMap.prototype.get = function get (k, notSetValue) { var index = this._map.get(k); return index !== undefined ? this._list.get(index)[1] : notSetValue; }; // @pragma Modification OrderedMap.prototype.clear = function clear () { if (this.size === 0) { return this; } if (this.__ownerID) { this.size = 0; this._map.clear(); this._list.clear(); this.__altered = true; return this; } return emptyOrderedMap(); }; OrderedMap.prototype.set = function set (k, v) { return updateOrderedMap(this, k, v); }; OrderedMap.prototype.remove = function remove (k) { return updateOrderedMap(this, k, NOT_SET); }; OrderedMap.prototype.__iterate = function __iterate (fn, reverse) { var this$1$1 = this; return this._list.__iterate( function (entry) { return entry && fn(entry[1], entry[0], this$1$1); }, reverse ); }; OrderedMap.prototype.__iterator = function __iterator (type, reverse) { return this._list.fromEntrySeq().__iterator(type, reverse); }; OrderedMap.prototype.__ensureOwner = function __ensureOwner (ownerID) { if (ownerID === this.__ownerID) { return this; } var newMap = this._map.__ensureOwner(ownerID); var newList = this._list.__ensureOwner(ownerID); if (!ownerID) { if (this.size === 0) { return emptyOrderedMap(); } this.__ownerID = ownerID; this.__altered = false; this._map = newMap; this._list = newList; return this; } return makeOrderedMap(newMap, newList, ownerID, this.__hash); }; return OrderedMap; }(Map)); OrderedMap.isOrderedMap = isOrderedMap; OrderedMap.prototype[IS_ORDERED_SYMBOL] = true; OrderedMap.prototype[DELETE] = OrderedMap.prototype.remove; function makeOrderedMap(map, list, ownerID, hash) { var omap = Object.create(OrderedMap.prototype); omap.size = map ? map.size : 0; omap._map = map; omap._list = list; omap.__ownerID = ownerID; omap.__hash = hash; omap.__altered = false; return omap; } var EMPTY_ORDERED_MAP; function emptyOrderedMap() { return ( EMPTY_ORDERED_MAP || (EMPTY_ORDERED_MAP = makeOrderedMap(emptyMap(), emptyList())) ); } function updateOrderedMap(omap, k, v) { var map = omap._map; var list = omap._list; var i = map.get(k); var has = i !== undefined; var newMap; var newList; if (v === NOT_SET) { // removed if (!has) { return omap; } if (list.size >= SIZE && list.size >= map.size * 2) { newList = list.filter(function (entry, idx) { return entry !== undefined && i !== idx; }); newMap = newList .toKeyedSeq() .map(function (entry) { return entry[0]; }) .flip() .toMap(); if (omap.__ownerID) { newMap.__ownerID = newList.__ownerID = omap.__ownerID; } } else { newMap = map.remove(k); newList = i === list.size - 1 ? list.pop() : list.set(i, undefined); } } else if (has) { if (v === list.get(i)[1]) { return omap; } newMap = map; newList = list.set(i, [k, v]); } else { newMap = map.set(k, list.size); newList = list.set(list.size, [k, v]); } if (omap.__ownerID) { omap.size = newMap.size; omap._map = newMap; omap._list = newList; omap.__hash = undefined; omap.__altered = true; return omap; } return makeOrderedMap(newMap, newList); } var IS_STACK_SYMBOL = '@@__IMMUTABLE_STACK__@@'; function isStack(maybeStack) { return Boolean(maybeStack && maybeStack[IS_STACK_SYMBOL]); } var Stack = /*@__PURE__*/(function (IndexedCollection) { function Stack(value) { return value === undefined || value === null ? emptyStack() : isStack(value) ? value : emptyStack().pushAll(value); } if ( IndexedCollection ) Stack.__proto__ = IndexedCollection; Stack.prototype = Object.create( IndexedCollection && IndexedCollection.prototype ); Stack.prototype.constructor = Stack; Stack.of = function of (/*...values*/) { return this(arguments); }; Stack.prototype.toString = function toString () { return this.__toString('Stack [', ']'); }; // @pragma Access Stack.prototype.get = function get (index, notSetValue) { var head = this._head; index = wrapIndex(this, index); while (head && index--) { head = head.next; } return head ? head.value : notSetValue; }; Stack.prototype.peek = function peek () { return this._head && this._head.value; }; // @pragma Modification Stack.prototype.push = function push (/*...values*/) { var arguments$1 = arguments; if (arguments.length === 0) { return this; } var newSize = this.size + arguments.length; var head = this._head; for (var ii = arguments.length - 1; ii >= 0; ii--) { head = { value: arguments$1[ii], next: head, }; } if (this.__ownerID) { this.size = newSize; this._head = head; this.__hash = undefined; this.__altered = true; return this; } return makeStack(newSize, head); }; Stack.prototype.pushAll = function pushAll (iter) { iter = IndexedCollection(iter); if (iter.size === 0) { return this; } if (this.size === 0 && isStack(iter)) { return iter; } assertNotInfinite(iter.size); var newSize = this.size; var head = this._head; iter.__iterate(function (value) { newSize++; head = { value: value, next: head, }; }, /* reverse */ true); if (this.__ownerID) { this.size = newSize; this._head = head; this.__hash = undefined; this.__altered = true; return this; } return makeStack(newSize, head); }; Stack.prototype.pop = function pop () { return this.slice(1); }; Stack.prototype.clear = function clear () { if (this.size === 0) { return this; } if (this.__ownerID) { this.size = 0; this._head = undefined; this.__hash = undefined; this.__altered = true; return this; } return emptyStack(); }; Stack.prototype.slice = function slice (begin, end) { if (wholeSlice(begin, end, this.size)) { return this; } var resolvedBegin = resolveBegin(begin, this.size); var resolvedEnd = resolveEnd(end, this.size); if (resolvedEnd !== this.size) { // super.slice(begin, end); return IndexedCollection.prototype.slice.call(this, begin, end); } var newSize = this.size - resolvedBegin; var head = this._head; while (resolvedBegin--) { head = head.next; } if (this.__ownerID) { this.size = newSize; this._head = head; this.__hash = undefined; this.__altered = true; return this; } return makeStack(newSize, head); }; // @pragma Mutability Stack.prototype.__ensureOwner = function __ensureOwner (ownerID) { if (ownerID === this.__ownerID) { return this; } if (!ownerID) { if (this.size === 0) { return emptyStack(); } this.__ownerID = ownerID; this.__altered = false; return this; } return makeStack(this.size, this._head, ownerID, this.__hash); }; // @pragma Iteration Stack.prototype.__iterate = function __iterate (fn, reverse) { var this$1$1 = this; if (reverse) { return new ArraySeq(this.toArray()).__iterate( function (v, k) { return fn(v, k, this$1$1); }, reverse ); } var iterations = 0; var node = this._head; while (node) { if (fn(node.value, iterations++, this) === false) { break; } node = node.next; } return iterations; }; Stack.prototype.__iterator = function __iterator (type, reverse) { if (reverse) { return new ArraySeq(this.toArray()).__iterator(type, reverse); } var iterations = 0; var node = this._head; return new Iterator(function () { if (node) { var value = node.value; node = node.next; return iteratorValue(type, iterations++, value); } return iteratorDone(); }); }; return Stack; }(IndexedCollection)); Stack.isStack = isStack; var StackPrototype = Stack.prototype; StackPrototype[IS_STACK_SYMBOL] = true; StackPrototype.shift = StackPrototype.pop; StackPrototype.unshift = StackPrototype.push; StackPrototype.unshiftAll = StackPrototype.pushAll; StackPrototype.withMutations = withMutations; StackPrototype.wasAltered = wasAltered; StackPrototype.asImmutable = asImmutable; StackPrototype['@@transducer/init'] = StackPrototype.asMutable = asMutable; StackPrototype['@@transducer/step'] = function (result, arr) { return result.unshift(arr); }; StackPrototype['@@transducer/result'] = function (obj) { return obj.asImmutable(); }; function makeStack(size, head, ownerID, hash) { var map = Object.create(StackPrototype); map.size = size; map._head = head; map.__ownerID = ownerID; map.__hash = hash; map.__altered = false; return map; } var EMPTY_STACK; function emptyStack() { return EMPTY_STACK || (EMPTY_STACK = makeStack(0)); } var IS_SET_SYMBOL = '@@__IMMUTABLE_SET__@@'; function isSet(maybeSet) { return Boolean(maybeSet && maybeSet[IS_SET_SYMBOL]); } function isOrderedSet(maybeOrderedSet) { return isSet(maybeOrderedSet) && isOrdered(maybeOrderedSet); } function deepEqual(a, b) { if (a === b) { return true; } if ( !isCollection(b) || (a.size !== undefined && b.size !== undefined && a.size !== b.size) || (a.__hash !== undefined && b.__hash !== undefined && a.__hash !== b.__hash) || isKeyed(a) !== isKeyed(b) || isIndexed(a) !== isIndexed(b) || isOrdered(a) !== isOrdered(b) ) { return false; } if (a.size === 0 && b.size === 0) { return true; } var notAssociative = !isAssociative(a); if (isOrdered(a)) { var entries = a.entries(); return ( b.every(function (v, k) { var entry = entries.next().value; return entry && is(entry[1], v) && (notAssociative || is(entry[0], k)); }) && entries.next().done ); } var flipped = false; if (a.size === undefined) { if (b.size === undefined) { if (typeof a.cacheResult === 'function') { a.cacheResult(); } } else { flipped = true; var _ = a; a = b; b = _; } } var allEqual = true; var bSize = b.__iterate(function (v, k) { if ( notAssociative ? !a.has(v) : flipped ? !is(v, a.get(k, NOT_SET)) : !is(a.get(k, NOT_SET), v) ) { allEqual = false; return false; } }); return allEqual && a.size === bSize; } function mixin(ctor, methods) { var keyCopier = function (key) { ctor.prototype[key] = methods[key]; }; Object.keys(methods).forEach(keyCopier); Object.getOwnPropertySymbols && Object.getOwnPropertySymbols(methods).forEach(keyCopier); return ctor; } function toJS(value) { if (!value || typeof value !== 'object') { return value; } if (!isCollection(value)) { if (!isDataStructure(value)) { return value; } value = Seq(value); } if (isKeyed(value)) { var result$1 = {}; value.__iterate(function (v, k) { result$1[k] = toJS(v); }); return result$1; } var result = []; value.__iterate(function (v) { result.push(toJS(v)); }); return result; } var Set = /*@__PURE__*/(function (SetCollection) { function Set(value) { return value === undefined || value === null ? emptySet() : isSet(value) && !isOrdered(value) ? value : emptySet().withMutations(function (set) { var iter = SetCollection(value); assertNotInfinite(iter.size); iter.forEach(function (v) { return set.add(v); }); }); } if ( SetCollection ) Set.__proto__ = SetCollection; Set.prototype = Object.create( SetCollection && SetCollection.prototype ); Set.prototype.constructor = Set; Set.of = function of (/*...values*/) { return this(arguments); }; Set.fromKeys = function fromKeys (value) { return this(KeyedCollection(value).keySeq()); }; Set.intersect = function intersect (sets) { sets = Collection(sets).toArray(); return sets.length ? SetPrototype.intersect.apply(Set(sets.pop()), sets) : emptySet(); }; Set.union = function union (sets) { sets = Collection(sets).toArray(); return sets.length ? SetPrototype.union.apply(Set(sets.pop()), sets) : emptySet(); }; Set.prototype.toString = function toString () { return this.__toString('Set {', '}'); }; // @pragma Access Set.prototype.has = function has (value) { return this._map.has(value); }; // @pragma Modification Set.prototype.add = function add (value) { return updateSet(this, this._map.set(value, value)); }; Set.prototype.remove = function remove (value) { return updateSet(this, this._map.remove(value)); }; Set.prototype.clear = function clear () { return updateSet(this, this._map.clear()); }; // @pragma Composition Set.prototype.map = function map (mapper, context) { var this$1$1 = this; // keep track if the set is altered by the map function var didChanges = false; var newMap = updateSet( this, this._map.mapEntries(function (ref) { var v = ref[1]; var mapped = mapper.call(context, v, v, this$1$1); if (mapped !== v) { didChanges = true; } return [mapped, mapped]; }, context) ); return didChanges ? newMap : this; }; Set.prototype.union = function union () { var iters = [], len = arguments.length; while ( len-- ) iters[ len ] = arguments[ len ]; iters = iters.filter(function (x) { return x.size !== 0; }); if (iters.length === 0) { return this; } if (this.size === 0 && !this.__ownerID && iters.length === 1) { return this.constructor(iters[0]); } return this.withMutations(function (set) { for (var ii = 0; ii < iters.length; ii++) { SetCollection(iters[ii]).forEach(function (value) { return set.add(value); }); } }); }; Set.prototype.intersect = function intersect () { var iters = [], len = arguments.length; while ( len-- ) iters[ len ] = arguments[ len ]; if (iters.length === 0) { return this; } iters = iters.map(function (iter) { return SetCollection(iter); }); var toRemove = []; this.forEach(function (value) { if (!iters.every(function (iter) { return iter.includes(value); })) { toRemove.push(value); } }); return this.withMutations(function (set) { toRemove.forEach(function (value) { set.remove(value); }); }); }; Set.prototype.subtract = function subtract () { var iters = [], len = arguments.length; while ( len-- ) iters[ len ] = arguments[ len ]; if (iters.length === 0) { return this; } iters = iters.map(function (iter) { return SetCollection(iter); }); var toRemove = []; this.forEach(function (value) { if (iters.some(function (iter) { return iter.includes(value); })) { toRemove.push(value); } }); return this.withMutations(function (set) { toRemove.forEach(function (value) { set.remove(value); }); }); }; Set.prototype.sort = function sort (comparator) { // Late binding return OrderedSet(sortFactory(this, comparator)); }; Set.prototype.sortBy = function sortBy (mapper, comparator) { // Late binding return OrderedSet(sortFactory(this, comparator, mapper)); }; Set.prototype.wasAltered = function wasAltered () { return this._map.wasAltered(); }; Set.prototype.__iterate = function __iterate (fn, reverse) { var this$1$1 = this; return this._map.__iterate(function (k) { return fn(k, k, this$1$1); }, reverse); }; Set.prototype.__iterator = function __iterator (type, reverse) { return this._map.__iterator(type, reverse); }; Set.prototype.__ensureOwner = function __ensureOwner (ownerID) { if (ownerID === this.__ownerID) { return this; } var newMap = this._map.__ensureOwner(ownerID); if (!ownerID) { if (this.size === 0) { return this.__empty(); } this.__ownerID = ownerID; this._map = newMap; return this; } return this.__make(newMap, ownerID); }; return Set; }(SetCollection)); Set.isSet = isSet; var SetPrototype = Set.prototype; SetPrototype[IS_SET_SYMBOL] = true; SetPrototype[DELETE] = SetPrototype.remove; SetPrototype.merge = SetPrototype.concat = SetPrototype.union; SetPrototype.withMutations = withMutations; SetPrototype.asImmutable = asImmutable; SetPrototype['@@transducer/init'] = SetPrototype.asMutable = asMutable; SetPrototype['@@transducer/step'] = function (result, arr) { return result.add(arr); }; SetPrototype['@@transducer/result'] = function (obj) { return obj.asImmutable(); }; SetPrototype.__empty = emptySet; SetPrototype.__make = makeSet; function updateSet(set, newMap) { if (set.__ownerID) { set.size = newMap.size; set._map = newMap; return set; } return newMap === set._map ? set : newMap.size === 0 ? set.__empty() : set.__make(newMap); } function makeSet(map, ownerID) { var set = Object.create(SetPrototype); set.size = map ? map.size : 0; set._map = map; set.__ownerID = ownerID; return set; } var EMPTY_SET; function emptySet() { return EMPTY_SET || (EMPTY_SET = makeSet(emptyMap())); } /** * Returns a lazy seq of nums from start (inclusive) to end * (exclusive), by step, where start defaults to 0, step to 1, and end to * infinity. When start is equal to end, returns empty list. */ var Range = /*@__PURE__*/(function (IndexedSeq) { function Range(start, end, step) { if (!(this instanceof Range)) { return new Range(start, end, step); } invariant(step !== 0, 'Cannot step a Range by 0'); start = start || 0; if (end === undefined) { end = Infinity; } step = step === undefined ? 1 : Math.abs(step); if (end < start) { step = -step; } this._start = start; this._end = end; this._step = step; this.size = Math.max(0, Math.ceil((end - start) / step - 1) + 1); if (this.size === 0) { if (EMPTY_RANGE) { return EMPTY_RANGE; } EMPTY_RANGE = this; } } if ( IndexedSeq ) Range.__proto__ = IndexedSeq; Range.prototype = Object.create( IndexedSeq && IndexedSeq.prototype ); Range.prototype.constructor = Range; Range.prototype.toString = function toString () { if (this.size === 0) { return 'Range []'; } return ( 'Range [ ' + this._start + '...' + this._end + (this._step !== 1 ? ' by ' + this._step : '') + ' ]' ); }; Range.prototype.get = function get (index, notSetValue) { return this.has(index) ? this._start + wrapIndex(this, index) * this._step : notSetValue; }; Range.prototype.includes = function includes (searchValue) { var possibleIndex = (searchValue - this._start) / this._step; return ( possibleIndex >= 0 && possibleIndex < this.size && possibleIndex === Math.floor(possibleIndex) ); }; Range.prototype.slice = function slice (begin, end) { if (wholeSlice(begin, end, this.size)) { return this; } begin = resolveBegin(begin, this.size); end = resolveEnd(end, this.size); if (end <= begin) { return new Range(0, 0); } return new Range( this.get(begin, this._end), this.get(end, this._end), this._step ); }; Range.prototype.indexOf = function indexOf (searchValue) { var offsetValue = searchValue - this._start; if (offsetValue % this._step === 0) { var index = offsetValue / this._step; if (index >= 0 && index < this.size) { return index; } } return -1; }; Range.prototype.lastIndexOf = function lastIndexOf (searchValue) { return this.indexOf(searchValue); }; Range.prototype.__iterate = function __iterate (fn, reverse) { var size = this.size; var step = this._step; var value = reverse ? this._start + (size - 1) * step : this._start; var i = 0; while (i !== size) { if (fn(value, reverse ? size - ++i : i++, this) === false) { break; } value += reverse ? -step : step; } return i; }; Range.prototype.__iterator = function __iterator (type, reverse) { var size = this.size; var step = this._step; var value = reverse ? this._start + (size - 1) * step : this._start; var i = 0; return new Iterator(function () { if (i === size) { return iteratorDone(); } var v = value; value += reverse ? -step : step; return iteratorValue(type, reverse ? size - ++i : i++, v); }); }; Range.prototype.equals = function equals (other) { return other instanceof Range ? this._start === other._start && this._end === other._end && this._step === other._step : deepEqual(this, other); }; return Range; }(IndexedSeq)); var EMPTY_RANGE; function getIn$1(collection, searchKeyPath, notSetValue) { var keyPath = coerceKeyPath(searchKeyPath); var i = 0; while (i !== keyPath.length) { collection = get(collection, keyPath[i++], NOT_SET); if (collection === NOT_SET) { return notSetValue; } } return collection; } function getIn(searchKeyPath, notSetValue) { return getIn$1(this, searchKeyPath, notSetValue); } function hasIn$1(collection, keyPath) { return getIn$1(collection, keyPath, NOT_SET) !== NOT_SET; } function hasIn(searchKeyPath) { return hasIn$1(this, searchKeyPath); } function toObject() { assertNotInfinite(this.size); var object = {}; this.__iterate(function (v, k) { object[k] = v; }); return object; } // Note: all of these methods are deprecated. Collection.isIterable = isCollection; Collection.isKeyed = isKeyed; Collection.isIndexed = isIndexed; Collection.isAssociative = isAssociative; Collection.isOrdered = isOrdered; Collection.Iterator = Iterator; mixin(Collection, { // ### Conversion to other types toArray: function toArray() { assertNotInfinite(this.size); var array = new Array(this.size || 0); var useTuples = isKeyed(this); var i = 0; this.__iterate(function (v, k) { // Keyed collections produce an array of tuples. array[i++] = useTuples ? [k, v] : v; }); return array; }, toIndexedSeq: function toIndexedSeq() { return new ToIndexedSequence(this); }, toJS: function toJS$1() { return toJS(this); }, toKeyedSeq: function toKeyedSeq() { return new ToKeyedSequence(this, true); }, toMap: function toMap() { // Use Late Binding here to solve the circular dependency. return Map(this.toKeyedSeq()); }, toObject: toObject, toOrderedMap: function toOrderedMap() { // Use Late Binding here to solve the circular dependency. return OrderedMap(this.toKeyedSeq()); }, toOrderedSet: function toOrderedSet() { // Use Late Binding here to solve the circular dependency. return OrderedSet(isKeyed(this) ? this.valueSeq() : this); }, toSet: function toSet() { // Use Late Binding here to solve the circular dependency. return Set(isKeyed(this) ? this.valueSeq() : this); }, toSetSeq: function toSetSeq() { return new ToSetSequence(this); }, toSeq: function toSeq() { return isIndexed(this) ? this.toIndexedSeq() : isKeyed(this) ? this.toKeyedSeq() : this.toSetSeq(); }, toStack: function toStack() { // Use Late Binding here to solve the circular dependency. return Stack(isKeyed(this) ? this.valueSeq() : this); }, toList: function toList() { // Use Late Binding here to solve the circular dependency. return List(isKeyed(this) ? this.valueSeq() : this); }, // ### Common JavaScript methods and properties toString: function toString() { return '[Collection]'; }, __toString: function __toString(head, tail) { if (this.size === 0) { return head + tail; } return ( head + ' ' + this.toSeq().map(this.__toStringMapper).join(', ') + ' ' + tail ); }, // ### ES6 Collection methods (ES6 Array and Map) concat: function concat() { var values = [], len = arguments.length; while ( len-- ) values[ len ] = arguments[ len ]; return reify(this, concatFactory(this, values)); }, includes: function includes(searchValue) { return this.some(function (value) { return is(value, searchValue); }); }, entries: function entries() { return this.__iterator(ITERATE_ENTRIES); }, every: function every(predicate, context) { assertNotInfinite(this.size); var returnValue = true; this.__iterate(function (v, k, c) { if (!predicate.call(context, v, k, c)) { returnValue = false; return false; } }); return returnValue; }, filter: function filter(predicate, context) { return reify(this, filterFactory(this, predicate, context, true)); }, find: function find(predicate, context, notSetValue) { var entry = this.findEntry(predicate, context); return entry ? entry[1] : notSetValue; }, forEach: function forEach(sideEffect, context) { assertNotInfinite(this.size); return this.__iterate(context ? sideEffect.bind(context) : sideEffect); }, join: function join(separator) { assertNotInfinite(this.size); separator = separator !== undefined ? '' + separator : ','; var joined = ''; var isFirst = true; this.__iterate(function (v) { isFirst ? (isFirst = false) : (joined += separator); joined += v !== null && v !== undefined ? v.toString() : ''; }); return joined; }, keys: function keys() { return this.__iterator(ITERATE_KEYS); }, map: function map(mapper, context) { return reify(this, mapFactory(this, mapper, context)); }, reduce: function reduce$1(reducer, initialReduction, context) { return reduce( this, reducer, initialReduction, context, arguments.length < 2, false ); }, reduceRight: function reduceRight(reducer, initialReduction, context) { return reduce( this, reducer, initialReduction, context, arguments.length < 2, true ); }, reverse: function reverse() { return reify(this, reverseFactory(this, true)); }, slice: function slice(begin, end) { return reify(this, sliceFactory(this, begin, end, true)); }, some: function some(predicate, context) { return !this.every(not(predicate), context); }, sort: function sort(comparator) { return reify(this, sortFactory(this, comparator)); }, values: function values() { return this.__iterator(ITERATE_VALUES); }, // ### More sequential methods butLast: function butLast() { return this.slice(0, -1); }, isEmpty: function isEmpty() { return this.size !== undefined ? this.size === 0 : !this.some(function () { return true; }); }, count: function count(predicate, context) { return ensureSize( predicate ? this.toSeq().filter(predicate, context) : this ); }, countBy: function countBy(grouper, context) { return countByFactory(this, grouper, context); }, equals: function equals(other) { return deepEqual(this, other); }, entrySeq: function entrySeq() { var collection = this; if (collection._cache) { // We cache as an entries array, so we can just return the cache! return new ArraySeq(collection._cache); } var entriesSequence = collection.toSeq().map(entryMapper).toIndexedSeq(); entriesSequence.fromEntrySeq = function () { return collection.toSeq(); }; return entriesSequence; }, filterNot: function filterNot(predicate, context) { return this.filter(not(predicate), context); }, findEntry: function findEntry(predicate, context, notSetValue) { var found = notSetValue; this.__iterate(function (v, k, c) { if (predicate.call(context, v, k, c)) { found = [k, v]; return false; } }); return found; }, findKey: function findKey(predicate, context) { var entry = this.findEntry(predicate, context); return entry && entry[0]; }, findLast: function findLast(predicate, context, notSetValue) { return this.toKeyedSeq().reverse().find(predicate, context, notSetValue); }, findLastEntry: function findLastEntry(predicate, context, notSetValue) { return this.toKeyedSeq() .reverse() .findEntry(predicate, context, notSetValue); }, findLastKey: function findLastKey(predicate, context) { return this.toKeyedSeq().reverse().findKey(predicate, context); }, first: function first(notSetValue) { return this.find(returnTrue, null, notSetValue); }, flatMap: function flatMap(mapper, context) { return reify(this, flatMapFactory(this, mapper, context)); }, flatten: function flatten(depth) { return reify(this, flattenFactory(this, depth, true)); }, fromEntrySeq: function fromEntrySeq() { return new FromEntriesSequence(this); }, get: function get(searchKey, notSetValue) { return this.find(function (_, key) { return is(key, searchKey); }, undefined, notSetValue); }, getIn: getIn, groupBy: function groupBy(grouper, context) { return groupByFactory(this, grouper, context); }, has: function has(searchKey) { return this.get(searchKey, NOT_SET) !== NOT_SET; }, hasIn: hasIn, isSubset: function isSubset(iter) { iter = typeof iter.includes === 'function' ? iter : Collection(iter); return this.every(function (value) { return iter.includes(value); }); }, isSuperset: function isSuperset(iter) { iter = typeof iter.isSubset === 'function' ? iter : Collection(iter); return iter.isSubset(this); }, keyOf: function keyOf(searchValue) { return this.findKey(function (value) { return is(value, searchValue); }); }, keySeq: function keySeq() { return this.toSeq().map(keyMapper).toIndexedSeq(); }, last: function last(notSetValue) { return this.toSeq().reverse().first(notSetValue); }, lastKeyOf: function lastKeyOf(searchValue) { return this.toKeyedSeq().reverse().keyOf(searchValue); }, max: function max(comparator) { return maxFactory(this, comparator); }, maxBy: function maxBy(mapper, comparator) { return maxFactory(this, comparator, mapper); }, min: function min(comparator) { return maxFactory( this, comparator ? neg(comparator) : defaultNegComparator ); }, minBy: function minBy(mapper, comparator) { return maxFactory( this, comparator ? neg(comparator) : defaultNegComparator, mapper ); }, rest: function rest() { return this.slice(1); }, skip: function skip(amount) { return amount === 0 ? this : this.slice(Math.max(0, amount)); }, skipLast: function skipLast(amount) { return amount === 0 ? this : this.slice(0, -Math.max(0, amount)); }, skipWhile: function skipWhile(predicate, context) { return reify(this, skipWhileFactory(this, predicate, context, true)); }, skipUntil: function skipUntil(predicate, context) { return this.skipWhile(not(predicate), context); }, sortBy: function sortBy(mapper, comparator) { return reify(this, sortFactory(this, comparator, mapper)); }, take: function take(amount) { return this.slice(0, Math.max(0, amount)); }, takeLast: function takeLast(amount) { return this.slice(-Math.max(0, amount)); }, takeWhile: function takeWhile(predicate, context) { return reify(this, takeWhileFactory(this, predicate, context)); }, takeUntil: function takeUntil(predicate, context) { return this.takeWhile(not(predicate), context); }, update: function update(fn) { return fn(this); }, valueSeq: function valueSeq() { return this.toIndexedSeq(); }, // ### Hashable Object hashCode: function hashCode() { return this.__hash || (this.__hash = hashCollection(this)); }, // ### Internal // abstract __iterate(fn, reverse) // abstract __iterator(type, reverse) }); var CollectionPrototype = Collection.prototype; CollectionPrototype[IS_COLLECTION_SYMBOL] = true; CollectionPrototype[ITERATOR_SYMBOL] = CollectionPrototype.values; CollectionPrototype.toJSON = CollectionPrototype.toArray; CollectionPrototype.__toStringMapper = quoteString; CollectionPrototype.inspect = CollectionPrototype.toSource = function () { return this.toString(); }; CollectionPrototype.chain = CollectionPrototype.flatMap; CollectionPrototype.contains = CollectionPrototype.includes; mixin(KeyedCollection, { // ### More sequential methods flip: function flip() { return reify(this, flipFactory(this)); }, mapEntries: function mapEntries(mapper, context) { var this$1$1 = this; var iterations = 0; return reify( this, this.toSeq() .map(function (v, k) { return mapper.call(context, [k, v], iterations++, this$1$1); }) .fromEntrySeq() ); }, mapKeys: function mapKeys(mapper, context) { var this$1$1 = this; return reify( this, this.toSeq() .flip() .map(function (k, v) { return mapper.call(context, k, v, this$1$1); }) .flip() ); }, }); var KeyedCollectionPrototype = KeyedCollection.prototype; KeyedCollectionPrototype[IS_KEYED_SYMBOL] = true; KeyedCollectionPrototype[ITERATOR_SYMBOL] = CollectionPrototype.entries; KeyedCollectionPrototype.toJSON = toObject; KeyedCollectionPrototype.__toStringMapper = function (v, k) { return quoteString(k) + ': ' + quoteString(v); }; mixin(IndexedCollection, { // ### Conversion to other types toKeyedSeq: function toKeyedSeq() { return new ToKeyedSequence(this, false); }, // ### ES6 Collection methods (ES6 Array and Map) filter: function filter(predicate, context) { return reify(this, filterFactory(this, predicate, context, false)); }, findIndex: function findIndex(predicate, context) { var entry = this.findEntry(predicate, context); return entry ? entry[0] : -1; }, indexOf: function indexOf(searchValue) { var key = this.keyOf(searchValue); return key === undefined ? -1 : key; }, lastIndexOf: function lastIndexOf(searchValue) { var key = this.lastKeyOf(searchValue); return key === undefined ? -1 : key; }, reverse: function reverse() { return reify(this, reverseFactory(this, false)); }, slice: function slice(begin, end) { return reify(this, sliceFactory(this, begin, end, false)); }, splice: function splice(index, removeNum /*, ...values*/) { var numArgs = arguments.length; removeNum = Math.max(removeNum || 0, 0); if (numArgs === 0 || (numArgs === 2 && !removeNum)) { return this; } // If index is negative, it should resolve relative to the size of the // collection. However size may be expensive to compute if not cached, so // only call count() if the number is in fact negative. index = resolveBegin(index, index < 0 ? this.count() : this.size); var spliced = this.slice(0, index); return reify( this, numArgs === 1 ? spliced : spliced.concat(arrCopy(arguments, 2), this.slice(index + removeNum)) ); }, // ### More collection methods findLastIndex: function findLastIndex(predicate, context) { var entry = this.findLastEntry(predicate, context); return entry ? entry[0] : -1; }, first: function first(notSetValue) { return this.get(0, notSetValue); }, flatten: function flatten(depth) { return reify(this, flattenFactory(this, depth, false)); }, get: function get(index, notSetValue) { index = wrapIndex(this, index); return index < 0 || this.size === Infinity || (this.size !== undefined && index > this.size) ? notSetValue : this.find(function (_, key) { return key === index; }, undefined, notSetValue); }, has: function has(index) { index = wrapIndex(this, index); return ( index >= 0 && (this.size !== undefined ? this.size === Infinity || index < this.size : this.indexOf(index) !== -1) ); }, interpose: function interpose(separator) { return reify(this, interposeFactory(this, separator)); }, interleave: function interleave(/*...collections*/) { var collections = [this].concat(arrCopy(arguments)); var zipped = zipWithFactory(this.toSeq(), IndexedSeq.of, collections); var interleaved = zipped.flatten(true); if (zipped.size) { interleaved.size = zipped.size * collections.length; } return reify(this, interleaved); }, keySeq: function keySeq() { return Range(0, this.size); }, last: function last(notSetValue) { return this.get(-1, notSetValue); }, skipWhile: function skipWhile(predicate, context) { return reify(this, skipWhileFactory(this, predicate, context, false)); }, zip: function zip(/*, ...collections */) { var collections = [this].concat(arrCopy(arguments)); return reify(this, zipWithFactory(this, defaultZipper, collections)); }, zipAll: function zipAll(/*, ...collections */) { var collections = [this].concat(arrCopy(arguments)); return reify(this, zipWithFactory(this, defaultZipper, collections, true)); }, zipWith: function zipWith(zipper /*, ...collections */) { var collections = arrCopy(arguments); collections[0] = this; return reify(this, zipWithFactory(this, zipper, collections)); }, }); var IndexedCollectionPrototype = IndexedCollection.prototype; IndexedCollectionPrototype[IS_INDEXED_SYMBOL] = true; IndexedCollectionPrototype[IS_ORDERED_SYMBOL] = true; mixin(SetCollection, { // ### ES6 Collection methods (ES6 Array and Map) get: function get(value, notSetValue) { return this.has(value) ? value : notSetValue; }, includes: function includes(value) { return this.has(value); }, // ### More sequential methods keySeq: function keySeq() { return this.valueSeq(); }, }); var SetCollectionPrototype = SetCollection.prototype; SetCollectionPrototype.has = CollectionPrototype.includes; SetCollectionPrototype.contains = SetCollectionPrototype.includes; SetCollectionPrototype.keys = SetCollectionPrototype.values; // Mixin subclasses mixin(KeyedSeq, KeyedCollectionPrototype); mixin(IndexedSeq, IndexedCollectionPrototype); mixin(SetSeq, SetCollectionPrototype); // #pragma Helper functions function reduce(collection, reducer, reduction, context, useFirst, reverse) { assertNotInfinite(collection.size); collection.__iterate(function (v, k, c) { if (useFirst) { useFirst = false; reduction = v; } else { reduction = reducer.call(context, reduction, v, k, c); } }, reverse); return reduction; } function keyMapper(v, k) { return k; } function entryMapper(v, k) { return [k, v]; } function not(predicate) { return function () { return !predicate.apply(this, arguments); }; } function neg(predicate) { return function () { return -predicate.apply(this, arguments); }; } function defaultZipper() { return arrCopy(arguments); } function defaultNegComparator(a, b) { return a < b ? 1 : a > b ? -1 : 0; } function hashCollection(collection) { if (collection.size === Infinity) { return 0; } var ordered = isOrdered(collection); var keyed = isKeyed(collection); var h = ordered ? 1 : 0; var size = collection.__iterate( keyed ? ordered ? function (v, k) { h = (31 * h + hashMerge(hash(v), hash(k))) | 0; } : function (v, k) { h = (h + hashMerge(hash(v), hash(k))) | 0; } : ordered ? function (v) { h = (31 * h + hash(v)) | 0; } : function (v) { h = (h + hash(v)) | 0; } ); return murmurHashOfSize(size, h); } function murmurHashOfSize(size, h) { h = imul(h, 0xcc9e2d51); h = imul((h << 15) | (h >>> -15), 0x1b873593); h = imul((h << 13) | (h >>> -13), 5); h = ((h + 0xe6546b64) | 0) ^ size; h = imul(h ^ (h >>> 16), 0x85ebca6b); h = imul(h ^ (h >>> 13), 0xc2b2ae35); h = smi(h ^ (h >>> 16)); return h; } function hashMerge(a, b) { return (a ^ (b + 0x9e3779b9 + (a << 6) + (a >> 2))) | 0; // int } var OrderedSet = /*@__PURE__*/(function (Set) { function OrderedSet(value) { return value === undefined || value === null ? emptyOrderedSet() : isOrderedSet(value) ? value : emptyOrderedSet().withMutations(function (set) { var iter = SetCollection(value); assertNotInfinite(iter.size); iter.forEach(function (v) { return set.add(v); }); }); } if ( Set ) OrderedSet.__proto__ = Set; OrderedSet.prototype = Object.create( Set && Set.prototype ); OrderedSet.prototype.constructor = OrderedSet; OrderedSet.of = function of (/*...values*/) { return this(arguments); }; OrderedSet.fromKeys = function fromKeys (value) { return this(KeyedCollection(value).keySeq()); }; OrderedSet.prototype.toString = function toString () { return this.__toString('OrderedSet {', '}'); }; return OrderedSet; }(Set)); OrderedSet.isOrderedSet = isOrderedSet; var OrderedSetPrototype = OrderedSet.prototype; OrderedSetPrototype[IS_ORDERED_SYMBOL] = true; OrderedSetPrototype.zip = IndexedCollectionPrototype.zip; OrderedSetPrototype.zipWith = IndexedCollectionPrototype.zipWith; OrderedSetPrototype.zipAll = IndexedCollectionPrototype.zipAll; OrderedSetPrototype.__empty = emptyOrderedSet; OrderedSetPrototype.__make = makeOrderedSet; function makeOrderedSet(map, ownerID) { var set = Object.create(OrderedSetPrototype); set.size = map ? map.size : 0; set._map = map; set.__ownerID = ownerID; return set; } var EMPTY_ORDERED_SET; function emptyOrderedSet() { return ( EMPTY_ORDERED_SET || (EMPTY_ORDERED_SET = makeOrderedSet(emptyOrderedMap())) ); } function throwOnInvalidDefaultValues(defaultValues) { if (isRecord(defaultValues)) { throw new Error( 'Can not call `Record` with an immutable Record as default values. Use a plain javascript object instead.' ); } if (isImmutable(defaultValues)) { throw new Error( 'Can not call `Record` with an immutable Collection as default values. Use a plain javascript object instead.' ); } if (defaultValues === null || typeof defaultValues !== 'object') { throw new Error( 'Can not call `Record` with a non-object as default values. Use a plain javascript object instead.' ); } } var Record = function Record(defaultValues, name) { var hasInitialized; throwOnInvalidDefaultValues(defaultValues); var RecordType = function Record(values) { var this$1$1 = this; if (values instanceof RecordType) { return values; } if (!(this instanceof RecordType)) { return new RecordType(values); } if (!hasInitialized) { hasInitialized = true; var keys = Object.keys(defaultValues); var indices = (RecordTypePrototype._indices = {}); // Deprecated: left to attempt not to break any external code which // relies on a ._name property existing on record instances. // Use Record.getDescriptiveName() instead RecordTypePrototype._name = name; RecordTypePrototype._keys = keys; RecordTypePrototype._defaultValues = defaultValues; for (var i = 0; i < keys.length; i++) { var propName = keys[i]; indices[propName] = i; if (RecordTypePrototype[propName]) { /* eslint-disable no-console */ typeof console === 'object' && console.warn && console.warn( 'Cannot define ' + recordName(this) + ' with property "' + propName + '" since that property name is part of the Record API.' ); /* eslint-enable no-console */ } else { setProp(RecordTypePrototype, propName); } } } this.__ownerID = undefined; this._values = List().withMutations(function (l) { l.setSize(this$1$1._keys.length); KeyedCollection(values).forEach(function (v, k) { l.set(this$1$1._indices[k], v === this$1$1._defaultValues[k] ? undefined : v); }); }); return this; }; var RecordTypePrototype = (RecordType.prototype = Object.create(RecordPrototype)); RecordTypePrototype.constructor = RecordType; if (name) { RecordType.displayName = name; } return RecordType; }; Record.prototype.toString = function toString () { var str = recordName(this) + ' { '; var keys = this._keys; var k; for (var i = 0, l = keys.length; i !== l; i++) { k = keys[i]; str += (i ? ', ' : '') + k + ': ' + quoteString(this.get(k)); } return str + ' }'; }; Record.prototype.equals = function equals (other) { return ( this === other || (isRecord(other) && recordSeq(this).equals(recordSeq(other))) ); }; Record.prototype.hashCode = function hashCode () { return recordSeq(this).hashCode(); }; // @pragma Access Record.prototype.has = function has (k) { return this._indices.hasOwnProperty(k); }; Record.prototype.get = function get (k, notSetValue) { if (!this.has(k)) { return notSetValue; } var index = this._indices[k]; var value = this._values.get(index); return value === undefined ? this._defaultValues[k] : value; }; // @pragma Modification Record.prototype.set = function set (k, v) { if (this.has(k)) { var newValues = this._values.set( this._indices[k], v === this._defaultValues[k] ? undefined : v ); if (newValues !== this._values && !this.__ownerID) { return makeRecord(this, newValues); } } return this; }; Record.prototype.remove = function remove (k) { return this.set(k); }; Record.prototype.clear = function clear () { var newValues = this._values.clear().setSize(this._keys.length); return this.__ownerID ? this : makeRecord(this, newValues); }; Record.prototype.wasAltered = function wasAltered () { return this._values.wasAltered(); }; Record.prototype.toSeq = function toSeq () { return recordSeq(this); }; Record.prototype.toJS = function toJS$1 () { return toJS(this); }; Record.prototype.entries = function entries () { return this.__iterator(ITERATE_ENTRIES); }; Record.prototype.__iterator = function __iterator (type, reverse) { return recordSeq(this).__iterator(type, reverse); }; Record.prototype.__iterate = function __iterate (fn, reverse) { return recordSeq(this).__iterate(fn, reverse); }; Record.prototype.__ensureOwner = function __ensureOwner (ownerID) { if (ownerID === this.__ownerID) { return this; } var newValues = this._values.__ensureOwner(ownerID); if (!ownerID) { this.__ownerID = ownerID; this._values = newValues; return this; } return makeRecord(this, newValues, ownerID); }; Record.isRecord = isRecord; Record.getDescriptiveName = recordName; var RecordPrototype = Record.prototype; RecordPrototype[IS_RECORD_SYMBOL] = true; RecordPrototype[DELETE] = RecordPrototype.remove; RecordPrototype.deleteIn = RecordPrototype.removeIn = deleteIn; RecordPrototype.getIn = getIn; RecordPrototype.hasIn = CollectionPrototype.hasIn; RecordPrototype.merge = merge$1; RecordPrototype.mergeWith = mergeWith$1; RecordPrototype.mergeIn = mergeIn; RecordPrototype.mergeDeep = mergeDeep; RecordPrototype.mergeDeepWith = mergeDeepWith; RecordPrototype.mergeDeepIn = mergeDeepIn; RecordPrototype.setIn = setIn; RecordPrototype.update = update; RecordPrototype.updateIn = updateIn; RecordPrototype.withMutations = withMutations; RecordPrototype.asMutable = asMutable; RecordPrototype.asImmutable = asImmutable; RecordPrototype[ITERATOR_SYMBOL] = RecordPrototype.entries; RecordPrototype.toJSON = RecordPrototype.toObject = CollectionPrototype.toObject; RecordPrototype.inspect = RecordPrototype.toSource = function () { return this.toString(); }; function makeRecord(likeRecord, values, ownerID) { var record = Object.create(Object.getPrototypeOf(likeRecord)); record._values = values; record.__ownerID = ownerID; return record; } function recordName(record) { return record.constructor.displayName || record.constructor.name || 'Record'; } function recordSeq(record) { return keyedSeqFromValue(record._keys.map(function (k) { return [k, record.get(k)]; })); } function setProp(prototype, name) { try { Object.defineProperty(prototype, name, { get: function () { return this.get(name); }, set: function (value) { invariant(this.__ownerID, 'Cannot set on an immutable record.'); this.set(name, value); }, }); } catch (error) { // Object.defineProperty failed. Probably IE8. } } /** * Returns a lazy Seq of `value` repeated `times` times. When `times` is * undefined, returns an infinite sequence of `value`. */ var Repeat = /*@__PURE__*/(function (IndexedSeq) { function Repeat(value, times) { if (!(this instanceof Repeat)) { return new Repeat(value, times); } this._value = value; this.size = times === undefined ? Infinity : Math.max(0, times); if (this.size === 0) { if (EMPTY_REPEAT) { return EMPTY_REPEAT; } EMPTY_REPEAT = this; } } if ( IndexedSeq ) Repeat.__proto__ = IndexedSeq; Repeat.prototype = Object.create( IndexedSeq && IndexedSeq.prototype ); Repeat.prototype.constructor = Repeat; Repeat.prototype.toString = function toString () { if (this.size === 0) { return 'Repeat []'; } return 'Repeat [ ' + this._value + ' ' + this.size + ' times ]'; }; Repeat.prototype.get = function get (index, notSetValue) { return this.has(index) ? this._value : notSetValue; }; Repeat.prototype.includes = function includes (searchValue) { return is(this._value, searchValue); }; Repeat.prototype.slice = function slice (begin, end) { var size = this.size; return wholeSlice(begin, end, size) ? this : new Repeat( this._value, resolveEnd(end, size) - resolveBegin(begin, size) ); }; Repeat.prototype.reverse = function reverse () { return this; }; Repeat.prototype.indexOf = function indexOf (searchValue) { if (is(this._value, searchValue)) { return 0; } return -1; }; Repeat.prototype.lastIndexOf = function lastIndexOf (searchValue) { if (is(this._value, searchValue)) { return this.size; } return -1; }; Repeat.prototype.__iterate = function __iterate (fn, reverse) { var size = this.size; var i = 0; while (i !== size) { if (fn(this._value, reverse ? size - ++i : i++, this) === false) { break; } } return i; }; Repeat.prototype.__iterator = function __iterator (type, reverse) { var this$1$1 = this; var size = this.size; var i = 0; return new Iterator(function () { return i === size ? iteratorDone() : iteratorValue(type, reverse ? size - ++i : i++, this$1$1._value); } ); }; Repeat.prototype.equals = function equals (other) { return other instanceof Repeat ? is(this._value, other._value) : deepEqual(other); }; return Repeat; }(IndexedSeq)); var EMPTY_REPEAT; function fromJS(value, converter) { return fromJSWith( [], converter || defaultConverter, value, '', converter && converter.length > 2 ? [] : undefined, { '': value } ); } function fromJSWith(stack, converter, value, key, keyPath, parentValue) { if ( typeof value !== 'string' && !isImmutable(value) && (isArrayLike(value) || hasIterator(value) || isPlainObject(value)) ) { if (~stack.indexOf(value)) { throw new TypeError('Cannot convert circular structure to Immutable'); } stack.push(value); keyPath && key !== '' && keyPath.push(key); var converted = converter.call( parentValue, key, Seq(value).map(function (v, k) { return fromJSWith(stack, converter, v, k, keyPath, value); } ), keyPath && keyPath.slice() ); stack.pop(); keyPath && keyPath.pop(); return converted; } return value; } function defaultConverter(k, v) { // Effectively the opposite of "Collection.toSeq()" return isIndexed(v) ? v.toList() : isKeyed(v) ? v.toMap() : v.toSet(); } var version = "4.1.0"; var Immutable = { version: version, Collection: Collection, // Note: Iterable is deprecated Iterable: Collection, Seq: Seq, Map: Map, OrderedMap: OrderedMap, List: List, Stack: Stack, Set: Set, OrderedSet: OrderedSet, Record: Record, Range: Range, Repeat: Repeat, is: is, fromJS: fromJS, hash: hash, isImmutable: isImmutable, isCollection: isCollection, isKeyed: isKeyed, isIndexed: isIndexed, isAssociative: isAssociative, isOrdered: isOrdered, isValueObject: isValueObject, isPlainObject: isPlainObject, isSeq: isSeq, isList: isList, isMap: isMap, isOrderedMap: isOrderedMap, isStack: isStack, isSet: isSet, isOrderedSet: isOrderedSet, isRecord: isRecord, get: get, getIn: getIn$1, has: has, hasIn: hasIn$1, merge: merge, mergeDeep: mergeDeep$1, mergeWith: mergeWith, mergeDeepWith: mergeDeepWith$1, remove: remove, removeIn: removeIn, set: set, setIn: setIn$1, update: update$1, updateIn: updateIn$1, }; // Note: Iterable is deprecated var Iterable = Collection; exports.Collection = Collection; exports.Iterable = Iterable; exports.List = List; exports.Map = Map; exports.OrderedMap = OrderedMap; exports.OrderedSet = OrderedSet; exports.Range = Range; exports.Record = Record; exports.Repeat = Repeat; exports.Seq = Seq; exports.Set = Set; exports.Stack = Stack; exports.default = Immutable; exports.fromJS = fromJS; exports.get = get; exports.getIn = getIn$1; exports.has = has; exports.hasIn = hasIn$1; exports.hash = hash; exports.is = is; exports.isAssociative = isAssociative; exports.isCollection = isCollection; exports.isImmutable = isImmutable; exports.isIndexed = isIndexed; exports.isKeyed = isKeyed; exports.isList = isList; exports.isMap = isMap; exports.isOrdered = isOrdered; exports.isOrderedMap = isOrderedMap; exports.isOrderedSet = isOrderedSet; exports.isPlainObject = isPlainObject; exports.isRecord = isRecord; exports.isSeq = isSeq; exports.isSet = isSet; exports.isStack = isStack; exports.isValueObject = isValueObject; exports.merge = merge; exports.mergeDeep = mergeDeep$1; exports.mergeDeepWith = mergeDeepWith$1; exports.mergeWith = mergeWith; exports.remove = remove; exports.removeIn = removeIn; exports.set = set; exports.setIn = setIn$1; exports.update = update$1; exports.updateIn = updateIn$1; exports.version = version; Object.defineProperty(exports, '__esModule', { value: true }); }))); },{}],88:[function(require,module,exports){ if (typeof Object.create === 'function') { // implementation from standard node.js 'util' module module.exports = function inherits(ctor, superCtor) { if (superCtor) { ctor.super_ = superCtor ctor.prototype = Object.create(superCtor.prototype, { constructor: { value: ctor, enumerable: false, writable: true, configurable: true } }) } }; } else { // old school shim for old browsers module.exports = function inherits(ctor, superCtor) { if (superCtor) { ctor.super_ = superCtor var TempCtor = function () {} TempCtor.prototype = superCtor.prototype ctor.prototype = new TempCtor() ctor.prototype.constructor = ctor } } } },{}],89:[function(require,module,exports){ module.exports = require('../impls/$append/append.js').__append; },{"../impls/$append/append.js":256}],90:[function(require,module,exports){ module.exports = require('../impls/apply/apply.js').__apply; },{"../impls/apply/apply.js":414}],91:[function(require,module,exports){ module.exports = require('../impls/array-reverse/array-reverse.js').__arrayReverse; },{"../impls/array-reverse/array-reverse.js":421}],92:[function(require,module,exports){ module.exports = require('../impls/$append/async-append.js').__asyncAppend; },{"../impls/$append/async-append.js":257}],93:[function(require,module,exports){ module.exports = require('../impls/$batch/async-batch.js').__asyncBatch; },{"../impls/$batch/async-batch.js":258}],94:[function(require,module,exports){ module.exports = require('../impls/$bisect/async-bisect.js').__asyncBisect; },{"../impls/$bisect/async-bisect.js":260}],95:[function(require,module,exports){ module.exports = require('../impls/async-buffer/async-buffer.js').__asyncBuffer; },{"../impls/async-buffer/async-buffer.js":422}],96:[function(require,module,exports){ module.exports = require('../impls/$collate/async-collate.js').__asyncCollate; },{"../impls/$collate/async-collate.js":262}],97:[function(require,module,exports){ module.exports = require('../impls/$compress/async-compress.js').__asyncCompress; },{"../impls/$compress/async-compress.js":264}],98:[function(require,module,exports){ module.exports = require('../impls/$concat/async-concat.js').__asyncConcat; },{"../impls/$concat/async-concat.js":266}],99:[function(require,module,exports){ module.exports = require('../impls/$consume/async-consume.js').__asyncConsume; },{"../impls/$consume/async-consume.js":268}],100:[function(require,module,exports){ module.exports = require('../impls/$cycle-times/async-cycle-times.js').__asyncCycleTimes; },{"../impls/$cycle-times/async-cycle-times.js":270}],101:[function(require,module,exports){ module.exports = require('../impls/$cycle/async-cycle.js').__asyncCycle; },{"../impls/$cycle/async-cycle.js":272}],102:[function(require,module,exports){ module.exports = require('../impls/$deep-equal/async-deep-equal.js').__asyncDeepEqual; },{"../impls/$deep-equal/async-deep-equal.js":274}],103:[function(require,module,exports){ module.exports = require('../impls/$distinct/async-distinct.js').__asyncDistinct; },{"../impls/$distinct/async-distinct.js":276}],104:[function(require,module,exports){ module.exports = require('../impls/$drop-while/async-drop-while.js').__asyncDropWhile; },{"../impls/$drop-while/async-drop-while.js":278}],105:[function(require,module,exports){ module.exports = require('../impls/$drop/async-drop.js').__asyncDrop; },{"../impls/$drop/async-drop.js":280}],106:[function(require,module,exports){ module.exports = require('../impls/$enumerate/async-enumerate.js').__asyncEnumerate; },{"../impls/$enumerate/async-enumerate.js":282}],107:[function(require,module,exports){ module.exports = require('../impls/$equal/async-equal.js').__asyncEqual; },{"../impls/$equal/async-equal.js":284}],108:[function(require,module,exports){ module.exports = require('../impls/$every/async-every.js').__asyncEvery; },{"../impls/$every/async-every.js":286}],109:[function(require,module,exports){ module.exports = require('../impls/$filter/async-filter.js').__asyncFilter; },{"../impls/$filter/async-filter.js":288}],110:[function(require,module,exports){ module.exports = require('../impls/$find-best-or/async-find-best-or.js').__asyncFindBestOr; },{"../impls/$find-best-or/async-find-best-or.js":290}],111:[function(require,module,exports){ module.exports = require('../impls/$find-best/async-find-best.js').__asyncFindBest; },{"../impls/$find-best/async-find-best.js":292}],112:[function(require,module,exports){ module.exports = require('../impls/$find-or/async-find-or.js').__asyncFindOr; },{"../impls/$find-or/async-find-or.js":294}],113:[function(require,module,exports){ module.exports = require('../impls/$find/async-find.js').__asyncFind; },{"../impls/$find/async-find.js":296}],114:[function(require,module,exports){ module.exports = require('../impls/$first-or/async-first-or.js').__asyncFirstOr; },{"../impls/$first-or/async-first-or.js":298}],115:[function(require,module,exports){ module.exports = require('../impls/$first/async-first.js').__asyncFirst; },{"../impls/$first/async-first.js":300}],116:[function(require,module,exports){ module.exports = require('../impls/$flat-map/async-flat-map.js').__asyncFlatMap; },{"../impls/$flat-map/async-flat-map.js":302}],117:[function(require,module,exports){ module.exports = require('../impls/$flat/async-flat.js').__asyncFlat; },{"../impls/$flat/async-flat.js":304}],118:[function(require,module,exports){ module.exports = require('../impls/$for-each/async-for-each.js').__asyncForEach; },{"../impls/$for-each/async-for-each.js":307}],119:[function(require,module,exports){ module.exports = require('../impls/$fork/async-fork.js').__asyncFork; },{"../impls/$fork/async-fork.js":309}],120:[function(require,module,exports){ module.exports = require('../impls/$forkerate/async-forkerate.js').__asyncForkerate; },{"../impls/$forkerate/async-forkerate.js":311}],121:[function(require,module,exports){ module.exports = require('../impls/$includes-any-seq/async-includes-any-seq.js').__asyncIncludesAnySeq; },{"../impls/$includes-any-seq/async-includes-any-seq.js":313}],122:[function(require,module,exports){ module.exports = require('../impls/$includes-any/async-includes-any.js').__asyncIncludesAny; },{"../impls/$includes-any/async-includes-any.js":315}],123:[function(require,module,exports){ module.exports = require('../impls/$includes-seq/async-includes-seq.js').__asyncIncludesSeq; },{"../impls/$includes-seq/async-includes-seq.js":317}],124:[function(require,module,exports){ module.exports = require('../impls/$includes/async-includes.js').__asyncIncludes; },{"../impls/$includes/async-includes.js":319}],125:[function(require,module,exports){ module.exports = require('../impls/async-interleave-ready/async-interleave-ready.js').__asyncInterleaveReady; },{"../impls/async-interleave-ready/async-interleave-ready.js":423}],126:[function(require,module,exports){ module.exports = require('../impls/$interleave/async-interleave.js').__asyncInterleave; },{"../impls/$interleave/async-interleave.js":321}],127:[function(require,module,exports){ module.exports = require('../impls/$interpose-seq/async-interpose-seq.js').__asyncInterposeSeq; },{"../impls/$interpose-seq/async-interpose-seq.js":323}],128:[function(require,module,exports){ module.exports = require('../impls/$interpose/async-interpose.js').__asyncInterpose; },{"../impls/$interpose/async-interpose.js":325}],129:[function(require,module,exports){ module.exports = require('../impls/$is-empty/async-is-empty.js').__asyncIsEmpty; },{"../impls/$is-empty/async-is-empty.js":327}],130:[function(require,module,exports){ module.exports = require('../impls/$is-sorted/async-is-sorted.js').__asyncIsSorted; },{"../impls/$is-sorted/async-is-sorted.js":329}],131:[function(require,module,exports){ module.exports = require('../impls/$join-with-seq/async-join-with-seq.js').__asyncJoinWithSeq; },{"../impls/$join-with-seq/async-join-with-seq.js":331}],132:[function(require,module,exports){ module.exports = require('../impls/$join-with/async-join-with.js').__asyncJoinWith; },{"../impls/$join-with/async-join-with.js":333}],133:[function(require,module,exports){ module.exports = require('../impls/$join/async-join.js').__asyncJoin; },{"../impls/$join/async-join.js":335}],134:[function(require,module,exports){ module.exports = require('../impls/$map/async-map.js').__asyncMap; },{"../impls/$map/async-map.js":337}],135:[function(require,module,exports){ module.exports = require('../impls/$peekerate/async-peekerate.js').__asyncPeekerate; },{"../impls/$peekerate/async-peekerate.js":339}],136:[function(require,module,exports){ module.exports = require('../impls/$prepend/async-prepend.js').__asyncPrepend; },{"../impls/$prepend/async-prepend.js":341}],137:[function(require,module,exports){ module.exports = require('../impls/$reduce/async-reduce.js').__asyncReduce; },{"../impls/$reduce/async-reduce.js":343}],138:[function(require,module,exports){ module.exports = require('../impls/$reverse/async-reverse.js').__asyncReverse; },{"../impls/$reverse/async-reverse.js":345}],139:[function(require,module,exports){ module.exports = require('../impls/$round-robin/async-round-robin.js').__asyncRoundRobin; },{"../impls/$round-robin/async-round-robin.js":347}],140:[function(require,module,exports){ module.exports = require('../impls/$size/async-size.js').__asyncSize; },{"../impls/$size/async-size.js":350}],141:[function(require,module,exports){ module.exports = require('../impls/$slice/async-slice.js').__asyncSliceFromStart; },{"../impls/$slice/async-slice.js":352}],142:[function(require,module,exports){ module.exports = require('../impls/$some/async-some.js').__asyncSome; },{"../impls/$some/async-some.js":355}],143:[function(require,module,exports){ module.exports = require('../impls/$split-groups/async-split-groups.js').__asyncSplitGroups; },{"../impls/$split-groups/async-split-groups.js":357}],144:[function(require,module,exports){ module.exports = require('../impls/$split-on-any-seq/async-split-on-any-seq.js').__asyncSplitOnAnySeq; },{"../impls/$split-on-any-seq/async-split-on-any-seq.js":359}],145:[function(require,module,exports){ module.exports = require('../impls/$split-on-any/async-split-on-any.js').__asyncSplitOnAny; },{"../impls/$split-on-any/async-split-on-any.js":361}],146:[function(require,module,exports){ module.exports = require('../impls/$split-on-seq/async-split-on-seq.js').__asyncSplitOnSeq; },{"../impls/$split-on-seq/async-split-on-seq.js":363}],147:[function(require,module,exports){ module.exports = require('../impls/$split-on/async-split-on.js').__asyncSplitOn; },{"../impls/$split-on/async-split-on.js":365}],148:[function(require,module,exports){ module.exports = require('../impls/$split-when/async-split-when.js').__asyncSplitWhen; },{"../impls/$split-when/async-split-when.js":367}],149:[function(require,module,exports){ module.exports = require('../impls/$split/async-split.js').__asyncSplit; },{"../impls/$split/async-split.js":369}],150:[function(require,module,exports){ module.exports = require('../impls/$spliterate-grouped/async-spliterate-grouped.js').__asyncSpliterateGrouped; },{"../impls/$spliterate-grouped/async-spliterate-grouped.js":371}],151:[function(require,module,exports){ module.exports = require('../impls/$spliterate/async-spliterate.js').__asyncSpliterate; },{"../impls/$spliterate/async-spliterate.js":373}],152:[function(require,module,exports){ module.exports = require('../impls/$starts-with-any-seq/async-starts-with-any-seq.js').__asyncStartsWithAnySeq; },{"../impls/$starts-with-any-seq/async-starts-with-any-seq.js":375}],153:[function(require,module,exports){ module.exports = require('../impls/$starts-with-any/async-starts-with-any.js').__asyncStartsWithAny; },{"../impls/$starts-with-any/async-starts-with-any.js":377}],154:[function(require,module,exports){ module.exports = require('../impls/$starts-with-seq/async-starts-with-seq.js').__asyncStartsWithSeq; },{"../impls/$starts-with-seq/async-starts-with-seq.js":379}],155:[function(require,module,exports){ module.exports = require('../impls/$starts-with/async-starts-with.js').__asyncStartsWith; },{"../impls/$starts-with/async-starts-with.js":381}],156:[function(require,module,exports){ module.exports = require('../impls/$str/async-str.js').__asyncStr; },{"../impls/$str/async-str.js":383}],157:[function(require,module,exports){ module.exports = require('../impls/$take-last-or/async-take-last-or.js').__asyncTakeLastOr; },{"../impls/$take-last-or/async-take-last-or.js":385}],158:[function(require,module,exports){ module.exports = require('../impls/$take-last/async-take-last.js').__asyncTakeLast; },{"../impls/$take-last/async-take-last.js":387}],159:[function(require,module,exports){ module.exports = require('../impls/$take-sorted/async-take-sorted.js').__asyncTakeSorted; },{"../impls/$take-sorted/async-take-sorted.js":389}],160:[function(require,module,exports){ module.exports = require('../impls/$take-while/async-take-while.js').__asyncTakeWhile; },{"../impls/$take-while/async-take-while.js":392}],161:[function(require,module,exports){ module.exports = require('../impls/$take/async-take.js').__asyncTake; },{"../impls/$take/async-take.js":394}],162:[function(require,module,exports){ module.exports = require('../impls/$tap/async-tap.js').__asyncTap; },{"../impls/$tap/async-tap.js":396}],163:[function(require,module,exports){ module.exports = require('../impls/async-throttle/async-throttle.js').__asyncThrottle; },{"../impls/async-throttle/async-throttle.js":425}],164:[function(require,module,exports){ module.exports = require('../impls/$to-array/async-to-array.js').__asyncToArray; },{"../impls/$to-array/async-to-array.js":398}],165:[function(require,module,exports){ module.exports = require('../impls/$to-object/async-to-object.js').__asyncToObject; },{"../impls/$to-object/async-to-object.js":400}],166:[function(require,module,exports){ module.exports = require('../impls/$window-ahead/async-window-ahead.js').__asyncWindowAhead; },{"../impls/$window-ahead/async-window-ahead.js":402}],167:[function(require,module,exports){ module.exports = require('../impls/$window-behind/async-window-behind.js').__asyncWindowBehind; },{"../impls/$window-behind/async-window-behind.js":404}],168:[function(require,module,exports){ module.exports = require('../impls/$window/async-window.js').__asyncWindow; },{"../impls/$window/async-window.js":406}],169:[function(require,module,exports){ module.exports = require('../impls/$zip-all/async-zip-all.js').__asyncZipAll; },{"../impls/$zip-all/async-zip-all.js":410}],170:[function(require,module,exports){ module.exports = require('../impls/$zip/async-zip.js').__asyncZip; },{"../impls/$zip/async-zip.js":412}],171:[function(require,module,exports){ module.exports = require('../impls/$batch/batch.js').__batch; },{"../impls/$batch/batch.js":259}],172:[function(require,module,exports){ module.exports = require('../impls/$bisect/bisect.js').__bisect; },{"../impls/$bisect/bisect.js":261}],173:[function(require,module,exports){ module.exports = require('../impls/call/call.js').__call; },{"../impls/call/call.js":426}],174:[function(require,module,exports){ module.exports = require('../impls/$collate/collate.js').__collate; },{"../impls/$collate/collate.js":263}],175:[function(require,module,exports){ module.exports = require('../impls/$compress/compress.js').__compress; },{"../impls/$compress/compress.js":265}],176:[function(require,module,exports){ module.exports = require('../impls/$concat/concat.js').__concat; },{"../impls/$concat/concat.js":267}],177:[function(require,module,exports){ module.exports = require('../impls/$consume/consume.js').__consume; },{"../impls/$consume/consume.js":269}],178:[function(require,module,exports){ module.exports = require('../impls/$cycle-times/cycle-times.js').__cycleTimes; },{"../impls/$cycle-times/cycle-times.js":271}],179:[function(require,module,exports){ module.exports = require('../impls/$cycle/cycle.js').__cycle; },{"../impls/$cycle/cycle.js":273}],180:[function(require,module,exports){ module.exports = require('../impls/$deep-equal/deep-equal.js').__deepEqual; },{"../impls/$deep-equal/deep-equal.js":275}],181:[function(require,module,exports){ module.exports = require('../impls/$distinct/distinct.js').__distinct; },{"../impls/$distinct/distinct.js":277}],182:[function(require,module,exports){ module.exports = require('../impls/$drop-while/drop-while.js').__dropWhile; },{"../impls/$drop-while/drop-while.js":279}],183:[function(require,module,exports){ module.exports = require('../impls/$drop/drop.js').__drop; },{"../impls/$drop/drop.js":281}],184:[function(require,module,exports){ module.exports = require('../impls/$enumerate/enumerate.js').__enumerate; },{"../impls/$enumerate/enumerate.js":283}],185:[function(require,module,exports){ module.exports = require('../impls/$equal/equal.js').__equal; },{"../impls/$equal/equal.js":285}],186:[function(require,module,exports){ module.exports = require('../impls/$every/every.js').__every; },{"../impls/$every/every.js":287}],187:[function(require,module,exports){ module.exports = require('../impls/$filter/filter.js').__filter; },{"../impls/$filter/filter.js":289}],188:[function(require,module,exports){ module.exports = require('../impls/$find-best-or/find-best-or.js').__findBestOr; },{"../impls/$find-best-or/find-best-or.js":291}],189:[function(require,module,exports){ module.exports = require('../impls/$find-best/find-best.js').__findBest; },{"../impls/$find-best/find-best.js":293}],190:[function(require,module,exports){ module.exports = require('../impls/$find-or/find-or.js').__findOr; },{"../impls/$find-or/find-or.js":295}],191:[function(require,module,exports){ module.exports = require('../impls/$find/find.js').__find; },{"../impls/$find/find.js":297}],192:[function(require,module,exports){ module.exports = require('../impls/$first-or/first-or.js').__firstOr; },{"../impls/$first-or/first-or.js":299}],193:[function(require,module,exports){ module.exports = require('../impls/$first/first.js').__first; },{"../impls/$first/first.js":301}],194:[function(require,module,exports){ module.exports = require('../impls/$flat-map/flat-map.js').__flatMap; },{"../impls/$flat-map/flat-map.js":303}],195:[function(require,module,exports){ module.exports = require('../impls/$flat/flat.js').__flat; },{"../impls/$flat/flat.js":305}],196:[function(require,module,exports){ module.exports = require('../impls/$for-each/for-each.js').__forEach; },{"../impls/$for-each/for-each.js":308}],197:[function(require,module,exports){ module.exports = require('../impls/$fork/fork.js').__fork; },{"../impls/$fork/fork.js":310}],198:[function(require,module,exports){ module.exports = require('../impls/$forkerate/forkerate.js').__forkerate; },{"../impls/$forkerate/forkerate.js":312}],199:[function(require,module,exports){ module.exports = require('../impls/$includes-any-seq/includes-any-seq.js').__includesAnySeq; },{"../impls/$includes-any-seq/includes-any-seq.js":314}],200:[function(require,module,exports){ module.exports = require('../impls/$includes-any/includes-any.js').__includesAny; },{"../impls/$includes-any/includes-any.js":316}],201:[function(require,module,exports){ module.exports = require('../impls/$includes-seq/includes-seq.js').__includesSeq; },{"../impls/$includes-seq/includes-seq.js":318}],202:[function(require,module,exports){ module.exports = require('../impls/$includes/includes.js').__includes; },{"../impls/$includes/includes.js":320}],203:[function(require,module,exports){ module.exports = require('../impls/$interleave/interleave.js').__interleave; },{"../impls/$interleave/interleave.js":322}],204:[function(require,module,exports){ module.exports = require('../impls/$interpose-seq/interpose-seq.js').__interposeSeq; },{"../impls/$interpose-seq/interpose-seq.js":324}],205:[function(require,module,exports){ module.exports = require('../impls/$interpose/interpose.js').__interpose; },{"../impls/$interpose/interpose.js":326}],206:[function(require,module,exports){ module.exports = require('../impls/$is-empty/is-empty.js').__isEmpty; },{"../impls/$is-empty/is-empty.js":328}],207:[function(require,module,exports){ module.exports = require('../impls/$is-sorted/is-sorted.js').__isSorted; },{"../impls/$is-sorted/is-sorted.js":330}],208:[function(require,module,exports){ module.exports = require('../impls/$join-with-seq/join-with-seq.js').__joinWithSeq; },{"../impls/$join-with-seq/join-with-seq.js":332}],209:[function(require,module,exports){ module.exports = require('../impls/$join-with/join-with.js').__joinWith; },{"../impls/$join-with/join-with.js":334}],210:[function(require,module,exports){ module.exports = require('../impls/$join/join.js').__join; },{"../impls/$join/join.js":336}],211:[function(require,module,exports){ module.exports = require('../impls/$map/map.js').__map; },{"../impls/$map/map.js":338}],212:[function(require,module,exports){ module.exports = require('../impls/object-entries/object-entries.js').__objectEntries; },{"../impls/object-entries/object-entries.js":458}],213:[function(require,module,exports){ module.exports = require('../impls/object-keys/object-keys.js').__objectKeys; },{"../impls/object-keys/object-keys.js":461}],214:[function(require,module,exports){ module.exports = require('../impls/object-values/object-values.js').__objectValues; },{"../impls/object-values/object-values.js":462}],215:[function(require,module,exports){ module.exports = require('../impls/$peekerate/peekerate.js').__peekerate; },{"../impls/$peekerate/peekerate.js":340}],216:[function(require,module,exports){ module.exports = require('../impls/$prepend/prepend.js').__prepend; },{"../impls/$prepend/prepend.js":342}],217:[function(require,module,exports){ module.exports = require('../impls/range/range.js').__range; },{"../impls/range/range.js":464}],218:[function(require,module,exports){ module.exports = require('../impls/$reduce/reduce.js').__reduce; },{"../impls/$reduce/reduce.js":344}],219:[function(require,module,exports){ module.exports = require('../impls/repeat-times/repeat-times.js').__repeatTimes; },{"../impls/repeat-times/repeat-times.js":465}],220:[function(require,module,exports){ module.exports = require('../impls/repeat/repeat.js').__repeat; },{"../impls/repeat/repeat.js":466}],221:[function(require,module,exports){ module.exports = require('../impls/$reverse/reverse.js').__reverse; },{"../impls/$reverse/reverse.js":346}],222:[function(require,module,exports){ module.exports = require('../impls/$round-robin/round-robin.js').__roundRobin; },{"../impls/$round-robin/round-robin.js":349}],223:[function(require,module,exports){ module.exports = require('../impls/$size/size.js').__size; },{"../impls/$size/size.js":351}],224:[function(require,module,exports){ module.exports = require('../impls/$slice/slice.js').__sliceFromStart; },{"../impls/$slice/slice.js":354}],225:[function(require,module,exports){ module.exports = require('../impls/$some/some.js').__some; },{"../impls/$some/some.js":356}],226:[function(require,module,exports){ module.exports = require('../impls/$split-groups/split-groups.js').__splitGroups; },{"../impls/$split-groups/split-groups.js":358}],227:[function(require,module,exports){ module.exports = require('../impls/$split-on-any-seq/split-on-any-seq.js').__splitOnAnySeq; },{"../impls/$split-on-any-seq/split-on-any-seq.js":360}],228:[function(require,module,exports){ module.exports = require('../impls/$split-on-any/split-on-any.js').__splitOnAny; },{"../impls/$split-on-any/split-on-any.js":362}],229:[function(require,module,exports){ module.exports = require('../impls/$split-on-seq/split-on-seq.js').__splitOnSeq; },{"../impls/$split-on-seq/split-on-seq.js":364}],230:[function(require,module,exports){ module.exports = require('../impls/$split-on/split-on.js').__splitOn; },{"../impls/$split-on/split-on.js":366}],231:[function(require,module,exports){ module.exports = require('../impls/$split-when/split-when.js').__splitWhen; },{"../impls/$split-when/split-when.js":368}],232:[function(require,module,exports){ module.exports = require('../impls/$split/split.js').__split; },{"../impls/$split/split.js":370}],233:[function(require,module,exports){ module.exports = require('../impls/$spliterate-grouped/spliterate-grouped.js').__spliterateGrouped; },{"../impls/$spliterate-grouped/spliterate-grouped.js":372}],234:[function(require,module,exports){ module.exports = require('../impls/$spliterate/spliterate.js').__spliterate; },{"../impls/$spliterate/spliterate.js":374}],235:[function(require,module,exports){ module.exports = require('../impls/$starts-with-any-seq/starts-with-any-seq.js').__startsWithAnySeq; },{"../impls/$starts-with-any-seq/starts-with-any-seq.js":376}],236:[function(require,module,exports){ module.exports = require('../impls/$starts-with-any/starts-with-any.js').__startsWithAny; },{"../impls/$starts-with-any/starts-with-any.js":378}],237:[function(require,module,exports){ module.exports = require('../impls/$starts-with-seq/starts-with-seq.js').__startsWithSeq; },{"../impls/$starts-with-seq/starts-with-seq.js":380}],238:[function(require,module,exports){ module.exports = require('../impls/$starts-with/starts-with.js').__startsWith; },{"../impls/$starts-with/starts-with.js":382}],239:[function(require,module,exports){ module.exports = require('../impls/$str/str.js').__str; },{"../impls/$str/str.js":384}],240:[function(require,module,exports){ module.exports = require('../impls/$take-last-or/take-last-or.js').__takeLastOr; },{"../impls/$take-last-or/take-last-or.js":386}],241:[function(require,module,exports){ module.exports = require('../impls/$take-last/take-last.js').__takeLast; },{"../impls/$take-last/take-last.js":388}],242:[function(require,module,exports){ module.exports = require('../impls/$take-sorted/take-sorted.js').__takeSorted; },{"../impls/$take-sorted/take-sorted.js":391}],243:[function(require,module,exports){ module.exports = require('../impls/$take-while/take-while.js').__takeWhile; },{"../impls/$take-while/take-while.js":393}],244:[function(require,module,exports){ module.exports = require('../impls/$take/take.js').__take; },{"../impls/$take/take.js":395}],245:[function(require,module,exports){ module.exports = require('../impls/$tap/tap.js').__tap; },{"../impls/$tap/tap.js":397}],246:[function(require,module,exports){ module.exports = require('../impls/$to-array/to-array.js').__toArray; },{"../impls/$to-array/to-array.js":399}],247:[function(require,module,exports){ module.exports = require('../impls/$to-object/to-object.js').__toObject; },{"../impls/$to-object/to-object.js":401}],248:[function(require,module,exports){ module.exports = require('../impls/$window-ahead/window-ahead.js').__windowAhead; },{"../impls/$window-ahead/window-ahead.js":403}],249:[function(require,module,exports){ module.exports = require('../impls/$window-behind/window-behind.js').__windowBehind; },{"../impls/$window-behind/window-behind.js":405}],250:[function(require,module,exports){ module.exports = require('../impls/$window/window.js').__window; },{"../impls/$window/window.js":407}],251:[function(require,module,exports){ module.exports = require('../impls/wrap-entries/wrap-entries.js').__wrapEntries; },{"../impls/wrap-entries/wrap-entries.js":470}],252:[function(require,module,exports){ module.exports = require('../impls/wrap-keys/wrap-keys.js').__wrapKeys; },{"../impls/wrap-keys/wrap-keys.js":471}],253:[function(require,module,exports){ module.exports = require('../impls/wrap-values/wrap-values.js').__wrapValues; },{"../impls/wrap-values/wrap-values.js":472}],254:[function(require,module,exports){ module.exports = require('../impls/$zip-all/zip-all.js').__zipAll; },{"../impls/$zip-all/zip-all.js":411}],255:[function(require,module,exports){ module.exports = require('../impls/$zip/zip.js').__zip; },{"../impls/$zip/zip.js":413}],256:[function(require,module,exports){ var _regeneratorRuntime = require("@babel/runtime/regenerator"); var _marked = /*#__PURE__*/_regeneratorRuntime.mark(__append); var _require = require('../../internal/iterable.js'), iterableCurry = _require.iterableCurry; function __append(source, value) { return _regeneratorRuntime.wrap(function __append$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: return _context.delegateYield(source, "t0", 1); case 1: _context.next = 3; return value; case 3: case "end": return _context.stop(); } } }, _marked); } exports.__append = __append; var append = /*#__PURE__*/iterableCurry(__append); exports.append = append; },{"../../internal/iterable.js":493,"@babel/runtime/regenerator":65}],257:[function(require,module,exports){ var _regeneratorRuntime = require("@babel/runtime/regenerator"); var _wrapAsyncGenerator = require("@babel/runtime/helpers/wrapAsyncGenerator"); var _awaitAsyncGenerator = require("@babel/runtime/helpers/awaitAsyncGenerator"); var _asyncIterator = require("@babel/runtime/helpers/asyncIterator"); var _asyncGeneratorDelegate = require("@babel/runtime/helpers/asyncGeneratorDelegate"); var _require = require('../../internal/async-iterable.js'), asyncIterableCurry = _require.asyncIterableCurry; function __asyncAppend(_x, _x2) { return _asyncAppend.apply(this, arguments); } exports.__asyncAppend = __asyncAppend; function _asyncAppend() { _asyncAppend = _wrapAsyncGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(source, value) { return _regeneratorRuntime.wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: return _context.delegateYield(_asyncGeneratorDelegate(_asyncIterator(source), _awaitAsyncGenerator), "t0", 1); case 1: _context.next = 3; return value; case 3: case "end": return _context.stop(); } } }, _callee); })); return _asyncAppend.apply(this, arguments); } var asyncAppend = /*#__PURE__*/asyncIterableCurry(__asyncAppend); exports.asyncAppend = asyncAppend; },{"../../internal/async-iterable.js":480,"@babel/runtime/helpers/asyncGeneratorDelegate":41,"@babel/runtime/helpers/asyncIterator":42,"@babel/runtime/helpers/awaitAsyncGenerator":44,"@babel/runtime/helpers/wrapAsyncGenerator":64,"@babel/runtime/regenerator":65}],258:[function(require,module,exports){ var _regeneratorRuntime = require("@babel/runtime/regenerator"); var _awaitAsyncGenerator = require("@babel/runtime/helpers/awaitAsyncGenerator"); var _wrapAsyncGenerator = require("@babel/runtime/helpers/wrapAsyncGenerator"); var _asyncIterator = require("@babel/runtime/helpers/asyncIterator"); var _require = require('../../internal/async-iterable.js'), asyncIterableCurry = _require.asyncIterableCurry; var _require2 = require('../$spliterate/async-spliterate.js'), __asyncSpliterate = _require2.__asyncSpliterate; function asyncBatchSpliterator(_x, _x2, _x3) { return _asyncBatchSpliterator.apply(this, arguments); } function _asyncBatchSpliterator() { _asyncBatchSpliterator = _wrapAsyncGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(split, _ref, source) { var size, i, _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, _value, value; return _regeneratorRuntime.wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: size = _ref.size; i = 0; _iteratorNormalCompletion = true; _didIteratorError = false; _context.prev = 4; _iterator = _asyncIterator(source); case 6: _context.next = 8; return _awaitAsyncGenerator(_iterator.next()); case 8: _step = _context.sent; _iteratorNormalCompletion = _step.done; _context.next = 12; return _awaitAsyncGenerator(_step.value); case 12: _value = _context.sent; if (_iteratorNormalCompletion) { _context.next = 25; break; } value = _value; if (!(i === size)) { _context.next = 19; break; } _context.next = 18; return split; case 18: i = 0; case 19: _context.next = 21; return value; case 21: i++; case 22: _iteratorNormalCompletion = true; _context.next = 6; break; case 25: _context.next = 31; break; case 27: _context.prev = 27; _context.t0 = _context["catch"](4); _didIteratorError = true; _iteratorError = _context.t0; case 31: _context.prev = 31; _context.prev = 32; if (!(!_iteratorNormalCompletion && _iterator["return"] != null)) { _context.next = 36; break; } _context.next = 36; return _awaitAsyncGenerator(_iterator["return"]()); case 36: _context.prev = 36; if (!_didIteratorError) { _context.next = 39; break; } throw _iteratorError; case 39: return _context.finish(36); case 40: return _context.finish(31); case 41: case "end": return _context.stop(); } } }, _callee, null, [[4, 27, 31, 41], [32,, 36, 40]]); })); return _asyncBatchSpliterator.apply(this, arguments); } function __asyncBatch(source, size) { return __asyncSpliterate(source, asyncBatchSpliterator, { size: size }); } exports.__asyncBatch = __asyncBatch; var asyncBatch = /*#__PURE__*/asyncIterableCurry(__asyncBatch, { validateArgs: function validateArgs(args) { if (typeof args[1] !== 'number' || args[1] < 1) { throw new TypeError('batch size should be a number greater than zero'); } } }); exports.asyncBatch = asyncBatch; },{"../$spliterate/async-spliterate.js":373,"../../internal/async-iterable.js":480,"@babel/runtime/helpers/asyncIterator":42,"@babel/runtime/helpers/awaitAsyncGenerator":44,"@babel/runtime/helpers/wrapAsyncGenerator":64,"@babel/runtime/regenerator":65}],259:[function(require,module,exports){ var _regeneratorRuntime = require("@babel/runtime/regenerator"); var _marked = /*#__PURE__*/_regeneratorRuntime.mark(batchSpliterator); function _createForOfIteratorHelper(o, allowArrayLike) { var it; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; } function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } var _require = require('../../internal/iterable.js'), iterableCurry = _require.iterableCurry; var _require2 = require('../$spliterate/spliterate.js'), __spliterate = _require2.__spliterate; function batchSpliterator(split, _ref, source) { var size, i, _iterator, _step, value; return _regeneratorRuntime.wrap(function batchSpliterator$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: size = _ref.size; i = 0; _iterator = _createForOfIteratorHelper(source); _context.prev = 3; _iterator.s(); case 5: if ((_step = _iterator.n()).done) { _context.next = 16; break; } value = _step.value; if (!(i === size)) { _context.next = 11; break; } _context.next = 10; return split; case 10: i = 0; case 11: _context.next = 13; return value; case 13: i++; case 14: _context.next = 5; break; case 16: _context.next = 21; break; case 18: _context.prev = 18; _context.t0 = _context["catch"](3); _iterator.e(_context.t0); case 21: _context.prev = 21; _iterator.f(); return _context.finish(21); case 24: case "end": return _context.stop(); } } }, _marked, null, [[3, 18, 21, 24]]); } function __batch(source, size) { return __spliterate(source, batchSpliterator, { size: size }); } exports.__batch = __batch; var batch = /*#__PURE__*/iterableCurry(__batch, { validateArgs: function validateArgs(args) { if (typeof args[1] !== 'number' || args[1] < 1) { throw new TypeError('batch size should be a number greater than zero'); } } }); exports.batch = batch; },{"../$spliterate/spliterate.js":374,"../../internal/iterable.js":493,"@babel/runtime/regenerator":65}],260:[function(require,module,exports){ var _regeneratorRuntime = require("@babel/runtime/regenerator"); var _asyncIterator = require("@babel/runtime/helpers/asyncIterator"); var _awaitAsyncGenerator = require("@babel/runtime/helpers/awaitAsyncGenerator"); var _wrapAsyncGenerator = require("@babel/runtime/helpers/wrapAsyncGenerator"); var _require = require('../../internal/async-iterable.js'), asyncIterableCurry = _require.asyncIterableCurry; var _require2 = require('../../internal/async-bisector.js'), AsyncBisector = _require2.AsyncBisector; var _require3 = require('../$to-array/async-to-array.js'), __asyncToArray = _require3.__asyncToArray; var _require4 = require('../$peekerate/async-peekerate.js'), __asyncPeekerate = _require4.__asyncPeekerate; function asyncIndexStrategy(_x, _x2, _x3) { return _asyncIndexStrategy.apply(this, arguments); } exports.asyncIndexStrategy = asyncIndexStrategy; function _asyncIndexStrategy() { _asyncIndexStrategy = _wrapAsyncGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(split, _ref, source) { var at, _source, idx, peekr; return _regeneratorRuntime.wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: at = _ref.at; if (!(at < 0)) { _context.next = 7; break; } _context.next = 4; return _awaitAsyncGenerator(__asyncToArray(source)); case 4: _context.t0 = _context.sent; _context.next = 8; break; case 7: _context.t0 = source; case 8: _source = _context.t0; idx = at < 0 ? _source.length + at : at; _context.next = 12; return _awaitAsyncGenerator(__asyncPeekerate(_source)); case 12: peekr = _context.sent; _context.prev = 13; case 14: if (peekr.done) { _context.next = 24; break; } if (!(peekr.index === idx)) { _context.next = 18; break; } _context.next = 18; return split; case 18: _context.next = 20; return peekr.value; case 20: _context.next = 22; return _awaitAsyncGenerator(peekr.advance()); case 22: _context.next = 14; break; case 24: _context.prev = 24; peekr["return"](); return _context.finish(24); case 27: case "end": return _context.stop(); } } }, _callee, null, [[13,, 24, 27]]); })); return _asyncIndexStrategy.apply(this, arguments); } function asyncConditionStrategy(_x4, _x5, _x6) { return _asyncConditionStrategy.apply(this, arguments); } exports.asyncConditionStrategy = asyncConditionStrategy; function _asyncConditionStrategy() { _asyncConditionStrategy = _wrapAsyncGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee2(split, _ref2, source) { var predicate, i, splat, _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, _value, value; return _regeneratorRuntime.wrap(function _callee2$(_context2) { while (1) { switch (_context2.prev = _context2.next) { case 0: predicate = _ref2.at; i = 0; splat = false; _iteratorNormalCompletion = true; _didIteratorError = false; _context2.prev = 5; _iterator = _asyncIterator(source); case 7: _context2.next = 9; return _awaitAsyncGenerator(_iterator.next()); case 9: _step = _context2.sent; _iteratorNormalCompletion = _step.done; _context2.next = 13; return _awaitAsyncGenerator(_step.value); case 13: _value = _context2.sent; if (_iteratorNormalCompletion) { _context2.next = 30; break; } value = _value; _context2.t0 = !splat; if (!_context2.t0) { _context2.next = 21; break; } _context2.next = 20; return _awaitAsyncGenerator(predicate(value, i++)); case 20: _context2.t0 = _context2.sent; case 21: if (!_context2.t0) { _context2.next = 25; break; } _context2.next = 24; return split; case 24: splat = true; case 25: _context2.next = 27; return value; case 27: _iteratorNormalCompletion = true; _context2.next = 7; break; case 30: _context2.next = 36; break; case 32: _context2.prev = 32; _context2.t1 = _context2["catch"](5); _didIteratorError = true; _iteratorError = _context2.t1; case 36: _context2.prev = 36; _context2.prev = 37; if (!(!_iteratorNormalCompletion && _iterator["return"] != null)) { _context2.next = 41; break; } _context2.next = 41; return _awaitAsyncGenerator(_iterator["return"]()); case 41: _context2.prev = 41; if (!_didIteratorError) { _context2.next = 44; break; } throw _iteratorError; case 44: return _context2.finish(41); case 45: return _context2.finish(36); case 46: case "end": return _context2.stop(); } } }, _callee2, null, [[5, 32, 36, 46], [37,, 41, 45]]); })); return _asyncConditionStrategy.apply(this, arguments); } function __asyncBisect(source, at) { var strategy = typeof at === 'number' ? asyncIndexStrategy : asyncConditionStrategy; return new AsyncBisector(source, strategy, { at: at }); } exports.__asyncBisect = __asyncBisect; var asyncBisect = /*#__PURE__*/asyncIterableCurry(__asyncBisect, { forceSync: true }); exports.asyncBisect = asyncBisect; },{"../$peekerate/async-peekerate.js":339,"../$to-array/async-to-array.js":398,"../../internal/async-bisector.js":476,"../../internal/async-iterable.js":480,"@babel/runtime/helpers/asyncIterator":42,"@babel/runtime/helpers/awaitAsyncGenerator":44,"@babel/runtime/helpers/wrapAsyncGenerator":64,"@babel/runtime/regenerator":65}],261:[function(require,module,exports){ function _createForOfIteratorHelper(o, allowArrayLike) { var it; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; } function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } var _regeneratorRuntime = require("@babel/runtime/regenerator"); var _marked = /*#__PURE__*/_regeneratorRuntime.mark(indexStrategy), _marked2 = /*#__PURE__*/_regeneratorRuntime.mark(conditionStrategy); var _require = require('../../internal/iterable.js'), iterableCurry = _require.iterableCurry; var _require2 = require('../../internal/bisector.js'), Bisector = _require2.Bisector; var _require3 = require('../$to-array/to-array.js'), __toArray = _require3.__toArray; var _require4 = require('../$peekerate/peekerate.js'), __peekerate = _require4.__peekerate; function indexStrategy(split, _ref, source) { var at, _source, idx, peekr; return _regeneratorRuntime.wrap(function indexStrategy$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: at = _ref.at; _source = at < 0 ? __toArray(source) : source; idx = at < 0 ? _source.length + at : at; peekr = __peekerate(_source); _context.prev = 4; case 5: if (peekr.done) { _context.next = 14; break; } if (!(peekr.index === idx)) { _context.next = 9; break; } _context.next = 9; return split; case 9: _context.next = 11; return peekr.value; case 11: peekr.advance(); _context.next = 5; break; case 14: _context.prev = 14; peekr["return"](); return _context.finish(14); case 17: case "end": return _context.stop(); } } }, _marked, null, [[4,, 14, 17]]); } exports.indexStrategy = indexStrategy; function conditionStrategy(split, _ref2, source) { var predicate, i, splat, _iterator, _step, value; return _regeneratorRuntime.wrap(function conditionStrategy$(_context2) { while (1) { switch (_context2.prev = _context2.next) { case 0: predicate = _ref2.at; i = 0; splat = false; _iterator = _createForOfIteratorHelper(source); _context2.prev = 4; _iterator.s(); case 6: if ((_step = _iterator.n()).done) { _context2.next = 16; break; } value = _step.value; if (!(!splat && predicate(value, i++))) { _context2.next = 12; break; } _context2.next = 11; return split; case 11: splat = true; case 12: _context2.next = 14; return value; case 14: _context2.next = 6; break; case 16: _context2.next = 21; break; case 18: _context2.prev = 18; _context2.t0 = _context2["catch"](4); _iterator.e(_context2.t0); case 21: _context2.prev = 21; _iterator.f(); return _context2.finish(21); case 24: case "end": return _context2.stop(); } } }, _marked2, null, [[4, 18, 21, 24]]); } exports.conditionStrategy = conditionStrategy; function __bisect(source, at) { var strategy = typeof at === 'number' ? indexStrategy : conditionStrategy; return new Bisector(source, strategy, { at: at }); } exports.__bisect = __bisect; var bisect = /*#__PURE__*/iterableCurry(__bisect, { forceSync: true }); exports.bisect = bisect; },{"../$peekerate/peekerate.js":340,"../$to-array/to-array.js":399,"../../internal/bisector.js":485,"../../internal/iterable.js":493,"@babel/runtime/regenerator":65}],262:[function(require,module,exports){ var _regeneratorRuntime = require("@babel/runtime/regenerator"); function _createForOfIteratorHelper(o, allowArrayLike) { var it; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; } function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } var _awaitAsyncGenerator = require("@babel/runtime/helpers/awaitAsyncGenerator"); var _wrapAsyncGenerator = require("@babel/runtime/helpers/wrapAsyncGenerator"); var _require = require('../../internal/async-iterable.js'), asyncIterableCurry = _require.asyncIterableCurry; var _require2 = require('../$interleave/async-interleave.js'), __asyncInterleave = _require2.__asyncInterleave; function asyncByComparison(_x, _x2) { return _asyncByComparison.apply(this, arguments); } function _asyncByComparison() { _asyncByComparison = _wrapAsyncGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(_ref, all) { var compare, candidate, _len, peekrs, _key, _iterator, _step, peekr, _args = arguments; return _regeneratorRuntime.wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: compare = _ref.compare; for (_len = _args.length, peekrs = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) { peekrs[_key - 2] = _args[_key]; } case 2: if (all.done) { _context.next = 12; break; } candidate = all.value; _iterator = _createForOfIteratorHelper(peekrs); try { for (_iterator.s(); !(_step = _iterator.n()).done;) { peekr = _step.value; if (!peekr.done && compare(peekr.value, candidate.value) < 0) { candidate = peekr; } } } catch (err) { _iterator.e(err); } finally { _iterator.f(); } _context.next = 8; return candidate.value; case 8: _context.next = 10; return _awaitAsyncGenerator(candidate.advance()); case 10: _context.next = 2; break; case 12: case "end": return _context.stop(); } } }, _callee); })); return _asyncByComparison.apply(this, arguments); } function __asyncCollate(sources, compare) { return __asyncInterleave(sources, asyncByComparison, { compare: compare }); } exports.__asyncCollate = __asyncCollate; var asyncCollate = /*#__PURE__*/asyncIterableCurry(__asyncCollate, { variadic: true }); exports.asyncCollate = asyncCollate; },{"../$interleave/async-interleave.js":321,"../../internal/async-iterable.js":480,"@babel/runtime/helpers/awaitAsyncGenerator":44,"@babel/runtime/helpers/wrapAsyncGenerator":64,"@babel/runtime/regenerator":65}],263:[function(require,module,exports){ var _regeneratorRuntime = require("@babel/runtime/regenerator"); var _marked = /*#__PURE__*/_regeneratorRuntime.mark(byComparison); function _createForOfIteratorHelper(o, allowArrayLike) { var it; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; } function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } var _require = require('../../internal/iterable.js'), iterableCurry = _require.iterableCurry; var _require2 = require('../$interleave/interleave.js'), __interleave = _require2.__interleave; function byComparison(_ref, all) { var compare, candidate, _len, peekrs, _key, _iterator, _step, peekr, _args = arguments; return _regeneratorRuntime.wrap(function byComparison$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: compare = _ref.compare; for (_len = _args.length, peekrs = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) { peekrs[_key - 2] = _args[_key]; } case 2: if (all.done) { _context.next = 11; break; } candidate = all.value; _iterator = _createForOfIteratorHelper(peekrs); try { for (_iterator.s(); !(_step = _iterator.n()).done;) { peekr = _step.value; if (!peekr.done && compare(peekr.value, candidate.value) < 0) { candidate = peekr; } } } catch (err) { _iterator.e(err); } finally { _iterator.f(); } _context.next = 8; return candidate.value; case 8: candidate.advance(); _context.next = 2; break; case 11: case "end": return _context.stop(); } } }, _marked); } function __collate(sources, compare) { return __interleave(sources, byComparison, { compare: compare }); } exports.__collate = __collate; var collate = /*#__PURE__*/iterableCurry(__collate, { variadic: true }); exports.collate = collate; },{"../$interleave/interleave.js":322,"../../internal/iterable.js":493,"@babel/runtime/regenerator":65}],264:[function(require,module,exports){ var _slicedToArray = require("@babel/runtime/helpers/slicedToArray"); var _require = require('../../internal/async-iterable.js'), asyncEnsureIterable = _require.asyncEnsureIterable; var _require2 = require('../../internal/curry.js'), curry = _require2.curry; var _require3 = require('../$zip/async-zip.js'), __asyncZip = _require3.__asyncZip; var _require4 = require('../$filter/async-filter.js'), __asyncFilter = _require4.__asyncFilter; var _require5 = require('../$map/async-map.js'), __asyncMap = _require5.__asyncMap; function __asyncCompress(source, included) { return __asyncMap(__asyncFilter(__asyncZip([source, included]), function (_ref) { var _ref2 = _slicedToArray(_ref, 2), isIncluded = _ref2[1]; return isIncluded; }), function (_ref3) { var _ref4 = _slicedToArray(_ref3, 1), value = _ref4[0]; return value; }); } exports.__asyncCompress = __asyncCompress; var asyncCompress = /*#__PURE__*/curry(function $compress(source, included) { return __asyncCompress(asyncEnsureIterable(source), asyncEnsureIterable(included)); }); exports.asyncCompress = asyncCompress; },{"../$filter/async-filter.js":288,"../$map/async-map.js":337,"../$zip/async-zip.js":412,"../../internal/async-iterable.js":480,"../../internal/curry.js":488,"@babel/runtime/helpers/slicedToArray":59}],265:[function(require,module,exports){ var _slicedToArray = require("@babel/runtime/helpers/slicedToArray"); var _require = require('../../internal/iterable.js'), ensureIterable = _require.ensureIterable; var _require2 = require('../../internal/curry.js'), curry = _require2.curry; var _require3 = require('../$zip/zip.js'), __zip = _require3.__zip; var _require4 = require('../$filter/filter.js'), __filter = _require4.__filter; var _require5 = require('../$map/map.js'), __map = _require5.__map; function __compress(source, included) { return __map(__filter(__zip([source, included]), function (_ref) { var _ref2 = _slicedToArray(_ref, 2), isIncluded = _ref2[1]; return isIncluded; }), function (_ref3) { var _ref4 = _slicedToArray(_ref3, 1), value = _ref4[0]; return value; }); } exports.__compress = __compress; var compress = /*#__PURE__*/curry(function $compress(source, included) { return __compress(ensureIterable(source), ensureIterable(included)); }); exports.compress = compress; },{"../$filter/filter.js":289,"../$map/map.js":338,"../$zip/zip.js":413,"../../internal/curry.js":488,"../../internal/iterable.js":493,"@babel/runtime/helpers/slicedToArray":59}],266:[function(require,module,exports){ var _regeneratorRuntime = require("@babel/runtime/regenerator"); var _wrapAsyncGenerator = require("@babel/runtime/helpers/wrapAsyncGenerator"); var _awaitAsyncGenerator = require("@babel/runtime/helpers/awaitAsyncGenerator"); var _asyncIterator = require("@babel/runtime/helpers/asyncIterator"); var _asyncGeneratorDelegate = require("@babel/runtime/helpers/asyncGeneratorDelegate"); var _require = require('../../internal/async-iterable.js'), asyncWrapWithIterableIterator = _require.asyncWrapWithIterableIterator, asyncEnsureIterable = _require.asyncEnsureIterable; function __asyncConcat() { return _asyncConcat.apply(this, arguments); } exports.__asyncConcat = __asyncConcat; function _asyncConcat() { _asyncConcat = _wrapAsyncGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee() { var _len, sources, _key, _i, _sources, iterable, _args = arguments; return _regeneratorRuntime.wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: for (_len = _args.length, sources = new Array(_len), _key = 0; _key < _len; _key++) { sources[_key] = _args[_key]; } _i = 0, _sources = sources; case 2: if (!(_i < _sources.length)) { _context.next = 8; break; } iterable = _sources[_i]; return _context.delegateYield(_asyncGeneratorDelegate(_asyncIterator(asyncEnsureIterable(iterable)), _awaitAsyncGenerator), "t0", 5); case 5: _i++; _context.next = 2; break; case 8: case "end": return _context.stop(); } } }, _callee); })); return _asyncConcat.apply(this, arguments); } var asyncConcat = /*#__PURE__*/asyncWrapWithIterableIterator(__asyncConcat); exports.asyncConcat = asyncConcat; },{"../../internal/async-iterable.js":480,"@babel/runtime/helpers/asyncGeneratorDelegate":41,"@babel/runtime/helpers/asyncIterator":42,"@babel/runtime/helpers/awaitAsyncGenerator":44,"@babel/runtime/helpers/wrapAsyncGenerator":64,"@babel/runtime/regenerator":65}],267:[function(require,module,exports){ var _regeneratorRuntime = require("@babel/runtime/regenerator"); var _marked = /*#__PURE__*/_regeneratorRuntime.mark(__concat); var _require = require('../../internal/iterable.js'), wrapWithIterableIterator = _require.wrapWithIterableIterator, ensureIterable = _require.ensureIterable; function __concat() { var _len, sources, _key, _i, _sources, iterable, _args = arguments; return _regeneratorRuntime.wrap(function __concat$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: for (_len = _args.length, sources = new Array(_len), _key = 0; _key < _len; _key++) { sources[_key] = _args[_key]; } _i = 0, _sources = sources; case 2: if (!(_i < _sources.length)) { _context.next = 8; break; } iterable = _sources[_i]; return _context.delegateYield(ensureIterable(iterable), "t0", 5); case 5: _i++; _context.next = 2; break; case 8: case "end": return _context.stop(); } } }, _marked); } exports.__concat = __concat; var concat = /*#__PURE__*/wrapWithIterableIterator(__concat); exports.concat = concat; },{"../../internal/iterable.js":493,"@babel/runtime/regenerator":65}],268:[function(require,module,exports){ var _regeneratorRuntime = require("@babel/runtime/regenerator"); var _asyncToGenerator = require("@babel/runtime/helpers/asyncToGenerator"); var _asyncIterator = require("@babel/runtime/helpers/asyncIterator"); var _require = require('../../internal/async-iterable.js'), asyncIterableCurry = _require.asyncIterableCurry; function __asyncConsume(_x) { return _asyncConsume.apply(this, arguments); } function _asyncConsume() { _asyncConsume = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(iterable) { var _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, _value, _; return _regeneratorRuntime.wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: _iteratorNormalCompletion = true; _didIteratorError = false; _context.prev = 2; _iterator = _asyncIterator(iterable); case 4: _context.next = 6; return _iterator.next(); case 6: _step = _context.sent; _iteratorNormalCompletion = _step.done; _context.next = 10; return _step.value; case 10: _value = _context.sent; if (_iteratorNormalCompletion) { _context.next = 16; break; } _ = _value; case 13: _iteratorNormalCompletion = true; _context.next = 4; break; case 16: _context.next = 22; break; case 18: _context.prev = 18; _context.t0 = _context["catch"](2); _didIteratorError = true; _iteratorError = _context.t0; case 22: _context.prev = 22; _context.prev = 23; if (!(!_iteratorNormalCompletion && _iterator["return"] != null)) { _context.next = 27; break; } _context.next = 27; return _iterator["return"](); case 27: _context.prev = 27; if (!_didIteratorError) { _context.next = 30; break; } throw _iteratorError; case 30: return _context.finish(27); case 31: return _context.finish(22); case 32: case "end": return _context.stop(); } } }, _callee, null, [[2, 18, 22, 32], [23,, 27, 31]]); })); return _asyncConsume.apply(this, arguments); } exports.__asyncConsume = __asyncConsume; var asyncConsume = /*#__PURE__*/asyncIterableCurry(__asyncConsume, { reduces: true }); exports.asyncConsume = asyncConsume; },{"../../internal/async-iterable.js":480,"@babel/runtime/helpers/asyncIterator":42,"@babel/runtime/helpers/asyncToGenerator":43,"@babel/runtime/regenerator":65}],269:[function(require,module,exports){ function _createForOfIteratorHelper(o, allowArrayLike) { var it; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; } function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } var _require = require('../../internal/iterable.js'), iterableCurry = _require.iterableCurry; function __consume(iterable) { var _iterator = _createForOfIteratorHelper(iterable), _step; try { for (_iterator.s(); !(_step = _iterator.n()).done;) { var _ = _step.value; } } catch (err) { _iterator.e(err); } finally { _iterator.f(); } } exports.__consume = __consume; var consume = /*#__PURE__*/iterableCurry(__consume, { reduces: true }); exports.consume = consume; },{"../../internal/iterable.js":493}],270:[function(require,module,exports){ var _regeneratorRuntime = require("@babel/runtime/regenerator"); var _wrapAsyncGenerator = require("@babel/runtime/helpers/wrapAsyncGenerator"); var _awaitAsyncGenerator = require("@babel/runtime/helpers/awaitAsyncGenerator"); var _asyncIterator = require("@babel/runtime/helpers/asyncIterator"); var _asyncGeneratorDelegate = require("@babel/runtime/helpers/asyncGeneratorDelegate"); var _require = require('../../internal/async-iterable.js'), asyncIterableCurry = _require.asyncIterableCurry; var _require2 = require('../$to-array/async-to-array.js'), __asyncToArray = _require2.__asyncToArray; var _require3 = require('./cycle-times.js'), __cycleTimes = _require3.__cycleTimes; function __asyncCycleTimes(_x, _x2) { return _asyncCycleTimes.apply(this, arguments); } exports.__asyncCycleTimes = __asyncCycleTimes; function _asyncCycleTimes() { _asyncCycleTimes = _wrapAsyncGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(source, n) { return _regeneratorRuntime.wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: _context.t0 = _asyncGeneratorDelegate; _context.t1 = _asyncIterator; _context.t2 = __cycleTimes; _context.next = 5; return _awaitAsyncGenerator(__asyncToArray(source)); case 5: _context.t3 = _context.sent; _context.t4 = n; _context.t5 = (0, _context.t2)(_context.t3, _context.t4); _context.t6 = (0, _context.t1)(_context.t5); _context.t7 = _awaitAsyncGenerator; return _context.delegateYield((0, _context.t0)(_context.t6, _context.t7), "t8", 11); case 11: case "end": return _context.stop(); } } }, _callee); })); return _asyncCycleTimes.apply(this, arguments); } var asyncCycleTimes = /*#__PURE__*/asyncIterableCurry(__asyncCycleTimes); exports.asyncCycleTimes = asyncCycleTimes; },{"../$to-array/async-to-array.js":398,"../../internal/async-iterable.js":480,"./cycle-times.js":271,"@babel/runtime/helpers/asyncGeneratorDelegate":41,"@babel/runtime/helpers/asyncIterator":42,"@babel/runtime/helpers/awaitAsyncGenerator":44,"@babel/runtime/helpers/wrapAsyncGenerator":64,"@babel/runtime/regenerator":65}],271:[function(require,module,exports){ var _regeneratorRuntime = require("@babel/runtime/regenerator"); var _marked = /*#__PURE__*/_regeneratorRuntime.mark(__cycleTimes); var _require = require('../../internal/iterable.js'), iterableCurry = _require.iterableCurry; var _require2 = require('../$to-array/to-array.js'), __toArray = _require2.__toArray; function __cycleTimes(source, n) { var arr; return _regeneratorRuntime.wrap(function __cycleTimes$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: arr = Array.isArray(source) ? source : __toArray(source); if (arr.length) { _context.next = 3; break; } return _context.abrupt("return"); case 3: if (!n--) { _context.next = 7; break; } return _context.delegateYield(arr, "t0", 5); case 5: _context.next = 3; break; case 7: case "end": return _context.stop(); } } }, _marked); } exports.__cycleTimes = __cycleTimes; var cycleTimes = /*#__PURE__*/iterableCurry(__cycleTimes); exports.cycleTimes = cycleTimes; },{"../$to-array/to-array.js":399,"../../internal/iterable.js":493,"@babel/runtime/regenerator":65}],272:[function(require,module,exports){ var _require = require('../../internal/async-iterable.js'), asyncIterableCurry = _require.asyncIterableCurry; var _require2 = require('../$cycle-times/async-cycle-times.js'), __asyncCycleTimes = _require2.__asyncCycleTimes; function __asyncCycle(source) { return __asyncCycleTimes(source, Infinity); } exports.__asyncCycle = __asyncCycle; var asyncCycle = /*#__PURE__*/asyncIterableCurry(__asyncCycle); exports.asyncCycle = asyncCycle; },{"../$cycle-times/async-cycle-times.js":270,"../../internal/async-iterable.js":480}],273:[function(require,module,exports){ var _require = require('../../internal/iterable.js'), iterableCurry = _require.iterableCurry; var _require2 = require('../$cycle-times/cycle-times.js'), __cycleTimes = _require2.__cycleTimes; function __cycle(source) { return __cycleTimes(source, Infinity); } exports.__cycle = __cycle; var cycle = /*#__PURE__*/iterableCurry(__cycle); exports.cycle = cycle; },{"../$cycle-times/cycle-times.js":271,"../../internal/iterable.js":493}],274:[function(require,module,exports){ var _asyncToGenerator = require("@babel/runtime/helpers/asyncToGenerator"); var _regeneratorRuntime = require("@babel/runtime/regenerator"); function _createForOfIteratorHelper(o, allowArrayLike) { var it; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; } function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } var _asyncIterator = require("@babel/runtime/helpers/asyncIterator"); var _awaitAsyncGenerator = require("@babel/runtime/helpers/awaitAsyncGenerator"); var _wrapAsyncGenerator = require("@babel/runtime/helpers/wrapAsyncGenerator"); var _require = require('../../internal/async-iterable.js'), asyncIsIterable = _require.asyncIsIterable, asyncIsWrappable = _require.asyncIsWrappable; var _require2 = require('../$map/map.js'), __map = _require2.__map; var _require3 = require('../$every/every.js'), __every = _require3.__every; var _require4 = require('../$zip-all/async-zip-all.js'), __asyncZipAll = _require4.__asyncZipAll; var _require5 = require('../$slice/slice.js'), __sliceFromStart = _require5.__sliceFromStart; var none = Symbol('none'); var zipAllConfig = { filler: none }; var asyncEmpty = /*#__PURE__*/function () { var _ref = _wrapAsyncGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee() { return _regeneratorRuntime.wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: case "end": return _context.stop(); } } }, _callee); })); return function asyncEmpty() { return _ref.apply(this, arguments); }; }(); var asyncIterableOrEmpty = function asyncIterableOrEmpty(value) { return value == null ? asyncEmpty() : value; }; function _asyncDeepEqual(_x, _x2, _x3) { return _asyncDeepEqual2.apply(this, arguments); } function _asyncDeepEqual2() { _asyncDeepEqual2 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee2(values, same, isIterable) { var depth, _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, _value, stepValues, firstValue, _iterator2, _step2, value, _args2 = arguments; return _regeneratorRuntime.wrap(function _callee2$(_context2) { while (1) { switch (_context2.prev = _context2.next) { case 0: depth = _args2.length > 3 && _args2[3] !== undefined ? _args2[3] : 0; if (!__every(values, function (value) { return typeof value !== 'string' && isIterable(value); })) { _context2.next = 40; break; } _iteratorNormalCompletion = true; _didIteratorError = false; _context2.prev = 4; _iterator = _asyncIterator(__asyncZipAll(__map(values, asyncIterableOrEmpty), zipAllConfig)); case 6: _context2.next = 8; return _iterator.next(); case 8: _step = _context2.sent; _iteratorNormalCompletion = _step.done; _context2.next = 12; return _step.value; case 12: _value = _context2.sent; if (_iteratorNormalCompletion) { _context2.next = 22; break; } stepValues = _value; _context2.next = 17; return _asyncDeepEqual(stepValues, same, isIterable, depth + 1); case 17: if (_context2.sent) { _context2.next = 19; break; } return _context2.abrupt("return", false); case 19: _iteratorNormalCompletion = true; _context2.next = 6; break; case 22: _context2.next = 28; break; case 24: _context2.prev = 24; _context2.t0 = _context2["catch"](4); _didIteratorError = true; _iteratorError = _context2.t0; case 28: _context2.prev = 28; _context2.prev = 29; if (!(!_iteratorNormalCompletion && _iterator["return"] != null)) { _context2.next = 33; break; } _context2.next = 33; return _iterator["return"](); case 33: _context2.prev = 33; if (!_didIteratorError) { _context2.next = 36; break; } throw _iteratorError; case 36: return _context2.finish(33); case 37: return _context2.finish(28); case 38: _context2.next = 58; break; case 40: firstValue = values[0]; _iterator2 = _createForOfIteratorHelper(__sliceFromStart(values, 1)); _context2.prev = 42; _iterator2.s(); case 44: if ((_step2 = _iterator2.n()).done) { _context2.next = 50; break; } value = _step2.value; if (same(value, firstValue, depth)) { _context2.next = 48; break; } return _context2.abrupt("return", false); case 48: _context2.next = 44; break; case 50: _context2.next = 55; break; case 52: _context2.prev = 52; _context2.t1 = _context2["catch"](42); _iterator2.e(_context2.t1); case 55: _context2.prev = 55; _iterator2.f(); return _context2.finish(55); case 58: return _context2.abrupt("return", true); case 59: case "end": return _context2.stop(); } } }, _callee2, null, [[4, 24, 28, 38], [29,, 33, 37], [42, 52, 55, 58]]); })); return _asyncDeepEqual2.apply(this, arguments); } exports._asyncDeepEqual = _asyncDeepEqual; function __asyncDeepEqual(values) { var same = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : Object.is; var coerceNil = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true; return values.length <= 1 ? true : _asyncDeepEqual(values, same, coerceNil ? asyncIsWrappable : asyncIsIterable); } exports.__asyncDeepEqual = __asyncDeepEqual; function asyncDeepEqual() { for (var _len = arguments.length, values = new Array(_len), _key = 0; _key < _len; _key++) { values[_key] = arguments[_key]; } return __asyncDeepEqual(values); } exports.asyncDeepEqual = asyncDeepEqual; },{"../$every/every.js":287,"../$map/map.js":338,"../$slice/slice.js":354,"../$zip-all/async-zip-all.js":410,"../../internal/async-iterable.js":480,"@babel/runtime/helpers/asyncIterator":42,"@babel/runtime/helpers/asyncToGenerator":43,"@babel/runtime/helpers/awaitAsyncGenerator":44,"@babel/runtime/helpers/wrapAsyncGenerator":64,"@babel/runtime/regenerator":65}],275:[function(require,module,exports){ var _regeneratorRuntime = require("@babel/runtime/regenerator"); function _createForOfIteratorHelper(o, allowArrayLike) { var it; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; } function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } var _require = require('../../internal/iterable.js'), isIterable = _require.isIterable, isWrappable = _require.isWrappable; var _require2 = require('../$map/map.js'), __map = _require2.__map; var _require3 = require('../$every/every.js'), __every = _require3.__every; var _require4 = require('../$zip-all/zip-all.js'), __zipAll = _require4.__zipAll; var _require5 = require('../$slice/slice.js'), __sliceFromStart = _require5.__sliceFromStart; var none = Symbol('none'); var zipAllConfig = { filler: none }; var empty = /*#__PURE__*/_regeneratorRuntime.mark(function empty() { return _regeneratorRuntime.wrap(function empty$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: case "end": return _context.stop(); } } }, empty); }); var iterableOrEmpty = function iterableOrEmpty(value) { return value == null ? empty() : value; }; function _deepEqual(values, same, isIterable) { var depth = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 0; if (__every(values, function (value) { return typeof value !== 'string' && isIterable(value); })) { var _iterator = _createForOfIteratorHelper(__zipAll(__map(values, iterableOrEmpty), zipAllConfig)), _step; try { for (_iterator.s(); !(_step = _iterator.n()).done;) { var stepValues = _step.value; if (!_deepEqual(stepValues, same, isIterable, depth + 1)) return false; } } catch (err) { _iterator.e(err); } finally { _iterator.f(); } } else { var firstValue = values[0]; var _iterator2 = _createForOfIteratorHelper(__sliceFromStart(values, 1)), _step2; try { for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) { var value = _step2.value; if (!same(value, firstValue, depth)) return false; } } catch (err) { _iterator2.e(err); } finally { _iterator2.f(); } } return true; } exports._deepEqual = _deepEqual; function __deepEqual(values) { var same = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : Object.is; var coerceNil = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true; return values.length <= 1 ? true : _deepEqual(values, same, coerceNil ? isWrappable : isIterable); } exports.__deepEqual = __deepEqual; function deepEqual() { for (var _len = arguments.length, values = new Array(_len), _key = 0; _key < _len; _key++) { values[_key] = arguments[_key]; } return __deepEqual(values); } exports.deepEqual = deepEqual; },{"../$every/every.js":287,"../$map/map.js":338,"../$slice/slice.js":354,"../$zip-all/zip-all.js":411,"../../internal/iterable.js":493,"@babel/runtime/regenerator":65}],276:[function(require,module,exports){ var _regeneratorRuntime = require("@babel/runtime/regenerator"); var _awaitAsyncGenerator = require("@babel/runtime/helpers/awaitAsyncGenerator"); var _wrapAsyncGenerator = require("@babel/runtime/helpers/wrapAsyncGenerator"); var _asyncIterator = require("@babel/runtime/helpers/asyncIterator"); var _require = require('../../internal/async-iterable.js'), asyncIterableCurry = _require.asyncIterableCurry; function __asyncDistinct(_x, _x2) { return _asyncDistinct.apply(this, arguments); } exports.__asyncDistinct = __asyncDistinct; function _asyncDistinct() { _asyncDistinct = _wrapAsyncGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(source, selector) { var set, _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, _value, value, key; return _regeneratorRuntime.wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: set = new Set(); _iteratorNormalCompletion = true; _didIteratorError = false; _context.prev = 3; _iterator = _asyncIterator(source); case 5: _context.next = 7; return _awaitAsyncGenerator(_iterator.next()); case 7: _step = _context.sent; _iteratorNormalCompletion = _step.done; _context.next = 11; return _awaitAsyncGenerator(_step.value); case 11: _value = _context.sent; if (_iteratorNormalCompletion) { _context.next = 23; break; } value = _value; key = selector ? selector(value) : value; if (!set.has(key)) { _context.next = 17; break; } return _context.abrupt("continue", 20); case 17: set.add(key); _context.next = 20; return value; case 20: _iteratorNormalCompletion = true; _context.next = 5; break; case 23: _context.next = 29; break; case 25: _context.prev = 25; _context.t0 = _context["catch"](3); _didIteratorError = true; _iteratorError = _context.t0; case 29: _context.prev = 29; _context.prev = 30; if (!(!_iteratorNormalCompletion && _iterator["return"] != null)) { _context.next = 34; break; } _context.next = 34; return _awaitAsyncGenerator(_iterator["return"]()); case 34: _context.prev = 34; if (!_didIteratorError) { _context.next = 37; break; } throw _iteratorError; case 37: return _context.finish(34); case 38: return _context.finish(29); case 39: case "end": return _context.stop(); } } }, _callee, null, [[3, 25, 29, 39], [30,, 34, 38]]); })); return _asyncDistinct.apply(this, arguments); } var asyncDistinct = asyncIterableCurry(__asyncDistinct, { minArgs: 0, maxArgs: 1 }); exports.asyncDistinct = asyncDistinct; },{"../../internal/async-iterable.js":480,"@babel/runtime/helpers/asyncIterator":42,"@babel/runtime/helpers/awaitAsyncGenerator":44,"@babel/runtime/helpers/wrapAsyncGenerator":64,"@babel/runtime/regenerator":65}],277:[function(require,module,exports){ var _regeneratorRuntime = require("@babel/runtime/regenerator"); var _marked = /*#__PURE__*/_regeneratorRuntime.mark(__distinct); function _createForOfIteratorHelper(o, allowArrayLike) { var it; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; } function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } var _require = require('../../internal/iterable.js'), iterableCurry = _require.iterableCurry; function __distinct(source, selector) { var set, _iterator, _step, value, key; return _regeneratorRuntime.wrap(function __distinct$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: set = new Set(); _iterator = _createForOfIteratorHelper(source); _context.prev = 2; _iterator.s(); case 4: if ((_step = _iterator.n()).done) { _context.next = 14; break; } value = _step.value; key = selector ? selector(value) : value; if (!set.has(key)) { _context.next = 9; break; } return _context.abrupt("continue", 12); case 9: set.add(key); _context.next = 12; return value; case 12: _context.next = 4; break; case 14: _context.next = 19; break; case 16: _context.prev = 16; _context.t0 = _context["catch"](2); _iterator.e(_context.t0); case 19: _context.prev = 19; _iterator.f(); return _context.finish(19); case 22: case "end": return _context.stop(); } } }, _marked, null, [[2, 16, 19, 22]]); } exports.__distinct = __distinct; var distinct = iterableCurry(__distinct, { minArgs: 0, maxArgs: 1 }); exports.distinct = distinct; },{"../../internal/iterable.js":493,"@babel/runtime/regenerator":65}],278:[function(require,module,exports){ var _regeneratorRuntime = require("@babel/runtime/regenerator"); var _awaitAsyncGenerator = require("@babel/runtime/helpers/awaitAsyncGenerator"); var _wrapAsyncGenerator = require("@babel/runtime/helpers/wrapAsyncGenerator"); var _asyncIterator = require("@babel/runtime/helpers/asyncIterator"); var _require = require('../../internal/async-iterable.js'), asyncIterableCurry = _require.asyncIterableCurry; function __asyncDropWhile(_x, _x2) { return _asyncDropWhile.apply(this, arguments); } exports.__asyncDropWhile = __asyncDropWhile; function _asyncDropWhile() { _asyncDropWhile = _wrapAsyncGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(source, predicate) { var drop, c, _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, _value, value; return _regeneratorRuntime.wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: drop = true; c = 0; _iteratorNormalCompletion = true; _didIteratorError = false; _context.prev = 4; _iterator = _asyncIterator(source); case 6: _context.next = 8; return _awaitAsyncGenerator(_iterator.next()); case 8: _step = _context.sent; _iteratorNormalCompletion = _step.done; _context.next = 12; return _awaitAsyncGenerator(_step.value); case 12: _value = _context.sent; if (_iteratorNormalCompletion) { _context.next = 29; break; } value = _value; if (drop) { _context.next = 20; break; } _context.next = 18; return value; case 18: _context.next = 26; break; case 20: _context.next = 22; return _awaitAsyncGenerator(predicate(value, c++)); case 22: drop = _context.sent; if (drop) { _context.next = 26; break; } _context.next = 26; return value; case 26: _iteratorNormalCompletion = true; _context.next = 6; break; case 29: _context.next = 35; break; case 31: _context.prev = 31; _context.t0 = _context["catch"](4); _didIteratorError = true; _iteratorError = _context.t0; case 35: _context.prev = 35; _context.prev = 36; if (!(!_iteratorNormalCompletion && _iterator["return"] != null)) { _context.next = 40; break; } _context.next = 40; return _awaitAsyncGenerator(_iterator["return"]()); case 40: _context.prev = 40; if (!_didIteratorError) { _context.next = 43; break; } throw _iteratorError; case 43: return _context.finish(40); case 44: return _context.finish(35); case 45: case "end": return _context.stop(); } } }, _callee, null, [[4, 31, 35, 45], [36,, 40, 44]]); })); return _asyncDropWhile.apply(this, arguments); } var asyncDropWhile = /*#__PURE__*/asyncIterableCurry(__asyncDropWhile); exports.asyncDropWhile = asyncDropWhile; },{"../../internal/async-iterable.js":480,"@babel/runtime/helpers/asyncIterator":42,"@babel/runtime/helpers/awaitAsyncGenerator":44,"@babel/runtime/helpers/wrapAsyncGenerator":64,"@babel/runtime/regenerator":65}],279:[function(require,module,exports){ var _regeneratorRuntime = require("@babel/runtime/regenerator"); var _marked = /*#__PURE__*/_regeneratorRuntime.mark(__dropWhile); function _createForOfIteratorHelper(o, allowArrayLike) { var it; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; } function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } var _require = require('../../internal/iterable.js'), iterableCurry = _require.iterableCurry; function __dropWhile(source, predicate) { var drop, c, _iterator, _step, value; return _regeneratorRuntime.wrap(function __dropWhile$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: drop = true; c = 0; _iterator = _createForOfIteratorHelper(source); _context.prev = 3; _iterator.s(); case 5: if ((_step = _iterator.n()).done) { _context.next = 18; break; } value = _step.value; if (drop) { _context.next = 12; break; } _context.next = 10; return value; case 10: _context.next = 16; break; case 12: drop = predicate(value, c++); if (drop) { _context.next = 16; break; } _context.next = 16; return value; case 16: _context.next = 5; break; case 18: _context.next = 23; break; case 20: _context.prev = 20; _context.t0 = _context["catch"](3); _iterator.e(_context.t0); case 23: _context.prev = 23; _iterator.f(); return _context.finish(23); case 26: case "end": return _context.stop(); } } }, _marked, null, [[3, 20, 23, 26]]); } exports.__dropWhile = __dropWhile; var dropWhile = /*#__PURE__*/iterableCurry(__dropWhile); exports.dropWhile = dropWhile; },{"../../internal/iterable.js":493,"@babel/runtime/regenerator":65}],280:[function(require,module,exports){ var _regeneratorRuntime = require("@babel/runtime/regenerator"); var _awaitAsyncGenerator = require("@babel/runtime/helpers/awaitAsyncGenerator"); var _wrapAsyncGenerator = require("@babel/runtime/helpers/wrapAsyncGenerator"); var _asyncIterator = require("@babel/runtime/helpers/asyncIterator"); var _require = require('../../internal/async-iterable.js'), asyncIterableCurry = _require.asyncIterableCurry; function __asyncDrop(_x, _x2) { return _asyncDrop.apply(this, arguments); } exports.__asyncDrop = __asyncDrop; function _asyncDrop() { _asyncDrop = _wrapAsyncGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(iterable, n) { var i, _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, _value, value; return _regeneratorRuntime.wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: i = 0; _iteratorNormalCompletion = true; _didIteratorError = false; _context.prev = 3; _iterator = _asyncIterator(iterable); case 5: _context.next = 7; return _awaitAsyncGenerator(_iterator.next()); case 7: _step = _context.sent; _iteratorNormalCompletion = _step.done; _context.next = 11; return _awaitAsyncGenerator(_step.value); case 11: _value = _context.sent; if (_iteratorNormalCompletion) { _context.next = 20; break; } value = _value; if (!(i++ >= n)) { _context.next = 17; break; } _context.next = 17; return value; case 17: _iteratorNormalCompletion = true; _context.next = 5; break; case 20: _context.next = 26; break; case 22: _context.prev = 22; _context.t0 = _context["catch"](3); _didIteratorError = true; _iteratorError = _context.t0; case 26: _context.prev = 26; _context.prev = 27; if (!(!_iteratorNormalCompletion && _iterator["return"] != null)) { _context.next = 31; break; } _context.next = 31; return _awaitAsyncGenerator(_iterator["return"]()); case 31: _context.prev = 31; if (!_didIteratorError) { _context.next = 34; break; } throw _iteratorError; case 34: return _context.finish(31); case 35: return _context.finish(26); case 36: case "end": return _context.stop(); } } }, _callee, null, [[3, 22, 26, 36], [27,, 31, 35]]); })); return _asyncDrop.apply(this, arguments); } var asyncDrop = /*#__PURE__*/asyncIterableCurry(__asyncDrop); exports.asyncDrop = asyncDrop; },{"../../internal/async-iterable.js":480,"@babel/runtime/helpers/asyncIterator":42,"@babel/runtime/helpers/awaitAsyncGenerator":44,"@babel/runtime/helpers/wrapAsyncGenerator":64,"@babel/runtime/regenerator":65}],281:[function(require,module,exports){ var _regeneratorRuntime = require("@babel/runtime/regenerator"); var _marked = /*#__PURE__*/_regeneratorRuntime.mark(__drop); function _createForOfIteratorHelper(o, allowArrayLike) { var it; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; } function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } var _require = require('../../internal/iterable.js'), iterableCurry = _require.iterableCurry; function __drop(iterable, n) { var i, _iterator, _step, value; return _regeneratorRuntime.wrap(function __drop$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: i = 0; _iterator = _createForOfIteratorHelper(iterable); _context.prev = 2; _iterator.s(); case 4: if ((_step = _iterator.n()).done) { _context.next = 11; break; } value = _step.value; if (!(i++ >= n)) { _context.next = 9; break; } _context.next = 9; return value; case 9: _context.next = 4; break; case 11: _context.next = 16; break; case 13: _context.prev = 13; _context.t0 = _context["catch"](2); _iterator.e(_context.t0); case 16: _context.prev = 16; _iterator.f(); return _context.finish(16); case 19: case "end": return _context.stop(); } } }, _marked, null, [[2, 13, 16, 19]]); } exports.__drop = __drop; var drop = /*#__PURE__*/iterableCurry(__drop); exports.drop = drop; },{"../../internal/iterable.js":493,"@babel/runtime/regenerator":65}],282:[function(require,module,exports){ var _require = require('../../internal/async-iterable.js'), asyncIterableCurry = _require.asyncIterableCurry; var _require2 = require('../$map/async-map.js'), __asyncMap = _require2.__asyncMap; function __asyncEnumerate(source) { var start = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; return __asyncMap(source, function (value, i) { return [start + i, value]; }); } exports.__asyncEnumerate = __asyncEnumerate; var asyncEnumerate = /*#__PURE__*/asyncIterableCurry(__asyncEnumerate, { minArgs: 0, maxArgs: 1 }); exports.asyncEnumerate = asyncEnumerate; },{"../$map/async-map.js":337,"../../internal/async-iterable.js":480}],283:[function(require,module,exports){ var _require = require('../../internal/iterable.js'), iterableCurry = _require.iterableCurry; var _require2 = require('../$map/map.js'), __map = _require2.__map; function __enumerate(source) { var start = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; return __map(source, function (value, i) { return [start + i, value]; }); } exports.__enumerate = __enumerate; var enumerate = /*#__PURE__*/iterableCurry(__enumerate, { minArgs: 0, maxArgs: 1 }); exports.enumerate = enumerate; },{"../$map/map.js":338,"../../internal/iterable.js":493}],284:[function(require,module,exports){ var _regeneratorRuntime = require("@babel/runtime/regenerator"); var _asyncToGenerator = require("@babel/runtime/helpers/asyncToGenerator"); function _createForOfIteratorHelper(o, allowArrayLike) { var it; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; } function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } var _asyncIterator = require("@babel/runtime/helpers/asyncIterator"); var _require = require('../../internal/async-iterable.js'), asyncIterableCurry = _require.asyncIterableCurry; var _require2 = require('../$zip-all/async-zip-all.js'), __asyncZipAll = _require2.__asyncZipAll; var _require3 = require('../$slice/slice.js'), __sliceFromStart = _require3.__sliceFromStart; var none = Symbol('none'); var zipAllConfig = { filler: none }; function __asyncEqual(_x) { return _asyncEqual.apply(this, arguments); } function _asyncEqual() { _asyncEqual = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(iterables) { var same, _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, _value, stepValues, firstValue, _iterator2, _step2, value, _args = arguments; return _regeneratorRuntime.wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: same = _args.length > 1 && _args[1] !== undefined ? _args[1] : Object.is; if (!(iterables.length <= 1)) { _context.next = 3; break; } return _context.abrupt("return", true); case 3: _iteratorNormalCompletion = true; _didIteratorError = false; _context.prev = 5; _iterator = _asyncIterator(__asyncZipAll(iterables, zipAllConfig)); case 7: _context.next = 9; return _iterator.next(); case 9: _step = _context.sent; _iteratorNormalCompletion = _step.done; _context.next = 13; return _step.value; case 13: _value = _context.sent; if (_iteratorNormalCompletion) { _context.next = 37; break; } stepValues = _value; firstValue = stepValues[0]; _iterator2 = _createForOfIteratorHelper(__sliceFromStart(stepValues, 1)); _context.prev = 18; _iterator2.s(); case 20: if ((_step2 = _iterator2.n()).done) { _context.next = 26; break; } value = _step2.value; if (same(value, firstValue)) { _context.next = 24; break; } return _context.abrupt("return", false); case 24: _context.next = 20; break; case 26: _context.next = 31; break; case 28: _context.prev = 28; _context.t0 = _context["catch"](18); _iterator2.e(_context.t0); case 31: _context.prev = 31; _iterator2.f(); return _context.finish(31); case 34: _iteratorNormalCompletion = true; _context.next = 7; break; case 37: _context.next = 43; break; case 39: _context.prev = 39; _context.t1 = _context["catch"](5); _didIteratorError = true; _iteratorError = _context.t1; case 43: _context.prev = 43; _context.prev = 44; if (!(!_iteratorNormalCompletion && _iterator["return"] != null)) { _context.next = 48; break; } _context.next = 48; return _iterator["return"](); case 48: _context.prev = 48; if (!_didIteratorError) { _context.next = 51; break; } throw _iteratorError; case 51: return _context.finish(48); case 52: return _context.finish(43); case 53: return _context.abrupt("return", true); case 54: case "end": return _context.stop(); } } }, _callee, null, [[5, 39, 43, 53], [18, 28, 31, 34], [44,, 48, 52]]); })); return _asyncEqual.apply(this, arguments); } exports.__asyncEqual = __asyncEqual; var asyncEqual = /*#__PURE__*/asyncIterableCurry(__asyncEqual, { minArgs: 0, maxArgs: 1, variadic: true, reduces: true }); exports.asyncEqual = asyncEqual; },{"../$slice/slice.js":354,"../$zip-all/async-zip-all.js":410,"../../internal/async-iterable.js":480,"@babel/runtime/helpers/asyncIterator":42,"@babel/runtime/helpers/asyncToGenerator":43,"@babel/runtime/regenerator":65}],285:[function(require,module,exports){ function _createForOfIteratorHelper(o, allowArrayLike) { var it; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; } function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } var _require = require('../../internal/iterable.js'), iterableCurry = _require.iterableCurry; var _require2 = require('../$zip-all/zip-all.js'), __zipAll = _require2.__zipAll; var _require3 = require('../$slice/slice.js'), __sliceFromStart = _require3.__sliceFromStart; var none = Symbol('none'); var zipAllConfig = { filler: none }; function __equal(iterables) { var same = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : Object.is; if (iterables.length <= 1) return true; var _iterator = _createForOfIteratorHelper(__zipAll(iterables, zipAllConfig)), _step; try { for (_iterator.s(); !(_step = _iterator.n()).done;) { var stepValues = _step.value; var firstValue = stepValues[0]; var _iterator2 = _createForOfIteratorHelper(__sliceFromStart(stepValues, 1)), _step2; try { for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) { var value = _step2.value; if (!same(value, firstValue)) return false; } } catch (err) { _iterator2.e(err); } finally { _iterator2.f(); } } } catch (err) { _iterator.e(err); } finally { _iterator.f(); } return true; } exports.__equal = __equal; var equal = /*#__PURE__*/iterableCurry(__equal, { minArgs: 0, maxArgs: 1, variadic: true, reduces: true }); exports.equal = equal; },{"../$slice/slice.js":354,"../$zip-all/zip-all.js":411,"../../internal/iterable.js":493}],286:[function(require,module,exports){ var _regeneratorRuntime = require("@babel/runtime/regenerator"); var _asyncToGenerator = require("@babel/runtime/helpers/asyncToGenerator"); var _asyncIterator = require("@babel/runtime/helpers/asyncIterator"); var _require = require('../../internal/async-iterable.js'), asyncIterableCurry = _require.asyncIterableCurry; function __asyncEvery(_x, _x2) { return _asyncEvery.apply(this, arguments); } function _asyncEvery() { _asyncEvery = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(iterable, predicate) { var c, _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, _value, value; return _regeneratorRuntime.wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: c = 0; _iteratorNormalCompletion = true; _didIteratorError = false; _context.prev = 3; _iterator = _asyncIterator(iterable); case 5: _context.next = 7; return _iterator.next(); case 7: _step = _context.sent; _iteratorNormalCompletion = _step.done; _context.next = 11; return _step.value; case 11: _value = _context.sent; if (_iteratorNormalCompletion) { _context.next = 21; break; } value = _value; _context.next = 16; return predicate(value, c++); case 16: if (_context.sent) { _context.next = 18; break; } return _context.abrupt("return", false); case 18: _iteratorNormalCompletion = true; _context.next = 5; break; case 21: _context.next = 27; break; case 23: _context.prev = 23; _context.t0 = _context["catch"](3); _didIteratorError = true; _iteratorError = _context.t0; case 27: _context.prev = 27; _context.prev = 28; if (!(!_iteratorNormalCompletion && _iterator["return"] != null)) { _context.next = 32; break; } _context.next = 32; return _iterator["return"](); case 32: _context.prev = 32; if (!_didIteratorError) { _context.next = 35; break; } throw _iteratorError; case 35: return _context.finish(32); case 36: return _context.finish(27); case 37: return _context.abrupt("return", true); case 38: case "end": return _context.stop(); } } }, _callee, null, [[3, 23, 27, 37], [28,, 32, 36]]); })); return _asyncEvery.apply(this, arguments); } exports.__asyncEvery = __asyncEvery; var asyncEvery = /*#__PURE__*/asyncIterableCurry(__asyncEvery, { reduces: true }); exports.asyncEvery = asyncEvery; },{"../../internal/async-iterable.js":480,"@babel/runtime/helpers/asyncIterator":42,"@babel/runtime/helpers/asyncToGenerator":43,"@babel/runtime/regenerator":65}],287:[function(require,module,exports){ function _createForOfIteratorHelper(o, allowArrayLike) { var it; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; } function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } var _require = require('../../internal/iterable.js'), iterableCurry = _require.iterableCurry; function __every(iterable, predicate) { var c = 0; var _iterator = _createForOfIteratorHelper(iterable), _step; try { for (_iterator.s(); !(_step = _iterator.n()).done;) { var value = _step.value; if (!predicate(value, c++)) { return false; } } } catch (err) { _iterator.e(err); } finally { _iterator.f(); } return true; } exports.__every = __every; var every = /*#__PURE__*/iterableCurry(__every, { reduces: true }); exports.every = every; },{"../../internal/iterable.js":493}],288:[function(require,module,exports){ var _regeneratorRuntime = require("@babel/runtime/regenerator"); var _awaitAsyncGenerator = require("@babel/runtime/helpers/awaitAsyncGenerator"); var _wrapAsyncGenerator = require("@babel/runtime/helpers/wrapAsyncGenerator"); var _asyncIterator = require("@babel/runtime/helpers/asyncIterator"); var _require = require('../../internal/async-iterable.js'), asyncIterableCurry = _require.asyncIterableCurry; function __asyncFilter(_x, _x2) { return _asyncFilter.apply(this, arguments); } exports.__asyncFilter = __asyncFilter; function _asyncFilter() { _asyncFilter = _wrapAsyncGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(source, predicate) { var c, _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, _value, value; return _regeneratorRuntime.wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: c = 0; _iteratorNormalCompletion = true; _didIteratorError = false; _context.prev = 3; _iterator = _asyncIterator(source); case 5: _context.next = 7; return _awaitAsyncGenerator(_iterator.next()); case 7: _step = _context.sent; _iteratorNormalCompletion = _step.done; _context.next = 11; return _awaitAsyncGenerator(_step.value); case 11: _value = _context.sent; if (_iteratorNormalCompletion) { _context.next = 22; break; } value = _value; _context.next = 16; return _awaitAsyncGenerator(predicate(value, c++)); case 16: if (!_context.sent) { _context.next = 19; break; } _context.next = 19; return value; case 19: _iteratorNormalCompletion = true; _context.next = 5; break; case 22: _context.next = 28; break; case 24: _context.prev = 24; _context.t0 = _context["catch"](3); _didIteratorError = true; _iteratorError = _context.t0; case 28: _context.prev = 28; _context.prev = 29; if (!(!_iteratorNormalCompletion && _iterator["return"] != null)) { _context.next = 33; break; } _context.next = 33; return _awaitAsyncGenerator(_iterator["return"]()); case 33: _context.prev = 33; if (!_didIteratorError) { _context.next = 36; break; } throw _iteratorError; case 36: return _context.finish(33); case 37: return _context.finish(28); case 38: case "end": return _context.stop(); } } }, _callee, null, [[3, 24, 28, 38], [29,, 33, 37]]); })); return _asyncFilter.apply(this, arguments); } var asyncFilter = /*#__PURE__*/asyncIterableCurry(__asyncFilter); exports.asyncFilter = asyncFilter; },{"../../internal/async-iterable.js":480,"@babel/runtime/helpers/asyncIterator":42,"@babel/runtime/helpers/awaitAsyncGenerator":44,"@babel/runtime/helpers/wrapAsyncGenerator":64,"@babel/runtime/regenerator":65}],289:[function(require,module,exports){ var _regeneratorRuntime = require("@babel/runtime/regenerator"); var _marked = /*#__PURE__*/_regeneratorRuntime.mark(__filter); function _createForOfIteratorHelper(o, allowArrayLike) { var it; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; } function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } var _require = require('../../internal/iterable.js'), iterableCurry = _require.iterableCurry; function __filter(source, predicate) { var c, _iterator, _step, value; return _regeneratorRuntime.wrap(function __filter$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: c = 0; _iterator = _createForOfIteratorHelper(source); _context.prev = 2; _iterator.s(); case 4: if ((_step = _iterator.n()).done) { _context.next = 11; break; } value = _step.value; if (!predicate(value, c++)) { _context.next = 9; break; } _context.next = 9; return value; case 9: _context.next = 4; break; case 11: _context.next = 16; break; case 13: _context.prev = 13; _context.t0 = _context["catch"](2); _iterator.e(_context.t0); case 16: _context.prev = 16; _iterator.f(); return _context.finish(16); case 19: case "end": return _context.stop(); } } }, _marked, null, [[2, 13, 16, 19]]); } exports.__filter = __filter; var filter = /*#__PURE__*/iterableCurry(__filter); exports.filter = filter; },{"../../internal/iterable.js":493,"@babel/runtime/regenerator":65}],290:[function(require,module,exports){ var _regeneratorRuntime = require("@babel/runtime/regenerator"); var _asyncToGenerator = require("@babel/runtime/helpers/asyncToGenerator"); var _require = require('../../internal/async-iterable.js'), asyncIterableCurry = _require.asyncIterableCurry; var _require2 = require('../$peekerate/async-peekerate.js'), __asyncPeekerate = _require2.__asyncPeekerate; function __asyncFindBestOr(_x, _x2, _x3) { return _asyncFindBestOr.apply(this, arguments); } function _asyncFindBestOr() { _asyncFindBestOr = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(iterable, notFoundValue, comparer) { var mapper, peekr, best, bestValue, candidate, candidateValue, _args = arguments; return _regeneratorRuntime.wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: mapper = _args.length > 3 && _args[3] !== undefined ? _args[3] : function (value) { return value; }; _context.next = 3; return __asyncPeekerate(iterable); case 3: peekr = _context.sent; if (!peekr.done) { _context.next = 8; break; } return _context.abrupt("return", notFoundValue); case 8: best = peekr.value; _context.next = 11; return mapper(best, peekr.index); case 11: bestValue = _context.sent; _context.next = 14; return peekr.advance(); case 14: if (peekr.done) { _context.next = 24; break; } candidate = peekr.value; _context.next = 18; return mapper(candidate, peekr.index); case 18: candidateValue = _context.sent; if (comparer(bestValue, candidateValue)) { best = candidate; bestValue = candidateValue; } _context.next = 22; return peekr.advance(); case 22: _context.next = 14; break; case 24: return _context.abrupt("return", best); case 25: case "end": return _context.stop(); } } }, _callee); })); return _asyncFindBestOr.apply(this, arguments); } exports.__asyncFindBestOr = __asyncFindBestOr; var asyncFindBestOr = asyncIterableCurry(__asyncFindBestOr, { reduces: true, minArgs: 2, maxArgs: 3, growRight: true }); exports.asyncFindBestOr = asyncFindBestOr; },{"../$peekerate/async-peekerate.js":339,"../../internal/async-iterable.js":480,"@babel/runtime/helpers/asyncToGenerator":43,"@babel/runtime/regenerator":65}],291:[function(require,module,exports){ var _require = require('../../internal/iterable.js'), iterableCurry = _require.iterableCurry; var _require2 = require('../$peekerate/peekerate.js'), __peekerate = _require2.__peekerate; function __findBestOr(iterable, notFoundValue, comparer) { var mapper = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : function (value) { return value; }; var peekr = __peekerate(iterable); if (peekr.done) { return notFoundValue; } else { var best = peekr.value; var bestValue = mapper(best, peekr.index); peekr.advance(); while (!peekr.done) { var candidate = peekr.value; var candidateValue = mapper(candidate, peekr.index); if (comparer(bestValue, candidateValue)) { best = candidate; bestValue = candidateValue; } peekr.advance(); } return best; } } exports.__findBestOr = __findBestOr; var findBestOr = iterableCurry(__findBestOr, { reduces: true, minArgs: 2, maxArgs: 3, growRight: true }); exports.findBestOr = findBestOr; },{"../$peekerate/peekerate.js":340,"../../internal/iterable.js":493}],292:[function(require,module,exports){ var _regeneratorRuntime = require("@babel/runtime/regenerator"); var _asyncToGenerator = require("@babel/runtime/helpers/asyncToGenerator"); var _require = require('../../internal/async-iterable.js'), asyncIterableCurry = _require.asyncIterableCurry; var _require2 = require('../$find-best-or/async-find-best-or.js'), __asyncFindBestOr = _require2.__asyncFindBestOr; function __asyncFindBest(_x, _x2) { return _asyncFindBest.apply(this, arguments); } function _asyncFindBest() { _asyncFindBest = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(iterable, comparer) { var mapper, _args = arguments; return _regeneratorRuntime.wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: mapper = _args.length > 2 && _args[2] !== undefined ? _args[2] : function (value) { return value; }; _context.next = 3; return __asyncFindBestOr(iterable, undefined, comparer, mapper); case 3: return _context.abrupt("return", _context.sent); case 4: case "end": return _context.stop(); } } }, _callee); })); return _asyncFindBest.apply(this, arguments); } exports.__asyncFindBest = __asyncFindBest; var asyncFindBest = asyncIterableCurry(__asyncFindBest, { reduces: true, minArgs: 1, maxArgs: 2, growRight: true }); exports.asyncFindBest = asyncFindBest; },{"../$find-best-or/async-find-best-or.js":290,"../../internal/async-iterable.js":480,"@babel/runtime/helpers/asyncToGenerator":43,"@babel/runtime/regenerator":65}],293:[function(require,module,exports){ var _require = require('../../internal/iterable.js'), iterableCurry = _require.iterableCurry; var _require2 = require('../$find-best-or/find-best-or.js'), __findBestOr = _require2.__findBestOr; function __findBest(iterable, comparer) { var mapper = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : function (value) { return value; }; return __findBestOr(iterable, undefined, comparer, mapper); } exports.__findBest = __findBest; var findBest = iterableCurry(__findBest, { reduces: true, minArgs: 1, maxArgs: 2, growRight: true }); exports.findBest = findBest; },{"../$find-best-or/find-best-or.js":291,"../../internal/iterable.js":493}],294:[function(require,module,exports){ var _regeneratorRuntime = require("@babel/runtime/regenerator"); var _asyncToGenerator = require("@babel/runtime/helpers/asyncToGenerator"); var _asyncIterator = require("@babel/runtime/helpers/asyncIterator"); var _require = require('../../internal/async-iterable.js'), asyncIterableCurry = _require.asyncIterableCurry; function __asyncFindOr(_x, _x2, _x3) { return _asyncFindOr.apply(this, arguments); } function _asyncFindOr() { _asyncFindOr = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(iterable, notFoundValue, func) { var c, _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, _value, value; return _regeneratorRuntime.wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: c = 0; _iteratorNormalCompletion = true; _didIteratorError = false; _context.prev = 3; _iterator = _asyncIterator(iterable); case 5: _context.next = 7; return _iterator.next(); case 7: _step = _context.sent; _iteratorNormalCompletion = _step.done; _context.next = 11; return _step.value; case 11: _value = _context.sent; if (_iteratorNormalCompletion) { _context.next = 21; break; } value = _value; _context.next = 16; return func(value, c++); case 16: if (!_context.sent) { _context.next = 18; break; } return _context.abrupt("return", value); case 18: _iteratorNormalCompletion = true; _context.next = 5; break; case 21: _context.next = 27; break; case 23: _context.prev = 23; _context.t0 = _context["catch"](3); _didIteratorError = true; _iteratorError = _context.t0; case 27: _context.prev = 27; _context.prev = 28; if (!(!_iteratorNormalCompletion && _iterator["return"] != null)) { _context.next = 32; break; } _context.next = 32; return _iterator["return"](); case 32: _context.prev = 32; if (!_didIteratorError) { _context.next = 35; break; } throw _iteratorError; case 35: return _context.finish(32); case 36: return _context.finish(27); case 37: return _context.abrupt("return", notFoundValue); case 38: case "end": return _context.stop(); } } }, _callee, null, [[3, 23, 27, 37], [28,, 32, 36]]); })); return _asyncFindOr.apply(this, arguments); } exports.__asyncFindOr = __asyncFindOr; var asyncFindOr = /*#__PURE__*/asyncIterableCurry(__asyncFindOr, { growRight: true, reduces: true }); exports.asyncFindOr = asyncFindOr; },{"../../internal/async-iterable.js":480,"@babel/runtime/helpers/asyncIterator":42,"@babel/runtime/helpers/asyncToGenerator":43,"@babel/runtime/regenerator":65}],295:[function(require,module,exports){ function _createForOfIteratorHelper(o, allowArrayLike) { var it; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; } function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } var _require = require('../../internal/iterable.js'), iterableCurry = _require.iterableCurry; function __findOr(iterable, notFoundValue, func) { var c = 0; var _iterator = _createForOfIteratorHelper(iterable), _step; try { for (_iterator.s(); !(_step = _iterator.n()).done;) { var value = _step.value; if (func(value, c++)) { return value; } } } catch (err) { _iterator.e(err); } finally { _iterator.f(); } return notFoundValue; } exports.__findOr = __findOr; var findOr = /*#__PURE__*/iterableCurry(__findOr, { growRight: true, reduces: true }); exports.findOr = findOr; },{"../../internal/iterable.js":493}],296:[function(require,module,exports){ var _require = require('../../internal/async-iterable.js'), asyncIterableCurry = _require.asyncIterableCurry; var _require2 = require('../$find-or/async-find-or.js'), __asyncFindOr = _require2.__asyncFindOr; function __asyncFind(iterable, predicate) { return __asyncFindOr(iterable, undefined, predicate); } exports.__asyncFind = __asyncFind; var asyncFind = /*#__PURE__*/asyncIterableCurry(__asyncFind, { reduces: true }); exports.asyncFind = asyncFind; },{"../$find-or/async-find-or.js":294,"../../internal/async-iterable.js":480}],297:[function(require,module,exports){ var _require = require('../../internal/iterable.js'), iterableCurry = _require.iterableCurry; var _require2 = require('../$find-or/find-or.js'), __findOr = _require2.__findOr; function __find(iterable, predicate) { return __findOr(iterable, undefined, predicate); } exports.__find = __find; var find = /*#__PURE__*/iterableCurry(__find, { reduces: true }); exports.find = find; },{"../$find-or/find-or.js":295,"../../internal/iterable.js":493}],298:[function(require,module,exports){ var _regeneratorRuntime = require("@babel/runtime/regenerator"); var _asyncToGenerator = require("@babel/runtime/helpers/asyncToGenerator"); var _require = require('../../internal/async-iterable.js'), asyncIterableCurry = _require.asyncIterableCurry, asyncCallReturn = _require.asyncCallReturn; function __asyncFirstOr(_x, _x2) { return _asyncFirstOr.apply(this, arguments); } function _asyncFirstOr() { _asyncFirstOr = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(iterable, whenEmpty) { var iter, _yield$iter$next, value, done; return _regeneratorRuntime.wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: iter = iterable[Symbol.asyncIterator](); _context.next = 3; return iter.next(); case 3: _yield$iter$next = _context.sent; value = _yield$iter$next.value; done = _yield$iter$next.done; if (!done) { _context.next = 8; break; } return _context.abrupt("return", whenEmpty); case 8: _context.next = 10; return asyncCallReturn(iter); case 10: return _context.abrupt("return", value); case 11: case "end": return _context.stop(); } } }, _callee); })); return _asyncFirstOr.apply(this, arguments); } exports.__asyncFirstOr = __asyncFirstOr; var asyncFirstOr = /*#__PURE__*/asyncIterableCurry(__asyncFirstOr, { reduces: true }); exports.asyncFirstOr = asyncFirstOr; },{"../../internal/async-iterable.js":480,"@babel/runtime/helpers/asyncToGenerator":43,"@babel/runtime/regenerator":65}],299:[function(require,module,exports){ var _require = require('../../internal/iterable.js'), iterableCurry = _require.iterableCurry, callReturn = _require.callReturn; function __firstOr(iterable, whenEmpty) { var iter = iterable[Symbol.iterator](); var _iter$next = iter.next(), value = _iter$next.value, done = _iter$next.done; if (done) return whenEmpty; callReturn(iter); return value; } exports.__firstOr = __firstOr; var firstOr = /*#__PURE__*/iterableCurry(__firstOr, { reduces: true }); exports.firstOr = firstOr; },{"../../internal/iterable.js":493}],300:[function(require,module,exports){ var _require = require('../../internal/async-iterable.js'), asyncIterableCurry = _require.asyncIterableCurry; var _require2 = require('../$first-or/async-first-or.js'), __asyncFirstOr = _require2.__asyncFirstOr; function __asyncFirst(iterable) { return __asyncFirstOr(iterable, undefined); } exports.__asyncFirst = __asyncFirst; var asyncFirst = /*#__PURE__*/asyncIterableCurry(__asyncFirst, { reduces: true }); exports.asyncFirst = asyncFirst; },{"../$first-or/async-first-or.js":298,"../../internal/async-iterable.js":480}],301:[function(require,module,exports){ var _require = require('../../internal/iterable.js'), iterableCurry = _require.iterableCurry; var _require2 = require('../$first-or/first-or.js'), __firstOr = _require2.__firstOr; function __first(iterable) { return __firstOr(iterable, undefined); } exports.__first = __first; var first = /*#__PURE__*/iterableCurry(__first, { reduces: true }); exports.first = first; },{"../$first-or/first-or.js":299,"../../internal/iterable.js":493}],302:[function(require,module,exports){ var _regeneratorRuntime = require("@babel/runtime/regenerator"); var _wrapAsyncGenerator = require("@babel/runtime/helpers/wrapAsyncGenerator"); var _awaitAsyncGenerator = require("@babel/runtime/helpers/awaitAsyncGenerator"); var _asyncGeneratorDelegate = require("@babel/runtime/helpers/asyncGeneratorDelegate"); var _asyncIterator = require("@babel/runtime/helpers/asyncIterator"); var _require = require('../../internal/async-iterable.js'), asyncIterableCurry = _require.asyncIterableCurry; var _require2 = require('../$map/async-map.js'), __asyncMap = _require2.__asyncMap; function __asyncFlatMap(_x, _x2) { return _asyncFlatMap.apply(this, arguments); } exports.__asyncFlatMap = __asyncFlatMap; function _asyncFlatMap() { _asyncFlatMap = _wrapAsyncGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(source, func) { var _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, _value, value; return _regeneratorRuntime.wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: _iteratorNormalCompletion = true; _didIteratorError = false; _context.prev = 2; _iterator = _asyncIterator(__asyncMap(source, func)); case 4: _context.next = 6; return _awaitAsyncGenerator(_iterator.next()); case 6: _step = _context.sent; _iteratorNormalCompletion = _step.done; _context.next = 10; return _awaitAsyncGenerator(_step.value); case 10: _value = _context.sent; if (_iteratorNormalCompletion) { _context.next = 17; break; } value = _value; return _context.delegateYield(_asyncGeneratorDelegate(_asyncIterator(value), _awaitAsyncGenerator), "t0", 14); case 14: _iteratorNormalCompletion = true; _context.next = 4; break; case 17: _context.next = 23; break; case 19: _context.prev = 19; _context.t1 = _context["catch"](2); _didIteratorError = true; _iteratorError = _context.t1; case 23: _context.prev = 23; _context.prev = 24; if (!(!_iteratorNormalCompletion && _iterator["return"] != null)) { _context.next = 28; break; } _context.next = 28; return _awaitAsyncGenerator(_iterator["return"]()); case 28: _context.prev = 28; if (!_didIteratorError) { _context.next = 31; break; } throw _iteratorError; case 31: return _context.finish(28); case 32: return _context.finish(23); case 33: case "end": return _context.stop(); } } }, _callee, null, [[2, 19, 23, 33], [24,, 28, 32]]); })); return _asyncFlatMap.apply(this, arguments); } var asyncFlatMap = /*#__PURE__*/asyncIterableCurry(__asyncFlatMap); exports.asyncFlatMap = asyncFlatMap; },{"../$map/async-map.js":337,"../../internal/async-iterable.js":480,"@babel/runtime/helpers/asyncGeneratorDelegate":41,"@babel/runtime/helpers/asyncIterator":42,"@babel/runtime/helpers/awaitAsyncGenerator":44,"@babel/runtime/helpers/wrapAsyncGenerator":64,"@babel/runtime/regenerator":65}],303:[function(require,module,exports){ var _regeneratorRuntime = require("@babel/runtime/regenerator"); var _marked = /*#__PURE__*/_regeneratorRuntime.mark(__flatMap); function _createForOfIteratorHelper(o, allowArrayLike) { var it; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; } function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } var _require = require('../../internal/iterable.js'), iterableCurry = _require.iterableCurry; var _require2 = require('../$map/map.js'), __map = _require2.__map; function __flatMap(source, func) { var _iterator, _step, value; return _regeneratorRuntime.wrap(function __flatMap$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: _iterator = _createForOfIteratorHelper(__map(source, func)); _context.prev = 1; _iterator.s(); case 3: if ((_step = _iterator.n()).done) { _context.next = 8; break; } value = _step.value; return _context.delegateYield(value, "t0", 6); case 6: _context.next = 3; break; case 8: _context.next = 13; break; case 10: _context.prev = 10; _context.t1 = _context["catch"](1); _iterator.e(_context.t1); case 13: _context.prev = 13; _iterator.f(); return _context.finish(13); case 16: case "end": return _context.stop(); } } }, _marked, null, [[1, 10, 13, 16]]); } exports.__flatMap = __flatMap; var flatMap = /*#__PURE__*/iterableCurry(__flatMap); exports.flatMap = flatMap; },{"../$map/map.js":338,"../../internal/iterable.js":493,"@babel/runtime/regenerator":65}],304:[function(require,module,exports){ var _regeneratorRuntime = require("@babel/runtime/regenerator"); var _wrapAsyncGenerator = require("@babel/runtime/helpers/wrapAsyncGenerator"); var _awaitAsyncGenerator = require("@babel/runtime/helpers/awaitAsyncGenerator"); var _asyncGeneratorDelegate = require("@babel/runtime/helpers/asyncGeneratorDelegate"); var _asyncIterator = require("@babel/runtime/helpers/asyncIterator"); var _require = require('../../internal/async-iterable.js'), asyncIterableCurry = _require.asyncIterableCurry, asyncIsLoopable = _require.asyncIsLoopable; var _require2 = require('./internal/validate-args.js'), validateArgs = _require2.validateArgs; var defaultShouldFlat = function defaultShouldFlat(value) { return typeof value !== 'string' && asyncIsLoopable(value); }; function asyncFlatInternal(_x, _x2, _x3, _x4) { return _asyncFlatInternal.apply(this, arguments); } function _asyncFlatInternal() { _asyncFlatInternal = _wrapAsyncGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(shouldFlat, depth, currentDepth, source) { var _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, _value, value; return _regeneratorRuntime.wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: _iteratorNormalCompletion = true; _didIteratorError = false; _context.prev = 2; _iterator = _asyncIterator(source); case 4: _context.next = 6; return _awaitAsyncGenerator(_iterator.next()); case 6: _step = _context.sent; _iteratorNormalCompletion = _step.done; _context.next = 10; return _awaitAsyncGenerator(_step.value); case 10: _value = _context.sent; if (_iteratorNormalCompletion) { _context.next = 27; break; } value = _value; _context.t0 = currentDepth < depth; if (!_context.t0) { _context.next = 18; break; } _context.next = 17; return _awaitAsyncGenerator(shouldFlat(value)); case 17: _context.t0 = _context.sent; case 18: if (!_context.t0) { _context.next = 22; break; } return _context.delegateYield(_asyncGeneratorDelegate(_asyncIterator(asyncFlatInternal(shouldFlat, depth, currentDepth + 1, value)), _awaitAsyncGenerator), "t1", 20); case 20: _context.next = 24; break; case 22: _context.next = 24; return value; case 24: _iteratorNormalCompletion = true; _context.next = 4; break; case 27: _context.next = 33; break; case 29: _context.prev = 29; _context.t2 = _context["catch"](2); _didIteratorError = true; _iteratorError = _context.t2; case 33: _context.prev = 33; _context.prev = 34; if (!(!_iteratorNormalCompletion && _iterator["return"] != null)) { _context.next = 38; break; } _context.next = 38; return _awaitAsyncGenerator(_iterator["return"]()); case 38: _context.prev = 38; if (!_didIteratorError) { _context.next = 41; break; } throw _iteratorError; case 41: return _context.finish(38); case 42: return _context.finish(33); case 43: case "end": return _context.stop(); } } }, _callee, null, [[2, 29, 33, 43], [34,, 38, 42]]); })); return _asyncFlatInternal.apply(this, arguments); } function __asyncFlat(source) { var depth = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1; var shouldFlat = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : defaultShouldFlat; return asyncFlatInternal(shouldFlat, depth, 0, source); } exports.__asyncFlat = __asyncFlat; var asyncFlat = /*#__PURE__*/asyncIterableCurry(__asyncFlat, { minArgs: 0, maxArgs: 2, validateArgs: validateArgs }); exports.asyncFlat = asyncFlat; },{"../../internal/async-iterable.js":480,"./internal/validate-args.js":306,"@babel/runtime/helpers/asyncGeneratorDelegate":41,"@babel/runtime/helpers/asyncIterator":42,"@babel/runtime/helpers/awaitAsyncGenerator":44,"@babel/runtime/helpers/wrapAsyncGenerator":64,"@babel/runtime/regenerator":65}],305:[function(require,module,exports){ var _regeneratorRuntime = require("@babel/runtime/regenerator"); var _marked = /*#__PURE__*/_regeneratorRuntime.mark(flatInternal); function _createForOfIteratorHelper(o, allowArrayLike) { var it; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; } function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } var _require = require('../../internal/iterable.js'), iterableCurry = _require.iterableCurry, isLoopable = _require.isLoopable; var _require2 = require('./internal/validate-args.js'), validateArgs = _require2.validateArgs; var defaultShouldFlat = function defaultShouldFlat(value) { return typeof value !== 'string' && isLoopable(value); }; function flatInternal(shouldFlat, depth, currentDepth, source) { var _iterator, _step, value; return _regeneratorRuntime.wrap(function flatInternal$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: _iterator = _createForOfIteratorHelper(source); _context.prev = 1; _iterator.s(); case 3: if ((_step = _iterator.n()).done) { _context.next = 13; break; } value = _step.value; if (!(currentDepth < depth && shouldFlat(value))) { _context.next = 9; break; } return _context.delegateYield(flatInternal(shouldFlat, depth, currentDepth + 1, value), "t0", 7); case 7: _context.next = 11; break; case 9: _context.next = 11; return value; case 11: _context.next = 3; break; case 13: _context.next = 18; break; case 15: _context.prev = 15; _context.t1 = _context["catch"](1); _iterator.e(_context.t1); case 18: _context.prev = 18; _iterator.f(); return _context.finish(18); case 21: case "end": return _context.stop(); } } }, _marked, null, [[1, 15, 18, 21]]); } function __flat(source) { var depth = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1; var shouldFlat = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : defaultShouldFlat; return flatInternal(shouldFlat, depth, 0, source); } exports.__flat = __flat; var flat = /*#__PURE__*/iterableCurry(__flat, { minArgs: 0, maxArgs: 2, validateArgs: validateArgs }); exports.flat = flat; },{"../../internal/iterable.js":493,"./internal/validate-args.js":306,"@babel/runtime/regenerator":65}],306:[function(require,module,exports){ var _require = require('../../is-object/is-object.js'), isObject = _require.isObject; function validateArgs(args) { var depthOrOptions = args[1]; var shouldFlat = args[2]; var depth = depthOrOptions; if (isObject(depthOrOptions)) { shouldFlat = depthOrOptions.shouldFlat; depth = depthOrOptions.depth; } args[2] = shouldFlat; args[1] = depth; } exports.validateArgs = validateArgs; },{"../../is-object/is-object.js":440}],307:[function(require,module,exports){ var _regeneratorRuntime = require("@babel/runtime/regenerator"); var _asyncToGenerator = require("@babel/runtime/helpers/asyncToGenerator"); var _asyncIterator = require("@babel/runtime/helpers/asyncIterator"); var _require = require('../../internal/async-iterable.js'), asyncIterableCurry = _require.asyncIterableCurry; function __asyncForEach(_x, _x2) { return _asyncForEach.apply(this, arguments); } function _asyncForEach() { _asyncForEach = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(iterable, callback) { var c, _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, _value, value; return _regeneratorRuntime.wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: c = 0; _iteratorNormalCompletion = true; _didIteratorError = false; _context.prev = 3; _iterator = _asyncIterator(iterable); case 5: _context.next = 7; return _iterator.next(); case 7: _step = _context.sent; _iteratorNormalCompletion = _step.done; _context.next = 11; return _step.value; case 11: _value = _context.sent; if (_iteratorNormalCompletion) { _context.next = 19; break; } value = _value; _context.next = 16; return callback(value, c++); case 16: _iteratorNormalCompletion = true; _context.next = 5; break; case 19: _context.next = 25; break; case 21: _context.prev = 21; _context.t0 = _context["catch"](3); _didIteratorError = true; _iteratorError = _context.t0; case 25: _context.prev = 25; _context.prev = 26; if (!(!_iteratorNormalCompletion && _iterator["return"] != null)) { _context.next = 30; break; } _context.next = 30; return _iterator["return"](); case 30: _context.prev = 30; if (!_didIteratorError) { _context.next = 33; break; } throw _iteratorError; case 33: return _context.finish(30); case 34: return _context.finish(25); case 35: case "end": return _context.stop(); } } }, _callee, null, [[3, 21, 25, 35], [26,, 30, 34]]); })); return _asyncForEach.apply(this, arguments); } exports.__asyncForEach = __asyncForEach; var asyncForEach = /*#__PURE__*/asyncIterableCurry(__asyncForEach, { reduces: true }); exports.asyncForEach = asyncForEach; },{"../../internal/async-iterable.js":480,"@babel/runtime/helpers/asyncIterator":42,"@babel/runtime/helpers/asyncToGenerator":43,"@babel/runtime/regenerator":65}],308:[function(require,module,exports){ function _createForOfIteratorHelper(o, allowArrayLike) { var it; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; } function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } var _require = require('../../internal/iterable.js'), iterableCurry = _require.iterableCurry; function __forEach(iterable, callback) { var c = 0; var _iterator = _createForOfIteratorHelper(iterable), _step; try { for (_iterator.s(); !(_step = _iterator.n()).done;) { var value = _step.value; callback(value, c++); } } catch (err) { _iterator.e(err); } finally { _iterator.f(); } } exports.__forEach = __forEach; var forEach = /*#__PURE__*/iterableCurry(__forEach, { reduces: true }); exports.forEach = forEach; },{"../../internal/iterable.js":493}],309:[function(require,module,exports){ var _regeneratorRuntime = require("@babel/runtime/regenerator"); var _marked = /*#__PURE__*/_regeneratorRuntime.mark(__asyncFork); var _require = require('../../internal/async-iterable.js'), asyncIterableCurry = _require.asyncIterableCurry; var _require2 = require('../../internal/async-fork.js'), AsyncExchange = _require2.AsyncExchange; function __asyncFork(source) { var exchange, dummyFork; return _regeneratorRuntime.wrap(function __asyncFork$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: exchange = new AsyncExchange(source[Symbol.asyncIterator]()); dummyFork = exchange.fork(); _context.prev = 2; case 3: if (!true) { _context.next = 8; break; } _context.next = 6; return exchange.fork(); case 6: _context.next = 3; break; case 8: _context.prev = 8; dummyFork["return"](); return _context.finish(8); case 11: case "end": return _context.stop(); } } }, _marked, null, [[2,, 8, 11]]); } exports.__asyncFork = __asyncFork; var asyncFork = /*#__PURE__*/asyncIterableCurry(__asyncFork, { forceSync: true }); exports.asyncFork = asyncFork; },{"../../internal/async-fork.js":477,"../../internal/async-iterable.js":480,"@babel/runtime/regenerator":65}],310:[function(require,module,exports){ var _regeneratorRuntime = require("@babel/runtime/regenerator"); var _marked = /*#__PURE__*/_regeneratorRuntime.mark(__fork); var _require = require('../../internal/iterable.js'), iterableCurry = _require.iterableCurry; var _require2 = require('../../internal/fork.js'), Exchange = _require2.Exchange; function __fork(source) { var exchange, dummyFork; return _regeneratorRuntime.wrap(function __fork$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: exchange = new Exchange(source[Symbol.iterator]()); dummyFork = exchange.fork(); _context.prev = 2; case 3: if (!true) { _context.next = 8; break; } _context.next = 6; return exchange.fork(); case 6: _context.next = 3; break; case 8: _context.prev = 8; dummyFork["return"](); return _context.finish(8); case 11: case "end": return _context.stop(); } } }, _marked, null, [[2,, 8, 11]]); } exports.__fork = __fork; var fork = /*#__PURE__*/iterableCurry(__fork, { forceSync: true }); exports.fork = fork; },{"../../internal/fork.js":490,"../../internal/iterable.js":493,"@babel/runtime/regenerator":65}],311:[function(require,module,exports){ var _regeneratorRuntime = require("@babel/runtime/regenerator"); var _asyncToGenerator = require("@babel/runtime/helpers/asyncToGenerator"); var _classCallCheck = require("@babel/runtime/helpers/classCallCheck"); var _createClass = require("@babel/runtime/helpers/createClass"); var _inherits = require("@babel/runtime/helpers/inherits"); var _possibleConstructorReturn = require("@babel/runtime/helpers/possibleConstructorReturn"); var _get = require("@babel/runtime/helpers/get"); var _getPrototypeOf = require("@babel/runtime/helpers/getPrototypeOf"); function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } } var _require = require('../../internal/async-iterable.js'), asyncEnsureIterable = _require.asyncEnsureIterable; var _require2 = require('../../internal/async-fork.js'), AsyncExchange = _require2.AsyncExchange; var _require3 = require('../../internal/async-peekerator.js'), AsyncPeekerator = _require3.AsyncPeekerator; var _ = Symbol["for"]('_'); var AsyncForkerator = /*#__PURE__*/function (_AsyncPeekerator) { _inherits(AsyncForkerator, _AsyncPeekerator); var _super = _createSuper(AsyncForkerator); _createClass(AsyncForkerator, null, [{ key: "from", value: function () { var _from = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(source) { var exchange; return _regeneratorRuntime.wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: exchange = new AsyncExchange(asyncEnsureIterable(source)[Symbol.asyncIterator]()); _context.next = 3; return _get(_getPrototypeOf(AsyncForkerator), "from", this).call(this, exchange.fork(), exchange); case 3: return _context.abrupt("return", _context.sent); case 4: case "end": return _context.stop(); } } }, _callee, this); })); function from(_x) { return _from.apply(this, arguments); } return from; }() }]); function AsyncForkerator(iterator, first, exchange) { var _this; _classCallCheck(this, AsyncForkerator); _this = _super.call(this, iterator, first); _this[_].exchange = exchange; return _this; } _createClass(AsyncForkerator, [{ key: "advance", value: function () { var _advance = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee2() { var n, i, _args2 = arguments; return _regeneratorRuntime.wrap(function _callee2$(_context2) { while (1) { switch (_context2.prev = _context2.next) { case 0: n = _args2.length > 0 && _args2[0] !== undefined ? _args2[0] : 1; i = 0; case 2: if (!(i < n)) { _context2.next = 9; break; } _context2.next = 5; return _get(_getPrototypeOf(AsyncForkerator.prototype), "advance", this).call(this); case 5: this[_].exchange.advance(); case 6: i++; _context2.next = 2; break; case 9: return _context2.abrupt("return", this); case 10: case "end": return _context2.stop(); } } }, _callee2, this); })); function advance() { return _advance.apply(this, arguments); } return advance; }() }, { key: "fork", value: function fork() { return this[_].exchange.fork(); } }, { key: Symbol.asyncIterator, value: function value() { return this[_].exchange.fork(); } }]); return AsyncForkerator; }(AsyncPeekerator); function __asyncForkerate(source) { return AsyncForkerator.from(source); } exports.__asyncForkerate = __asyncForkerate; function asyncWrapWithEnsureIterable(fn) { return function (source) { return fn(asyncEnsureIterable(source)); }; } var asyncForkerate = asyncWrapWithEnsureIterable(__asyncForkerate); exports.asyncForkerate = asyncForkerate; },{"../../internal/async-fork.js":477,"../../internal/async-iterable.js":480,"../../internal/async-peekerator.js":483,"@babel/runtime/helpers/asyncToGenerator":43,"@babel/runtime/helpers/classCallCheck":45,"@babel/runtime/helpers/createClass":47,"@babel/runtime/helpers/get":49,"@babel/runtime/helpers/getPrototypeOf":50,"@babel/runtime/helpers/inherits":51,"@babel/runtime/helpers/possibleConstructorReturn":57,"@babel/runtime/regenerator":65}],312:[function(require,module,exports){ var _classCallCheck = require("@babel/runtime/helpers/classCallCheck"); var _createClass = require("@babel/runtime/helpers/createClass"); var _inherits = require("@babel/runtime/helpers/inherits"); var _possibleConstructorReturn = require("@babel/runtime/helpers/possibleConstructorReturn"); var _get = require("@babel/runtime/helpers/get"); var _getPrototypeOf = require("@babel/runtime/helpers/getPrototypeOf"); function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } } var _require = require('../../internal/iterable.js'), ensureIterable = _require.ensureIterable; var _require2 = require('../../internal/fork.js'), Exchange = _require2.Exchange; var _require3 = require('../../internal/peekerator.js'), Peekerator = _require3.Peekerator; var _ = Symbol["for"]('_'); var Forkerator = /*#__PURE__*/function (_Peekerator) { _inherits(Forkerator, _Peekerator); var _super = _createSuper(Forkerator); _createClass(Forkerator, null, [{ key: "from", value: function from(source) { var exchange = new Exchange(ensureIterable(source)[Symbol.iterator]()); return _get(_getPrototypeOf(Forkerator), "from", this).call(this, exchange.fork(), exchange); } }]); function Forkerator(iterator, first, exchange) { var _this; _classCallCheck(this, Forkerator); _this = _super.call(this, iterator, first); _this[_].exchange = exchange; return _this; } _createClass(Forkerator, [{ key: "advance", value: function advance() { var n = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 1; for (var i = 0; i < n; i++) { _get(_getPrototypeOf(Forkerator.prototype), "advance", this).call(this); this[_].exchange.advance(); } return this; } }, { key: "fork", value: function fork() { return this[_].exchange.fork(); } }, { key: Symbol.iterator, value: function value() { return this[_].exchange.fork(); } }]); return Forkerator; }(Peekerator); function __forkerate(source) { return Forkerator.from(source); } exports.__forkerate = __forkerate; function wrapWithEnsureIterable(fn) { return function (source) { return fn(ensureIterable(source)); }; } var forkerate = wrapWithEnsureIterable(__forkerate); exports.forkerate = forkerate; },{"../../internal/fork.js":490,"../../internal/iterable.js":493,"../../internal/peekerator.js":497,"@babel/runtime/helpers/classCallCheck":45,"@babel/runtime/helpers/createClass":47,"@babel/runtime/helpers/get":49,"@babel/runtime/helpers/getPrototypeOf":50,"@babel/runtime/helpers/inherits":51,"@babel/runtime/helpers/possibleConstructorReturn":57}],313:[function(require,module,exports){ var _regeneratorRuntime = require("@babel/runtime/regenerator"); var _asyncToGenerator = require("@babel/runtime/helpers/asyncToGenerator"); var _asyncIterator = require("@babel/runtime/helpers/asyncIterator"); var _require = require('../../internal/async-iterable.js'), asyncIterableCurry = _require.asyncIterableCurry; var _require2 = require('../../internal/async-any-seq.js'), asyncSeqsToArray = _require2.asyncSeqsToArray; var _require3 = require('../$window-ahead/async-window-ahead.js'), __asyncWindowAhead = _require3.__asyncWindowAhead; var _require4 = require('../$starts-with-any-seq/starts-with-any-seq.js'), __startsWithAnySeq = _require4.__startsWithAnySeq; function __asyncIncludesAnySeq(_x, _x2) { return _asyncIncludesAnySeq.apply(this, arguments); } function _asyncIncludesAnySeq() { _asyncIncludesAnySeq = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(iterable, seqs) { var same, seqsArr, maxMatchLength, _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, _value, buffer, _args = arguments; return _regeneratorRuntime.wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: same = _args.length > 2 && _args[2] !== undefined ? _args[2] : Object.is; _context.next = 3; return asyncSeqsToArray(seqs); case 3: seqsArr = _context.sent; if (seqsArr.length) { _context.next = 6; break; } return _context.abrupt("return", false); case 6: if (!seqsArr.find(function (seq) { return !seq.length; })) { _context.next = 8; break; } return _context.abrupt("return", true); case 8: maxMatchLength = seqsArr.reduce(function (max, _ref) { var length = _ref.length; return Math.max(max, length); }, 1); _iteratorNormalCompletion = true; _didIteratorError = false; _context.prev = 11; _iterator = _asyncIterator(__asyncWindowAhead(iterable, maxMatchLength)); case 13: _context.next = 15; return _iterator.next(); case 15: _step = _context.sent; _iteratorNormalCompletion = _step.done; _context.next = 19; return _step.value; case 19: _value = _context.sent; if (_iteratorNormalCompletion) { _context.next = 27; break; } buffer = _value; if (!__startsWithAnySeq(buffer, seqsArr, same)) { _context.next = 24; break; } return _context.abrupt("return", true); case 24: _iteratorNormalCompletion = true; _context.next = 13; break; case 27: _context.next = 33; break; case 29: _context.prev = 29; _context.t0 = _context["catch"](11); _didIteratorError = true; _iteratorError = _context.t0; case 33: _context.prev = 33; _context.prev = 34; if (!(!_iteratorNormalCompletion && _iterator["return"] != null)) { _context.next = 38; break; } _context.next = 38; return _iterator["return"](); case 38: _context.prev = 38; if (!_didIteratorError) { _context.next = 41; break; } throw _iteratorError; case 41: return _context.finish(38); case 42: return _context.finish(33); case 43: return _context.abrupt("return", false); case 44: case "end": return _context.stop(); } } }, _callee, null, [[11, 29, 33, 43], [34,, 38, 42]]); })); return _asyncIncludesAnySeq.apply(this, arguments); } exports.__asyncIncludesAnySeq = __asyncIncludesAnySeq; var asyncIncludesAnySeq = /*#__PURE__*/asyncIterableCurry(__asyncIncludesAnySeq, { minArgs: 1, maxArgs: 2, reduces: true }); exports.asyncIncludesAnySeq = asyncIncludesAnySeq; },{"../$starts-with-any-seq/starts-with-any-seq.js":376,"../$window-ahead/async-window-ahead.js":402,"../../internal/async-any-seq.js":475,"../../internal/async-iterable.js":480,"@babel/runtime/helpers/asyncIterator":42,"@babel/runtime/helpers/asyncToGenerator":43,"@babel/runtime/regenerator":65}],314:[function(require,module,exports){ function _createForOfIteratorHelper(o, allowArrayLike) { var it; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; } function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } var _require = require('../../internal/iterable.js'), iterableCurry = _require.iterableCurry; var _require2 = require('../../internal/any-seq.js'), seqsToArray = _require2.seqsToArray; var _require3 = require('../$window-ahead/window-ahead.js'), __windowAhead = _require3.__windowAhead; var _require4 = require('../$starts-with-any-seq/starts-with-any-seq.js'), __startsWithAnySeq = _require4.__startsWithAnySeq; function __includesAnySeq(iterable, seqs) { var same = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : Object.is; var seqsArr = seqsToArray(seqs); if (!seqsArr.length) return false; if (seqsArr.find(function (seq) { return !seq.length; })) return true; var maxMatchLength = seqsArr.reduce(function (max, _ref) { var length = _ref.length; return Math.max(max, length); }, 1); var _iterator = _createForOfIteratorHelper(__windowAhead(iterable, maxMatchLength)), _step; try { for (_iterator.s(); !(_step = _iterator.n()).done;) { var buffer = _step.value; if (__startsWithAnySeq(buffer, seqsArr, same)) { return true; } } } catch (err) { _iterator.e(err); } finally { _iterator.f(); } return false; } exports.__includesAnySeq = __includesAnySeq; var includesAnySeq = /*#__PURE__*/iterableCurry(__includesAnySeq, { minArgs: 1, maxArgs: 2, reduces: true }); exports.includesAnySeq = includesAnySeq; },{"../$starts-with-any-seq/starts-with-any-seq.js":376,"../$window-ahead/window-ahead.js":403,"../../internal/any-seq.js":474,"../../internal/iterable.js":493}],315:[function(require,module,exports){ var _regeneratorRuntime = require("@babel/runtime/regenerator"); var _asyncToGenerator = require("@babel/runtime/helpers/asyncToGenerator"); var _require = require('../../internal/async-iterable.js'), asyncIterableCurry = _require.asyncIterableCurry; var _require2 = require('../$find-or/async-find-or.js'), __asyncFindOr = _require2.__asyncFindOr; var _require3 = require('../$includes/includes.js'), __includes = _require3.__includes; var none = Symbol('none'); function __asyncIncludesAny(_x, _x2) { return _asyncIncludesAny.apply(this, arguments); } function _asyncIncludesAny() { _asyncIncludesAny = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(iterable, values) { var same, _args = arguments; return _regeneratorRuntime.wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: same = _args.length > 2 && _args[2] !== undefined ? _args[2] : Object.is; _context.next = 3; return __asyncFindOr(iterable, none, function (value) { return __includes(values, value, function (a, b) { return same(b, a); }); }); case 3: _context.t0 = _context.sent; _context.t1 = none; return _context.abrupt("return", _context.t0 !== _context.t1); case 6: case "end": return _context.stop(); } } }, _callee); })); return _asyncIncludesAny.apply(this, arguments); } exports.__asyncIncludesAny = __asyncIncludesAny; var asyncIncludesAny = /*#__PURE__*/asyncIterableCurry(__asyncIncludesAny, { minArgs: 1, maxArgs: 2, reduces: true, validateArgs: function validateArgs(args) {} }); exports.asyncIncludesAny = asyncIncludesAny; },{"../$find-or/async-find-or.js":294,"../$includes/includes.js":320,"../../internal/async-iterable.js":480,"@babel/runtime/helpers/asyncToGenerator":43,"@babel/runtime/regenerator":65}],316:[function(require,module,exports){ var _require = require('../../internal/iterable.js'), iterableCurry = _require.iterableCurry; var _require2 = require('../$find-or/find-or.js'), __findOr = _require2.__findOr; var _require3 = require('../$includes/includes.js'), __includes = _require3.__includes; var none = Symbol('none'); function __includesAny(iterable, values) { var same = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : Object.is; return __findOr(iterable, none, function (value) { return __includes(values, value, function (a, b) { return same(b, a); }); }) !== none; } exports.__includesAny = __includesAny; var includesAny = /*#__PURE__*/iterableCurry(__includesAny, { minArgs: 1, maxArgs: 2, reduces: true, validateArgs: function validateArgs(args) { if (true && typeof args[0] === 'string') { console.warn("For string inputs use includesAnySeq instead of includesAny"); } } }); exports.includesAny = includesAny; },{"../$find-or/find-or.js":295,"../$includes/includes.js":320,"../../internal/iterable.js":493}],317:[function(require,module,exports){ var _require = require('../../internal/async-iterable.js'), asyncIterableCurry = _require.asyncIterableCurry, asyncEnsureIterable = _require.asyncEnsureIterable; var _require2 = require('../$includes-any-seq/async-includes-any-seq.js'), __asyncIncludesAnySeq = _require2.__asyncIncludesAnySeq; function __asyncIncludesSeq(iterable, seq) { var same = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : Object.is; return __asyncIncludesAnySeq(iterable, [seq], same); } exports.__asyncIncludesSeq = __asyncIncludesSeq; var asyncIncludesSeq = /*#__PURE__*/asyncIterableCurry(__asyncIncludesSeq, { minArgs: 1, maxArgs: 2, reduces: true, validateArgs: function validateArgs(args) { args[1] = asyncEnsureIterable(args[1]); } }); exports.asyncIncludesSeq = asyncIncludesSeq; },{"../$includes-any-seq/async-includes-any-seq.js":313,"../../internal/async-iterable.js":480}],318:[function(require,module,exports){ var _require = require('../../internal/iterable.js'), iterableCurry = _require.iterableCurry, ensureIterable = _require.ensureIterable; var _require2 = require('../$includes-any-seq/includes-any-seq.js'), __includesAnySeq = _require2.__includesAnySeq; function __includesSeq(iterable, seq) { var same = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : Object.is; return __includesAnySeq(iterable, [seq], same); } exports.__includesSeq = __includesSeq; var includesSeq = /*#__PURE__*/iterableCurry(__includesSeq, { minArgs: 1, maxArgs: 2, reduces: true, validateArgs: function validateArgs(args) { args[1] = ensureIterable(args[1]); } }); exports.includesSeq = includesSeq; },{"../$includes-any-seq/includes-any-seq.js":314,"../../internal/iterable.js":493}],319:[function(require,module,exports){ var _regeneratorRuntime = require("@babel/runtime/regenerator"); var _asyncToGenerator = require("@babel/runtime/helpers/asyncToGenerator"); var _require = require('../../internal/async-iterable.js'), asyncIterableCurry = _require.asyncIterableCurry; var _require2 = require('../$find-or/async-find-or.js'), __asyncFindOr = _require2.__asyncFindOr; var none = Symbol('none'); function __asyncIncludes(_x, _x2) { return _asyncIncludes.apply(this, arguments); } function _asyncIncludes() { _asyncIncludes = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(iterable, value) { var same, _args = arguments; return _regeneratorRuntime.wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: same = _args.length > 2 && _args[2] !== undefined ? _args[2] : Object.is; _context.next = 3; return __asyncFindOr(iterable, none, function (v) { return same(value, v); }); case 3: _context.t0 = _context.sent; _context.t1 = none; return _context.abrupt("return", _context.t0 !== _context.t1); case 6: case "end": return _context.stop(); } } }, _callee); })); return _asyncIncludes.apply(this, arguments); } exports.__asyncIncludes = __asyncIncludes; var asyncIncludes = /*#__PURE__*/asyncIterableCurry(__asyncIncludes, { minArgs: 1, maxArgs: 2, reduces: true, validateArgs: function validateArgs(args) {} }); exports.asyncIncludes = asyncIncludes; },{"../$find-or/async-find-or.js":294,"../../internal/async-iterable.js":480,"@babel/runtime/helpers/asyncToGenerator":43,"@babel/runtime/regenerator":65}],320:[function(require,module,exports){ var _require = require('../../internal/iterable.js'), iterableCurry = _require.iterableCurry; var _require2 = require('../$find-or/find-or.js'), __findOr = _require2.__findOr; var none = Symbol('none'); function __includes(iterable, value) { var same = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : Object.is; return __findOr(iterable, none, function (v) { return same(value, v); }) !== none; } exports.__includes = __includes; var includes = /*#__PURE__*/iterableCurry(__includes, { minArgs: 1, maxArgs: 2, reduces: true, validateArgs: function validateArgs(args) { if (true && typeof args[0] === 'string') { console.warn("For string inputs use includesSeq instead of includes"); } } }); exports.includes = includes; },{"../$find-or/find-or.js":295,"../../internal/iterable.js":493}],321:[function(require,module,exports){ var _toConsumableArray = require("@babel/runtime/helpers/toConsumableArray"); var _regeneratorRuntime = require("@babel/runtime/regenerator"); var _asyncToGenerator = require("@babel/runtime/helpers/asyncToGenerator"); var _classCallCheck = require("@babel/runtime/helpers/classCallCheck"); var _createClass = require("@babel/runtime/helpers/createClass"); var _get = require("@babel/runtime/helpers/get"); var _inherits = require("@babel/runtime/helpers/inherits"); var _possibleConstructorReturn = require("@babel/runtime/helpers/possibleConstructorReturn"); var _getPrototypeOf = require("@babel/runtime/helpers/getPrototypeOf"); function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } } var _require = require('../../internal/async-iterable.js'), asyncIterableCurry = _require.asyncIterableCurry, asyncCallReturn = _require.asyncCallReturn; var _require2 = require('../../internal/async-iterable-iterator.js'), AsyncIterableIterator = _require2.AsyncIterableIterator; var _require3 = require('../../internal/async-parallel-each.js'), asyncParallelEach = _require3.asyncParallelEach; var _require4 = require('../../internal/async-peekerator.js'), AsyncPeekerator = _require4.AsyncPeekerator; var _require5 = require('../$map/async-map.js'), __asyncMap = _require5.__asyncMap; var _require6 = require('../$to-array/async-to-array.js'), __asyncToArray = _require6.__asyncToArray; var _ = Symbol["for"]('_'); var __advance = Symbol["for"]('__advance'); var AsyncSummarizedPeekerator = /*#__PURE__*/function (_AsyncPeekerator) { _inherits(AsyncSummarizedPeekerator, _AsyncPeekerator); var _super = _createSuper(AsyncSummarizedPeekerator); function AsyncSummarizedPeekerator(iterator, first, inputSummary) { var _this; _classCallCheck(this, AsyncSummarizedPeekerator); _this = _super.call(this, iterator, first); _this[_].inputSummary = inputSummary; return _this; } _createClass(AsyncSummarizedPeekerator, [{ key: "advance", value: function () { var _advance = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee() { return _regeneratorRuntime.wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: _context.next = 2; return this[_].inputSummary.advanceBuffer(this); case 2: case "end": return _context.stop(); } } }, _callee, this); })); function advance() { return _advance.apply(this, arguments); } return advance; }() }, { key: __advance, value: function () { var _value = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee2() { return _regeneratorRuntime.wrap(function _callee2$(_context2) { while (1) { switch (_context2.prev = _context2.next) { case 0: _context2.next = 2; return _get(_getPrototypeOf(AsyncSummarizedPeekerator.prototype), "advance", this).call(this); case 2: case "end": return _context2.stop(); } } }, _callee2, this); })); function value() { return _value.apply(this, arguments); } return value; }() }]); return AsyncSummarizedPeekerator; }(AsyncPeekerator); var AsyncInputSummaryInternal = /*#__PURE__*/function () { function AsyncInputSummaryInternal() { _classCallCheck(this, AsyncInputSummaryInternal); this.buffers = []; this.notDoneBuffer = null; this.index = 0; } _createClass(AsyncInputSummaryInternal, [{ key: "init", value: function init(buffers) { this.buffers = buffers; this.updateNotDone(); } }, { key: "updateNotDone", value: function updateNotDone() { this.notDoneBuffer = this.buffers.find(function (buffer) { return !buffer.done; }); } }, { key: "advanceBuffer", value: function () { var _advanceBuffer = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee3(buffer) { var wasDone; return _regeneratorRuntime.wrap(function _callee3$(_context3) { while (1) { switch (_context3.prev = _context3.next) { case 0: wasDone = buffer.done; _context3.next = 3; return buffer[__advance](); case 3: this.index++; if (!wasDone && buffer.done) { this.updateNotDone(); } case 5: case "end": return _context3.stop(); } } }, _callee3, this); })); function advanceBuffer(_x) { return _advanceBuffer.apply(this, arguments); } return advanceBuffer; }() }]); return AsyncInputSummaryInternal; }(); var AsyncInputSummary = /*#__PURE__*/function () { function AsyncInputSummary(internal) { _classCallCheck(this, AsyncInputSummary); this[_] = internal; } _createClass(AsyncInputSummary, [{ key: "advance", value: function advance() { throw new Error('advance() is not supported on an interleave summary'); } }, { key: "current", get: function get() { return { value: this.value, done: this.done }; } }, { key: "value", get: function get() { return this[_].notDoneBuffer; } }, { key: "done", get: function get() { return this[_].notDoneBuffer === undefined; } }, { key: "index", get: function get() { return this[_].index; } }]); return AsyncInputSummary; }(); exports.AsyncInputSummary = AsyncInputSummary; var AsyncInterleaver = /*#__PURE__*/function (_AsyncIterableIterato) { _inherits(AsyncInterleaver, _AsyncIterableIterato); var _super2 = _createSuper(AsyncInterleaver); function AsyncInterleaver(sources, strategy, options) { var _this2; _classCallCheck(this, AsyncInterleaver); _this2 = _super2.call(this); _this2.sources = sources; _this2.strategy = strategy; _this2.options = options; _this2.initialized = false; _this2.inputSummary = new AsyncInputSummaryInternal(sources); return _this2; } _createClass(AsyncInterleaver, [{ key: "init", value: function () { var _init = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee4() { var strategy, options, inputSummary; return _regeneratorRuntime.wrap(function _callee4$(_context4) { while (1) { switch (_context4.prev = _context4.next) { case 0: this.initialized = true; strategy = this.strategy, options = this.options, inputSummary = this.inputSummary; _context4.next = 4; return __asyncToArray(__asyncMap(this.sources, function (source) { return AsyncSummarizedPeekerator.from(source, inputSummary); })); case 4: this.buffers = _context4.sent; this.iterator = strategy.apply(void 0, [options, new AsyncInputSummary(inputSummary)].concat(_toConsumableArray(this.buffers))); _context4.next = 8; return inputSummary.init(this.buffers); case 8: case "end": return _context4.stop(); } } }, _callee4, this); })); function init() { return _init.apply(this, arguments); } return init; }() }, { key: "returnBuffers", value: function () { var _returnBuffers = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee5() { return _regeneratorRuntime.wrap(function _callee5$(_context5) { while (1) { switch (_context5.prev = _context5.next) { case 0: _context5.next = 2; return asyncParallelEach(this.buffers, function (buffer) { return buffer["return"](); }); case 2: case "end": return _context5.stop(); } } }, _callee5, this); })); function returnBuffers() { return _returnBuffers.apply(this, arguments); } return returnBuffers; }() }, { key: "next", value: function () { var _next = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee6() { var step; return _regeneratorRuntime.wrap(function _callee6$(_context6) { while (1) { switch (_context6.prev = _context6.next) { case 0: if (this.initialized) { _context6.next = 3; break; } _context6.next = 3; return this.init(); case 3: _context6.next = 5; return this.iterator.next(); case 5: step = _context6.sent; if (!step.done) { _context6.next = 9; break; } _context6.next = 9; return this.returnBuffers(); case 9: return _context6.abrupt("return", step); case 10: case "end": return _context6.stop(); } } }, _callee6, this); })); function next() { return _next.apply(this, arguments); } return next; }() }, { key: "return", value: function () { var _return2 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee7() { return _regeneratorRuntime.wrap(function _callee7$(_context7) { while (1) { switch (_context7.prev = _context7.next) { case 0: _context7.next = 2; return asyncCallReturn(this.iterator); case 2: _context7.next = 4; return this.returnBuffers(); case 4: return _context7.abrupt("return", { value: undefined, done: true }); case 5: case "end": return _context7.stop(); } } }, _callee7, this); })); function _return() { return _return2.apply(this, arguments); } return _return; }() }]); return AsyncInterleaver; }(AsyncIterableIterator); function __asyncInterleave(sources, strategy) { var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; return new AsyncInterleaver(sources, strategy, options); } exports.__asyncInterleave = __asyncInterleave; var asyncInterleave = /*#__PURE__*/asyncIterableCurry(__asyncInterleave, { variadic: true, growRight: true, minArgs: 1, maxArgs: 2 }); exports.asyncInterleave = asyncInterleave; },{"../$map/async-map.js":337,"../$to-array/async-to-array.js":398,"../../internal/async-iterable-iterator.js":479,"../../internal/async-iterable.js":480,"../../internal/async-parallel-each.js":481,"../../internal/async-peekerator.js":483,"@babel/runtime/helpers/asyncToGenerator":43,"@babel/runtime/helpers/classCallCheck":45,"@babel/runtime/helpers/createClass":47,"@babel/runtime/helpers/get":49,"@babel/runtime/helpers/getPrototypeOf":50,"@babel/runtime/helpers/inherits":51,"@babel/runtime/helpers/possibleConstructorReturn":57,"@babel/runtime/helpers/toConsumableArray":61,"@babel/runtime/regenerator":65}],322:[function(require,module,exports){ var _toConsumableArray = require("@babel/runtime/helpers/toConsumableArray"); var _classCallCheck = require("@babel/runtime/helpers/classCallCheck"); var _createClass = require("@babel/runtime/helpers/createClass"); var _get = require("@babel/runtime/helpers/get"); var _inherits = require("@babel/runtime/helpers/inherits"); var _possibleConstructorReturn = require("@babel/runtime/helpers/possibleConstructorReturn"); var _getPrototypeOf = require("@babel/runtime/helpers/getPrototypeOf"); function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } } var _require = require('../../internal/iterable.js'), iterableCurry = _require.iterableCurry, callReturn = _require.callReturn; var _require2 = require('../../internal/iterable-iterator.js'), IterableIterator = _require2.IterableIterator; var _require3 = require('../../internal/parallel-each.js'), parallelEach = _require3.parallelEach; var _require4 = require('../../internal/peekerator.js'), Peekerator = _require4.Peekerator; var _require5 = require('../$map/map.js'), __map = _require5.__map; var _require6 = require('../$to-array/to-array.js'), __toArray = _require6.__toArray; var _ = Symbol["for"]('_'); var __advance = Symbol["for"]('__advance'); var SummarizedPeekerator = /*#__PURE__*/function (_Peekerator) { _inherits(SummarizedPeekerator, _Peekerator); var _super = _createSuper(SummarizedPeekerator); function SummarizedPeekerator(iterator, first, inputSummary) { var _this; _classCallCheck(this, SummarizedPeekerator); _this = _super.call(this, iterator, first); _this[_].inputSummary = inputSummary; return _this; } _createClass(SummarizedPeekerator, [{ key: "advance", value: function advance() { this[_].inputSummary.advanceBuffer(this); } }, { key: __advance, value: function value() { _get(_getPrototypeOf(SummarizedPeekerator.prototype), "advance", this).call(this); } }]); return SummarizedPeekerator; }(Peekerator); var InputSummaryInternal = /*#__PURE__*/function () { function InputSummaryInternal() { _classCallCheck(this, InputSummaryInternal); this.buffers = []; this.notDoneBuffer = null; this.index = 0; } _createClass(InputSummaryInternal, [{ key: "init", value: function init(buffers) { this.buffers = buffers; this.updateNotDone(); } }, { key: "updateNotDone", value: function updateNotDone() { this.notDoneBuffer = this.buffers.find(function (buffer) { return !buffer.done; }); } }, { key: "advanceBuffer", value: function advanceBuffer(buffer) { var wasDone = buffer.done; buffer[__advance](); this.index++; if (!wasDone && buffer.done) { this.updateNotDone(); } } }]); return InputSummaryInternal; }(); var InputSummary = /*#__PURE__*/function () { function InputSummary(internal) { _classCallCheck(this, InputSummary); this[_] = internal; } _createClass(InputSummary, [{ key: "advance", value: function advance() { throw new Error('advance() is not supported on an interleave summary'); } }, { key: "current", get: function get() { return { value: this.value, done: this.done }; } }, { key: "value", get: function get() { return this[_].notDoneBuffer; } }, { key: "done", get: function get() { return this[_].notDoneBuffer === undefined; } }, { key: "index", get: function get() { return this[_].index; } }]); return InputSummary; }(); exports.InputSummary = InputSummary; var Interleaver = /*#__PURE__*/function (_IterableIterator) { _inherits(Interleaver, _IterableIterator); var _super2 = _createSuper(Interleaver); function Interleaver(sources, strategy, options) { var _this2; _classCallCheck(this, Interleaver); _this2 = _super2.call(this); _this2.sources = sources; _this2.strategy = strategy; _this2.options = options; _this2.initialized = false; _this2.inputSummary = new InputSummaryInternal(sources); return _this2; } _createClass(Interleaver, [{ key: "init", value: function init() { this.initialized = true; var strategy = this.strategy, options = this.options, inputSummary = this.inputSummary; this.buffers = __toArray(__map(this.sources, function (source) { return SummarizedPeekerator.from(source, inputSummary); })); this.iterator = strategy.apply(void 0, [options, new InputSummary(inputSummary)].concat(_toConsumableArray(this.buffers))); inputSummary.init(this.buffers); } }, { key: "returnBuffers", value: function returnBuffers() { parallelEach(this.buffers, function (buffer) { return buffer["return"](); }); } }, { key: "next", value: function next() { if (!this.initialized) this.init(); var step = this.iterator.next(); if (step.done) this.returnBuffers(); return step; } }, { key: "return", value: function _return() { callReturn(this.iterator); this.returnBuffers(); return { value: undefined, done: true }; } }]); return Interleaver; }(IterableIterator); function __interleave(sources, strategy) { var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; return new Interleaver(sources, strategy, options); } exports.__interleave = __interleave; var interleave = /*#__PURE__*/iterableCurry(__interleave, { variadic: true, growRight: true, minArgs: 1, maxArgs: 2 }); exports.interleave = interleave; },{"../$map/map.js":338,"../$to-array/to-array.js":399,"../../internal/iterable-iterator.js":492,"../../internal/iterable.js":493,"../../internal/parallel-each.js":495,"../../internal/peekerator.js":497,"@babel/runtime/helpers/classCallCheck":45,"@babel/runtime/helpers/createClass":47,"@babel/runtime/helpers/get":49,"@babel/runtime/helpers/getPrototypeOf":50,"@babel/runtime/helpers/inherits":51,"@babel/runtime/helpers/possibleConstructorReturn":57,"@babel/runtime/helpers/toConsumableArray":61}],323:[function(require,module,exports){ var _regeneratorRuntime = require("@babel/runtime/regenerator"); var _wrapAsyncGenerator = require("@babel/runtime/helpers/wrapAsyncGenerator"); var _awaitAsyncGenerator = require("@babel/runtime/helpers/awaitAsyncGenerator"); var _asyncGeneratorDelegate = require("@babel/runtime/helpers/asyncGeneratorDelegate"); var _asyncIterator = require("@babel/runtime/helpers/asyncIterator"); var _require = require('../../internal/async-iterable.js'), asyncIterableCurry = _require.asyncIterableCurry, asyncCache = _require.asyncCache; function __asyncInterposeSeq(_x, _x2) { return _asyncInterposeSeq.apply(this, arguments); } exports.__asyncInterposeSeq = __asyncInterposeSeq; function _asyncInterposeSeq() { _asyncInterposeSeq = _wrapAsyncGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(source, seq) { var subseq_, first, _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, _value, sourceValue; return _regeneratorRuntime.wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: _context.next = 2; return _awaitAsyncGenerator(asyncCache(seq)); case 2: subseq_ = _context.sent; first = true; _iteratorNormalCompletion = true; _didIteratorError = false; _context.prev = 6; _iterator = _asyncIterator(source); case 8: _context.next = 10; return _awaitAsyncGenerator(_iterator.next()); case 10: _step = _context.sent; _iteratorNormalCompletion = _step.done; _context.next = 14; return _awaitAsyncGenerator(_step.value); case 14: _value = _context.sent; if (_iteratorNormalCompletion) { _context.next = 25; break; } sourceValue = _value; if (first) { _context.next = 19; break; } return _context.delegateYield(_asyncGeneratorDelegate(_asyncIterator(subseq_), _awaitAsyncGenerator), "t0", 19); case 19: _context.next = 21; return sourceValue; case 21: first = false; case 22: _iteratorNormalCompletion = true; _context.next = 8; break; case 25: _context.next = 31; break; case 27: _context.prev = 27; _context.t1 = _context["catch"](6); _didIteratorError = true; _iteratorError = _context.t1; case 31: _context.prev = 31; _context.prev = 32; if (!(!_iteratorNormalCompletion && _iterator["return"] != null)) { _context.next = 36; break; } _context.next = 36; return _awaitAsyncGenerator(_iterator["return"]()); case 36: _context.prev = 36; if (!_didIteratorError) { _context.next = 39; break; } throw _iteratorError; case 39: return _context.finish(36); case 40: return _context.finish(31); case 41: case "end": return _context.stop(); } } }, _callee, null, [[6, 27, 31, 41], [32,, 36, 40]]); })); return _asyncInterposeSeq.apply(this, arguments); } var asyncInterposeSeq = /*#__PURE__*/asyncIterableCurry(__asyncInterposeSeq); exports.asyncInterposeSeq = asyncInterposeSeq; },{"../../internal/async-iterable.js":480,"@babel/runtime/helpers/asyncGeneratorDelegate":41,"@babel/runtime/helpers/asyncIterator":42,"@babel/runtime/helpers/awaitAsyncGenerator":44,"@babel/runtime/helpers/wrapAsyncGenerator":64,"@babel/runtime/regenerator":65}],324:[function(require,module,exports){ var _regeneratorRuntime = require("@babel/runtime/regenerator"); var _marked = /*#__PURE__*/_regeneratorRuntime.mark(__interposeSeq); function _createForOfIteratorHelper(o, allowArrayLike) { var it; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; } function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } var _require = require('../../internal/iterable.js'), iterableCurry = _require.iterableCurry, cache = _require.cache; function __interposeSeq(source, seq) { var subseq_, first, _iterator, _step, sourceValue; return _regeneratorRuntime.wrap(function __interposeSeq$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: subseq_ = cache(seq); first = true; _iterator = _createForOfIteratorHelper(source); _context.prev = 3; _iterator.s(); case 5: if ((_step = _iterator.n()).done) { _context.next = 14; break; } sourceValue = _step.value; if (first) { _context.next = 9; break; } return _context.delegateYield(subseq_, "t0", 9); case 9: _context.next = 11; return sourceValue; case 11: first = false; case 12: _context.next = 5; break; case 14: _context.next = 19; break; case 16: _context.prev = 16; _context.t1 = _context["catch"](3); _iterator.e(_context.t1); case 19: _context.prev = 19; _iterator.f(); return _context.finish(19); case 22: case "end": return _context.stop(); } } }, _marked, null, [[3, 16, 19, 22]]); } exports.__interposeSeq = __interposeSeq; var interposeSeq = /*#__PURE__*/iterableCurry(__interposeSeq); exports.interposeSeq = interposeSeq; },{"../../internal/iterable.js":493,"@babel/runtime/regenerator":65}],325:[function(require,module,exports){ var _require = require('../../internal/async-iterable.js'), asyncIterableCurry = _require.asyncIterableCurry; var _require2 = require('../$interpose-seq/async-interpose-seq.js'), __asyncInterposeSeq = _require2.__asyncInterposeSeq; function __asyncInterpose(source, value) { return __asyncInterposeSeq(source, [value]); } exports.__asyncInterpose = __asyncInterpose; var asyncInterpose = /*#__PURE__*/asyncIterableCurry(__asyncInterpose, { validateArgs: function validateArgs(args) {} }); exports.asyncInterpose = asyncInterpose; },{"../$interpose-seq/async-interpose-seq.js":323,"../../internal/async-iterable.js":480}],326:[function(require,module,exports){ var _require = require('../../internal/iterable.js'), iterableCurry = _require.iterableCurry; var _require2 = require('../$interpose-seq/interpose-seq.js'), __interposeSeq = _require2.__interposeSeq; function __interpose(source, value) { return __interposeSeq(source, [value]); } exports.__interpose = __interpose; var interpose = /*#__PURE__*/iterableCurry(__interpose, { validateArgs: function validateArgs(args) { if (true && typeof args[0] === 'string') { console.warn("For string inputs use interposeSeq instead of interpose"); } } }); exports.interpose = interpose; },{"../$interpose-seq/interpose-seq.js":324,"../../internal/iterable.js":493}],327:[function(require,module,exports){ var _regeneratorRuntime = require("@babel/runtime/regenerator"); var _asyncToGenerator = require("@babel/runtime/helpers/asyncToGenerator"); var _require = require('../../internal/async-iterable.js'), asyncIterableCurry = _require.asyncIterableCurry; var _require2 = require('../$first-or/async-first-or.js'), __asyncFirstOr = _require2.__asyncFirstOr; var none = Symbol('none'); function __asyncIsEmpty(_x) { return _asyncIsEmpty.apply(this, arguments); } function _asyncIsEmpty() { _asyncIsEmpty = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(iterable) { return _regeneratorRuntime.wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: _context.next = 2; return __asyncFirstOr(iterable, none); case 2: _context.t0 = _context.sent; _context.t1 = none; return _context.abrupt("return", _context.t0 === _context.t1); case 5: case "end": return _context.stop(); } } }, _callee); })); return _asyncIsEmpty.apply(this, arguments); } exports.__asyncIsEmpty = __asyncIsEmpty; var asyncIsEmpty = /*#__PURE__*/asyncIterableCurry(__asyncIsEmpty, { reduces: true }); exports.asyncIsEmpty = asyncIsEmpty; },{"../$first-or/async-first-or.js":298,"../../internal/async-iterable.js":480,"@babel/runtime/helpers/asyncToGenerator":43,"@babel/runtime/regenerator":65}],328:[function(require,module,exports){ var _require = require('../../internal/iterable.js'), iterableCurry = _require.iterableCurry; var _require2 = require('../$first-or/first-or.js'), __firstOr = _require2.__firstOr; var none = Symbol('none'); function __isEmpty(iterable) { return __firstOr(iterable, none) === none; } exports.__isEmpty = __isEmpty; var isEmpty = /*#__PURE__*/iterableCurry(__isEmpty, { reduces: true }); exports.isEmpty = isEmpty; },{"../$first-or/first-or.js":299,"../../internal/iterable.js":493}],329:[function(require,module,exports){ var _regeneratorRuntime = require("@babel/runtime/regenerator"); var _asyncToGenerator = require("@babel/runtime/helpers/asyncToGenerator"); var _require = require('../../internal/async-iterable.js'), asyncIterableCurry = _require.asyncIterableCurry; var _require2 = require('../../internal/compare.js'), defaultCompareOrder = _require2.defaultCompareOrder; var _require3 = require('../$peekerate/async-peekerate.js'), __asyncPeekerate = _require3.__asyncPeekerate; function __asyncIsSorted(_x) { return _asyncIsSorted.apply(this, arguments); } function _asyncIsSorted() { _asyncIsSorted = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(iterable) { var compare, peekr, value, _args = arguments; return _regeneratorRuntime.wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: compare = _args.length > 1 && _args[1] !== undefined ? _args[1] : defaultCompareOrder; _context.next = 3; return __asyncPeekerate(iterable); case 3: peekr = _context.sent; case 4: if (peekr.done) { _context.next = 14; break; } value = peekr.value; _context.next = 8; return peekr.advance(); case 8: if (!(!peekr.done && compare(value, peekr.value) > 0)) { _context.next = 12; break; } _context.next = 11; return peekr["return"](); case 11: return _context.abrupt("return", false); case 12: _context.next = 4; break; case 14: return _context.abrupt("return", true); case 15: case "end": return _context.stop(); } } }, _callee); })); return _asyncIsSorted.apply(this, arguments); } exports.__asyncIsSorted = __asyncIsSorted; var asyncIsSorted = /*#__PURE__*/asyncIterableCurry(__asyncIsSorted, { reduces: true, minArgs: 0, maxArgs: 1 }); exports.asyncIsSorted = asyncIsSorted; },{"../$peekerate/async-peekerate.js":339,"../../internal/async-iterable.js":480,"../../internal/compare.js":487,"@babel/runtime/helpers/asyncToGenerator":43,"@babel/runtime/regenerator":65}],330:[function(require,module,exports){ var _require = require('../../internal/iterable.js'), iterableCurry = _require.iterableCurry; var _require2 = require('../../internal/compare.js'), defaultCompareOrder = _require2.defaultCompareOrder; var _require3 = require('../$peekerate/peekerate.js'), __peekerate = _require3.__peekerate; function __isSorted(iterable) { var compare = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : defaultCompareOrder; var peekr = __peekerate(iterable); while (!peekr.done) { var value = peekr.value; peekr.advance(); if (!peekr.done && compare(value, peekr.value) > 0) { peekr["return"](); return false; } } return true; } exports.__isSorted = __isSorted; var isSorted = /*#__PURE__*/iterableCurry(__isSorted, { reduces: true, minArgs: 0, maxArgs: 1 }); exports.isSorted = isSorted; },{"../$peekerate/peekerate.js":340,"../../internal/compare.js":487,"../../internal/iterable.js":493}],331:[function(require,module,exports){ var _regeneratorRuntime = require("@babel/runtime/regenerator"); var _wrapAsyncGenerator = require("@babel/runtime/helpers/wrapAsyncGenerator"); var _awaitAsyncGenerator = require("@babel/runtime/helpers/awaitAsyncGenerator"); var _asyncGeneratorDelegate = require("@babel/runtime/helpers/asyncGeneratorDelegate"); var _asyncIterator = require("@babel/runtime/helpers/asyncIterator"); var _require = require('../../internal/async-iterable.js'), asyncIterableCurry = _require.asyncIterableCurry; var _require2 = require('../$to-array/async-to-array.js'), __asyncToArray = _require2.__asyncToArray; function __asyncJoinWithSeq(_x, _x2) { return _asyncJoinWithSeq.apply(this, arguments); } exports.__asyncJoinWithSeq = __asyncJoinWithSeq; function _asyncJoinWithSeq() { _asyncJoinWithSeq = _wrapAsyncGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(source, separatorSeq) { var _separatorSeq, isFirst, _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, _value, value; return _regeneratorRuntime.wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: _context.next = 2; return _awaitAsyncGenerator(__asyncToArray(separatorSeq)); case 2: _separatorSeq = _context.sent; isFirst = true; _iteratorNormalCompletion = true; _didIteratorError = false; _context.prev = 6; _iterator = _asyncIterator(source); case 8: _context.next = 10; return _awaitAsyncGenerator(_iterator.next()); case 10: _step = _context.sent; _iteratorNormalCompletion = _step.done; _context.next = 14; return _awaitAsyncGenerator(_step.value); case 14: _value = _context.sent; if (_iteratorNormalCompletion) { _context.next = 24; break; } value = _value; if (isFirst) { _context.next = 19; break; } return _context.delegateYield(_asyncGeneratorDelegate(_asyncIterator(_separatorSeq), _awaitAsyncGenerator), "t0", 19); case 19: return _context.delegateYield(_asyncGeneratorDelegate(_asyncIterator(value), _awaitAsyncGenerator), "t1", 20); case 20: isFirst = false; case 21: _iteratorNormalCompletion = true; _context.next = 8; break; case 24: _context.next = 30; break; case 26: _context.prev = 26; _context.t2 = _context["catch"](6); _didIteratorError = true; _iteratorError = _context.t2; case 30: _context.prev = 30; _context.prev = 31; if (!(!_iteratorNormalCompletion && _iterator["return"] != null)) { _context.next = 35; break; } _context.next = 35; return _awaitAsyncGenerator(_iterator["return"]()); case 35: _context.prev = 35; if (!_didIteratorError) { _context.next = 38; break; } throw _iteratorError; case 38: return _context.finish(35); case 39: return _context.finish(30); case 40: case "end": return _context.stop(); } } }, _callee, null, [[6, 26, 30, 40], [31,, 35, 39]]); })); return _asyncJoinWithSeq.apply(this, arguments); } var asyncJoinWithSeq = /*#__PURE__*/asyncIterableCurry(__asyncJoinWithSeq); exports.asyncJoinWithSeq = asyncJoinWithSeq; },{"../$to-array/async-to-array.js":398,"../../internal/async-iterable.js":480,"@babel/runtime/helpers/asyncGeneratorDelegate":41,"@babel/runtime/helpers/asyncIterator":42,"@babel/runtime/helpers/awaitAsyncGenerator":44,"@babel/runtime/helpers/wrapAsyncGenerator":64,"@babel/runtime/regenerator":65}],332:[function(require,module,exports){ var _regeneratorRuntime = require("@babel/runtime/regenerator"); var _marked = /*#__PURE__*/_regeneratorRuntime.mark(__joinWithSeq); function _createForOfIteratorHelper(o, allowArrayLike) { var it; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; } function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } var _require = require('../../internal/iterable.js'), iterableCurry = _require.iterableCurry; var _require2 = require('../$to-array/to-array.js'), __toArray = _require2.__toArray; function __joinWithSeq(source, separatorSeq) { var _separatorSeq, isFirst, _iterator, _step, value; return _regeneratorRuntime.wrap(function __joinWithSeq$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: _separatorSeq = __toArray(separatorSeq); isFirst = true; _iterator = _createForOfIteratorHelper(source); _context.prev = 3; _iterator.s(); case 5: if ((_step = _iterator.n()).done) { _context.next = 13; break; } value = _step.value; if (isFirst) { _context.next = 9; break; } return _context.delegateYield(_separatorSeq, "t0", 9); case 9: return _context.delegateYield(value, "t1", 10); case 10: isFirst = false; case 11: _context.next = 5; break; case 13: _context.next = 18; break; case 15: _context.prev = 15; _context.t2 = _context["catch"](3); _iterator.e(_context.t2); case 18: _context.prev = 18; _iterator.f(); return _context.finish(18); case 21: case "end": return _context.stop(); } } }, _marked, null, [[3, 15, 18, 21]]); } exports.__joinWithSeq = __joinWithSeq; var joinWithSeq = /*#__PURE__*/iterableCurry(__joinWithSeq); exports.joinWithSeq = joinWithSeq; },{"../$to-array/to-array.js":399,"../../internal/iterable.js":493,"@babel/runtime/regenerator":65}],333:[function(require,module,exports){ var _require = require('../../internal/async-iterable.js'), asyncIterableCurry = _require.asyncIterableCurry; var _require2 = require('../$join-with-seq/async-join-with-seq.js'), __asyncJoinWithSeq = _require2.__asyncJoinWithSeq; function __asyncJoinWith(source, separator) { return __asyncJoinWithSeq(source, [separator]); } exports.__asyncJoinWith = __asyncJoinWith; var asyncJoinWith = /*#__PURE__*/asyncIterableCurry(__asyncJoinWith, { validateArgs: function validateArgs(args) {} }); exports.asyncJoinWith = asyncJoinWith; },{"../$join-with-seq/async-join-with-seq.js":331,"../../internal/async-iterable.js":480}],334:[function(require,module,exports){ var _require = require('../../internal/iterable.js'), iterableCurry = _require.iterableCurry; var _require2 = require('../$join-with-seq/join-with-seq.js'), __joinWithSeq = _require2.__joinWithSeq; function __joinWith(source, separator) { return __joinWithSeq(source, [separator]); } exports.__joinWith = __joinWith; var joinWith = /*#__PURE__*/iterableCurry(__joinWith, { validateArgs: function validateArgs(args) { if (true && typeof args[0] === 'string') { console.warn("For string inputs use joinWithSeq instead of joinWith"); } } }); exports.joinWith = joinWith; },{"../$join-with-seq/join-with-seq.js":332,"../../internal/iterable.js":493}],335:[function(require,module,exports){ var _require = require('../../internal/async-iterable.js'), asyncWrapWithIterableIterator = _require.asyncWrapWithIterableIterator, asyncEnsureIterable = _require.asyncEnsureIterable; var _require2 = require('../$join-with-seq/async-join-with-seq.js'), __asyncJoinWithSeq = _require2.__asyncJoinWithSeq; var emptySeq = []; function __asyncJoin(source) { return __asyncJoinWithSeq(asyncEnsureIterable(source), emptySeq); } exports.__asyncJoin = __asyncJoin; var asyncJoin = /*#__PURE__*/asyncWrapWithIterableIterator(__asyncJoin); exports.asyncJoin = asyncJoin; },{"../$join-with-seq/async-join-with-seq.js":331,"../../internal/async-iterable.js":480}],336:[function(require,module,exports){ var _require = require('../../internal/iterable.js'), wrapWithIterableIterator = _require.wrapWithIterableIterator, ensureIterable = _require.ensureIterable; var _require2 = require('../$join-with-seq/join-with-seq.js'), __joinWithSeq = _require2.__joinWithSeq; var emptySeq = []; function __join(source) { return __joinWithSeq(ensureIterable(source), emptySeq); } exports.__join = __join; var join = /*#__PURE__*/wrapWithIterableIterator(__join); exports.join = join; },{"../$join-with-seq/join-with-seq.js":332,"../../internal/iterable.js":493}],337:[function(require,module,exports){ var _regeneratorRuntime = require("@babel/runtime/regenerator"); var _awaitAsyncGenerator = require("@babel/runtime/helpers/awaitAsyncGenerator"); var _wrapAsyncGenerator = require("@babel/runtime/helpers/wrapAsyncGenerator"); var _asyncIterator = require("@babel/runtime/helpers/asyncIterator"); var _require = require('../../internal/async-iterable.js'), asyncIterableCurry = _require.asyncIterableCurry; function __asyncMap(_x, _x2) { return _asyncMap.apply(this, arguments); } exports.__asyncMap = __asyncMap; function _asyncMap() { _asyncMap = _wrapAsyncGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(source, func) { var c, _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, _value, value; return _regeneratorRuntime.wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: c = 0; _iteratorNormalCompletion = true; _didIteratorError = false; _context.prev = 3; _iterator = _asyncIterator(source); case 5: _context.next = 7; return _awaitAsyncGenerator(_iterator.next()); case 7: _step = _context.sent; _iteratorNormalCompletion = _step.done; _context.next = 11; return _awaitAsyncGenerator(_step.value); case 11: _value = _context.sent; if (_iteratorNormalCompletion) { _context.next = 19; break; } value = _value; _context.next = 16; return func(value, c++); case 16: _iteratorNormalCompletion = true; _context.next = 5; break; case 19: _context.next = 25; break; case 21: _context.prev = 21; _context.t0 = _context["catch"](3); _didIteratorError = true; _iteratorError = _context.t0; case 25: _context.prev = 25; _context.prev = 26; if (!(!_iteratorNormalCompletion && _iterator["return"] != null)) { _context.next = 30; break; } _context.next = 30; return _awaitAsyncGenerator(_iterator["return"]()); case 30: _context.prev = 30; if (!_didIteratorError) { _context.next = 33; break; } throw _iteratorError; case 33: return _context.finish(30); case 34: return _context.finish(25); case 35: case "end": return _context.stop(); } } }, _callee, null, [[3, 21, 25, 35], [26,, 30, 34]]); })); return _asyncMap.apply(this, arguments); } var asyncMap = /*#__PURE__*/asyncIterableCurry(__asyncMap); exports.asyncMap = asyncMap; },{"../../internal/async-iterable.js":480,"@babel/runtime/helpers/asyncIterator":42,"@babel/runtime/helpers/awaitAsyncGenerator":44,"@babel/runtime/helpers/wrapAsyncGenerator":64,"@babel/runtime/regenerator":65}],338:[function(require,module,exports){ var _regeneratorRuntime = require("@babel/runtime/regenerator"); var _marked = /*#__PURE__*/_regeneratorRuntime.mark(__map); function _createForOfIteratorHelper(o, allowArrayLike) { var it; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; } function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } var _require = require('../../internal/iterable.js'), iterableCurry = _require.iterableCurry; function __map(source, func) { var c, _iterator, _step, value; return _regeneratorRuntime.wrap(function __map$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: c = 0; _iterator = _createForOfIteratorHelper(source); _context.prev = 2; _iterator.s(); case 4: if ((_step = _iterator.n()).done) { _context.next = 10; break; } value = _step.value; _context.next = 8; return func(value, c++); case 8: _context.next = 4; break; case 10: _context.next = 15; break; case 12: _context.prev = 12; _context.t0 = _context["catch"](2); _iterator.e(_context.t0); case 15: _context.prev = 15; _iterator.f(); return _context.finish(15); case 18: case "end": return _context.stop(); } } }, _marked, null, [[2, 12, 15, 18]]); } exports.__map = __map; var map = /*#__PURE__*/iterableCurry(__map); exports.map = map; },{"../../internal/iterable.js":493,"@babel/runtime/regenerator":65}],339:[function(require,module,exports){ var _require = require('../../internal/async-iterable.js'), asyncEnsureIterable = _require.asyncEnsureIterable; var _require2 = require('../../internal/async-peekerator.js'), AsyncPeekerator = _require2.AsyncPeekerator; function __asyncPeekerate(source) { return AsyncPeekerator.from(source); } exports.__asyncPeekerate = __asyncPeekerate; function asyncWrapWithEnsureIterable(fn) { return function (source) { return fn(asyncEnsureIterable(source)); }; } var asyncPeekerate = asyncWrapWithEnsureIterable(__asyncPeekerate); exports.asyncPeekerate = asyncPeekerate; },{"../../internal/async-iterable.js":480,"../../internal/async-peekerator.js":483}],340:[function(require,module,exports){ var _require = require('../../internal/iterable.js'), ensureIterable = _require.ensureIterable; var _require2 = require('../../internal/peekerator.js'), Peekerator = _require2.Peekerator; function __peekerate(source) { return Peekerator.from(source); } exports.__peekerate = __peekerate; function wrapWithEnsureIterable(fn) { return function (source) { return fn(ensureIterable(source)); }; } var peekerate = wrapWithEnsureIterable(__peekerate); exports.peekerate = peekerate; },{"../../internal/iterable.js":493,"../../internal/peekerator.js":497}],341:[function(require,module,exports){ var _regeneratorRuntime = require("@babel/runtime/regenerator"); var _wrapAsyncGenerator = require("@babel/runtime/helpers/wrapAsyncGenerator"); var _awaitAsyncGenerator = require("@babel/runtime/helpers/awaitAsyncGenerator"); var _asyncIterator = require("@babel/runtime/helpers/asyncIterator"); var _asyncGeneratorDelegate = require("@babel/runtime/helpers/asyncGeneratorDelegate"); var _require = require('../../internal/async-iterable.js'), asyncIterableCurry = _require.asyncIterableCurry; function __asyncPrepend(_x, _x2) { return _asyncPrepend.apply(this, arguments); } exports.__asyncPrepend = __asyncPrepend; function _asyncPrepend() { _asyncPrepend = _wrapAsyncGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(source, value) { return _regeneratorRuntime.wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: _context.next = 2; return value; case 2: return _context.delegateYield(_asyncGeneratorDelegate(_asyncIterator(source), _awaitAsyncGenerator), "t0", 3); case 3: case "end": return _context.stop(); } } }, _callee); })); return _asyncPrepend.apply(this, arguments); } var asyncPrepend = /*#__PURE__*/asyncIterableCurry(__asyncPrepend); exports.asyncPrepend = asyncPrepend; },{"../../internal/async-iterable.js":480,"@babel/runtime/helpers/asyncGeneratorDelegate":41,"@babel/runtime/helpers/asyncIterator":42,"@babel/runtime/helpers/awaitAsyncGenerator":44,"@babel/runtime/helpers/wrapAsyncGenerator":64,"@babel/runtime/regenerator":65}],342:[function(require,module,exports){ var _regeneratorRuntime = require("@babel/runtime/regenerator"); var _marked = /*#__PURE__*/_regeneratorRuntime.mark(__prepend); var _require = require('../../internal/iterable.js'), iterableCurry = _require.iterableCurry; function __prepend(source, value) { return _regeneratorRuntime.wrap(function __prepend$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: _context.next = 2; return value; case 2: return _context.delegateYield(source, "t0", 3); case 3: case "end": return _context.stop(); } } }, _marked); } exports.__prepend = __prepend; var prepend = /*#__PURE__*/iterableCurry(__prepend); exports.prepend = prepend; },{"../../internal/iterable.js":493,"@babel/runtime/regenerator":65}],343:[function(require,module,exports){ var _regeneratorRuntime = require("@babel/runtime/regenerator"); var _asyncToGenerator = require("@babel/runtime/helpers/asyncToGenerator"); var _require = require('../../internal/async-iterable.js'), asyncIterableCurry = _require.asyncIterableCurry; var _require2 = require('../$peekerate/async-peekerate.js'), __asyncPeekerate = _require2.__asyncPeekerate; function __asyncReduce(_x, _x2) { return _asyncReduce.apply(this, arguments); } function _asyncReduce() { _asyncReduce = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(iterable, reducer) { var initial, c, result, peekr, _args = arguments; return _regeneratorRuntime.wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: initial = _args.length > 2 && _args[2] !== undefined ? _args[2] : undefined; c = 0; result = initial; _context.next = 5; return __asyncPeekerate(iterable); case 5: peekr = _context.sent; _context.prev = 6; if (!(initial === undefined)) { _context.next = 14; break; } if (!peekr.done) { _context.next = 10; break; } throw new Error('Cannot reduce: no initial value specified and iterable was empty'); case 10: result = peekr.value; _context.next = 13; return peekr.advance(); case 13: c = 1; case 14: if (peekr.done) { _context.next = 22; break; } _context.next = 17; return reducer(result, peekr.value, c++); case 17: result = _context.sent; _context.next = 20; return peekr.advance(); case 20: _context.next = 14; break; case 22: return _context.abrupt("return", result); case 23: _context.prev = 23; peekr["return"](); return _context.finish(23); case 26: case "end": return _context.stop(); } } }, _callee, null, [[6,, 23, 26]]); })); return _asyncReduce.apply(this, arguments); } exports.__asyncReduce = __asyncReduce; var asyncReduce = /*#__PURE__*/asyncIterableCurry(__asyncReduce, { reduces: true, minArgs: 1, maxArgs: 2 }); exports.asyncReduce = asyncReduce; },{"../$peekerate/async-peekerate.js":339,"../../internal/async-iterable.js":480,"@babel/runtime/helpers/asyncToGenerator":43,"@babel/runtime/regenerator":65}],344:[function(require,module,exports){ var _require = require('../../internal/iterable.js'), iterableCurry = _require.iterableCurry; var _require2 = require('../$peekerate/peekerate.js'), __peekerate = _require2.__peekerate; function __reduce(iterable, reducer) { var initial = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : undefined; var c = 0; var result = initial; var peekr = __peekerate(iterable); try { if (initial === undefined) { if (peekr.done) { throw new Error('Cannot reduce: no initial value specified and iterable was empty'); } result = peekr.value; peekr.advance(); c = 1; } while (!peekr.done) { result = reducer(result, peekr.value, c++); peekr.advance(); } return result; } finally { peekr["return"](); } } exports.__reduce = __reduce; var reduce = /*#__PURE__*/iterableCurry(__reduce, { reduces: true, minArgs: 1, maxArgs: 2 }); exports.reduce = reduce; },{"../$peekerate/peekerate.js":340,"../../internal/iterable.js":493}],345:[function(require,module,exports){ var _regeneratorRuntime = require("@babel/runtime/regenerator"); var _wrapAsyncGenerator = require("@babel/runtime/helpers/wrapAsyncGenerator"); var _awaitAsyncGenerator = require("@babel/runtime/helpers/awaitAsyncGenerator"); var _asyncIterator = require("@babel/runtime/helpers/asyncIterator"); var _asyncGeneratorDelegate = require("@babel/runtime/helpers/asyncGeneratorDelegate"); var _require = require('../../internal/async-iterable.js'), asyncIterableCurry = _require.asyncIterableCurry; var _require2 = require('../$to-array/async-to-array.js'), __asyncToArray = _require2.__asyncToArray; function __asyncReverse(_x) { return _asyncReverse.apply(this, arguments); } exports.__asyncReverse = __asyncReverse; function _asyncReverse() { _asyncReverse = _wrapAsyncGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(source) { return _regeneratorRuntime.wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: _context.t0 = _asyncGeneratorDelegate; _context.t1 = _asyncIterator; _context.next = 4; return _awaitAsyncGenerator(__asyncToArray(source)); case 4: _context.t2 = _context.sent.reverse(); _context.t3 = (0, _context.t1)(_context.t2); _context.t4 = _awaitAsyncGenerator; return _context.delegateYield((0, _context.t0)(_context.t3, _context.t4), "t5", 8); case 8: case "end": return _context.stop(); } } }, _callee); })); return _asyncReverse.apply(this, arguments); } var asyncReverse = /*#__PURE__*/asyncIterableCurry(__asyncReverse); exports.asyncReverse = asyncReverse; },{"../$to-array/async-to-array.js":398,"../../internal/async-iterable.js":480,"@babel/runtime/helpers/asyncGeneratorDelegate":41,"@babel/runtime/helpers/asyncIterator":42,"@babel/runtime/helpers/awaitAsyncGenerator":44,"@babel/runtime/helpers/wrapAsyncGenerator":64,"@babel/runtime/regenerator":65}],346:[function(require,module,exports){ var _regeneratorRuntime = require("@babel/runtime/regenerator"); var _marked = /*#__PURE__*/_regeneratorRuntime.mark(__reverse); var _require = require('../../internal/iterable.js'), iterableCurry = _require.iterableCurry; var _require2 = require('../$to-array/to-array.js'), __toArray = _require2.__toArray; function __reverse(source) { return _regeneratorRuntime.wrap(function __reverse$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: return _context.delegateYield(__toArray(source).reverse(), "t0", 1); case 1: case "end": return _context.stop(); } } }, _marked); } exports.__reverse = __reverse; var reverse = /*#__PURE__*/iterableCurry(__reverse); exports.reverse = reverse; },{"../$to-array/to-array.js":399,"../../internal/iterable.js":493,"@babel/runtime/regenerator":65}],347:[function(require,module,exports){ var _regeneratorRuntime = require("@babel/runtime/regenerator"); var _awaitAsyncGenerator = require("@babel/runtime/helpers/awaitAsyncGenerator"); var _wrapAsyncGenerator = require("@babel/runtime/helpers/wrapAsyncGenerator"); var _require = require('../../internal/async-iterable.js'), asyncIterableCurry = _require.asyncIterableCurry; var _require2 = require('../$interleave/async-interleave.js'), __asyncInterleave = _require2.__asyncInterleave; var _require3 = require('./internal/validate-args.js'), makeValidateArgs = _require3.makeValidateArgs; function asyncByPosition(_x, _x2) { return _asyncByPosition.apply(this, arguments); } function _asyncByPosition() { _asyncByPosition = _wrapAsyncGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(_ref, all) { var start, step, _len, peekrs, _key, i, peekr, _args = arguments; return _regeneratorRuntime.wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: start = _ref.start, step = _ref.step; for (_len = _args.length, peekrs = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) { peekrs[_key - 2] = _args[_key]; } start = start % peekrs.length; i = start; case 4: if (all.done) { _context.next = 14; break; } peekr = peekrs[i]; if (peekr.done) { _context.next = 11; break; } _context.next = 9; return peekr.value; case 9: _context.next = 11; return _awaitAsyncGenerator(peekr.advance()); case 11: i = (i + step) % peekrs.length; _context.next = 4; break; case 14: case "end": return _context.stop(); } } }, _callee); })); return _asyncByPosition.apply(this, arguments); } function __asyncRoundRobin(sources) { var step = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1; var start = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0; return __asyncInterleave(sources, asyncByPosition, { start: start, step: step }); } exports.__asyncRoundRobin = __asyncRoundRobin; var asyncRoundRobin = /*#__PURE__*/asyncIterableCurry(__asyncRoundRobin, { variadic: true, minArgs: 0, maxArgs: 2, validateArgs: /*#__PURE__*/makeValidateArgs('asyncRoundRobin') }); exports.asyncRoundRobin = asyncRoundRobin; },{"../$interleave/async-interleave.js":321,"../../internal/async-iterable.js":480,"./internal/validate-args.js":348,"@babel/runtime/helpers/awaitAsyncGenerator":44,"@babel/runtime/helpers/wrapAsyncGenerator":64,"@babel/runtime/regenerator":65}],348:[function(require,module,exports){ var _require = require('../../../internal/number.js'), isInteger = _require.isInteger; var _require2 = require('../../is-object/is-object.js'), isObject = _require2.isObject; var _require3 = require('../../not-undefined/not-undefined.js'), notUndefined = _require3.notUndefined; var makeValidateArgs = function makeValidateArgs(methodName) { return function validateArgs(args) { if (isObject(args[1])) { var _args$ = args[1], start = _args$.start, step = _args$.step; args[1] = start; args[2] = step; } if (notUndefined(args[2])) { args[2] = Number(args[2]); if (!isInteger(args[2], true)) { throw new Error("step argument to ".concat(methodName, " must be a non-zero integer")); } } }; }; exports.makeValidateArgs = makeValidateArgs; },{"../../../internal/number.js":494,"../../is-object/is-object.js":440,"../../not-undefined/not-undefined.js":456}],349:[function(require,module,exports){ var _regeneratorRuntime = require("@babel/runtime/regenerator"); var _marked = /*#__PURE__*/_regeneratorRuntime.mark(byPosition); var _require = require('../../internal/iterable.js'), iterableCurry = _require.iterableCurry; var _require2 = require('../$interleave/interleave.js'), __interleave = _require2.__interleave; var _require3 = require('./internal/validate-args.js'), makeValidateArgs = _require3.makeValidateArgs; function byPosition(_ref, all) { var start, step, _len, peekrs, _key, i, peekr, _args = arguments; return _regeneratorRuntime.wrap(function byPosition$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: start = _ref.start, step = _ref.step; for (_len = _args.length, peekrs = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) { peekrs[_key - 2] = _args[_key]; } start = start % peekrs.length; i = start; case 4: if (all.done) { _context.next = 13; break; } peekr = peekrs[i]; if (peekr.done) { _context.next = 10; break; } _context.next = 9; return peekr.value; case 9: peekr.advance(); case 10: i = (i + step) % peekrs.length; _context.next = 4; break; case 13: case "end": return _context.stop(); } } }, _marked); } function __roundRobin(sources) { var step = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1; var start = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0; return __interleave(sources, byPosition, { start: start, step: step }); } exports.__roundRobin = __roundRobin; var roundRobin = /*#__PURE__*/iterableCurry(__roundRobin, { variadic: true, minArgs: 0, maxArgs: 2, validateArgs: /*#__PURE__*/makeValidateArgs('roundRobin') }); exports.roundRobin = roundRobin; },{"../$interleave/interleave.js":322,"../../internal/iterable.js":493,"./internal/validate-args.js":348,"@babel/runtime/regenerator":65}],350:[function(require,module,exports){ var _regeneratorRuntime = require("@babel/runtime/regenerator"); var _asyncToGenerator = require("@babel/runtime/helpers/asyncToGenerator"); var _asyncIterator = require("@babel/runtime/helpers/asyncIterator"); var _require = require('../../internal/async-iterable.js'), asyncEnsureIterable = _require.asyncEnsureIterable; function __asyncSize(_x) { return _asyncSize.apply(this, arguments); } function _asyncSize() { _asyncSize = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(iterable) { var iter, size, _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, _value, _; return _regeneratorRuntime.wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: iter = asyncEnsureIterable(iterable); size = 0; _iteratorNormalCompletion = true; _didIteratorError = false; _context.prev = 4; _iterator = _asyncIterator(iter); case 6: _context.next = 8; return _iterator.next(); case 8: _step = _context.sent; _iteratorNormalCompletion = _step.done; _context.next = 12; return _step.value; case 12: _value = _context.sent; if (_iteratorNormalCompletion) { _context.next = 19; break; } _ = _value; size++; case 16: _iteratorNormalCompletion = true; _context.next = 6; break; case 19: _context.next = 25; break; case 21: _context.prev = 21; _context.t0 = _context["catch"](4); _didIteratorError = true; _iteratorError = _context.t0; case 25: _context.prev = 25; _context.prev = 26; if (!(!_iteratorNormalCompletion && _iterator["return"] != null)) { _context.next = 30; break; } _context.next = 30; return _iterator["return"](); case 30: _context.prev = 30; if (!_didIteratorError) { _context.next = 33; break; } throw _iteratorError; case 33: return _context.finish(30); case 34: return _context.finish(25); case 35: return _context.abrupt("return", size); case 36: case "end": return _context.stop(); } } }, _callee, null, [[4, 21, 25, 35], [26,, 30, 34]]); })); return _asyncSize.apply(this, arguments); } exports.__asyncSize = __asyncSize; var asyncSize = __asyncSize; exports.asyncSize = asyncSize; },{"../../internal/async-iterable.js":480,"@babel/runtime/helpers/asyncIterator":42,"@babel/runtime/helpers/asyncToGenerator":43,"@babel/runtime/regenerator":65}],351:[function(require,module,exports){ function _createForOfIteratorHelper(o, allowArrayLike) { var it; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; } function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } var _require = require('../../internal/iterable.js'), ensureIterable = _require.ensureIterable; function __size(iterable) { var iter = ensureIterable(iterable); var size = 0; var _iterator = _createForOfIteratorHelper(iter), _step; try { for (_iterator.s(); !(_step = _iterator.n()).done;) { var _ = _step.value; size++; } } catch (err) { _iterator.e(err); } finally { _iterator.f(); } return size; } exports.__size = __size; var size = __size; exports.size = size; },{"../../internal/iterable.js":493}],352:[function(require,module,exports){ var _asyncToGenerator = require("@babel/runtime/helpers/asyncToGenerator"); var _regeneratorRuntime = require("@babel/runtime/regenerator"); var _asyncGeneratorDelegate = require("@babel/runtime/helpers/asyncGeneratorDelegate"); var _awaitAsyncGenerator = require("@babel/runtime/helpers/awaitAsyncGenerator"); var _wrapAsyncGenerator = require("@babel/runtime/helpers/wrapAsyncGenerator"); var _asyncIterator = require("@babel/runtime/helpers/asyncIterator"); var _require = require('../../internal/circular-buffer.js'), CircularBuffer = _require.CircularBuffer; var _require2 = require('../../internal/async-iterable.js'), asyncIterableCurry = _require2.asyncIterableCurry; var _require3 = require('./internal/validate-args.js'), makeValidateArgs = _require3.makeValidateArgs; function __asyncSliceFromStart(_x) { return _asyncSliceFromStart.apply(this, arguments); } exports.__asyncSliceFromStart = __asyncSliceFromStart; function _asyncSliceFromStart() { _asyncSliceFromStart = _wrapAsyncGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(source) { var start, end, step, currentPos, nextValidPos, bufferSize, buffer, counter, _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, _value, value, _args = arguments; return _regeneratorRuntime.wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: start = _args.length > 1 && _args[1] !== undefined ? _args[1] : 0; end = _args.length > 2 && _args[2] !== undefined ? _args[2] : Infinity; step = _args.length > 3 && _args[3] !== undefined ? _args[3] : 1; currentPos = 0; nextValidPos = start; bufferSize = Math.abs(end); counter = 0; if (end < 0) { buffer = new CircularBuffer(bufferSize); } _iteratorNormalCompletion = true; _didIteratorError = false; _context.prev = 10; _iterator = _asyncIterator(source); case 12: _context.next = 14; return _awaitAsyncGenerator(_iterator.next()); case 14: _step = _context.sent; _iteratorNormalCompletion = _step.done; _context.next = 18; return _awaitAsyncGenerator(_step.value); case 18: _value = _context.sent; if (_iteratorNormalCompletion) { _context.next = 36; break; } value = _value; if (!buffer) { _context.next = 26; break; } value = buffer.push(value); counter++; if (!(counter <= bufferSize)) { _context.next = 26; break; } return _context.abrupt("continue", 33); case 26: if (!(currentPos >= end && end >= 0)) { _context.next = 28; break; } return _context.abrupt("break", 36); case 28: if (!(nextValidPos === currentPos)) { _context.next = 32; break; } _context.next = 31; return value; case 31: nextValidPos += step; case 32: currentPos++; case 33: _iteratorNormalCompletion = true; _context.next = 12; break; case 36: _context.next = 42; break; case 38: _context.prev = 38; _context.t0 = _context["catch"](10); _didIteratorError = true; _iteratorError = _context.t0; case 42: _context.prev = 42; _context.prev = 43; if (!(!_iteratorNormalCompletion && _iterator["return"] != null)) { _context.next = 47; break; } _context.next = 47; return _awaitAsyncGenerator(_iterator["return"]()); case 47: _context.prev = 47; if (!_didIteratorError) { _context.next = 50; break; } throw _iteratorError; case 50: return _context.finish(47); case 51: return _context.finish(42); case 52: case "end": return _context.stop(); } } }, _callee, null, [[10, 38, 42, 52], [43,, 47, 51]]); })); return _asyncSliceFromStart.apply(this, arguments); } function asyncBufferedSlice(_x3, _x4, _x5, _x6) { return _asyncBufferedSlice.apply(this, arguments); } function _asyncBufferedSlice() { _asyncBufferedSlice = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee3(source, start, end, step) { var bufferSize, buffer, counter, _iteratorNormalCompletion2, _didIteratorError2, _iteratorError2, _iterator2, _step2, _value2, value, newEnd; return _regeneratorRuntime.wrap(function _callee3$(_context3) { while (1) { switch (_context3.prev = _context3.next) { case 0: bufferSize = Math.abs(start); buffer = new CircularBuffer(bufferSize); counter = 0; _iteratorNormalCompletion2 = true; _didIteratorError2 = false; _context3.prev = 5; _iterator2 = _asyncIterator(source); case 7: _context3.next = 9; return _iterator2.next(); case 9: _step2 = _context3.sent; _iteratorNormalCompletion2 = _step2.done; _context3.next = 13; return _step2.value; case 13: _value2 = _context3.sent; if (_iteratorNormalCompletion2) { _context3.next = 21; break; } value = _value2; buffer.push(value); counter++; case 18: _iteratorNormalCompletion2 = true; _context3.next = 7; break; case 21: _context3.next = 27; break; case 23: _context3.prev = 23; _context3.t0 = _context3["catch"](5); _didIteratorError2 = true; _iteratorError2 = _context3.t0; case 27: _context3.prev = 27; _context3.prev = 28; if (!(!_iteratorNormalCompletion2 && _iterator2["return"] != null)) { _context3.next = 32; break; } _context3.next = 32; return _iterator2["return"](); case 32: _context3.prev = 32; if (!_didIteratorError2) { _context3.next = 35; break; } throw _iteratorError2; case 35: return _context3.finish(32); case 36: return _context3.finish(27); case 37: if (!(isFinite(end) && end > 0)) { _context3.next = 43; break; } newEnd = end - (counter - buffer.size); if (!(newEnd < 0)) { _context3.next = 41; break; } return _context3.abrupt("return", []); case 41: _context3.next = 44; break; case 43: newEnd = end; case 44: return _context3.abrupt("return", __asyncSliceFromStart(buffer, 0, newEnd, step)); case 45: case "end": return _context3.stop(); } } }, _callee3, null, [[5, 23, 27, 37], [28,, 32, 36]]); })); return _asyncBufferedSlice.apply(this, arguments); } function __asyncSlice(_x2) { return _asyncSlice.apply(this, arguments); } exports.__asyncSlice = __asyncSlice; function _asyncSlice() { _asyncSlice = _wrapAsyncGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee2(source) { var start, end, step, _args2 = arguments; return _regeneratorRuntime.wrap(function _callee2$(_context2) { while (1) { switch (_context2.prev = _context2.next) { case 0: start = _args2.length > 1 && _args2[1] !== undefined ? _args2[1] : 0; end = _args2.length > 2 && _args2[2] !== undefined ? _args2[2] : Infinity; step = _args2.length > 3 && _args2[3] !== undefined ? _args2[3] : 1; if (!(start >= 0)) { _context2.next = 7; break; } return _context2.delegateYield(_asyncGeneratorDelegate(_asyncIterator(__asyncSliceFromStart(source, start, end, step)), _awaitAsyncGenerator), "t0", 5); case 5: _context2.next = 15; break; case 7: _context2.t1 = _asyncGeneratorDelegate; _context2.t2 = _asyncIterator; _context2.next = 11; return _awaitAsyncGenerator(asyncBufferedSlice(source, start, end, step)); case 11: _context2.t3 = _context2.sent; _context2.t4 = (0, _context2.t2)(_context2.t3); _context2.t5 = _awaitAsyncGenerator; return _context2.delegateYield((0, _context2.t1)(_context2.t4, _context2.t5), "t6", 15); case 15: case "end": return _context2.stop(); } } }, _callee2); })); return _asyncSlice.apply(this, arguments); } var asyncSlice = /*#__PURE__*/asyncIterableCurry(__asyncSlice, { validateArgs: /*#__PURE__*/makeValidateArgs('asyncSlice'), growRight: true, minArgs: 0, maxArgs: 3 }); exports.asyncSlice = asyncSlice; },{"../../internal/async-iterable.js":480,"../../internal/circular-buffer.js":486,"./internal/validate-args.js":353,"@babel/runtime/helpers/asyncGeneratorDelegate":41,"@babel/runtime/helpers/asyncIterator":42,"@babel/runtime/helpers/asyncToGenerator":43,"@babel/runtime/helpers/awaitAsyncGenerator":44,"@babel/runtime/helpers/wrapAsyncGenerator":64,"@babel/runtime/regenerator":65}],353:[function(require,module,exports){ var _slicedToArray = require("@babel/runtime/helpers/slicedToArray"); var _require = require('../../../internal/number.js'), isInteger = _require.isInteger, isPositiveInteger = _require.isPositiveInteger, isIntegerOrInfinite = _require.isIntegerOrInfinite; var _require2 = require('../../is-object/is-object.js'), isObject = _require2.isObject; var makeValidateArgs = function makeValidateArgs(methodName) { return function validateArgs(args) { var _args = _slicedToArray(args, 4), _args$ = _args[1], optsOrStart = _args$ === void 0 ? 0 : _args$, _args$2 = _args[2], end = _args$2 === void 0 ? Infinity : _args$2, _args$3 = _args[3], step = _args$3 === void 0 ? 1 : _args$3; var start = typeof optsOrStart === 'number' ? optsOrStart : undefined; if (isObject(optsOrStart)) { var _optsOrStart$start = optsOrStart.start; start = _optsOrStart$start === void 0 ? 0 : _optsOrStart$start; var _optsOrStart$end = optsOrStart.end; end = _optsOrStart$end === void 0 ? Infinity : _optsOrStart$end; var _optsOrStart$step = optsOrStart.step; step = _optsOrStart$step === void 0 ? 1 : _optsOrStart$step; } if (!isInteger(start)) { throw new TypeError("start argument to ".concat(methodName, " must be a number")); } if (!isIntegerOrInfinite(end)) { throw new TypeError("end argument to ".concat(methodName, " must be an integer or infinte")); } if (!isPositiveInteger(step)) { throw new TypeError("step argument to ".concat(methodName, " must be a integer > 0")); } args[1] = start; args[2] = end; args[3] = step; }; }; exports.makeValidateArgs = makeValidateArgs; },{"../../../internal/number.js":494,"../../is-object/is-object.js":440,"@babel/runtime/helpers/slicedToArray":59}],354:[function(require,module,exports){ var _regeneratorRuntime = require("@babel/runtime/regenerator"); var _marked = /*#__PURE__*/_regeneratorRuntime.mark(__sliceFromStart), _marked2 = /*#__PURE__*/_regeneratorRuntime.mark(__slice); function _createForOfIteratorHelper(o, allowArrayLike) { var it; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; } function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } var _require = require('../../internal/circular-buffer.js'), CircularBuffer = _require.CircularBuffer; var _require2 = require('../../internal/iterable.js'), iterableCurry = _require2.iterableCurry; var _require3 = require('./internal/validate-args.js'), makeValidateArgs = _require3.makeValidateArgs; function __sliceFromStart(source) { var start, end, step, currentPos, nextValidPos, bufferSize, buffer, counter, _iterator2, _step2, value, _args = arguments; return _regeneratorRuntime.wrap(function __sliceFromStart$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: start = _args.length > 1 && _args[1] !== undefined ? _args[1] : 0; end = _args.length > 2 && _args[2] !== undefined ? _args[2] : Infinity; step = _args.length > 3 && _args[3] !== undefined ? _args[3] : 1; currentPos = 0; nextValidPos = start; bufferSize = Math.abs(end); counter = 0; if (end < 0) { buffer = new CircularBuffer(bufferSize); } _iterator2 = _createForOfIteratorHelper(source); _context.prev = 9; _iterator2.s(); case 11: if ((_step2 = _iterator2.n()).done) { _context.next = 27; break; } value = _step2.value; if (!buffer) { _context.next = 18; break; } value = buffer.push(value); counter++; if (!(counter <= bufferSize)) { _context.next = 18; break; } return _context.abrupt("continue", 25); case 18: if (!(currentPos >= end && end >= 0)) { _context.next = 20; break; } return _context.abrupt("break", 27); case 20: if (!(nextValidPos === currentPos)) { _context.next = 24; break; } _context.next = 23; return value; case 23: nextValidPos += step; case 24: currentPos++; case 25: _context.next = 11; break; case 27: _context.next = 32; break; case 29: _context.prev = 29; _context.t0 = _context["catch"](9); _iterator2.e(_context.t0); case 32: _context.prev = 32; _iterator2.f(); return _context.finish(32); case 35: case "end": return _context.stop(); } } }, _marked, null, [[9, 29, 32, 35]]); } exports.__sliceFromStart = __sliceFromStart; function bufferedSlice(source, start, end, step) { var bufferSize = Math.abs(start); var buffer = new CircularBuffer(bufferSize); var counter = 0; var _iterator = _createForOfIteratorHelper(source), _step; try { for (_iterator.s(); !(_step = _iterator.n()).done;) { var value = _step.value; buffer.push(value); counter++; } } catch (err) { _iterator.e(err); } finally { _iterator.f(); } var newEnd; if (isFinite(end) && end > 0) { newEnd = end - (counter - buffer.size); if (newEnd < 0) return []; } else { newEnd = end; } return __sliceFromStart(buffer, 0, newEnd, step); } function __slice(source) { var start, end, step, _args2 = arguments; return _regeneratorRuntime.wrap(function __slice$(_context2) { while (1) { switch (_context2.prev = _context2.next) { case 0: start = _args2.length > 1 && _args2[1] !== undefined ? _args2[1] : 0; end = _args2.length > 2 && _args2[2] !== undefined ? _args2[2] : Infinity; step = _args2.length > 3 && _args2[3] !== undefined ? _args2[3] : 1; if (!(start >= 0)) { _context2.next = 7; break; } return _context2.delegateYield(__sliceFromStart(source, start, end, step), "t0", 5); case 5: _context2.next = 8; break; case 7: return _context2.delegateYield(bufferedSlice(source, start, end, step), "t1", 8); case 8: case "end": return _context2.stop(); } } }, _marked2); } exports.__slice = __slice; var slice = /*#__PURE__*/iterableCurry(__slice, { validateArgs: /*#__PURE__*/makeValidateArgs('slice'), growRight: true, minArgs: 0, maxArgs: 3 }); exports.slice = slice; },{"../../internal/circular-buffer.js":486,"../../internal/iterable.js":493,"./internal/validate-args.js":353,"@babel/runtime/regenerator":65}],355:[function(require,module,exports){ var _regeneratorRuntime = require("@babel/runtime/regenerator"); var _asyncToGenerator = require("@babel/runtime/helpers/asyncToGenerator"); var _asyncIterator = require("@babel/runtime/helpers/asyncIterator"); var _require = require('../../internal/async-iterable.js'), asyncIterableCurry = _require.asyncIterableCurry; function __asyncSome(_x, _x2) { return _asyncSome.apply(this, arguments); } function _asyncSome() { _asyncSome = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(iterable, func) { var c, _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, _value, value; return _regeneratorRuntime.wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: c = 0; _iteratorNormalCompletion = true; _didIteratorError = false; _context.prev = 3; _iterator = _asyncIterator(iterable); case 5: _context.next = 7; return _iterator.next(); case 7: _step = _context.sent; _iteratorNormalCompletion = _step.done; _context.next = 11; return _step.value; case 11: _value = _context.sent; if (_iteratorNormalCompletion) { _context.next = 21; break; } value = _value; _context.next = 16; return func(value, c++); case 16: if (!_context.sent) { _context.next = 18; break; } return _context.abrupt("return", true); case 18: _iteratorNormalCompletion = true; _context.next = 5; break; case 21: _context.next = 27; break; case 23: _context.prev = 23; _context.t0 = _context["catch"](3); _didIteratorError = true; _iteratorError = _context.t0; case 27: _context.prev = 27; _context.prev = 28; if (!(!_iteratorNormalCompletion && _iterator["return"] != null)) { _context.next = 32; break; } _context.next = 32; return _iterator["return"](); case 32: _context.prev = 32; if (!_didIteratorError) { _context.next = 35; break; } throw _iteratorError; case 35: return _context.finish(32); case 36: return _context.finish(27); case 37: return _context.abrupt("return", false); case 38: case "end": return _context.stop(); } } }, _callee, null, [[3, 23, 27, 37], [28,, 32, 36]]); })); return _asyncSome.apply(this, arguments); } exports.__asyncSome = __asyncSome; var asyncSome = /*#__PURE__*/asyncIterableCurry(__asyncSome, { reduces: true }); exports.asyncSome = asyncSome; },{"../../internal/async-iterable.js":480,"@babel/runtime/helpers/asyncIterator":42,"@babel/runtime/helpers/asyncToGenerator":43,"@babel/runtime/regenerator":65}],356:[function(require,module,exports){ function _createForOfIteratorHelper(o, allowArrayLike) { var it; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; } function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } var _require = require('../../internal/iterable.js'), iterableCurry = _require.iterableCurry; function __some(iterable, func) { var c = 0; var _iterator = _createForOfIteratorHelper(iterable), _step; try { for (_iterator.s(); !(_step = _iterator.n()).done;) { var value = _step.value; if (func(value, c++)) { return true; } } } catch (err) { _iterator.e(err); } finally { _iterator.f(); } return false; } exports.__some = __some; var some = /*#__PURE__*/iterableCurry(__some, { reduces: true }); exports.some = some; },{"../../internal/iterable.js":493}],357:[function(require,module,exports){ var _regeneratorRuntime = require("@babel/runtime/regenerator"); var _awaitAsyncGenerator = require("@babel/runtime/helpers/awaitAsyncGenerator"); var _wrapAsyncGenerator = require("@babel/runtime/helpers/wrapAsyncGenerator"); var _require = require('../../internal/async-iterable.js'), asyncIterableCurry = _require.asyncIterableCurry; var _require2 = require('../$spliterate-grouped/async-spliterate-grouped.js'), __asyncSpliterateGrouped = _require2.__asyncSpliterateGrouped; var _require3 = require('../$peekerate/async-peekerate.js'), __asyncPeekerate = _require3.__asyncPeekerate; var initialKey = Symbol('initial group key'); function asyncGroupingSpliterator(_x, _x2, _x3) { return _asyncGroupingSpliterator.apply(this, arguments); } function _asyncGroupingSpliterator() { _asyncGroupingSpliterator = _wrapAsyncGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(split, _ref, source) { var getKey, peekr, key, idx, lastKey; return _regeneratorRuntime.wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: getKey = _ref.getKey; _context.next = 3; return _awaitAsyncGenerator(__asyncPeekerate(source)); case 3: peekr = _context.sent; key = initialKey; idx = 0; case 6: if (peekr.done) { _context.next = 22; break; } lastKey = key; _context.next = 10; return _awaitAsyncGenerator(getKey(peekr.value, idx++)); case 10: key = _context.sent; if (!(lastKey !== key)) { _context.next = 16; break; } _context.next = 14; return split; case 14: _context.next = 16; return key; case 16: _context.next = 18; return peekr.value; case 18: _context.next = 20; return _awaitAsyncGenerator(peekr.advance()); case 20: _context.next = 6; break; case 22: case "end": return _context.stop(); } } }, _callee); })); return _asyncGroupingSpliterator.apply(this, arguments); } function __asyncSplitGroups(source) { var getKey = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function (value) { return value; }; return __asyncSpliterateGrouped(source, asyncGroupingSpliterator, { getKey: getKey }); } exports.__asyncSplitGroups = __asyncSplitGroups; var asyncSplitGroups = /*#__PURE__*/asyncIterableCurry(__asyncSplitGroups, { minArgs: 0, maxArgs: 1 }); exports.asyncSplitGroups = asyncSplitGroups; },{"../$peekerate/async-peekerate.js":339,"../$spliterate-grouped/async-spliterate-grouped.js":371,"../../internal/async-iterable.js":480,"@babel/runtime/helpers/awaitAsyncGenerator":44,"@babel/runtime/helpers/wrapAsyncGenerator":64,"@babel/runtime/regenerator":65}],358:[function(require,module,exports){ var _regeneratorRuntime = require("@babel/runtime/regenerator"); var _marked = /*#__PURE__*/_regeneratorRuntime.mark(groupingSpliterator); var _require = require('../../internal/iterable.js'), iterableCurry = _require.iterableCurry; var _require2 = require('../$spliterate-grouped/spliterate-grouped.js'), __spliterateGrouped = _require2.__spliterateGrouped; var _require3 = require('../$peekerate/peekerate.js'), __peekerate = _require3.__peekerate; var initialKey = Symbol('initial group key'); function groupingSpliterator(split, _ref, source) { var getKey, peekr, key, idx, lastKey; return _regeneratorRuntime.wrap(function groupingSpliterator$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: getKey = _ref.getKey; peekr = __peekerate(source); key = initialKey; idx = 0; case 4: if (peekr.done) { _context.next = 17; break; } lastKey = key; key = getKey(peekr.value, idx++); if (!(lastKey !== key)) { _context.next = 12; break; } _context.next = 10; return split; case 10: _context.next = 12; return key; case 12: _context.next = 14; return peekr.value; case 14: peekr.advance(); _context.next = 4; break; case 17: case "end": return _context.stop(); } } }, _marked); } function __splitGroups(source) { var getKey = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function (value) { return value; }; return __spliterateGrouped(source, groupingSpliterator, { getKey: getKey }); } exports.__splitGroups = __splitGroups; var splitGroups = /*#__PURE__*/iterableCurry(__splitGroups, { minArgs: 0, maxArgs: 1 }); exports.splitGroups = splitGroups; },{"../$peekerate/peekerate.js":340,"../$spliterate-grouped/spliterate-grouped.js":372,"../../internal/iterable.js":493,"@babel/runtime/regenerator":65}],359:[function(require,module,exports){ var _regeneratorRuntime = require("@babel/runtime/regenerator"); function _createForOfIteratorHelper(o, allowArrayLike) { var it; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; } function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } var _asyncGeneratorDelegate = require("@babel/runtime/helpers/asyncGeneratorDelegate"); var _awaitAsyncGenerator = require("@babel/runtime/helpers/awaitAsyncGenerator"); var _wrapAsyncGenerator = require("@babel/runtime/helpers/wrapAsyncGenerator"); var _asyncIterator = require("@babel/runtime/helpers/asyncIterator"); var _require = require('../../internal/async-iterable.js'), asyncIterableCurry = _require.asyncIterableCurry; var _require2 = require('../../internal/async-any-seq.js'), asyncSeqsToArray = _require2.asyncSeqsToArray; var _require3 = require('../$starts-with-seq/starts-with-seq.js'), __startsWithSeq = _require3.__startsWithSeq; var _require4 = require('../$window-ahead/async-window-ahead.js'), __asyncWindowAhead = _require4.__asyncWindowAhead; var _require5 = require('../$spliterate/async-spliterate.js'), __asyncSpliterate = _require5.__asyncSpliterate; function getMatchingLength(buffer, separatorSeqs, same) { var _iterator2 = _createForOfIteratorHelper(separatorSeqs), _step2; try { for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) { var subsequence = _step2.value; if (__startsWithSeq(buffer, subsequence, same)) { return subsequence.length; } } } catch (err) { _iterator2.e(err); } finally { _iterator2.f(); } return 0; } function asyncAnySeqspliterator(_x, _x2, _x3) { return _asyncAnySeqspliterator.apply(this, arguments); } function _asyncAnySeqspliterator() { _asyncAnySeqspliterator = _wrapAsyncGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(split, _ref, source) { var separatorSeqs, same, maxMatchLength, skip, _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, _value, buffer, matchingLength; return _regeneratorRuntime.wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: separatorSeqs = _ref.separatorSeqs, same = _ref.same; maxMatchLength = separatorSeqs.reduce(function (max, _ref2) { var length = _ref2.length; return Math.max(max, length); }, 1); skip = 0; _iteratorNormalCompletion = true; _didIteratorError = false; _context.prev = 5; _iterator = _asyncIterator(__asyncWindowAhead(source, maxMatchLength, { useFiller: false })); case 7: _context.next = 9; return _awaitAsyncGenerator(_iterator.next()); case 9: _step = _context.sent; _iteratorNormalCompletion = _step.done; _context.next = 13; return _awaitAsyncGenerator(_step.value); case 13: _value = _context.sent; if (_iteratorNormalCompletion) { _context.next = 31; break; } buffer = _value; if (!(skip > 0)) { _context.next = 19; break; } skip--; return _context.abrupt("continue", 28); case 19: matchingLength = getMatchingLength(buffer, separatorSeqs, same); if (!(matchingLength > 0)) { _context.next = 26; break; } _context.next = 23; return split; case 23: skip = matchingLength - 1; _context.next = 28; break; case 26: _context.next = 28; return buffer.get(0); case 28: _iteratorNormalCompletion = true; _context.next = 7; break; case 31: _context.next = 37; break; case 33: _context.prev = 33; _context.t0 = _context["catch"](5); _didIteratorError = true; _iteratorError = _context.t0; case 37: _context.prev = 37; _context.prev = 38; if (!(!_iteratorNormalCompletion && _iterator["return"] != null)) { _context.next = 42; break; } _context.next = 42; return _awaitAsyncGenerator(_iterator["return"]()); case 42: _context.prev = 42; if (!_didIteratorError) { _context.next = 45; break; } throw _iteratorError; case 45: return _context.finish(42); case 46: return _context.finish(37); case 47: case "end": return _context.stop(); } } }, _callee, null, [[5, 33, 37, 47], [38,, 42, 46]]); })); return _asyncAnySeqspliterator.apply(this, arguments); } function __asyncSplitOnAnySeq(_x4, _x5) { return _asyncSplitOnAnySeq.apply(this, arguments); } exports.__asyncSplitOnAnySeq = __asyncSplitOnAnySeq; function _asyncSplitOnAnySeq() { _asyncSplitOnAnySeq = _wrapAsyncGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee2(source, separatorSeqs) { var same, separatorSeqsArr, _args2 = arguments; return _regeneratorRuntime.wrap(function _callee2$(_context2) { while (1) { switch (_context2.prev = _context2.next) { case 0: same = _args2.length > 2 && _args2[2] !== undefined ? _args2[2] : Object.is; _context2.next = 3; return _awaitAsyncGenerator(asyncSeqsToArray(separatorSeqs)); case 3: separatorSeqsArr = _context2.sent.filter(function (s) { return s.length > 0; }); return _context2.delegateYield(_asyncGeneratorDelegate(_asyncIterator(__asyncSpliterate(source, asyncAnySeqspliterator, { separatorSeqs: separatorSeqsArr.sort(function (a, b) { return b.length - a.length; }), same: same })), _awaitAsyncGenerator), "t0", 5); case 5: case "end": return _context2.stop(); } } }, _callee2); })); return _asyncSplitOnAnySeq.apply(this, arguments); } var asyncSplitOnAnySeq = /*#__PURE__*/asyncIterableCurry(__asyncSplitOnAnySeq, { minArgs: 1, maxArgs: 2 }); exports.asyncSplitOnAnySeq = asyncSplitOnAnySeq; },{"../$spliterate/async-spliterate.js":373,"../$starts-with-seq/starts-with-seq.js":380,"../$window-ahead/async-window-ahead.js":402,"../../internal/async-any-seq.js":475,"../../internal/async-iterable.js":480,"@babel/runtime/helpers/asyncGeneratorDelegate":41,"@babel/runtime/helpers/asyncIterator":42,"@babel/runtime/helpers/awaitAsyncGenerator":44,"@babel/runtime/helpers/wrapAsyncGenerator":64,"@babel/runtime/regenerator":65}],360:[function(require,module,exports){ var _regeneratorRuntime = require("@babel/runtime/regenerator"); var _marked = /*#__PURE__*/_regeneratorRuntime.mark(anySeqspliterator), _marked2 = /*#__PURE__*/_regeneratorRuntime.mark(__splitOnAnySeq); function _createForOfIteratorHelper(o, allowArrayLike) { var it; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; } function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } var _require = require('../../internal/iterable.js'), iterableCurry = _require.iterableCurry; var _require2 = require('../../internal/any-seq.js'), seqsToArray = _require2.seqsToArray; var _require3 = require('../$starts-with-seq/starts-with-seq.js'), __startsWithSeq = _require3.__startsWithSeq; var _require4 = require('../$window-ahead/window-ahead.js'), __windowAhead = _require4.__windowAhead; var _require5 = require('../$spliterate/spliterate.js'), __spliterate = _require5.__spliterate; function getMatchingLength(buffer, separatorSeqs, same) { var _iterator = _createForOfIteratorHelper(separatorSeqs), _step; try { for (_iterator.s(); !(_step = _iterator.n()).done;) { var subsequence = _step.value; if (__startsWithSeq(buffer, subsequence, same)) { return subsequence.length; } } } catch (err) { _iterator.e(err); } finally { _iterator.f(); } return 0; } function anySeqspliterator(split, _ref, source) { var separatorSeqs, same, maxMatchLength, skip, _iterator2, _step2, buffer, matchingLength; return _regeneratorRuntime.wrap(function anySeqspliterator$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: separatorSeqs = _ref.separatorSeqs, same = _ref.same; maxMatchLength = separatorSeqs.reduce(function (max, _ref2) { var length = _ref2.length; return Math.max(max, length); }, 1); skip = 0; _iterator2 = _createForOfIteratorHelper(__windowAhead(source, maxMatchLength, { useFiller: false })); _context.prev = 4; _iterator2.s(); case 6: if ((_step2 = _iterator2.n()).done) { _context.next = 22; break; } buffer = _step2.value; if (!(skip > 0)) { _context.next = 11; break; } skip--; return _context.abrupt("continue", 20); case 11: matchingLength = getMatchingLength(buffer, separatorSeqs, same); if (!(matchingLength > 0)) { _context.next = 18; break; } _context.next = 15; return split; case 15: skip = matchingLength - 1; _context.next = 20; break; case 18: _context.next = 20; return buffer.get(0); case 20: _context.next = 6; break; case 22: _context.next = 27; break; case 24: _context.prev = 24; _context.t0 = _context["catch"](4); _iterator2.e(_context.t0); case 27: _context.prev = 27; _iterator2.f(); return _context.finish(27); case 30: case "end": return _context.stop(); } } }, _marked, null, [[4, 24, 27, 30]]); } function __splitOnAnySeq(source, separatorSeqs) { var same, separatorSeqsArr, _args2 = arguments; return _regeneratorRuntime.wrap(function __splitOnAnySeq$(_context2) { while (1) { switch (_context2.prev = _context2.next) { case 0: same = _args2.length > 2 && _args2[2] !== undefined ? _args2[2] : Object.is; separatorSeqsArr = seqsToArray(separatorSeqs).filter(function (s) { return s.length > 0; }); return _context2.delegateYield(__spliterate(source, anySeqspliterator, { separatorSeqs: separatorSeqsArr.sort(function (a, b) { return b.length - a.length; }), same: same }), "t0", 3); case 3: case "end": return _context2.stop(); } } }, _marked2); } exports.__splitOnAnySeq = __splitOnAnySeq; var splitOnAnySeq = /*#__PURE__*/iterableCurry(__splitOnAnySeq, { minArgs: 1, maxArgs: 2 }); exports.splitOnAnySeq = splitOnAnySeq; },{"../$spliterate/spliterate.js":374,"../$starts-with-seq/starts-with-seq.js":380,"../$window-ahead/window-ahead.js":403,"../../internal/any-seq.js":474,"../../internal/iterable.js":493,"@babel/runtime/regenerator":65}],361:[function(require,module,exports){ var _require = require('../../internal/async-iterable.js'), asyncIterableCurry = _require.asyncIterableCurry; var _require2 = require('../$split-when/async-split-when.js'), __asyncSplitWhen = _require2.__asyncSplitWhen; var _require3 = require('../$includes/includes.js'), __includes = _require3.__includes; function __asyncSplitOnAny(source, separators) { var same = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : Object.is; return __asyncSplitWhen(source, function (value) { return __includes(separators, value, function (a, b) { return same(b, a); }); }); } exports.__asyncSplitOnAny = __asyncSplitOnAny; var asyncSplitOnAny = /*#__PURE__*/asyncIterableCurry(__asyncSplitOnAny, { minArgs: 1, maxArgs: 2, validateArgs: function validateArgs(args) {} }); exports.asyncSplitOnAny = asyncSplitOnAny; },{"../$includes/includes.js":320,"../$split-when/async-split-when.js":367,"../../internal/async-iterable.js":480}],362:[function(require,module,exports){ var _require = require('../../internal/iterable.js'), iterableCurry = _require.iterableCurry; var _require2 = require('../$split-when/split-when.js'), __splitWhen = _require2.__splitWhen; var _require3 = require('../$includes/includes.js'), __includes = _require3.__includes; function __splitOnAny(source, separators) { var same = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : Object.is; return __splitWhen(source, function (value) { return __includes(separators, value, function (a, b) { return same(b, a); }); }); } exports.__splitOnAny = __splitOnAny; var splitOnAny = /*#__PURE__*/iterableCurry(__splitOnAny, { minArgs: 1, maxArgs: 2, validateArgs: function validateArgs(args) { if (true && typeof args[0] === 'string') { console.warn("For string inputs use splitOnAnySeq instead of splitOnAny"); } } }); exports.splitOnAny = splitOnAny; },{"../$includes/includes.js":320,"../$split-when/split-when.js":368,"../../internal/iterable.js":493}],363:[function(require,module,exports){ var _require = require('../../internal/async-iterable.js'), asyncIterableCurry = _require.asyncIterableCurry, asyncEnsureIterable = _require.asyncEnsureIterable; var _require2 = require('../$split-on-any-seq/async-split-on-any-seq.js'), __asyncSplitOnAnySeq = _require2.__asyncSplitOnAnySeq; function __asyncSplitOnSeq(source, separatorSeq) { var same = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : Object.is; return __asyncSplitOnAnySeq(source, [separatorSeq], same); } exports.__asyncSplitOnSeq = __asyncSplitOnSeq; var asyncSplitOnSeq = /*#__PURE__*/asyncIterableCurry(__asyncSplitOnSeq, { minArgs: 1, maxArgs: 2, validateArgs: function validateArgs(args) { args[1] = asyncEnsureIterable(args[1]); } }); exports.asyncSplitOnSeq = asyncSplitOnSeq; },{"../$split-on-any-seq/async-split-on-any-seq.js":359,"../../internal/async-iterable.js":480}],364:[function(require,module,exports){ var _require = require('../../internal/iterable.js'), iterableCurry = _require.iterableCurry, ensureIterable = _require.ensureIterable; var _require2 = require('../$split-on-any-seq/split-on-any-seq.js'), __splitOnAnySeq = _require2.__splitOnAnySeq; function __splitOnSeq(source, separatorSeq) { var same = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : Object.is; return __splitOnAnySeq(source, [separatorSeq], same); } exports.__splitOnSeq = __splitOnSeq; var splitOnSeq = /*#__PURE__*/iterableCurry(__splitOnSeq, { minArgs: 1, maxArgs: 2, validateArgs: function validateArgs(args) { args[1] = ensureIterable(args[1]); } }); exports.splitOnSeq = splitOnSeq; },{"../$split-on-any-seq/split-on-any-seq.js":360,"../../internal/iterable.js":493}],365:[function(require,module,exports){ var _require = require('../../internal/async-iterable.js'), asyncIterableCurry = _require.asyncIterableCurry; var _require2 = require('../$split-when/async-split-when.js'), __asyncSplitWhen = _require2.__asyncSplitWhen; function __asyncSplitOn(source, separator) { var same = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : Object.is; return __asyncSplitWhen(source, function (value) { return same(separator, value); }); } exports.__asyncSplitOn = __asyncSplitOn; var asyncSplitOn = /*#__PURE__*/asyncIterableCurry(__asyncSplitOn, { minArgs: 1, maxArgs: 2, validateArgs: function validateArgs(args) {} }); exports.asyncSplitOn = asyncSplitOn; },{"../$split-when/async-split-when.js":367,"../../internal/async-iterable.js":480}],366:[function(require,module,exports){ var _require = require('../../internal/iterable.js'), iterableCurry = _require.iterableCurry; var _require2 = require('../$split-when/split-when.js'), __splitWhen = _require2.__splitWhen; function __splitOn(source, separator) { var same = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : Object.is; return __splitWhen(source, function (value) { return same(separator, value); }); } exports.__splitOn = __splitOn; var splitOn = /*#__PURE__*/iterableCurry(__splitOn, { minArgs: 1, maxArgs: 2, validateArgs: function validateArgs(args) { if (true && typeof args[0] === 'string') { console.warn("For string inputs use splitOnSeq instead of splitOn"); } } }); exports.splitOn = splitOn; },{"../$split-when/split-when.js":368,"../../internal/iterable.js":493}],367:[function(require,module,exports){ var _regeneratorRuntime = require("@babel/runtime/regenerator"); var _awaitAsyncGenerator = require("@babel/runtime/helpers/awaitAsyncGenerator"); var _wrapAsyncGenerator = require("@babel/runtime/helpers/wrapAsyncGenerator"); var _asyncIterator = require("@babel/runtime/helpers/asyncIterator"); var _require = require('../../internal/async-iterable.js'), asyncIterableCurry = _require.asyncIterableCurry; var _require2 = require('../$spliterate/async-spliterate.js'), __asyncSpliterate = _require2.__asyncSpliterate; function asyncPredicateSpliterator(_x, _x2, _x3) { return _asyncPredicateSpliterator.apply(this, arguments); } function _asyncPredicateSpliterator() { _asyncPredicateSpliterator = _wrapAsyncGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(split, _ref, source) { var predicate, i, _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, _value, value; return _regeneratorRuntime.wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: predicate = _ref.predicate; i = 0; _iteratorNormalCompletion = true; _didIteratorError = false; _context.prev = 4; _iterator = _asyncIterator(source); case 6: _context.next = 8; return _awaitAsyncGenerator(_iterator.next()); case 8: _step = _context.sent; _iteratorNormalCompletion = _step.done; _context.next = 12; return _awaitAsyncGenerator(_step.value); case 12: _value = _context.sent; if (_iteratorNormalCompletion) { _context.next = 27; break; } value = _value; _context.next = 17; return _awaitAsyncGenerator(predicate(value, i++)); case 17: if (!_context.sent) { _context.next = 21; break; } _context.t0 = split; _context.next = 22; break; case 21: _context.t0 = value; case 22: _context.next = 24; return _context.t0; case 24: _iteratorNormalCompletion = true; _context.next = 6; break; case 27: _context.next = 33; break; case 29: _context.prev = 29; _context.t1 = _context["catch"](4); _didIteratorError = true; _iteratorError = _context.t1; case 33: _context.prev = 33; _context.prev = 34; if (!(!_iteratorNormalCompletion && _iterator["return"] != null)) { _context.next = 38; break; } _context.next = 38; return _awaitAsyncGenerator(_iterator["return"]()); case 38: _context.prev = 38; if (!_didIteratorError) { _context.next = 41; break; } throw _iteratorError; case 41: return _context.finish(38); case 42: return _context.finish(33); case 43: case "end": return _context.stop(); } } }, _callee, null, [[4, 29, 33, 43], [34,, 38, 42]]); })); return _asyncPredicateSpliterator.apply(this, arguments); } function __asyncSplitWhen(source, predicate) { return __asyncSpliterate(source, asyncPredicateSpliterator, { predicate: predicate }); } exports.__asyncSplitWhen = __asyncSplitWhen; var asyncSplitWhen = /*#__PURE__*/asyncIterableCurry(__asyncSplitWhen); exports.asyncSplitWhen = asyncSplitWhen; },{"../$spliterate/async-spliterate.js":373,"../../internal/async-iterable.js":480,"@babel/runtime/helpers/asyncIterator":42,"@babel/runtime/helpers/awaitAsyncGenerator":44,"@babel/runtime/helpers/wrapAsyncGenerator":64,"@babel/runtime/regenerator":65}],368:[function(require,module,exports){ var _regeneratorRuntime = require("@babel/runtime/regenerator"); var _marked = /*#__PURE__*/_regeneratorRuntime.mark(predicateSpliterator); function _createForOfIteratorHelper(o, allowArrayLike) { var it; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; } function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } var _require = require('../../internal/iterable.js'), iterableCurry = _require.iterableCurry; var _require2 = require('../$spliterate/spliterate.js'), __spliterate = _require2.__spliterate; function predicateSpliterator(split, _ref, source) { var predicate, i, _iterator, _step, value; return _regeneratorRuntime.wrap(function predicateSpliterator$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: predicate = _ref.predicate; i = 0; _iterator = _createForOfIteratorHelper(source); _context.prev = 3; _iterator.s(); case 5: if ((_step = _iterator.n()).done) { _context.next = 11; break; } value = _step.value; _context.next = 9; return predicate(value, i++) ? split : value; case 9: _context.next = 5; break; case 11: _context.next = 16; break; case 13: _context.prev = 13; _context.t0 = _context["catch"](3); _iterator.e(_context.t0); case 16: _context.prev = 16; _iterator.f(); return _context.finish(16); case 19: case "end": return _context.stop(); } } }, _marked, null, [[3, 13, 16, 19]]); } function __splitWhen(source, predicate) { return __spliterate(source, predicateSpliterator, { predicate: predicate }); } exports.__splitWhen = __splitWhen; var splitWhen = /*#__PURE__*/iterableCurry(__splitWhen); exports.splitWhen = splitWhen; },{"../$spliterate/spliterate.js":374,"../../internal/iterable.js":493,"@babel/runtime/regenerator":65}],369:[function(require,module,exports){ var _regeneratorRuntime = require("@babel/runtime/regenerator"); var _marked = /*#__PURE__*/_regeneratorRuntime.mark(iterableOf); var _require = require('../../internal/async-iterable.js'), asyncIterableCurry = _require.asyncIterableCurry; var _require2 = require('../$map/async-map.js'), __asyncMap = _require2.__asyncMap; function iterableOf(value) { return _regeneratorRuntime.wrap(function iterableOf$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: _context.next = 2; return value; case 2: case "end": return _context.stop(); } } }, _marked); } function __asyncSplit(source) { return __asyncMap(source, function (value) { return iterableOf(value); }); } exports.__asyncSplit = __asyncSplit; var asyncSplit = /*#__PURE__*/asyncIterableCurry(__asyncSplit); exports.asyncSplit = asyncSplit; },{"../$map/async-map.js":337,"../../internal/async-iterable.js":480,"@babel/runtime/regenerator":65}],370:[function(require,module,exports){ var _regeneratorRuntime = require("@babel/runtime/regenerator"); var _marked = /*#__PURE__*/_regeneratorRuntime.mark(iterableOf); var _require = require('../../internal/iterable.js'), iterableCurry = _require.iterableCurry; var _require2 = require('../$map/map.js'), __map = _require2.__map; function iterableOf(value) { return _regeneratorRuntime.wrap(function iterableOf$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: _context.next = 2; return value; case 2: case "end": return _context.stop(); } } }, _marked); } function __split(source) { return __map(source, function (value) { return iterableOf(value); }); } exports.__split = __split; var split = /*#__PURE__*/iterableCurry(__split); exports.split = split; },{"../$map/map.js":338,"../../internal/iterable.js":493,"@babel/runtime/regenerator":65}],371:[function(require,module,exports){ var _require = require('../../internal/async-iterable.js'), asyncIterableCurry = _require.asyncIterableCurry; var _require2 = require('../../internal/async-groups-iterator.js'), AsyncGroupsIterator = _require2.AsyncGroupsIterator; var _require3 = require('../$map/async-map.js'), __asyncMap = _require3.__asyncMap; var _require4 = require('../$wrap/async-wrap.js'), __asyncWrap = _require4.__asyncWrap; function __asyncSpliterateGrouped(source, strategy) { var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; return new AsyncGroupsIterator(source, strategy, options); } exports.__asyncSpliterateGrouped = __asyncSpliterateGrouped; var asyncSpliterateGrouped = /*#__PURE__*/asyncIterableCurry(function $spliterateGrouped() { return __asyncMap(__asyncSpliterateGrouped.apply(void 0, arguments), __asyncWrap); }, { minArgs: 1, maxArgs: 2, growRight: true }); exports.asyncSpliterateGrouped = asyncSpliterateGrouped; },{"../$map/async-map.js":337,"../$wrap/async-wrap.js":408,"../../internal/async-groups-iterator.js":478,"../../internal/async-iterable.js":480}],372:[function(require,module,exports){ var _require = require('../../internal/iterable.js'), iterableCurry = _require.iterableCurry; var _require2 = require('../../internal/groups-iterator.js'), GroupsIterator = _require2.GroupsIterator; var _require3 = require('../$map/map.js'), __map = _require3.__map; var _require4 = require('../$wrap/wrap.js'), __wrap = _require4.__wrap; function __spliterateGrouped(source, strategy) { var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; return new GroupsIterator(source, strategy, options); } exports.__spliterateGrouped = __spliterateGrouped; var spliterateGrouped = /*#__PURE__*/iterableCurry(function $spliterateGrouped() { return __map(__spliterateGrouped.apply(void 0, arguments), __wrap); }, { minArgs: 1, maxArgs: 2, growRight: true }); exports.spliterateGrouped = spliterateGrouped; },{"../$map/map.js":338,"../$wrap/wrap.js":409,"../../internal/groups-iterator.js":491,"../../internal/iterable.js":493}],373:[function(require,module,exports){ var _require = require('../../internal/async-iterable.js'), asyncIterableCurry = _require.asyncIterableCurry; var _require2 = require('../../internal/async-parts-iterator.js'), AsyncPartsIterator = _require2.AsyncPartsIterator; var _require3 = require('../$map/async-map.js'), __asyncMap = _require3.__asyncMap; var _require4 = require('../$wrap/async-wrap.js'), __asyncWrap = _require4.__asyncWrap; function __asyncSpliterate(source, strategy) { var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; return new AsyncPartsIterator(source, strategy, options); } exports.__asyncSpliterate = __asyncSpliterate; var asyncSpliterate = /*#__PURE__*/asyncIterableCurry(function $spliterate() { return __asyncMap(__asyncSpliterate.apply(void 0, arguments), __asyncWrap); }, { minArgs: 1, maxArgs: 2, growRight: true }); exports.asyncSpliterate = asyncSpliterate; },{"../$map/async-map.js":337,"../$wrap/async-wrap.js":408,"../../internal/async-iterable.js":480,"../../internal/async-parts-iterator.js":482}],374:[function(require,module,exports){ var _require = require('../../internal/iterable.js'), iterableCurry = _require.iterableCurry; var _require2 = require('../../internal/parts-iterator.js'), PartsIterator = _require2.PartsIterator; var _require3 = require('../$map/map.js'), __map = _require3.__map; var _require4 = require('../$wrap/wrap.js'), __wrap = _require4.__wrap; function __spliterate(source, strategy) { var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; return new PartsIterator(source, strategy, options); } exports.__spliterate = __spliterate; var spliterate = /*#__PURE__*/iterableCurry(function $spliterate() { return __map(__spliterate.apply(void 0, arguments), __wrap); }, { minArgs: 1, maxArgs: 2, growRight: true }); exports.spliterate = spliterate; },{"../$map/map.js":338,"../$wrap/wrap.js":409,"../../internal/iterable.js":493,"../../internal/parts-iterator.js":496}],375:[function(require,module,exports){ var _regeneratorRuntime = require("@babel/runtime/regenerator"); var _asyncToGenerator = require("@babel/runtime/helpers/asyncToGenerator"); var _require = require('../../internal/async-iterable.js'), asyncIterableCurry = _require.asyncIterableCurry, asyncEnsureIterable = _require.asyncEnsureIterable; var _require2 = require('../$zip-all/async-zip-all.js'), __asyncZipAll = _require2.__asyncZipAll; var _require3 = require('../$peekerate/async-peekerate.js'), __asyncPeekerate = _require3.__asyncPeekerate; var none = Symbol('none'); function _asyncStartsWithAnySeq(_x, _x2, _x3) { return _asyncStartsWithAnySeq2.apply(this, arguments); } function _asyncStartsWithAnySeq2() { _asyncStartsWithAnySeq2 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(peekr, subseqPeekr, same) { var matches, value, seqValue, i; return _regeneratorRuntime.wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: if (!(subseqPeekr.done || subseqPeekr.value.includes(none))) { _context.next = 2; break; } return _context.abrupt("return", true); case 2: matches = subseqPeekr.value.map(function () { return true; }); case 3: if (!(!peekr.done && !subseqPeekr.done)) { _context.next = 22; break; } value = peekr.value; seqValue = subseqPeekr.value; i = 0; case 7: if (!(i < seqValue.length)) { _context.next = 18; break; } if (matches[i]) { _context.next = 10; break; } return _context.abrupt("continue", 15); case 10: if (!(seqValue[i] === none)) { _context.next = 14; break; } return _context.abrupt("return", true); case 14: matches[i] = same(seqValue[i], value); case 15: i++; _context.next = 7; break; case 18: _context.next = 20; return Promise.all([subseqPeekr.advance(), peekr.advance()]); case 20: _context.next = 3; break; case 22: return _context.abrupt("return", subseqPeekr.done && matches.includes(true)); case 23: case "end": return _context.stop(); } } }, _callee); })); return _asyncStartsWithAnySeq2.apply(this, arguments); } exports._asyncStartsWithAnySeq = _asyncStartsWithAnySeq; function __asyncStartsWithAnySeq(_x4, _x5) { return _asyncStartsWithAnySeq3.apply(this, arguments); } function _asyncStartsWithAnySeq3() { _asyncStartsWithAnySeq3 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee2(iterable, seqs) { var same, peekr, subseqPeekr, seqFound, _args2 = arguments; return _regeneratorRuntime.wrap(function _callee2$(_context2) { while (1) { switch (_context2.prev = _context2.next) { case 0: same = _args2.length > 2 && _args2[2] !== undefined ? _args2[2] : Object.is; if (seqs.length) { _context2.next = 3; break; } return _context2.abrupt("return", false); case 3: _context2.next = 5; return __asyncPeekerate(iterable); case 5: peekr = _context2.sent; _context2.next = 8; return __asyncPeekerate(__asyncZipAll(seqs, { filler: none })); case 8: subseqPeekr = _context2.sent; _context2.next = 11; return _asyncStartsWithAnySeq(peekr, subseqPeekr, same); case 11: seqFound = _context2.sent; _context2.next = 14; return subseqPeekr["return"](); case 14: _context2.next = 16; return peekr["return"](); case 16: return _context2.abrupt("return", seqFound); case 17: case "end": return _context2.stop(); } } }, _callee2); })); return _asyncStartsWithAnySeq3.apply(this, arguments); } exports.__asyncStartsWithAnySeq = __asyncStartsWithAnySeq; var asyncStartsWithAnySeq = /*#__PURE__*/asyncIterableCurry(__asyncStartsWithAnySeq, { minArgs: 1, maxArgs: 2, reduces: true, validateArgs: function validateArgs(args) { args[1] = args[1].map(function (arg) { return asyncEnsureIterable(arg); }); } }); exports.asyncStartsWithAnySeq = asyncStartsWithAnySeq; },{"../$peekerate/async-peekerate.js":339,"../$zip-all/async-zip-all.js":410,"../../internal/async-iterable.js":480,"@babel/runtime/helpers/asyncToGenerator":43,"@babel/runtime/regenerator":65}],376:[function(require,module,exports){ var _require = require('../../internal/iterable.js'), iterableCurry = _require.iterableCurry, ensureIterable = _require.ensureIterable; var _require2 = require('../$zip-all/zip-all.js'), __zipAll = _require2.__zipAll; var _require3 = require('../$peekerate/peekerate.js'), __peekerate = _require3.__peekerate; var none = Symbol('none'); function _startsWithAnySeq(peekr, subseqPeekr, same) { if (subseqPeekr.done || subseqPeekr.value.includes(none)) return true; var matches = subseqPeekr.value.map(function () { return true; }); while (!peekr.done && !subseqPeekr.done) { var value = peekr.value; var seqValue = subseqPeekr.value; for (var i = 0; i < seqValue.length; i++) { if (!matches[i]) continue; if (seqValue[i] === none) { return true; } else { matches[i] = same(seqValue[i], value); } } subseqPeekr.advance(); peekr.advance(); } return subseqPeekr.done && matches.includes(true); } exports._startsWithAnySeq = _startsWithAnySeq; function __startsWithAnySeq(iterable, seqs) { var same = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : Object.is; if (!seqs.length) return false; var peekr = __peekerate(iterable); var subseqPeekr = __peekerate(__zipAll(seqs, { filler: none })); var seqFound = _startsWithAnySeq(peekr, subseqPeekr, same); subseqPeekr["return"](); peekr["return"](); return seqFound; } exports.__startsWithAnySeq = __startsWithAnySeq; var startsWithAnySeq = /*#__PURE__*/iterableCurry(__startsWithAnySeq, { minArgs: 1, maxArgs: 2, reduces: true, validateArgs: function validateArgs(args) { args[1] = args[1].map(function (arg) { return ensureIterable(arg); }); } }); exports.startsWithAnySeq = startsWithAnySeq; },{"../$peekerate/peekerate.js":340,"../$zip-all/zip-all.js":411,"../../internal/iterable.js":493}],377:[function(require,module,exports){ var _regeneratorRuntime = require("@babel/runtime/regenerator"); var _asyncToGenerator = require("@babel/runtime/helpers/asyncToGenerator"); var _require = require('../../internal/async-iterable.js'), asyncIterableCurry = _require.asyncIterableCurry; var _require2 = require('../$first-or/async-first-or.js'), __asyncFirstOr = _require2.__asyncFirstOr; var _require3 = require('../$includes/includes.js'), __includes = _require3.__includes; var none = Symbol('none'); function __asyncStartsWithAny(_x, _x2) { return _asyncStartsWithAny.apply(this, arguments); } function _asyncStartsWithAny() { _asyncStartsWithAny = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(iterable, values) { var same, first, _args = arguments; return _regeneratorRuntime.wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: same = _args.length > 2 && _args[2] !== undefined ? _args[2] : Object.is; _context.next = 3; return __asyncFirstOr(iterable, none); case 3: first = _context.sent; if (!(first === none)) { _context.next = 6; break; } return _context.abrupt("return", false); case 6: return _context.abrupt("return", __includes(values, first, function (a, b) { return same(b, a); })); case 7: case "end": return _context.stop(); } } }, _callee); })); return _asyncStartsWithAny.apply(this, arguments); } exports.__asyncStartsWithAny = __asyncStartsWithAny; var asyncStartsWithAny = /*#__PURE__*/asyncIterableCurry(__asyncStartsWithAny, { minArgs: 1, maxArgs: 2, reduces: true, validateArgs: function validateArgs(args) {} }); exports.asyncStartsWithAny = asyncStartsWithAny; },{"../$first-or/async-first-or.js":298,"../$includes/includes.js":320,"../../internal/async-iterable.js":480,"@babel/runtime/helpers/asyncToGenerator":43,"@babel/runtime/regenerator":65}],378:[function(require,module,exports){ var _require = require('../../internal/iterable.js'), iterableCurry = _require.iterableCurry; var _require2 = require('../$first-or/first-or.js'), __firstOr = _require2.__firstOr; var _require3 = require('../$includes/includes.js'), __includes = _require3.__includes; var none = Symbol('none'); function __startsWithAny(iterable, values) { var same = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : Object.is; var first = __firstOr(iterable, none); if (first === none) return false; return __includes(values, first, function (a, b) { return same(b, a); }); } exports.__startsWithAny = __startsWithAny; var startsWithAny = /*#__PURE__*/iterableCurry(__startsWithAny, { minArgs: 1, maxArgs: 2, reduces: true, validateArgs: function validateArgs(args) { if (true && typeof args[0] === 'string') { console.warn('For string inputs use startsWithAnySeq instead of startsWithAny'); } } }); exports.startsWithAny = startsWithAny; },{"../$first-or/first-or.js":299,"../$includes/includes.js":320,"../../internal/iterable.js":493}],379:[function(require,module,exports){ var _require = require('../../internal/async-iterable.js'), asyncIterableCurry = _require.asyncIterableCurry, asyncEnsureIterable = _require.asyncEnsureIterable; var _require2 = require('../$starts-with-any-seq/async-starts-with-any-seq.js'), __asyncStartsWithAnySeq = _require2.__asyncStartsWithAnySeq; function __asyncStartsWithSeq(iterable, seq) { var same = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : Object.is; return __asyncStartsWithAnySeq(iterable, [seq], same); } exports.__asyncStartsWithSeq = __asyncStartsWithSeq; var asyncStartsWithSeq = /*#__PURE__*/asyncIterableCurry(__asyncStartsWithSeq, { minArgs: 1, maxArgs: 2, reduces: true, validateArgs: function validateArgs(args) { args[1] = asyncEnsureIterable(args[1]); } }); exports.asyncStartsWithSeq = asyncStartsWithSeq; },{"../$starts-with-any-seq/async-starts-with-any-seq.js":375,"../../internal/async-iterable.js":480}],380:[function(require,module,exports){ var _require = require('../../internal/iterable.js'), iterableCurry = _require.iterableCurry, ensureIterable = _require.ensureIterable; var _require2 = require('../$starts-with-any-seq/starts-with-any-seq.js'), __startsWithAnySeq = _require2.__startsWithAnySeq; function __startsWithSeq(iterable, seq) { var same = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : Object.is; return __startsWithAnySeq(iterable, [seq], same); } exports.__startsWithSeq = __startsWithSeq; var startsWithSeq = /*#__PURE__*/iterableCurry(__startsWithSeq, { minArgs: 1, maxArgs: 2, reduces: true, validateArgs: function validateArgs(args) { args[1] = ensureIterable(args[1]); } }); exports.startsWithSeq = startsWithSeq; },{"../$starts-with-any-seq/starts-with-any-seq.js":376,"../../internal/iterable.js":493}],381:[function(require,module,exports){ var _regeneratorRuntime = require("@babel/runtime/regenerator"); var _asyncToGenerator = require("@babel/runtime/helpers/asyncToGenerator"); var _require = require('../../internal/async-iterable.js'), asyncIterableCurry = _require.asyncIterableCurry; var _require2 = require('../$first-or/async-first-or.js'), __asyncFirstOr = _require2.__asyncFirstOr; var none = Symbol('none'); function __asyncStartsWith(_x, _x2) { return _asyncStartsWith.apply(this, arguments); } function _asyncStartsWith() { _asyncStartsWith = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(iterable, value) { var same, first, _args = arguments; return _regeneratorRuntime.wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: same = _args.length > 2 && _args[2] !== undefined ? _args[2] : Object.is; _context.next = 3; return __asyncFirstOr(iterable, none); case 3: first = _context.sent; if (!(first === none)) { _context.next = 6; break; } return _context.abrupt("return", false); case 6: return _context.abrupt("return", same(value, first)); case 7: case "end": return _context.stop(); } } }, _callee); })); return _asyncStartsWith.apply(this, arguments); } exports.__asyncStartsWith = __asyncStartsWith; var asyncStartsWith = /*#__PURE__*/asyncIterableCurry(__asyncStartsWith, { minArgs: 1, maxArgs: 2, reduces: true, validateArgs: function validateArgs(args) {} }); exports.asyncStartsWith = asyncStartsWith; },{"../$first-or/async-first-or.js":298,"../../internal/async-iterable.js":480,"@babel/runtime/helpers/asyncToGenerator":43,"@babel/runtime/regenerator":65}],382:[function(require,module,exports){ var _require = require('../../internal/iterable.js'), iterableCurry = _require.iterableCurry; var _require2 = require('../$first-or/first-or.js'), __firstOr = _require2.__firstOr; var none = Symbol('none'); function __startsWith(iterable, value) { var same = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : Object.is; var first = __firstOr(iterable, none); if (first === none) return false; return same(value, first); } exports.__startsWith = __startsWith; var startsWith = /*#__PURE__*/iterableCurry(__startsWith, { minArgs: 1, maxArgs: 2, reduces: true, validateArgs: function validateArgs(args) { if (true && typeof args[0] === 'string') { console.warn('For string inputs use startsWithSeq instead of startsWith'); } } }); exports.startsWith = startsWith; },{"../$first-or/first-or.js":299,"../../internal/iterable.js":493}],383:[function(require,module,exports){ var _regeneratorRuntime = require("@babel/runtime/regenerator"); var _asyncToGenerator = require("@babel/runtime/helpers/asyncToGenerator"); var _asyncIterator = require("@babel/runtime/helpers/asyncIterator"); var _require = require('../../internal/async-iterable.js'), asyncIterableCurry = _require.asyncIterableCurry; function __asyncStr(_x) { return _asyncStr.apply(this, arguments); } function _asyncStr() { _asyncStr = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(chars) { var result, _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, _value, _char; return _regeneratorRuntime.wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: result = ''; _iteratorNormalCompletion = true; _didIteratorError = false; _context.prev = 3; _iterator = _asyncIterator(chars); case 5: _context.next = 7; return _iterator.next(); case 7: _step = _context.sent; _iteratorNormalCompletion = _step.done; _context.next = 11; return _step.value; case 11: _value = _context.sent; if (_iteratorNormalCompletion) { _context.next = 18; break; } _char = _value; result += _char.toString(); case 15: _iteratorNormalCompletion = true; _context.next = 5; break; case 18: _context.next = 24; break; case 20: _context.prev = 20; _context.t0 = _context["catch"](3); _didIteratorError = true; _iteratorError = _context.t0; case 24: _context.prev = 24; _context.prev = 25; if (!(!_iteratorNormalCompletion && _iterator["return"] != null)) { _context.next = 29; break; } _context.next = 29; return _iterator["return"](); case 29: _context.prev = 29; if (!_didIteratorError) { _context.next = 32; break; } throw _iteratorError; case 32: return _context.finish(29); case 33: return _context.finish(24); case 34: return _context.abrupt("return", result); case 35: case "end": return _context.stop(); } } }, _callee, null, [[3, 20, 24, 34], [25,, 29, 33]]); })); return _asyncStr.apply(this, arguments); } exports.__asyncStr = __asyncStr; var asyncStr = /*#__PURE__*/asyncIterableCurry(__asyncStr, { reduces: true }); exports.asyncStr = asyncStr; },{"../../internal/async-iterable.js":480,"@babel/runtime/helpers/asyncIterator":42,"@babel/runtime/helpers/asyncToGenerator":43,"@babel/runtime/regenerator":65}],384:[function(require,module,exports){ function _createForOfIteratorHelper(o, allowArrayLike) { var it; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; } function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } var _require = require('../../internal/iterable.js'), iterableCurry = _require.iterableCurry; function __str(chars) { var result = ''; var _iterator = _createForOfIteratorHelper(chars), _step; try { for (_iterator.s(); !(_step = _iterator.n()).done;) { var _char = _step.value; result += _char.toString(); } } catch (err) { _iterator.e(err); } finally { _iterator.f(); } return result; } exports.__str = __str; var str = /*#__PURE__*/iterableCurry(__str, { reduces: true }); exports.str = str; },{"../../internal/iterable.js":493}],385:[function(require,module,exports){ var _regeneratorRuntime = require("@babel/runtime/regenerator"); var _asyncToGenerator = require("@babel/runtime/helpers/asyncToGenerator"); var _asyncIterator = require("@babel/runtime/helpers/asyncIterator"); var _require = require('../../internal/async-iterable.js'), asyncIterableCurry = _require.asyncIterableCurry; function __asyncTakeLastOr(_x, _x2) { return _asyncTakeLastOr.apply(this, arguments); } function _asyncTakeLastOr() { _asyncTakeLastOr = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(iterable, whenEmpty) { var _value, _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, _value2, value; return _regeneratorRuntime.wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: _value = whenEmpty; _iteratorNormalCompletion = true; _didIteratorError = false; _context.prev = 3; _iterator = _asyncIterator(iterable); case 5: _context.next = 7; return _iterator.next(); case 7: _step = _context.sent; _iteratorNormalCompletion = _step.done; _context.next = 11; return _step.value; case 11: _value2 = _context.sent; if (_iteratorNormalCompletion) { _context.next = 18; break; } value = _value2; _value = value; case 15: _iteratorNormalCompletion = true; _context.next = 5; break; case 18: _context.next = 24; break; case 20: _context.prev = 20; _context.t0 = _context["catch"](3); _didIteratorError = true; _iteratorError = _context.t0; case 24: _context.prev = 24; _context.prev = 25; if (!(!_iteratorNormalCompletion && _iterator["return"] != null)) { _context.next = 29; break; } _context.next = 29; return _iterator["return"](); case 29: _context.prev = 29; if (!_didIteratorError) { _context.next = 32; break; } throw _iteratorError; case 32: return _context.finish(29); case 33: return _context.finish(24); case 34: return _context.abrupt("return", _value); case 35: case "end": return _context.stop(); } } }, _callee, null, [[3, 20, 24, 34], [25,, 29, 33]]); })); return _asyncTakeLastOr.apply(this, arguments); } exports.__asyncTakeLastOr = __asyncTakeLastOr; var asyncTakeLastOr = /*#__PURE__*/asyncIterableCurry(__asyncTakeLastOr, { reduces: true }); exports.asyncTakeLastOr = asyncTakeLastOr; },{"../../internal/async-iterable.js":480,"@babel/runtime/helpers/asyncIterator":42,"@babel/runtime/helpers/asyncToGenerator":43,"@babel/runtime/regenerator":65}],386:[function(require,module,exports){ function _createForOfIteratorHelper(o, allowArrayLike) { var it; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; } function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } var _require = require('../../internal/iterable.js'), iterableCurry = _require.iterableCurry; function __takeLastOr(iterable, whenEmpty) { var _value = whenEmpty; var _iterator = _createForOfIteratorHelper(iterable), _step; try { for (_iterator.s(); !(_step = _iterator.n()).done;) { var value = _step.value; _value = value; } } catch (err) { _iterator.e(err); } finally { _iterator.f(); } return _value; } exports.__takeLastOr = __takeLastOr; var takeLastOr = /*#__PURE__*/iterableCurry(__takeLastOr, { reduces: true }); exports.takeLastOr = takeLastOr; },{"../../internal/iterable.js":493}],387:[function(require,module,exports){ var _require = require('../../internal/async-iterable.js'), asyncIterableCurry = _require.asyncIterableCurry; var _require2 = require('../$take-last-or/async-take-last-or.js'), __asyncTakeLastOr = _require2.__asyncTakeLastOr; function __asyncTakeLast(iterable) { return __asyncTakeLastOr(iterable, undefined); } exports.__asyncTakeLast = __asyncTakeLast; var asyncTakeLast = /*#__PURE__*/asyncIterableCurry(__asyncTakeLast, { reduces: true }); exports.asyncTakeLast = asyncTakeLast; },{"../$take-last-or/async-take-last-or.js":385,"../../internal/async-iterable.js":480}],388:[function(require,module,exports){ var _require = require('../../internal/iterable.js'), iterableCurry = _require.iterableCurry; var _require2 = require('../$take-last-or/take-last-or.js'), __takeLastOr = _require2.__takeLastOr; function __takeLast(iterable) { return __takeLastOr(iterable, undefined); } exports.__takeLast = __takeLast; var takeLast = /*#__PURE__*/iterableCurry(__takeLast, { reduces: true }); exports.takeLast = takeLast; },{"../$take-last-or/take-last-or.js":386,"../../internal/iterable.js":493}],389:[function(require,module,exports){ var _regeneratorRuntime = require("@babel/runtime/regenerator"); var _awaitAsyncGenerator = require("@babel/runtime/helpers/awaitAsyncGenerator"); var _wrapAsyncGenerator = require("@babel/runtime/helpers/wrapAsyncGenerator"); var _asyncIterator = require("@babel/runtime/helpers/asyncIterator"); var _require = require('../../internal/async-iterable.js'), asyncIterableCurry = _require.asyncIterableCurry; var _require2 = require('../../internal/compare.js'), defaultCompareOrder = _require2.defaultCompareOrder; var _require3 = require('./internal/heap.js'), Heap = _require3.Heap; function __asyncTakeSorted(_x) { return _asyncTakeSorted.apply(this, arguments); } exports.__asyncTakeSorted = __asyncTakeSorted; function _asyncTakeSorted() { _asyncTakeSorted = _wrapAsyncGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(source) { var n, compare, heap, _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, _value, value, _args = arguments; return _regeneratorRuntime.wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: n = _args.length > 1 && _args[1] !== undefined ? _args[1] : Infinity; compare = _args.length > 2 && _args[2] !== undefined ? _args[2] : defaultCompareOrder; heap = new Heap(compare); _iteratorNormalCompletion = true; _didIteratorError = false; _context.prev = 5; _iterator = _asyncIterator(source); case 7: _context.next = 9; return _awaitAsyncGenerator(_iterator.next()); case 9: _step = _context.sent; _iteratorNormalCompletion = _step.done; _context.next = 13; return _awaitAsyncGenerator(_step.value); case 13: _value = _context.sent; if (_iteratorNormalCompletion) { _context.next = 21; break; } value = _value; heap.push(value); if (heap.size > n) { heap.pop(); } case 18: _iteratorNormalCompletion = true; _context.next = 7; break; case 21: _context.next = 27; break; case 23: _context.prev = 23; _context.t0 = _context["catch"](5); _didIteratorError = true; _iteratorError = _context.t0; case 27: _context.prev = 27; _context.prev = 28; if (!(!_iteratorNormalCompletion && _iterator["return"] != null)) { _context.next = 32; break; } _context.next = 32; return _awaitAsyncGenerator(_iterator["return"]()); case 32: _context.prev = 32; if (!_didIteratorError) { _context.next = 35; break; } throw _iteratorError; case 35: return _context.finish(32); case 36: return _context.finish(27); case 37: if (!heap.size) { _context.next = 42; break; } _context.next = 40; return heap.pop(); case 40: _context.next = 37; break; case 42: case "end": return _context.stop(); } } }, _callee, null, [[5, 23, 27, 37], [28,, 32, 36]]); })); return _asyncTakeSorted.apply(this, arguments); } var asyncTakeSorted = /*#__PURE__*/asyncIterableCurry(__asyncTakeSorted, { minArgs: 0, maxArgs: 2, validateArgs: function validateArgs(args) { if (typeof args[1] === 'function') { var temp = args[2]; args[2] = args[1]; args[1] = temp; } } }); exports.asyncTakeSorted = asyncTakeSorted; },{"../../internal/async-iterable.js":480,"../../internal/compare.js":487,"./internal/heap.js":390,"@babel/runtime/helpers/asyncIterator":42,"@babel/runtime/helpers/awaitAsyncGenerator":44,"@babel/runtime/helpers/wrapAsyncGenerator":64,"@babel/runtime/regenerator":65}],390:[function(require,module,exports){ var _classCallCheck = require("@babel/runtime/helpers/classCallCheck"); var _createClass = require("@babel/runtime/helpers/createClass"); function swap(arr, x, y) { var tmp = arr[x]; arr[x] = arr[y]; arr[y] = tmp; } var Heap = /*#__PURE__*/function () { function Heap(compare) { _classCallCheck(this, Heap); this.compare = compare; this.data = []; } _createClass(Heap, [{ key: "_bubbleUp", value: function _bubbleUp(i) { var data = this.data, compare = this.compare; var parentIndex; while (i > 0) { parentIndex = Heap.getParentIndex(i); if (compare(data[i], data[parentIndex]) < 0) { swap(this.data, i, parentIndex); i = parentIndex; } else { return i; } } } }, { key: "_heapify", value: function _heapify(i) { var data = this.data, compare = this.compare; var lIdx = Heap.getLeftIndex(i); var rIdx = Heap.getRightIndex(i); var leftIsSmaller = this.has(lIdx) ? compare(data[lIdx], data[i]) < 0 : false; var rightIsSmaller = this.has(rIdx) ? compare(data[rIdx], data[i]) < 0 : false; if (leftIsSmaller && rightIsSmaller) { if (compare(data[lIdx], data[rIdx]) < 0) { swap(this.data, lIdx, i); return lIdx; } else { swap(this.data, rIdx, i); return rIdx; } } else if (leftIsSmaller) { swap(this.data, lIdx, i); return lIdx; } else if (rightIsSmaller) { swap(this.data, rIdx, i); return rIdx; } } }, { key: "_bubbleDown", value: function _bubbleDown(i) { var size = this.size; while (i !== null && i < size) { i = this._heapify(i); } } }, { key: "push", value: function push(value) { this.data.push(value); this._bubbleUp(this.size - 1); } }, { key: "pop", value: function pop() { if (!this.size) return; var root = this.data[0]; var last = this.data.pop(); if (this.size > 0) { this.data[0] = last; this._bubbleDown(0); } return root; } }, { key: "has", value: function has(idx) { return idx > 0 && idx < this.size; } }, { key: "size", get: function get() { return this.data.length; } }], [{ key: "getParentIndex", value: function getParentIndex(i) { return i % 2 ? (i - 1) / 2 : Math.floor((i - 1) / 2); } }, { key: "getLeftIndex", value: function getLeftIndex(i) { return 2 * i + 1; } }, { key: "getRightIndex", value: function getRightIndex(i) { return 2 * i + 2; } }]); return Heap; }(); exports.Heap = Heap; },{"@babel/runtime/helpers/classCallCheck":45,"@babel/runtime/helpers/createClass":47}],391:[function(require,module,exports){ var _regeneratorRuntime = require("@babel/runtime/regenerator"); var _marked = /*#__PURE__*/_regeneratorRuntime.mark(__takeSorted); function _createForOfIteratorHelper(o, allowArrayLike) { var it; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; } function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } var _require = require('../../internal/iterable.js'), iterableCurry = _require.iterableCurry; var _require2 = require('../../internal/compare.js'), defaultCompareOrder = _require2.defaultCompareOrder; var _require3 = require('./internal/heap.js'), Heap = _require3.Heap; function __takeSorted(source) { var n, compare, heap, _iterator, _step, value, _args = arguments; return _regeneratorRuntime.wrap(function __takeSorted$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: n = _args.length > 1 && _args[1] !== undefined ? _args[1] : Infinity; compare = _args.length > 2 && _args[2] !== undefined ? _args[2] : defaultCompareOrder; heap = new Heap(compare); _iterator = _createForOfIteratorHelper(source); try { for (_iterator.s(); !(_step = _iterator.n()).done;) { value = _step.value; heap.push(value); if (heap.size > n) { heap.pop(); } } } catch (err) { _iterator.e(err); } finally { _iterator.f(); } case 5: if (!heap.size) { _context.next = 10; break; } _context.next = 8; return heap.pop(); case 8: _context.next = 5; break; case 10: case "end": return _context.stop(); } } }, _marked); } exports.__takeSorted = __takeSorted; var takeSorted = /*#__PURE__*/iterableCurry(__takeSorted, { minArgs: 0, maxArgs: 2, validateArgs: function validateArgs(args) { if (typeof args[1] === 'function') { var temp = args[2]; args[2] = args[1]; args[1] = temp; } } }); exports.takeSorted = takeSorted; },{"../../internal/compare.js":487,"../../internal/iterable.js":493,"./internal/heap.js":390,"@babel/runtime/regenerator":65}],392:[function(require,module,exports){ var _regeneratorRuntime = require("@babel/runtime/regenerator"); var _awaitAsyncGenerator = require("@babel/runtime/helpers/awaitAsyncGenerator"); var _wrapAsyncGenerator = require("@babel/runtime/helpers/wrapAsyncGenerator"); var _asyncIterator = require("@babel/runtime/helpers/asyncIterator"); var _require = require('../../internal/async-iterable.js'), asyncIterableCurry = _require.asyncIterableCurry; function __asyncTakeWhile(_x, _x2) { return _asyncTakeWhile.apply(this, arguments); } exports.__asyncTakeWhile = __asyncTakeWhile; function _asyncTakeWhile() { _asyncTakeWhile = _wrapAsyncGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(source, predicate) { var take, c, _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, _value, value; return _regeneratorRuntime.wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: take = true; c = 0; _iteratorNormalCompletion = true; _didIteratorError = false; _context.prev = 4; _iterator = _asyncIterator(source); case 6: _context.next = 8; return _awaitAsyncGenerator(_iterator.next()); case 8: _step = _context.sent; _iteratorNormalCompletion = _step.done; _context.next = 12; return _awaitAsyncGenerator(_step.value); case 12: _value = _context.sent; if (_iteratorNormalCompletion) { _context.next = 27; break; } value = _value; _context.next = 17; return _awaitAsyncGenerator(predicate(value, c++)); case 17: take = _context.sent; if (!take) { _context.next = 23; break; } _context.next = 21; return value; case 21: _context.next = 24; break; case 23: return _context.abrupt("break", 27); case 24: _iteratorNormalCompletion = true; _context.next = 6; break; case 27: _context.next = 33; break; case 29: _context.prev = 29; _context.t0 = _context["catch"](4); _didIteratorError = true; _iteratorError = _context.t0; case 33: _context.prev = 33; _context.prev = 34; if (!(!_iteratorNormalCompletion && _iterator["return"] != null)) { _context.next = 38; break; } _context.next = 38; return _awaitAsyncGenerator(_iterator["return"]()); case 38: _context.prev = 38; if (!_didIteratorError) { _context.next = 41; break; } throw _iteratorError; case 41: return _context.finish(38); case 42: return _context.finish(33); case 43: case "end": return _context.stop(); } } }, _callee, null, [[4, 29, 33, 43], [34,, 38, 42]]); })); return _asyncTakeWhile.apply(this, arguments); } var asyncTakeWhile = /*#__PURE__*/asyncIterableCurry(__asyncTakeWhile); exports.asyncTakeWhile = asyncTakeWhile; },{"../../internal/async-iterable.js":480,"@babel/runtime/helpers/asyncIterator":42,"@babel/runtime/helpers/awaitAsyncGenerator":44,"@babel/runtime/helpers/wrapAsyncGenerator":64,"@babel/runtime/regenerator":65}],393:[function(require,module,exports){ var _regeneratorRuntime = require("@babel/runtime/regenerator"); var _marked = /*#__PURE__*/_regeneratorRuntime.mark(__takeWhile); function _createForOfIteratorHelper(o, allowArrayLike) { var it; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; } function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } var _require = require('../../internal/iterable.js'), iterableCurry = _require.iterableCurry; function __takeWhile(source, predicate) { var take, c, _iterator, _step, value; return _regeneratorRuntime.wrap(function __takeWhile$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: take = true; c = 0; _iterator = _createForOfIteratorHelper(source); _context.prev = 3; _iterator.s(); case 5: if ((_step = _iterator.n()).done) { _context.next = 16; break; } value = _step.value; take = predicate(value, c++); if (!take) { _context.next = 13; break; } _context.next = 11; return value; case 11: _context.next = 14; break; case 13: return _context.abrupt("break", 16); case 14: _context.next = 5; break; case 16: _context.next = 21; break; case 18: _context.prev = 18; _context.t0 = _context["catch"](3); _iterator.e(_context.t0); case 21: _context.prev = 21; _iterator.f(); return _context.finish(21); case 24: case "end": return _context.stop(); } } }, _marked, null, [[3, 18, 21, 24]]); } exports.__takeWhile = __takeWhile; var takeWhile = /*#__PURE__*/iterableCurry(__takeWhile); exports.takeWhile = takeWhile; },{"../../internal/iterable.js":493,"@babel/runtime/regenerator":65}],394:[function(require,module,exports){ var _regeneratorRuntime = require("@babel/runtime/regenerator"); var _awaitAsyncGenerator = require("@babel/runtime/helpers/awaitAsyncGenerator"); var _wrapAsyncGenerator = require("@babel/runtime/helpers/wrapAsyncGenerator"); var _asyncIterator = require("@babel/runtime/helpers/asyncIterator"); var _require = require('../../internal/async-iterable.js'), asyncIterableCurry = _require.asyncIterableCurry; function __asyncTake(_x, _x2) { return _asyncTake.apply(this, arguments); } exports.__asyncTake = __asyncTake; function _asyncTake() { _asyncTake = _wrapAsyncGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(iterable, n) { var i, _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, _value, value; return _regeneratorRuntime.wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: if (!(n === 0)) { _context.next = 2; break; } return _context.abrupt("return"); case 2: i = 0; _iteratorNormalCompletion = true; _didIteratorError = false; _context.prev = 5; _iterator = _asyncIterator(iterable); case 7: _context.next = 9; return _awaitAsyncGenerator(_iterator.next()); case 9: _step = _context.sent; _iteratorNormalCompletion = _step.done; _context.next = 13; return _awaitAsyncGenerator(_step.value); case 13: _value = _context.sent; if (_iteratorNormalCompletion) { _context.next = 23; break; } value = _value; _context.next = 18; return value; case 18: if (!(++i === n)) { _context.next = 20; break; } return _context.abrupt("break", 23); case 20: _iteratorNormalCompletion = true; _context.next = 7; break; case 23: _context.next = 29; break; case 25: _context.prev = 25; _context.t0 = _context["catch"](5); _didIteratorError = true; _iteratorError = _context.t0; case 29: _context.prev = 29; _context.prev = 30; if (!(!_iteratorNormalCompletion && _iterator["return"] != null)) { _context.next = 34; break; } _context.next = 34; return _awaitAsyncGenerator(_iterator["return"]()); case 34: _context.prev = 34; if (!_didIteratorError) { _context.next = 37; break; } throw _iteratorError; case 37: return _context.finish(34); case 38: return _context.finish(29); case 39: case "end": return _context.stop(); } } }, _callee, null, [[5, 25, 29, 39], [30,, 34, 38]]); })); return _asyncTake.apply(this, arguments); } var asyncTake = /*#__PURE__*/asyncIterableCurry(__asyncTake); exports.asyncTake = asyncTake; },{"../../internal/async-iterable.js":480,"@babel/runtime/helpers/asyncIterator":42,"@babel/runtime/helpers/awaitAsyncGenerator":44,"@babel/runtime/helpers/wrapAsyncGenerator":64,"@babel/runtime/regenerator":65}],395:[function(require,module,exports){ var _regeneratorRuntime = require("@babel/runtime/regenerator"); var _marked = /*#__PURE__*/_regeneratorRuntime.mark(__take); function _createForOfIteratorHelper(o, allowArrayLike) { var it; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; } function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } var _require = require('../../internal/iterable.js'), iterableCurry = _require.iterableCurry; function __take(iterable, n) { var i, _iterator, _step, value; return _regeneratorRuntime.wrap(function __take$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: if (!(n === 0)) { _context.next = 2; break; } return _context.abrupt("return"); case 2: i = 0; _iterator = _createForOfIteratorHelper(iterable); _context.prev = 4; _iterator.s(); case 6: if ((_step = _iterator.n()).done) { _context.next = 14; break; } value = _step.value; _context.next = 10; return value; case 10: if (!(++i === n)) { _context.next = 12; break; } return _context.abrupt("break", 14); case 12: _context.next = 6; break; case 14: _context.next = 19; break; case 16: _context.prev = 16; _context.t0 = _context["catch"](4); _iterator.e(_context.t0); case 19: _context.prev = 19; _iterator.f(); return _context.finish(19); case 22: case "end": return _context.stop(); } } }, _marked, null, [[4, 16, 19, 22]]); } exports.__take = __take; var take = /*#__PURE__*/iterableCurry(__take); exports.take = take; },{"../../internal/iterable.js":493,"@babel/runtime/regenerator":65}],396:[function(require,module,exports){ var _regeneratorRuntime = require("@babel/runtime/regenerator"); var _awaitAsyncGenerator = require("@babel/runtime/helpers/awaitAsyncGenerator"); var _wrapAsyncGenerator = require("@babel/runtime/helpers/wrapAsyncGenerator"); var _asyncIterator = require("@babel/runtime/helpers/asyncIterator"); var _require = require('../../internal/async-iterable.js'), asyncIterableCurry = _require.asyncIterableCurry; function __asyncTap(_x, _x2) { return _asyncTap.apply(this, arguments); } exports.__asyncTap = __asyncTap; function _asyncTap() { _asyncTap = _wrapAsyncGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(source, callback) { var c, _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, _value, value; return _regeneratorRuntime.wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: c = 0; _iteratorNormalCompletion = true; _didIteratorError = false; _context.prev = 3; _iterator = _asyncIterator(source); case 5: _context.next = 7; return _awaitAsyncGenerator(_iterator.next()); case 7: _step = _context.sent; _iteratorNormalCompletion = _step.done; _context.next = 11; return _awaitAsyncGenerator(_step.value); case 11: _value = _context.sent; if (_iteratorNormalCompletion) { _context.next = 20; break; } value = _value; callback(value, c++); _context.next = 17; return value; case 17: _iteratorNormalCompletion = true; _context.next = 5; break; case 20: _context.next = 26; break; case 22: _context.prev = 22; _context.t0 = _context["catch"](3); _didIteratorError = true; _iteratorError = _context.t0; case 26: _context.prev = 26; _context.prev = 27; if (!(!_iteratorNormalCompletion && _iterator["return"] != null)) { _context.next = 31; break; } _context.next = 31; return _awaitAsyncGenerator(_iterator["return"]()); case 31: _context.prev = 31; if (!_didIteratorError) { _context.next = 34; break; } throw _iteratorError; case 34: return _context.finish(31); case 35: return _context.finish(26); case 36: case "end": return _context.stop(); } } }, _callee, null, [[3, 22, 26, 36], [27,, 31, 35]]); })); return _asyncTap.apply(this, arguments); } var asyncTap = /*#__PURE__*/asyncIterableCurry(__asyncTap); exports.asyncTap = asyncTap; },{"../../internal/async-iterable.js":480,"@babel/runtime/helpers/asyncIterator":42,"@babel/runtime/helpers/awaitAsyncGenerator":44,"@babel/runtime/helpers/wrapAsyncGenerator":64,"@babel/runtime/regenerator":65}],397:[function(require,module,exports){ var _regeneratorRuntime = require("@babel/runtime/regenerator"); var _marked = /*#__PURE__*/_regeneratorRuntime.mark(__tap); function _createForOfIteratorHelper(o, allowArrayLike) { var it; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; } function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } var _require = require('../../internal/iterable.js'), iterableCurry = _require.iterableCurry; function __tap(source, callback) { var c, _iterator, _step, value; return _regeneratorRuntime.wrap(function __tap$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: c = 0; _iterator = _createForOfIteratorHelper(source); _context.prev = 2; _iterator.s(); case 4: if ((_step = _iterator.n()).done) { _context.next = 11; break; } value = _step.value; callback(value, c++); _context.next = 9; return value; case 9: _context.next = 4; break; case 11: _context.next = 16; break; case 13: _context.prev = 13; _context.t0 = _context["catch"](2); _iterator.e(_context.t0); case 16: _context.prev = 16; _iterator.f(); return _context.finish(16); case 19: case "end": return _context.stop(); } } }, _marked, null, [[2, 13, 16, 19]]); } exports.__tap = __tap; var tap = /*#__PURE__*/iterableCurry(__tap); exports.tap = tap; },{"../../internal/iterable.js":493,"@babel/runtime/regenerator":65}],398:[function(require,module,exports){ var _regeneratorRuntime = require("@babel/runtime/regenerator"); var _asyncToGenerator = require("@babel/runtime/helpers/asyncToGenerator"); var _asyncIterator = require("@babel/runtime/helpers/asyncIterator"); var _require = require('../../internal/async-iterable.js'), asyncEnsureIterable = _require.asyncEnsureIterable; function __asyncToArray(_x) { return _asyncToArray.apply(this, arguments); } function _asyncToArray() { _asyncToArray = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(source) { var out, _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, _value, value; return _regeneratorRuntime.wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: out = []; _iteratorNormalCompletion = true; _didIteratorError = false; _context.prev = 3; _iterator = _asyncIterator(source); case 5: _context.next = 7; return _iterator.next(); case 7: _step = _context.sent; _iteratorNormalCompletion = _step.done; _context.next = 11; return _step.value; case 11: _value = _context.sent; if (_iteratorNormalCompletion) { _context.next = 18; break; } value = _value; out.push(value); case 15: _iteratorNormalCompletion = true; _context.next = 5; break; case 18: _context.next = 24; break; case 20: _context.prev = 20; _context.t0 = _context["catch"](3); _didIteratorError = true; _iteratorError = _context.t0; case 24: _context.prev = 24; _context.prev = 25; if (!(!_iteratorNormalCompletion && _iterator["return"] != null)) { _context.next = 29; break; } _context.next = 29; return _iterator["return"](); case 29: _context.prev = 29; if (!_didIteratorError) { _context.next = 32; break; } throw _iteratorError; case 32: return _context.finish(29); case 33: return _context.finish(24); case 34: return _context.abrupt("return", out); case 35: case "end": return _context.stop(); } } }, _callee, null, [[3, 20, 24, 34], [25,, 29, 33]]); })); return _asyncToArray.apply(this, arguments); } exports.__asyncToArray = __asyncToArray; function asyncToArray(source) { return __asyncToArray(asyncEnsureIterable(source)); } exports.asyncToArray = asyncToArray; },{"../../internal/async-iterable.js":480,"@babel/runtime/helpers/asyncIterator":42,"@babel/runtime/helpers/asyncToGenerator":43,"@babel/runtime/regenerator":65}],399:[function(require,module,exports){ function _createForOfIteratorHelper(o, allowArrayLike) { var it; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; } function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } var _require = require('../../internal/iterable.js'), ensureIterable = _require.ensureIterable; function __toArray(source) { var out = []; var _iterator = _createForOfIteratorHelper(source), _step; try { for (_iterator.s(); !(_step = _iterator.n()).done;) { var value = _step.value; out.push(value); } } catch (err) { _iterator.e(err); } finally { _iterator.f(); } return out; } exports.__toArray = __toArray; function toArray(source) { return __toArray(ensureIterable(source)); } exports.toArray = toArray; },{"../../internal/iterable.js":493}],400:[function(require,module,exports){ var _regeneratorRuntime = require("@babel/runtime/regenerator"); var _slicedToArray = require("@babel/runtime/helpers/slicedToArray"); var _asyncToGenerator = require("@babel/runtime/helpers/asyncToGenerator"); var _asyncIterator = require("@babel/runtime/helpers/asyncIterator"); var _require = require('../../internal/async-iterable.js'), asyncEnsureIterable = _require.asyncEnsureIterable; function __asyncToObject(_x) { return _asyncToObject.apply(this, arguments); } function _asyncToObject() { _asyncToObject = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(iterable) { var proto, obj, _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, _value, _value2, _value3, key, value, _args = arguments; return _regeneratorRuntime.wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: proto = _args.length > 1 && _args[1] !== undefined ? _args[1] : Object.prototype; obj = Object.create(proto); _iteratorNormalCompletion = true; _didIteratorError = false; _context.prev = 4; _iterator = _asyncIterator(iterable); case 6: _context.next = 8; return _iterator.next(); case 8: _step = _context.sent; _iteratorNormalCompletion = _step.done; _context.next = 12; return _step.value; case 12: _value = _context.sent; if (_iteratorNormalCompletion) { _context.next = 19; break; } _value2 = _value, _value3 = _slicedToArray(_value2, 2), key = _value3[0], value = _value3[1]; obj[key] = value; case 16: _iteratorNormalCompletion = true; _context.next = 6; break; case 19: _context.next = 25; break; case 21: _context.prev = 21; _context.t0 = _context["catch"](4); _didIteratorError = true; _iteratorError = _context.t0; case 25: _context.prev = 25; _context.prev = 26; if (!(!_iteratorNormalCompletion && _iterator["return"] != null)) { _context.next = 30; break; } _context.next = 30; return _iterator["return"](); case 30: _context.prev = 30; if (!_didIteratorError) { _context.next = 33; break; } throw _iteratorError; case 33: return _context.finish(30); case 34: return _context.finish(25); case 35: return _context.abrupt("return", obj); case 36: case "end": return _context.stop(); } } }, _callee, null, [[4, 21, 25, 35], [26,, 30, 34]]); })); return _asyncToObject.apply(this, arguments); } exports.__asyncToObject = __asyncToObject; function asyncToObject(iterable, proto) { return __asyncToObject(asyncEnsureIterable(iterable), proto); } exports.asyncToObject = asyncToObject; },{"../../internal/async-iterable.js":480,"@babel/runtime/helpers/asyncIterator":42,"@babel/runtime/helpers/asyncToGenerator":43,"@babel/runtime/helpers/slicedToArray":59,"@babel/runtime/regenerator":65}],401:[function(require,module,exports){ var _slicedToArray = require("@babel/runtime/helpers/slicedToArray"); function _createForOfIteratorHelper(o, allowArrayLike) { var it; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; } function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } var _require = require('../../internal/iterable.js'), ensureIterable = _require.ensureIterable; function __toObject(iterable) { var proto = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : Object.prototype; var obj = Object.create(proto); var _iterator = _createForOfIteratorHelper(iterable), _step; try { for (_iterator.s(); !(_step = _iterator.n()).done;) { var _step$value = _slicedToArray(_step.value, 2), key = _step$value[0], value = _step$value[1]; obj[key] = value; } } catch (err) { _iterator.e(err); } finally { _iterator.f(); } return obj; } exports.__toObject = __toObject; function toObject(iterable, proto) { return __toObject(ensureIterable(iterable), proto); } exports.toObject = toObject; },{"../../internal/iterable.js":493,"@babel/runtime/helpers/slicedToArray":59}],402:[function(require,module,exports){ var _regeneratorRuntime = require("@babel/runtime/regenerator"); var _awaitAsyncGenerator = require("@babel/runtime/helpers/awaitAsyncGenerator"); var _wrapAsyncGenerator = require("@babel/runtime/helpers/wrapAsyncGenerator"); var _asyncIterator = require("@babel/runtime/helpers/asyncIterator"); var _require = require('../../internal/async-iterable.js'), asyncIterableCurry = _require.asyncIterableCurry; var _require2 = require('../../internal/circular-buffer.js'), CircularBuffer = _require2.CircularBuffer, ReadOnlyCircularBuffer = _require2.ReadOnlyCircularBuffer; function __asyncWindowAhead(_x, _x2) { return _asyncWindowAhead.apply(this, arguments); } exports.__asyncWindowAhead = __asyncWindowAhead; function _asyncWindowAhead() { _asyncWindowAhead = _wrapAsyncGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(source, size) { var _ref, _ref$filler, filler, _ref$useFiller, useFiller, buffer, bufferReadProxy, len, _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, _value, value, i, _i, _args = arguments; return _regeneratorRuntime.wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: _ref = _args.length > 2 && _args[2] !== undefined ? _args[2] : {}, _ref$filler = _ref.filler, filler = _ref$filler === void 0 ? undefined : _ref$filler, _ref$useFiller = _ref.useFiller, useFiller = _ref$useFiller === void 0 ? true : _ref$useFiller; buffer = new CircularBuffer(size); bufferReadProxy = new ReadOnlyCircularBuffer(buffer); len = 0; _iteratorNormalCompletion = true; _didIteratorError = false; _context.prev = 6; _iterator = _asyncIterator(source); case 8: _context.next = 10; return _awaitAsyncGenerator(_iterator.next()); case 10: _step = _context.sent; _iteratorNormalCompletion = _step.done; _context.next = 14; return _awaitAsyncGenerator(_step.value); case 14: _value = _context.sent; if (_iteratorNormalCompletion) { _context.next = 25; break; } value = _value; buffer.push(value); if (!buffer.isFull()) { _context.next = 21; break; } _context.next = 21; return bufferReadProxy; case 21: len++; case 22: _iteratorNormalCompletion = true; _context.next = 8; break; case 25: _context.next = 31; break; case 27: _context.prev = 27; _context.t0 = _context["catch"](6); _didIteratorError = true; _iteratorError = _context.t0; case 31: _context.prev = 31; _context.prev = 32; if (!(!_iteratorNormalCompletion && _iterator["return"] != null)) { _context.next = 36; break; } _context.next = 36; return _awaitAsyncGenerator(_iterator["return"]()); case 36: _context.prev = 36; if (!_didIteratorError) { _context.next = 39; break; } throw _iteratorError; case 39: return _context.finish(36); case 40: return _context.finish(31); case 41: if (useFiller) { for (i = len; i < size; i++) { buffer.push(filler); } } if (!(len > 0 && len < size)) { _context.next = 45; break; } _context.next = 45; return bufferReadProxy; case 45: _i = 0; case 46: if (!(_i < Math.min(size, len) - 1)) { _context.next = 54; break; } buffer.shift(); if (useFiller) { buffer.push(filler); } _context.next = 51; return bufferReadProxy; case 51: _i++; _context.next = 46; break; case 54: case "end": return _context.stop(); } } }, _callee, null, [[6, 27, 31, 41], [32,, 36, 40]]); })); return _asyncWindowAhead.apply(this, arguments); } var asyncWindowAhead = /*#__PURE__*/asyncIterableCurry(__asyncWindowAhead, { minArgs: 1, maxArgs: 2, validateArgs: function validateArgs(args) { if (typeof args[1] !== 'number') { throw new Error('asyncWindowAhead'.concat(" must be passed a numeric size")); } } }); exports.asyncWindowAhead = asyncWindowAhead; },{"../../internal/async-iterable.js":480,"../../internal/circular-buffer.js":486,"@babel/runtime/helpers/asyncIterator":42,"@babel/runtime/helpers/awaitAsyncGenerator":44,"@babel/runtime/helpers/wrapAsyncGenerator":64,"@babel/runtime/regenerator":65}],403:[function(require,module,exports){ var _regeneratorRuntime = require("@babel/runtime/regenerator"); var _marked = /*#__PURE__*/_regeneratorRuntime.mark(__windowAhead); function _createForOfIteratorHelper(o, allowArrayLike) { var it; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; } function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } var _require = require('../../internal/iterable.js'), iterableCurry = _require.iterableCurry; var _require2 = require('../../internal/circular-buffer.js'), CircularBuffer = _require2.CircularBuffer, ReadOnlyCircularBuffer = _require2.ReadOnlyCircularBuffer; function __windowAhead(source, size) { var _ref, _ref$filler, filler, _ref$useFiller, useFiller, buffer, bufferReadProxy, len, _iterator, _step, value, i, _i, _args = arguments; return _regeneratorRuntime.wrap(function __windowAhead$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: _ref = _args.length > 2 && _args[2] !== undefined ? _args[2] : {}, _ref$filler = _ref.filler, filler = _ref$filler === void 0 ? undefined : _ref$filler, _ref$useFiller = _ref.useFiller, useFiller = _ref$useFiller === void 0 ? true : _ref$useFiller; buffer = new CircularBuffer(size); bufferReadProxy = new ReadOnlyCircularBuffer(buffer); len = 0; _iterator = _createForOfIteratorHelper(source); _context.prev = 5; _iterator.s(); case 7: if ((_step = _iterator.n()).done) { _context.next = 16; break; } value = _step.value; buffer.push(value); if (!buffer.isFull()) { _context.next = 13; break; } _context.next = 13; return bufferReadProxy; case 13: len++; case 14: _context.next = 7; break; case 16: _context.next = 21; break; case 18: _context.prev = 18; _context.t0 = _context["catch"](5); _iterator.e(_context.t0); case 21: _context.prev = 21; _iterator.f(); return _context.finish(21); case 24: if (useFiller) { for (i = len; i < size; i++) { buffer.push(filler); } } if (!(len > 0 && len < size)) { _context.next = 28; break; } _context.next = 28; return bufferReadProxy; case 28: _i = 0; case 29: if (!(_i < Math.min(size, len) - 1)) { _context.next = 37; break; } buffer.shift(); if (useFiller) { buffer.push(filler); } _context.next = 34; return bufferReadProxy; case 34: _i++; _context.next = 29; break; case 37: case "end": return _context.stop(); } } }, _marked, null, [[5, 18, 21, 24]]); } exports.__windowAhead = __windowAhead; var windowAhead = /*#__PURE__*/iterableCurry(__windowAhead, { minArgs: 1, maxArgs: 2, validateArgs: function validateArgs(args) { if (typeof args[1] !== 'number') { throw new Error('windowAhead'.concat(" must be passed a numeric size")); } } }); exports.windowAhead = windowAhead; },{"../../internal/circular-buffer.js":486,"../../internal/iterable.js":493,"@babel/runtime/regenerator":65}],404:[function(require,module,exports){ var _regeneratorRuntime = require("@babel/runtime/regenerator"); var _awaitAsyncGenerator = require("@babel/runtime/helpers/awaitAsyncGenerator"); var _wrapAsyncGenerator = require("@babel/runtime/helpers/wrapAsyncGenerator"); var _asyncIterator = require("@babel/runtime/helpers/asyncIterator"); var _require = require('../../internal/async-iterable.js'), asyncIterableCurry = _require.asyncIterableCurry; var _require2 = require('../../internal/circular-buffer.js'), CircularBuffer = _require2.CircularBuffer, ReadOnlyCircularBuffer = _require2.ReadOnlyCircularBuffer; function __asyncWindowBehind(_x, _x2) { return _asyncWindowBehind.apply(this, arguments); } exports.__asyncWindowBehind = __asyncWindowBehind; function _asyncWindowBehind() { _asyncWindowBehind = _wrapAsyncGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(source, size) { var _ref, filler, buffer, bufferReadProxy, _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, _value, value, _args = arguments; return _regeneratorRuntime.wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: _ref = _args.length > 2 && _args[2] !== undefined ? _args[2] : {}, filler = _ref.filler; buffer = new CircularBuffer(size); bufferReadProxy = new ReadOnlyCircularBuffer(buffer); buffer.fill(filler); _iteratorNormalCompletion = true; _didIteratorError = false; _context.prev = 6; _iterator = _asyncIterator(source); case 8: _context.next = 10; return _awaitAsyncGenerator(_iterator.next()); case 10: _step = _context.sent; _iteratorNormalCompletion = _step.done; _context.next = 14; return _awaitAsyncGenerator(_step.value); case 14: _value = _context.sent; if (_iteratorNormalCompletion) { _context.next = 23; break; } value = _value; buffer.push(value); _context.next = 20; return bufferReadProxy; case 20: _iteratorNormalCompletion = true; _context.next = 8; break; case 23: _context.next = 29; break; case 25: _context.prev = 25; _context.t0 = _context["catch"](6); _didIteratorError = true; _iteratorError = _context.t0; case 29: _context.prev = 29; _context.prev = 30; if (!(!_iteratorNormalCompletion && _iterator["return"] != null)) { _context.next = 34; break; } _context.next = 34; return _awaitAsyncGenerator(_iterator["return"]()); case 34: _context.prev = 34; if (!_didIteratorError) { _context.next = 37; break; } throw _iteratorError; case 37: return _context.finish(34); case 38: return _context.finish(29); case 39: case "end": return _context.stop(); } } }, _callee, null, [[6, 25, 29, 39], [30,, 34, 38]]); })); return _asyncWindowBehind.apply(this, arguments); } var asyncWindowBehind = /*#__PURE__*/asyncIterableCurry(__asyncWindowBehind, { minArgs: 1, maxArgs: 2, validateArgs: function validateArgs(args) { if (typeof args[1] !== 'number') { throw new Error('asyncWindowBehind'.concat(" must be passed a numeric size")); } } }); exports.asyncWindowBehind = asyncWindowBehind; },{"../../internal/async-iterable.js":480,"../../internal/circular-buffer.js":486,"@babel/runtime/helpers/asyncIterator":42,"@babel/runtime/helpers/awaitAsyncGenerator":44,"@babel/runtime/helpers/wrapAsyncGenerator":64,"@babel/runtime/regenerator":65}],405:[function(require,module,exports){ var _regeneratorRuntime = require("@babel/runtime/regenerator"); var _marked = /*#__PURE__*/_regeneratorRuntime.mark(__windowBehind); function _createForOfIteratorHelper(o, allowArrayLike) { var it; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; } function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } var _require = require('../../internal/iterable.js'), iterableCurry = _require.iterableCurry; var _require2 = require('../../internal/circular-buffer.js'), CircularBuffer = _require2.CircularBuffer, ReadOnlyCircularBuffer = _require2.ReadOnlyCircularBuffer; function __windowBehind(source, size) { var _ref, filler, buffer, bufferReadProxy, _iterator, _step, value, _args = arguments; return _regeneratorRuntime.wrap(function __windowBehind$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: _ref = _args.length > 2 && _args[2] !== undefined ? _args[2] : {}, filler = _ref.filler; buffer = new CircularBuffer(size); bufferReadProxy = new ReadOnlyCircularBuffer(buffer); buffer.fill(filler); _iterator = _createForOfIteratorHelper(source); _context.prev = 5; _iterator.s(); case 7: if ((_step = _iterator.n()).done) { _context.next = 14; break; } value = _step.value; buffer.push(value); _context.next = 12; return bufferReadProxy; case 12: _context.next = 7; break; case 14: _context.next = 19; break; case 16: _context.prev = 16; _context.t0 = _context["catch"](5); _iterator.e(_context.t0); case 19: _context.prev = 19; _iterator.f(); return _context.finish(19); case 22: case "end": return _context.stop(); } } }, _marked, null, [[5, 16, 19, 22]]); } exports.__windowBehind = __windowBehind; var windowBehind = /*#__PURE__*/iterableCurry(__windowBehind, { minArgs: 1, maxArgs: 2, validateArgs: function validateArgs(args) { if (typeof args[1] !== 'number') { throw new Error('windowBehind'.concat(" must be passed a numeric size")); } } }); exports.windowBehind = windowBehind; },{"../../internal/circular-buffer.js":486,"../../internal/iterable.js":493,"@babel/runtime/regenerator":65}],406:[function(require,module,exports){ var _regeneratorRuntime = require("@babel/runtime/regenerator"); var _awaitAsyncGenerator = require("@babel/runtime/helpers/awaitAsyncGenerator"); var _wrapAsyncGenerator = require("@babel/runtime/helpers/wrapAsyncGenerator"); var _asyncIterator = require("@babel/runtime/helpers/asyncIterator"); var _require = require('../../internal/async-iterable.js'), asyncIterableCurry = _require.asyncIterableCurry; var _require2 = require('../../internal/circular-buffer.js'), CircularBuffer = _require2.CircularBuffer, ReadOnlyCircularBuffer = _require2.ReadOnlyCircularBuffer; function __asyncWindow(_x, _x2) { return _asyncWindow.apply(this, arguments); } exports.__asyncWindow = __asyncWindow; function _asyncWindow() { _asyncWindow = _wrapAsyncGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(source, size) { var buffer, bufferReadProxy, _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, _value, value; return _regeneratorRuntime.wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: buffer = new CircularBuffer(size); bufferReadProxy = new ReadOnlyCircularBuffer(buffer); _iteratorNormalCompletion = true; _didIteratorError = false; _context.prev = 4; _iterator = _asyncIterator(source); case 6: _context.next = 8; return _awaitAsyncGenerator(_iterator.next()); case 8: _step = _context.sent; _iteratorNormalCompletion = _step.done; _context.next = 12; return _awaitAsyncGenerator(_step.value); case 12: _value = _context.sent; if (_iteratorNormalCompletion) { _context.next = 22; break; } value = _value; buffer.push(value); if (!buffer.isFull()) { _context.next = 19; break; } _context.next = 19; return bufferReadProxy; case 19: _iteratorNormalCompletion = true; _context.next = 6; break; case 22: _context.next = 28; break; case 24: _context.prev = 24; _context.t0 = _context["catch"](4); _didIteratorError = true; _iteratorError = _context.t0; case 28: _context.prev = 28; _context.prev = 29; if (!(!_iteratorNormalCompletion && _iterator["return"] != null)) { _context.next = 33; break; } _context.next = 33; return _awaitAsyncGenerator(_iterator["return"]()); case 33: _context.prev = 33; if (!_didIteratorError) { _context.next = 36; break; } throw _iteratorError; case 36: return _context.finish(33); case 37: return _context.finish(28); case 38: case "end": return _context.stop(); } } }, _callee, null, [[4, 24, 28, 38], [29,, 33, 37]]); })); return _asyncWindow.apply(this, arguments); } var asyncWindow = /*#__PURE__*/asyncIterableCurry(__asyncWindow, { validateArgs: function validateArgs(args) { if (typeof args[1] !== 'number') { throw new Error('asyncWindow'.concat(" must be passed a numeric size")); } } }); exports.asyncWindow = asyncWindow; },{"../../internal/async-iterable.js":480,"../../internal/circular-buffer.js":486,"@babel/runtime/helpers/asyncIterator":42,"@babel/runtime/helpers/awaitAsyncGenerator":44,"@babel/runtime/helpers/wrapAsyncGenerator":64,"@babel/runtime/regenerator":65}],407:[function(require,module,exports){ var _regeneratorRuntime = require("@babel/runtime/regenerator"); var _marked = /*#__PURE__*/_regeneratorRuntime.mark(__window); function _createForOfIteratorHelper(o, allowArrayLike) { var it; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; } function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } var _require = require('../../internal/iterable.js'), iterableCurry = _require.iterableCurry; var _require2 = require('../../internal/circular-buffer.js'), CircularBuffer = _require2.CircularBuffer, ReadOnlyCircularBuffer = _require2.ReadOnlyCircularBuffer; function __window(source, size) { var buffer, bufferReadProxy, _iterator, _step, value; return _regeneratorRuntime.wrap(function __window$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: buffer = new CircularBuffer(size); bufferReadProxy = new ReadOnlyCircularBuffer(buffer); _iterator = _createForOfIteratorHelper(source); _context.prev = 3; _iterator.s(); case 5: if ((_step = _iterator.n()).done) { _context.next = 13; break; } value = _step.value; buffer.push(value); if (!buffer.isFull()) { _context.next = 11; break; } _context.next = 11; return bufferReadProxy; case 11: _context.next = 5; break; case 13: _context.next = 18; break; case 15: _context.prev = 15; _context.t0 = _context["catch"](3); _iterator.e(_context.t0); case 18: _context.prev = 18; _iterator.f(); return _context.finish(18); case 21: case "end": return _context.stop(); } } }, _marked, null, [[3, 15, 18, 21]]); } exports.__window = __window; var window = /*#__PURE__*/iterableCurry(__window, { validateArgs: function validateArgs(args) { if (typeof args[1] !== 'number') { throw new Error('window'.concat(" must be passed a numeric size")); } } }); exports.window = window; },{"../../internal/circular-buffer.js":486,"../../internal/iterable.js":493,"@babel/runtime/regenerator":65}],408:[function(require,module,exports){ var _require = require('../../internal/async-iterable.js'), asyncWrapWithIterableIterator = _require.asyncWrapWithIterableIterator; var _require2 = require('../../internal/async-wrap.js'), __asyncWrap = _require2.asyncNullableWrap; exports.__asyncWrap = __asyncWrap; var asyncWrap = /*#__PURE__*/asyncWrapWithIterableIterator(__asyncWrap); exports.asyncWrap = asyncWrap; },{"../../internal/async-iterable.js":480,"../../internal/async-wrap.js":484}],409:[function(require,module,exports){ var _require = require('../../internal/iterable.js'), wrapWithIterableIterator = _require.wrapWithIterableIterator; var _require2 = require('../../internal/wrap.js'), __wrap = _require2.nullableWrap; exports.__wrap = __wrap; var wrap = /*#__PURE__*/wrapWithIterableIterator(__wrap); exports.wrap = wrap; },{"../../internal/iterable.js":493,"../../internal/wrap.js":499}],410:[function(require,module,exports){ var _regeneratorRuntime = require("@babel/runtime/regenerator"); var _awaitAsyncGenerator = require("@babel/runtime/helpers/awaitAsyncGenerator"); var _wrapAsyncGenerator = require("@babel/runtime/helpers/wrapAsyncGenerator"); var _require = require('../../internal/async-iterable.js'), asyncIterableCurry = _require.asyncIterableCurry; var _require2 = require('../../internal/async-parallel-each.js'), asyncParallelEach = _require2.asyncParallelEach; var _require3 = require('../$peekerate/async-peekerate.js'), __asyncPeekerate = _require3.__asyncPeekerate; var _require4 = require('../$map/async-map.js'), __asyncMap = _require4.__asyncMap; var _require5 = require('../$every/every.js'), __every = _require5.__every; var _require6 = require('../$to-array/async-to-array.js'), __asyncToArray = _require6.__asyncToArray; var isDone = function isDone(peekr) { return peekr.done; }; function __asyncZipAll(_x) { return _asyncZipAll.apply(this, arguments); } exports.__asyncZipAll = __asyncZipAll; function _asyncZipAll() { _asyncZipAll = _wrapAsyncGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(sources) { var _ref, filler, peekrs, done, _args = arguments; return _regeneratorRuntime.wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: _ref = _args.length > 1 && _args[1] !== undefined ? _args[1] : {}, filler = _ref.filler; _context.next = 3; return _awaitAsyncGenerator(__asyncToArray(__asyncMap(sources, __asyncPeekerate))); case 3: peekrs = _context.sent; done = __every(peekrs, isDone); _context.prev = 5; case 6: if (done) { _context.next = 14; break; } _context.next = 9; return peekrs.map(function (_ref2) { var value = _ref2.value, done = _ref2.done; return done ? filler : value; }); case 9: _context.next = 11; return _awaitAsyncGenerator(asyncParallelEach(peekrs, function (peekr) { return peekr.advance(); })); case 11: done = __every(peekrs, isDone); _context.next = 6; break; case 14: _context.prev = 14; _context.next = 17; return _awaitAsyncGenerator(asyncParallelEach(peekrs, function (peekr) { return peekr["return"](); })); case 17: return _context.finish(14); case 18: case "end": return _context.stop(); } } }, _callee, null, [[5,, 14, 18]]); })); return _asyncZipAll.apply(this, arguments); } var asyncZipAll = /*#__PURE__*/asyncIterableCurry(__asyncZipAll, { variadic: true, minArgs: 0, maxArgs: 1 }); exports.asyncZipAll = asyncZipAll; },{"../$every/every.js":287,"../$map/async-map.js":337,"../$peekerate/async-peekerate.js":339,"../$to-array/async-to-array.js":398,"../../internal/async-iterable.js":480,"../../internal/async-parallel-each.js":481,"@babel/runtime/helpers/awaitAsyncGenerator":44,"@babel/runtime/helpers/wrapAsyncGenerator":64,"@babel/runtime/regenerator":65}],411:[function(require,module,exports){ var _regeneratorRuntime = require("@babel/runtime/regenerator"); var _marked = /*#__PURE__*/_regeneratorRuntime.mark(__zipAll); var _require = require('../../internal/iterable.js'), iterableCurry = _require.iterableCurry; var _require2 = require('../../internal/parallel-each.js'), parallelEach = _require2.parallelEach; var _require3 = require('../$peekerate/peekerate.js'), __peekerate = _require3.__peekerate; var _require4 = require('../$map/map.js'), __map = _require4.__map; var _require5 = require('../$every/every.js'), __every = _require5.__every; var _require6 = require('../$to-array/to-array.js'), __toArray = _require6.__toArray; var isDone = function isDone(peekr) { return peekr.done; }; function __zipAll(sources) { var _ref, filler, peekrs, done, _args = arguments; return _regeneratorRuntime.wrap(function __zipAll$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: _ref = _args.length > 1 && _args[1] !== undefined ? _args[1] : {}, filler = _ref.filler; peekrs = __toArray(__map(sources, __peekerate)); done = __every(peekrs, isDone); _context.prev = 3; case 4: if (done) { _context.next = 11; break; } _context.next = 7; return peekrs.map(function (_ref2) { var value = _ref2.value, done = _ref2.done; return done ? filler : value; }); case 7: parallelEach(peekrs, function (peekr) { return peekr.advance(); }); done = __every(peekrs, isDone); _context.next = 4; break; case 11: _context.prev = 11; parallelEach(peekrs, function (peekr) { return peekr["return"](); }); return _context.finish(11); case 14: case "end": return _context.stop(); } } }, _marked, null, [[3,, 11, 14]]); } exports.__zipAll = __zipAll; var zipAll = /*#__PURE__*/iterableCurry(__zipAll, { variadic: true, minArgs: 0, maxArgs: 1 }); exports.zipAll = zipAll; },{"../$every/every.js":287,"../$map/map.js":338,"../$peekerate/peekerate.js":340,"../$to-array/to-array.js":399,"../../internal/iterable.js":493,"../../internal/parallel-each.js":495,"@babel/runtime/regenerator":65}],412:[function(require,module,exports){ var _regeneratorRuntime = require("@babel/runtime/regenerator"); var _awaitAsyncGenerator = require("@babel/runtime/helpers/awaitAsyncGenerator"); var _wrapAsyncGenerator = require("@babel/runtime/helpers/wrapAsyncGenerator"); var _require = require('../../internal/async-iterable.js'), asyncIterableCurry = _require.asyncIterableCurry; var _require2 = require('../../internal/async-parallel-each.js'), asyncParallelEach = _require2.asyncParallelEach; var _require3 = require('../$peekerate/async-peekerate.js'), __asyncPeekerate = _require3.__asyncPeekerate; var _require4 = require('../$map/async-map.js'), __asyncMap = _require4.__asyncMap; var _require5 = require('../$map/map.js'), __map = _require5.__map; var _require6 = require('../$some/some.js'), __some = _require6.__some; var _require7 = require('../$to-array/async-to-array.js'), __asyncToArray = _require7.__asyncToArray; var isDone = function isDone(peekr) { return peekr.done; }; function __asyncZip(_x) { return _asyncZip.apply(this, arguments); } exports.__asyncZip = __asyncZip; function _asyncZip() { _asyncZip = _wrapAsyncGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(sources) { var peekrs, done; return _regeneratorRuntime.wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: _context.next = 2; return _awaitAsyncGenerator(__asyncToArray(__asyncMap(sources, __asyncPeekerate))); case 2: peekrs = _context.sent; done = __some(peekrs, isDone); _context.prev = 4; case 5: if (done) { _context.next = 13; break; } _context.next = 8; return peekrs.map(function (_ref) { var value = _ref.value; return value; }); case 8: _context.next = 10; return _awaitAsyncGenerator(Promise.all(__map(peekrs, function (peekr) { return peekr.advance(); }))); case 10: done = __some(peekrs, isDone); _context.next = 5; break; case 13: _context.prev = 13; _context.next = 16; return _awaitAsyncGenerator(asyncParallelEach(peekrs, function (peekr) { return peekr["return"](); })); case 16: return _context.finish(13); case 17: case "end": return _context.stop(); } } }, _callee, null, [[4,, 13, 17]]); })); return _asyncZip.apply(this, arguments); } var asyncZip = /*#__PURE__*/asyncIterableCurry(__asyncZip, { variadic: true }); exports.asyncZip = asyncZip; },{"../$map/async-map.js":337,"../$map/map.js":338,"../$peekerate/async-peekerate.js":339,"../$some/some.js":356,"../$to-array/async-to-array.js":398,"../../internal/async-iterable.js":480,"../../internal/async-parallel-each.js":481,"@babel/runtime/helpers/awaitAsyncGenerator":44,"@babel/runtime/helpers/wrapAsyncGenerator":64,"@babel/runtime/regenerator":65}],413:[function(require,module,exports){ var _regeneratorRuntime = require("@babel/runtime/regenerator"); var _marked = /*#__PURE__*/_regeneratorRuntime.mark(__zip); function _createForOfIteratorHelper(o, allowArrayLike) { var it; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; } function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } var _require = require('../../internal/iterable.js'), iterableCurry = _require.iterableCurry; var _require2 = require('../../internal/parallel-each.js'), parallelEach = _require2.parallelEach; var _require3 = require('../$peekerate/peekerate.js'), __peekerate = _require3.__peekerate; var _require4 = require('../$map/map.js'), __map = _require4.__map; var _require5 = require('../$some/some.js'), __some = _require5.__some; var _require6 = require('../$to-array/to-array.js'), __toArray = _require6.__toArray; var isDone = function isDone(peekr) { return peekr.done; }; function __zip(sources) { var peekrs, done, _iterator, _step, peekr; return _regeneratorRuntime.wrap(function __zip$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: peekrs = __toArray(__map(sources, __peekerate)); done = __some(peekrs, isDone); _context.prev = 2; case 3: if (done) { _context.next = 11; break; } _context.next = 6; return peekrs.map(function (_ref) { var value = _ref.value; return value; }); case 6: _iterator = _createForOfIteratorHelper(peekrs); try { for (_iterator.s(); !(_step = _iterator.n()).done;) { peekr = _step.value; peekr.advance(); } } catch (err) { _iterator.e(err); } finally { _iterator.f(); } done = __some(peekrs, isDone); _context.next = 3; break; case 11: _context.prev = 11; parallelEach(peekrs, function (peekr) { return peekr["return"](); }); return _context.finish(11); case 14: case "end": return _context.stop(); } } }, _marked, null, [[2,, 11, 14]]); } exports.__zip = __zip; var zip = /*#__PURE__*/iterableCurry(__zip, { variadic: true }); exports.zip = zip; },{"../$map/map.js":338,"../$peekerate/peekerate.js":340,"../$some/some.js":356,"../$to-array/to-array.js":399,"../../internal/iterable.js":493,"../../internal/parallel-each.js":495,"@babel/runtime/regenerator":65}],414:[function(require,module,exports){ var _toConsumableArray = require("@babel/runtime/helpers/toConsumableArray"); var _require = require('../../internal/curry.js'), curry = _require.curry; function __apply(fn) { var args = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : []; return fn.apply(void 0, _toConsumableArray(args === null ? [] : args)); } exports.__apply = __apply; var apply = /*#__PURE__*/curry(__apply, 2); exports.apply = apply; },{"../../internal/curry.js":488,"@babel/runtime/helpers/toConsumableArray":61}],415:[function(require,module,exports){ function arrayFirstOr(whenEmpty, array) { return array && array.length ? array[0] : whenEmpty; } exports.arrayFirstOr = arrayFirstOr; },{}],416:[function(require,module,exports){ function arrayFirst(array) { return array != null ? array[0] : undefined; } exports.arrayFirst = arrayFirst; },{}],417:[function(require,module,exports){ exports.__arrayFromAsync = require('../$to-array/async-to-array.js').__asyncToArray; exports.arrayFromAsync = require('../$to-array/async-to-array.js').asyncToArray; },{"../$to-array/async-to-array.js":398}],418:[function(require,module,exports){ exports.__arrayFrom = require('../$to-array/to-array.js').__toArray; exports.arrayFrom = require('../$to-array/to-array.js').toArray; },{"../$to-array/to-array.js":399}],419:[function(require,module,exports){ function arrayLastOr(whenEmpty, array) { return array && array.length ? array[array.length - 1] : whenEmpty; } exports.arrayLastOr = arrayLastOr; },{}],420:[function(require,module,exports){ function arrayLast(array) { return array ? array[array.length - 1] : undefined; } exports.arrayLast = arrayLast; },{}],421:[function(require,module,exports){ var _regeneratorRuntime = require("@babel/runtime/regenerator"); var _marked = /*#__PURE__*/_regeneratorRuntime.mark(__arrayReverse); var _require = require('../../internal/iterable.js'), wrapWithIterableIterator = _require.wrapWithIterableIterator; function __arrayReverse(source) { var i; return _regeneratorRuntime.wrap(function __arrayReverse$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: if (!(source == null)) { _context.next = 2; break; } return _context.abrupt("return"); case 2: i = source.length - 1; case 3: if (!(i >= 0)) { _context.next = 9; break; } _context.next = 6; return source[i]; case 6: i--; _context.next = 3; break; case 9: case "end": return _context.stop(); } } }, _marked); } exports.__arrayReverse = __arrayReverse; var arrayReverse = /*#__PURE__*/wrapWithIterableIterator(__arrayReverse, { validateArgs: function validateArgs(args) { if (!(Array.isArray(args[0]) || typeof args[0] === 'string' || args[0] == null)) { throw new Error('arrayReverse only works arrays and strings'); } } }); exports.arrayReverse = arrayReverse; },{"../../internal/iterable.js":493,"@babel/runtime/regenerator":65}],422:[function(require,module,exports){ var _asyncToGenerator = require("@babel/runtime/helpers/asyncToGenerator"); var _classCallCheck = require("@babel/runtime/helpers/classCallCheck"); var _createClass = require("@babel/runtime/helpers/createClass"); var _inherits = require("@babel/runtime/helpers/inherits"); var _possibleConstructorReturn = require("@babel/runtime/helpers/possibleConstructorReturn"); var _getPrototypeOf = require("@babel/runtime/helpers/getPrototypeOf"); var _regeneratorRuntime = require("@babel/runtime/regenerator"); function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } } var _awaitAsyncGenerator = require("@babel/runtime/helpers/awaitAsyncGenerator"); var _wrapAsyncGenerator = require("@babel/runtime/helpers/wrapAsyncGenerator"); var _require = require('../../internal/curry.js'), curry = _require.curry; var _require2 = require('../../internal/async-iterable.js'), asyncCallReturn = _require2.asyncCallReturn; var _require3 = require('../../internal/async-iterable-iterator.js'), AsyncIterableIterator = _require3.AsyncIterableIterator; var _require4 = require('../../internal/circular-buffer.js'), CircularBuffer = _require4.CircularBuffer; var _require5 = require('../../internal/number.js'), isPositiveInteger = _require5.isPositiveInteger; var _require6 = require('../is-async-iterable/is-async-iterable.js'), isAsyncIterable = _require6.isAsyncIterable; var _require7 = require('../../internal/iterable.js'), isIterable = _require7.isIterable; function empty() { return _empty.apply(this, arguments); } function _empty() { _empty = _wrapAsyncGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee() { return _regeneratorRuntime.wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: case "end": return _context.stop(); } } }, _callee); })); return _empty.apply(this, arguments); } function getIterator(iterable) { if (iterable == null) { return empty(); } else if (isAsyncIterable(iterable)) { return iterable[Symbol.asyncIterator](); } else if (isIterable(iterable)) { return iterable[Symbol.iterator](); } else { throw new Error("asyncBuffer expected an iterable but received ".concat(iterable, ".")); } } var Bufferator = /*#__PURE__*/function (_AsyncIterableIterato) { _inherits(Bufferator, _AsyncIterableIterato); var _super = _createSuper(Bufferator); function Bufferator(iterable, concurrency) { var _this; _classCallCheck(this, Bufferator); _this = _super.call(this); _this.iterator = getIterator(iterable); _this.buffer = new CircularBuffer(concurrency); while (!_this.buffer.isFull()) { _this.buffer.push(Promise.resolve(_this.iterator.next())); } return _this; } _createClass(Bufferator, [{ key: "next", value: function () { var _next = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee2() { var buffer, iterator; return _regeneratorRuntime.wrap(function _callee2$(_context2) { while (1) { switch (_context2.prev = _context2.next) { case 0: buffer = this.buffer, iterator = this.iterator; _context2.next = 3; return buffer.push(Promise.resolve(iterator.next())); case 3: return _context2.abrupt("return", _context2.sent); case 4: case "end": return _context2.stop(); } } }, _callee2, this); })); function next() { return _next.apply(this, arguments); } return next; }() }, { key: "return", value: function () { var _return2 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee3() { return _regeneratorRuntime.wrap(function _callee3$(_context3) { while (1) { switch (_context3.prev = _context3.next) { case 0: _context3.next = 2; return asyncCallReturn(this.iterator); case 2: return _context3.abrupt("return", _context3.sent); case 3: case "end": return _context3.stop(); } } }, _callee3, this); })); function _return() { return _return2.apply(this, arguments); } return _return; }() }]); return Bufferator; }(AsyncIterableIterator); exports.Bufferator = Bufferator; function __asyncBuffer(source, n) { return new Bufferator(source, n); } exports.__asyncBuffer = __asyncBuffer; var asyncBuffer = /*#__PURE__*/curry(function asyncBuffer(n, source) { if (n === undefined) return; if (n !== Infinity && !isPositiveInteger(n)) { throw new Error('Concurrency must be an integer > 0'); } else if (n > 1024) { throw new Error('Concurrency argument to asyncBuffer must be <= 1024'); } return __asyncBuffer(source, n); }); exports.asyncBuffer = asyncBuffer; },{"../../internal/async-iterable-iterator.js":479,"../../internal/async-iterable.js":480,"../../internal/circular-buffer.js":486,"../../internal/curry.js":488,"../../internal/iterable.js":493,"../../internal/number.js":494,"../is-async-iterable/is-async-iterable.js":433,"@babel/runtime/helpers/asyncToGenerator":43,"@babel/runtime/helpers/awaitAsyncGenerator":44,"@babel/runtime/helpers/classCallCheck":45,"@babel/runtime/helpers/createClass":47,"@babel/runtime/helpers/getPrototypeOf":50,"@babel/runtime/helpers/inherits":51,"@babel/runtime/helpers/possibleConstructorReturn":57,"@babel/runtime/helpers/wrapAsyncGenerator":64,"@babel/runtime/regenerator":65}],423:[function(require,module,exports){ var _regeneratorRuntime = require("@babel/runtime/regenerator"); var _awaitAsyncGenerator = require("@babel/runtime/helpers/awaitAsyncGenerator"); var _wrapAsyncGenerator = require("@babel/runtime/helpers/wrapAsyncGenerator"); var _require = require('../../internal/async-iterable.js'), asyncIterableCurry = _require.asyncIterableCurry; var _require2 = require('./internal/race-to.js'), raceTo = _require2.raceTo; function __asyncInterleaveReady(_x) { return _asyncInterleaveReady.apply(this, arguments); } exports.__asyncInterleaveReady = __asyncInterleaveReady; function _asyncInterleaveReady() { _asyncInterleaveReady = _wrapAsyncGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(sources) { var iterators, stepPromises, ready, _loop; return _regeneratorRuntime.wrap(function _callee$(_context2) { while (1) { switch (_context2.prev = _context2.next) { case 0: iterators = sources.map(function (iterable) { return iterable[Symbol.asyncIterator](); }); stepPromises = iterators.map(function (iter, idx) { return iter.next().then(function (step) { return { idx: idx, step: step }; }); }); _loop = /*#__PURE__*/_regeneratorRuntime.mark(function _loop() { var _ready, idx, step; return _regeneratorRuntime.wrap(function _loop$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: _ready = ready, idx = _ready.idx, step = _ready.step; _context.next = 3; return step.value; case 3: stepPromises[idx] = iterators[idx].next().then(function (step) { return { idx: idx, step: step }; }); case 4: case "end": return _context.stop(); } } }, _loop); }); case 3: _context2.next = 5; return _awaitAsyncGenerator(raceTo(function (_ref) { var step = _ref.step; return !step.done; }, null, stepPromises)); case 5: _context2.t0 = ready = _context2.sent; if (!(_context2.t0 !== null)) { _context2.next = 10; break; } return _context2.delegateYield(_loop(), "t1", 8); case 8: _context2.next = 3; break; case 10: case "end": return _context2.stop(); } } }, _callee); })); return _asyncInterleaveReady.apply(this, arguments); } var asyncInterleaveReady = /*#__PURE__*/asyncIterableCurry(__asyncInterleaveReady, { variadic: true }); exports.asyncInterleaveReady = asyncInterleaveReady; },{"../../internal/async-iterable.js":480,"./internal/race-to.js":424,"@babel/runtime/helpers/awaitAsyncGenerator":44,"@babel/runtime/helpers/wrapAsyncGenerator":64,"@babel/runtime/regenerator":65}],424:[function(require,module,exports){ function _createForOfIteratorHelper(o, allowArrayLike) { var it; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; } function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } function raceTo(predicate, notFoundValue, promises) { return new Promise(function (resolve, reject) { var promiseCount = 0; var settledPromiseCount = 0; var resolved = false; var rejected = false; var _iterator = _createForOfIteratorHelper(promises), _step; try { for (_iterator.s(); !(_step = _iterator.n()).done;) { var promise = _step.value; promise["catch"](function (error) { if (!rejected && !resolved) { reject(error); rejected = true; } }).then(function (result) { settledPromiseCount++; if (!resolved && !rejected) { if (predicate(result)) { resolve(result); resolved = true; } else if (settledPromiseCount === promiseCount) { resolve(notFoundValue); } } }); promiseCount++; } } catch (err) { _iterator.e(err); } finally { _iterator.f(); } }); } exports.raceTo = raceTo; },{}],425:[function(require,module,exports){ var _regeneratorRuntime = require("@babel/runtime/regenerator"); var _awaitAsyncGenerator = require("@babel/runtime/helpers/awaitAsyncGenerator"); var _wrapAsyncGenerator = require("@babel/runtime/helpers/wrapAsyncGenerator"); var _asyncIterator = require("@babel/runtime/helpers/asyncIterator"); var _require = require('../../internal/async-iterable.js'), asyncIterableCurry = _require.asyncIterableCurry; var _require2 = require('../../internal/number.js'), isPositiveInteger = _require2.isPositiveInteger; var _require3 = require('../../internal/delay.js'), delay = _require3.delay; function __asyncThrottle(_x, _x2) { return _asyncThrottle.apply(this, arguments); } exports.__asyncThrottle = __asyncThrottle; function _asyncThrottle() { _asyncThrottle = _wrapAsyncGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(source, intervalMs) { var waitSince, _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, _value, value, duration; return _regeneratorRuntime.wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: waitSince = 0; _iteratorNormalCompletion = true; _didIteratorError = false; _context.prev = 3; _iterator = _asyncIterator(source); case 5: _context.next = 7; return _awaitAsyncGenerator(_iterator.next()); case 7: _step = _context.sent; _iteratorNormalCompletion = _step.done; _context.next = 11; return _awaitAsyncGenerator(_step.value); case 11: _value = _context.sent; if (_iteratorNormalCompletion) { _context.next = 23; break; } value = _value; duration = intervalMs - (Date.now() - waitSince); _context.next = 17; return _awaitAsyncGenerator(duration > 0 && delay(duration)); case 17: waitSince = Date.now(); _context.next = 20; return value; case 20: _iteratorNormalCompletion = true; _context.next = 5; break; case 23: _context.next = 29; break; case 25: _context.prev = 25; _context.t0 = _context["catch"](3); _didIteratorError = true; _iteratorError = _context.t0; case 29: _context.prev = 29; _context.prev = 30; if (!(!_iteratorNormalCompletion && _iterator["return"] != null)) { _context.next = 34; break; } _context.next = 34; return _awaitAsyncGenerator(_iterator["return"]()); case 34: _context.prev = 34; if (!_didIteratorError) { _context.next = 37; break; } throw _iteratorError; case 37: return _context.finish(34); case 38: return _context.finish(29); case 39: case "end": return _context.stop(); } } }, _callee, null, [[3, 25, 29, 39], [30,, 34, 38]]); })); return _asyncThrottle.apply(this, arguments); } var asyncThrottle = /*#__PURE__*/asyncIterableCurry(__asyncThrottle, { validateArgs: function validateArgs(args) { if (!isPositiveInteger(args[1], true)) { throw new Error('intervalMs argument to asyncThrottle must be a number > 0'); } } }); exports.asyncThrottle = asyncThrottle; },{"../../internal/async-iterable.js":480,"../../internal/delay.js":489,"../../internal/number.js":494,"@babel/runtime/helpers/asyncIterator":42,"@babel/runtime/helpers/awaitAsyncGenerator":44,"@babel/runtime/helpers/wrapAsyncGenerator":64,"@babel/runtime/regenerator":65}],426:[function(require,module,exports){ function __call(fn) { for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { args[_key - 1] = arguments[_key]; } return fn.apply(void 0, args); } exports.__call = __call; var call = __call; exports.call = call; },{}],427:[function(require,module,exports){ var identity = function identity(x) { return x; }; function compose() { for (var _len = arguments.length, fns = new Array(_len), _key = 0; _key < _len; _key++) { fns[_key] = arguments[_key]; } if (!fns.length) fns = [identity]; return fns.reduce(function (f, g) { return function (x) { return f(g(x)); }; }); } exports.compose = compose; },{}],428:[function(require,module,exports){ function execPipe(initial) { for (var _len = arguments.length, fns = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { fns[_key - 1] = arguments[_key]; } return fns.reduce(function (value, fn) { return fn(value); }, initial); } exports.execPipe = execPipe; },{}],429:[function(require,module,exports){ function firstHighest(best, value) { return value > best; } exports.firstHighest = firstHighest; },{}],430:[function(require,module,exports){ function firstLowest(best, value) { return value < best; } exports.firstLowest = firstLowest; },{}],431:[function(require,module,exports){ function getSize(sequence) { if (sequence == null) { return 0; } else { var size = sequence.size; if (typeof size === 'number') { return sequence.size; } else if (Array.isArray(sequence)) { return sequence.length; } } throw new Error('The argument passed to getSize did not have a size'); } exports.getSize = getSize; },{}],432:[function(require,module,exports){ var isArray = Array.isArray; exports.isArray = isArray; },{}],433:[function(require,module,exports){ var _require = require('../not-undefined/not-undefined.js'), notUndefined = _require.notUndefined; function isAsyncIterable(value) { return value != null && notUndefined(value[Symbol.asyncIterator]); } exports.isAsyncIterable = isAsyncIterable; },{"../not-undefined/not-undefined.js":456}],434:[function(require,module,exports){ var _require = require('../not-undefined/not-undefined.js'), notUndefined = _require.notUndefined; function isAsyncLoopable(value) { return value != null && (notUndefined(value[Symbol.asyncIterator]) || notUndefined(value[Symbol.iterator])); } exports.isAsyncLoopable = isAsyncLoopable; },{"../not-undefined/not-undefined.js":456}],435:[function(require,module,exports){ var _require = require('../not-undefined/not-undefined.js'), notUndefined = _require.notUndefined; function isAsyncWrappable(value) { return value == null || notUndefined(value[Symbol.asyncIterator]) || notUndefined(value[Symbol.iterator]); } exports.isAsyncWrappable = isAsyncWrappable; },{"../not-undefined/not-undefined.js":456}],436:[function(require,module,exports){ var _require = require('../not-undefined/not-undefined.js'), notUndefined = _require.notUndefined; function isIterable(value) { return value != null && notUndefined(value[Symbol.iterator]); } exports.isIterable = isIterable; },{"../not-undefined/not-undefined.js":456}],437:[function(require,module,exports){ exports.isLoopable = require('../is-iterable/is-iterable.js').isIterable; },{"../is-iterable/is-iterable.js":436}],438:[function(require,module,exports){ function isNil(value) { return value == null; } exports.isNil = isNil; },{}],439:[function(require,module,exports){ function isNull(value) { return value === null; } exports.isNull = isNull; },{}],440:[function(require,module,exports){ var _typeof = require("@babel/runtime/helpers/typeof"); function isObject(value) { return _typeof(value) === 'object' && value !== null; } exports.isObject = isObject; },{"@babel/runtime/helpers/typeof":62}],441:[function(require,module,exports){ function isString(value) { return typeof value === 'string'; } exports.isString = isString; },{}],442:[function(require,module,exports){ function isUndefined(value) { return typeof value === 'undefined'; } exports.isUndefined = isUndefined; },{}],443:[function(require,module,exports){ var _require = require('../not-undefined/not-undefined.js'), notUndefined = _require.notUndefined; function isWrappable(value) { return value == null || notUndefined(value[Symbol.iterator]); } exports.isWrappable = isWrappable; },{"../not-undefined/not-undefined.js":456}],444:[function(require,module,exports){ function lastHighest(best, value) { return value >= best; } exports.lastHighest = lastHighest; },{}],445:[function(require,module,exports){ function lastLowest(best, value) { return value <= best; } exports.lastLowest = lastLowest; },{}],446:[function(require,module,exports){ var isArray = Array.isArray; function notArray(value) { return !isArray(value); } exports.notArray = notArray; },{}],447:[function(require,module,exports){ var _require = require('../is-undefined/is-undefined.js'), isUndefined = _require.isUndefined; function notAsyncIterable(value) { return value == null || isUndefined(value[Symbol.asyncIterator]); } exports.notAsyncIterable = notAsyncIterable; },{"../is-undefined/is-undefined.js":442}],448:[function(require,module,exports){ var _require = require('../is-undefined/is-undefined.js'), isUndefined = _require.isUndefined; function notAsyncLoopable(value) { return value == null || isUndefined(value[Symbol.asyncIterator]) && isUndefined(value[Symbol.iterator]); } exports.notAsyncLoopable = notAsyncLoopable; },{"../is-undefined/is-undefined.js":442}],449:[function(require,module,exports){ var _require = require('../is-undefined/is-undefined.js'), isUndefined = _require.isUndefined; function notAsyncWrappable(value) { return value != null && isUndefined(value[Symbol.asyncIterator]) && isUndefined(value[Symbol.iterator]); } exports.notAsyncWrappable = notAsyncWrappable; },{"../is-undefined/is-undefined.js":442}],450:[function(require,module,exports){ var _require = require('../is-undefined/is-undefined.js'), isUndefined = _require.isUndefined; function notIterable(value) { return value == null || isUndefined(value[Symbol.iterator]); } exports.notIterable = notIterable; },{"../is-undefined/is-undefined.js":442}],451:[function(require,module,exports){ exports.notLoopable = require('../not-iterable/not-iterable.js').notIterable; },{"../not-iterable/not-iterable.js":450}],452:[function(require,module,exports){ function notNil(value) { return value != null; } exports.notNil = notNil; },{}],453:[function(require,module,exports){ function notNull(value) { return value !== null; } exports.notNull = notNull; },{}],454:[function(require,module,exports){ var _typeof = require("@babel/runtime/helpers/typeof"); function notObject(value) { return _typeof(value) !== 'object' || value === null; } exports.notObject = notObject; },{"@babel/runtime/helpers/typeof":62}],455:[function(require,module,exports){ function notString(value) { return typeof value !== 'string'; } exports.notString = notString; },{}],456:[function(require,module,exports){ function notUndefined(value) { return typeof value !== 'undefined'; } exports.notUndefined = notUndefined; },{}],457:[function(require,module,exports){ var _require = require('../is-undefined/is-undefined.js'), isUndefined = _require.isUndefined; function notWrappable(value) { return value != null && isUndefined(value[Symbol.iterator]); } exports.notWrappable = notWrappable; },{"../is-undefined/is-undefined.js":442}],458:[function(require,module,exports){ var _typeof = require("@babel/runtime/helpers/typeof"); var _regeneratorRuntime = require("@babel/runtime/regenerator"); var _marked = /*#__PURE__*/_regeneratorRuntime.mark(__objectEntries); var _require = require('../../internal/iterable.js'), wrapWithIterableIterator = _require.wrapWithIterableIterator; var hasOwnProperty = Object.prototype.hasOwnProperty; function __objectEntries(obj) { var key; return _regeneratorRuntime.wrap(function __objectEntries$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: if (!(obj == null)) { _context.next = 2; break; } return _context.abrupt("return"); case 2: _context.t0 = _regeneratorRuntime.keys(obj); case 3: if ((_context.t1 = _context.t0()).done) { _context.next = 10; break; } key = _context.t1.value; if (!hasOwnProperty.call(obj, key)) { _context.next = 8; break; } _context.next = 8; return [key, obj[key]]; case 8: _context.next = 3; break; case 10: case "end": return _context.stop(); } } }, _marked); } exports.__objectEntries = __objectEntries; var objectEntries = /*#__PURE__*/wrapWithIterableIterator(__objectEntries, { validateArgs: function validateArgs(args) { if (!(args[0] == null || _typeof(args[0]) === 'object')) { throw new Error('obj argument to objectEntries must be an object, null, or undefined'); } } }); exports.objectEntries = objectEntries; },{"../../internal/iterable.js":493,"@babel/runtime/helpers/typeof":62,"@babel/runtime/regenerator":65}],459:[function(require,module,exports){ exports.__objectFromAsync = require('../$to-object/async-to-object.js').__asyncToObject; exports.objectFromAsync = require('../$to-object/async-to-object.js').asyncToObject; },{"../$to-object/async-to-object.js":400}],460:[function(require,module,exports){ exports.__objectFrom = require('../$to-object/to-object.js').__toObject; exports.objectFrom = require('../$to-object/to-object.js').toObject; },{"../$to-object/to-object.js":401}],461:[function(require,module,exports){ var _typeof = require("@babel/runtime/helpers/typeof"); var _regeneratorRuntime = require("@babel/runtime/regenerator"); var _marked = /*#__PURE__*/_regeneratorRuntime.mark(__objectKeys); var _require = require('../../internal/iterable.js'), wrapWithIterableIterator = _require.wrapWithIterableIterator; var hasOwnProperty = Object.prototype.hasOwnProperty; function __objectKeys(obj) { var key; return _regeneratorRuntime.wrap(function __objectKeys$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: if (!(obj == null)) { _context.next = 2; break; } return _context.abrupt("return"); case 2: _context.t0 = _regeneratorRuntime.keys(obj); case 3: if ((_context.t1 = _context.t0()).done) { _context.next = 10; break; } key = _context.t1.value; if (!hasOwnProperty.call(obj, key)) { _context.next = 8; break; } _context.next = 8; return key; case 8: _context.next = 3; break; case 10: case "end": return _context.stop(); } } }, _marked); } exports.__objectKeys = __objectKeys; var objectKeys = /*#__PURE__*/wrapWithIterableIterator(__objectKeys, { validateArgs: function validateArgs(args) { if (!(args[0] == null || _typeof(args[0]) === 'object')) { throw new Error('obj argument to objectKeys must be an object, null, or undefined'); } } }); exports.objectKeys = objectKeys; },{"../../internal/iterable.js":493,"@babel/runtime/helpers/typeof":62,"@babel/runtime/regenerator":65}],462:[function(require,module,exports){ var _typeof = require("@babel/runtime/helpers/typeof"); var _regeneratorRuntime = require("@babel/runtime/regenerator"); var _marked = /*#__PURE__*/_regeneratorRuntime.mark(__objectValues); var _require = require('../../internal/iterable.js'), wrapWithIterableIterator = _require.wrapWithIterableIterator; var hasOwnProperty = Object.prototype.hasOwnProperty; function __objectValues(obj) { var key; return _regeneratorRuntime.wrap(function __objectValues$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: if (!(obj == null)) { _context.next = 2; break; } return _context.abrupt("return"); case 2: _context.t0 = _regeneratorRuntime.keys(obj); case 3: if ((_context.t1 = _context.t0()).done) { _context.next = 10; break; } key = _context.t1.value; if (!hasOwnProperty.call(obj, key)) { _context.next = 8; break; } _context.next = 8; return obj[key]; case 8: _context.next = 3; break; case 10: case "end": return _context.stop(); } } }, _marked); } exports.__objectValues = __objectValues; var objectValues = /*#__PURE__*/wrapWithIterableIterator(__objectValues, { validateArgs: function validateArgs(args) { if (!(args[0] == null || _typeof(args[0]) === 'object')) { throw new Error('obj argument to objectValues must be an object, null, or undefined'); } } }); exports.objectValues = objectValues; },{"../../internal/iterable.js":493,"@babel/runtime/helpers/typeof":62,"@babel/runtime/regenerator":65}],463:[function(require,module,exports){ var identity = function identity(x) { return x; }; function pipe() { for (var _len = arguments.length, fns = new Array(_len), _key = 0; _key < _len; _key++) { fns[_key] = arguments[_key]; } if (!fns.length) fns = [identity]; return fns.reduce(function (f, g) { return function () { return g(f.apply(void 0, arguments)); }; }); } exports.pipe = pipe; },{}],464:[function(require,module,exports){ var _slicedToArray = require("@babel/runtime/helpers/slicedToArray"); var _regeneratorRuntime = require("@babel/runtime/regenerator"); var _marked = /*#__PURE__*/_regeneratorRuntime.mark(__range); var _require = require('../../internal/iterable.js'), wrapWithIterableIterator = _require.wrapWithIterableIterator; var _require2 = require('../../internal/number.js'), isInteger = _require2.isInteger, isIntegerOrInfinite = _require2.isIntegerOrInfinite; var _require3 = require('../is-object/is-object.js'), isObject = _require3.isObject; var _require4 = require('../not-undefined/not-undefined.js'), notUndefined = _require4.notUndefined; function __range() { var start, end, step, i, _args = arguments; return _regeneratorRuntime.wrap(function __range$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: start = _args.length > 0 && _args[0] !== undefined ? _args[0] : 0; end = _args.length > 1 && _args[1] !== undefined ? _args[1] : Infinity; step = _args.length > 2 && _args[2] !== undefined ? _args[2] : 1; i = start; case 4: if (!(step > 0 ? i < end : i > end)) { _context.next = 10; break; } _context.next = 7; return i; case 7: i += step; _context.next = 4; break; case 10: case "end": return _context.stop(); } } }, _marked); } exports.__range = __range; var range = /*#__PURE__*/wrapWithIterableIterator(__range, { growRight: true, validateArgs: function validateArgs(args) { var _args2 = _slicedToArray(args, 3), optsOrEndOrStart = _args2[0], _args2$ = _args2[1], end = _args2$ === void 0 ? Infinity : _args2$, step = _args2[2]; var start; if (isObject(optsOrEndOrStart)) { start = optsOrEndOrStart.start; end = optsOrEndOrStart.end; step = optsOrEndOrStart.step; } else { if (args.length > 1) { start = optsOrEndOrStart; } else { end = optsOrEndOrStart; } } if (notUndefined(start) && !isInteger(start)) { throw new TypeError('The specified start was not an integer'); } if (notUndefined(end) && !isIntegerOrInfinite(end)) { throw new TypeError('The specified end was not an integer or infinite'); } if (notUndefined(step) && !isInteger(step, true)) { throw new TypeError('The specified step was not a non-zero integer'); } args[0] = start; args[1] = end; args[2] = step; } }); exports.range = range; },{"../../internal/iterable.js":493,"../../internal/number.js":494,"../is-object/is-object.js":440,"../not-undefined/not-undefined.js":456,"@babel/runtime/helpers/slicedToArray":59,"@babel/runtime/regenerator":65}],465:[function(require,module,exports){ var _regeneratorRuntime = require("@babel/runtime/regenerator"); var _marked = /*#__PURE__*/_regeneratorRuntime.mark(__repeatTimes); var _require = require('../../internal/curry.js'), curry = _require.curry; var _require2 = require('../../internal/iterable.js'), wrapWithIterableIterator = _require2.wrapWithIterableIterator; function __repeatTimes(n, value) { return _regeneratorRuntime.wrap(function __repeatTimes$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: if (!n--) { _context.next = 5; break; } _context.next = 3; return value; case 3: _context.next = 0; break; case 5: case "end": return _context.stop(); } } }, _marked); } exports.__repeatTimes = __repeatTimes; var repeatTimes = /*#__PURE__*/curry( /*#__PURE__*/wrapWithIterableIterator(__repeatTimes), __repeatTimes.length); exports.repeatTimes = repeatTimes; },{"../../internal/curry.js":488,"../../internal/iterable.js":493,"@babel/runtime/regenerator":65}],466:[function(require,module,exports){ var _regeneratorRuntime = require("@babel/runtime/regenerator"); var _marked = /*#__PURE__*/_regeneratorRuntime.mark(__repeat); var _require = require('../../internal/iterable.js'), wrapWithIterableIterator = _require.wrapWithIterableIterator; function __repeat(value) { return _regeneratorRuntime.wrap(function __repeat$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: if (!true) { _context.next = 5; break; } _context.next = 3; return value; case 3: _context.next = 0; break; case 5: case "end": return _context.stop(); } } }, _marked); } exports.__repeat = __repeat; var repeat = /*#__PURE__*/wrapWithIterableIterator(__repeat); exports.repeat = repeat; },{"../../internal/iterable.js":493,"@babel/runtime/regenerator":65}],467:[function(require,module,exports){ exports.__stringFromAsync = require('../$str/async-str.js').__asyncStr; exports.stringFromAsync = require('../$str/async-str.js').asyncStr; },{"../$str/async-str.js":383}],468:[function(require,module,exports){ exports.__stringFrom = require('../$str/str.js').__str; exports.stringFrom = require('../$str/str.js').str; },{"../$str/str.js":384}],469:[function(require,module,exports){ var _typeof = require("@babel/runtime/helpers/typeof"); var _defineProperty = require("@babel/runtime/helpers/defineProperty"); var emptyIterator = { next: function next() { return { value: undefined, done: true }; } }; var emptySpreadable = Object.freeze(Object.create(_defineProperty({}, Symbol.iterator, function () { return emptyIterator; }))); function when(condition, value) { var valueType = _typeof(value); if (!(value == null || value[Symbol.iterator] || valueType === 'object' || valueType === 'function')) { throw new Error('Second argument to when must be an object, iterable, or function.'); } return condition && value != null ? valueType === 'function' ? value() : value : emptySpreadable; } exports.when = when; },{"@babel/runtime/helpers/defineProperty":48,"@babel/runtime/helpers/typeof":62}],470:[function(require,module,exports){ var _regeneratorRuntime = require("@babel/runtime/regenerator"); var _marked = /*#__PURE__*/_regeneratorRuntime.mark(__wrapEntries); var _require = require('../../internal/iterable.js'), wrapWithIterableIterator = _require.wrapWithIterableIterator; function __wrapEntries(entriesable) { return _regeneratorRuntime.wrap(function __wrapEntries$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: if (!(entriesable != null)) { _context.next = 2; break; } return _context.delegateYield(entriesable.entries(), "t0", 2); case 2: case "end": return _context.stop(); } } }, _marked); } exports.__wrapEntries = __wrapEntries; var wrapEntries = /*#__PURE__*/wrapWithIterableIterator(__wrapEntries); exports.wrapEntries = wrapEntries; },{"../../internal/iterable.js":493,"@babel/runtime/regenerator":65}],471:[function(require,module,exports){ var _regeneratorRuntime = require("@babel/runtime/regenerator"); var _marked = /*#__PURE__*/_regeneratorRuntime.mark(__wrapKeys); var _require = require('../../internal/iterable.js'), wrapWithIterableIterator = _require.wrapWithIterableIterator; function __wrapKeys(keysable) { return _regeneratorRuntime.wrap(function __wrapKeys$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: if (!(keysable != null)) { _context.next = 2; break; } return _context.delegateYield(keysable.keys(), "t0", 2); case 2: case "end": return _context.stop(); } } }, _marked); } exports.__wrapKeys = __wrapKeys; var wrapKeys = /*#__PURE__*/wrapWithIterableIterator(__wrapKeys); exports.wrapKeys = wrapKeys; },{"../../internal/iterable.js":493,"@babel/runtime/regenerator":65}],472:[function(require,module,exports){ var _regeneratorRuntime = require("@babel/runtime/regenerator"); var _marked = /*#__PURE__*/_regeneratorRuntime.mark(__wrapValues); var _require = require('../../internal/iterable.js'), wrapWithIterableIterator = _require.wrapWithIterableIterator; function __wrapValues(valuesable) { return _regeneratorRuntime.wrap(function __wrapValues$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: if (!(valuesable != null)) { _context.next = 2; break; } return _context.delegateYield(valuesable.values(), "t0", 2); case 2: case "end": return _context.stop(); } } }, _marked); } exports.__wrapValues = __wrapValues; var wrapValues = /*#__PURE__*/wrapWithIterableIterator(__wrapValues); exports.wrapValues = wrapValues; },{"../../internal/iterable.js":493,"@babel/runtime/regenerator":65}],473:[function(require,module,exports){ exports.__append = require('./__methods/append.js'); exports.__apply = require('./__methods/apply.js'); exports.__arrayReverse = require('./__methods/array-reverse.js'); exports.__asyncAppend = require('./__methods/async-append.js'); exports.__asyncBatch = require('./__methods/async-batch.js'); exports.__asyncBisect = require('./__methods/async-bisect.js'); exports.__asyncBuffer = require('./__methods/async-buffer.js'); exports.__asyncCollate = require('./__methods/async-collate.js'); exports.__asyncCompress = require('./__methods/async-compress.js'); exports.__asyncConcat = require('./__methods/async-concat.js'); exports.__asyncConsume = require('./__methods/async-consume.js'); exports.__asyncCycle = require('./__methods/async-cycle.js'); exports.__asyncCycleTimes = require('./__methods/async-cycle-times.js'); exports.__asyncDeepEqual = require('./__methods/async-deep-equal.js'); exports.__asyncDistinct = require('./__methods/async-distinct.js'); exports.__asyncDrop = require('./__methods/async-drop.js'); exports.__asyncDropWhile = require('./__methods/async-drop-while.js'); exports.__asyncEnumerate = require('./__methods/async-enumerate.js'); exports.__asyncEqual = require('./__methods/async-equal.js'); exports.__asyncEvery = require('./__methods/async-every.js'); exports.__asyncFilter = require('./__methods/async-filter.js'); exports.__asyncFind = require('./__methods/async-find.js'); exports.__asyncFindBest = require('./__methods/async-find-best.js'); exports.__asyncFindBestOr = require('./__methods/async-find-best-or.js'); exports.__asyncFindOr = require('./__methods/async-find-or.js'); exports.__asyncFirst = require('./__methods/async-first.js'); exports.__asyncFirstOr = require('./__methods/async-first-or.js'); exports.__asyncFlat = require('./__methods/async-flat.js'); exports.__asyncFlatMap = require('./__methods/async-flat-map.js'); exports.__asyncForEach = require('./__methods/async-for-each.js'); exports.__asyncFork = require('./__methods/async-fork.js'); exports.__asyncForkerate = require('./__methods/async-forkerate.js'); exports.__asyncIncludes = require('./__methods/async-includes.js'); exports.__asyncIncludesAny = require('./__methods/async-includes-any.js'); exports.__asyncIncludesAnySeq = require('./__methods/async-includes-any-seq.js'); exports.__asyncIncludesSeq = require('./__methods/async-includes-seq.js'); exports.__asyncInterleave = require('./__methods/async-interleave.js'); exports.__asyncInterleaveReady = require('./__methods/async-interleave-ready.js'); exports.__asyncInterpose = require('./__methods/async-interpose.js'); exports.__asyncInterposeSeq = require('./__methods/async-interpose-seq.js'); exports.__asyncIsEmpty = require('./__methods/async-is-empty.js'); exports.__asyncIsSorted = require('./__methods/async-is-sorted.js'); exports.__asyncJoin = require('./__methods/async-join.js'); exports.__asyncJoinWith = require('./__methods/async-join-with.js'); exports.__asyncJoinWithSeq = require('./__methods/async-join-with-seq.js'); exports.__asyncMap = require('./__methods/async-map.js'); exports.__asyncPeekerate = require('./__methods/async-peekerate.js'); exports.__asyncPrepend = require('./__methods/async-prepend.js'); exports.__asyncReduce = require('./__methods/async-reduce.js'); exports.__asyncReverse = require('./__methods/async-reverse.js'); exports.__asyncRoundRobin = require('./__methods/async-round-robin.js'); exports.__asyncSize = require('./__methods/async-size.js'); exports.__asyncSlice = require('./__methods/async-slice.js'); exports.__asyncSome = require('./__methods/async-some.js'); exports.__asyncSplit = require('./__methods/async-split.js'); exports.__asyncSplitGroups = require('./__methods/async-split-groups.js'); exports.__asyncSplitOn = require('./__methods/async-split-on.js'); exports.__asyncSplitOnAny = require('./__methods/async-split-on-any.js'); exports.__asyncSplitOnAnySeq = require('./__methods/async-split-on-any-seq.js'); exports.__asyncSplitOnSeq = require('./__methods/async-split-on-seq.js'); exports.__asyncSplitWhen = require('./__methods/async-split-when.js'); exports.__asyncSpliterate = require('./__methods/async-spliterate.js'); exports.__asyncSpliterateGrouped = require('./__methods/async-spliterate-grouped.js'); exports.__asyncStartsWith = require('./__methods/async-starts-with.js'); exports.__asyncStartsWithAny = require('./__methods/async-starts-with-any.js'); exports.__asyncStartsWithAnySeq = require('./__methods/async-starts-with-any-seq.js'); exports.__asyncStartsWithSeq = require('./__methods/async-starts-with-seq.js'); exports.__asyncStr = require('./__methods/async-str.js'); exports.__asyncTake = require('./__methods/async-take.js'); exports.__asyncTakeLast = require('./__methods/async-take-last.js'); exports.__asyncTakeLastOr = require('./__methods/async-take-last-or.js'); exports.__asyncTakeSorted = require('./__methods/async-take-sorted.js'); exports.__asyncTakeWhile = require('./__methods/async-take-while.js'); exports.__asyncTap = require('./__methods/async-tap.js'); exports.__asyncThrottle = require('./__methods/async-throttle.js'); exports.__asyncToArray = require('./__methods/async-to-array.js'); exports.__asyncToObject = require('./__methods/async-to-object.js'); exports.__asyncWindow = require('./__methods/async-window.js'); exports.__asyncWindowAhead = require('./__methods/async-window-ahead.js'); exports.__asyncWindowBehind = require('./__methods/async-window-behind.js'); exports.__asyncZip = require('./__methods/async-zip.js'); exports.__asyncZipAll = require('./__methods/async-zip-all.js'); exports.__batch = require('./__methods/batch.js'); exports.__bisect = require('./__methods/bisect.js'); exports.__call = require('./__methods/call.js'); exports.__collate = require('./__methods/collate.js'); exports.__compress = require('./__methods/compress.js'); exports.__concat = require('./__methods/concat.js'); exports.__consume = require('./__methods/consume.js'); exports.__cycle = require('./__methods/cycle.js'); exports.__cycleTimes = require('./__methods/cycle-times.js'); exports.__deepEqual = require('./__methods/deep-equal.js'); exports.__distinct = require('./__methods/distinct.js'); exports.__drop = require('./__methods/drop.js'); exports.__dropWhile = require('./__methods/drop-while.js'); exports.__enumerate = require('./__methods/enumerate.js'); exports.__equal = require('./__methods/equal.js'); exports.__every = require('./__methods/every.js'); exports.__filter = require('./__methods/filter.js'); exports.__find = require('./__methods/find.js'); exports.__findBest = require('./__methods/find-best.js'); exports.__findBestOr = require('./__methods/find-best-or.js'); exports.__findOr = require('./__methods/find-or.js'); exports.__first = require('./__methods/first.js'); exports.__firstOr = require('./__methods/first-or.js'); exports.__flat = require('./__methods/flat.js'); exports.__flatMap = require('./__methods/flat-map.js'); exports.__forEach = require('./__methods/for-each.js'); exports.__fork = require('./__methods/fork.js'); exports.__forkerate = require('./__methods/forkerate.js'); exports.__includes = require('./__methods/includes.js'); exports.__includesAny = require('./__methods/includes-any.js'); exports.__includesAnySeq = require('./__methods/includes-any-seq.js'); exports.__includesSeq = require('./__methods/includes-seq.js'); exports.__interleave = require('./__methods/interleave.js'); exports.__interpose = require('./__methods/interpose.js'); exports.__interposeSeq = require('./__methods/interpose-seq.js'); exports.__isEmpty = require('./__methods/is-empty.js'); exports.__isSorted = require('./__methods/is-sorted.js'); exports.__join = require('./__methods/join.js'); exports.__joinWith = require('./__methods/join-with.js'); exports.__joinWithSeq = require('./__methods/join-with-seq.js'); exports.__map = require('./__methods/map.js'); exports.__objectEntries = require('./__methods/object-entries.js'); exports.__objectKeys = require('./__methods/object-keys.js'); exports.__objectValues = require('./__methods/object-values.js'); exports.__peekerate = require('./__methods/peekerate.js'); exports.__prepend = require('./__methods/prepend.js'); exports.__range = require('./__methods/range.js'); exports.__reduce = require('./__methods/reduce.js'); exports.__repeat = require('./__methods/repeat.js'); exports.__repeatTimes = require('./__methods/repeat-times.js'); exports.__reverse = require('./__methods/reverse.js'); exports.__roundRobin = require('./__methods/round-robin.js'); exports.__size = require('./__methods/size.js'); exports.__slice = require('./__methods/slice.js'); exports.__some = require('./__methods/some.js'); exports.__split = require('./__methods/split.js'); exports.__splitGroups = require('./__methods/split-groups.js'); exports.__splitOn = require('./__methods/split-on.js'); exports.__splitOnAny = require('./__methods/split-on-any.js'); exports.__splitOnAnySeq = require('./__methods/split-on-any-seq.js'); exports.__splitOnSeq = require('./__methods/split-on-seq.js'); exports.__splitWhen = require('./__methods/split-when.js'); exports.__spliterate = require('./__methods/spliterate.js'); exports.__spliterateGrouped = require('./__methods/spliterate-grouped.js'); exports.__startsWith = require('./__methods/starts-with.js'); exports.__startsWithAny = require('./__methods/starts-with-any.js'); exports.__startsWithAnySeq = require('./__methods/starts-with-any-seq.js'); exports.__startsWithSeq = require('./__methods/starts-with-seq.js'); exports.__str = require('./__methods/str.js'); exports.__take = require('./__methods/take.js'); exports.__takeLast = require('./__methods/take-last.js'); exports.__takeLastOr = require('./__methods/take-last-or.js'); exports.__takeSorted = require('./__methods/take-sorted.js'); exports.__takeWhile = require('./__methods/take-while.js'); exports.__tap = require('./__methods/tap.js'); exports.__toArray = require('./__methods/to-array.js'); exports.__toObject = require('./__methods/to-object.js'); exports.__window = require('./__methods/window.js'); exports.__windowAhead = require('./__methods/window-ahead.js'); exports.__windowBehind = require('./__methods/window-behind.js'); exports.__wrapEntries = require('./__methods/wrap-entries.js'); exports.__wrapKeys = require('./__methods/wrap-keys.js'); exports.__wrapValues = require('./__methods/wrap-values.js'); exports.__zip = require('./__methods/zip.js'); exports.__zipAll = require('./__methods/zip-all.js'); exports.append = require('./methods/append.js'); exports.apply = require('./methods/apply.js'); exports.arrayFirst = require('./methods/array-first.js'); exports.arrayFirstOr = require('./methods/array-first-or.js'); exports.arrayFrom = require('./methods/array-from.js'); exports.arrayFromAsync = require('./methods/array-from-async.js'); exports.arrayLast = require('./methods/array-last.js'); exports.arrayLastOr = require('./methods/array-last-or.js'); exports.arrayReverse = require('./methods/array-reverse.js'); exports.batch = require('./methods/batch.js'); exports.bisect = require('./methods/bisect.js'); exports.call = require('./methods/call.js'); exports.collate = require('./methods/collate.js'); exports.compose = require('./methods/compose.js'); exports.compress = require('./methods/compress.js'); exports.concat = require('./methods/concat.js'); exports.consume = require('./methods/consume.js'); exports.cycle = require('./methods/cycle.js'); exports.cycleTimes = require('./methods/cycle-times.js'); exports.deepEqual = require('./methods/deep-equal.js'); exports.distinct = require('./methods/distinct.js'); exports.drop = require('./methods/drop.js'); exports.dropWhile = require('./methods/drop-while.js'); exports.enumerate = require('./methods/enumerate.js'); exports.equal = require('./methods/equal.js'); exports.every = require('./methods/every.js'); exports.execPipe = require('./methods/exec-pipe.js'); exports.filter = require('./methods/filter.js'); exports.find = require('./methods/find.js'); exports.findBest = require('./methods/find-best.js'); exports.findBestOr = require('./methods/find-best-or.js'); exports.findOr = require('./methods/find-or.js'); exports.first = require('./methods/first.js'); exports.firstHighest = require('./methods/first-highest.js'); exports.firstLowest = require('./methods/first-lowest.js'); exports.firstOr = require('./methods/first-or.js'); exports.flat = require('./methods/flat.js'); exports.flatMap = require('./methods/flat-map.js'); exports.forEach = require('./methods/for-each.js'); exports.fork = require('./methods/fork.js'); exports.forkerate = require('./methods/forkerate.js'); exports.getSize = require('./methods/get-size.js'); exports.includes = require('./methods/includes.js'); exports.includesAny = require('./methods/includes-any.js'); exports.includesAnySeq = require('./methods/includes-any-seq.js'); exports.includesSeq = require('./methods/includes-seq.js'); exports.interleave = require('./methods/interleave.js'); exports.interpose = require('./methods/interpose.js'); exports.interposeSeq = require('./methods/interpose-seq.js'); exports.isArray = require('./methods/is-array.js'); exports.isAsyncIterable = require('./methods/is-async-iterable.js'); exports.isAsyncLoopable = require('./methods/is-async-loopable.js'); exports.isAsyncWrappable = require('./methods/is-async-wrappable.js'); exports.isEmpty = require('./methods/is-empty.js'); exports.isIterable = require('./methods/is-iterable.js'); exports.isLoopable = require('./methods/is-loopable.js'); exports.isNil = require('./methods/is-nil.js'); exports.isNull = require('./methods/is-null.js'); exports.isObject = require('./methods/is-object.js'); exports.isSorted = require('./methods/is-sorted.js'); exports.isString = require('./methods/is-string.js'); exports.isUndefined = require('./methods/is-undefined.js'); exports.isWrappable = require('./methods/is-wrappable.js'); exports.join = require('./methods/join.js'); exports.joinWith = require('./methods/join-with.js'); exports.joinWithSeq = require('./methods/join-with-seq.js'); exports.lastHighest = require('./methods/last-highest.js'); exports.lastLowest = require('./methods/last-lowest.js'); exports.map = require('./methods/map.js'); exports.notArray = require('./methods/not-array.js'); exports.notAsyncIterable = require('./methods/not-async-iterable.js'); exports.notAsyncLoopable = require('./methods/not-async-loopable.js'); exports.notAsyncWrappable = require('./methods/not-async-wrappable.js'); exports.notIterable = require('./methods/not-iterable.js'); exports.notLoopable = require('./methods/not-loopable.js'); exports.notNil = require('./methods/not-nil.js'); exports.notNull = require('./methods/not-null.js'); exports.notObject = require('./methods/not-object.js'); exports.notString = require('./methods/not-string.js'); exports.notUndefined = require('./methods/not-undefined.js'); exports.notWrappable = require('./methods/not-wrappable.js'); exports.objectEntries = require('./methods/object-entries.js'); exports.objectFrom = require('./methods/object-from.js'); exports.objectFromAsync = require('./methods/object-from-async.js'); exports.objectKeys = require('./methods/object-keys.js'); exports.objectValues = require('./methods/object-values.js'); exports.peekerate = require('./methods/peekerate.js'); exports.pipe = require('./methods/pipe.js'); exports.prepend = require('./methods/prepend.js'); exports.range = require('./methods/range.js'); exports.reduce = require('./methods/reduce.js'); exports.repeat = require('./methods/repeat.js'); exports.repeatTimes = require('./methods/repeat-times.js'); exports.reverse = require('./methods/reverse.js'); exports.roundRobin = require('./methods/round-robin.js'); exports.size = require('./methods/size.js'); exports.slice = require('./methods/slice.js'); exports.some = require('./methods/some.js'); exports.split = require('./methods/split.js'); exports.splitGroups = require('./methods/split-groups.js'); exports.splitOn = require('./methods/split-on.js'); exports.splitOnAny = require('./methods/split-on-any.js'); exports.splitOnAnySeq = require('./methods/split-on-any-seq.js'); exports.splitOnSeq = require('./methods/split-on-seq.js'); exports.splitWhen = require('./methods/split-when.js'); exports.spliterate = require('./methods/spliterate.js'); exports.spliterateGrouped = require('./methods/spliterate-grouped.js'); exports.startsWith = require('./methods/starts-with.js'); exports.startsWithAny = require('./methods/starts-with-any.js'); exports.startsWithAnySeq = require('./methods/starts-with-any-seq.js'); exports.startsWithSeq = require('./methods/starts-with-seq.js'); exports.str = require('./methods/str.js'); exports.stringFrom = require('./methods/string-from.js'); exports.stringFromAsync = require('./methods/string-from-async.js'); exports.take = require('./methods/take.js'); exports.takeLast = require('./methods/take-last.js'); exports.takeLastOr = require('./methods/take-last-or.js'); exports.takeSorted = require('./methods/take-sorted.js'); exports.takeWhile = require('./methods/take-while.js'); exports.tap = require('./methods/tap.js'); exports.toArray = require('./methods/to-array.js'); exports.toObject = require('./methods/to-object.js'); exports.when = require('./methods/when.js'); exports.window = require('./methods/window.js'); exports.windowAhead = require('./methods/window-ahead.js'); exports.windowBehind = require('./methods/window-behind.js'); exports.wrap = require('./methods/wrap.js'); exports.wrapEntries = require('./methods/wrap-entries.js'); exports.wrapKeys = require('./methods/wrap-keys.js'); exports.wrapValues = require('./methods/wrap-values.js'); exports.zip = require('./methods/zip.js'); exports.zipAll = require('./methods/zip-all.js'); exports.asyncAppend = require('./methods/async-append.js'); exports.asyncBatch = require('./methods/async-batch.js'); exports.asyncBisect = require('./methods/async-bisect.js'); exports.asyncBuffer = require('./methods/async-buffer.js'); exports.asyncCollate = require('./methods/async-collate.js'); exports.asyncCompress = require('./methods/async-compress.js'); exports.asyncConcat = require('./methods/async-concat.js'); exports.asyncConsume = require('./methods/async-consume.js'); exports.asyncCycle = require('./methods/async-cycle.js'); exports.asyncCycleTimes = require('./methods/async-cycle-times.js'); exports.asyncDeepEqual = require('./methods/async-deep-equal.js'); exports.asyncDistinct = require('./methods/async-distinct.js'); exports.asyncDrop = require('./methods/async-drop.js'); exports.asyncDropWhile = require('./methods/async-drop-while.js'); exports.asyncEnumerate = require('./methods/async-enumerate.js'); exports.asyncEqual = require('./methods/async-equal.js'); exports.asyncEvery = require('./methods/async-every.js'); exports.asyncFilter = require('./methods/async-filter.js'); exports.asyncFind = require('./methods/async-find.js'); exports.asyncFindBest = require('./methods/async-find-best.js'); exports.asyncFindBestOr = require('./methods/async-find-best-or.js'); exports.asyncFindOr = require('./methods/async-find-or.js'); exports.asyncFirst = require('./methods/async-first.js'); exports.asyncFirstOr = require('./methods/async-first-or.js'); exports.asyncFlat = require('./methods/async-flat.js'); exports.asyncFlatMap = require('./methods/async-flat-map.js'); exports.asyncForEach = require('./methods/async-for-each.js'); exports.asyncFork = require('./methods/async-fork.js'); exports.asyncForkerate = require('./methods/async-forkerate.js'); exports.asyncIncludes = require('./methods/async-includes.js'); exports.asyncIncludesAny = require('./methods/async-includes-any.js'); exports.asyncIncludesAnySeq = require('./methods/async-includes-any-seq.js'); exports.asyncIncludesSeq = require('./methods/async-includes-seq.js'); exports.asyncInterleave = require('./methods/async-interleave.js'); exports.asyncInterleaveReady = require('./methods/async-interleave-ready.js'); exports.asyncInterpose = require('./methods/async-interpose.js'); exports.asyncInterposeSeq = require('./methods/async-interpose-seq.js'); exports.asyncIsEmpty = require('./methods/async-is-empty.js'); exports.asyncIsSorted = require('./methods/async-is-sorted.js'); exports.asyncJoin = require('./methods/async-join.js'); exports.asyncJoinWith = require('./methods/async-join-with.js'); exports.asyncJoinWithSeq = require('./methods/async-join-with-seq.js'); exports.asyncMap = require('./methods/async-map.js'); exports.asyncPeekerate = require('./methods/async-peekerate.js'); exports.asyncPrepend = require('./methods/async-prepend.js'); exports.asyncReduce = require('./methods/async-reduce.js'); exports.asyncReverse = require('./methods/async-reverse.js'); exports.asyncRoundRobin = require('./methods/async-round-robin.js'); exports.asyncSize = require('./methods/async-size.js'); exports.asyncSlice = require('./methods/async-slice.js'); exports.asyncSome = require('./methods/async-some.js'); exports.asyncSplit = require('./methods/async-split.js'); exports.asyncSplitGroups = require('./methods/async-split-groups.js'); exports.asyncSplitOn = require('./methods/async-split-on.js'); exports.asyncSplitOnAny = require('./methods/async-split-on-any.js'); exports.asyncSplitOnAnySeq = require('./methods/async-split-on-any-seq.js'); exports.asyncSplitOnSeq = require('./methods/async-split-on-seq.js'); exports.asyncSplitWhen = require('./methods/async-split-when.js'); exports.asyncSpliterate = require('./methods/async-spliterate.js'); exports.asyncSpliterateGrouped = require('./methods/async-spliterate-grouped.js'); exports.asyncStartsWith = require('./methods/async-starts-with.js'); exports.asyncStartsWithAny = require('./methods/async-starts-with-any.js'); exports.asyncStartsWithAnySeq = require('./methods/async-starts-with-any-seq.js'); exports.asyncStartsWithSeq = require('./methods/async-starts-with-seq.js'); exports.asyncStr = require('./methods/async-str.js'); exports.asyncTake = require('./methods/async-take.js'); exports.asyncTakeLast = require('./methods/async-take-last.js'); exports.asyncTakeLastOr = require('./methods/async-take-last-or.js'); exports.asyncTakeSorted = require('./methods/async-take-sorted.js'); exports.asyncTakeWhile = require('./methods/async-take-while.js'); exports.asyncTap = require('./methods/async-tap.js'); exports.asyncThrottle = require('./methods/async-throttle.js'); exports.asyncToArray = require('./methods/async-to-array.js'); exports.asyncToObject = require('./methods/async-to-object.js'); exports.asyncWindow = require('./methods/async-window.js'); exports.asyncWindowAhead = require('./methods/async-window-ahead.js'); exports.asyncWindowBehind = require('./methods/async-window-behind.js'); exports.asyncWrap = require('./methods/async-wrap.js'); exports.asyncZip = require('./methods/async-zip.js'); exports.asyncZipAll = require('./methods/async-zip-all.js'); },{"./__methods/append.js":89,"./__methods/apply.js":90,"./__methods/array-reverse.js":91,"./__methods/async-append.js":92,"./__methods/async-batch.js":93,"./__methods/async-bisect.js":94,"./__methods/async-buffer.js":95,"./__methods/async-collate.js":96,"./__methods/async-compress.js":97,"./__methods/async-concat.js":98,"./__methods/async-consume.js":99,"./__methods/async-cycle-times.js":100,"./__methods/async-cycle.js":101,"./__methods/async-deep-equal.js":102,"./__methods/async-distinct.js":103,"./__methods/async-drop-while.js":104,"./__methods/async-drop.js":105,"./__methods/async-enumerate.js":106,"./__methods/async-equal.js":107,"./__methods/async-every.js":108,"./__methods/async-filter.js":109,"./__methods/async-find-best-or.js":110,"./__methods/async-find-best.js":111,"./__methods/async-find-or.js":112,"./__methods/async-find.js":113,"./__methods/async-first-or.js":114,"./__methods/async-first.js":115,"./__methods/async-flat-map.js":116,"./__methods/async-flat.js":117,"./__methods/async-for-each.js":118,"./__methods/async-fork.js":119,"./__methods/async-forkerate.js":120,"./__methods/async-includes-any-seq.js":121,"./__methods/async-includes-any.js":122,"./__methods/async-includes-seq.js":123,"./__methods/async-includes.js":124,"./__methods/async-interleave-ready.js":125,"./__methods/async-interleave.js":126,"./__methods/async-interpose-seq.js":127,"./__methods/async-interpose.js":128,"./__methods/async-is-empty.js":129,"./__methods/async-is-sorted.js":130,"./__methods/async-join-with-seq.js":131,"./__methods/async-join-with.js":132,"./__methods/async-join.js":133,"./__methods/async-map.js":134,"./__methods/async-peekerate.js":135,"./__methods/async-prepend.js":136,"./__methods/async-reduce.js":137,"./__methods/async-reverse.js":138,"./__methods/async-round-robin.js":139,"./__methods/async-size.js":140,"./__methods/async-slice.js":141,"./__methods/async-some.js":142,"./__methods/async-split-groups.js":143,"./__methods/async-split-on-any-seq.js":144,"./__methods/async-split-on-any.js":145,"./__methods/async-split-on-seq.js":146,"./__methods/async-split-on.js":147,"./__methods/async-split-when.js":148,"./__methods/async-split.js":149,"./__methods/async-spliterate-grouped.js":150,"./__methods/async-spliterate.js":151,"./__methods/async-starts-with-any-seq.js":152,"./__methods/async-starts-with-any.js":153,"./__methods/async-starts-with-seq.js":154,"./__methods/async-starts-with.js":155,"./__methods/async-str.js":156,"./__methods/async-take-last-or.js":157,"./__methods/async-take-last.js":158,"./__methods/async-take-sorted.js":159,"./__methods/async-take-while.js":160,"./__methods/async-take.js":161,"./__methods/async-tap.js":162,"./__methods/async-throttle.js":163,"./__methods/async-to-array.js":164,"./__methods/async-to-object.js":165,"./__methods/async-window-ahead.js":166,"./__methods/async-window-behind.js":167,"./__methods/async-window.js":168,"./__methods/async-zip-all.js":169,"./__methods/async-zip.js":170,"./__methods/batch.js":171,"./__methods/bisect.js":172,"./__methods/call.js":173,"./__methods/collate.js":174,"./__methods/compress.js":175,"./__methods/concat.js":176,"./__methods/consume.js":177,"./__methods/cycle-times.js":178,"./__methods/cycle.js":179,"./__methods/deep-equal.js":180,"./__methods/distinct.js":181,"./__methods/drop-while.js":182,"./__methods/drop.js":183,"./__methods/enumerate.js":184,"./__methods/equal.js":185,"./__methods/every.js":186,"./__methods/filter.js":187,"./__methods/find-best-or.js":188,"./__methods/find-best.js":189,"./__methods/find-or.js":190,"./__methods/find.js":191,"./__methods/first-or.js":192,"./__methods/first.js":193,"./__methods/flat-map.js":194,"./__methods/flat.js":195,"./__methods/for-each.js":196,"./__methods/fork.js":197,"./__methods/forkerate.js":198,"./__methods/includes-any-seq.js":199,"./__methods/includes-any.js":200,"./__methods/includes-seq.js":201,"./__methods/includes.js":202,"./__methods/interleave.js":203,"./__methods/interpose-seq.js":204,"./__methods/interpose.js":205,"./__methods/is-empty.js":206,"./__methods/is-sorted.js":207,"./__methods/join-with-seq.js":208,"./__methods/join-with.js":209,"./__methods/join.js":210,"./__methods/map.js":211,"./__methods/object-entries.js":212,"./__methods/object-keys.js":213,"./__methods/object-values.js":214,"./__methods/peekerate.js":215,"./__methods/prepend.js":216,"./__methods/range.js":217,"./__methods/reduce.js":218,"./__methods/repeat-times.js":219,"./__methods/repeat.js":220,"./__methods/reverse.js":221,"./__methods/round-robin.js":222,"./__methods/size.js":223,"./__methods/slice.js":224,"./__methods/some.js":225,"./__methods/split-groups.js":226,"./__methods/split-on-any-seq.js":227,"./__methods/split-on-any.js":228,"./__methods/split-on-seq.js":229,"./__methods/split-on.js":230,"./__methods/split-when.js":231,"./__methods/split.js":232,"./__methods/spliterate-grouped.js":233,"./__methods/spliterate.js":234,"./__methods/starts-with-any-seq.js":235,"./__methods/starts-with-any.js":236,"./__methods/starts-with-seq.js":237,"./__methods/starts-with.js":238,"./__methods/str.js":239,"./__methods/take-last-or.js":240,"./__methods/take-last.js":241,"./__methods/take-sorted.js":242,"./__methods/take-while.js":243,"./__methods/take.js":244,"./__methods/tap.js":245,"./__methods/to-array.js":246,"./__methods/to-object.js":247,"./__methods/window-ahead.js":248,"./__methods/window-behind.js":249,"./__methods/window.js":250,"./__methods/wrap-entries.js":251,"./__methods/wrap-keys.js":252,"./__methods/wrap-values.js":253,"./__methods/zip-all.js":254,"./__methods/zip.js":255,"./methods/append.js":500,"./methods/apply.js":501,"./methods/array-first-or.js":502,"./methods/array-first.js":503,"./methods/array-from-async.js":504,"./methods/array-from.js":505,"./methods/array-last-or.js":506,"./methods/array-last.js":507,"./methods/array-reverse.js":508,"./methods/async-append.js":509,"./methods/async-batch.js":510,"./methods/async-bisect.js":511,"./methods/async-buffer.js":512,"./methods/async-collate.js":513,"./methods/async-compress.js":514,"./methods/async-concat.js":515,"./methods/async-consume.js":516,"./methods/async-cycle-times.js":517,"./methods/async-cycle.js":518,"./methods/async-deep-equal.js":519,"./methods/async-distinct.js":520,"./methods/async-drop-while.js":521,"./methods/async-drop.js":522,"./methods/async-enumerate.js":523,"./methods/async-equal.js":524,"./methods/async-every.js":525,"./methods/async-filter.js":526,"./methods/async-find-best-or.js":527,"./methods/async-find-best.js":528,"./methods/async-find-or.js":529,"./methods/async-find.js":530,"./methods/async-first-or.js":531,"./methods/async-first.js":532,"./methods/async-flat-map.js":533,"./methods/async-flat.js":534,"./methods/async-for-each.js":535,"./methods/async-fork.js":536,"./methods/async-forkerate.js":537,"./methods/async-includes-any-seq.js":538,"./methods/async-includes-any.js":539,"./methods/async-includes-seq.js":540,"./methods/async-includes.js":541,"./methods/async-interleave-ready.js":542,"./methods/async-interleave.js":543,"./methods/async-interpose-seq.js":544,"./methods/async-interpose.js":545,"./methods/async-is-empty.js":546,"./methods/async-is-sorted.js":547,"./methods/async-join-with-seq.js":548,"./methods/async-join-with.js":549,"./methods/async-join.js":550,"./methods/async-map.js":551,"./methods/async-peekerate.js":552,"./methods/async-prepend.js":553,"./methods/async-reduce.js":554,"./methods/async-reverse.js":555,"./methods/async-round-robin.js":556,"./methods/async-size.js":557,"./methods/async-slice.js":558,"./methods/async-some.js":559,"./methods/async-split-groups.js":560,"./methods/async-split-on-any-seq.js":561,"./methods/async-split-on-any.js":562,"./methods/async-split-on-seq.js":563,"./methods/async-split-on.js":564,"./methods/async-split-when.js":565,"./methods/async-split.js":566,"./methods/async-spliterate-grouped.js":567,"./methods/async-spliterate.js":568,"./methods/async-starts-with-any-seq.js":569,"./methods/async-starts-with-any.js":570,"./methods/async-starts-with-seq.js":571,"./methods/async-starts-with.js":572,"./methods/async-str.js":573,"./methods/async-take-last-or.js":574,"./methods/async-take-last.js":575,"./methods/async-take-sorted.js":576,"./methods/async-take-while.js":577,"./methods/async-take.js":578,"./methods/async-tap.js":579,"./methods/async-throttle.js":580,"./methods/async-to-array.js":581,"./methods/async-to-object.js":582,"./methods/async-window-ahead.js":583,"./methods/async-window-behind.js":584,"./methods/async-window.js":585,"./methods/async-wrap.js":586,"./methods/async-zip-all.js":587,"./methods/async-zip.js":588,"./methods/batch.js":589,"./methods/bisect.js":590,"./methods/call.js":591,"./methods/collate.js":592,"./methods/compose.js":593,"./methods/compress.js":594,"./methods/concat.js":595,"./methods/consume.js":596,"./methods/cycle-times.js":597,"./methods/cycle.js":598,"./methods/deep-equal.js":599,"./methods/distinct.js":600,"./methods/drop-while.js":601,"./methods/drop.js":602,"./methods/enumerate.js":603,"./methods/equal.js":604,"./methods/every.js":605,"./methods/exec-pipe.js":606,"./methods/filter.js":607,"./methods/find-best-or.js":608,"./methods/find-best.js":609,"./methods/find-or.js":610,"./methods/find.js":611,"./methods/first-highest.js":612,"./methods/first-lowest.js":613,"./methods/first-or.js":614,"./methods/first.js":615,"./methods/flat-map.js":616,"./methods/flat.js":617,"./methods/for-each.js":618,"./methods/fork.js":619,"./methods/forkerate.js":620,"./methods/get-size.js":621,"./methods/includes-any-seq.js":622,"./methods/includes-any.js":623,"./methods/includes-seq.js":624,"./methods/includes.js":625,"./methods/interleave.js":626,"./methods/interpose-seq.js":627,"./methods/interpose.js":628,"./methods/is-array.js":629,"./methods/is-async-iterable.js":630,"./methods/is-async-loopable.js":631,"./methods/is-async-wrappable.js":632,"./methods/is-empty.js":633,"./methods/is-iterable.js":634,"./methods/is-loopable.js":635,"./methods/is-nil.js":636,"./methods/is-null.js":637,"./methods/is-object.js":638,"./methods/is-sorted.js":639,"./methods/is-string.js":640,"./methods/is-undefined.js":641,"./methods/is-wrappable.js":642,"./methods/join-with-seq.js":643,"./methods/join-with.js":644,"./methods/join.js":645,"./methods/last-highest.js":646,"./methods/last-lowest.js":647,"./methods/map.js":648,"./methods/not-array.js":649,"./methods/not-async-iterable.js":650,"./methods/not-async-loopable.js":651,"./methods/not-async-wrappable.js":652,"./methods/not-iterable.js":653,"./methods/not-loopable.js":654,"./methods/not-nil.js":655,"./methods/not-null.js":656,"./methods/not-object.js":657,"./methods/not-string.js":658,"./methods/not-undefined.js":659,"./methods/not-wrappable.js":660,"./methods/object-entries.js":661,"./methods/object-from-async.js":662,"./methods/object-from.js":663,"./methods/object-keys.js":664,"./methods/object-values.js":665,"./methods/peekerate.js":666,"./methods/pipe.js":667,"./methods/prepend.js":668,"./methods/range.js":669,"./methods/reduce.js":670,"./methods/repeat-times.js":671,"./methods/repeat.js":672,"./methods/reverse.js":673,"./methods/round-robin.js":674,"./methods/size.js":675,"./methods/slice.js":676,"./methods/some.js":677,"./methods/split-groups.js":678,"./methods/split-on-any-seq.js":679,"./methods/split-on-any.js":680,"./methods/split-on-seq.js":681,"./methods/split-on.js":682,"./methods/split-when.js":683,"./methods/split.js":684,"./methods/spliterate-grouped.js":685,"./methods/spliterate.js":686,"./methods/starts-with-any-seq.js":687,"./methods/starts-with-any.js":688,"./methods/starts-with-seq.js":689,"./methods/starts-with.js":690,"./methods/str.js":691,"./methods/string-from-async.js":692,"./methods/string-from.js":693,"./methods/take-last-or.js":694,"./methods/take-last.js":695,"./methods/take-sorted.js":696,"./methods/take-while.js":697,"./methods/take.js":698,"./methods/tap.js":699,"./methods/to-array.js":700,"./methods/to-object.js":701,"./methods/when.js":702,"./methods/window-ahead.js":703,"./methods/window-behind.js":704,"./methods/window.js":705,"./methods/wrap-entries.js":706,"./methods/wrap-keys.js":707,"./methods/wrap-values.js":708,"./methods/wrap.js":709,"./methods/zip-all.js":710,"./methods/zip.js":711}],474:[function(require,module,exports){ var _require = require('./iterable.js'), ensureIterable = _require.ensureIterable; var _require2 = require('../impls/$to-array/to-array.js'), __toArray = _require2.__toArray; var _require3 = require('../impls/$map/map.js'), __map = _require3.__map; function seqsToArray(values) { return __toArray(__map(values, function (value) { return __toArray(ensureIterable(value)); }), function (arr) { return arr.length > 0; }); } exports.seqsToArray = seqsToArray; },{"../impls/$map/map.js":338,"../impls/$to-array/to-array.js":399,"./iterable.js":493}],475:[function(require,module,exports){ var _regeneratorRuntime = require("@babel/runtime/regenerator"); var _asyncToGenerator = require("@babel/runtime/helpers/asyncToGenerator"); var _require = require('./async-iterable.js'), asyncEnsureIterable = _require.asyncEnsureIterable; var _require2 = require('../impls/$to-array/async-to-array.js'), __asyncToArray = _require2.__asyncToArray; var _require3 = require('../impls/$map/async-map.js'), __asyncMap = _require3.__asyncMap; function asyncSeqsToArray(_x) { return _asyncSeqsToArray.apply(this, arguments); } function _asyncSeqsToArray() { _asyncSeqsToArray = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(values) { return _regeneratorRuntime.wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: _context.next = 2; return __asyncToArray(__asyncMap(values, function (value) { return __asyncToArray(asyncEnsureIterable(value)); }), function (arr) { return arr.length > 0; }); case 2: return _context.abrupt("return", _context.sent); case 3: case "end": return _context.stop(); } } }, _callee); })); return _asyncSeqsToArray.apply(this, arguments); } exports.asyncSeqsToArray = asyncSeqsToArray; },{"../impls/$map/async-map.js":337,"../impls/$to-array/async-to-array.js":398,"./async-iterable.js":480,"@babel/runtime/helpers/asyncToGenerator":43,"@babel/runtime/regenerator":65}],476:[function(require,module,exports){ var _regeneratorRuntime = require("@babel/runtime/regenerator"); var _asyncToGenerator = require("@babel/runtime/helpers/asyncToGenerator"); var _classCallCheck = require("@babel/runtime/helpers/classCallCheck"); var _createClass = require("@babel/runtime/helpers/createClass"); var _inherits = require("@babel/runtime/helpers/inherits"); var _possibleConstructorReturn = require("@babel/runtime/helpers/possibleConstructorReturn"); var _getPrototypeOf = require("@babel/runtime/helpers/getPrototypeOf"); function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } } var _wrapAsyncGenerator = require("@babel/runtime/helpers/wrapAsyncGenerator"); var _awaitAsyncGenerator = require("@babel/runtime/helpers/awaitAsyncGenerator"); var _asyncIterator = require("@babel/runtime/helpers/asyncIterator"); var _asyncGeneratorDelegate = require("@babel/runtime/helpers/asyncGeneratorDelegate"); var _require = require('./iterable-iterator.js'), IterableIterator = _require.IterableIterator; var _require2 = require('./async-parts-iterator.js'), AsyncPartsIterator = _require2.AsyncPartsIterator; var AsyncBisector = /*#__PURE__*/function (_IterableIterator) { _inherits(AsyncBisector, _IterableIterator); var _super = _createSuper(AsyncBisector); function AsyncBisector(source, strategy, options) { var _this; _classCallCheck(this, AsyncBisector); _this = _super.call(this); _this.source = source; _this.strategy = strategy; _this.options = options; _this.partsIterator = null; _this.firstPart = null; _this.secondPart = null; _this.currentIdx = 0; return _this; } _createClass(AsyncBisector, [{ key: "setupFirst", value: function () { var _setupFirst = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee() { var source, strategy, options, step; return _regeneratorRuntime.wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: source = this.source, strategy = this.strategy, options = this.options; this.partsIterator = this.partsIterator || new AsyncPartsIterator(source, strategy, options); if (this.firstPart) { _context.next = 7; break; } _context.next = 5; return this.partsIterator.next(); case 5: step = _context.sent; this.firstPart = step.done ? [] : step.value; case 7: case "end": return _context.stop(); } } }, _callee, this); })); function setupFirst() { return _setupFirst.apply(this, arguments); } return setupFirst; }() }, { key: "next", value: function next() { var self = this; switch (this.currentIdx++) { case 0: return { value: _wrapAsyncGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee2() { return _regeneratorRuntime.wrap(function _callee2$(_context2) { while (1) { switch (_context2.prev = _context2.next) { case 0: _context2.next = 2; return _awaitAsyncGenerator(self.setupFirst()); case 2: return _context2.delegateYield(_asyncGeneratorDelegate(_asyncIterator(self.firstPart), _awaitAsyncGenerator), "t0", 3); case 3: case "end": return _context2.stop(); } } }, _callee2); }))(), done: false }; case 1: return { value: _wrapAsyncGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee3() { var step; return _regeneratorRuntime.wrap(function _callee3$(_context3) { while (1) { switch (_context3.prev = _context3.next) { case 0: _context3.next = 2; return _awaitAsyncGenerator(self.setupFirst()); case 2: _context3.next = 4; return _awaitAsyncGenerator(self.partsIterator.next()); case 4: step = _context3.sent; self.secondPart = step.done ? [] : step.value; return _context3.delegateYield(_asyncGeneratorDelegate(_asyncIterator(self.secondPart), _awaitAsyncGenerator), "t0", 7); case 7: case "end": return _context3.stop(); } } }, _callee3); }))(), done: false }; default: return { value: undefined, done: true }; } } }, { key: "return", value: function _return() { if (this.currentIdx === 1) { throw new Error('You must take both parts of a bisector or neither.'); } return { value: undefined, done: true }; } }]); return AsyncBisector; }(IterableIterator); exports.AsyncBisector = AsyncBisector; },{"./async-parts-iterator.js":482,"./iterable-iterator.js":492,"@babel/runtime/helpers/asyncGeneratorDelegate":41,"@babel/runtime/helpers/asyncIterator":42,"@babel/runtime/helpers/asyncToGenerator":43,"@babel/runtime/helpers/awaitAsyncGenerator":44,"@babel/runtime/helpers/classCallCheck":45,"@babel/runtime/helpers/createClass":47,"@babel/runtime/helpers/getPrototypeOf":50,"@babel/runtime/helpers/inherits":51,"@babel/runtime/helpers/possibleConstructorReturn":57,"@babel/runtime/helpers/wrapAsyncGenerator":64,"@babel/runtime/regenerator":65}],477:[function(require,module,exports){ var _regeneratorRuntime = require("@babel/runtime/regenerator"); var _asyncToGenerator = require("@babel/runtime/helpers/asyncToGenerator"); var _createClass = require("@babel/runtime/helpers/createClass"); var _inherits = require("@babel/runtime/helpers/inherits"); var _possibleConstructorReturn = require("@babel/runtime/helpers/possibleConstructorReturn"); var _getPrototypeOf = require("@babel/runtime/helpers/getPrototypeOf"); var _classCallCheck = require("@babel/runtime/helpers/classCallCheck"); function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } } var _require = require('./async-iterable-iterator.js'), AsyncIterableIterator = _require.AsyncIterableIterator; var _require2 = require('./async-iterable.js'), asyncCallReturn = _require2.asyncCallReturn; var QueueItem = function QueueItem(step) { _classCallCheck(this, QueueItem); this.step = step; this.next = null; }; var AsyncFork = /*#__PURE__*/function (_AsyncIterableIterato) { _inherits(AsyncFork, _AsyncIterableIterato); var _super = _createSuper(AsyncFork); function AsyncFork(head, exchange) { var _this; _classCallCheck(this, AsyncFork); _this = _super.call(this); _this.head = head; _this.done = false; _this.exchange = exchange; return _this; } _createClass(AsyncFork, [{ key: "next", value: function () { var _next = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee() { var done, exchange, head, _head, step; return _regeneratorRuntime.wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: done = this.done, exchange = this.exchange; if (!done) { _context.next = 5; break; } return _context.abrupt("return", { value: undefined, done: done }); case 5: head = this.head; if (head.next) { _context.next = 9; break; } _context.next = 9; return exchange.fetch(); case 9: head = head.next; _head = head, step = _head.step; this.done = step.done; this.head = head; return _context.abrupt("return", step); case 14: case "end": return _context.stop(); } } }, _callee, this); })); function next() { return _next.apply(this, arguments); } return next; }() }, { key: "return", value: function () { var _return2 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee2() { var done, exchange; return _regeneratorRuntime.wrap(function _callee2$(_context2) { while (1) { switch (_context2.prev = _context2.next) { case 0: done = this.done, exchange = this.exchange; if (done) { _context2.next = 4; break; } _context2.next = 4; return exchange["return"](); case 4: return _context2.abrupt("return", { value: undefined, done: true }); case 5: case "end": return _context2.stop(); } } }, _callee2, this); })); function _return() { return _return2.apply(this, arguments); } return _return; }() }]); return AsyncFork; }(AsyncIterableIterator); var AsyncExchange = /*#__PURE__*/function () { function AsyncExchange(iterator) { _classCallCheck(this, AsyncExchange); this.iterator = iterator; this.tail = new QueueItem(null); this.head = this.tail; this.forks = 0; } _createClass(AsyncExchange, [{ key: "fork", value: function fork() { ++this.forks; return new AsyncFork(this.tail, this); } }, { key: "advance", value: function advance() { this.tail = this.tail.next; } }, { key: "fetch", value: function () { var _fetch = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee3() { var step, newItem; return _regeneratorRuntime.wrap(function _callee3$(_context3) { while (1) { switch (_context3.prev = _context3.next) { case 0: _context3.next = 2; return this.iterator.next(); case 2: step = _context3.sent; newItem = new QueueItem(step); this.head.next = this.head = newItem; case 5: case "end": return _context3.stop(); } } }, _callee3, this); })); function fetch() { return _fetch.apply(this, arguments); } return fetch; }() }, { key: "return", value: function () { var _return3 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee4() { return _regeneratorRuntime.wrap(function _callee4$(_context4) { while (1) { switch (_context4.prev = _context4.next) { case 0: --this.forks; if (!(this.forks === 0)) { _context4.next = 4; break; } _context4.next = 4; return asyncCallReturn(this.iterator); case 4: return _context4.abrupt("return", { value: undefined, done: true }); case 5: case "end": return _context4.stop(); } } }, _callee4, this); })); function _return() { return _return3.apply(this, arguments); } return _return; }() }]); return AsyncExchange; }(); exports.AsyncExchange = AsyncExchange; },{"./async-iterable-iterator.js":479,"./async-iterable.js":480,"@babel/runtime/helpers/asyncToGenerator":43,"@babel/runtime/helpers/classCallCheck":45,"@babel/runtime/helpers/createClass":47,"@babel/runtime/helpers/getPrototypeOf":50,"@babel/runtime/helpers/inherits":51,"@babel/runtime/helpers/possibleConstructorReturn":57,"@babel/runtime/regenerator":65}],478:[function(require,module,exports){ var _regeneratorRuntime = require("@babel/runtime/regenerator"); var _asyncToGenerator = require("@babel/runtime/helpers/asyncToGenerator"); var _classCallCheck = require("@babel/runtime/helpers/classCallCheck"); var _createClass = require("@babel/runtime/helpers/createClass"); var _inherits = require("@babel/runtime/helpers/inherits"); var _possibleConstructorReturn = require("@babel/runtime/helpers/possibleConstructorReturn"); var _getPrototypeOf = require("@babel/runtime/helpers/getPrototypeOf"); function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } } var _require = require('./async-parts-iterator.js'), AsyncPartsIterator = _require.AsyncPartsIterator, AsyncPartIterator = _require.AsyncPartIterator; var _require2 = require('./symbols.js'), split = _require2.split; var AsyncGroupsIterator = /*#__PURE__*/function (_AsyncPartsIterator) { _inherits(AsyncGroupsIterator, _AsyncPartsIterator); var _super = _createSuper(AsyncGroupsIterator); function AsyncGroupsIterator() { _classCallCheck(this, AsyncGroupsIterator); return _super.apply(this, arguments); } _createClass(AsyncGroupsIterator, [{ key: "next", value: function () { var _next = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee() { var spliterator, key; return _regeneratorRuntime.wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: if (this.initialized) { _context.next = 3; break; } _context.next = 3; return this.init(); case 3: spliterator = this.spliterator; if (!(this.currentPart !== null)) { _context.next = 12; break; } if (!(spliterator.value !== split || spliterator.current === this.splitStep)) { _context.next = 12; break; } this.currentPart.inactive = true; case 7: if (!(!spliterator.done && spliterator.value !== split)) { _context.next = 12; break; } _context.next = 10; return spliterator.advance(); case 10: _context.next = 7; break; case 12: if (!spliterator.done) { _context.next = 14; break; } return _context.abrupt("return", { value: undefined, done: true }); case 14: _context.next = 16; return spliterator.advance(); case 16: if (!(spliterator.done || spliterator.value === split)) { _context.next = 18; break; } throw new Error('Unexpected empty group'); case 18: key = spliterator.value; _context.next = 21; return spliterator.advance(); case 21: this.splitStep = spliterator.current; this.currentPart = new AsyncPartIterator(this); return _context.abrupt("return", { value: [key, this.currentPart], done: false }); case 24: case "end": return _context.stop(); } } }, _callee, this); })); function next() { return _next.apply(this, arguments); } return next; }() }]); return AsyncGroupsIterator; }(AsyncPartsIterator); exports.AsyncGroupsIterator = AsyncGroupsIterator; },{"./async-parts-iterator.js":482,"./symbols.js":498,"@babel/runtime/helpers/asyncToGenerator":43,"@babel/runtime/helpers/classCallCheck":45,"@babel/runtime/helpers/createClass":47,"@babel/runtime/helpers/getPrototypeOf":50,"@babel/runtime/helpers/inherits":51,"@babel/runtime/helpers/possibleConstructorReturn":57,"@babel/runtime/regenerator":65}],479:[function(require,module,exports){ var _classCallCheck = require("@babel/runtime/helpers/classCallCheck"); var _createClass = require("@babel/runtime/helpers/createClass"); var AsyncIterableIterator = /*#__PURE__*/function () { function AsyncIterableIterator() { _classCallCheck(this, AsyncIterableIterator); } _createClass(AsyncIterableIterator, [{ key: Symbol.asyncIterator, value: function value() { return this; } }]); return AsyncIterableIterator; }(); exports.AsyncIterableIterator = AsyncIterableIterator; },{"@babel/runtime/helpers/classCallCheck":45,"@babel/runtime/helpers/createClass":47}],480:[function(require,module,exports){ var _regeneratorRuntime = require("@babel/runtime/regenerator"); var _asyncToGenerator = require("@babel/runtime/helpers/asyncToGenerator"); var _defineProperty = require("@babel/runtime/helpers/defineProperty"); var _asyncIterator = require("@babel/runtime/helpers/asyncIterator"); var _require = require('../impls/is-async-iterable/is-async-iterable.js'), isAsyncIterable = _require.isAsyncIterable; var _require2 = require('../impls/is-async-loopable/is-async-loopable.js'), isAsyncLoopable = _require2.isAsyncLoopable; var _require3 = require('../impls/is-async-wrappable/is-async-wrappable.js'), isAsyncWrappable = _require3.isAsyncWrappable; var _require4 = require('./async-wrap.js'), asyncWrap = _require4.asyncNullableWrap; var _require5 = require('./iterable.js'), BaseIterableIterator = _require5.BaseIterableIterator, IterableIterator = _require5.IterableIterator; var _require6 = require('./curry.js'), variadicCurryWithValidation = _require6.variadicCurryWithValidation; var _require7 = require('./symbols.js'), __iterate = _require7.__iterate; exports.asyncWrap = asyncWrap; exports.asyncIsIterable = isAsyncIterable; exports.asyncIsLoopable = isAsyncLoopable; exports.asyncIsWrappable = isAsyncWrappable; function asyncCallReturn(_x) { return _asyncCallReturn.apply(this, arguments); } function _asyncCallReturn() { _asyncCallReturn = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(iterator) { return _regeneratorRuntime.wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: if (!('return' in iterator)) { _context.next = 3; break; } _context.next = 3; return iterator["return"](); case 3: case "end": return _context.stop(); } } }, _callee); })); return _asyncCallReturn.apply(this, arguments); } exports.asyncCallReturn = asyncCallReturn; function asyncEnsureIterable(value) { if (!isAsyncWrappable(value)) { if (typeof value.next === 'function') { throw new TypeError('iter-tools received a value that looked like an iterator but was not async iterable. Get help fixing this: https://github.com/iter-tools/iter-tools/wiki/Making-iterators-iterable#async-iterators'); } else throw new TypeError('Expected an async iterable, sync iterable, null or undefined'); } else if (isAsyncIterable(value)) { return value; } else { return asyncWrap(value); } } exports.asyncEnsureIterable = asyncEnsureIterable; function AsyncIterableIterator() { for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } BaseIterableIterator.apply(this, args); } exports.AsyncIterableIterator = AsyncIterableIterator; AsyncIterableIterator.prototype = Object.assign(Object.create(BaseIterableIterator.prototype), _defineProperty({ constructor: AsyncIterableIterator }, Symbol.asyncIterator, function () { return this[__iterate](); })); function makeFunctionConfig(fn) { var fnConfig = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; var _fnConfig$validateArg = fnConfig.validateArgs, validateArgs = _fnConfig$validateArg === void 0 ? function (_) {} : _fnConfig$validateArg, _fnConfig$variadic = fnConfig.variadic, variadic = _fnConfig$variadic === void 0 ? false : _fnConfig$variadic, _fnConfig$reduces = fnConfig.reduces, reduces = _fnConfig$reduces === void 0 ? false : _fnConfig$reduces, _fnConfig$growRight = fnConfig.growRight, growRight = _fnConfig$growRight === void 0 ? false : _fnConfig$growRight, _fnConfig$minArgs = fnConfig.minArgs, minArgs = _fnConfig$minArgs === void 0 ? fn.length - 1 : _fnConfig$minArgs, _fnConfig$maxArgs = fnConfig.maxArgs, maxArgs = _fnConfig$maxArgs === void 0 ? fn.length - 1 : _fnConfig$maxArgs, _fnConfig$forceSync = fnConfig.forceSync, forceSync = _fnConfig$forceSync === void 0 ? false : _fnConfig$forceSync, _fnConfig$applyOnIter = fnConfig.applyOnIterableArgs, applyOnIterableArgs = _fnConfig$applyOnIter === void 0 ? asyncEnsureIterable : _fnConfig$applyOnIter; return { fn: fn, validateArgs: validateArgs, variadic: variadic, reduces: reduces, growRight: growRight, minArgs: minArgs, maxArgs: maxArgs, isIterable: isAsyncWrappable, iterableType: 'asyncIterable', applyOnIterableArgs: applyOnIterableArgs, IterableClass: forceSync ? IterableIterator : AsyncIterableIterator }; } function asyncCache(_x2) { return _asyncCache.apply(this, arguments); } function _asyncCache() { _asyncCache = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee2(it) { var arr, _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, _value, value; return _regeneratorRuntime.wrap(function _callee2$(_context2) { while (1) { switch (_context2.prev = _context2.next) { case 0: arr = []; _iteratorNormalCompletion = true; _didIteratorError = false; _context2.prev = 3; _iterator = _asyncIterator(it); case 5: _context2.next = 7; return _iterator.next(); case 7: _step = _context2.sent; _iteratorNormalCompletion = _step.done; _context2.next = 11; return _step.value; case 11: _value = _context2.sent; if (_iteratorNormalCompletion) { _context2.next = 18; break; } value = _value; arr.push(value); case 15: _iteratorNormalCompletion = true; _context2.next = 5; break; case 18: _context2.next = 24; break; case 20: _context2.prev = 20; _context2.t0 = _context2["catch"](3); _didIteratorError = true; _iteratorError = _context2.t0; case 24: _context2.prev = 24; _context2.prev = 25; if (!(!_iteratorNormalCompletion && _iterator["return"] != null)) { _context2.next = 29; break; } _context2.next = 29; return _iterator["return"](); case 29: _context2.prev = 29; if (!_didIteratorError) { _context2.next = 32; break; } throw _iteratorError; case 32: return _context2.finish(29); case 33: return _context2.finish(24); case 34: return _context2.abrupt("return", asyncWrapWithIterableIterator(asyncWrap)(arr)); case 35: case "end": return _context2.stop(); } } }, _callee2, null, [[3, 20, 24, 34], [25,, 29, 33]]); })); return _asyncCache.apply(this, arguments); } exports.asyncCache = asyncCache; function asyncWrapWithIterableIterator(fn) { var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, _ref$validateArgs = _ref.validateArgs, validateArgs = _ref$validateArgs === void 0 ? function (_) { return _; } : _ref$validateArgs; return function () { for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { args[_key2] = arguments[_key2]; } validateArgs(args); return new AsyncIterableIterator(fn, args); }; } exports.asyncWrapWithIterableIterator = asyncWrapWithIterableIterator; var asyncIterableCurry = function asyncIterableCurry(fn, config) { return variadicCurryWithValidation(makeFunctionConfig(fn, config)); }; exports.asyncIterableCurry = asyncIterableCurry; },{"../impls/is-async-iterable/is-async-iterable.js":433,"../impls/is-async-loopable/is-async-loopable.js":434,"../impls/is-async-wrappable/is-async-wrappable.js":435,"./async-wrap.js":484,"./curry.js":488,"./iterable.js":493,"./symbols.js":498,"@babel/runtime/helpers/asyncIterator":42,"@babel/runtime/helpers/asyncToGenerator":43,"@babel/runtime/helpers/defineProperty":48,"@babel/runtime/regenerator":65}],481:[function(require,module,exports){ var _regeneratorRuntime = require("@babel/runtime/regenerator"); var _marked = /*#__PURE__*/_regeneratorRuntime.mark(map); function _createForOfIteratorHelper(o, allowArrayLike) { var it; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; } function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } function map(iterable, cb) { var _iterator, _step, value; return _regeneratorRuntime.wrap(function map$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: _iterator = _createForOfIteratorHelper(iterable); _context.prev = 1; _iterator.s(); case 3: if ((_step = _iterator.n()).done) { _context.next = 9; break; } value = _step.value; _context.next = 7; return cb(value); case 7: _context.next = 3; break; case 9: _context.next = 14; break; case 11: _context.prev = 11; _context.t0 = _context["catch"](1); _iterator.e(_context.t0); case 14: _context.prev = 14; _iterator.f(); return _context.finish(14); case 17: case "end": return _context.stop(); } } }, _marked, null, [[1, 11, 14, 17]]); } function asyncParallelEach(iterable, cb) { return Promise.all(map(iterable, cb)); } exports.asyncParallelEach = asyncParallelEach; },{"@babel/runtime/regenerator":65}],482:[function(require,module,exports){ var _regeneratorRuntime = require("@babel/runtime/regenerator"); var _asyncToGenerator = require("@babel/runtime/helpers/asyncToGenerator"); var _classCallCheck = require("@babel/runtime/helpers/classCallCheck"); var _createClass = require("@babel/runtime/helpers/createClass"); var _inherits = require("@babel/runtime/helpers/inherits"); var _possibleConstructorReturn = require("@babel/runtime/helpers/possibleConstructorReturn"); var _getPrototypeOf = require("@babel/runtime/helpers/getPrototypeOf"); function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } } var _require = require('./symbols.js'), split = _require.split; var _require2 = require('./async-iterable-iterator.js'), AsyncIterableIterator = _require2.AsyncIterableIterator; var _require3 = require('./async-peekerator.js'), AsyncPeekerator = _require3.AsyncPeekerator; var AsyncPartIterator = /*#__PURE__*/function (_AsyncIterableIterato) { _inherits(AsyncPartIterator, _AsyncIterableIterato); var _super = _createSuper(AsyncPartIterator); function AsyncPartIterator(partsIterator) { var _this; _classCallCheck(this, AsyncPartIterator); _this = _super.call(this); _this.partsIterator = partsIterator; _this.inactive = false; _this.done = false; return _this; } _createClass(AsyncPartIterator, [{ key: "assertActive", value: function assertActive() { if (this.inactive && !this.done) { throw new Error('Cannot take from this split part. It is no longer the active part.'); } } }, { key: "next", value: function () { var _next = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee() { var spliterator, current; return _regeneratorRuntime.wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: spliterator = this.partsIterator.spliterator; current = spliterator.current; this.assertActive(); if (!(this.done || current.done || current.value === split)) { _context.next = 10; break; } this.done = true; _context.next = 7; return this.partsIterator.maybeReturnSource(); case 7: return _context.abrupt("return", { value: undefined, done: true }); case 10: _context.next = 12; return spliterator.advance(); case 12: return _context.abrupt("return", current); case 13: case "end": return _context.stop(); } } }, _callee, this); })); function next() { return _next.apply(this, arguments); } return next; }() }, { key: "return", value: function () { var _return2 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee2() { return _regeneratorRuntime.wrap(function _callee2$(_context2) { while (1) { switch (_context2.prev = _context2.next) { case 0: this.done = true; _context2.next = 3; return this.partsIterator.maybeReturnSource(); case 3: return _context2.abrupt("return", { value: undefined, done: true }); case 4: case "end": return _context2.stop(); } } }, _callee2, this); })); function _return() { return _return2.apply(this, arguments); } return _return; }() }, { key: "throw", value: function () { var _throw2 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee3() { return _regeneratorRuntime.wrap(function _callee3$(_context3) { while (1) { switch (_context3.prev = _context3.next) { case 0: _context3.next = 2; return this["return"](); case 2: return _context3.abrupt("return", _context3.sent); case 3: case "end": return _context3.stop(); } } }, _callee3, this); })); function _throw() { return _throw2.apply(this, arguments); } return _throw; }() }]); return AsyncPartIterator; }(AsyncIterableIterator); exports.AsyncPartIterator = AsyncPartIterator; var AsyncPartsIterator = /*#__PURE__*/function (_AsyncIterableIterato2) { _inherits(AsyncPartsIterator, _AsyncIterableIterato2); var _super2 = _createSuper(AsyncPartsIterator); function AsyncPartsIterator(source, strategy, options) { var _this2; _classCallCheck(this, AsyncPartsIterator); _this2 = _super2.call(this); _this2.source = source; _this2.strategy = strategy; _this2.options = options; _this2.initialized = false; _this2.returned = false; _this2.spliterator = null; _this2.currentPart = null; _this2.splitStep = null; return _this2; } _createClass(AsyncPartsIterator, [{ key: "init", value: function () { var _init = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee4() { var source, strategy, options; return _regeneratorRuntime.wrap(function _callee4$(_context4) { while (1) { switch (_context4.prev = _context4.next) { case 0: this.initialized = true; source = this.source, strategy = this.strategy, options = this.options; _context4.next = 4; return AsyncPeekerator.from(strategy(split, options, source)); case 4: this.spliterator = _context4.sent; case 5: case "end": return _context4.stop(); } } }, _callee4, this); })); function init() { return _init.apply(this, arguments); } return init; }() }, { key: "maybeReturnSource", value: function () { var _maybeReturnSource = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee5() { return _regeneratorRuntime.wrap(function _callee5$(_context5) { while (1) { switch (_context5.prev = _context5.next) { case 0: if (!(this.spliterator && this.returned && this.currentPart.done)) { _context5.next = 3; break; } _context5.next = 3; return this.spliterator["return"](); case 3: case "end": return _context5.stop(); } } }, _callee5, this); })); function maybeReturnSource() { return _maybeReturnSource.apply(this, arguments); } return maybeReturnSource; }() }, { key: "next", value: function () { var _next2 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee6() { var spliterator; return _regeneratorRuntime.wrap(function _callee6$(_context6) { while (1) { switch (_context6.prev = _context6.next) { case 0: if (this.initialized) { _context6.next = 3; break; } _context6.next = 3; return this.init(); case 3: spliterator = this.spliterator; if (!spliterator.done) { _context6.next = 6; break; } return _context6.abrupt("return", { value: undefined, done: true }); case 6: if (!(this.currentPart !== null)) { _context6.next = 16; break; } if (!(spliterator.value !== split || spliterator.current === this.splitStep)) { _context6.next = 14; break; } this.currentPart.inactive = true; case 9: if (!(!spliterator.done && spliterator.value !== split)) { _context6.next = 14; break; } _context6.next = 12; return spliterator.advance(); case 12: _context6.next = 9; break; case 14: _context6.next = 16; return spliterator.advance(); case 16: this.splitStep = spliterator.current; this.currentPart = new AsyncPartIterator(this); return _context6.abrupt("return", { value: this.currentPart, done: false }); case 19: case "end": return _context6.stop(); } } }, _callee6, this); })); function next() { return _next2.apply(this, arguments); } return next; }() }, { key: "return", value: function () { var _return3 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee7(value) { return _regeneratorRuntime.wrap(function _callee7$(_context7) { while (1) { switch (_context7.prev = _context7.next) { case 0: this.returned = true; _context7.next = 3; return this.maybeReturnSource(); case 3: return _context7.abrupt("return", { value: value, done: true }); case 4: case "end": return _context7.stop(); } } }, _callee7, this); })); function _return(_x) { return _return3.apply(this, arguments); } return _return; }() }, { key: "throw", value: function () { var _throw3 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee8() { return _regeneratorRuntime.wrap(function _callee8$(_context8) { while (1) { switch (_context8.prev = _context8.next) { case 0: _context8.next = 2; return this["return"](); case 2: return _context8.abrupt("return", _context8.sent); case 3: case "end": return _context8.stop(); } } }, _callee8, this); })); function _throw() { return _throw3.apply(this, arguments); } return _throw; }() }]); return AsyncPartsIterator; }(AsyncIterableIterator); exports.AsyncPartsIterator = AsyncPartsIterator; },{"./async-iterable-iterator.js":479,"./async-peekerator.js":483,"./symbols.js":498,"@babel/runtime/helpers/asyncToGenerator":43,"@babel/runtime/helpers/classCallCheck":45,"@babel/runtime/helpers/createClass":47,"@babel/runtime/helpers/getPrototypeOf":50,"@babel/runtime/helpers/inherits":51,"@babel/runtime/helpers/possibleConstructorReturn":57,"@babel/runtime/regenerator":65}],483:[function(require,module,exports){ var _construct = require("@babel/runtime/helpers/construct"); var _regeneratorRuntime = require("@babel/runtime/regenerator"); var _asyncToGenerator = require("@babel/runtime/helpers/asyncToGenerator"); var _classCallCheck = require("@babel/runtime/helpers/classCallCheck"); var _createClass = require("@babel/runtime/helpers/createClass"); var _require = require('./async-iterable.js'), asyncEnsureIterable = _require.asyncEnsureIterable, asyncCallReturn = _require.asyncCallReturn; var _ = Symbol["for"]('_'); var AsyncPeekeratorIterator = /*#__PURE__*/function () { function AsyncPeekeratorIterator(peekr) { _classCallCheck(this, AsyncPeekeratorIterator); this.peekr = peekr; } _createClass(AsyncPeekeratorIterator, [{ key: "next", value: function () { var _next = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee() { var peekr, current; return _regeneratorRuntime.wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: peekr = this.peekr; current = peekr.current; _context.next = 4; return peekr.advance(); case 4: return _context.abrupt("return", current); case 5: case "end": return _context.stop(); } } }, _callee, this); })); function next() { return _next.apply(this, arguments); } return next; }() }, { key: "return", value: function () { var _return2 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee2() { return _regeneratorRuntime.wrap(function _callee2$(_context2) { while (1) { switch (_context2.prev = _context2.next) { case 0: _context2.next = 2; return this.peekr["return"](); case 2: return _context2.abrupt("return", { value: undefined, done: true }); case 3: case "end": return _context2.stop(); } } }, _callee2, this); })); function _return() { return _return2.apply(this, arguments); } return _return; }() }, { key: Symbol.asyncIterator, value: function value() { return this; } }]); return AsyncPeekeratorIterator; }(); var AsyncPeekerator = /*#__PURE__*/function () { _createClass(AsyncPeekerator, null, [{ key: "from", value: function () { var _from = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee3(iterable) { var iterator, first, _len, args, _key, _args3 = arguments; return _regeneratorRuntime.wrap(function _callee3$(_context3) { while (1) { switch (_context3.prev = _context3.next) { case 0: iterator = asyncEnsureIterable(iterable)[Symbol.asyncIterator](); _context3.next = 3; return iterator.next(); case 3: first = _context3.sent; for (_len = _args3.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { args[_key - 1] = _args3[_key]; } return _context3.abrupt("return", _construct(this, [iterator, first].concat(args))); case 6: case "end": return _context3.stop(); } } }, _callee3, this); })); function from(_x) { return _from.apply(this, arguments); } return from; }() }]); function AsyncPeekerator(iterator, first) { _classCallCheck(this, AsyncPeekerator); this[_] = { iterator: iterator, current: first, index: 0 }; } _createClass(AsyncPeekerator, [{ key: "advance", value: function () { var _advance = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee4() { var this_; return _regeneratorRuntime.wrap(function _callee4$(_context4) { while (1) { switch (_context4.prev = _context4.next) { case 0: this_ = this[_]; if (this_.current.done) { _context4.next = 6; break; } this_.index++; _context4.next = 5; return this_.iterator.next(); case 5: this_.current = _context4.sent; case 6: return _context4.abrupt("return", this); case 7: case "end": return _context4.stop(); } } }, _callee4, this); })); function advance() { return _advance.apply(this, arguments); } return advance; }() }, { key: "return", value: function () { var _return3 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee5() { var this_; return _regeneratorRuntime.wrap(function _callee5$(_context5) { while (1) { switch (_context5.prev = _context5.next) { case 0: this_ = this[_]; if (this.done) { _context5.next = 4; break; } _context5.next = 4; return asyncCallReturn(this_.iterator); case 4: this_.current = { value: undefined, done: true }; return _context5.abrupt("return", this); case 6: case "end": return _context5.stop(); } } }, _callee5, this); })); function _return() { return _return3.apply(this, arguments); } return _return; }() }, { key: "asIterator", value: function asIterator() { return new AsyncPeekeratorIterator(this); } }, { key: "current", get: function get() { return this[_].current; } }, { key: "value", get: function get() { return this[_].current.value; } }, { key: "done", get: function get() { return this[_].current.done; } }, { key: "index", get: function get() { return this[_].index; } }]); return AsyncPeekerator; }(); exports.AsyncPeekerator = AsyncPeekerator; },{"./async-iterable.js":480,"@babel/runtime/helpers/asyncToGenerator":43,"@babel/runtime/helpers/classCallCheck":45,"@babel/runtime/helpers/construct":46,"@babel/runtime/helpers/createClass":47,"@babel/runtime/regenerator":65}],484:[function(require,module,exports){ var _regeneratorRuntime = require("@babel/runtime/regenerator"); var _wrapAsyncGenerator = require("@babel/runtime/helpers/wrapAsyncGenerator"); var _awaitAsyncGenerator = require("@babel/runtime/helpers/awaitAsyncGenerator"); var _asyncIterator = require("@babel/runtime/helpers/asyncIterator"); var _asyncGeneratorDelegate = require("@babel/runtime/helpers/asyncGeneratorDelegate"); function asyncWrap(_x) { return _asyncWrap.apply(this, arguments); } exports.asyncWrap = asyncWrap; function _asyncWrap() { _asyncWrap = _wrapAsyncGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(source) { return _regeneratorRuntime.wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: return _context.delegateYield(_asyncGeneratorDelegate(_asyncIterator(source), _awaitAsyncGenerator), "t0", 1); case 1: case "end": return _context.stop(); } } }, _callee); })); return _asyncWrap.apply(this, arguments); } function asyncNullableWrap(_x2) { return _asyncNullableWrap.apply(this, arguments); } exports.asyncNullableWrap = asyncNullableWrap; function _asyncNullableWrap() { _asyncNullableWrap = _wrapAsyncGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee2(source) { return _regeneratorRuntime.wrap(function _callee2$(_context2) { while (1) { switch (_context2.prev = _context2.next) { case 0: if (!(source != null)) { _context2.next = 2; break; } return _context2.delegateYield(_asyncGeneratorDelegate(_asyncIterator(source), _awaitAsyncGenerator), "t0", 2); case 2: case "end": return _context2.stop(); } } }, _callee2); })); return _asyncNullableWrap.apply(this, arguments); } },{"@babel/runtime/helpers/asyncGeneratorDelegate":41,"@babel/runtime/helpers/asyncIterator":42,"@babel/runtime/helpers/awaitAsyncGenerator":44,"@babel/runtime/helpers/wrapAsyncGenerator":64,"@babel/runtime/regenerator":65}],485:[function(require,module,exports){ var _regeneratorRuntime = require("@babel/runtime/regenerator"); var _classCallCheck = require("@babel/runtime/helpers/classCallCheck"); var _createClass = require("@babel/runtime/helpers/createClass"); var _inherits = require("@babel/runtime/helpers/inherits"); var _possibleConstructorReturn = require("@babel/runtime/helpers/possibleConstructorReturn"); var _getPrototypeOf = require("@babel/runtime/helpers/getPrototypeOf"); function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } } var _require = require('./iterable-iterator.js'), IterableIterator = _require.IterableIterator; var _require2 = require('./parts-iterator.js'), PartsIterator = _require2.PartsIterator; var Bisector = /*#__PURE__*/function (_IterableIterator) { _inherits(Bisector, _IterableIterator); var _super = _createSuper(Bisector); function Bisector(source, strategy, options) { var _this; _classCallCheck(this, Bisector); _this = _super.call(this); _this.source = source; _this.strategy = strategy; _this.options = options; _this.partsIterator = null; _this.firstPart = null; _this.secondPart = null; _this.currentIdx = 0; return _this; } _createClass(Bisector, [{ key: "setupFirst", value: function setupFirst() { var source = this.source, strategy = this.strategy, options = this.options; this.partsIterator = this.partsIterator || new PartsIterator(source, strategy, options); if (!this.firstPart) { var step = this.partsIterator.next(); this.firstPart = step.done ? [] : step.value; } } }, { key: "next", value: function next() { var self = this; switch (this.currentIdx++) { case 0: return { value: /*#__PURE__*/_regeneratorRuntime.mark(function _callee() { return _regeneratorRuntime.wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: self.setupFirst(); return _context.delegateYield(self.firstPart, "t0", 2); case 2: case "end": return _context.stop(); } } }, _callee); })(), done: false }; case 1: return { value: /*#__PURE__*/_regeneratorRuntime.mark(function _callee2() { var step; return _regeneratorRuntime.wrap(function _callee2$(_context2) { while (1) { switch (_context2.prev = _context2.next) { case 0: self.setupFirst(); step = self.partsIterator.next(); self.secondPart = step.done ? [] : step.value; return _context2.delegateYield(self.secondPart, "t0", 4); case 4: case "end": return _context2.stop(); } } }, _callee2); })(), done: false }; default: return { value: undefined, done: true }; } } }, { key: "return", value: function _return() { if (this.currentIdx === 1) { throw new Error('You must take both parts of a bisector or neither.'); } return { value: undefined, done: true }; } }]); return Bisector; }(IterableIterator); exports.Bisector = Bisector; },{"./iterable-iterator.js":492,"./parts-iterator.js":496,"@babel/runtime/helpers/classCallCheck":45,"@babel/runtime/helpers/createClass":47,"@babel/runtime/helpers/getPrototypeOf":50,"@babel/runtime/helpers/inherits":51,"@babel/runtime/helpers/possibleConstructorReturn":57,"@babel/runtime/regenerator":65}],486:[function(require,module,exports){ var _regeneratorRuntime = require("@babel/runtime/regenerator"); var _classCallCheck = require("@babel/runtime/helpers/classCallCheck"); var _createClass = require("@babel/runtime/helpers/createClass"); var _sourceBuffer = Symbol('sourceBuffer'); var ReadOnlyCircularBuffer = /*#__PURE__*/function () { function ReadOnlyCircularBuffer(sourceBuffer) { _classCallCheck(this, ReadOnlyCircularBuffer); this[_sourceBuffer] = sourceBuffer; } _createClass(ReadOnlyCircularBuffer, [{ key: "get", value: function get(idx) { return this[_sourceBuffer].get(idx); } }, { key: "peek", value: function peek() { return this[_sourceBuffer].peek(); } }, { key: "isFull", value: function isFull() { return this[_sourceBuffer].isFull(); } }, { key: Symbol.iterator, value: function value() { return this[_sourceBuffer][Symbol.iterator](); } }, { key: "size", get: function get() { return this[_sourceBuffer].size; } }, { key: "capacity", get: function get() { return this[_sourceBuffer].capacity; } }]); return ReadOnlyCircularBuffer; }(); exports.ReadOnlyCircularBuffer = ReadOnlyCircularBuffer; var CircularBuffer = /*#__PURE__*/function () { function CircularBuffer(size) { _classCallCheck(this, CircularBuffer); this._array = new Array(size); this._head = size - 1; this.size = 0; } _createClass(CircularBuffer, [{ key: "push", value: function push(value) { var array = this._array; var head = this._head = (this._head + 1) % array.length; var displacedValue = array[head]; array[head] = value; if (this.isFull()) { return displacedValue; } else { this.size++; return undefined; } } }, { key: "shift", value: function shift() { if (!this.size) return undefined; var value = this.get(0); this.size--; return value; } }, { key: "peek", value: function peek() { return this.get(0); } }, { key: "fill", value: function fill(filler) { this._array.fill(filler); this.size = this._array.length; } }, { key: "get", value: function get(idx) { if (idx >= this.size) return undefined; var array = this._array; var head = this._head; var index = (array.length + head - this.size + 1 + idx) % array.length; return array[index]; } }, { key: "isFull", value: function isFull() { return this.size === this._array.length; } }, { key: Symbol.iterator, value: /*#__PURE__*/_regeneratorRuntime.mark(function value() { var i; return _regeneratorRuntime.wrap(function value$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: i = 0; case 1: if (!(i < this.size)) { _context.next = 7; break; } _context.next = 4; return this.get(i); case 4: i++; _context.next = 1; break; case 7: case "end": return _context.stop(); } } }, value, this); }) }, { key: "capacity", get: function get() { return this._array.length; } }]); return CircularBuffer; }(); exports.CircularBuffer = CircularBuffer; },{"@babel/runtime/helpers/classCallCheck":45,"@babel/runtime/helpers/createClass":47,"@babel/runtime/regenerator":65}],487:[function(require,module,exports){ function defaultCompareOrder(a, b) { if (a > b) { return 1; } else if (a < b) { return -1; } else { return 0; } } exports.defaultCompareOrder = defaultCompareOrder; },{}],488:[function(require,module,exports){ var _toConsumableArray = require("@babel/runtime/helpers/toConsumableArray"); function curry(fn) { var expectedArgsLength = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : fn.length; var appliedArgs = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : []; return function () { for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } if (expectedArgsLength <= args.length) { return fn.apply(void 0, _toConsumableArray(appliedArgs).concat(args)); } return curry(fn, expectedArgsLength - args.length, [].concat(_toConsumableArray(appliedArgs), args)); }; } exports.curry = curry; function variadicCurryWithValidationInner(config, args) { var fn = config.fn, validateArgs = config.validateArgs, variadic = config.variadic, reduces = config.reduces, growRight = config.growRight, minArgs = config.minArgs, maxArgs = config.maxArgs, isIterable = config.isIterable, iterableType = config.iterableType, applyOnIterableArgs = config.applyOnIterableArgs, IterableClass = config.IterableClass; if (args.length > minArgs) { var argsIterable = true; var iterableArgsStart = variadic ? args.findIndex(function (arg, i) { return isIterable(arg) && i >= minArgs; }) : Math.min(maxArgs, args.length - 1); var iterableArgsEnd = variadic ? args.length : iterableArgsStart + 1; if (variadic) { for (var i = iterableArgsStart; i < args.length; i++) { argsIterable = argsIterable && isIterable(args[i]); } } else { argsIterable = isIterable(args[iterableArgsStart]); } if (args.length > maxArgs && (iterableArgsStart === -1 || !argsIterable)) { var iterableTypeOrNames = variadic ? "...".concat(iterableType, "s") : iterableType; var baseMessage = "".concat(fn.name, " takes up to ").concat(maxArgs, " arguments, followed by ").concat(iterableTypeOrNames, ". ") + "You already passed ".concat(args.length, " arguments"); if (variadic) { throw new Error("".concat(baseMessage, " and the following arguments were not all ").concat(iterableType, "s")); } else { throw new Error("".concat(baseMessage, " and the last argument was not ").concat(iterableType)); } } if (iterableArgsStart >= 0 && argsIterable) { for (var _i = iterableArgsStart; _i < iterableArgsEnd; _i++) { args[_i] = applyOnIterableArgs(args[_i]); } var iterablesArg = variadic ? args.slice(iterableArgsStart) : args[iterableArgsStart]; args.splice(iterableArgsStart); if (!growRight) { args.reverse(); } args.unshift(iterablesArg); validateArgs(args); return reduces ? fn.apply(void 0, _toConsumableArray(args)) : new IterableClass(fn, args); } else {} } return variadicCurryWithValidation(config, args); } function variadicCurryWithValidation(config) { var previousArgs = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : []; return function () { for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { args[_key2] = arguments[_key2]; } if (args.length === 0) { throw new Error('Cannot make a partial application with no arguments'); } args.unshift.apply(args, _toConsumableArray(previousArgs)); return variadicCurryWithValidationInner(config, args); }; } exports.variadicCurryWithValidation = variadicCurryWithValidation; },{"@babel/runtime/helpers/toConsumableArray":61}],489:[function(require,module,exports){ function delay(ms, output) { return new Promise(function (resolve, reject) { return setTimeout(function () { if (output instanceof Error) { reject(output); } else { resolve(output); } }, ms); }); } exports.delay = delay; },{}],490:[function(require,module,exports){ var _createClass = require("@babel/runtime/helpers/createClass"); var _inherits = require("@babel/runtime/helpers/inherits"); var _possibleConstructorReturn = require("@babel/runtime/helpers/possibleConstructorReturn"); var _getPrototypeOf = require("@babel/runtime/helpers/getPrototypeOf"); var _classCallCheck = require("@babel/runtime/helpers/classCallCheck"); function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } } var _require = require('./iterable-iterator.js'), IterableIterator = _require.IterableIterator; var _require2 = require('./iterable.js'), callReturn = _require2.callReturn; var QueueItem = function QueueItem(step) { _classCallCheck(this, QueueItem); this.step = step; this.next = null; }; var Fork = /*#__PURE__*/function (_IterableIterator) { _inherits(Fork, _IterableIterator); var _super = _createSuper(Fork); function Fork(head, exchange) { var _this; _classCallCheck(this, Fork); _this = _super.call(this); _this.head = head; _this.done = false; _this.exchange = exchange; return _this; } _createClass(Fork, [{ key: "next", value: function next() { var done = this.done, exchange = this.exchange; if (done) { return { value: undefined, done: done }; } else { var head = this.head; if (!head.next) exchange.fetch(); head = head.next; var _head = head, step = _head.step; this.done = step.done; this.head = head; return step; } } }, { key: "return", value: function _return() { var done = this.done, exchange = this.exchange; if (!done) exchange["return"](); return { value: undefined, done: true }; } }]); return Fork; }(IterableIterator); var Exchange = /*#__PURE__*/function () { function Exchange(iterator) { _classCallCheck(this, Exchange); this.iterator = iterator; this.tail = new QueueItem(null); this.head = this.tail; this.forks = 0; } _createClass(Exchange, [{ key: "fork", value: function fork() { ++this.forks; return new Fork(this.tail, this); } }, { key: "advance", value: function advance() { this.tail = this.tail.next; } }, { key: "fetch", value: function fetch() { var step = this.iterator.next(); var newItem = new QueueItem(step); this.head.next = this.head = newItem; } }, { key: "return", value: function _return() { --this.forks; if (this.forks === 0) { callReturn(this.iterator); } return { value: undefined, done: true }; } }]); return Exchange; }(); exports.Exchange = Exchange; },{"./iterable-iterator.js":492,"./iterable.js":493,"@babel/runtime/helpers/classCallCheck":45,"@babel/runtime/helpers/createClass":47,"@babel/runtime/helpers/getPrototypeOf":50,"@babel/runtime/helpers/inherits":51,"@babel/runtime/helpers/possibleConstructorReturn":57}],491:[function(require,module,exports){ var _classCallCheck = require("@babel/runtime/helpers/classCallCheck"); var _createClass = require("@babel/runtime/helpers/createClass"); var _inherits = require("@babel/runtime/helpers/inherits"); var _possibleConstructorReturn = require("@babel/runtime/helpers/possibleConstructorReturn"); var _getPrototypeOf = require("@babel/runtime/helpers/getPrototypeOf"); function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } } var _require = require('./parts-iterator.js'), PartsIterator = _require.PartsIterator, PartIterator = _require.PartIterator; var _require2 = require('./symbols.js'), split = _require2.split; var GroupsIterator = /*#__PURE__*/function (_PartsIterator) { _inherits(GroupsIterator, _PartsIterator); var _super = _createSuper(GroupsIterator); function GroupsIterator() { _classCallCheck(this, GroupsIterator); return _super.apply(this, arguments); } _createClass(GroupsIterator, [{ key: "next", value: function next() { if (!this.initialized) this.init(); var spliterator = this.spliterator; if (this.currentPart !== null) { if (spliterator.value !== split || spliterator.current === this.splitStep) { this.currentPart.inactive = true; while (!spliterator.done && spliterator.value !== split) { spliterator.advance(); } } } if (spliterator.done) { return { value: undefined, done: true }; } spliterator.advance(); if (spliterator.done || spliterator.value === split) { throw new Error('Unexpected empty group'); } var key = spliterator.value; spliterator.advance(); this.splitStep = spliterator.current; this.currentPart = new PartIterator(this); return { value: [key, this.currentPart], done: false }; } }]); return GroupsIterator; }(PartsIterator); exports.GroupsIterator = GroupsIterator; },{"./parts-iterator.js":496,"./symbols.js":498,"@babel/runtime/helpers/classCallCheck":45,"@babel/runtime/helpers/createClass":47,"@babel/runtime/helpers/getPrototypeOf":50,"@babel/runtime/helpers/inherits":51,"@babel/runtime/helpers/possibleConstructorReturn":57}],492:[function(require,module,exports){ var _classCallCheck = require("@babel/runtime/helpers/classCallCheck"); var _createClass = require("@babel/runtime/helpers/createClass"); var IterableIterator = /*#__PURE__*/function () { function IterableIterator() { _classCallCheck(this, IterableIterator); } _createClass(IterableIterator, [{ key: Symbol.iterator, value: function value() { return this; } }]); return IterableIterator; }(); exports.IterableIterator = IterableIterator; },{"@babel/runtime/helpers/classCallCheck":45,"@babel/runtime/helpers/createClass":47}],493:[function(require,module,exports){ var _defineProperty = require("@babel/runtime/helpers/defineProperty"); var _toConsumableArray = require("@babel/runtime/helpers/toConsumableArray"); var _Object$assign; var _require = require('../impls/is-iterable/is-iterable.js'), isIterable = _require.isIterable; var _require2 = require('../impls/is-loopable/is-loopable.js'), isLoopable = _require2.isLoopable; var _require3 = require('../impls/is-wrappable/is-wrappable.js'), isWrappable = _require3.isWrappable; var _require4 = require('./wrap.js'), wrap = _require4.nullableWrap; var _require5 = require('./curry.js'), variadicCurryWithValidation = _require5.variadicCurryWithValidation; var _require6 = require('./symbols.js'), _ = _require6._, __iterate = _require6.__iterate; exports.wrap = wrap; exports.isIterable = isIterable; exports.isLoopable = isLoopable; exports.isWrappable = isWrappable; function ensureIterable(value) { if (!isWrappable(value)) { if (typeof value.next === 'function') { throw new TypeError('iter-tools received a value that looked like an iterator but was not iterable. Get help fixing this: https://github.com/iter-tools/iter-tools/wiki/Making-iterators-iterable'); } else throw new TypeError('Expected an iterable, null, or undefined'); } else if (isIterable(value)) { return value; } else { return wrap(value); } } exports.ensureIterable = ensureIterable; function callReturn(iterator) { if ('return' in iterator) iterator["return"](); } exports.callReturn = callReturn; function BaseIterableIterator(fn, args) { this[_] = { fn: fn, args: args, staticIterator: null }; } exports.BaseIterableIterator = BaseIterableIterator; Object.assign(BaseIterableIterator.prototype, (_Object$assign = { constructor: BaseIterableIterator }, _defineProperty(_Object$assign, __iterate, function () { var _this$_ = this[_], fn = _this$_.fn, args = _this$_.args; return fn.apply(void 0, _toConsumableArray(args)); }), _defineProperty(_Object$assign, "next", function next() { var this_ = this[_]; this_.staticIterator = this_.staticIterator || this[__iterate](); return this_.staticIterator.next(); }), _defineProperty(_Object$assign, "return", function _return(value) { var this_ = this[_]; this_.staticIterator = this_.staticIterator || this[__iterate](); return this_.staticIterator["return"](value); }), _defineProperty(_Object$assign, "throw", function _throw(error) { var this_ = this[_]; this_.staticIterator = this_.staticIterator || this[__iterate](); return this_.staticIterator["throw"](error); }), _Object$assign)); function IterableIterator() { for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } BaseIterableIterator.apply(this, args); } exports.IterableIterator = IterableIterator; IterableIterator.prototype = Object.assign(Object.create(BaseIterableIterator.prototype), _defineProperty({ constructor: IterableIterator }, Symbol.iterator, function () { return this[__iterate](); })); function makeFunctionConfig(fn) { var fnConfig = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; var _fnConfig$validateArg = fnConfig.validateArgs, validateArgs = _fnConfig$validateArg === void 0 ? function (_) {} : _fnConfig$validateArg, _fnConfig$variadic = fnConfig.variadic, variadic = _fnConfig$variadic === void 0 ? false : _fnConfig$variadic, _fnConfig$reduces = fnConfig.reduces, reduces = _fnConfig$reduces === void 0 ? false : _fnConfig$reduces, _fnConfig$growRight = fnConfig.growRight, growRight = _fnConfig$growRight === void 0 ? false : _fnConfig$growRight, _fnConfig$minArgs = fnConfig.minArgs, minArgs = _fnConfig$minArgs === void 0 ? fn.length - 1 : _fnConfig$minArgs, _fnConfig$maxArgs = fnConfig.maxArgs, maxArgs = _fnConfig$maxArgs === void 0 ? fn.length - 1 : _fnConfig$maxArgs, _fnConfig$applyOnIter = fnConfig.applyOnIterableArgs, applyOnIterableArgs = _fnConfig$applyOnIter === void 0 ? ensureIterable : _fnConfig$applyOnIter; return { fn: fn, validateArgs: validateArgs, variadic: variadic, reduces: reduces, growRight: growRight, minArgs: minArgs, maxArgs: maxArgs, isIterable: isWrappable, iterableType: 'iterable', applyOnIterableArgs: applyOnIterableArgs, IterableClass: IterableIterator }; } function cache(it) { return _toConsumableArray(it); } exports.cache = cache; function wrapWithIterableIterator(fn) { var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, _ref$validateArgs = _ref.validateArgs, validateArgs = _ref$validateArgs === void 0 ? function (_) { return _; } : _ref$validateArgs; return function () { for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { args[_key2] = arguments[_key2]; } validateArgs(args); return new IterableIterator(fn, args); }; } exports.wrapWithIterableIterator = wrapWithIterableIterator; var iterableCurry = function iterableCurry(fn, config) { return variadicCurryWithValidation(makeFunctionConfig(fn, config)); }; exports.iterableCurry = iterableCurry; },{"../impls/is-iterable/is-iterable.js":436,"../impls/is-loopable/is-loopable.js":437,"../impls/is-wrappable/is-wrappable.js":443,"./curry.js":488,"./symbols.js":498,"./wrap.js":499,"@babel/runtime/helpers/defineProperty":48,"@babel/runtime/helpers/toConsumableArray":61}],494:[function(require,module,exports){ function isInteger(value) { var nonZero = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; return typeof value === 'number' && !isNaN(value) && isFinite(value) && !(nonZero && value === 0); } exports.isInteger = isInteger; function isPositiveInteger(value) { var nonZero = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; return isInteger(value) && (nonZero ? value > 0 : value >= 0); } exports.isPositiveInteger = isPositiveInteger; function isIntegerOrInfinite(value) { var nonZero = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; return typeof value === 'number' && !isNaN(value) && !(nonZero && value === 0); } exports.isIntegerOrInfinite = isIntegerOrInfinite; },{}],495:[function(require,module,exports){ function _createForOfIteratorHelper(o, allowArrayLike) { var it; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; } function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } function parallelEach(iterable, cb) { var _iterator = _createForOfIteratorHelper(iterable), _step; try { for (_iterator.s(); !(_step = _iterator.n()).done;) { var value = _step.value; cb(value); } } catch (err) { _iterator.e(err); } finally { _iterator.f(); } } exports.parallelEach = parallelEach; },{}],496:[function(require,module,exports){ var _classCallCheck = require("@babel/runtime/helpers/classCallCheck"); var _createClass = require("@babel/runtime/helpers/createClass"); var _inherits = require("@babel/runtime/helpers/inherits"); var _possibleConstructorReturn = require("@babel/runtime/helpers/possibleConstructorReturn"); var _getPrototypeOf = require("@babel/runtime/helpers/getPrototypeOf"); function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } } var _require = require('./symbols.js'), split = _require.split; var _require2 = require('./iterable-iterator.js'), IterableIterator = _require2.IterableIterator; var _require3 = require('./peekerator.js'), Peekerator = _require3.Peekerator; var PartIterator = /*#__PURE__*/function (_IterableIterator) { _inherits(PartIterator, _IterableIterator); var _super = _createSuper(PartIterator); function PartIterator(partsIterator) { var _this; _classCallCheck(this, PartIterator); _this = _super.call(this); _this.partsIterator = partsIterator; _this.inactive = false; _this.done = false; return _this; } _createClass(PartIterator, [{ key: "assertActive", value: function assertActive() { if (this.inactive && !this.done) { throw new Error('Cannot take from this split part. It is no longer the active part.'); } } }, { key: "next", value: function next() { var spliterator = this.partsIterator.spliterator; var current = spliterator.current; this.assertActive(); if (this.done || current.done || current.value === split) { this.done = true; this.partsIterator.maybeReturnSource(); return { value: undefined, done: true }; } else { spliterator.advance(); return current; } } }, { key: "return", value: function _return() { this.done = true; this.partsIterator.maybeReturnSource(); return { value: undefined, done: true }; } }, { key: "throw", value: function _throw() { return this["return"](); } }]); return PartIterator; }(IterableIterator); exports.PartIterator = PartIterator; var PartsIterator = /*#__PURE__*/function (_IterableIterator2) { _inherits(PartsIterator, _IterableIterator2); var _super2 = _createSuper(PartsIterator); function PartsIterator(source, strategy, options) { var _this2; _classCallCheck(this, PartsIterator); _this2 = _super2.call(this); _this2.source = source; _this2.strategy = strategy; _this2.options = options; _this2.initialized = false; _this2.returned = false; _this2.spliterator = null; _this2.currentPart = null; _this2.splitStep = null; return _this2; } _createClass(PartsIterator, [{ key: "init", value: function init() { this.initialized = true; var source = this.source, strategy = this.strategy, options = this.options; this.spliterator = Peekerator.from(strategy(split, options, source)); } }, { key: "maybeReturnSource", value: function maybeReturnSource() { if (this.spliterator && this.returned && this.currentPart.done) { this.spliterator["return"](); } } }, { key: "next", value: function next() { if (!this.initialized) this.init(); var spliterator = this.spliterator; if (spliterator.done) { return { value: undefined, done: true }; } if (this.currentPart !== null) { if (spliterator.value !== split || spliterator.current === this.splitStep) { this.currentPart.inactive = true; while (!spliterator.done && spliterator.value !== split) { spliterator.advance(); } } spliterator.advance(); } this.splitStep = spliterator.current; this.currentPart = new PartIterator(this); return { value: this.currentPart, done: false }; } }, { key: "return", value: function _return(value) { this.returned = true; this.maybeReturnSource(); return { value: value, done: true }; } }, { key: "throw", value: function _throw() { return this["return"](); } }]); return PartsIterator; }(IterableIterator); exports.PartsIterator = PartsIterator; },{"./iterable-iterator.js":492,"./peekerator.js":497,"./symbols.js":498,"@babel/runtime/helpers/classCallCheck":45,"@babel/runtime/helpers/createClass":47,"@babel/runtime/helpers/getPrototypeOf":50,"@babel/runtime/helpers/inherits":51,"@babel/runtime/helpers/possibleConstructorReturn":57}],497:[function(require,module,exports){ var _construct = require("@babel/runtime/helpers/construct"); var _classCallCheck = require("@babel/runtime/helpers/classCallCheck"); var _createClass = require("@babel/runtime/helpers/createClass"); var _require = require('./iterable.js'), ensureIterable = _require.ensureIterable, callReturn = _require.callReturn; var _ = Symbol["for"]('_'); var PeekeratorIterator = /*#__PURE__*/function () { function PeekeratorIterator(peekr) { _classCallCheck(this, PeekeratorIterator); this.peekr = peekr; } _createClass(PeekeratorIterator, [{ key: "next", value: function next() { var peekr = this.peekr; var current = peekr.current; peekr.advance(); return current; } }, { key: "return", value: function _return() { this.peekr["return"](); return { value: undefined, done: true }; } }, { key: Symbol.iterator, value: function value() { return this; } }]); return PeekeratorIterator; }(); var Peekerator = /*#__PURE__*/function () { _createClass(Peekerator, null, [{ key: "from", value: function from(iterable) { var iterator = ensureIterable(iterable)[Symbol.iterator](); var first = iterator.next(); for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { args[_key - 1] = arguments[_key]; } return _construct(this, [iterator, first].concat(args)); } }]); function Peekerator(iterator, first) { _classCallCheck(this, Peekerator); this[_] = { iterator: iterator, current: first, index: 0 }; } _createClass(Peekerator, [{ key: "advance", value: function advance() { var this_ = this[_]; if (!this_.current.done) { this_.index++; this_.current = this_.iterator.next(); } return this; } }, { key: "return", value: function _return() { var this_ = this[_]; if (!this.done) { callReturn(this_.iterator); } this_.current = { value: undefined, done: true }; return this; } }, { key: "asIterator", value: function asIterator() { return new PeekeratorIterator(this); } }, { key: "current", get: function get() { return this[_].current; } }, { key: "value", get: function get() { return this[_].current.value; } }, { key: "done", get: function get() { return this[_].current.done; } }, { key: "index", get: function get() { return this[_].index; } }]); return Peekerator; }(); exports.Peekerator = Peekerator; },{"./iterable.js":493,"@babel/runtime/helpers/classCallCheck":45,"@babel/runtime/helpers/construct":46,"@babel/runtime/helpers/createClass":47}],498:[function(require,module,exports){ var _ = Symbol["for"]('_'); exports._ = _; var __iterate = Symbol('__iterate'); exports.__iterate = __iterate; var split = Symbol('split'); exports.split = split; },{}],499:[function(require,module,exports){ var _regeneratorRuntime = require("@babel/runtime/regenerator"); var _marked = /*#__PURE__*/_regeneratorRuntime.mark(wrap), _marked2 = /*#__PURE__*/_regeneratorRuntime.mark(nullableWrap); function wrap(source) { return _regeneratorRuntime.wrap(function wrap$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: return _context.delegateYield(source, "t0", 1); case 1: case "end": return _context.stop(); } } }, _marked); } exports.wrap = wrap; function nullableWrap(source) { return _regeneratorRuntime.wrap(function nullableWrap$(_context2) { while (1) { switch (_context2.prev = _context2.next) { case 0: if (!(source != null)) { _context2.next = 2; break; } return _context2.delegateYield(source, "t0", 2); case 2: case "end": return _context2.stop(); } } }, _marked2); } exports.nullableWrap = nullableWrap; },{"@babel/runtime/regenerator":65}],500:[function(require,module,exports){ module.exports = require('../impls/$append/append.js').append; },{"../impls/$append/append.js":256}],501:[function(require,module,exports){ module.exports = require('../impls/apply/apply.js').apply; },{"../impls/apply/apply.js":414}],502:[function(require,module,exports){ module.exports = require('../impls/array-first-or/array-first-or.js').arrayFirstOr; },{"../impls/array-first-or/array-first-or.js":415}],503:[function(require,module,exports){ module.exports = require('../impls/array-first/array-first.js').arrayFirst; },{"../impls/array-first/array-first.js":416}],504:[function(require,module,exports){ module.exports = require('../impls/array-from-async/array-from-async.js').arrayFromAsync; },{"../impls/array-from-async/array-from-async.js":417}],505:[function(require,module,exports){ module.exports = require('../impls/array-from/array-from.js').arrayFrom; },{"../impls/array-from/array-from.js":418}],506:[function(require,module,exports){ module.exports = require('../impls/array-last-or/array-last-or.js').arrayLastOr; },{"../impls/array-last-or/array-last-or.js":419}],507:[function(require,module,exports){ module.exports = require('../impls/array-last/array-last.js').arrayLast; },{"../impls/array-last/array-last.js":420}],508:[function(require,module,exports){ module.exports = require('../impls/array-reverse/array-reverse.js').arrayReverse; },{"../impls/array-reverse/array-reverse.js":421}],509:[function(require,module,exports){ module.exports = require('../impls/$append/async-append.js').asyncAppend; },{"../impls/$append/async-append.js":257}],510:[function(require,module,exports){ module.exports = require('../impls/$batch/async-batch.js').asyncBatch; },{"../impls/$batch/async-batch.js":258}],511:[function(require,module,exports){ module.exports = require('../impls/$bisect/async-bisect.js').asyncBisect; },{"../impls/$bisect/async-bisect.js":260}],512:[function(require,module,exports){ module.exports = require('../impls/async-buffer/async-buffer.js').asyncBuffer; },{"../impls/async-buffer/async-buffer.js":422}],513:[function(require,module,exports){ module.exports = require('../impls/$collate/async-collate.js').asyncCollate; },{"../impls/$collate/async-collate.js":262}],514:[function(require,module,exports){ module.exports = require('../impls/$compress/async-compress.js').asyncCompress; },{"../impls/$compress/async-compress.js":264}],515:[function(require,module,exports){ module.exports = require('../impls/$concat/async-concat.js').asyncConcat; },{"../impls/$concat/async-concat.js":266}],516:[function(require,module,exports){ module.exports = require('../impls/$consume/async-consume.js').asyncConsume; },{"../impls/$consume/async-consume.js":268}],517:[function(require,module,exports){ module.exports = require('../impls/$cycle-times/async-cycle-times.js').asyncCycleTimes; },{"../impls/$cycle-times/async-cycle-times.js":270}],518:[function(require,module,exports){ module.exports = require('../impls/$cycle/async-cycle.js').asyncCycle; },{"../impls/$cycle/async-cycle.js":272}],519:[function(require,module,exports){ module.exports = require('../impls/$deep-equal/async-deep-equal.js').asyncDeepEqual; },{"../impls/$deep-equal/async-deep-equal.js":274}],520:[function(require,module,exports){ module.exports = require('../impls/$distinct/async-distinct.js').asyncDistinct; },{"../impls/$distinct/async-distinct.js":276}],521:[function(require,module,exports){ module.exports = require('../impls/$drop-while/async-drop-while.js').asyncDropWhile; },{"../impls/$drop-while/async-drop-while.js":278}],522:[function(require,module,exports){ module.exports = require('../impls/$drop/async-drop.js').asyncDrop; },{"../impls/$drop/async-drop.js":280}],523:[function(require,module,exports){ module.exports = require('../impls/$enumerate/async-enumerate.js').asyncEnumerate; },{"../impls/$enumerate/async-enumerate.js":282}],524:[function(require,module,exports){ module.exports = require('../impls/$equal/async-equal.js').asyncEqual; },{"../impls/$equal/async-equal.js":284}],525:[function(require,module,exports){ module.exports = require('../impls/$every/async-every.js').asyncEvery; },{"../impls/$every/async-every.js":286}],526:[function(require,module,exports){ module.exports = require('../impls/$filter/async-filter.js').asyncFilter; },{"../impls/$filter/async-filter.js":288}],527:[function(require,module,exports){ module.exports = require('../impls/$find-best-or/async-find-best-or.js').asyncFindBestOr; },{"../impls/$find-best-or/async-find-best-or.js":290}],528:[function(require,module,exports){ module.exports = require('../impls/$find-best/async-find-best.js').asyncFindBest; },{"../impls/$find-best/async-find-best.js":292}],529:[function(require,module,exports){ module.exports = require('../impls/$find-or/async-find-or.js').asyncFindOr; },{"../impls/$find-or/async-find-or.js":294}],530:[function(require,module,exports){ module.exports = require('../impls/$find/async-find.js').asyncFind; },{"../impls/$find/async-find.js":296}],531:[function(require,module,exports){ module.exports = require('../impls/$first-or/async-first-or.js').asyncFirstOr; },{"../impls/$first-or/async-first-or.js":298}],532:[function(require,module,exports){ module.exports = require('../impls/$first/async-first.js').asyncFirst; },{"../impls/$first/async-first.js":300}],533:[function(require,module,exports){ module.exports = require('../impls/$flat-map/async-flat-map.js').asyncFlatMap; },{"../impls/$flat-map/async-flat-map.js":302}],534:[function(require,module,exports){ module.exports = require('../impls/$flat/async-flat.js').asyncFlat; },{"../impls/$flat/async-flat.js":304}],535:[function(require,module,exports){ module.exports = require('../impls/$for-each/async-for-each.js').asyncForEach; },{"../impls/$for-each/async-for-each.js":307}],536:[function(require,module,exports){ module.exports = require('../impls/$fork/async-fork.js').asyncFork; },{"../impls/$fork/async-fork.js":309}],537:[function(require,module,exports){ module.exports = require('../impls/$forkerate/async-forkerate.js').asyncForkerate; },{"../impls/$forkerate/async-forkerate.js":311}],538:[function(require,module,exports){ module.exports = require('../impls/$includes-any-seq/async-includes-any-seq.js').asyncIncludesAnySeq; },{"../impls/$includes-any-seq/async-includes-any-seq.js":313}],539:[function(require,module,exports){ module.exports = require('../impls/$includes-any/async-includes-any.js').asyncIncludesAny; },{"../impls/$includes-any/async-includes-any.js":315}],540:[function(require,module,exports){ module.exports = require('../impls/$includes-seq/async-includes-seq.js').asyncIncludesSeq; },{"../impls/$includes-seq/async-includes-seq.js":317}],541:[function(require,module,exports){ module.exports = require('../impls/$includes/async-includes.js').asyncIncludes; },{"../impls/$includes/async-includes.js":319}],542:[function(require,module,exports){ module.exports = require('../impls/async-interleave-ready/async-interleave-ready.js').asyncInterleaveReady; },{"../impls/async-interleave-ready/async-interleave-ready.js":423}],543:[function(require,module,exports){ module.exports = require('../impls/$interleave/async-interleave.js').asyncInterleave; },{"../impls/$interleave/async-interleave.js":321}],544:[function(require,module,exports){ module.exports = require('../impls/$interpose-seq/async-interpose-seq.js').asyncInterposeSeq; },{"../impls/$interpose-seq/async-interpose-seq.js":323}],545:[function(require,module,exports){ module.exports = require('../impls/$interpose/async-interpose.js').asyncInterpose; },{"../impls/$interpose/async-interpose.js":325}],546:[function(require,module,exports){ module.exports = require('../impls/$is-empty/async-is-empty.js').asyncIsEmpty; },{"../impls/$is-empty/async-is-empty.js":327}],547:[function(require,module,exports){ module.exports = require('../impls/$is-sorted/async-is-sorted.js').asyncIsSorted; },{"../impls/$is-sorted/async-is-sorted.js":329}],548:[function(require,module,exports){ module.exports = require('../impls/$join-with-seq/async-join-with-seq.js').asyncJoinWithSeq; },{"../impls/$join-with-seq/async-join-with-seq.js":331}],549:[function(require,module,exports){ module.exports = require('../impls/$join-with/async-join-with.js').asyncJoinWith; },{"../impls/$join-with/async-join-with.js":333}],550:[function(require,module,exports){ module.exports = require('../impls/$join/async-join.js').asyncJoin; },{"../impls/$join/async-join.js":335}],551:[function(require,module,exports){ module.exports = require('../impls/$map/async-map.js').asyncMap; },{"../impls/$map/async-map.js":337}],552:[function(require,module,exports){ module.exports = require('../impls/$peekerate/async-peekerate.js').asyncPeekerate; },{"../impls/$peekerate/async-peekerate.js":339}],553:[function(require,module,exports){ module.exports = require('../impls/$prepend/async-prepend.js').asyncPrepend; },{"../impls/$prepend/async-prepend.js":341}],554:[function(require,module,exports){ module.exports = require('../impls/$reduce/async-reduce.js').asyncReduce; },{"../impls/$reduce/async-reduce.js":343}],555:[function(require,module,exports){ module.exports = require('../impls/$reverse/async-reverse.js').asyncReverse; },{"../impls/$reverse/async-reverse.js":345}],556:[function(require,module,exports){ module.exports = require('../impls/$round-robin/async-round-robin.js').asyncRoundRobin; },{"../impls/$round-robin/async-round-robin.js":347}],557:[function(require,module,exports){ module.exports = require('../impls/$size/async-size.js').asyncSize; },{"../impls/$size/async-size.js":350}],558:[function(require,module,exports){ module.exports = require('../impls/$slice/async-slice.js').asyncSlice; },{"../impls/$slice/async-slice.js":352}],559:[function(require,module,exports){ module.exports = require('../impls/$some/async-some.js').asyncSome; },{"../impls/$some/async-some.js":355}],560:[function(require,module,exports){ module.exports = require('../impls/$split-groups/async-split-groups.js').asyncSplitGroups; },{"../impls/$split-groups/async-split-groups.js":357}],561:[function(require,module,exports){ module.exports = require('../impls/$split-on-any-seq/async-split-on-any-seq.js').asyncSplitOnAnySeq; },{"../impls/$split-on-any-seq/async-split-on-any-seq.js":359}],562:[function(require,module,exports){ module.exports = require('../impls/$split-on-any/async-split-on-any.js').asyncSplitOnAny; },{"../impls/$split-on-any/async-split-on-any.js":361}],563:[function(require,module,exports){ module.exports = require('../impls/$split-on-seq/async-split-on-seq.js').asyncSplitOnSeq; },{"../impls/$split-on-seq/async-split-on-seq.js":363}],564:[function(require,module,exports){ module.exports = require('../impls/$split-on/async-split-on.js').asyncSplitOn; },{"../impls/$split-on/async-split-on.js":365}],565:[function(require,module,exports){ module.exports = require('../impls/$split-when/async-split-when.js').asyncSplitWhen; },{"../impls/$split-when/async-split-when.js":367}],566:[function(require,module,exports){ module.exports = require('../impls/$split/async-split.js').asyncSplit; },{"../impls/$split/async-split.js":369}],567:[function(require,module,exports){ module.exports = require('../impls/$spliterate-grouped/async-spliterate-grouped.js').asyncSpliterateGrouped; },{"../impls/$spliterate-grouped/async-spliterate-grouped.js":371}],568:[function(require,module,exports){ module.exports = require('../impls/$spliterate/async-spliterate.js').asyncSpliterate; },{"../impls/$spliterate/async-spliterate.js":373}],569:[function(require,module,exports){ module.exports = require('../impls/$starts-with-any-seq/async-starts-with-any-seq.js').asyncStartsWithAnySeq; },{"../impls/$starts-with-any-seq/async-starts-with-any-seq.js":375}],570:[function(require,module,exports){ module.exports = require('../impls/$starts-with-any/async-starts-with-any.js').asyncStartsWithAny; },{"../impls/$starts-with-any/async-starts-with-any.js":377}],571:[function(require,module,exports){ module.exports = require('../impls/$starts-with-seq/async-starts-with-seq.js').asyncStartsWithSeq; },{"../impls/$starts-with-seq/async-starts-with-seq.js":379}],572:[function(require,module,exports){ module.exports = require('../impls/$starts-with/async-starts-with.js').asyncStartsWith; },{"../impls/$starts-with/async-starts-with.js":381}],573:[function(require,module,exports){ module.exports = require('../impls/$str/async-str.js').asyncStr; },{"../impls/$str/async-str.js":383}],574:[function(require,module,exports){ module.exports = require('../impls/$take-last-or/async-take-last-or.js').asyncTakeLastOr; },{"../impls/$take-last-or/async-take-last-or.js":385}],575:[function(require,module,exports){ module.exports = require('../impls/$take-last/async-take-last.js').asyncTakeLast; },{"../impls/$take-last/async-take-last.js":387}],576:[function(require,module,exports){ module.exports = require('../impls/$take-sorted/async-take-sorted.js').asyncTakeSorted; },{"../impls/$take-sorted/async-take-sorted.js":389}],577:[function(require,module,exports){ module.exports = require('../impls/$take-while/async-take-while.js').asyncTakeWhile; },{"../impls/$take-while/async-take-while.js":392}],578:[function(require,module,exports){ module.exports = require('../impls/$take/async-take.js').asyncTake; },{"../impls/$take/async-take.js":394}],579:[function(require,module,exports){ module.exports = require('../impls/$tap/async-tap.js').asyncTap; },{"../impls/$tap/async-tap.js":396}],580:[function(require,module,exports){ module.exports = require('../impls/async-throttle/async-throttle.js').asyncThrottle; },{"../impls/async-throttle/async-throttle.js":425}],581:[function(require,module,exports){ module.exports = require('../impls/$to-array/async-to-array.js').asyncToArray; },{"../impls/$to-array/async-to-array.js":398}],582:[function(require,module,exports){ module.exports = require('../impls/$to-object/async-to-object.js').asyncToObject; },{"../impls/$to-object/async-to-object.js":400}],583:[function(require,module,exports){ module.exports = require('../impls/$window-ahead/async-window-ahead.js').asyncWindowAhead; },{"../impls/$window-ahead/async-window-ahead.js":402}],584:[function(require,module,exports){ module.exports = require('../impls/$window-behind/async-window-behind.js').asyncWindowBehind; },{"../impls/$window-behind/async-window-behind.js":404}],585:[function(require,module,exports){ module.exports = require('../impls/$window/async-window.js').asyncWindow; },{"../impls/$window/async-window.js":406}],586:[function(require,module,exports){ module.exports = require('../impls/$wrap/async-wrap.js').asyncWrap; },{"../impls/$wrap/async-wrap.js":408}],587:[function(require,module,exports){ module.exports = require('../impls/$zip-all/async-zip-all.js').asyncZipAll; },{"../impls/$zip-all/async-zip-all.js":410}],588:[function(require,module,exports){ module.exports = require('../impls/$zip/async-zip.js').asyncZip; },{"../impls/$zip/async-zip.js":412}],589:[function(require,module,exports){ module.exports = require('../impls/$batch/batch.js').batch; },{"../impls/$batch/batch.js":259}],590:[function(require,module,exports){ module.exports = require('../impls/$bisect/bisect.js').bisect; },{"../impls/$bisect/bisect.js":261}],591:[function(require,module,exports){ module.exports = require('../impls/call/call.js').call; },{"../impls/call/call.js":426}],592:[function(require,module,exports){ module.exports = require('../impls/$collate/collate.js').collate; },{"../impls/$collate/collate.js":263}],593:[function(require,module,exports){ module.exports = require('../impls/compose/compose.js').compose; },{"../impls/compose/compose.js":427}],594:[function(require,module,exports){ module.exports = require('../impls/$compress/compress.js').compress; },{"../impls/$compress/compress.js":265}],595:[function(require,module,exports){ module.exports = require('../impls/$concat/concat.js').concat; },{"../impls/$concat/concat.js":267}],596:[function(require,module,exports){ module.exports = require('../impls/$consume/consume.js').consume; },{"../impls/$consume/consume.js":269}],597:[function(require,module,exports){ module.exports = require('../impls/$cycle-times/cycle-times.js').cycleTimes; },{"../impls/$cycle-times/cycle-times.js":271}],598:[function(require,module,exports){ module.exports = require('../impls/$cycle/cycle.js').cycle; },{"../impls/$cycle/cycle.js":273}],599:[function(require,module,exports){ module.exports = require('../impls/$deep-equal/deep-equal.js').deepEqual; },{"../impls/$deep-equal/deep-equal.js":275}],600:[function(require,module,exports){ module.exports = require('../impls/$distinct/distinct.js').distinct; },{"../impls/$distinct/distinct.js":277}],601:[function(require,module,exports){ module.exports = require('../impls/$drop-while/drop-while.js').dropWhile; },{"../impls/$drop-while/drop-while.js":279}],602:[function(require,module,exports){ module.exports = require('../impls/$drop/drop.js').drop; },{"../impls/$drop/drop.js":281}],603:[function(require,module,exports){ module.exports = require('../impls/$enumerate/enumerate.js').enumerate; },{"../impls/$enumerate/enumerate.js":283}],604:[function(require,module,exports){ module.exports = require('../impls/$equal/equal.js').equal; },{"../impls/$equal/equal.js":285}],605:[function(require,module,exports){ module.exports = require('../impls/$every/every.js').every; },{"../impls/$every/every.js":287}],606:[function(require,module,exports){ module.exports = require('../impls/exec-pipe/exec-pipe.js').execPipe; },{"../impls/exec-pipe/exec-pipe.js":428}],607:[function(require,module,exports){ module.exports = require('../impls/$filter/filter.js').filter; },{"../impls/$filter/filter.js":289}],608:[function(require,module,exports){ module.exports = require('../impls/$find-best-or/find-best-or.js').findBestOr; },{"../impls/$find-best-or/find-best-or.js":291}],609:[function(require,module,exports){ module.exports = require('../impls/$find-best/find-best.js').findBest; },{"../impls/$find-best/find-best.js":293}],610:[function(require,module,exports){ module.exports = require('../impls/$find-or/find-or.js').findOr; },{"../impls/$find-or/find-or.js":295}],611:[function(require,module,exports){ module.exports = require('../impls/$find/find.js').find; },{"../impls/$find/find.js":297}],612:[function(require,module,exports){ module.exports = require('../impls/first-highest/first-highest.js').firstHighest; },{"../impls/first-highest/first-highest.js":429}],613:[function(require,module,exports){ module.exports = require('../impls/first-lowest/first-lowest.js').firstLowest; },{"../impls/first-lowest/first-lowest.js":430}],614:[function(require,module,exports){ module.exports = require('../impls/$first-or/first-or.js').firstOr; },{"../impls/$first-or/first-or.js":299}],615:[function(require,module,exports){ module.exports = require('../impls/$first/first.js').first; },{"../impls/$first/first.js":301}],616:[function(require,module,exports){ module.exports = require('../impls/$flat-map/flat-map.js').flatMap; },{"../impls/$flat-map/flat-map.js":303}],617:[function(require,module,exports){ module.exports = require('../impls/$flat/flat.js').flat; },{"../impls/$flat/flat.js":305}],618:[function(require,module,exports){ module.exports = require('../impls/$for-each/for-each.js').forEach; },{"../impls/$for-each/for-each.js":308}],619:[function(require,module,exports){ module.exports = require('../impls/$fork/fork.js').fork; },{"../impls/$fork/fork.js":310}],620:[function(require,module,exports){ module.exports = require('../impls/$forkerate/forkerate.js').forkerate; },{"../impls/$forkerate/forkerate.js":312}],621:[function(require,module,exports){ module.exports = require('../impls/get-size/get-size.js').getSize; },{"../impls/get-size/get-size.js":431}],622:[function(require,module,exports){ module.exports = require('../impls/$includes-any-seq/includes-any-seq.js').includesAnySeq; },{"../impls/$includes-any-seq/includes-any-seq.js":314}],623:[function(require,module,exports){ module.exports = require('../impls/$includes-any/includes-any.js').includesAny; },{"../impls/$includes-any/includes-any.js":316}],624:[function(require,module,exports){ module.exports = require('../impls/$includes-seq/includes-seq.js').includesSeq; },{"../impls/$includes-seq/includes-seq.js":318}],625:[function(require,module,exports){ module.exports = require('../impls/$includes/includes.js').includes; },{"../impls/$includes/includes.js":320}],626:[function(require,module,exports){ module.exports = require('../impls/$interleave/interleave.js').interleave; },{"../impls/$interleave/interleave.js":322}],627:[function(require,module,exports){ module.exports = require('../impls/$interpose-seq/interpose-seq.js').interposeSeq; },{"../impls/$interpose-seq/interpose-seq.js":324}],628:[function(require,module,exports){ module.exports = require('../impls/$interpose/interpose.js').interpose; },{"../impls/$interpose/interpose.js":326}],629:[function(require,module,exports){ module.exports = require('../impls/is-array/is-array.js').isArray; },{"../impls/is-array/is-array.js":432}],630:[function(require,module,exports){ module.exports = require('../impls/is-async-iterable/is-async-iterable.js').isAsyncIterable; },{"../impls/is-async-iterable/is-async-iterable.js":433}],631:[function(require,module,exports){ module.exports = require('../impls/is-async-loopable/is-async-loopable.js').isAsyncLoopable; },{"../impls/is-async-loopable/is-async-loopable.js":434}],632:[function(require,module,exports){ module.exports = require('../impls/is-async-wrappable/is-async-wrappable.js').isAsyncWrappable; },{"../impls/is-async-wrappable/is-async-wrappable.js":435}],633:[function(require,module,exports){ module.exports = require('../impls/$is-empty/is-empty.js').isEmpty; },{"../impls/$is-empty/is-empty.js":328}],634:[function(require,module,exports){ module.exports = require('../impls/is-iterable/is-iterable.js').isIterable; },{"../impls/is-iterable/is-iterable.js":436}],635:[function(require,module,exports){ module.exports = require('../impls/is-loopable/is-loopable.js').isLoopable; },{"../impls/is-loopable/is-loopable.js":437}],636:[function(require,module,exports){ module.exports = require('../impls/is-nil/is-nil.js').isNil; },{"../impls/is-nil/is-nil.js":438}],637:[function(require,module,exports){ module.exports = require('../impls/is-null/is-null.js').isNull; },{"../impls/is-null/is-null.js":439}],638:[function(require,module,exports){ module.exports = require('../impls/is-object/is-object.js').isObject; },{"../impls/is-object/is-object.js":440}],639:[function(require,module,exports){ module.exports = require('../impls/$is-sorted/is-sorted.js').isSorted; },{"../impls/$is-sorted/is-sorted.js":330}],640:[function(require,module,exports){ module.exports = require('../impls/is-string/is-string.js').isString; },{"../impls/is-string/is-string.js":441}],641:[function(require,module,exports){ module.exports = require('../impls/is-undefined/is-undefined.js').isUndefined; },{"../impls/is-undefined/is-undefined.js":442}],642:[function(require,module,exports){ module.exports = require('../impls/is-wrappable/is-wrappable.js').isWrappable; },{"../impls/is-wrappable/is-wrappable.js":443}],643:[function(require,module,exports){ module.exports = require('../impls/$join-with-seq/join-with-seq.js').joinWithSeq; },{"../impls/$join-with-seq/join-with-seq.js":332}],644:[function(require,module,exports){ module.exports = require('../impls/$join-with/join-with.js').joinWith; },{"../impls/$join-with/join-with.js":334}],645:[function(require,module,exports){ module.exports = require('../impls/$join/join.js').join; },{"../impls/$join/join.js":336}],646:[function(require,module,exports){ module.exports = require('../impls/last-highest/last-highest.js').lastHighest; },{"../impls/last-highest/last-highest.js":444}],647:[function(require,module,exports){ module.exports = require('../impls/last-lowest/last-lowest.js').lastLowest; },{"../impls/last-lowest/last-lowest.js":445}],648:[function(require,module,exports){ module.exports = require('../impls/$map/map.js').map; },{"../impls/$map/map.js":338}],649:[function(require,module,exports){ module.exports = require('../impls/not-array/not-array.js').notArray; },{"../impls/not-array/not-array.js":446}],650:[function(require,module,exports){ module.exports = require('../impls/not-async-iterable/not-async-iterable.js').notAsyncIterable; },{"../impls/not-async-iterable/not-async-iterable.js":447}],651:[function(require,module,exports){ module.exports = require('../impls/not-async-loopable/not-async-loopable.js').notAsyncLoopable; },{"../impls/not-async-loopable/not-async-loopable.js":448}],652:[function(require,module,exports){ module.exports = require('../impls/not-async-wrappable/not-async-wrappable.js').notAsyncWrappable; },{"../impls/not-async-wrappable/not-async-wrappable.js":449}],653:[function(require,module,exports){ module.exports = require('../impls/not-iterable/not-iterable.js').notIterable; },{"../impls/not-iterable/not-iterable.js":450}],654:[function(require,module,exports){ module.exports = require('../impls/not-loopable/not-loopable.js').notLoopable; },{"../impls/not-loopable/not-loopable.js":451}],655:[function(require,module,exports){ module.exports = require('../impls/not-nil/not-nil.js').notNil; },{"../impls/not-nil/not-nil.js":452}],656:[function(require,module,exports){ module.exports = require('../impls/not-null/not-null.js').notNull; },{"../impls/not-null/not-null.js":453}],657:[function(require,module,exports){ module.exports = require('../impls/not-object/not-object.js').notObject; },{"../impls/not-object/not-object.js":454}],658:[function(require,module,exports){ module.exports = require('../impls/not-string/not-string.js').notString; },{"../impls/not-string/not-string.js":455}],659:[function(require,module,exports){ module.exports = require('../impls/not-undefined/not-undefined.js').notUndefined; },{"../impls/not-undefined/not-undefined.js":456}],660:[function(require,module,exports){ module.exports = require('../impls/not-wrappable/not-wrappable.js').notWrappable; },{"../impls/not-wrappable/not-wrappable.js":457}],661:[function(require,module,exports){ module.exports = require('../impls/object-entries/object-entries.js').objectEntries; },{"../impls/object-entries/object-entries.js":458}],662:[function(require,module,exports){ module.exports = require('../impls/object-from-async/object-from-async.js').objectFromAsync; },{"../impls/object-from-async/object-from-async.js":459}],663:[function(require,module,exports){ module.exports = require('../impls/object-from/object-from.js').objectFrom; },{"../impls/object-from/object-from.js":460}],664:[function(require,module,exports){ module.exports = require('../impls/object-keys/object-keys.js').objectKeys; },{"../impls/object-keys/object-keys.js":461}],665:[function(require,module,exports){ module.exports = require('../impls/object-values/object-values.js').objectValues; },{"../impls/object-values/object-values.js":462}],666:[function(require,module,exports){ module.exports = require('../impls/$peekerate/peekerate.js').peekerate; },{"../impls/$peekerate/peekerate.js":340}],667:[function(require,module,exports){ module.exports = require('../impls/pipe/pipe.js').pipe; },{"../impls/pipe/pipe.js":463}],668:[function(require,module,exports){ module.exports = require('../impls/$prepend/prepend.js').prepend; },{"../impls/$prepend/prepend.js":342}],669:[function(require,module,exports){ module.exports = require('../impls/range/range.js').range; },{"../impls/range/range.js":464}],670:[function(require,module,exports){ module.exports = require('../impls/$reduce/reduce.js').reduce; },{"../impls/$reduce/reduce.js":344}],671:[function(require,module,exports){ module.exports = require('../impls/repeat-times/repeat-times.js').repeatTimes; },{"../impls/repeat-times/repeat-times.js":465}],672:[function(require,module,exports){ module.exports = require('../impls/repeat/repeat.js').repeat; },{"../impls/repeat/repeat.js":466}],673:[function(require,module,exports){ module.exports = require('../impls/$reverse/reverse.js').reverse; },{"../impls/$reverse/reverse.js":346}],674:[function(require,module,exports){ module.exports = require('../impls/$round-robin/round-robin.js').roundRobin; },{"../impls/$round-robin/round-robin.js":349}],675:[function(require,module,exports){ module.exports = require('../impls/$size/size.js').size; },{"../impls/$size/size.js":351}],676:[function(require,module,exports){ module.exports = require('../impls/$slice/slice.js').slice; },{"../impls/$slice/slice.js":354}],677:[function(require,module,exports){ module.exports = require('../impls/$some/some.js').some; },{"../impls/$some/some.js":356}],678:[function(require,module,exports){ module.exports = require('../impls/$split-groups/split-groups.js').splitGroups; },{"../impls/$split-groups/split-groups.js":358}],679:[function(require,module,exports){ module.exports = require('../impls/$split-on-any-seq/split-on-any-seq.js').splitOnAnySeq; },{"../impls/$split-on-any-seq/split-on-any-seq.js":360}],680:[function(require,module,exports){ module.exports = require('../impls/$split-on-any/split-on-any.js').splitOnAny; },{"../impls/$split-on-any/split-on-any.js":362}],681:[function(require,module,exports){ module.exports = require('../impls/$split-on-seq/split-on-seq.js').splitOnSeq; },{"../impls/$split-on-seq/split-on-seq.js":364}],682:[function(require,module,exports){ module.exports = require('../impls/$split-on/split-on.js').splitOn; },{"../impls/$split-on/split-on.js":366}],683:[function(require,module,exports){ module.exports = require('../impls/$split-when/split-when.js').splitWhen; },{"../impls/$split-when/split-when.js":368}],684:[function(require,module,exports){ module.exports = require('../impls/$split/split.js').split; },{"../impls/$split/split.js":370}],685:[function(require,module,exports){ module.exports = require('../impls/$spliterate-grouped/spliterate-grouped.js').spliterateGrouped; },{"../impls/$spliterate-grouped/spliterate-grouped.js":372}],686:[function(require,module,exports){ module.exports = require('../impls/$spliterate/spliterate.js').spliterate; },{"../impls/$spliterate/spliterate.js":374}],687:[function(require,module,exports){ module.exports = require('../impls/$starts-with-any-seq/starts-with-any-seq.js').startsWithAnySeq; },{"../impls/$starts-with-any-seq/starts-with-any-seq.js":376}],688:[function(require,module,exports){ module.exports = require('../impls/$starts-with-any/starts-with-any.js').startsWithAny; },{"../impls/$starts-with-any/starts-with-any.js":378}],689:[function(require,module,exports){ module.exports = require('../impls/$starts-with-seq/starts-with-seq.js').startsWithSeq; },{"../impls/$starts-with-seq/starts-with-seq.js":380}],690:[function(require,module,exports){ module.exports = require('../impls/$starts-with/starts-with.js').startsWith; },{"../impls/$starts-with/starts-with.js":382}],691:[function(require,module,exports){ module.exports = require('../impls/$str/str.js').str; },{"../impls/$str/str.js":384}],692:[function(require,module,exports){ module.exports = require('../impls/string-from-async/string-from-async.js').stringFromAsync; },{"../impls/string-from-async/string-from-async.js":467}],693:[function(require,module,exports){ module.exports = require('../impls/string-from/string-from.js').stringFrom; },{"../impls/string-from/string-from.js":468}],694:[function(require,module,exports){ module.exports = require('../impls/$take-last-or/take-last-or.js').takeLastOr; },{"../impls/$take-last-or/take-last-or.js":386}],695:[function(require,module,exports){ module.exports = require('../impls/$take-last/take-last.js').takeLast; },{"../impls/$take-last/take-last.js":388}],696:[function(require,module,exports){ module.exports = require('../impls/$take-sorted/take-sorted.js').takeSorted; },{"../impls/$take-sorted/take-sorted.js":391}],697:[function(require,module,exports){ module.exports = require('../impls/$take-while/take-while.js').takeWhile; },{"../impls/$take-while/take-while.js":393}],698:[function(require,module,exports){ module.exports = require('../impls/$take/take.js').take; },{"../impls/$take/take.js":395}],699:[function(require,module,exports){ module.exports = require('../impls/$tap/tap.js').tap; },{"../impls/$tap/tap.js":397}],700:[function(require,module,exports){ module.exports = require('../impls/$to-array/to-array.js').toArray; },{"../impls/$to-array/to-array.js":399}],701:[function(require,module,exports){ module.exports = require('../impls/$to-object/to-object.js').toObject; },{"../impls/$to-object/to-object.js":401}],702:[function(require,module,exports){ module.exports = require('../impls/when/when.js').when; },{"../impls/when/when.js":469}],703:[function(require,module,exports){ module.exports = require('../impls/$window-ahead/window-ahead.js').windowAhead; },{"../impls/$window-ahead/window-ahead.js":403}],704:[function(require,module,exports){ module.exports = require('../impls/$window-behind/window-behind.js').windowBehind; },{"../impls/$window-behind/window-behind.js":405}],705:[function(require,module,exports){ module.exports = require('../impls/$window/window.js').window; },{"../impls/$window/window.js":407}],706:[function(require,module,exports){ module.exports = require('../impls/wrap-entries/wrap-entries.js').wrapEntries; },{"../impls/wrap-entries/wrap-entries.js":470}],707:[function(require,module,exports){ module.exports = require('../impls/wrap-keys/wrap-keys.js').wrapKeys; },{"../impls/wrap-keys/wrap-keys.js":471}],708:[function(require,module,exports){ module.exports = require('../impls/wrap-values/wrap-values.js').wrapValues; },{"../impls/wrap-values/wrap-values.js":472}],709:[function(require,module,exports){ module.exports = require('../impls/$wrap/wrap.js').wrap; },{"../impls/$wrap/wrap.js":409}],710:[function(require,module,exports){ module.exports = require('../impls/$zip-all/zip-all.js').zipAll; },{"../impls/$zip-all/zip-all.js":411}],711:[function(require,module,exports){ module.exports = require('../impls/$zip/zip.js').zip; },{"../impls/$zip/zip.js":413}],712:[function(require,module,exports){ /* Copyright 2013 Daniel Wirtz Copyright 2009 The Closure Library Authors. All Rights Reserved. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS-IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ /** * @license long.js (c) 2013 Daniel Wirtz * Released under the Apache License, Version 2.0 * see: https://github.com/dcodeIO/long.js for details */ (function(global, factory) { /* AMD */ if (typeof define === 'function' && define["amd"]) define([], factory); /* CommonJS */ else if (typeof require === 'function' && typeof module === "object" && module && module["exports"]) module["exports"] = factory(); /* Global */ else (global["dcodeIO"] = global["dcodeIO"] || {})["Long"] = factory(); })(this, function() { "use strict"; /** * Constructs a 64 bit two's-complement integer, given its low and high 32 bit values as *signed* integers. * See the from* functions below for more convenient ways of constructing Longs. * @exports Long * @class A Long class for representing a 64 bit two's-complement integer value. * @param {number} low The low (signed) 32 bits of the long * @param {number} high The high (signed) 32 bits of the long * @param {boolean=} unsigned Whether unsigned or not, defaults to `false` for signed * @constructor */ function Long(low, high, unsigned) { /** * The low 32 bits as a signed value. * @type {number} */ this.low = low | 0; /** * The high 32 bits as a signed value. * @type {number} */ this.high = high | 0; /** * Whether unsigned or not. * @type {boolean} */ this.unsigned = !!unsigned; } // The internal representation of a long is the two given signed, 32-bit values. // We use 32-bit pieces because these are the size of integers on which // Javascript performs bit-operations. For operations like addition and // multiplication, we split each number into 16 bit pieces, which can easily be // multiplied within Javascript's floating-point representation without overflow // or change in sign. // // In the algorithms below, we frequently reduce the negative case to the // positive case by negating the input(s) and then post-processing the result. // Note that we must ALWAYS check specially whether those values are MIN_VALUE // (-2^63) because -MIN_VALUE == MIN_VALUE (since 2^63 cannot be represented as // a positive number, it overflows back into a negative). Not handling this // case would often result in infinite recursion. // // Common constant values ZERO, ONE, NEG_ONE, etc. are defined below the from* // methods on which they depend. /** * An indicator used to reliably determine if an object is a Long or not. * @type {boolean} * @const * @private */ Long.prototype.__isLong__; Object.defineProperty(Long.prototype, "__isLong__", { value: true, enumerable: false, configurable: false }); /** * @function * @param {*} obj Object * @returns {boolean} * @inner */ function isLong(obj) { return (obj && obj["__isLong__"]) === true; } /** * Tests if the specified object is a Long. * @function * @param {*} obj Object * @returns {boolean} */ Long.isLong = isLong; /** * A cache of the Long representations of small integer values. * @type {!Object} * @inner */ var INT_CACHE = {}; /** * A cache of the Long representations of small unsigned integer values. * @type {!Object} * @inner */ var UINT_CACHE = {}; /** * @param {number} value * @param {boolean=} unsigned * @returns {!Long} * @inner */ function fromInt(value, unsigned) { var obj, cachedObj, cache; if (unsigned) { value >>>= 0; if (cache = (0 <= value && value < 256)) { cachedObj = UINT_CACHE[value]; if (cachedObj) return cachedObj; } obj = fromBits(value, (value | 0) < 0 ? -1 : 0, true); if (cache) UINT_CACHE[value] = obj; return obj; } else { value |= 0; if (cache = (-128 <= value && value < 128)) { cachedObj = INT_CACHE[value]; if (cachedObj) return cachedObj; } obj = fromBits(value, value < 0 ? -1 : 0, false); if (cache) INT_CACHE[value] = obj; return obj; } } /** * Returns a Long representing the given 32 bit integer value. * @function * @param {number} value The 32 bit integer in question * @param {boolean=} unsigned Whether unsigned or not, defaults to `false` for signed * @returns {!Long} The corresponding Long value */ Long.fromInt = fromInt; /** * @param {number} value * @param {boolean=} unsigned * @returns {!Long} * @inner */ function fromNumber(value, unsigned) { if (isNaN(value) || !isFinite(value)) return unsigned ? UZERO : ZERO; if (unsigned) { if (value < 0) return UZERO; if (value >= TWO_PWR_64_DBL) return MAX_UNSIGNED_VALUE; } else { if (value <= -TWO_PWR_63_DBL) return MIN_VALUE; if (value + 1 >= TWO_PWR_63_DBL) return MAX_VALUE; } if (value < 0) return fromNumber(-value, unsigned).neg(); return fromBits((value % TWO_PWR_32_DBL) | 0, (value / TWO_PWR_32_DBL) | 0, unsigned); } /** * Returns a Long representing the given value, provided that it is a finite number. Otherwise, zero is returned. * @function * @param {number} value The number in question * @param {boolean=} unsigned Whether unsigned or not, defaults to `false` for signed * @returns {!Long} The corresponding Long value */ Long.fromNumber = fromNumber; /** * @param {number} lowBits * @param {number} highBits * @param {boolean=} unsigned * @returns {!Long} * @inner */ function fromBits(lowBits, highBits, unsigned) { return new Long(lowBits, highBits, unsigned); } /** * Returns a Long representing the 64 bit integer that comes by concatenating the given low and high bits. Each is * assumed to use 32 bits. * @function * @param {number} lowBits The low 32 bits * @param {number} highBits The high 32 bits * @param {boolean=} unsigned Whether unsigned or not, defaults to `false` for signed * @returns {!Long} The corresponding Long value */ Long.fromBits = fromBits; /** * @function * @param {number} base * @param {number} exponent * @returns {number} * @inner */ var pow_dbl = Math.pow; // Used 4 times (4*8 to 15+4) /** * @param {string} str * @param {(boolean|number)=} unsigned * @param {number=} radix * @returns {!Long} * @inner */ function fromString(str, unsigned, radix) { if (str.length === 0) throw Error('empty string'); if (str === "NaN" || str === "Infinity" || str === "+Infinity" || str === "-Infinity") return ZERO; if (typeof unsigned === 'number') { // For goog.math.long compatibility radix = unsigned, unsigned = false; } else { unsigned = !! unsigned; } radix = radix || 10; if (radix < 2 || 36 < radix) throw RangeError('radix'); var p; if ((p = str.indexOf('-')) > 0) throw Error('interior hyphen'); else if (p === 0) { return fromString(str.substring(1), unsigned, radix).neg(); } // Do several (8) digits each time through the loop, so as to // minimize the calls to the very expensive emulated div. var radixToPower = fromNumber(pow_dbl(radix, 8)); var result = ZERO; for (var i = 0; i < str.length; i += 8) { var size = Math.min(8, str.length - i), value = parseInt(str.substring(i, i + size), radix); if (size < 8) { var power = fromNumber(pow_dbl(radix, size)); result = result.mul(power).add(fromNumber(value)); } else { result = result.mul(radixToPower); result = result.add(fromNumber(value)); } } result.unsigned = unsigned; return result; } /** * Returns a Long representation of the given string, written using the specified radix. * @function * @param {string} str The textual representation of the Long * @param {(boolean|number)=} unsigned Whether unsigned or not, defaults to `false` for signed * @param {number=} radix The radix in which the text is written (2-36), defaults to 10 * @returns {!Long} The corresponding Long value */ Long.fromString = fromString; /** * @function * @param {!Long|number|string|!{low: number, high: number, unsigned: boolean}} val * @returns {!Long} * @inner */ function fromValue(val) { if (val /* is compatible */ instanceof Long) return val; if (typeof val === 'number') return fromNumber(val); if (typeof val === 'string') return fromString(val); // Throws for non-objects, converts non-instanceof Long: return fromBits(val.low, val.high, val.unsigned); } /** * Converts the specified value to a Long. * @function * @param {!Long|number|string|!{low: number, high: number, unsigned: boolean}} val Value * @returns {!Long} */ Long.fromValue = fromValue; // NOTE: the compiler should inline these constant values below and then remove these variables, so there should be // no runtime penalty for these. /** * @type {number} * @const * @inner */ var TWO_PWR_16_DBL = 1 << 16; /** * @type {number} * @const * @inner */ var TWO_PWR_24_DBL = 1 << 24; /** * @type {number} * @const * @inner */ var TWO_PWR_32_DBL = TWO_PWR_16_DBL * TWO_PWR_16_DBL; /** * @type {number} * @const * @inner */ var TWO_PWR_64_DBL = TWO_PWR_32_DBL * TWO_PWR_32_DBL; /** * @type {number} * @const * @inner */ var TWO_PWR_63_DBL = TWO_PWR_64_DBL / 2; /** * @type {!Long} * @const * @inner */ var TWO_PWR_24 = fromInt(TWO_PWR_24_DBL); /** * @type {!Long} * @inner */ var ZERO = fromInt(0); /** * Signed zero. * @type {!Long} */ Long.ZERO = ZERO; /** * @type {!Long} * @inner */ var UZERO = fromInt(0, true); /** * Unsigned zero. * @type {!Long} */ Long.UZERO = UZERO; /** * @type {!Long} * @inner */ var ONE = fromInt(1); /** * Signed one. * @type {!Long} */ Long.ONE = ONE; /** * @type {!Long} * @inner */ var UONE = fromInt(1, true); /** * Unsigned one. * @type {!Long} */ Long.UONE = UONE; /** * @type {!Long} * @inner */ var NEG_ONE = fromInt(-1); /** * Signed negative one. * @type {!Long} */ Long.NEG_ONE = NEG_ONE; /** * @type {!Long} * @inner */ var MAX_VALUE = fromBits(0xFFFFFFFF|0, 0x7FFFFFFF|0, false); /** * Maximum signed value. * @type {!Long} */ Long.MAX_VALUE = MAX_VALUE; /** * @type {!Long} * @inner */ var MAX_UNSIGNED_VALUE = fromBits(0xFFFFFFFF|0, 0xFFFFFFFF|0, true); /** * Maximum unsigned value. * @type {!Long} */ Long.MAX_UNSIGNED_VALUE = MAX_UNSIGNED_VALUE; /** * @type {!Long} * @inner */ var MIN_VALUE = fromBits(0, 0x80000000|0, false); /** * Minimum signed value. * @type {!Long} */ Long.MIN_VALUE = MIN_VALUE; /** * @alias Long.prototype * @inner */ var LongPrototype = Long.prototype; /** * Converts the Long to a 32 bit integer, assuming it is a 32 bit integer. * @returns {number} */ LongPrototype.toInt = function toInt() { return this.unsigned ? this.low >>> 0 : this.low; }; /** * Converts the Long to a the nearest floating-point representation of this value (double, 53 bit mantissa). * @returns {number} */ LongPrototype.toNumber = function toNumber() { if (this.unsigned) return ((this.high >>> 0) * TWO_PWR_32_DBL) + (this.low >>> 0); return this.high * TWO_PWR_32_DBL + (this.low >>> 0); }; /** * Converts the Long to a string written in the specified radix. * @param {number=} radix Radix (2-36), defaults to 10 * @returns {string} * @override * @throws {RangeError} If `radix` is out of range */ LongPrototype.toString = function toString(radix) { radix = radix || 10; if (radix < 2 || 36 < radix) throw RangeError('radix'); if (this.isZero()) return '0'; if (this.isNegative()) { // Unsigned Longs are never negative if (this.eq(MIN_VALUE)) { // We need to change the Long value before it can be negated, so we remove // the bottom-most digit in this base and then recurse to do the rest. var radixLong = fromNumber(radix), div = this.div(radixLong), rem1 = div.mul(radixLong).sub(this); return div.toString(radix) + rem1.toInt().toString(radix); } else return '-' + this.neg().toString(radix); } // Do several (6) digits each time through the loop, so as to // minimize the calls to the very expensive emulated div. var radixToPower = fromNumber(pow_dbl(radix, 6), this.unsigned), rem = this; var result = ''; while (true) { var remDiv = rem.div(radixToPower), intval = rem.sub(remDiv.mul(radixToPower)).toInt() >>> 0, digits = intval.toString(radix); rem = remDiv; if (rem.isZero()) return digits + result; else { while (digits.length < 6) digits = '0' + digits; result = '' + digits + result; } } }; /** * Gets the high 32 bits as a signed integer. * @returns {number} Signed high bits */ LongPrototype.getHighBits = function getHighBits() { return this.high; }; /** * Gets the high 32 bits as an unsigned integer. * @returns {number} Unsigned high bits */ LongPrototype.getHighBitsUnsigned = function getHighBitsUnsigned() { return this.high >>> 0; }; /** * Gets the low 32 bits as a signed integer. * @returns {number} Signed low bits */ LongPrototype.getLowBits = function getLowBits() { return this.low; }; /** * Gets the low 32 bits as an unsigned integer. * @returns {number} Unsigned low bits */ LongPrototype.getLowBitsUnsigned = function getLowBitsUnsigned() { return this.low >>> 0; }; /** * Gets the number of bits needed to represent the absolute value of this Long. * @returns {number} */ LongPrototype.getNumBitsAbs = function getNumBitsAbs() { if (this.isNegative()) // Unsigned Longs are never negative return this.eq(MIN_VALUE) ? 64 : this.neg().getNumBitsAbs(); var val = this.high != 0 ? this.high : this.low; for (var bit = 31; bit > 0; bit--) if ((val & (1 << bit)) != 0) break; return this.high != 0 ? bit + 33 : bit + 1; }; /** * Tests if this Long's value equals zero. * @returns {boolean} */ LongPrototype.isZero = function isZero() { return this.high === 0 && this.low === 0; }; /** * Tests if this Long's value is negative. * @returns {boolean} */ LongPrototype.isNegative = function isNegative() { return !this.unsigned && this.high < 0; }; /** * Tests if this Long's value is positive. * @returns {boolean} */ LongPrototype.isPositive = function isPositive() { return this.unsigned || this.high >= 0; }; /** * Tests if this Long's value is odd. * @returns {boolean} */ LongPrototype.isOdd = function isOdd() { return (this.low & 1) === 1; }; /** * Tests if this Long's value is even. * @returns {boolean} */ LongPrototype.isEven = function isEven() { return (this.low & 1) === 0; }; /** * Tests if this Long's value equals the specified's. * @param {!Long|number|string} other Other value * @returns {boolean} */ LongPrototype.equals = function equals(other) { if (!isLong(other)) other = fromValue(other); if (this.unsigned !== other.unsigned && (this.high >>> 31) === 1 && (other.high >>> 31) === 1) return false; return this.high === other.high && this.low === other.low; }; /** * Tests if this Long's value equals the specified's. This is an alias of {@link Long#equals}. * @function * @param {!Long|number|string} other Other value * @returns {boolean} */ LongPrototype.eq = LongPrototype.equals; /** * Tests if this Long's value differs from the specified's. * @param {!Long|number|string} other Other value * @returns {boolean} */ LongPrototype.notEquals = function notEquals(other) { return !this.eq(/* validates */ other); }; /** * Tests if this Long's value differs from the specified's. This is an alias of {@link Long#notEquals}. * @function * @param {!Long|number|string} other Other value * @returns {boolean} */ LongPrototype.neq = LongPrototype.notEquals; /** * Tests if this Long's value is less than the specified's. * @param {!Long|number|string} other Other value * @returns {boolean} */ LongPrototype.lessThan = function lessThan(other) { return this.comp(/* validates */ other) < 0; }; /** * Tests if this Long's value is less than the specified's. This is an alias of {@link Long#lessThan}. * @function * @param {!Long|number|string} other Other value * @returns {boolean} */ LongPrototype.lt = LongPrototype.lessThan; /** * Tests if this Long's value is less than or equal the specified's. * @param {!Long|number|string} other Other value * @returns {boolean} */ LongPrototype.lessThanOrEqual = function lessThanOrEqual(other) { return this.comp(/* validates */ other) <= 0; }; /** * Tests if this Long's value is less than or equal the specified's. This is an alias of {@link Long#lessThanOrEqual}. * @function * @param {!Long|number|string} other Other value * @returns {boolean} */ LongPrototype.lte = LongPrototype.lessThanOrEqual; /** * Tests if this Long's value is greater than the specified's. * @param {!Long|number|string} other Other value * @returns {boolean} */ LongPrototype.greaterThan = function greaterThan(other) { return this.comp(/* validates */ other) > 0; }; /** * Tests if this Long's value is greater than the specified's. This is an alias of {@link Long#greaterThan}. * @function * @param {!Long|number|string} other Other value * @returns {boolean} */ LongPrototype.gt = LongPrototype.greaterThan; /** * Tests if this Long's value is greater than or equal the specified's. * @param {!Long|number|string} other Other value * @returns {boolean} */ LongPrototype.greaterThanOrEqual = function greaterThanOrEqual(other) { return this.comp(/* validates */ other) >= 0; }; /** * Tests if this Long's value is greater than or equal the specified's. This is an alias of {@link Long#greaterThanOrEqual}. * @function * @param {!Long|number|string} other Other value * @returns {boolean} */ LongPrototype.gte = LongPrototype.greaterThanOrEqual; /** * Compares this Long's value with the specified's. * @param {!Long|number|string} other Other value * @returns {number} 0 if they are the same, 1 if the this is greater and -1 * if the given one is greater */ LongPrototype.compare = function compare(other) { if (!isLong(other)) other = fromValue(other); if (this.eq(other)) return 0; var thisNeg = this.isNegative(), otherNeg = other.isNegative(); if (thisNeg && !otherNeg) return -1; if (!thisNeg && otherNeg) return 1; // At this point the sign bits are the same if (!this.unsigned) return this.sub(other).isNegative() ? -1 : 1; // Both are positive if at least one is unsigned return (other.high >>> 0) > (this.high >>> 0) || (other.high === this.high && (other.low >>> 0) > (this.low >>> 0)) ? -1 : 1; }; /** * Compares this Long's value with the specified's. This is an alias of {@link Long#compare}. * @function * @param {!Long|number|string} other Other value * @returns {number} 0 if they are the same, 1 if the this is greater and -1 * if the given one is greater */ LongPrototype.comp = LongPrototype.compare; /** * Negates this Long's value. * @returns {!Long} Negated Long */ LongPrototype.negate = function negate() { if (!this.unsigned && this.eq(MIN_VALUE)) return MIN_VALUE; return this.not().add(ONE); }; /** * Negates this Long's value. This is an alias of {@link Long#negate}. * @function * @returns {!Long} Negated Long */ LongPrototype.neg = LongPrototype.negate; /** * Returns the sum of this and the specified Long. * @param {!Long|number|string} addend Addend * @returns {!Long} Sum */ LongPrototype.add = function add(addend) { if (!isLong(addend)) addend = fromValue(addend); // Divide each number into 4 chunks of 16 bits, and then sum the chunks. var a48 = this.high >>> 16; var a32 = this.high & 0xFFFF; var a16 = this.low >>> 16; var a00 = this.low & 0xFFFF; var b48 = addend.high >>> 16; var b32 = addend.high & 0xFFFF; var b16 = addend.low >>> 16; var b00 = addend.low & 0xFFFF; var c48 = 0, c32 = 0, c16 = 0, c00 = 0; c00 += a00 + b00; c16 += c00 >>> 16; c00 &= 0xFFFF; c16 += a16 + b16; c32 += c16 >>> 16; c16 &= 0xFFFF; c32 += a32 + b32; c48 += c32 >>> 16; c32 &= 0xFFFF; c48 += a48 + b48; c48 &= 0xFFFF; return fromBits((c16 << 16) | c00, (c48 << 16) | c32, this.unsigned); }; /** * Returns the difference of this and the specified Long. * @param {!Long|number|string} subtrahend Subtrahend * @returns {!Long} Difference */ LongPrototype.subtract = function subtract(subtrahend) { if (!isLong(subtrahend)) subtrahend = fromValue(subtrahend); return this.add(subtrahend.neg()); }; /** * Returns the difference of this and the specified Long. This is an alias of {@link Long#subtract}. * @function * @param {!Long|number|string} subtrahend Subtrahend * @returns {!Long} Difference */ LongPrototype.sub = LongPrototype.subtract; /** * Returns the product of this and the specified Long. * @param {!Long|number|string} multiplier Multiplier * @returns {!Long} Product */ LongPrototype.multiply = function multiply(multiplier) { if (this.isZero()) return ZERO; if (!isLong(multiplier)) multiplier = fromValue(multiplier); if (multiplier.isZero()) return ZERO; if (this.eq(MIN_VALUE)) return multiplier.isOdd() ? MIN_VALUE : ZERO; if (multiplier.eq(MIN_VALUE)) return this.isOdd() ? MIN_VALUE : ZERO; if (this.isNegative()) { if (multiplier.isNegative()) return this.neg().mul(multiplier.neg()); else return this.neg().mul(multiplier).neg(); } else if (multiplier.isNegative()) return this.mul(multiplier.neg()).neg(); // If both longs are small, use float multiplication if (this.lt(TWO_PWR_24) && multiplier.lt(TWO_PWR_24)) return fromNumber(this.toNumber() * multiplier.toNumber(), this.unsigned); // Divide each long into 4 chunks of 16 bits, and then add up 4x4 products. // We can skip products that would overflow. var a48 = this.high >>> 16; var a32 = this.high & 0xFFFF; var a16 = this.low >>> 16; var a00 = this.low & 0xFFFF; var b48 = multiplier.high >>> 16; var b32 = multiplier.high & 0xFFFF; var b16 = multiplier.low >>> 16; var b00 = multiplier.low & 0xFFFF; var c48 = 0, c32 = 0, c16 = 0, c00 = 0; c00 += a00 * b00; c16 += c00 >>> 16; c00 &= 0xFFFF; c16 += a16 * b00; c32 += c16 >>> 16; c16 &= 0xFFFF; c16 += a00 * b16; c32 += c16 >>> 16; c16 &= 0xFFFF; c32 += a32 * b00; c48 += c32 >>> 16; c32 &= 0xFFFF; c32 += a16 * b16; c48 += c32 >>> 16; c32 &= 0xFFFF; c32 += a00 * b32; c48 += c32 >>> 16; c32 &= 0xFFFF; c48 += a48 * b00 + a32 * b16 + a16 * b32 + a00 * b48; c48 &= 0xFFFF; return fromBits((c16 << 16) | c00, (c48 << 16) | c32, this.unsigned); }; /** * Returns the product of this and the specified Long. This is an alias of {@link Long#multiply}. * @function * @param {!Long|number|string} multiplier Multiplier * @returns {!Long} Product */ LongPrototype.mul = LongPrototype.multiply; /** * Returns this Long divided by the specified. The result is signed if this Long is signed or * unsigned if this Long is unsigned. * @param {!Long|number|string} divisor Divisor * @returns {!Long} Quotient */ LongPrototype.divide = function divide(divisor) { if (!isLong(divisor)) divisor = fromValue(divisor); if (divisor.isZero()) throw Error('division by zero'); if (this.isZero()) return this.unsigned ? UZERO : ZERO; var approx, rem, res; if (!this.unsigned) { // This section is only relevant for signed longs and is derived from the // closure library as a whole. if (this.eq(MIN_VALUE)) { if (divisor.eq(ONE) || divisor.eq(NEG_ONE)) return MIN_VALUE; // recall that -MIN_VALUE == MIN_VALUE else if (divisor.eq(MIN_VALUE)) return ONE; else { // At this point, we have |other| >= 2, so |this/other| < |MIN_VALUE|. var halfThis = this.shr(1); approx = halfThis.div(divisor).shl(1); if (approx.eq(ZERO)) { return divisor.isNegative() ? ONE : NEG_ONE; } else { rem = this.sub(divisor.mul(approx)); res = approx.add(rem.div(divisor)); return res; } } } else if (divisor.eq(MIN_VALUE)) return this.unsigned ? UZERO : ZERO; if (this.isNegative()) { if (divisor.isNegative()) return this.neg().div(divisor.neg()); return this.neg().div(divisor).neg(); } else if (divisor.isNegative()) return this.div(divisor.neg()).neg(); res = ZERO; } else { // The algorithm below has not been made for unsigned longs. It's therefore // required to take special care of the MSB prior to running it. if (!divisor.unsigned) divisor = divisor.toUnsigned(); if (divisor.gt(this)) return UZERO; if (divisor.gt(this.shru(1))) // 15 >>> 1 = 7 ; with divisor = 8 ; true return UONE; res = UZERO; } // Repeat the following until the remainder is less than other: find a // floating-point that approximates remainder / other *from below*, add this // into the result, and subtract it from the remainder. It is critical that // the approximate value is less than or equal to the real value so that the // remainder never becomes negative. rem = this; while (rem.gte(divisor)) { // Approximate the result of division. This may be a little greater or // smaller than the actual value. approx = Math.max(1, Math.floor(rem.toNumber() / divisor.toNumber())); // We will tweak the approximate result by changing it in the 48-th digit or // the smallest non-fractional digit, whichever is larger. var log2 = Math.ceil(Math.log(approx) / Math.LN2), delta = (log2 <= 48) ? 1 : pow_dbl(2, log2 - 48), // Decrease the approximation until it is smaller than the remainder. Note // that if it is too large, the product overflows and is negative. approxRes = fromNumber(approx), approxRem = approxRes.mul(divisor); while (approxRem.isNegative() || approxRem.gt(rem)) { approx -= delta; approxRes = fromNumber(approx, this.unsigned); approxRem = approxRes.mul(divisor); } // We know the answer can't be zero... and actually, zero would cause // infinite recursion since we would make no progress. if (approxRes.isZero()) approxRes = ONE; res = res.add(approxRes); rem = rem.sub(approxRem); } return res; }; /** * Returns this Long divided by the specified. This is an alias of {@link Long#divide}. * @function * @param {!Long|number|string} divisor Divisor * @returns {!Long} Quotient */ LongPrototype.div = LongPrototype.divide; /** * Returns this Long modulo the specified. * @param {!Long|number|string} divisor Divisor * @returns {!Long} Remainder */ LongPrototype.modulo = function modulo(divisor) { if (!isLong(divisor)) divisor = fromValue(divisor); return this.sub(this.div(divisor).mul(divisor)); }; /** * Returns this Long modulo the specified. This is an alias of {@link Long#modulo}. * @function * @param {!Long|number|string} divisor Divisor * @returns {!Long} Remainder */ LongPrototype.mod = LongPrototype.modulo; /** * Returns the bitwise NOT of this Long. * @returns {!Long} */ LongPrototype.not = function not() { return fromBits(~this.low, ~this.high, this.unsigned); }; /** * Returns the bitwise AND of this Long and the specified. * @param {!Long|number|string} other Other Long * @returns {!Long} */ LongPrototype.and = function and(other) { if (!isLong(other)) other = fromValue(other); return fromBits(this.low & other.low, this.high & other.high, this.unsigned); }; /** * Returns the bitwise OR of this Long and the specified. * @param {!Long|number|string} other Other Long * @returns {!Long} */ LongPrototype.or = function or(other) { if (!isLong(other)) other = fromValue(other); return fromBits(this.low | other.low, this.high | other.high, this.unsigned); }; /** * Returns the bitwise XOR of this Long and the given one. * @param {!Long|number|string} other Other Long * @returns {!Long} */ LongPrototype.xor = function xor(other) { if (!isLong(other)) other = fromValue(other); return fromBits(this.low ^ other.low, this.high ^ other.high, this.unsigned); }; /** * Returns this Long with bits shifted to the left by the given amount. * @param {number|!Long} numBits Number of bits * @returns {!Long} Shifted Long */ LongPrototype.shiftLeft = function shiftLeft(numBits) { if (isLong(numBits)) numBits = numBits.toInt(); if ((numBits &= 63) === 0) return this; else if (numBits < 32) return fromBits(this.low << numBits, (this.high << numBits) | (this.low >>> (32 - numBits)), this.unsigned); else return fromBits(0, this.low << (numBits - 32), this.unsigned); }; /** * Returns this Long with bits shifted to the left by the given amount. This is an alias of {@link Long#shiftLeft}. * @function * @param {number|!Long} numBits Number of bits * @returns {!Long} Shifted Long */ LongPrototype.shl = LongPrototype.shiftLeft; /** * Returns this Long with bits arithmetically shifted to the right by the given amount. * @param {number|!Long} numBits Number of bits * @returns {!Long} Shifted Long */ LongPrototype.shiftRight = function shiftRight(numBits) { if (isLong(numBits)) numBits = numBits.toInt(); if ((numBits &= 63) === 0) return this; else if (numBits < 32) return fromBits((this.low >>> numBits) | (this.high << (32 - numBits)), this.high >> numBits, this.unsigned); else return fromBits(this.high >> (numBits - 32), this.high >= 0 ? 0 : -1, this.unsigned); }; /** * Returns this Long with bits arithmetically shifted to the right by the given amount. This is an alias of {@link Long#shiftRight}. * @function * @param {number|!Long} numBits Number of bits * @returns {!Long} Shifted Long */ LongPrototype.shr = LongPrototype.shiftRight; /** * Returns this Long with bits logically shifted to the right by the given amount. * @param {number|!Long} numBits Number of bits * @returns {!Long} Shifted Long */ LongPrototype.shiftRightUnsigned = function shiftRightUnsigned(numBits) { if (isLong(numBits)) numBits = numBits.toInt(); numBits &= 63; if (numBits === 0) return this; else { var high = this.high; if (numBits < 32) { var low = this.low; return fromBits((low >>> numBits) | (high << (32 - numBits)), high >>> numBits, this.unsigned); } else if (numBits === 32) return fromBits(high, 0, this.unsigned); else return fromBits(high >>> (numBits - 32), 0, this.unsigned); } }; /** * Returns this Long with bits logically shifted to the right by the given amount. This is an alias of {@link Long#shiftRightUnsigned}. * @function * @param {number|!Long} numBits Number of bits * @returns {!Long} Shifted Long */ LongPrototype.shru = LongPrototype.shiftRightUnsigned; /** * Converts this Long to signed. * @returns {!Long} Signed long */ LongPrototype.toSigned = function toSigned() { if (!this.unsigned) return this; return fromBits(this.low, this.high, false); }; /** * Converts this Long to unsigned. * @returns {!Long} Unsigned long */ LongPrototype.toUnsigned = function toUnsigned() { if (this.unsigned) return this; return fromBits(this.low, this.high, true); }; /** * Converts this Long to its byte representation. * @param {boolean=} le Whether little or big endian, defaults to big endian * @returns {!Array.} Byte representation */ LongPrototype.toBytes = function(le) { return le ? this.toBytesLE() : this.toBytesBE(); } /** * Converts this Long to its little endian byte representation. * @returns {!Array.} Little endian byte representation */ LongPrototype.toBytesLE = function() { var hi = this.high, lo = this.low; return [ lo & 0xff, (lo >>> 8) & 0xff, (lo >>> 16) & 0xff, (lo >>> 24) & 0xff, hi & 0xff, (hi >>> 8) & 0xff, (hi >>> 16) & 0xff, (hi >>> 24) & 0xff ]; } /** * Converts this Long to its big endian byte representation. * @returns {!Array.} Big endian byte representation */ LongPrototype.toBytesBE = function() { var hi = this.high, lo = this.low; return [ (hi >>> 24) & 0xff, (hi >>> 16) & 0xff, (hi >>> 8) & 0xff, hi & 0xff, (lo >>> 24) & 0xff, (lo >>> 16) & 0xff, (lo >>> 8) & 0xff, lo & 0xff ]; } return Long; }); },{}],713:[function(require,module,exports){ /* object-assign (c) Sindre Sorhus @license MIT */ 'use strict'; /* eslint-disable no-unused-vars */ var getOwnPropertySymbols = Object.getOwnPropertySymbols; var hasOwnProperty = Object.prototype.hasOwnProperty; var propIsEnumerable = Object.prototype.propertyIsEnumerable; function toObject(val) { if (val === null || val === undefined) { throw new TypeError('Object.assign cannot be called with null or undefined'); } return Object(val); } function shouldUseNative() { try { if (!Object.assign) { return false; } // Detect buggy property enumeration order in older V8 versions. // https://bugs.chromium.org/p/v8/issues/detail?id=4118 var test1 = new String('abc'); // eslint-disable-line no-new-wrappers test1[5] = 'de'; if (Object.getOwnPropertyNames(test1)[0] === '5') { return false; } // https://bugs.chromium.org/p/v8/issues/detail?id=3056 var test2 = {}; for (var i = 0; i < 10; i++) { test2['_' + String.fromCharCode(i)] = i; } var order2 = Object.getOwnPropertyNames(test2).map(function (n) { return test2[n]; }); if (order2.join('') !== '0123456789') { return false; } // https://bugs.chromium.org/p/v8/issues/detail?id=3056 var test3 = {}; 'abcdefghijklmnopqrst'.split('').forEach(function (letter) { test3[letter] = letter; }); if (Object.keys(Object.assign({}, test3)).join('') !== 'abcdefghijklmnopqrst') { return false; } return true; } catch (err) { // We don't expect any of the above to throw, but better to be safe. return false; } } module.exports = shouldUseNative() ? Object.assign : function (target, source) { var from; var to = toObject(target); var symbols; for (var s = 1; s < arguments.length; s++) { from = Object(arguments[s]); for (var key in from) { if (hasOwnProperty.call(from, key)) { to[key] = from[key]; } } if (getOwnPropertySymbols) { symbols = getOwnPropertySymbols(from); for (var i = 0; i < symbols.length; i++) { if (propIsEnumerable.call(from, symbols[i])) { to[symbols[i]] = from[symbols[i]]; } } } } return to; }; },{}],714:[function(require,module,exports){ // shim for using process in browser var process = module.exports = {}; // cached from whatever global is present so that test runners that stub it // don't break things. But we need to wrap it in a try catch in case it is // wrapped in strict mode code which doesn't define any globals. It's inside a // function because try/catches deoptimize in certain engines. var cachedSetTimeout; var cachedClearTimeout; function defaultSetTimout() { throw new Error('setTimeout has not been defined'); } function defaultClearTimeout () { throw new Error('clearTimeout has not been defined'); } (function () { try { if (typeof setTimeout === 'function') { cachedSetTimeout = setTimeout; } else { cachedSetTimeout = defaultSetTimout; } } catch (e) { cachedSetTimeout = defaultSetTimout; } try { if (typeof clearTimeout === 'function') { cachedClearTimeout = clearTimeout; } else { cachedClearTimeout = defaultClearTimeout; } } catch (e) { cachedClearTimeout = defaultClearTimeout; } } ()) function runTimeout(fun) { if (cachedSetTimeout === setTimeout) { //normal enviroments in sane situations return setTimeout(fun, 0); } // if setTimeout wasn't available but was latter defined if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) { cachedSetTimeout = setTimeout; return setTimeout(fun, 0); } try { // when when somebody has screwed with setTimeout but no I.E. maddness return cachedSetTimeout(fun, 0); } catch(e){ try { // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally return cachedSetTimeout.call(null, fun, 0); } catch(e){ // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error return cachedSetTimeout.call(this, fun, 0); } } } function runClearTimeout(marker) { if (cachedClearTimeout === clearTimeout) { //normal enviroments in sane situations return clearTimeout(marker); } // if clearTimeout wasn't available but was latter defined if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) { cachedClearTimeout = clearTimeout; return clearTimeout(marker); } try { // when when somebody has screwed with setTimeout but no I.E. maddness return cachedClearTimeout(marker); } catch (e){ try { // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally return cachedClearTimeout.call(null, marker); } catch (e){ // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error. // Some versions of I.E. have different rules for clearTimeout vs setTimeout return cachedClearTimeout.call(this, marker); } } } var queue = []; var draining = false; var currentQueue; var queueIndex = -1; function cleanUpNextTick() { if (!draining || !currentQueue) { return; } draining = false; if (currentQueue.length) { queue = currentQueue.concat(queue); } else { queueIndex = -1; } if (queue.length) { drainQueue(); } } function drainQueue() { if (draining) { return; } var timeout = runTimeout(cleanUpNextTick); draining = true; var len = queue.length; while(len) { currentQueue = queue; queue = []; while (++queueIndex < len) { if (currentQueue) { currentQueue[queueIndex].run(); } } queueIndex = -1; len = queue.length; } currentQueue = null; draining = false; runClearTimeout(timeout); } process.nextTick = function (fun) { var args = new Array(arguments.length - 1); if (arguments.length > 1) { for (var i = 1; i < arguments.length; i++) { args[i - 1] = arguments[i]; } } queue.push(new Item(fun, args)); if (queue.length === 1 && !draining) { runTimeout(drainQueue); } }; // v8 likes predictible objects function Item(fun, array) { this.fun = fun; this.array = array; } Item.prototype.run = function () { this.fun.apply(null, this.array); }; process.title = 'browser'; process.browser = true; process.env = {}; process.argv = []; process.version = ''; // empty string to avoid regexp issues process.versions = {}; function noop() {} process.on = noop; process.addListener = noop; process.once = noop; process.off = noop; process.removeListener = noop; process.removeAllListeners = noop; process.emit = noop; process.prependListener = noop; process.prependOnceListener = noop; process.listeners = function (name) { return [] } process.binding = function (name) { throw new Error('process.binding is not supported'); }; process.cwd = function () { return '/' }; process.chdir = function (dir) { throw new Error('process.chdir is not supported'); }; process.umask = function() { return 0; }; },{}],715:[function(require,module,exports){ // minimal library entry point. "use strict"; module.exports = require("./src/index-minimal"); },{"./src/index-minimal":716}],716:[function(require,module,exports){ "use strict"; var protobuf = exports; /** * Build type, one of `"full"`, `"light"` or `"minimal"`. * @name build * @type {string} * @const */ protobuf.build = "minimal"; // Serialization protobuf.Writer = require("./writer"); protobuf.BufferWriter = require("./writer_buffer"); protobuf.Reader = require("./reader"); protobuf.BufferReader = require("./reader_buffer"); // Utility protobuf.util = require("./util/minimal"); protobuf.rpc = require("./rpc"); protobuf.roots = require("./roots"); protobuf.configure = configure; /* istanbul ignore next */ /** * Reconfigures the library according to the environment. * @returns {undefined} */ function configure() { protobuf.util._configure(); protobuf.Writer._configure(protobuf.BufferWriter); protobuf.Reader._configure(protobuf.BufferReader); } // Set up buffer utility according to the environment configure(); },{"./reader":717,"./reader_buffer":718,"./roots":719,"./rpc":720,"./util/minimal":723,"./writer":724,"./writer_buffer":725}],717:[function(require,module,exports){ "use strict"; module.exports = Reader; var util = require("./util/minimal"); var BufferReader; // cyclic var LongBits = util.LongBits, utf8 = util.utf8; /* istanbul ignore next */ function indexOutOfRange(reader, writeLength) { return RangeError("index out of range: " + reader.pos + " + " + (writeLength || 1) + " > " + reader.len); } /** * Constructs a new reader instance using the specified buffer. * @classdesc Wire format reader using `Uint8Array` if available, otherwise `Array`. * @constructor * @param {Uint8Array} buffer Buffer to read from */ function Reader(buffer) { /** * Read buffer. * @type {Uint8Array} */ this.buf = buffer; /** * Read buffer position. * @type {number} */ this.pos = 0; /** * Read buffer length. * @type {number} */ this.len = buffer.length; } var create_array = typeof Uint8Array !== "undefined" ? function create_typed_array(buffer) { if (buffer instanceof Uint8Array || Array.isArray(buffer)) return new Reader(buffer); throw Error("illegal buffer"); } /* istanbul ignore next */ : function create_array(buffer) { if (Array.isArray(buffer)) return new Reader(buffer); throw Error("illegal buffer"); }; var create = function create() { return util.Buffer ? function create_buffer_setup(buffer) { return (Reader.create = function create_buffer(buffer) { return util.Buffer.isBuffer(buffer) ? new BufferReader(buffer) /* istanbul ignore next */ : create_array(buffer); })(buffer); } /* istanbul ignore next */ : create_array; }; /** * Creates a new reader using the specified buffer. * @function * @param {Uint8Array|Buffer} buffer Buffer to read from * @returns {Reader|BufferReader} A {@link BufferReader} if `buffer` is a Buffer, otherwise a {@link Reader} * @throws {Error} If `buffer` is not a valid buffer */ Reader.create = create(); Reader.prototype._slice = util.Array.prototype.subarray || /* istanbul ignore next */ util.Array.prototype.slice; /** * Reads a varint as an unsigned 32 bit value. * @function * @returns {number} Value read */ Reader.prototype.uint32 = (function read_uint32_setup() { var value = 4294967295; // optimizer type-hint, tends to deopt otherwise (?!) return function read_uint32() { value = ( this.buf[this.pos] & 127 ) >>> 0; if (this.buf[this.pos++] < 128) return value; value = (value | (this.buf[this.pos] & 127) << 7) >>> 0; if (this.buf[this.pos++] < 128) return value; value = (value | (this.buf[this.pos] & 127) << 14) >>> 0; if (this.buf[this.pos++] < 128) return value; value = (value | (this.buf[this.pos] & 127) << 21) >>> 0; if (this.buf[this.pos++] < 128) return value; value = (value | (this.buf[this.pos] & 15) << 28) >>> 0; if (this.buf[this.pos++] < 128) return value; /* istanbul ignore if */ if ((this.pos += 5) > this.len) { this.pos = this.len; throw indexOutOfRange(this, 10); } return value; }; })(); /** * Reads a varint as a signed 32 bit value. * @returns {number} Value read */ Reader.prototype.int32 = function read_int32() { return this.uint32() | 0; }; /** * Reads a zig-zag encoded varint as a signed 32 bit value. * @returns {number} Value read */ Reader.prototype.sint32 = function read_sint32() { var value = this.uint32(); return value >>> 1 ^ -(value & 1) | 0; }; /* eslint-disable no-invalid-this */ function readLongVarint() { // tends to deopt with local vars for octet etc. var bits = new LongBits(0, 0); var i = 0; if (this.len - this.pos > 4) { // fast route (lo) for (; i < 4; ++i) { // 1st..4th bits.lo = (bits.lo | (this.buf[this.pos] & 127) << i * 7) >>> 0; if (this.buf[this.pos++] < 128) return bits; } // 5th bits.lo = (bits.lo | (this.buf[this.pos] & 127) << 28) >>> 0; bits.hi = (bits.hi | (this.buf[this.pos] & 127) >> 4) >>> 0; if (this.buf[this.pos++] < 128) return bits; i = 0; } else { for (; i < 3; ++i) { /* istanbul ignore if */ if (this.pos >= this.len) throw indexOutOfRange(this); // 1st..3th bits.lo = (bits.lo | (this.buf[this.pos] & 127) << i * 7) >>> 0; if (this.buf[this.pos++] < 128) return bits; } // 4th bits.lo = (bits.lo | (this.buf[this.pos++] & 127) << i * 7) >>> 0; return bits; } if (this.len - this.pos > 4) { // fast route (hi) for (; i < 5; ++i) { // 6th..10th bits.hi = (bits.hi | (this.buf[this.pos] & 127) << i * 7 + 3) >>> 0; if (this.buf[this.pos++] < 128) return bits; } } else { for (; i < 5; ++i) { /* istanbul ignore if */ if (this.pos >= this.len) throw indexOutOfRange(this); // 6th..10th bits.hi = (bits.hi | (this.buf[this.pos] & 127) << i * 7 + 3) >>> 0; if (this.buf[this.pos++] < 128) return bits; } } /* istanbul ignore next */ throw Error("invalid varint encoding"); } /* eslint-enable no-invalid-this */ /** * Reads a varint as a signed 64 bit value. * @name Reader#int64 * @function * @returns {Long} Value read */ /** * Reads a varint as an unsigned 64 bit value. * @name Reader#uint64 * @function * @returns {Long} Value read */ /** * Reads a zig-zag encoded varint as a signed 64 bit value. * @name Reader#sint64 * @function * @returns {Long} Value read */ /** * Reads a varint as a boolean. * @returns {boolean} Value read */ Reader.prototype.bool = function read_bool() { return this.uint32() !== 0; }; function readFixed32_end(buf, end) { // note that this uses `end`, not `pos` return (buf[end - 4] | buf[end - 3] << 8 | buf[end - 2] << 16 | buf[end - 1] << 24) >>> 0; } /** * Reads fixed 32 bits as an unsigned 32 bit integer. * @returns {number} Value read */ Reader.prototype.fixed32 = function read_fixed32() { /* istanbul ignore if */ if (this.pos + 4 > this.len) throw indexOutOfRange(this, 4); return readFixed32_end(this.buf, this.pos += 4); }; /** * Reads fixed 32 bits as a signed 32 bit integer. * @returns {number} Value read */ Reader.prototype.sfixed32 = function read_sfixed32() { /* istanbul ignore if */ if (this.pos + 4 > this.len) throw indexOutOfRange(this, 4); return readFixed32_end(this.buf, this.pos += 4) | 0; }; /* eslint-disable no-invalid-this */ function readFixed64(/* this: Reader */) { /* istanbul ignore if */ if (this.pos + 8 > this.len) throw indexOutOfRange(this, 8); return new LongBits(readFixed32_end(this.buf, this.pos += 4), readFixed32_end(this.buf, this.pos += 4)); } /* eslint-enable no-invalid-this */ /** * Reads fixed 64 bits. * @name Reader#fixed64 * @function * @returns {Long} Value read */ /** * Reads zig-zag encoded fixed 64 bits. * @name Reader#sfixed64 * @function * @returns {Long} Value read */ /** * Reads a float (32 bit) as a number. * @function * @returns {number} Value read */ Reader.prototype.float = function read_float() { /* istanbul ignore if */ if (this.pos + 4 > this.len) throw indexOutOfRange(this, 4); var value = util.float.readFloatLE(this.buf, this.pos); this.pos += 4; return value; }; /** * Reads a double (64 bit float) as a number. * @function * @returns {number} Value read */ Reader.prototype.double = function read_double() { /* istanbul ignore if */ if (this.pos + 8 > this.len) throw indexOutOfRange(this, 4); var value = util.float.readDoubleLE(this.buf, this.pos); this.pos += 8; return value; }; /** * Reads a sequence of bytes preceeded by its length as a varint. * @returns {Uint8Array} Value read */ Reader.prototype.bytes = function read_bytes() { var length = this.uint32(), start = this.pos, end = this.pos + length; /* istanbul ignore if */ if (end > this.len) throw indexOutOfRange(this, length); this.pos += length; if (Array.isArray(this.buf)) // plain array return this.buf.slice(start, end); return start === end // fix for IE 10/Win8 and others' subarray returning array of size 1 ? new this.buf.constructor(0) : this._slice.call(this.buf, start, end); }; /** * Reads a string preceeded by its byte length as a varint. * @returns {string} Value read */ Reader.prototype.string = function read_string() { var bytes = this.bytes(); return utf8.read(bytes, 0, bytes.length); }; /** * Skips the specified number of bytes if specified, otherwise skips a varint. * @param {number} [length] Length if known, otherwise a varint is assumed * @returns {Reader} `this` */ Reader.prototype.skip = function skip(length) { if (typeof length === "number") { /* istanbul ignore if */ if (this.pos + length > this.len) throw indexOutOfRange(this, length); this.pos += length; } else { do { /* istanbul ignore if */ if (this.pos >= this.len) throw indexOutOfRange(this); } while (this.buf[this.pos++] & 128); } return this; }; /** * Skips the next element of the specified wire type. * @param {number} wireType Wire type received * @returns {Reader} `this` */ Reader.prototype.skipType = function(wireType) { switch (wireType) { case 0: this.skip(); break; case 1: this.skip(8); break; case 2: this.skip(this.uint32()); break; case 3: while ((wireType = this.uint32() & 7) !== 4) { this.skipType(wireType); } break; case 5: this.skip(4); break; /* istanbul ignore next */ default: throw Error("invalid wire type " + wireType + " at offset " + this.pos); } return this; }; Reader._configure = function(BufferReader_) { BufferReader = BufferReader_; Reader.create = create(); BufferReader._configure(); var fn = util.Long ? "toLong" : /* istanbul ignore next */ "toNumber"; util.merge(Reader.prototype, { int64: function read_int64() { return readLongVarint.call(this)[fn](false); }, uint64: function read_uint64() { return readLongVarint.call(this)[fn](true); }, sint64: function read_sint64() { return readLongVarint.call(this).zzDecode()[fn](false); }, fixed64: function read_fixed64() { return readFixed64.call(this)[fn](true); }, sfixed64: function read_sfixed64() { return readFixed64.call(this)[fn](false); } }); }; },{"./util/minimal":723}],718:[function(require,module,exports){ "use strict"; module.exports = BufferReader; // extends Reader var Reader = require("./reader"); (BufferReader.prototype = Object.create(Reader.prototype)).constructor = BufferReader; var util = require("./util/minimal"); /** * Constructs a new buffer reader instance. * @classdesc Wire format reader using node buffers. * @extends Reader * @constructor * @param {Buffer} buffer Buffer to read from */ function BufferReader(buffer) { Reader.call(this, buffer); /** * Read buffer. * @name BufferReader#buf * @type {Buffer} */ } BufferReader._configure = function () { /* istanbul ignore else */ if (util.Buffer) BufferReader.prototype._slice = util.Buffer.prototype.slice; }; /** * @override */ BufferReader.prototype.string = function read_string_buffer() { var len = this.uint32(); // modifies pos return this.buf.utf8Slice ? this.buf.utf8Slice(this.pos, this.pos = Math.min(this.pos + len, this.len)) : this.buf.toString("utf-8", this.pos, this.pos = Math.min(this.pos + len, this.len)); }; /** * Reads a sequence of bytes preceeded by its length as a varint. * @name BufferReader#bytes * @function * @returns {Buffer} Value read */ BufferReader._configure(); },{"./reader":717,"./util/minimal":723}],719:[function(require,module,exports){ "use strict"; module.exports = {}; /** * Named roots. * This is where pbjs stores generated structures (the option `-r, --root` specifies a name). * Can also be used manually to make roots available accross modules. * @name roots * @type {Object.} * @example * // pbjs -r myroot -o compiled.js ... * * // in another module: * require("./compiled.js"); * * // in any subsequent module: * var root = protobuf.roots["myroot"]; */ },{}],720:[function(require,module,exports){ "use strict"; /** * Streaming RPC helpers. * @namespace */ var rpc = exports; /** * RPC implementation passed to {@link Service#create} performing a service request on network level, i.e. by utilizing http requests or websockets. * @typedef RPCImpl * @type {function} * @param {Method|rpc.ServiceMethod,Message<{}>>} method Reflected or static method being called * @param {Uint8Array} requestData Request data * @param {RPCImplCallback} callback Callback function * @returns {undefined} * @example * function rpcImpl(method, requestData, callback) { * if (protobuf.util.lcFirst(method.name) !== "myMethod") // compatible with static code * throw Error("no such method"); * asynchronouslyObtainAResponse(requestData, function(err, responseData) { * callback(err, responseData); * }); * } */ /** * Node-style callback as used by {@link RPCImpl}. * @typedef RPCImplCallback * @type {function} * @param {Error|null} error Error, if any, otherwise `null` * @param {Uint8Array|null} [response] Response data or `null` to signal end of stream, if there hasn't been an error * @returns {undefined} */ rpc.Service = require("./rpc/service"); },{"./rpc/service":721}],721:[function(require,module,exports){ "use strict"; module.exports = Service; var util = require("../util/minimal"); // Extends EventEmitter (Service.prototype = Object.create(util.EventEmitter.prototype)).constructor = Service; /** * A service method callback as used by {@link rpc.ServiceMethod|ServiceMethod}. * * Differs from {@link RPCImplCallback} in that it is an actual callback of a service method which may not return `response = null`. * @typedef rpc.ServiceMethodCallback * @template TRes extends Message * @type {function} * @param {Error|null} error Error, if any * @param {TRes} [response] Response message * @returns {undefined} */ /** * A service method part of a {@link rpc.Service} as created by {@link Service.create}. * @typedef rpc.ServiceMethod * @template TReq extends Message * @template TRes extends Message * @type {function} * @param {TReq|Properties} request Request message or plain object * @param {rpc.ServiceMethodCallback} [callback] Node-style callback called with the error, if any, and the response message * @returns {Promise>} Promise if `callback` has been omitted, otherwise `undefined` */ /** * Constructs a new RPC service instance. * @classdesc An RPC service as returned by {@link Service#create}. * @exports rpc.Service * @extends util.EventEmitter * @constructor * @param {RPCImpl} rpcImpl RPC implementation * @param {boolean} [requestDelimited=false] Whether requests are length-delimited * @param {boolean} [responseDelimited=false] Whether responses are length-delimited */ function Service(rpcImpl, requestDelimited, responseDelimited) { if (typeof rpcImpl !== "function") throw TypeError("rpcImpl must be a function"); util.EventEmitter.call(this); /** * RPC implementation. Becomes `null` once the service is ended. * @type {RPCImpl|null} */ this.rpcImpl = rpcImpl; /** * Whether requests are length-delimited. * @type {boolean} */ this.requestDelimited = Boolean(requestDelimited); /** * Whether responses are length-delimited. * @type {boolean} */ this.responseDelimited = Boolean(responseDelimited); } /** * Calls a service method through {@link rpc.Service#rpcImpl|rpcImpl}. * @param {Method|rpc.ServiceMethod} method Reflected or static method * @param {Constructor} requestCtor Request constructor * @param {Constructor} responseCtor Response constructor * @param {TReq|Properties} request Request message or plain object * @param {rpc.ServiceMethodCallback} callback Service callback * @returns {undefined} * @template TReq extends Message * @template TRes extends Message */ Service.prototype.rpcCall = function rpcCall(method, requestCtor, responseCtor, request, callback) { if (!request) throw TypeError("request must be specified"); var self = this; if (!callback) return util.asPromise(rpcCall, self, method, requestCtor, responseCtor, request); if (!self.rpcImpl) { setTimeout(function() { callback(Error("already ended")); }, 0); return undefined; } try { return self.rpcImpl( method, requestCtor[self.requestDelimited ? "encodeDelimited" : "encode"](request).finish(), function rpcCallback(err, response) { if (err) { self.emit("error", err, method); return callback(err); } if (response === null) { self.end(/* endedByRPC */ true); return undefined; } if (!(response instanceof responseCtor)) { try { response = responseCtor[self.responseDelimited ? "decodeDelimited" : "decode"](response); } catch (err) { self.emit("error", err, method); return callback(err); } } self.emit("data", response, method); return callback(null, response); } ); } catch (err) { self.emit("error", err, method); setTimeout(function() { callback(err); }, 0); return undefined; } }; /** * Ends this service and emits the `end` event. * @param {boolean} [endedByRPC=false] Whether the service has been ended by the RPC implementation. * @returns {rpc.Service} `this` */ Service.prototype.end = function end(endedByRPC) { if (this.rpcImpl) { if (!endedByRPC) // signal end to rpcImpl this.rpcImpl(null, null, null); this.rpcImpl = null; this.emit("end").off(); } return this; }; },{"../util/minimal":723}],722:[function(require,module,exports){ "use strict"; module.exports = LongBits; var util = require("../util/minimal"); /** * Constructs new long bits. * @classdesc Helper class for working with the low and high bits of a 64 bit value. * @memberof util * @constructor * @param {number} lo Low 32 bits, unsigned * @param {number} hi High 32 bits, unsigned */ function LongBits(lo, hi) { // note that the casts below are theoretically unnecessary as of today, but older statically // generated converter code might still call the ctor with signed 32bits. kept for compat. /** * Low bits. * @type {number} */ this.lo = lo >>> 0; /** * High bits. * @type {number} */ this.hi = hi >>> 0; } /** * Zero bits. * @memberof util.LongBits * @type {util.LongBits} */ var zero = LongBits.zero = new LongBits(0, 0); zero.toNumber = function() { return 0; }; zero.zzEncode = zero.zzDecode = function() { return this; }; zero.length = function() { return 1; }; /** * Zero hash. * @memberof util.LongBits * @type {string} */ var zeroHash = LongBits.zeroHash = "\0\0\0\0\0\0\0\0"; /** * Constructs new long bits from the specified number. * @param {number} value Value * @returns {util.LongBits} Instance */ LongBits.fromNumber = function fromNumber(value) { if (value === 0) return zero; var sign = value < 0; if (sign) value = -value; var lo = value >>> 0, hi = (value - lo) / 4294967296 >>> 0; if (sign) { hi = ~hi >>> 0; lo = ~lo >>> 0; if (++lo > 4294967295) { lo = 0; if (++hi > 4294967295) hi = 0; } } return new LongBits(lo, hi); }; /** * Constructs new long bits from a number, long or string. * @param {Long|number|string} value Value * @returns {util.LongBits} Instance */ LongBits.from = function from(value) { if (typeof value === "number") return LongBits.fromNumber(value); if (util.isString(value)) { /* istanbul ignore else */ if (util.Long) value = util.Long.fromString(value); else return LongBits.fromNumber(parseInt(value, 10)); } return value.low || value.high ? new LongBits(value.low >>> 0, value.high >>> 0) : zero; }; /** * Converts this long bits to a possibly unsafe JavaScript number. * @param {boolean} [unsigned=false] Whether unsigned or not * @returns {number} Possibly unsafe number */ LongBits.prototype.toNumber = function toNumber(unsigned) { if (!unsigned && this.hi >>> 31) { var lo = ~this.lo + 1 >>> 0, hi = ~this.hi >>> 0; if (!lo) hi = hi + 1 >>> 0; return -(lo + hi * 4294967296); } return this.lo + this.hi * 4294967296; }; /** * Converts this long bits to a long. * @param {boolean} [unsigned=false] Whether unsigned or not * @returns {Long} Long */ LongBits.prototype.toLong = function toLong(unsigned) { return util.Long ? new util.Long(this.lo | 0, this.hi | 0, Boolean(unsigned)) /* istanbul ignore next */ : { low: this.lo | 0, high: this.hi | 0, unsigned: Boolean(unsigned) }; }; var charCodeAt = String.prototype.charCodeAt; /** * Constructs new long bits from the specified 8 characters long hash. * @param {string} hash Hash * @returns {util.LongBits} Bits */ LongBits.fromHash = function fromHash(hash) { if (hash === zeroHash) return zero; return new LongBits( ( charCodeAt.call(hash, 0) | charCodeAt.call(hash, 1) << 8 | charCodeAt.call(hash, 2) << 16 | charCodeAt.call(hash, 3) << 24) >>> 0 , ( charCodeAt.call(hash, 4) | charCodeAt.call(hash, 5) << 8 | charCodeAt.call(hash, 6) << 16 | charCodeAt.call(hash, 7) << 24) >>> 0 ); }; /** * Converts this long bits to a 8 characters long hash. * @returns {string} Hash */ LongBits.prototype.toHash = function toHash() { return String.fromCharCode( this.lo & 255, this.lo >>> 8 & 255, this.lo >>> 16 & 255, this.lo >>> 24 , this.hi & 255, this.hi >>> 8 & 255, this.hi >>> 16 & 255, this.hi >>> 24 ); }; /** * Zig-zag encodes this long bits. * @returns {util.LongBits} `this` */ LongBits.prototype.zzEncode = function zzEncode() { var mask = this.hi >> 31; this.hi = ((this.hi << 1 | this.lo >>> 31) ^ mask) >>> 0; this.lo = ( this.lo << 1 ^ mask) >>> 0; return this; }; /** * Zig-zag decodes this long bits. * @returns {util.LongBits} `this` */ LongBits.prototype.zzDecode = function zzDecode() { var mask = -(this.lo & 1); this.lo = ((this.lo >>> 1 | this.hi << 31) ^ mask) >>> 0; this.hi = ( this.hi >>> 1 ^ mask) >>> 0; return this; }; /** * Calculates the length of this longbits when encoded as a varint. * @returns {number} Length */ LongBits.prototype.length = function length() { var part0 = this.lo, part1 = (this.lo >>> 28 | this.hi << 4) >>> 0, part2 = this.hi >>> 24; return part2 === 0 ? part1 === 0 ? part0 < 16384 ? part0 < 128 ? 1 : 2 : part0 < 2097152 ? 3 : 4 : part1 < 16384 ? part1 < 128 ? 5 : 6 : part1 < 2097152 ? 7 : 8 : part2 < 128 ? 9 : 10; }; },{"../util/minimal":723}],723:[function(require,module,exports){ (function (global){(function (){ "use strict"; var util = exports; // used to return a Promise where callback is omitted util.asPromise = require("@protobufjs/aspromise"); // converts to / from base64 encoded strings util.base64 = require("@protobufjs/base64"); // base class of rpc.Service util.EventEmitter = require("@protobufjs/eventemitter"); // float handling accross browsers util.float = require("@protobufjs/float"); // requires modules optionally and hides the call from bundlers util.inquire = require("@protobufjs/inquire"); // converts to / from utf8 encoded strings util.utf8 = require("@protobufjs/utf8"); // provides a node-like buffer pool in the browser util.pool = require("@protobufjs/pool"); // utility to work with the low and high bits of a 64 bit value util.LongBits = require("./longbits"); /** * Whether running within node or not. * @memberof util * @type {boolean} */ util.isNode = Boolean(typeof global !== "undefined" && global && global.process && global.process.versions && global.process.versions.node); /** * Global object reference. * @memberof util * @type {Object} */ util.global = util.isNode && global || typeof window !== "undefined" && window || typeof self !== "undefined" && self || this; // eslint-disable-line no-invalid-this /** * An immuable empty array. * @memberof util * @type {Array.<*>} * @const */ util.emptyArray = Object.freeze ? Object.freeze([]) : /* istanbul ignore next */ []; // used on prototypes /** * An immutable empty object. * @type {Object} * @const */ util.emptyObject = Object.freeze ? Object.freeze({}) : /* istanbul ignore next */ {}; // used on prototypes /** * Tests if the specified value is an integer. * @function * @param {*} value Value to test * @returns {boolean} `true` if the value is an integer */ util.isInteger = Number.isInteger || /* istanbul ignore next */ function isInteger(value) { return typeof value === "number" && isFinite(value) && Math.floor(value) === value; }; /** * Tests if the specified value is a string. * @param {*} value Value to test * @returns {boolean} `true` if the value is a string */ util.isString = function isString(value) { return typeof value === "string" || value instanceof String; }; /** * Tests if the specified value is a non-null object. * @param {*} value Value to test * @returns {boolean} `true` if the value is a non-null object */ util.isObject = function isObject(value) { return value && typeof value === "object"; }; /** * Checks if a property on a message is considered to be present. * This is an alias of {@link util.isSet}. * @function * @param {Object} obj Plain object or message instance * @param {string} prop Property name * @returns {boolean} `true` if considered to be present, otherwise `false` */ util.isset = /** * Checks if a property on a message is considered to be present. * @param {Object} obj Plain object or message instance * @param {string} prop Property name * @returns {boolean} `true` if considered to be present, otherwise `false` */ util.isSet = function isSet(obj, prop) { var value = obj[prop]; if (value != null && obj.hasOwnProperty(prop)) // eslint-disable-line eqeqeq, no-prototype-builtins return typeof value !== "object" || (Array.isArray(value) ? value.length : Object.keys(value).length) > 0; return false; }; /** * Any compatible Buffer instance. * This is a minimal stand-alone definition of a Buffer instance. The actual type is that exported by node's typings. * @interface Buffer * @extends Uint8Array */ /** * Node's Buffer class if available. * @type {Constructor} */ util.Buffer = (function() { try { var Buffer = util.inquire("buffer").Buffer; // refuse to use non-node buffers if not explicitly assigned (perf reasons): return Buffer.prototype.utf8Write ? Buffer : /* istanbul ignore next */ null; } catch (e) { /* istanbul ignore next */ return null; } })(); // Internal alias of or polyfull for Buffer.from. util._Buffer_from = null; // Internal alias of or polyfill for Buffer.allocUnsafe. util._Buffer_allocUnsafe = null; /** * Creates a new buffer of whatever type supported by the environment. * @param {number|number[]} [sizeOrArray=0] Buffer size or number array * @returns {Uint8Array|Buffer} Buffer */ util.newBuffer = function newBuffer(sizeOrArray) { /* istanbul ignore next */ return typeof sizeOrArray === "number" ? util.Buffer ? util._Buffer_allocUnsafe(sizeOrArray) : new util.Array(sizeOrArray) : util.Buffer ? util._Buffer_from(sizeOrArray) : typeof Uint8Array === "undefined" ? sizeOrArray : new Uint8Array(sizeOrArray); }; /** * Array implementation used in the browser. `Uint8Array` if supported, otherwise `Array`. * @type {Constructor} */ util.Array = typeof Uint8Array !== "undefined" ? Uint8Array /* istanbul ignore next */ : Array; /** * Any compatible Long instance. * This is a minimal stand-alone definition of a Long instance. The actual type is that exported by long.js. * @interface Long * @property {number} low Low bits * @property {number} high High bits * @property {boolean} unsigned Whether unsigned or not */ /** * Long.js's Long class if available. * @type {Constructor} */ util.Long = /* istanbul ignore next */ util.global.dcodeIO && /* istanbul ignore next */ util.global.dcodeIO.Long || /* istanbul ignore next */ util.global.Long || util.inquire("long"); /** * Regular expression used to verify 2 bit (`bool`) map keys. * @type {RegExp} * @const */ util.key2Re = /^true|false|0|1$/; /** * Regular expression used to verify 32 bit (`int32` etc.) map keys. * @type {RegExp} * @const */ util.key32Re = /^-?(?:0|[1-9][0-9]*)$/; /** * Regular expression used to verify 64 bit (`int64` etc.) map keys. * @type {RegExp} * @const */ util.key64Re = /^(?:[\\x00-\\xff]{8}|-?(?:0|[1-9][0-9]*))$/; /** * Converts a number or long to an 8 characters long hash string. * @param {Long|number} value Value to convert * @returns {string} Hash */ util.longToHash = function longToHash(value) { return value ? util.LongBits.from(value).toHash() : util.LongBits.zeroHash; }; /** * Converts an 8 characters long hash string to a long or number. * @param {string} hash Hash * @param {boolean} [unsigned=false] Whether unsigned or not * @returns {Long|number} Original value */ util.longFromHash = function longFromHash(hash, unsigned) { var bits = util.LongBits.fromHash(hash); if (util.Long) return util.Long.fromBits(bits.lo, bits.hi, unsigned); return bits.toNumber(Boolean(unsigned)); }; /** * Merges the properties of the source object into the destination object. * @memberof util * @param {Object.} dst Destination object * @param {Object.} src Source object * @param {boolean} [ifNotSet=false] Merges only if the key is not already set * @returns {Object.} Destination object */ function merge(dst, src, ifNotSet) { // used by converters for (var keys = Object.keys(src), i = 0; i < keys.length; ++i) if (dst[keys[i]] === undefined || !ifNotSet) dst[keys[i]] = src[keys[i]]; return dst; } util.merge = merge; /** * Converts the first character of a string to lower case. * @param {string} str String to convert * @returns {string} Converted string */ util.lcFirst = function lcFirst(str) { return str.charAt(0).toLowerCase() + str.substring(1); }; /** * Creates a custom error constructor. * @memberof util * @param {string} name Error name * @returns {Constructor} Custom error constructor */ function newError(name) { function CustomError(message, properties) { if (!(this instanceof CustomError)) return new CustomError(message, properties); // Error.call(this, message); // ^ just returns a new error instance because the ctor can be called as a function Object.defineProperty(this, "message", { get: function() { return message; } }); /* istanbul ignore next */ if (Error.captureStackTrace) // node Error.captureStackTrace(this, CustomError); else Object.defineProperty(this, "stack", { value: new Error().stack || "" }); if (properties) merge(this, properties); } (CustomError.prototype = Object.create(Error.prototype)).constructor = CustomError; Object.defineProperty(CustomError.prototype, "name", { get: function() { return name; } }); CustomError.prototype.toString = function toString() { return this.name + ": " + this.message; }; return CustomError; } util.newError = newError; /** * Constructs a new protocol error. * @classdesc Error subclass indicating a protocol specifc error. * @memberof util * @extends Error * @template T extends Message * @constructor * @param {string} message Error message * @param {Object.} [properties] Additional properties * @example * try { * MyMessage.decode(someBuffer); // throws if required fields are missing * } catch (e) { * if (e instanceof ProtocolError && e.instance) * console.log("decoded so far: " + JSON.stringify(e.instance)); * } */ util.ProtocolError = newError("ProtocolError"); /** * So far decoded message instance. * @name util.ProtocolError#instance * @type {Message} */ /** * A OneOf getter as returned by {@link util.oneOfGetter}. * @typedef OneOfGetter * @type {function} * @returns {string|undefined} Set field name, if any */ /** * Builds a getter for a oneof's present field name. * @param {string[]} fieldNames Field names * @returns {OneOfGetter} Unbound getter */ util.oneOfGetter = function getOneOf(fieldNames) { var fieldMap = {}; for (var i = 0; i < fieldNames.length; ++i) fieldMap[fieldNames[i]] = 1; /** * @returns {string|undefined} Set field name, if any * @this Object * @ignore */ return function() { // eslint-disable-line consistent-return for (var keys = Object.keys(this), i = keys.length - 1; i > -1; --i) if (fieldMap[keys[i]] === 1 && this[keys[i]] !== undefined && this[keys[i]] !== null) return keys[i]; }; }; /** * A OneOf setter as returned by {@link util.oneOfSetter}. * @typedef OneOfSetter * @type {function} * @param {string|undefined} value Field name * @returns {undefined} */ /** * Builds a setter for a oneof's present field name. * @param {string[]} fieldNames Field names * @returns {OneOfSetter} Unbound setter */ util.oneOfSetter = function setOneOf(fieldNames) { /** * @param {string} name Field name * @returns {undefined} * @this Object * @ignore */ return function(name) { for (var i = 0; i < fieldNames.length; ++i) if (fieldNames[i] !== name) delete this[fieldNames[i]]; }; }; /** * Default conversion options used for {@link Message#toJSON} implementations. * * These options are close to proto3's JSON mapping with the exception that internal types like Any are handled just like messages. More precisely: * * - Longs become strings * - Enums become string keys * - Bytes become base64 encoded strings * - (Sub-)Messages become plain objects * - Maps become plain objects with all string keys * - Repeated fields become arrays * - NaN and Infinity for float and double fields become strings * * @type {IConversionOptions} * @see https://developers.google.com/protocol-buffers/docs/proto3?hl=en#json */ util.toJSONOptions = { longs: String, enums: String, bytes: String, json: true }; // Sets up buffer utility according to the environment (called in index-minimal) util._configure = function() { var Buffer = util.Buffer; /* istanbul ignore if */ if (!Buffer) { util._Buffer_from = util._Buffer_allocUnsafe = null; return; } // because node 4.x buffers are incompatible & immutable // see: https://github.com/dcodeIO/protobuf.js/pull/665 util._Buffer_from = Buffer.from !== Uint8Array.from && Buffer.from || /* istanbul ignore next */ function Buffer_from(value, encoding) { return new Buffer(value, encoding); }; util._Buffer_allocUnsafe = Buffer.allocUnsafe || /* istanbul ignore next */ function Buffer_allocUnsafe(size) { return new Buffer(size); }; }; }).call(this)}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) },{"./longbits":722,"@protobufjs/aspromise":66,"@protobufjs/base64":67,"@protobufjs/eventemitter":68,"@protobufjs/float":69,"@protobufjs/inquire":70,"@protobufjs/pool":71,"@protobufjs/utf8":72}],724:[function(require,module,exports){ "use strict"; module.exports = Writer; var util = require("./util/minimal"); var BufferWriter; // cyclic var LongBits = util.LongBits, base64 = util.base64, utf8 = util.utf8; /** * Constructs a new writer operation instance. * @classdesc Scheduled writer operation. * @constructor * @param {function(*, Uint8Array, number)} fn Function to call * @param {number} len Value byte length * @param {*} val Value to write * @ignore */ function Op(fn, len, val) { /** * Function to call. * @type {function(Uint8Array, number, *)} */ this.fn = fn; /** * Value byte length. * @type {number} */ this.len = len; /** * Next operation. * @type {Writer.Op|undefined} */ this.next = undefined; /** * Value to write. * @type {*} */ this.val = val; // type varies } /* istanbul ignore next */ function noop() {} // eslint-disable-line no-empty-function /** * Constructs a new writer state instance. * @classdesc Copied writer state. * @memberof Writer * @constructor * @param {Writer} writer Writer to copy state from * @ignore */ function State(writer) { /** * Current head. * @type {Writer.Op} */ this.head = writer.head; /** * Current tail. * @type {Writer.Op} */ this.tail = writer.tail; /** * Current buffer length. * @type {number} */ this.len = writer.len; /** * Next state. * @type {State|null} */ this.next = writer.states; } /** * Constructs a new writer instance. * @classdesc Wire format writer using `Uint8Array` if available, otherwise `Array`. * @constructor */ function Writer() { /** * Current length. * @type {number} */ this.len = 0; /** * Operations head. * @type {Object} */ this.head = new Op(noop, 0, 0); /** * Operations tail * @type {Object} */ this.tail = this.head; /** * Linked forked states. * @type {Object|null} */ this.states = null; // When a value is written, the writer calculates its byte length and puts it into a linked // list of operations to perform when finish() is called. This both allows us to allocate // buffers of the exact required size and reduces the amount of work we have to do compared // to first calculating over objects and then encoding over objects. In our case, the encoding // part is just a linked list walk calling operations with already prepared values. } var create = function create() { return util.Buffer ? function create_buffer_setup() { return (Writer.create = function create_buffer() { return new BufferWriter(); })(); } /* istanbul ignore next */ : function create_array() { return new Writer(); }; }; /** * Creates a new writer. * @function * @returns {BufferWriter|Writer} A {@link BufferWriter} when Buffers are supported, otherwise a {@link Writer} */ Writer.create = create(); /** * Allocates a buffer of the specified size. * @param {number} size Buffer size * @returns {Uint8Array} Buffer */ Writer.alloc = function alloc(size) { return new util.Array(size); }; // Use Uint8Array buffer pool in the browser, just like node does with buffers /* istanbul ignore else */ if (util.Array !== Array) Writer.alloc = util.pool(Writer.alloc, util.Array.prototype.subarray); /** * Pushes a new operation to the queue. * @param {function(Uint8Array, number, *)} fn Function to call * @param {number} len Value byte length * @param {number} val Value to write * @returns {Writer} `this` * @private */ Writer.prototype._push = function push(fn, len, val) { this.tail = this.tail.next = new Op(fn, len, val); this.len += len; return this; }; function writeByte(val, buf, pos) { buf[pos] = val & 255; } function writeVarint32(val, buf, pos) { while (val > 127) { buf[pos++] = val & 127 | 128; val >>>= 7; } buf[pos] = val; } /** * Constructs a new varint writer operation instance. * @classdesc Scheduled varint writer operation. * @extends Op * @constructor * @param {number} len Value byte length * @param {number} val Value to write * @ignore */ function VarintOp(len, val) { this.len = len; this.next = undefined; this.val = val; } VarintOp.prototype = Object.create(Op.prototype); VarintOp.prototype.fn = writeVarint32; /** * Writes an unsigned 32 bit value as a varint. * @param {number} value Value to write * @returns {Writer} `this` */ Writer.prototype.uint32 = function write_uint32(value) { // here, the call to this.push has been inlined and a varint specific Op subclass is used. // uint32 is by far the most frequently used operation and benefits significantly from this. this.len += (this.tail = this.tail.next = new VarintOp( (value = value >>> 0) < 128 ? 1 : value < 16384 ? 2 : value < 2097152 ? 3 : value < 268435456 ? 4 : 5, value)).len; return this; }; /** * Writes a signed 32 bit value as a varint. * @function * @param {number} value Value to write * @returns {Writer} `this` */ Writer.prototype.int32 = function write_int32(value) { return value < 0 ? this._push(writeVarint64, 10, LongBits.fromNumber(value)) // 10 bytes per spec : this.uint32(value); }; /** * Writes a 32 bit value as a varint, zig-zag encoded. * @param {number} value Value to write * @returns {Writer} `this` */ Writer.prototype.sint32 = function write_sint32(value) { return this.uint32((value << 1 ^ value >> 31) >>> 0); }; function writeVarint64(val, buf, pos) { while (val.hi) { buf[pos++] = val.lo & 127 | 128; val.lo = (val.lo >>> 7 | val.hi << 25) >>> 0; val.hi >>>= 7; } while (val.lo > 127) { buf[pos++] = val.lo & 127 | 128; val.lo = val.lo >>> 7; } buf[pos++] = val.lo; } /** * Writes an unsigned 64 bit value as a varint. * @param {Long|number|string} value Value to write * @returns {Writer} `this` * @throws {TypeError} If `value` is a string and no long library is present. */ Writer.prototype.uint64 = function write_uint64(value) { var bits = LongBits.from(value); return this._push(writeVarint64, bits.length(), bits); }; /** * Writes a signed 64 bit value as a varint. * @function * @param {Long|number|string} value Value to write * @returns {Writer} `this` * @throws {TypeError} If `value` is a string and no long library is present. */ Writer.prototype.int64 = Writer.prototype.uint64; /** * Writes a signed 64 bit value as a varint, zig-zag encoded. * @param {Long|number|string} value Value to write * @returns {Writer} `this` * @throws {TypeError} If `value` is a string and no long library is present. */ Writer.prototype.sint64 = function write_sint64(value) { var bits = LongBits.from(value).zzEncode(); return this._push(writeVarint64, bits.length(), bits); }; /** * Writes a boolish value as a varint. * @param {boolean} value Value to write * @returns {Writer} `this` */ Writer.prototype.bool = function write_bool(value) { return this._push(writeByte, 1, value ? 1 : 0); }; function writeFixed32(val, buf, pos) { buf[pos ] = val & 255; buf[pos + 1] = val >>> 8 & 255; buf[pos + 2] = val >>> 16 & 255; buf[pos + 3] = val >>> 24; } /** * Writes an unsigned 32 bit value as fixed 32 bits. * @param {number} value Value to write * @returns {Writer} `this` */ Writer.prototype.fixed32 = function write_fixed32(value) { return this._push(writeFixed32, 4, value >>> 0); }; /** * Writes a signed 32 bit value as fixed 32 bits. * @function * @param {number} value Value to write * @returns {Writer} `this` */ Writer.prototype.sfixed32 = Writer.prototype.fixed32; /** * Writes an unsigned 64 bit value as fixed 64 bits. * @param {Long|number|string} value Value to write * @returns {Writer} `this` * @throws {TypeError} If `value` is a string and no long library is present. */ Writer.prototype.fixed64 = function write_fixed64(value) { var bits = LongBits.from(value); return this._push(writeFixed32, 4, bits.lo)._push(writeFixed32, 4, bits.hi); }; /** * Writes a signed 64 bit value as fixed 64 bits. * @function * @param {Long|number|string} value Value to write * @returns {Writer} `this` * @throws {TypeError} If `value` is a string and no long library is present. */ Writer.prototype.sfixed64 = Writer.prototype.fixed64; /** * Writes a float (32 bit). * @function * @param {number} value Value to write * @returns {Writer} `this` */ Writer.prototype.float = function write_float(value) { return this._push(util.float.writeFloatLE, 4, value); }; /** * Writes a double (64 bit float). * @function * @param {number} value Value to write * @returns {Writer} `this` */ Writer.prototype.double = function write_double(value) { return this._push(util.float.writeDoubleLE, 8, value); }; var writeBytes = util.Array.prototype.set ? function writeBytes_set(val, buf, pos) { buf.set(val, pos); // also works for plain array values } /* istanbul ignore next */ : function writeBytes_for(val, buf, pos) { for (var i = 0; i < val.length; ++i) buf[pos + i] = val[i]; }; /** * Writes a sequence of bytes. * @param {Uint8Array|string} value Buffer or base64 encoded string to write * @returns {Writer} `this` */ Writer.prototype.bytes = function write_bytes(value) { var len = value.length >>> 0; if (!len) return this._push(writeByte, 1, 0); if (util.isString(value)) { var buf = Writer.alloc(len = base64.length(value)); base64.decode(value, buf, 0); value = buf; } return this.uint32(len)._push(writeBytes, len, value); }; /** * Writes a string. * @param {string} value Value to write * @returns {Writer} `this` */ Writer.prototype.string = function write_string(value) { var len = utf8.length(value); return len ? this.uint32(len)._push(utf8.write, len, value) : this._push(writeByte, 1, 0); }; /** * Forks this writer's state by pushing it to a stack. * Calling {@link Writer#reset|reset} or {@link Writer#ldelim|ldelim} resets the writer to the previous state. * @returns {Writer} `this` */ Writer.prototype.fork = function fork() { this.states = new State(this); this.head = this.tail = new Op(noop, 0, 0); this.len = 0; return this; }; /** * Resets this instance to the last state. * @returns {Writer} `this` */ Writer.prototype.reset = function reset() { if (this.states) { this.head = this.states.head; this.tail = this.states.tail; this.len = this.states.len; this.states = this.states.next; } else { this.head = this.tail = new Op(noop, 0, 0); this.len = 0; } return this; }; /** * Resets to the last state and appends the fork state's current write length as a varint followed by its operations. * @returns {Writer} `this` */ Writer.prototype.ldelim = function ldelim() { var head = this.head, tail = this.tail, len = this.len; this.reset().uint32(len); if (len) { this.tail.next = head.next; // skip noop this.tail = tail; this.len += len; } return this; }; /** * Finishes the write operation. * @returns {Uint8Array} Finished buffer */ Writer.prototype.finish = function finish() { var head = this.head.next, // skip noop buf = this.constructor.alloc(this.len), pos = 0; while (head) { head.fn(head.val, buf, pos); pos += head.len; head = head.next; } // this.head = this.tail = null; return buf; }; Writer._configure = function(BufferWriter_) { BufferWriter = BufferWriter_; Writer.create = create(); BufferWriter._configure(); }; },{"./util/minimal":723}],725:[function(require,module,exports){ "use strict"; module.exports = BufferWriter; // extends Writer var Writer = require("./writer"); (BufferWriter.prototype = Object.create(Writer.prototype)).constructor = BufferWriter; var util = require("./util/minimal"); /** * Constructs a new buffer writer instance. * @classdesc Wire format writer using node buffers. * @extends Writer * @constructor */ function BufferWriter() { Writer.call(this); } BufferWriter._configure = function () { /** * Allocates a buffer of the specified size. * @function * @param {number} size Buffer size * @returns {Buffer} Buffer */ BufferWriter.alloc = util._Buffer_allocUnsafe; BufferWriter.writeBytesBuffer = util.Buffer && util.Buffer.prototype instanceof Uint8Array && util.Buffer.prototype.set.name === "set" ? function writeBytesBuffer_set(val, buf, pos) { buf.set(val, pos); // faster than copy (requires node >= 4 where Buffers extend Uint8Array and set is properly inherited) // also works for plain array values } /* istanbul ignore next */ : function writeBytesBuffer_copy(val, buf, pos) { if (val.copy) // Buffer values val.copy(buf, pos, 0, val.length); else for (var i = 0; i < val.length;) // plain array values buf[pos++] = val[i++]; }; }; /** * @override */ BufferWriter.prototype.bytes = function write_bytes_buffer(value) { if (util.isString(value)) value = util._Buffer_from(value, "base64"); var len = value.length >>> 0; this.uint32(len); if (len) this._push(BufferWriter.writeBytesBuffer, len, value); return this; }; function writeStringBuffer(val, buf, pos) { if (val.length < 40) // plain js is faster for short strings (probably due to redundant assertions) util.utf8.write(val, buf, pos); else if (buf.utf8Write) buf.utf8Write(val, pos); else buf.write(val, pos); } /** * @override */ BufferWriter.prototype.string = function write_string_buffer(value) { var len = util.Buffer.byteLength(value); this.uint32(len); if (len) this._push(writeStringBuffer, len, value); return this; }; /** * Finishes the write operation. * @name BufferWriter#finish * @function * @returns {Buffer} Finished buffer */ BufferWriter._configure(); },{"./util/minimal":723,"./writer":724}],726:[function(require,module,exports){ (function (global){(function (){ /*! https://mths.be/punycode v1.4.1 by @mathias */ ;(function(root) { /** Detect free variables */ var freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports; var freeModule = typeof module == 'object' && module && !module.nodeType && module; var freeGlobal = typeof global == 'object' && global; if ( freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal || freeGlobal.self === freeGlobal ) { root = freeGlobal; } /** * The `punycode` object. * @name punycode * @type Object */ var punycode, /** Highest positive signed 32-bit float value */ maxInt = 2147483647, // aka. 0x7FFFFFFF or 2^31-1 /** Bootstring parameters */ base = 36, tMin = 1, tMax = 26, skew = 38, damp = 700, initialBias = 72, initialN = 128, // 0x80 delimiter = '-', // '\x2D' /** Regular expressions */ regexPunycode = /^xn--/, regexNonASCII = /[^\x20-\x7E]/, // unprintable ASCII chars + non-ASCII chars regexSeparators = /[\x2E\u3002\uFF0E\uFF61]/g, // RFC 3490 separators /** Error messages */ errors = { 'overflow': 'Overflow: input needs wider integers to process', 'not-basic': 'Illegal input >= 0x80 (not a basic code point)', 'invalid-input': 'Invalid input' }, /** Convenience shortcuts */ baseMinusTMin = base - tMin, floor = Math.floor, stringFromCharCode = String.fromCharCode, /** Temporary variable */ key; /*--------------------------------------------------------------------------*/ /** * A generic error utility function. * @private * @param {String} type The error type. * @returns {Error} Throws a `RangeError` with the applicable error message. */ function error(type) { throw new RangeError(errors[type]); } /** * A generic `Array#map` utility function. * @private * @param {Array} array The array to iterate over. * @param {Function} callback The function that gets called for every array * item. * @returns {Array} A new array of values returned by the callback function. */ function map(array, fn) { var length = array.length; var result = []; while (length--) { result[length] = fn(array[length]); } return result; } /** * A simple `Array#map`-like wrapper to work with domain name strings or email * addresses. * @private * @param {String} domain The domain name or email address. * @param {Function} callback The function that gets called for every * character. * @returns {Array} A new string of characters returned by the callback * function. */ function mapDomain(string, fn) { var parts = string.split('@'); var result = ''; if (parts.length > 1) { // In email addresses, only the domain name should be punycoded. Leave // the local part (i.e. everything up to `@`) intact. result = parts[0] + '@'; string = parts[1]; } // Avoid `split(regex)` for IE8 compatibility. See #17. string = string.replace(regexSeparators, '\x2E'); var labels = string.split('.'); var encoded = map(labels, fn).join('.'); return result + encoded; } /** * Creates an array containing the numeric code points of each Unicode * character in the string. While JavaScript uses UCS-2 internally, * this function will convert a pair of surrogate halves (each of which * UCS-2 exposes as separate characters) into a single code point, * matching UTF-16. * @see `punycode.ucs2.encode` * @see * @memberOf punycode.ucs2 * @name decode * @param {String} string The Unicode input string (UCS-2). * @returns {Array} The new array of code points. */ function ucs2decode(string) { var output = [], counter = 0, length = string.length, value, extra; while (counter < length) { value = string.charCodeAt(counter++); if (value >= 0xD800 && value <= 0xDBFF && counter < length) { // high surrogate, and there is a next character extra = string.charCodeAt(counter++); if ((extra & 0xFC00) == 0xDC00) { // low surrogate output.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000); } else { // unmatched surrogate; only append this code unit, in case the next // code unit is the high surrogate of a surrogate pair output.push(value); counter--; } } else { output.push(value); } } return output; } /** * Creates a string based on an array of numeric code points. * @see `punycode.ucs2.decode` * @memberOf punycode.ucs2 * @name encode * @param {Array} codePoints The array of numeric code points. * @returns {String} The new Unicode string (UCS-2). */ function ucs2encode(array) { return map(array, function(value) { var output = ''; if (value > 0xFFFF) { value -= 0x10000; output += stringFromCharCode(value >>> 10 & 0x3FF | 0xD800); value = 0xDC00 | value & 0x3FF; } output += stringFromCharCode(value); return output; }).join(''); } /** * Converts a basic code point into a digit/integer. * @see `digitToBasic()` * @private * @param {Number} codePoint The basic numeric code point value. * @returns {Number} The numeric value of a basic code point (for use in * representing integers) in the range `0` to `base - 1`, or `base` if * the code point does not represent a value. */ function basicToDigit(codePoint) { if (codePoint - 48 < 10) { return codePoint - 22; } if (codePoint - 65 < 26) { return codePoint - 65; } if (codePoint - 97 < 26) { return codePoint - 97; } return base; } /** * Converts a digit/integer into a basic code point. * @see `basicToDigit()` * @private * @param {Number} digit The numeric value of a basic code point. * @returns {Number} The basic code point whose value (when used for * representing integers) is `digit`, which needs to be in the range * `0` to `base - 1`. If `flag` is non-zero, the uppercase form is * used; else, the lowercase form is used. The behavior is undefined * if `flag` is non-zero and `digit` has no uppercase form. */ function digitToBasic(digit, flag) { // 0..25 map to ASCII a..z or A..Z // 26..35 map to ASCII 0..9 return digit + 22 + 75 * (digit < 26) - ((flag != 0) << 5); } /** * Bias adaptation function as per section 3.4 of RFC 3492. * https://tools.ietf.org/html/rfc3492#section-3.4 * @private */ function adapt(delta, numPoints, firstTime) { var k = 0; delta = firstTime ? floor(delta / damp) : delta >> 1; delta += floor(delta / numPoints); for (/* no initialization */; delta > baseMinusTMin * tMax >> 1; k += base) { delta = floor(delta / baseMinusTMin); } return floor(k + (baseMinusTMin + 1) * delta / (delta + skew)); } /** * Converts a Punycode string of ASCII-only symbols to a string of Unicode * symbols. * @memberOf punycode * @param {String} input The Punycode string of ASCII-only symbols. * @returns {String} The resulting string of Unicode symbols. */ function decode(input) { // Don't use UCS-2 var output = [], inputLength = input.length, out, i = 0, n = initialN, bias = initialBias, basic, j, index, oldi, w, k, digit, t, /** Cached calculation results */ baseMinusT; // Handle the basic code points: let `basic` be the number of input code // points before the last delimiter, or `0` if there is none, then copy // the first basic code points to the output. basic = input.lastIndexOf(delimiter); if (basic < 0) { basic = 0; } for (j = 0; j < basic; ++j) { // if it's not a basic code point if (input.charCodeAt(j) >= 0x80) { error('not-basic'); } output.push(input.charCodeAt(j)); } // Main decoding loop: start just after the last delimiter if any basic code // points were copied; start at the beginning otherwise. for (index = basic > 0 ? basic + 1 : 0; index < inputLength; /* no final expression */) { // `index` is the index of the next character to be consumed. // Decode a generalized variable-length integer into `delta`, // which gets added to `i`. The overflow checking is easier // if we increase `i` as we go, then subtract off its starting // value at the end to obtain `delta`. for (oldi = i, w = 1, k = base; /* no condition */; k += base) { if (index >= inputLength) { error('invalid-input'); } digit = basicToDigit(input.charCodeAt(index++)); if (digit >= base || digit > floor((maxInt - i) / w)) { error('overflow'); } i += digit * w; t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias); if (digit < t) { break; } baseMinusT = base - t; if (w > floor(maxInt / baseMinusT)) { error('overflow'); } w *= baseMinusT; } out = output.length + 1; bias = adapt(i - oldi, out, oldi == 0); // `i` was supposed to wrap around from `out` to `0`, // incrementing `n` each time, so we'll fix that now: if (floor(i / out) > maxInt - n) { error('overflow'); } n += floor(i / out); i %= out; // Insert `n` at position `i` of the output output.splice(i++, 0, n); } return ucs2encode(output); } /** * Converts a string of Unicode symbols (e.g. a domain name label) to a * Punycode string of ASCII-only symbols. * @memberOf punycode * @param {String} input The string of Unicode symbols. * @returns {String} The resulting Punycode string of ASCII-only symbols. */ function encode(input) { var n, delta, handledCPCount, basicLength, bias, j, m, q, k, t, currentValue, output = [], /** `inputLength` will hold the number of code points in `input`. */ inputLength, /** Cached calculation results */ handledCPCountPlusOne, baseMinusT, qMinusT; // Convert the input in UCS-2 to Unicode input = ucs2decode(input); // Cache the length inputLength = input.length; // Initialize the state n = initialN; delta = 0; bias = initialBias; // Handle the basic code points for (j = 0; j < inputLength; ++j) { currentValue = input[j]; if (currentValue < 0x80) { output.push(stringFromCharCode(currentValue)); } } handledCPCount = basicLength = output.length; // `handledCPCount` is the number of code points that have been handled; // `basicLength` is the number of basic code points. // Finish the basic string - if it is not empty - with a delimiter if (basicLength) { output.push(delimiter); } // Main encoding loop: while (handledCPCount < inputLength) { // All non-basic code points < n have been handled already. Find the next // larger one: for (m = maxInt, j = 0; j < inputLength; ++j) { currentValue = input[j]; if (currentValue >= n && currentValue < m) { m = currentValue; } } // Increase `delta` enough to advance the decoder's state to , // but guard against overflow handledCPCountPlusOne = handledCPCount + 1; if (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) { error('overflow'); } delta += (m - n) * handledCPCountPlusOne; n = m; for (j = 0; j < inputLength; ++j) { currentValue = input[j]; if (currentValue < n && ++delta > maxInt) { error('overflow'); } if (currentValue == n) { // Represent delta as a generalized variable-length integer for (q = delta, k = base; /* no condition */; k += base) { t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias); if (q < t) { break; } qMinusT = q - t; baseMinusT = base - t; output.push( stringFromCharCode(digitToBasic(t + qMinusT % baseMinusT, 0)) ); q = floor(qMinusT / baseMinusT); } output.push(stringFromCharCode(digitToBasic(q, 0))); bias = adapt(delta, handledCPCountPlusOne, handledCPCount == basicLength); delta = 0; ++handledCPCount; } } ++delta; ++n; } return output.join(''); } /** * Converts a Punycode string representing a domain name or an email address * to Unicode. Only the Punycoded parts of the input will be converted, i.e. * it doesn't matter if you call it on a string that has already been * converted to Unicode. * @memberOf punycode * @param {String} input The Punycoded domain name or email address to * convert to Unicode. * @returns {String} The Unicode representation of the given Punycode * string. */ function toUnicode(input) { return mapDomain(input, function(string) { return regexPunycode.test(string) ? decode(string.slice(4).toLowerCase()) : string; }); } /** * Converts a Unicode string representing a domain name or an email address to * Punycode. Only the non-ASCII parts of the domain name will be converted, * i.e. it doesn't matter if you call it with a domain that's already in * ASCII. * @memberOf punycode * @param {String} input The domain name or email address to convert, as a * Unicode string. * @returns {String} The Punycode representation of the given domain name or * email address. */ function toASCII(input) { return mapDomain(input, function(string) { return regexNonASCII.test(string) ? 'xn--' + encode(string) : string; }); } /*--------------------------------------------------------------------------*/ /** Define the public API */ punycode = { /** * A string representing the current Punycode.js version number. * @memberOf punycode * @type String */ 'version': '1.4.1', /** * An object of methods to convert from JavaScript's internal character * representation (UCS-2) to Unicode code points, and back. * @see * @memberOf punycode * @type Object */ 'ucs2': { 'decode': ucs2decode, 'encode': ucs2encode }, 'decode': decode, 'encode': encode, 'toASCII': toASCII, 'toUnicode': toUnicode }; /** Expose `punycode` */ // Some AMD build optimizers, like r.js, check for specific condition patterns // like the following: if ( typeof define == 'function' && typeof define.amd == 'object' && define.amd ) { define('punycode', function() { return punycode; }); } else if (freeExports && freeModule) { if (module.exports == freeExports) { // in Node.js, io.js, or RingoJS v0.8.0+ freeModule.exports = punycode; } else { // in Narwhal or RingoJS v0.7.0- for (key in punycode) { punycode.hasOwnProperty(key) && (freeExports[key] = punycode[key]); } } } else { // in Rhino or a web browser root.punycode = punycode; } }(this)); }).call(this)}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) },{}],727:[function(require,module,exports){ // Copyright Joyent, Inc. and other Node contributors. // // Permission is hereby granted, free of charge, to any person obtaining a // copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to permit // persons to whom the Software is furnished to do so, subject to the // following conditions: // // The above copyright notice and this permission notice shall be included // in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE // USE OR OTHER DEALINGS IN THE SOFTWARE. 'use strict'; // If obj.hasOwnProperty has been overridden, then calling // obj.hasOwnProperty(prop) will break. // See: https://github.com/joyent/node/issues/1707 function hasOwnProperty(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); } module.exports = function(qs, sep, eq, options) { sep = sep || '&'; eq = eq || '='; var obj = {}; if (typeof qs !== 'string' || qs.length === 0) { return obj; } var regexp = /\+/g; qs = qs.split(sep); var maxKeys = 1000; if (options && typeof options.maxKeys === 'number') { maxKeys = options.maxKeys; } var len = qs.length; // maxKeys <= 0 means that we should not limit keys count if (maxKeys > 0 && len > maxKeys) { len = maxKeys; } for (var i = 0; i < len; ++i) { var x = qs[i].replace(regexp, '%20'), idx = x.indexOf(eq), kstr, vstr, k, v; if (idx >= 0) { kstr = x.substr(0, idx); vstr = x.substr(idx + 1); } else { kstr = x; vstr = ''; } k = decodeURIComponent(kstr); v = decodeURIComponent(vstr); if (!hasOwnProperty(obj, k)) { obj[k] = v; } else if (isArray(obj[k])) { obj[k].push(v); } else { obj[k] = [obj[k], v]; } } return obj; }; var isArray = Array.isArray || function (xs) { return Object.prototype.toString.call(xs) === '[object Array]'; }; },{}],728:[function(require,module,exports){ // Copyright Joyent, Inc. and other Node contributors. // // Permission is hereby granted, free of charge, to any person obtaining a // copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to permit // persons to whom the Software is furnished to do so, subject to the // following conditions: // // The above copyright notice and this permission notice shall be included // in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE // USE OR OTHER DEALINGS IN THE SOFTWARE. 'use strict'; var stringifyPrimitive = function(v) { switch (typeof v) { case 'string': return v; case 'boolean': return v ? 'true' : 'false'; case 'number': return isFinite(v) ? v : ''; default: return ''; } }; module.exports = function(obj, sep, eq, name) { sep = sep || '&'; eq = eq || '='; if (obj === null) { obj = undefined; } if (typeof obj === 'object') { return map(objectKeys(obj), function(k) { var ks = encodeURIComponent(stringifyPrimitive(k)) + eq; if (isArray(obj[k])) { return map(obj[k], function(v) { return ks + encodeURIComponent(stringifyPrimitive(v)); }).join(sep); } else { return ks + encodeURIComponent(stringifyPrimitive(obj[k])); } }).join(sep); } if (!name) return ''; return encodeURIComponent(stringifyPrimitive(name)) + eq + encodeURIComponent(stringifyPrimitive(obj)); }; var isArray = Array.isArray || function (xs) { return Object.prototype.toString.call(xs) === '[object Array]'; }; function map (xs, f) { if (xs.map) return xs.map(f); var res = []; for (var i = 0; i < xs.length; i++) { res.push(f(xs[i], i)); } return res; } var objectKeys = Object.keys || function (obj) { var res = []; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) res.push(key); } return res; }; },{}],729:[function(require,module,exports){ 'use strict'; exports.decode = exports.parse = require('./decode'); exports.encode = exports.stringify = require('./encode'); },{"./decode":727,"./encode":728}],730:[function(require,module,exports){ /** * Copyright (c) 2014-present, Facebook, Inc. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ var runtime = (function (exports) { "use strict"; var Op = Object.prototype; var hasOwn = Op.hasOwnProperty; var undefined; // More compressible than void 0. var $Symbol = typeof Symbol === "function" ? Symbol : {}; var iteratorSymbol = $Symbol.iterator || "@@iterator"; var asyncIteratorSymbol = $Symbol.asyncIterator || "@@asyncIterator"; var toStringTagSymbol = $Symbol.toStringTag || "@@toStringTag"; function define(obj, key, value) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); return obj[key]; } try { // IE 8 has a broken Object.defineProperty that only works on DOM objects. define({}, ""); } catch (err) { define = function(obj, key, value) { return obj[key] = value; }; } function wrap(innerFn, outerFn, self, tryLocsList) { // If outerFn provided and outerFn.prototype is a Generator, then outerFn.prototype instanceof Generator. var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator; var generator = Object.create(protoGenerator.prototype); var context = new Context(tryLocsList || []); // The ._invoke method unifies the implementations of the .next, // .throw, and .return methods. generator._invoke = makeInvokeMethod(innerFn, self, context); return generator; } exports.wrap = wrap; // Try/catch helper to minimize deoptimizations. Returns a completion // record like context.tryEntries[i].completion. This interface could // have been (and was previously) designed to take a closure to be // invoked without arguments, but in all the cases we care about we // already have an existing method we want to call, so there's no need // to create a new function object. We can even get away with assuming // the method takes exactly one argument, since that happens to be true // in every case, so we don't have to touch the arguments object. The // only additional allocation required is the completion record, which // has a stable shape and so hopefully should be cheap to allocate. function tryCatch(fn, obj, arg) { try { return { type: "normal", arg: fn.call(obj, arg) }; } catch (err) { return { type: "throw", arg: err }; } } var GenStateSuspendedStart = "suspendedStart"; var GenStateSuspendedYield = "suspendedYield"; var GenStateExecuting = "executing"; var GenStateCompleted = "completed"; // Returning this object from the innerFn has the same effect as // breaking out of the dispatch switch statement. var ContinueSentinel = {}; // Dummy constructor functions that we use as the .constructor and // .constructor.prototype properties for functions that return Generator // objects. For full spec compliance, you may wish to configure your // minifier not to mangle the names of these two functions. function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} // This is a polyfill for %IteratorPrototype% for environments that // don't natively support it. var IteratorPrototype = {}; define(IteratorPrototype, iteratorSymbol, function () { return this; }); var getProto = Object.getPrototypeOf; var NativeIteratorPrototype = getProto && getProto(getProto(values([]))); if (NativeIteratorPrototype && NativeIteratorPrototype !== Op && hasOwn.call(NativeIteratorPrototype, iteratorSymbol)) { // This environment has a native %IteratorPrototype%; use it instead // of the polyfill. IteratorPrototype = NativeIteratorPrototype; } var Gp = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(IteratorPrototype); GeneratorFunction.prototype = GeneratorFunctionPrototype; define(Gp, "constructor", GeneratorFunctionPrototype); define(GeneratorFunctionPrototype, "constructor", GeneratorFunction); GeneratorFunction.displayName = define( GeneratorFunctionPrototype, toStringTagSymbol, "GeneratorFunction" ); // Helper for defining the .next, .throw, and .return methods of the // Iterator interface in terms of a single ._invoke method. function defineIteratorMethods(prototype) { ["next", "throw", "return"].forEach(function(method) { define(prototype, method, function(arg) { return this._invoke(method, arg); }); }); } exports.isGeneratorFunction = function(genFun) { var ctor = typeof genFun === "function" && genFun.constructor; return ctor ? ctor === GeneratorFunction || // For the native GeneratorFunction constructor, the best we can // do is to check its .name property. (ctor.displayName || ctor.name) === "GeneratorFunction" : false; }; exports.mark = function(genFun) { if (Object.setPrototypeOf) { Object.setPrototypeOf(genFun, GeneratorFunctionPrototype); } else { genFun.__proto__ = GeneratorFunctionPrototype; define(genFun, toStringTagSymbol, "GeneratorFunction"); } genFun.prototype = Object.create(Gp); return genFun; }; // Within the body of any async function, `await x` is transformed to // `yield regeneratorRuntime.awrap(x)`, so that the runtime can test // `hasOwn.call(value, "__await")` to determine if the yielded value is // meant to be awaited. exports.awrap = function(arg) { return { __await: arg }; }; function AsyncIterator(generator, PromiseImpl) { function invoke(method, arg, resolve, reject) { var record = tryCatch(generator[method], generator, arg); if (record.type === "throw") { reject(record.arg); } else { var result = record.arg; var value = result.value; if (value && typeof value === "object" && hasOwn.call(value, "__await")) { return PromiseImpl.resolve(value.__await).then(function(value) { invoke("next", value, resolve, reject); }, function(err) { invoke("throw", err, resolve, reject); }); } return PromiseImpl.resolve(value).then(function(unwrapped) { // When a yielded Promise is resolved, its final value becomes // the .value of the Promise<{value,done}> result for the // current iteration. result.value = unwrapped; resolve(result); }, function(error) { // If a rejected Promise was yielded, throw the rejection back // into the async generator function so it can be handled there. return invoke("throw", error, resolve, reject); }); } } var previousPromise; function enqueue(method, arg) { function callInvokeWithMethodAndArg() { return new PromiseImpl(function(resolve, reject) { invoke(method, arg, resolve, reject); }); } return previousPromise = // If enqueue has been called before, then we want to wait until // all previous Promises have been resolved before calling invoke, // so that results are always delivered in the correct order. If // enqueue has not been called before, then it is important to // call invoke immediately, without waiting on a callback to fire, // so that the async generator function has the opportunity to do // any necessary setup in a predictable way. This predictability // is why the Promise constructor synchronously invokes its // executor callback, and why async functions synchronously // execute code before the first await. Since we implement simple // async functions in terms of async generators, it is especially // important to get this right, even though it requires care. previousPromise ? previousPromise.then( callInvokeWithMethodAndArg, // Avoid propagating failures to Promises returned by later // invocations of the iterator. callInvokeWithMethodAndArg ) : callInvokeWithMethodAndArg(); } // Define the unified helper method that is used to implement .next, // .throw, and .return (see defineIteratorMethods). this._invoke = enqueue; } defineIteratorMethods(AsyncIterator.prototype); define(AsyncIterator.prototype, asyncIteratorSymbol, function () { return this; }); exports.AsyncIterator = AsyncIterator; // Note that simple async functions are implemented on top of // AsyncIterator objects; they just return a Promise for the value of // the final result produced by the iterator. exports.async = function(innerFn, outerFn, self, tryLocsList, PromiseImpl) { if (PromiseImpl === void 0) PromiseImpl = Promise; var iter = new AsyncIterator( wrap(innerFn, outerFn, self, tryLocsList), PromiseImpl ); return exports.isGeneratorFunction(outerFn) ? iter // If outerFn is a generator, return the full iterator. : iter.next().then(function(result) { return result.done ? result.value : iter.next(); }); }; function makeInvokeMethod(innerFn, self, context) { var state = GenStateSuspendedStart; return function invoke(method, arg) { if (state === GenStateExecuting) { throw new Error("Generator is already running"); } if (state === GenStateCompleted) { if (method === "throw") { throw arg; } // Be forgiving, per 25.3.3.3.3 of the spec: // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume return doneResult(); } context.method = method; context.arg = arg; while (true) { var delegate = context.delegate; if (delegate) { var delegateResult = maybeInvokeDelegate(delegate, context); if (delegateResult) { if (delegateResult === ContinueSentinel) continue; return delegateResult; } } if (context.method === "next") { // Setting context._sent for legacy support of Babel's // function.sent implementation. context.sent = context._sent = context.arg; } else if (context.method === "throw") { if (state === GenStateSuspendedStart) { state = GenStateCompleted; throw context.arg; } context.dispatchException(context.arg); } else if (context.method === "return") { context.abrupt("return", context.arg); } state = GenStateExecuting; var record = tryCatch(innerFn, self, context); if (record.type === "normal") { // If an exception is thrown from innerFn, we leave state === // GenStateExecuting and loop back for another invocation. state = context.done ? GenStateCompleted : GenStateSuspendedYield; if (record.arg === ContinueSentinel) { continue; } return { value: record.arg, done: context.done }; } else if (record.type === "throw") { state = GenStateCompleted; // Dispatch the exception by looping back around to the // context.dispatchException(context.arg) call above. context.method = "throw"; context.arg = record.arg; } } }; } // Call delegate.iterator[context.method](context.arg) and handle the // result, either by returning a { value, done } result from the // delegate iterator, or by modifying context.method and context.arg, // setting context.delegate to null, and returning the ContinueSentinel. function maybeInvokeDelegate(delegate, context) { var method = delegate.iterator[context.method]; if (method === undefined) { // A .throw or .return when the delegate iterator has no .throw // method always terminates the yield* loop. context.delegate = null; if (context.method === "throw") { // Note: ["return"] must be used for ES3 parsing compatibility. if (delegate.iterator["return"]) { // If the delegate iterator has a return method, give it a // chance to clean up. context.method = "return"; context.arg = undefined; maybeInvokeDelegate(delegate, context); if (context.method === "throw") { // If maybeInvokeDelegate(context) changed context.method from // "return" to "throw", let that override the TypeError below. return ContinueSentinel; } } context.method = "throw"; context.arg = new TypeError( "The iterator does not provide a 'throw' method"); } return ContinueSentinel; } var record = tryCatch(method, delegate.iterator, context.arg); if (record.type === "throw") { context.method = "throw"; context.arg = record.arg; context.delegate = null; return ContinueSentinel; } var info = record.arg; if (! info) { context.method = "throw"; context.arg = new TypeError("iterator result is not an object"); context.delegate = null; return ContinueSentinel; } if (info.done) { // Assign the result of the finished delegate to the temporary // variable specified by delegate.resultName (see delegateYield). context[delegate.resultName] = info.value; // Resume execution at the desired location (see delegateYield). context.next = delegate.nextLoc; // If context.method was "throw" but the delegate handled the // exception, let the outer generator proceed normally. If // context.method was "next", forget context.arg since it has been // "consumed" by the delegate iterator. If context.method was // "return", allow the original .return call to continue in the // outer generator. if (context.method !== "return") { context.method = "next"; context.arg = undefined; } } else { // Re-yield the result returned by the delegate method. return info; } // The delegate iterator is finished, so forget it and continue with // the outer generator. context.delegate = null; return ContinueSentinel; } // Define Generator.prototype.{next,throw,return} in terms of the // unified ._invoke helper method. defineIteratorMethods(Gp); define(Gp, toStringTagSymbol, "Generator"); // A Generator should always return itself as the iterator object when the // @@iterator function is called on it. Some browsers' implementations of the // iterator prototype chain incorrectly implement this, causing the Generator // object to not be returned from this call. This ensures that doesn't happen. // See https://github.com/facebook/regenerator/issues/274 for more details. define(Gp, iteratorSymbol, function() { return this; }); define(Gp, "toString", function() { return "[object Generator]"; }); function pushTryEntry(locs) { var entry = { tryLoc: locs[0] }; if (1 in locs) { entry.catchLoc = locs[1]; } if (2 in locs) { entry.finallyLoc = locs[2]; entry.afterLoc = locs[3]; } this.tryEntries.push(entry); } function resetTryEntry(entry) { var record = entry.completion || {}; record.type = "normal"; delete record.arg; entry.completion = record; } function Context(tryLocsList) { // The root entry object (effectively a try statement without a catch // or a finally block) gives us a place to store values thrown from // locations where there is no enclosing try statement. this.tryEntries = [{ tryLoc: "root" }]; tryLocsList.forEach(pushTryEntry, this); this.reset(true); } exports.keys = function(object) { var keys = []; for (var key in object) { keys.push(key); } keys.reverse(); // Rather than returning an object with a next method, we keep // things simple and return the next function itself. return function next() { while (keys.length) { var key = keys.pop(); if (key in object) { next.value = key; next.done = false; return next; } } // To avoid creating an additional object, we just hang the .value // and .done properties off the next function object itself. This // also ensures that the minifier will not anonymize the function. next.done = true; return next; }; }; function values(iterable) { if (iterable) { var iteratorMethod = iterable[iteratorSymbol]; if (iteratorMethod) { return iteratorMethod.call(iterable); } if (typeof iterable.next === "function") { return iterable; } if (!isNaN(iterable.length)) { var i = -1, next = function next() { while (++i < iterable.length) { if (hasOwn.call(iterable, i)) { next.value = iterable[i]; next.done = false; return next; } } next.value = undefined; next.done = true; return next; }; return next.next = next; } } // Return an iterator with no values. return { next: doneResult }; } exports.values = values; function doneResult() { return { value: undefined, done: true }; } Context.prototype = { constructor: Context, reset: function(skipTempReset) { this.prev = 0; this.next = 0; // Resetting context._sent for legacy support of Babel's // function.sent implementation. this.sent = this._sent = undefined; this.done = false; this.delegate = null; this.method = "next"; this.arg = undefined; this.tryEntries.forEach(resetTryEntry); if (!skipTempReset) { for (var name in this) { // Not sure about the optimal order of these conditions: if (name.charAt(0) === "t" && hasOwn.call(this, name) && !isNaN(+name.slice(1))) { this[name] = undefined; } } } }, stop: function() { this.done = true; var rootEntry = this.tryEntries[0]; var rootRecord = rootEntry.completion; if (rootRecord.type === "throw") { throw rootRecord.arg; } return this.rval; }, dispatchException: function(exception) { if (this.done) { throw exception; } var context = this; function handle(loc, caught) { record.type = "throw"; record.arg = exception; context.next = loc; if (caught) { // If the dispatched exception was caught by a catch block, // then let that catch block handle the exception normally. context.method = "next"; context.arg = undefined; } return !! caught; } for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; var record = entry.completion; if (entry.tryLoc === "root") { // Exception thrown outside of any try block that could handle // it, so set the completion value of the entire function to // throw the exception. return handle("end"); } if (entry.tryLoc <= this.prev) { var hasCatch = hasOwn.call(entry, "catchLoc"); var hasFinally = hasOwn.call(entry, "finallyLoc"); if (hasCatch && hasFinally) { if (this.prev < entry.catchLoc) { return handle(entry.catchLoc, true); } else if (this.prev < entry.finallyLoc) { return handle(entry.finallyLoc); } } else if (hasCatch) { if (this.prev < entry.catchLoc) { return handle(entry.catchLoc, true); } } else if (hasFinally) { if (this.prev < entry.finallyLoc) { return handle(entry.finallyLoc); } } else { throw new Error("try statement without catch or finally"); } } } }, abrupt: function(type, arg) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.tryLoc <= this.prev && hasOwn.call(entry, "finallyLoc") && this.prev < entry.finallyLoc) { var finallyEntry = entry; break; } } if (finallyEntry && (type === "break" || type === "continue") && finallyEntry.tryLoc <= arg && arg <= finallyEntry.finallyLoc) { // Ignore the finally entry if control is not jumping to a // location outside the try/catch block. finallyEntry = null; } var record = finallyEntry ? finallyEntry.completion : {}; record.type = type; record.arg = arg; if (finallyEntry) { this.method = "next"; this.next = finallyEntry.finallyLoc; return ContinueSentinel; } return this.complete(record); }, complete: function(record, afterLoc) { if (record.type === "throw") { throw record.arg; } if (record.type === "break" || record.type === "continue") { this.next = record.arg; } else if (record.type === "return") { this.rval = this.arg = record.arg; this.method = "return"; this.next = "end"; } else if (record.type === "normal" && afterLoc) { this.next = afterLoc; } return ContinueSentinel; }, finish: function(finallyLoc) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.finallyLoc === finallyLoc) { this.complete(entry.completion, entry.afterLoc); resetTryEntry(entry); return ContinueSentinel; } } }, "catch": function(tryLoc) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.tryLoc === tryLoc) { var record = entry.completion; if (record.type === "throw") { var thrown = record.arg; resetTryEntry(entry); } return thrown; } } // The context.catch method must only be called with a location // argument that corresponds to a known catch block. throw new Error("illegal catch attempt"); }, delegateYield: function(iterable, resultName, nextLoc) { this.delegate = { iterator: values(iterable), resultName: resultName, nextLoc: nextLoc }; if (this.method === "next") { // Deliberately forget the last sent value so that we don't // accidentally pass it on to the delegate. this.arg = undefined; } return ContinueSentinel; } }; // Regardless of whether this script is executing as a CommonJS module // or not, return the runtime object so that we can declare the variable // regeneratorRuntime in the outer scope, which allows this module to be // injected easily by `bin/regenerator --include-runtime script.js`. return exports; }( // If this script is executing as a CommonJS module, use module.exports // as the regeneratorRuntime namespace. Otherwise create a new empty // object. Either way, the resulting object will be used to initialize // the regeneratorRuntime variable at the top of this file. typeof module === "object" ? module.exports : {} )); try { regeneratorRuntime = runtime; } catch (accidentalStrictMode) { // This module should not be running in strict mode, so the above // assignment should always work unless something is misconfigured. Just // in case runtime.js accidentally runs in strict mode, in modern engines // we can explicitly access globalThis. In older engines we can escape // strict mode using a global Function call. This could conceivably fail // if a Content Security Policy forbids using Function, but in that case // the proper solution is to fix the accidental strict mode problem. If // you've misconfigured your bundler to force strict mode and applied a // CSP to forbid Function, and you're not willing to fix either of those // problems, please detail your unique predicament in a GitHub issue. if (typeof globalThis === "object") { globalThis.regeneratorRuntime = runtime; } else { Function("r", "regeneratorRuntime = r")(runtime); } } },{}],731:[function(require,module,exports){ /*! safe-buffer. MIT License. Feross Aboukhadijeh */ /* eslint-disable node/no-deprecated-api */ var buffer = require('buffer') var Buffer = buffer.Buffer // alternative to using Object.keys for old browsers function copyProps (src, dst) { for (var key in src) { dst[key] = src[key] } } if (Buffer.from && Buffer.alloc && Buffer.allocUnsafe && Buffer.allocUnsafeSlow) { module.exports = buffer } else { // Copy properties from require('buffer') copyProps(buffer, exports) exports.Buffer = SafeBuffer } function SafeBuffer (arg, encodingOrOffset, length) { return Buffer(arg, encodingOrOffset, length) } SafeBuffer.prototype = Object.create(Buffer.prototype) // Copy static methods from Buffer copyProps(Buffer, SafeBuffer) SafeBuffer.from = function (arg, encodingOrOffset, length) { if (typeof arg === 'number') { throw new TypeError('Argument must not be a number') } return Buffer(arg, encodingOrOffset, length) } SafeBuffer.alloc = function (size, fill, encoding) { if (typeof size !== 'number') { throw new TypeError('Argument must be a number') } var buf = Buffer(size) if (fill !== undefined) { if (typeof encoding === 'string') { buf.fill(fill, encoding) } else { buf.fill(fill) } } else { buf.fill(0) } return buf } SafeBuffer.allocUnsafe = function (size) { if (typeof size !== 'number') { throw new TypeError('Argument must be a number') } return Buffer(size) } SafeBuffer.allocUnsafeSlow = function (size) { if (typeof size !== 'number') { throw new TypeError('Argument must be a number') } return buffer.SlowBuffer(size) } },{"buffer":81}],732:[function(require,module,exports){ (function (global){(function (){ var ClientRequest = require('./lib/request') var response = require('./lib/response') var extend = require('xtend') var statusCodes = require('builtin-status-codes') var url = require('url') var http = exports http.request = function (opts, cb) { if (typeof opts === 'string') opts = url.parse(opts) else opts = extend(opts) // Normally, the page is loaded from http or https, so not specifying a protocol // will result in a (valid) protocol-relative url. However, this won't work if // the protocol is something else, like 'file:' var defaultProtocol = global.location.protocol.search(/^https?:$/) === -1 ? 'http:' : '' var protocol = opts.protocol || defaultProtocol var host = opts.hostname || opts.host var port = opts.port var path = opts.path || '/' // Necessary for IPv6 addresses if (host && host.indexOf(':') !== -1) host = '[' + host + ']' // This may be a relative url. The browser should always be able to interpret it correctly. opts.url = (host ? (protocol + '//' + host) : '') + (port ? ':' + port : '') + path opts.method = (opts.method || 'GET').toUpperCase() opts.headers = opts.headers || {} // Also valid opts.auth, opts.mode var req = new ClientRequest(opts) if (cb) req.on('response', cb) return req } http.get = function get (opts, cb) { var req = http.request(opts, cb) req.end() return req } http.ClientRequest = ClientRequest http.IncomingMessage = response.IncomingMessage http.Agent = function () {} http.Agent.defaultMaxSockets = 4 http.globalAgent = new http.Agent() http.STATUS_CODES = statusCodes http.METHODS = [ 'CHECKOUT', 'CONNECT', 'COPY', 'DELETE', 'GET', 'HEAD', 'LOCK', 'M-SEARCH', 'MERGE', 'MKACTIVITY', 'MKCOL', 'MOVE', 'NOTIFY', 'OPTIONS', 'PATCH', 'POST', 'PROPFIND', 'PROPPATCH', 'PURGE', 'PUT', 'REPORT', 'SEARCH', 'SUBSCRIBE', 'TRACE', 'UNLOCK', 'UNSUBSCRIBE' ] }).call(this)}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) },{"./lib/request":734,"./lib/response":735,"builtin-status-codes":82,"url":753,"xtend":756}],733:[function(require,module,exports){ (function (global){(function (){ exports.fetch = isFunction(global.fetch) && isFunction(global.ReadableStream) exports.writableStream = isFunction(global.WritableStream) exports.abortController = isFunction(global.AbortController) // The xhr request to example.com may violate some restrictive CSP configurations, // so if we're running in a browser that supports `fetch`, avoid calling getXHR() // and assume support for certain features below. var xhr function getXHR () { // Cache the xhr value if (xhr !== undefined) return xhr if (global.XMLHttpRequest) { xhr = new global.XMLHttpRequest() // If XDomainRequest is available (ie only, where xhr might not work // cross domain), use the page location. Otherwise use example.com // Note: this doesn't actually make an http request. try { xhr.open('GET', global.XDomainRequest ? '/' : 'https://example.com') } catch(e) { xhr = null } } else { // Service workers don't have XHR xhr = null } return xhr } function checkTypeSupport (type) { var xhr = getXHR() if (!xhr) return false try { xhr.responseType = type return xhr.responseType === type } catch (e) {} return false } // If fetch is supported, then arraybuffer will be supported too. Skip calling // checkTypeSupport(), since that calls getXHR(). exports.arraybuffer = exports.fetch || checkTypeSupport('arraybuffer') // These next two tests unavoidably show warnings in Chrome. Since fetch will always // be used if it's available, just return false for these to avoid the warnings. exports.msstream = !exports.fetch && checkTypeSupport('ms-stream') exports.mozchunkedarraybuffer = !exports.fetch && checkTypeSupport('moz-chunked-arraybuffer') // If fetch is supported, then overrideMimeType will be supported too. Skip calling // getXHR(). exports.overrideMimeType = exports.fetch || (getXHR() ? isFunction(getXHR().overrideMimeType) : false) function isFunction (value) { return typeof value === 'function' } xhr = null // Help gc }).call(this)}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) },{}],734:[function(require,module,exports){ (function (process,global,Buffer){(function (){ var capability = require('./capability') var inherits = require('inherits') var response = require('./response') var stream = require('readable-stream') var IncomingMessage = response.IncomingMessage var rStates = response.readyStates function decideMode (preferBinary, useFetch) { if (capability.fetch && useFetch) { return 'fetch' } else if (capability.mozchunkedarraybuffer) { return 'moz-chunked-arraybuffer' } else if (capability.msstream) { return 'ms-stream' } else if (capability.arraybuffer && preferBinary) { return 'arraybuffer' } else { return 'text' } } var ClientRequest = module.exports = function (opts) { var self = this stream.Writable.call(self) self._opts = opts self._body = [] self._headers = {} if (opts.auth) self.setHeader('Authorization', 'Basic ' + Buffer.from(opts.auth).toString('base64')) Object.keys(opts.headers).forEach(function (name) { self.setHeader(name, opts.headers[name]) }) var preferBinary var useFetch = true if (opts.mode === 'disable-fetch' || ('requestTimeout' in opts && !capability.abortController)) { // If the use of XHR should be preferred. Not typically needed. useFetch = false preferBinary = true } else if (opts.mode === 'prefer-streaming') { // If streaming is a high priority but binary compatibility and // the accuracy of the 'content-type' header aren't preferBinary = false } else if (opts.mode === 'allow-wrong-content-type') { // If streaming is more important than preserving the 'content-type' header preferBinary = !capability.overrideMimeType } else if (!opts.mode || opts.mode === 'default' || opts.mode === 'prefer-fast') { // Use binary if text streaming may corrupt data or the content-type header, or for speed preferBinary = true } else { throw new Error('Invalid value for opts.mode') } self._mode = decideMode(preferBinary, useFetch) self._fetchTimer = null self._socketTimeout = null self._socketTimer = null self.on('finish', function () { self._onFinish() }) } inherits(ClientRequest, stream.Writable) ClientRequest.prototype.setHeader = function (name, value) { var self = this var lowerName = name.toLowerCase() // This check is not necessary, but it prevents warnings from browsers about setting unsafe // headers. To be honest I'm not entirely sure hiding these warnings is a good thing, but // http-browserify did it, so I will too. if (unsafeHeaders.indexOf(lowerName) !== -1) return self._headers[lowerName] = { name: name, value: value } } ClientRequest.prototype.getHeader = function (name) { var header = this._headers[name.toLowerCase()] if (header) return header.value return null } ClientRequest.prototype.removeHeader = function (name) { var self = this delete self._headers[name.toLowerCase()] } ClientRequest.prototype._onFinish = function () { var self = this if (self._destroyed) return var opts = self._opts if ('timeout' in opts && opts.timeout !== 0) { self.setTimeout(opts.timeout) } var headersObj = self._headers var body = null if (opts.method !== 'GET' && opts.method !== 'HEAD') { body = new Blob(self._body, { type: (headersObj['content-type'] || {}).value || '' }); } // create flattened list of headers var headersList = [] Object.keys(headersObj).forEach(function (keyName) { var name = headersObj[keyName].name var value = headersObj[keyName].value if (Array.isArray(value)) { value.forEach(function (v) { headersList.push([name, v]) }) } else { headersList.push([name, value]) } }) if (self._mode === 'fetch') { var signal = null if (capability.abortController) { var controller = new AbortController() signal = controller.signal self._fetchAbortController = controller if ('requestTimeout' in opts && opts.requestTimeout !== 0) { self._fetchTimer = global.setTimeout(function () { self.emit('requestTimeout') if (self._fetchAbortController) self._fetchAbortController.abort() }, opts.requestTimeout) } } global.fetch(self._opts.url, { method: self._opts.method, headers: headersList, body: body || undefined, mode: 'cors', credentials: opts.withCredentials ? 'include' : 'same-origin', signal: signal }).then(function (response) { self._fetchResponse = response self._resetTimers(false) self._connect() }, function (reason) { self._resetTimers(true) if (!self._destroyed) self.emit('error', reason) }) } else { var xhr = self._xhr = new global.XMLHttpRequest() try { xhr.open(self._opts.method, self._opts.url, true) } catch (err) { process.nextTick(function () { self.emit('error', err) }) return } // Can't set responseType on really old browsers if ('responseType' in xhr) xhr.responseType = self._mode if ('withCredentials' in xhr) xhr.withCredentials = !!opts.withCredentials if (self._mode === 'text' && 'overrideMimeType' in xhr) xhr.overrideMimeType('text/plain; charset=x-user-defined') if ('requestTimeout' in opts) { xhr.timeout = opts.requestTimeout xhr.ontimeout = function () { self.emit('requestTimeout') } } headersList.forEach(function (header) { xhr.setRequestHeader(header[0], header[1]) }) self._response = null xhr.onreadystatechange = function () { switch (xhr.readyState) { case rStates.LOADING: case rStates.DONE: self._onXHRProgress() break } } // Necessary for streaming in Firefox, since xhr.response is ONLY defined // in onprogress, not in onreadystatechange with xhr.readyState = 3 if (self._mode === 'moz-chunked-arraybuffer') { xhr.onprogress = function () { self._onXHRProgress() } } xhr.onerror = function () { if (self._destroyed) return self._resetTimers(true) self.emit('error', new Error('XHR error')) } try { xhr.send(body) } catch (err) { process.nextTick(function () { self.emit('error', err) }) return } } } /** * Checks if xhr.status is readable and non-zero, indicating no error. * Even though the spec says it should be available in readyState 3, * accessing it throws an exception in IE8 */ function statusValid (xhr) { try { var status = xhr.status return (status !== null && status !== 0) } catch (e) { return false } } ClientRequest.prototype._onXHRProgress = function () { var self = this self._resetTimers(false) if (!statusValid(self._xhr) || self._destroyed) return if (!self._response) self._connect() self._response._onXHRProgress(self._resetTimers.bind(self)) } ClientRequest.prototype._connect = function () { var self = this if (self._destroyed) return self._response = new IncomingMessage(self._xhr, self._fetchResponse, self._mode, self._resetTimers.bind(self)) self._response.on('error', function(err) { self.emit('error', err) }) self.emit('response', self._response) } ClientRequest.prototype._write = function (chunk, encoding, cb) { var self = this self._body.push(chunk) cb() } ClientRequest.prototype._resetTimers = function (done) { var self = this global.clearTimeout(self._socketTimer) self._socketTimer = null if (done) { global.clearTimeout(self._fetchTimer) self._fetchTimer = null } else if (self._socketTimeout) { self._socketTimer = global.setTimeout(function () { self.emit('timeout') }, self._socketTimeout) } } ClientRequest.prototype.abort = ClientRequest.prototype.destroy = function (err) { var self = this self._destroyed = true self._resetTimers(true) if (self._response) self._response._destroyed = true if (self._xhr) self._xhr.abort() else if (self._fetchAbortController) self._fetchAbortController.abort() if (err) self.emit('error', err) } ClientRequest.prototype.end = function (data, encoding, cb) { var self = this if (typeof data === 'function') { cb = data data = undefined } stream.Writable.prototype.end.call(self, data, encoding, cb) } ClientRequest.prototype.setTimeout = function (timeout, cb) { var self = this if (cb) self.once('timeout', cb) self._socketTimeout = timeout self._resetTimers(false) } ClientRequest.prototype.flushHeaders = function () {} ClientRequest.prototype.setNoDelay = function () {} ClientRequest.prototype.setSocketKeepAlive = function () {} // Taken from http://www.w3.org/TR/XMLHttpRequest/#the-setrequestheader%28%29-method var unsafeHeaders = [ 'accept-charset', 'accept-encoding', 'access-control-request-headers', 'access-control-request-method', 'connection', 'content-length', 'cookie', 'cookie2', 'date', 'dnt', 'expect', 'host', 'keep-alive', 'origin', 'referer', 'te', 'trailer', 'transfer-encoding', 'upgrade', 'via' ] }).call(this)}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {},require("buffer").Buffer) },{"./capability":733,"./response":735,"_process":714,"buffer":81,"inherits":88,"readable-stream":750}],735:[function(require,module,exports){ (function (process,global,Buffer){(function (){ var capability = require('./capability') var inherits = require('inherits') var stream = require('readable-stream') var rStates = exports.readyStates = { UNSENT: 0, OPENED: 1, HEADERS_RECEIVED: 2, LOADING: 3, DONE: 4 } var IncomingMessage = exports.IncomingMessage = function (xhr, response, mode, resetTimers) { var self = this stream.Readable.call(self) self._mode = mode self.headers = {} self.rawHeaders = [] self.trailers = {} self.rawTrailers = [] // Fake the 'close' event, but only once 'end' fires self.on('end', function () { // The nextTick is necessary to prevent the 'request' module from causing an infinite loop process.nextTick(function () { self.emit('close') }) }) if (mode === 'fetch') { self._fetchResponse = response self.url = response.url self.statusCode = response.status self.statusMessage = response.statusText response.headers.forEach(function (header, key){ self.headers[key.toLowerCase()] = header self.rawHeaders.push(key, header) }) if (capability.writableStream) { var writable = new WritableStream({ write: function (chunk) { resetTimers(false) return new Promise(function (resolve, reject) { if (self._destroyed) { reject() } else if(self.push(Buffer.from(chunk))) { resolve() } else { self._resumeFetch = resolve } }) }, close: function () { resetTimers(true) if (!self._destroyed) self.push(null) }, abort: function (err) { resetTimers(true) if (!self._destroyed) self.emit('error', err) } }) try { response.body.pipeTo(writable).catch(function (err) { resetTimers(true) if (!self._destroyed) self.emit('error', err) }) return } catch (e) {} // pipeTo method isn't defined. Can't find a better way to feature test this } // fallback for when writableStream or pipeTo aren't available var reader = response.body.getReader() function read () { reader.read().then(function (result) { if (self._destroyed) return resetTimers(result.done) if (result.done) { self.push(null) return } self.push(Buffer.from(result.value)) read() }).catch(function (err) { resetTimers(true) if (!self._destroyed) self.emit('error', err) }) } read() } else { self._xhr = xhr self._pos = 0 self.url = xhr.responseURL self.statusCode = xhr.status self.statusMessage = xhr.statusText var headers = xhr.getAllResponseHeaders().split(/\r?\n/) headers.forEach(function (header) { var matches = header.match(/^([^:]+):\s*(.*)/) if (matches) { var key = matches[1].toLowerCase() if (key === 'set-cookie') { if (self.headers[key] === undefined) { self.headers[key] = [] } self.headers[key].push(matches[2]) } else if (self.headers[key] !== undefined) { self.headers[key] += ', ' + matches[2] } else { self.headers[key] = matches[2] } self.rawHeaders.push(matches[1], matches[2]) } }) self._charset = 'x-user-defined' if (!capability.overrideMimeType) { var mimeType = self.rawHeaders['mime-type'] if (mimeType) { var charsetMatch = mimeType.match(/;\s*charset=([^;])(;|$)/) if (charsetMatch) { self._charset = charsetMatch[1].toLowerCase() } } if (!self._charset) self._charset = 'utf-8' // best guess } } } inherits(IncomingMessage, stream.Readable) IncomingMessage.prototype._read = function () { var self = this var resolve = self._resumeFetch if (resolve) { self._resumeFetch = null resolve() } } IncomingMessage.prototype._onXHRProgress = function (resetTimers) { var self = this var xhr = self._xhr var response = null switch (self._mode) { case 'text': response = xhr.responseText if (response.length > self._pos) { var newData = response.substr(self._pos) if (self._charset === 'x-user-defined') { var buffer = Buffer.alloc(newData.length) for (var i = 0; i < newData.length; i++) buffer[i] = newData.charCodeAt(i) & 0xff self.push(buffer) } else { self.push(newData, self._charset) } self._pos = response.length } break case 'arraybuffer': if (xhr.readyState !== rStates.DONE || !xhr.response) break response = xhr.response self.push(Buffer.from(new Uint8Array(response))) break case 'moz-chunked-arraybuffer': // take whole response = xhr.response if (xhr.readyState !== rStates.LOADING || !response) break self.push(Buffer.from(new Uint8Array(response))) break case 'ms-stream': response = xhr.response if (xhr.readyState !== rStates.LOADING) break var reader = new global.MSStreamReader() reader.onprogress = function () { if (reader.result.byteLength > self._pos) { self.push(Buffer.from(new Uint8Array(reader.result.slice(self._pos)))) self._pos = reader.result.byteLength } } reader.onload = function () { resetTimers(true) self.push(null) } // reader.onerror = ??? // TODO: this reader.readAsArrayBuffer(response) break } // The ms-stream case handles end separately in reader.onload() if (self._xhr.readyState === rStates.DONE && self._mode !== 'ms-stream') { resetTimers(true) self.push(null) } } }).call(this)}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {},require("buffer").Buffer) },{"./capability":733,"_process":714,"buffer":81,"inherits":88,"readable-stream":750}],736:[function(require,module,exports){ 'use strict'; function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; subClass.__proto__ = superClass; } var codes = {}; function createErrorType(code, message, Base) { if (!Base) { Base = Error; } function getMessage(arg1, arg2, arg3) { if (typeof message === 'string') { return message; } else { return message(arg1, arg2, arg3); } } var NodeError = /*#__PURE__*/ function (_Base) { _inheritsLoose(NodeError, _Base); function NodeError(arg1, arg2, arg3) { return _Base.call(this, getMessage(arg1, arg2, arg3)) || this; } return NodeError; }(Base); NodeError.prototype.name = Base.name; NodeError.prototype.code = code; codes[code] = NodeError; } // https://github.com/nodejs/node/blob/v10.8.0/lib/internal/errors.js function oneOf(expected, thing) { if (Array.isArray(expected)) { var len = expected.length; expected = expected.map(function (i) { return String(i); }); if (len > 2) { return "one of ".concat(thing, " ").concat(expected.slice(0, len - 1).join(', '), ", or ") + expected[len - 1]; } else if (len === 2) { return "one of ".concat(thing, " ").concat(expected[0], " or ").concat(expected[1]); } else { return "of ".concat(thing, " ").concat(expected[0]); } } else { return "of ".concat(thing, " ").concat(String(expected)); } } // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/startsWith function startsWith(str, search, pos) { return str.substr(!pos || pos < 0 ? 0 : +pos, search.length) === search; } // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/endsWith function endsWith(str, search, this_len) { if (this_len === undefined || this_len > str.length) { this_len = str.length; } return str.substring(this_len - search.length, this_len) === search; } // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/includes function includes(str, search, start) { if (typeof start !== 'number') { start = 0; } if (start + search.length > str.length) { return false; } else { return str.indexOf(search, start) !== -1; } } createErrorType('ERR_INVALID_OPT_VALUE', function (name, value) { return 'The value "' + value + '" is invalid for option "' + name + '"'; }, TypeError); createErrorType('ERR_INVALID_ARG_TYPE', function (name, expected, actual) { // determiner: 'must be' or 'must not be' var determiner; if (typeof expected === 'string' && startsWith(expected, 'not ')) { determiner = 'must not be'; expected = expected.replace(/^not /, ''); } else { determiner = 'must be'; } var msg; if (endsWith(name, ' argument')) { // For cases like 'first argument' msg = "The ".concat(name, " ").concat(determiner, " ").concat(oneOf(expected, 'type')); } else { var type = includes(name, '.') ? 'property' : 'argument'; msg = "The \"".concat(name, "\" ").concat(type, " ").concat(determiner, " ").concat(oneOf(expected, 'type')); } msg += ". Received type ".concat(typeof actual); return msg; }, TypeError); createErrorType('ERR_STREAM_PUSH_AFTER_EOF', 'stream.push() after EOF'); createErrorType('ERR_METHOD_NOT_IMPLEMENTED', function (name) { return 'The ' + name + ' method is not implemented'; }); createErrorType('ERR_STREAM_PREMATURE_CLOSE', 'Premature close'); createErrorType('ERR_STREAM_DESTROYED', function (name) { return 'Cannot call ' + name + ' after a stream was destroyed'; }); createErrorType('ERR_MULTIPLE_CALLBACK', 'Callback called multiple times'); createErrorType('ERR_STREAM_CANNOT_PIPE', 'Cannot pipe, not readable'); createErrorType('ERR_STREAM_WRITE_AFTER_END', 'write after end'); createErrorType('ERR_STREAM_NULL_VALUES', 'May not write null values to stream', TypeError); createErrorType('ERR_UNKNOWN_ENCODING', function (arg) { return 'Unknown encoding: ' + arg; }, TypeError); createErrorType('ERR_STREAM_UNSHIFT_AFTER_END_EVENT', 'stream.unshift() after end event'); module.exports.codes = codes; },{}],737:[function(require,module,exports){ (function (process){(function (){ // Copyright Joyent, Inc. and other Node contributors. // // Permission is hereby granted, free of charge, to any person obtaining a // copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to permit // persons to whom the Software is furnished to do so, subject to the // following conditions: // // The above copyright notice and this permission notice shall be included // in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE // USE OR OTHER DEALINGS IN THE SOFTWARE. // a duplex stream is just a stream that is both readable and writable. // Since JS doesn't have multiple prototypal inheritance, this class // prototypally inherits from Readable, and then parasitically from // Writable. 'use strict'; /**/ var objectKeys = Object.keys || function (obj) { var keys = []; for (var key in obj) { keys.push(key); } return keys; }; /**/ module.exports = Duplex; var Readable = require('./_stream_readable'); var Writable = require('./_stream_writable'); require('inherits')(Duplex, Readable); { // Allow the keys array to be GC'ed. var keys = objectKeys(Writable.prototype); for (var v = 0; v < keys.length; v++) { var method = keys[v]; if (!Duplex.prototype[method]) Duplex.prototype[method] = Writable.prototype[method]; } } function Duplex(options) { if (!(this instanceof Duplex)) return new Duplex(options); Readable.call(this, options); Writable.call(this, options); this.allowHalfOpen = true; if (options) { if (options.readable === false) this.readable = false; if (options.writable === false) this.writable = false; if (options.allowHalfOpen === false) { this.allowHalfOpen = false; this.once('end', onend); } } } Object.defineProperty(Duplex.prototype, 'writableHighWaterMark', { // making it explicit this property is not enumerable // because otherwise some prototype manipulation in // userland will fail enumerable: false, get: function get() { return this._writableState.highWaterMark; } }); Object.defineProperty(Duplex.prototype, 'writableBuffer', { // making it explicit this property is not enumerable // because otherwise some prototype manipulation in // userland will fail enumerable: false, get: function get() { return this._writableState && this._writableState.getBuffer(); } }); Object.defineProperty(Duplex.prototype, 'writableLength', { // making it explicit this property is not enumerable // because otherwise some prototype manipulation in // userland will fail enumerable: false, get: function get() { return this._writableState.length; } }); // the no-half-open enforcer function onend() { // If the writable side ended, then we're ok. if (this._writableState.ended) return; // no more data can be written. // But allow more writes to happen in this tick. process.nextTick(onEndNT, this); } function onEndNT(self) { self.end(); } Object.defineProperty(Duplex.prototype, 'destroyed', { // making it explicit this property is not enumerable // because otherwise some prototype manipulation in // userland will fail enumerable: false, get: function get() { if (this._readableState === undefined || this._writableState === undefined) { return false; } return this._readableState.destroyed && this._writableState.destroyed; }, set: function set(value) { // we ignore the value if the stream // has not been initialized yet if (this._readableState === undefined || this._writableState === undefined) { return; } // backward compatibility, the user is explicitly // managing destroyed this._readableState.destroyed = value; this._writableState.destroyed = value; } }); }).call(this)}).call(this,require('_process')) },{"./_stream_readable":739,"./_stream_writable":741,"_process":714,"inherits":88}],738:[function(require,module,exports){ // Copyright Joyent, Inc. and other Node contributors. // // Permission is hereby granted, free of charge, to any person obtaining a // copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to permit // persons to whom the Software is furnished to do so, subject to the // following conditions: // // The above copyright notice and this permission notice shall be included // in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE // USE OR OTHER DEALINGS IN THE SOFTWARE. // a passthrough stream. // basically just the most minimal sort of Transform stream. // Every written chunk gets output as-is. 'use strict'; module.exports = PassThrough; var Transform = require('./_stream_transform'); require('inherits')(PassThrough, Transform); function PassThrough(options) { if (!(this instanceof PassThrough)) return new PassThrough(options); Transform.call(this, options); } PassThrough.prototype._transform = function (chunk, encoding, cb) { cb(null, chunk); }; },{"./_stream_transform":740,"inherits":88}],739:[function(require,module,exports){ (function (process,global){(function (){ // Copyright Joyent, Inc. and other Node contributors. // // Permission is hereby granted, free of charge, to any person obtaining a // copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to permit // persons to whom the Software is furnished to do so, subject to the // following conditions: // // The above copyright notice and this permission notice shall be included // in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE // USE OR OTHER DEALINGS IN THE SOFTWARE. 'use strict'; module.exports = Readable; /**/ var Duplex; /**/ Readable.ReadableState = ReadableState; /**/ var EE = require('events').EventEmitter; var EElistenerCount = function EElistenerCount(emitter, type) { return emitter.listeners(type).length; }; /**/ /**/ var Stream = require('./internal/streams/stream'); /**/ var Buffer = require('buffer').Buffer; var OurUint8Array = global.Uint8Array || function () {}; function _uint8ArrayToBuffer(chunk) { return Buffer.from(chunk); } function _isUint8Array(obj) { return Buffer.isBuffer(obj) || obj instanceof OurUint8Array; } /**/ var debugUtil = require('util'); var debug; if (debugUtil && debugUtil.debuglog) { debug = debugUtil.debuglog('stream'); } else { debug = function debug() {}; } /**/ var BufferList = require('./internal/streams/buffer_list'); var destroyImpl = require('./internal/streams/destroy'); var _require = require('./internal/streams/state'), getHighWaterMark = _require.getHighWaterMark; var _require$codes = require('../errors').codes, ERR_INVALID_ARG_TYPE = _require$codes.ERR_INVALID_ARG_TYPE, ERR_STREAM_PUSH_AFTER_EOF = _require$codes.ERR_STREAM_PUSH_AFTER_EOF, ERR_METHOD_NOT_IMPLEMENTED = _require$codes.ERR_METHOD_NOT_IMPLEMENTED, ERR_STREAM_UNSHIFT_AFTER_END_EVENT = _require$codes.ERR_STREAM_UNSHIFT_AFTER_END_EVENT; // Lazy loaded to improve the startup performance. var StringDecoder; var createReadableStreamAsyncIterator; var from; require('inherits')(Readable, Stream); var errorOrDestroy = destroyImpl.errorOrDestroy; var kProxyEvents = ['error', 'close', 'destroy', 'pause', 'resume']; function prependListener(emitter, event, fn) { // Sadly this is not cacheable as some libraries bundle their own // event emitter implementation with them. if (typeof emitter.prependListener === 'function') return emitter.prependListener(event, fn); // This is a hack to make sure that our error handler is attached before any // userland ones. NEVER DO THIS. This is here only because this code needs // to continue to work with older versions of Node.js that do not include // the prependListener() method. The goal is to eventually remove this hack. if (!emitter._events || !emitter._events[event]) emitter.on(event, fn);else if (Array.isArray(emitter._events[event])) emitter._events[event].unshift(fn);else emitter._events[event] = [fn, emitter._events[event]]; } function ReadableState(options, stream, isDuplex) { Duplex = Duplex || require('./_stream_duplex'); options = options || {}; // Duplex streams are both readable and writable, but share // the same options object. // However, some cases require setting options to different // values for the readable and the writable sides of the duplex stream. // These options can be provided separately as readableXXX and writableXXX. if (typeof isDuplex !== 'boolean') isDuplex = stream instanceof Duplex; // object stream flag. Used to make read(n) ignore n and to // make all the buffer merging and length checks go away this.objectMode = !!options.objectMode; if (isDuplex) this.objectMode = this.objectMode || !!options.readableObjectMode; // the point at which it stops calling _read() to fill the buffer // Note: 0 is a valid value, means "don't call _read preemptively ever" this.highWaterMark = getHighWaterMark(this, options, 'readableHighWaterMark', isDuplex); // A linked list is used to store data chunks instead of an array because the // linked list can remove elements from the beginning faster than // array.shift() this.buffer = new BufferList(); this.length = 0; this.pipes = null; this.pipesCount = 0; this.flowing = null; this.ended = false; this.endEmitted = false; this.reading = false; // a flag to be able to tell if the event 'readable'/'data' is emitted // immediately, or on a later tick. We set this to true at first, because // any actions that shouldn't happen until "later" should generally also // not happen before the first read call. this.sync = true; // whenever we return null, then we set a flag to say // that we're awaiting a 'readable' event emission. this.needReadable = false; this.emittedReadable = false; this.readableListening = false; this.resumeScheduled = false; this.paused = true; // Should close be emitted on destroy. Defaults to true. this.emitClose = options.emitClose !== false; // Should .destroy() be called after 'end' (and potentially 'finish') this.autoDestroy = !!options.autoDestroy; // has it been destroyed this.destroyed = false; // Crypto is kind of old and crusty. Historically, its default string // encoding is 'binary' so we have to make this configurable. // Everything else in the universe uses 'utf8', though. this.defaultEncoding = options.defaultEncoding || 'utf8'; // the number of writers that are awaiting a drain event in .pipe()s this.awaitDrain = 0; // if true, a maybeReadMore has been scheduled this.readingMore = false; this.decoder = null; this.encoding = null; if (options.encoding) { if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder; this.decoder = new StringDecoder(options.encoding); this.encoding = options.encoding; } } function Readable(options) { Duplex = Duplex || require('./_stream_duplex'); if (!(this instanceof Readable)) return new Readable(options); // Checking for a Stream.Duplex instance is faster here instead of inside // the ReadableState constructor, at least with V8 6.5 var isDuplex = this instanceof Duplex; this._readableState = new ReadableState(options, this, isDuplex); // legacy this.readable = true; if (options) { if (typeof options.read === 'function') this._read = options.read; if (typeof options.destroy === 'function') this._destroy = options.destroy; } Stream.call(this); } Object.defineProperty(Readable.prototype, 'destroyed', { // making it explicit this property is not enumerable // because otherwise some prototype manipulation in // userland will fail enumerable: false, get: function get() { if (this._readableState === undefined) { return false; } return this._readableState.destroyed; }, set: function set(value) { // we ignore the value if the stream // has not been initialized yet if (!this._readableState) { return; } // backward compatibility, the user is explicitly // managing destroyed this._readableState.destroyed = value; } }); Readable.prototype.destroy = destroyImpl.destroy; Readable.prototype._undestroy = destroyImpl.undestroy; Readable.prototype._destroy = function (err, cb) { cb(err); }; // Manually shove something into the read() buffer. // This returns true if the highWaterMark has not been hit yet, // similar to how Writable.write() returns true if you should // write() some more. Readable.prototype.push = function (chunk, encoding) { var state = this._readableState; var skipChunkCheck; if (!state.objectMode) { if (typeof chunk === 'string') { encoding = encoding || state.defaultEncoding; if (encoding !== state.encoding) { chunk = Buffer.from(chunk, encoding); encoding = ''; } skipChunkCheck = true; } } else { skipChunkCheck = true; } return readableAddChunk(this, chunk, encoding, false, skipChunkCheck); }; // Unshift should *always* be something directly out of read() Readable.prototype.unshift = function (chunk) { return readableAddChunk(this, chunk, null, true, false); }; function readableAddChunk(stream, chunk, encoding, addToFront, skipChunkCheck) { debug('readableAddChunk', chunk); var state = stream._readableState; if (chunk === null) { state.reading = false; onEofChunk(stream, state); } else { var er; if (!skipChunkCheck) er = chunkInvalid(state, chunk); if (er) { errorOrDestroy(stream, er); } else if (state.objectMode || chunk && chunk.length > 0) { if (typeof chunk !== 'string' && !state.objectMode && Object.getPrototypeOf(chunk) !== Buffer.prototype) { chunk = _uint8ArrayToBuffer(chunk); } if (addToFront) { if (state.endEmitted) errorOrDestroy(stream, new ERR_STREAM_UNSHIFT_AFTER_END_EVENT());else addChunk(stream, state, chunk, true); } else if (state.ended) { errorOrDestroy(stream, new ERR_STREAM_PUSH_AFTER_EOF()); } else if (state.destroyed) { return false; } else { state.reading = false; if (state.decoder && !encoding) { chunk = state.decoder.write(chunk); if (state.objectMode || chunk.length !== 0) addChunk(stream, state, chunk, false);else maybeReadMore(stream, state); } else { addChunk(stream, state, chunk, false); } } } else if (!addToFront) { state.reading = false; maybeReadMore(stream, state); } } // We can push more data if we are below the highWaterMark. // Also, if we have no data yet, we can stand some more bytes. // This is to work around cases where hwm=0, such as the repl. return !state.ended && (state.length < state.highWaterMark || state.length === 0); } function addChunk(stream, state, chunk, addToFront) { if (state.flowing && state.length === 0 && !state.sync) { state.awaitDrain = 0; stream.emit('data', chunk); } else { // update the buffer info. state.length += state.objectMode ? 1 : chunk.length; if (addToFront) state.buffer.unshift(chunk);else state.buffer.push(chunk); if (state.needReadable) emitReadable(stream); } maybeReadMore(stream, state); } function chunkInvalid(state, chunk) { var er; if (!_isUint8Array(chunk) && typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) { er = new ERR_INVALID_ARG_TYPE('chunk', ['string', 'Buffer', 'Uint8Array'], chunk); } return er; } Readable.prototype.isPaused = function () { return this._readableState.flowing === false; }; // backwards compatibility. Readable.prototype.setEncoding = function (enc) { if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder; var decoder = new StringDecoder(enc); this._readableState.decoder = decoder; // If setEncoding(null), decoder.encoding equals utf8 this._readableState.encoding = this._readableState.decoder.encoding; // Iterate over current buffer to convert already stored Buffers: var p = this._readableState.buffer.head; var content = ''; while (p !== null) { content += decoder.write(p.data); p = p.next; } this._readableState.buffer.clear(); if (content !== '') this._readableState.buffer.push(content); this._readableState.length = content.length; return this; }; // Don't raise the hwm > 1GB var MAX_HWM = 0x40000000; function computeNewHighWaterMark(n) { if (n >= MAX_HWM) { // TODO(ronag): Throw ERR_VALUE_OUT_OF_RANGE. n = MAX_HWM; } else { // Get the next highest power of 2 to prevent increasing hwm excessively in // tiny amounts n--; n |= n >>> 1; n |= n >>> 2; n |= n >>> 4; n |= n >>> 8; n |= n >>> 16; n++; } return n; } // This function is designed to be inlinable, so please take care when making // changes to the function body. function howMuchToRead(n, state) { if (n <= 0 || state.length === 0 && state.ended) return 0; if (state.objectMode) return 1; if (n !== n) { // Only flow one buffer at a time if (state.flowing && state.length) return state.buffer.head.data.length;else return state.length; } // If we're asking for more than the current hwm, then raise the hwm. if (n > state.highWaterMark) state.highWaterMark = computeNewHighWaterMark(n); if (n <= state.length) return n; // Don't have enough if (!state.ended) { state.needReadable = true; return 0; } return state.length; } // you can override either this method, or the async _read(n) below. Readable.prototype.read = function (n) { debug('read', n); n = parseInt(n, 10); var state = this._readableState; var nOrig = n; if (n !== 0) state.emittedReadable = false; // if we're doing read(0) to trigger a readable event, but we // already have a bunch of data in the buffer, then just trigger // the 'readable' event and move on. if (n === 0 && state.needReadable && ((state.highWaterMark !== 0 ? state.length >= state.highWaterMark : state.length > 0) || state.ended)) { debug('read: emitReadable', state.length, state.ended); if (state.length === 0 && state.ended) endReadable(this);else emitReadable(this); return null; } n = howMuchToRead(n, state); // if we've ended, and we're now clear, then finish it up. if (n === 0 && state.ended) { if (state.length === 0) endReadable(this); return null; } // All the actual chunk generation logic needs to be // *below* the call to _read. The reason is that in certain // synthetic stream cases, such as passthrough streams, _read // may be a completely synchronous operation which may change // the state of the read buffer, providing enough data when // before there was *not* enough. // // So, the steps are: // 1. Figure out what the state of things will be after we do // a read from the buffer. // // 2. If that resulting state will trigger a _read, then call _read. // Note that this may be asynchronous, or synchronous. Yes, it is // deeply ugly to write APIs this way, but that still doesn't mean // that the Readable class should behave improperly, as streams are // designed to be sync/async agnostic. // Take note if the _read call is sync or async (ie, if the read call // has returned yet), so that we know whether or not it's safe to emit // 'readable' etc. // // 3. Actually pull the requested chunks out of the buffer and return. // if we need a readable event, then we need to do some reading. var doRead = state.needReadable; debug('need readable', doRead); // if we currently have less than the highWaterMark, then also read some if (state.length === 0 || state.length - n < state.highWaterMark) { doRead = true; debug('length less than watermark', doRead); } // however, if we've ended, then there's no point, and if we're already // reading, then it's unnecessary. if (state.ended || state.reading) { doRead = false; debug('reading or ended', doRead); } else if (doRead) { debug('do read'); state.reading = true; state.sync = true; // if the length is currently zero, then we *need* a readable event. if (state.length === 0) state.needReadable = true; // call internal read method this._read(state.highWaterMark); state.sync = false; // If _read pushed data synchronously, then `reading` will be false, // and we need to re-evaluate how much data we can return to the user. if (!state.reading) n = howMuchToRead(nOrig, state); } var ret; if (n > 0) ret = fromList(n, state);else ret = null; if (ret === null) { state.needReadable = state.length <= state.highWaterMark; n = 0; } else { state.length -= n; state.awaitDrain = 0; } if (state.length === 0) { // If we have nothing in the buffer, then we want to know // as soon as we *do* get something into the buffer. if (!state.ended) state.needReadable = true; // If we tried to read() past the EOF, then emit end on the next tick. if (nOrig !== n && state.ended) endReadable(this); } if (ret !== null) this.emit('data', ret); return ret; }; function onEofChunk(stream, state) { debug('onEofChunk'); if (state.ended) return; if (state.decoder) { var chunk = state.decoder.end(); if (chunk && chunk.length) { state.buffer.push(chunk); state.length += state.objectMode ? 1 : chunk.length; } } state.ended = true; if (state.sync) { // if we are sync, wait until next tick to emit the data. // Otherwise we risk emitting data in the flow() // the readable code triggers during a read() call emitReadable(stream); } else { // emit 'readable' now to make sure it gets picked up. state.needReadable = false; if (!state.emittedReadable) { state.emittedReadable = true; emitReadable_(stream); } } } // Don't emit readable right away in sync mode, because this can trigger // another read() call => stack overflow. This way, it might trigger // a nextTick recursion warning, but that's not so bad. function emitReadable(stream) { var state = stream._readableState; debug('emitReadable', state.needReadable, state.emittedReadable); state.needReadable = false; if (!state.emittedReadable) { debug('emitReadable', state.flowing); state.emittedReadable = true; process.nextTick(emitReadable_, stream); } } function emitReadable_(stream) { var state = stream._readableState; debug('emitReadable_', state.destroyed, state.length, state.ended); if (!state.destroyed && (state.length || state.ended)) { stream.emit('readable'); state.emittedReadable = false; } // The stream needs another readable event if // 1. It is not flowing, as the flow mechanism will take // care of it. // 2. It is not ended. // 3. It is below the highWaterMark, so we can schedule // another readable later. state.needReadable = !state.flowing && !state.ended && state.length <= state.highWaterMark; flow(stream); } // at this point, the user has presumably seen the 'readable' event, // and called read() to consume some data. that may have triggered // in turn another _read(n) call, in which case reading = true if // it's in progress. // However, if we're not ended, or reading, and the length < hwm, // then go ahead and try to read some more preemptively. function maybeReadMore(stream, state) { if (!state.readingMore) { state.readingMore = true; process.nextTick(maybeReadMore_, stream, state); } } function maybeReadMore_(stream, state) { // Attempt to read more data if we should. // // The conditions for reading more data are (one of): // - Not enough data buffered (state.length < state.highWaterMark). The loop // is responsible for filling the buffer with enough data if such data // is available. If highWaterMark is 0 and we are not in the flowing mode // we should _not_ attempt to buffer any extra data. We'll get more data // when the stream consumer calls read() instead. // - No data in the buffer, and the stream is in flowing mode. In this mode // the loop below is responsible for ensuring read() is called. Failing to // call read here would abort the flow and there's no other mechanism for // continuing the flow if the stream consumer has just subscribed to the // 'data' event. // // In addition to the above conditions to keep reading data, the following // conditions prevent the data from being read: // - The stream has ended (state.ended). // - There is already a pending 'read' operation (state.reading). This is a // case where the the stream has called the implementation defined _read() // method, but they are processing the call asynchronously and have _not_ // called push() with new data. In this case we skip performing more // read()s. The execution ends in this method again after the _read() ends // up calling push() with more data. while (!state.reading && !state.ended && (state.length < state.highWaterMark || state.flowing && state.length === 0)) { var len = state.length; debug('maybeReadMore read 0'); stream.read(0); if (len === state.length) // didn't get any data, stop spinning. break; } state.readingMore = false; } // abstract method. to be overridden in specific implementation classes. // call cb(er, data) where data is <= n in length. // for virtual (non-string, non-buffer) streams, "length" is somewhat // arbitrary, and perhaps not very meaningful. Readable.prototype._read = function (n) { errorOrDestroy(this, new ERR_METHOD_NOT_IMPLEMENTED('_read()')); }; Readable.prototype.pipe = function (dest, pipeOpts) { var src = this; var state = this._readableState; switch (state.pipesCount) { case 0: state.pipes = dest; break; case 1: state.pipes = [state.pipes, dest]; break; default: state.pipes.push(dest); break; } state.pipesCount += 1; debug('pipe count=%d opts=%j', state.pipesCount, pipeOpts); var doEnd = (!pipeOpts || pipeOpts.end !== false) && dest !== process.stdout && dest !== process.stderr; var endFn = doEnd ? onend : unpipe; if (state.endEmitted) process.nextTick(endFn);else src.once('end', endFn); dest.on('unpipe', onunpipe); function onunpipe(readable, unpipeInfo) { debug('onunpipe'); if (readable === src) { if (unpipeInfo && unpipeInfo.hasUnpiped === false) { unpipeInfo.hasUnpiped = true; cleanup(); } } } function onend() { debug('onend'); dest.end(); } // when the dest drains, it reduces the awaitDrain counter // on the source. This would be more elegant with a .once() // handler in flow(), but adding and removing repeatedly is // too slow. var ondrain = pipeOnDrain(src); dest.on('drain', ondrain); var cleanedUp = false; function cleanup() { debug('cleanup'); // cleanup event handlers once the pipe is broken dest.removeListener('close', onclose); dest.removeListener('finish', onfinish); dest.removeListener('drain', ondrain); dest.removeListener('error', onerror); dest.removeListener('unpipe', onunpipe); src.removeListener('end', onend); src.removeListener('end', unpipe); src.removeListener('data', ondata); cleanedUp = true; // if the reader is waiting for a drain event from this // specific writer, then it would cause it to never start // flowing again. // So, if this is awaiting a drain, then we just call it now. // If we don't know, then assume that we are waiting for one. if (state.awaitDrain && (!dest._writableState || dest._writableState.needDrain)) ondrain(); } src.on('data', ondata); function ondata(chunk) { debug('ondata'); var ret = dest.write(chunk); debug('dest.write', ret); if (ret === false) { // If the user unpiped during `dest.write()`, it is possible // to get stuck in a permanently paused state if that write // also returned false. // => Check whether `dest` is still a piping destination. if ((state.pipesCount === 1 && state.pipes === dest || state.pipesCount > 1 && indexOf(state.pipes, dest) !== -1) && !cleanedUp) { debug('false write response, pause', state.awaitDrain); state.awaitDrain++; } src.pause(); } } // if the dest has an error, then stop piping into it. // however, don't suppress the throwing behavior for this. function onerror(er) { debug('onerror', er); unpipe(); dest.removeListener('error', onerror); if (EElistenerCount(dest, 'error') === 0) errorOrDestroy(dest, er); } // Make sure our error handler is attached before userland ones. prependListener(dest, 'error', onerror); // Both close and finish should trigger unpipe, but only once. function onclose() { dest.removeListener('finish', onfinish); unpipe(); } dest.once('close', onclose); function onfinish() { debug('onfinish'); dest.removeListener('close', onclose); unpipe(); } dest.once('finish', onfinish); function unpipe() { debug('unpipe'); src.unpipe(dest); } // tell the dest that it's being piped to dest.emit('pipe', src); // start the flow if it hasn't been started already. if (!state.flowing) { debug('pipe resume'); src.resume(); } return dest; }; function pipeOnDrain(src) { return function pipeOnDrainFunctionResult() { var state = src._readableState; debug('pipeOnDrain', state.awaitDrain); if (state.awaitDrain) state.awaitDrain--; if (state.awaitDrain === 0 && EElistenerCount(src, 'data')) { state.flowing = true; flow(src); } }; } Readable.prototype.unpipe = function (dest) { var state = this._readableState; var unpipeInfo = { hasUnpiped: false }; // if we're not piping anywhere, then do nothing. if (state.pipesCount === 0) return this; // just one destination. most common case. if (state.pipesCount === 1) { // passed in one, but it's not the right one. if (dest && dest !== state.pipes) return this; if (!dest) dest = state.pipes; // got a match. state.pipes = null; state.pipesCount = 0; state.flowing = false; if (dest) dest.emit('unpipe', this, unpipeInfo); return this; } // slow case. multiple pipe destinations. if (!dest) { // remove all. var dests = state.pipes; var len = state.pipesCount; state.pipes = null; state.pipesCount = 0; state.flowing = false; for (var i = 0; i < len; i++) { dests[i].emit('unpipe', this, { hasUnpiped: false }); } return this; } // try to find the right one. var index = indexOf(state.pipes, dest); if (index === -1) return this; state.pipes.splice(index, 1); state.pipesCount -= 1; if (state.pipesCount === 1) state.pipes = state.pipes[0]; dest.emit('unpipe', this, unpipeInfo); return this; }; // set up data events if they are asked for // Ensure readable listeners eventually get something Readable.prototype.on = function (ev, fn) { var res = Stream.prototype.on.call(this, ev, fn); var state = this._readableState; if (ev === 'data') { // update readableListening so that resume() may be a no-op // a few lines down. This is needed to support once('readable'). state.readableListening = this.listenerCount('readable') > 0; // Try start flowing on next tick if stream isn't explicitly paused if (state.flowing !== false) this.resume(); } else if (ev === 'readable') { if (!state.endEmitted && !state.readableListening) { state.readableListening = state.needReadable = true; state.flowing = false; state.emittedReadable = false; debug('on readable', state.length, state.reading); if (state.length) { emitReadable(this); } else if (!state.reading) { process.nextTick(nReadingNextTick, this); } } } return res; }; Readable.prototype.addListener = Readable.prototype.on; Readable.prototype.removeListener = function (ev, fn) { var res = Stream.prototype.removeListener.call(this, ev, fn); if (ev === 'readable') { // We need to check if there is someone still listening to // readable and reset the state. However this needs to happen // after readable has been emitted but before I/O (nextTick) to // support once('readable', fn) cycles. This means that calling // resume within the same tick will have no // effect. process.nextTick(updateReadableListening, this); } return res; }; Readable.prototype.removeAllListeners = function (ev) { var res = Stream.prototype.removeAllListeners.apply(this, arguments); if (ev === 'readable' || ev === undefined) { // We need to check if there is someone still listening to // readable and reset the state. However this needs to happen // after readable has been emitted but before I/O (nextTick) to // support once('readable', fn) cycles. This means that calling // resume within the same tick will have no // effect. process.nextTick(updateReadableListening, this); } return res; }; function updateReadableListening(self) { var state = self._readableState; state.readableListening = self.listenerCount('readable') > 0; if (state.resumeScheduled && !state.paused) { // flowing needs to be set to true now, otherwise // the upcoming resume will not flow. state.flowing = true; // crude way to check if we should resume } else if (self.listenerCount('data') > 0) { self.resume(); } } function nReadingNextTick(self) { debug('readable nexttick read 0'); self.read(0); } // pause() and resume() are remnants of the legacy readable stream API // If the user uses them, then switch into old mode. Readable.prototype.resume = function () { var state = this._readableState; if (!state.flowing) { debug('resume'); // we flow only if there is no one listening // for readable, but we still have to call // resume() state.flowing = !state.readableListening; resume(this, state); } state.paused = false; return this; }; function resume(stream, state) { if (!state.resumeScheduled) { state.resumeScheduled = true; process.nextTick(resume_, stream, state); } } function resume_(stream, state) { debug('resume', state.reading); if (!state.reading) { stream.read(0); } state.resumeScheduled = false; stream.emit('resume'); flow(stream); if (state.flowing && !state.reading) stream.read(0); } Readable.prototype.pause = function () { debug('call pause flowing=%j', this._readableState.flowing); if (this._readableState.flowing !== false) { debug('pause'); this._readableState.flowing = false; this.emit('pause'); } this._readableState.paused = true; return this; }; function flow(stream) { var state = stream._readableState; debug('flow', state.flowing); while (state.flowing && stream.read() !== null) { ; } } // wrap an old-style stream as the async data source. // This is *not* part of the readable stream interface. // It is an ugly unfortunate mess of history. Readable.prototype.wrap = function (stream) { var _this = this; var state = this._readableState; var paused = false; stream.on('end', function () { debug('wrapped end'); if (state.decoder && !state.ended) { var chunk = state.decoder.end(); if (chunk && chunk.length) _this.push(chunk); } _this.push(null); }); stream.on('data', function (chunk) { debug('wrapped data'); if (state.decoder) chunk = state.decoder.write(chunk); // don't skip over falsy values in objectMode if (state.objectMode && (chunk === null || chunk === undefined)) return;else if (!state.objectMode && (!chunk || !chunk.length)) return; var ret = _this.push(chunk); if (!ret) { paused = true; stream.pause(); } }); // proxy all the other methods. // important when wrapping filters and duplexes. for (var i in stream) { if (this[i] === undefined && typeof stream[i] === 'function') { this[i] = function methodWrap(method) { return function methodWrapReturnFunction() { return stream[method].apply(stream, arguments); }; }(i); } } // proxy certain important events. for (var n = 0; n < kProxyEvents.length; n++) { stream.on(kProxyEvents[n], this.emit.bind(this, kProxyEvents[n])); } // when we try to consume some more bytes, simply unpause the // underlying stream. this._read = function (n) { debug('wrapped _read', n); if (paused) { paused = false; stream.resume(); } }; return this; }; if (typeof Symbol === 'function') { Readable.prototype[Symbol.asyncIterator] = function () { if (createReadableStreamAsyncIterator === undefined) { createReadableStreamAsyncIterator = require('./internal/streams/async_iterator'); } return createReadableStreamAsyncIterator(this); }; } Object.defineProperty(Readable.prototype, 'readableHighWaterMark', { // making it explicit this property is not enumerable // because otherwise some prototype manipulation in // userland will fail enumerable: false, get: function get() { return this._readableState.highWaterMark; } }); Object.defineProperty(Readable.prototype, 'readableBuffer', { // making it explicit this property is not enumerable // because otherwise some prototype manipulation in // userland will fail enumerable: false, get: function get() { return this._readableState && this._readableState.buffer; } }); Object.defineProperty(Readable.prototype, 'readableFlowing', { // making it explicit this property is not enumerable // because otherwise some prototype manipulation in // userland will fail enumerable: false, get: function get() { return this._readableState.flowing; }, set: function set(state) { if (this._readableState) { this._readableState.flowing = state; } } }); // exposed for testing purposes only. Readable._fromList = fromList; Object.defineProperty(Readable.prototype, 'readableLength', { // making it explicit this property is not enumerable // because otherwise some prototype manipulation in // userland will fail enumerable: false, get: function get() { return this._readableState.length; } }); // Pluck off n bytes from an array of buffers. // Length is the combined lengths of all the buffers in the list. // This function is designed to be inlinable, so please take care when making // changes to the function body. function fromList(n, state) { // nothing buffered if (state.length === 0) return null; var ret; if (state.objectMode) ret = state.buffer.shift();else if (!n || n >= state.length) { // read it all, truncate the list if (state.decoder) ret = state.buffer.join('');else if (state.buffer.length === 1) ret = state.buffer.first();else ret = state.buffer.concat(state.length); state.buffer.clear(); } else { // read part of list ret = state.buffer.consume(n, state.decoder); } return ret; } function endReadable(stream) { var state = stream._readableState; debug('endReadable', state.endEmitted); if (!state.endEmitted) { state.ended = true; process.nextTick(endReadableNT, state, stream); } } function endReadableNT(state, stream) { debug('endReadableNT', state.endEmitted, state.length); // Check that we didn't get one last unshift. if (!state.endEmitted && state.length === 0) { state.endEmitted = true; stream.readable = false; stream.emit('end'); if (state.autoDestroy) { // In case of duplex streams we need a way to detect // if the writable side is ready for autoDestroy as well var wState = stream._writableState; if (!wState || wState.autoDestroy && wState.finished) { stream.destroy(); } } } } if (typeof Symbol === 'function') { Readable.from = function (iterable, opts) { if (from === undefined) { from = require('./internal/streams/from'); } return from(Readable, iterable, opts); }; } function indexOf(xs, x) { for (var i = 0, l = xs.length; i < l; i++) { if (xs[i] === x) return i; } return -1; } }).call(this)}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) },{"../errors":736,"./_stream_duplex":737,"./internal/streams/async_iterator":742,"./internal/streams/buffer_list":743,"./internal/streams/destroy":744,"./internal/streams/from":746,"./internal/streams/state":748,"./internal/streams/stream":749,"_process":714,"buffer":81,"events":84,"inherits":88,"string_decoder/":751,"util":80}],740:[function(require,module,exports){ // Copyright Joyent, Inc. and other Node contributors. // // Permission is hereby granted, free of charge, to any person obtaining a // copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to permit // persons to whom the Software is furnished to do so, subject to the // following conditions: // // The above copyright notice and this permission notice shall be included // in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE // USE OR OTHER DEALINGS IN THE SOFTWARE. // a transform stream is a readable/writable stream where you do // something with the data. Sometimes it's called a "filter", // but that's not a great name for it, since that implies a thing where // some bits pass through, and others are simply ignored. (That would // be a valid example of a transform, of course.) // // While the output is causally related to the input, it's not a // necessarily symmetric or synchronous transformation. For example, // a zlib stream might take multiple plain-text writes(), and then // emit a single compressed chunk some time in the future. // // Here's how this works: // // The Transform stream has all the aspects of the readable and writable // stream classes. When you write(chunk), that calls _write(chunk,cb) // internally, and returns false if there's a lot of pending writes // buffered up. When you call read(), that calls _read(n) until // there's enough pending readable data buffered up. // // In a transform stream, the written data is placed in a buffer. When // _read(n) is called, it transforms the queued up data, calling the // buffered _write cb's as it consumes chunks. If consuming a single // written chunk would result in multiple output chunks, then the first // outputted bit calls the readcb, and subsequent chunks just go into // the read buffer, and will cause it to emit 'readable' if necessary. // // This way, back-pressure is actually determined by the reading side, // since _read has to be called to start processing a new chunk. However, // a pathological inflate type of transform can cause excessive buffering // here. For example, imagine a stream where every byte of input is // interpreted as an integer from 0-255, and then results in that many // bytes of output. Writing the 4 bytes {ff,ff,ff,ff} would result in // 1kb of data being output. In this case, you could write a very small // amount of input, and end up with a very large amount of output. In // such a pathological inflating mechanism, there'd be no way to tell // the system to stop doing the transform. A single 4MB write could // cause the system to run out of memory. // // However, even in such a pathological case, only a single written chunk // would be consumed, and then the rest would wait (un-transformed) until // the results of the previous transformed chunk were consumed. 'use strict'; module.exports = Transform; var _require$codes = require('../errors').codes, ERR_METHOD_NOT_IMPLEMENTED = _require$codes.ERR_METHOD_NOT_IMPLEMENTED, ERR_MULTIPLE_CALLBACK = _require$codes.ERR_MULTIPLE_CALLBACK, ERR_TRANSFORM_ALREADY_TRANSFORMING = _require$codes.ERR_TRANSFORM_ALREADY_TRANSFORMING, ERR_TRANSFORM_WITH_LENGTH_0 = _require$codes.ERR_TRANSFORM_WITH_LENGTH_0; var Duplex = require('./_stream_duplex'); require('inherits')(Transform, Duplex); function afterTransform(er, data) { var ts = this._transformState; ts.transforming = false; var cb = ts.writecb; if (cb === null) { return this.emit('error', new ERR_MULTIPLE_CALLBACK()); } ts.writechunk = null; ts.writecb = null; if (data != null) // single equals check for both `null` and `undefined` this.push(data); cb(er); var rs = this._readableState; rs.reading = false; if (rs.needReadable || rs.length < rs.highWaterMark) { this._read(rs.highWaterMark); } } function Transform(options) { if (!(this instanceof Transform)) return new Transform(options); Duplex.call(this, options); this._transformState = { afterTransform: afterTransform.bind(this), needTransform: false, transforming: false, writecb: null, writechunk: null, writeencoding: null }; // start out asking for a readable event once data is transformed. this._readableState.needReadable = true; // we have implemented the _read method, and done the other things // that Readable wants before the first _read call, so unset the // sync guard flag. this._readableState.sync = false; if (options) { if (typeof options.transform === 'function') this._transform = options.transform; if (typeof options.flush === 'function') this._flush = options.flush; } // When the writable side finishes, then flush out anything remaining. this.on('prefinish', prefinish); } function prefinish() { var _this = this; if (typeof this._flush === 'function' && !this._readableState.destroyed) { this._flush(function (er, data) { done(_this, er, data); }); } else { done(this, null, null); } } Transform.prototype.push = function (chunk, encoding) { this._transformState.needTransform = false; return Duplex.prototype.push.call(this, chunk, encoding); }; // This is the part where you do stuff! // override this function in implementation classes. // 'chunk' is an input chunk. // // Call `push(newChunk)` to pass along transformed output // to the readable side. You may call 'push' zero or more times. // // Call `cb(err)` when you are done with this chunk. If you pass // an error, then that'll put the hurt on the whole operation. If you // never call cb(), then you'll never get another chunk. Transform.prototype._transform = function (chunk, encoding, cb) { cb(new ERR_METHOD_NOT_IMPLEMENTED('_transform()')); }; Transform.prototype._write = function (chunk, encoding, cb) { var ts = this._transformState; ts.writecb = cb; ts.writechunk = chunk; ts.writeencoding = encoding; if (!ts.transforming) { var rs = this._readableState; if (ts.needTransform || rs.needReadable || rs.length < rs.highWaterMark) this._read(rs.highWaterMark); } }; // Doesn't matter what the args are here. // _transform does all the work. // That we got here means that the readable side wants more data. Transform.prototype._read = function (n) { var ts = this._transformState; if (ts.writechunk !== null && !ts.transforming) { ts.transforming = true; this._transform(ts.writechunk, ts.writeencoding, ts.afterTransform); } else { // mark that we need a transform, so that any data that comes in // will get processed, now that we've asked for it. ts.needTransform = true; } }; Transform.prototype._destroy = function (err, cb) { Duplex.prototype._destroy.call(this, err, function (err2) { cb(err2); }); }; function done(stream, er, data) { if (er) return stream.emit('error', er); if (data != null) // single equals check for both `null` and `undefined` stream.push(data); // TODO(BridgeAR): Write a test for these two error cases // if there's nothing in the write buffer, then that means // that nothing more will ever be provided if (stream._writableState.length) throw new ERR_TRANSFORM_WITH_LENGTH_0(); if (stream._transformState.transforming) throw new ERR_TRANSFORM_ALREADY_TRANSFORMING(); return stream.push(null); } },{"../errors":736,"./_stream_duplex":737,"inherits":88}],741:[function(require,module,exports){ (function (process,global){(function (){ // Copyright Joyent, Inc. and other Node contributors. // // Permission is hereby granted, free of charge, to any person obtaining a // copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to permit // persons to whom the Software is furnished to do so, subject to the // following conditions: // // The above copyright notice and this permission notice shall be included // in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE // USE OR OTHER DEALINGS IN THE SOFTWARE. // A bit simpler than readable streams. // Implement an async ._write(chunk, encoding, cb), and it'll handle all // the drain event emission and buffering. 'use strict'; module.exports = Writable; /* */ function WriteReq(chunk, encoding, cb) { this.chunk = chunk; this.encoding = encoding; this.callback = cb; this.next = null; } // It seems a linked list but it is not // there will be only 2 of these for each stream function CorkedRequest(state) { var _this = this; this.next = null; this.entry = null; this.finish = function () { onCorkedFinish(_this, state); }; } /* */ /**/ var Duplex; /**/ Writable.WritableState = WritableState; /**/ var internalUtil = { deprecate: require('util-deprecate') }; /**/ /**/ var Stream = require('./internal/streams/stream'); /**/ var Buffer = require('buffer').Buffer; var OurUint8Array = global.Uint8Array || function () {}; function _uint8ArrayToBuffer(chunk) { return Buffer.from(chunk); } function _isUint8Array(obj) { return Buffer.isBuffer(obj) || obj instanceof OurUint8Array; } var destroyImpl = require('./internal/streams/destroy'); var _require = require('./internal/streams/state'), getHighWaterMark = _require.getHighWaterMark; var _require$codes = require('../errors').codes, ERR_INVALID_ARG_TYPE = _require$codes.ERR_INVALID_ARG_TYPE, ERR_METHOD_NOT_IMPLEMENTED = _require$codes.ERR_METHOD_NOT_IMPLEMENTED, ERR_MULTIPLE_CALLBACK = _require$codes.ERR_MULTIPLE_CALLBACK, ERR_STREAM_CANNOT_PIPE = _require$codes.ERR_STREAM_CANNOT_PIPE, ERR_STREAM_DESTROYED = _require$codes.ERR_STREAM_DESTROYED, ERR_STREAM_NULL_VALUES = _require$codes.ERR_STREAM_NULL_VALUES, ERR_STREAM_WRITE_AFTER_END = _require$codes.ERR_STREAM_WRITE_AFTER_END, ERR_UNKNOWN_ENCODING = _require$codes.ERR_UNKNOWN_ENCODING; var errorOrDestroy = destroyImpl.errorOrDestroy; require('inherits')(Writable, Stream); function nop() {} function WritableState(options, stream, isDuplex) { Duplex = Duplex || require('./_stream_duplex'); options = options || {}; // Duplex streams are both readable and writable, but share // the same options object. // However, some cases require setting options to different // values for the readable and the writable sides of the duplex stream, // e.g. options.readableObjectMode vs. options.writableObjectMode, etc. if (typeof isDuplex !== 'boolean') isDuplex = stream instanceof Duplex; // object stream flag to indicate whether or not this stream // contains buffers or objects. this.objectMode = !!options.objectMode; if (isDuplex) this.objectMode = this.objectMode || !!options.writableObjectMode; // the point at which write() starts returning false // Note: 0 is a valid value, means that we always return false if // the entire buffer is not flushed immediately on write() this.highWaterMark = getHighWaterMark(this, options, 'writableHighWaterMark', isDuplex); // if _final has been called this.finalCalled = false; // drain event flag. this.needDrain = false; // at the start of calling end() this.ending = false; // when end() has been called, and returned this.ended = false; // when 'finish' is emitted this.finished = false; // has it been destroyed this.destroyed = false; // should we decode strings into buffers before passing to _write? // this is here so that some node-core streams can optimize string // handling at a lower level. var noDecode = options.decodeStrings === false; this.decodeStrings = !noDecode; // Crypto is kind of old and crusty. Historically, its default string // encoding is 'binary' so we have to make this configurable. // Everything else in the universe uses 'utf8', though. this.defaultEncoding = options.defaultEncoding || 'utf8'; // not an actual buffer we keep track of, but a measurement // of how much we're waiting to get pushed to some underlying // socket or file. this.length = 0; // a flag to see when we're in the middle of a write. this.writing = false; // when true all writes will be buffered until .uncork() call this.corked = 0; // a flag to be able to tell if the onwrite cb is called immediately, // or on a later tick. We set this to true at first, because any // actions that shouldn't happen until "later" should generally also // not happen before the first write call. this.sync = true; // a flag to know if we're processing previously buffered items, which // may call the _write() callback in the same tick, so that we don't // end up in an overlapped onwrite situation. this.bufferProcessing = false; // the callback that's passed to _write(chunk,cb) this.onwrite = function (er) { onwrite(stream, er); }; // the callback that the user supplies to write(chunk,encoding,cb) this.writecb = null; // the amount that is being written when _write is called. this.writelen = 0; this.bufferedRequest = null; this.lastBufferedRequest = null; // number of pending user-supplied write callbacks // this must be 0 before 'finish' can be emitted this.pendingcb = 0; // emit prefinish if the only thing we're waiting for is _write cbs // This is relevant for synchronous Transform streams this.prefinished = false; // True if the error was already emitted and should not be thrown again this.errorEmitted = false; // Should close be emitted on destroy. Defaults to true. this.emitClose = options.emitClose !== false; // Should .destroy() be called after 'finish' (and potentially 'end') this.autoDestroy = !!options.autoDestroy; // count buffered requests this.bufferedRequestCount = 0; // allocate the first CorkedRequest, there is always // one allocated and free to use, and we maintain at most two this.corkedRequestsFree = new CorkedRequest(this); } WritableState.prototype.getBuffer = function getBuffer() { var current = this.bufferedRequest; var out = []; while (current) { out.push(current); current = current.next; } return out; }; (function () { try { Object.defineProperty(WritableState.prototype, 'buffer', { get: internalUtil.deprecate(function writableStateBufferGetter() { return this.getBuffer(); }, '_writableState.buffer is deprecated. Use _writableState.getBuffer ' + 'instead.', 'DEP0003') }); } catch (_) {} })(); // Test _writableState for inheritance to account for Duplex streams, // whose prototype chain only points to Readable. var realHasInstance; if (typeof Symbol === 'function' && Symbol.hasInstance && typeof Function.prototype[Symbol.hasInstance] === 'function') { realHasInstance = Function.prototype[Symbol.hasInstance]; Object.defineProperty(Writable, Symbol.hasInstance, { value: function value(object) { if (realHasInstance.call(this, object)) return true; if (this !== Writable) return false; return object && object._writableState instanceof WritableState; } }); } else { realHasInstance = function realHasInstance(object) { return object instanceof this; }; } function Writable(options) { Duplex = Duplex || require('./_stream_duplex'); // Writable ctor is applied to Duplexes, too. // `realHasInstance` is necessary because using plain `instanceof` // would return false, as no `_writableState` property is attached. // Trying to use the custom `instanceof` for Writable here will also break the // Node.js LazyTransform implementation, which has a non-trivial getter for // `_writableState` that would lead to infinite recursion. // Checking for a Stream.Duplex instance is faster here instead of inside // the WritableState constructor, at least with V8 6.5 var isDuplex = this instanceof Duplex; if (!isDuplex && !realHasInstance.call(Writable, this)) return new Writable(options); this._writableState = new WritableState(options, this, isDuplex); // legacy. this.writable = true; if (options) { if (typeof options.write === 'function') this._write = options.write; if (typeof options.writev === 'function') this._writev = options.writev; if (typeof options.destroy === 'function') this._destroy = options.destroy; if (typeof options.final === 'function') this._final = options.final; } Stream.call(this); } // Otherwise people can pipe Writable streams, which is just wrong. Writable.prototype.pipe = function () { errorOrDestroy(this, new ERR_STREAM_CANNOT_PIPE()); }; function writeAfterEnd(stream, cb) { var er = new ERR_STREAM_WRITE_AFTER_END(); // TODO: defer error events consistently everywhere, not just the cb errorOrDestroy(stream, er); process.nextTick(cb, er); } // Checks that a user-supplied chunk is valid, especially for the particular // mode the stream is in. Currently this means that `null` is never accepted // and undefined/non-string values are only allowed in object mode. function validChunk(stream, state, chunk, cb) { var er; if (chunk === null) { er = new ERR_STREAM_NULL_VALUES(); } else if (typeof chunk !== 'string' && !state.objectMode) { er = new ERR_INVALID_ARG_TYPE('chunk', ['string', 'Buffer'], chunk); } if (er) { errorOrDestroy(stream, er); process.nextTick(cb, er); return false; } return true; } Writable.prototype.write = function (chunk, encoding, cb) { var state = this._writableState; var ret = false; var isBuf = !state.objectMode && _isUint8Array(chunk); if (isBuf && !Buffer.isBuffer(chunk)) { chunk = _uint8ArrayToBuffer(chunk); } if (typeof encoding === 'function') { cb = encoding; encoding = null; } if (isBuf) encoding = 'buffer';else if (!encoding) encoding = state.defaultEncoding; if (typeof cb !== 'function') cb = nop; if (state.ending) writeAfterEnd(this, cb);else if (isBuf || validChunk(this, state, chunk, cb)) { state.pendingcb++; ret = writeOrBuffer(this, state, isBuf, chunk, encoding, cb); } return ret; }; Writable.prototype.cork = function () { this._writableState.corked++; }; Writable.prototype.uncork = function () { var state = this._writableState; if (state.corked) { state.corked--; if (!state.writing && !state.corked && !state.bufferProcessing && state.bufferedRequest) clearBuffer(this, state); } }; Writable.prototype.setDefaultEncoding = function setDefaultEncoding(encoding) { // node::ParseEncoding() requires lower case. if (typeof encoding === 'string') encoding = encoding.toLowerCase(); if (!(['hex', 'utf8', 'utf-8', 'ascii', 'binary', 'base64', 'ucs2', 'ucs-2', 'utf16le', 'utf-16le', 'raw'].indexOf((encoding + '').toLowerCase()) > -1)) throw new ERR_UNKNOWN_ENCODING(encoding); this._writableState.defaultEncoding = encoding; return this; }; Object.defineProperty(Writable.prototype, 'writableBuffer', { // making it explicit this property is not enumerable // because otherwise some prototype manipulation in // userland will fail enumerable: false, get: function get() { return this._writableState && this._writableState.getBuffer(); } }); function decodeChunk(state, chunk, encoding) { if (!state.objectMode && state.decodeStrings !== false && typeof chunk === 'string') { chunk = Buffer.from(chunk, encoding); } return chunk; } Object.defineProperty(Writable.prototype, 'writableHighWaterMark', { // making it explicit this property is not enumerable // because otherwise some prototype manipulation in // userland will fail enumerable: false, get: function get() { return this._writableState.highWaterMark; } }); // if we're already writing something, then just put this // in the queue, and wait our turn. Otherwise, call _write // If we return false, then we need a drain event, so set that flag. function writeOrBuffer(stream, state, isBuf, chunk, encoding, cb) { if (!isBuf) { var newChunk = decodeChunk(state, chunk, encoding); if (chunk !== newChunk) { isBuf = true; encoding = 'buffer'; chunk = newChunk; } } var len = state.objectMode ? 1 : chunk.length; state.length += len; var ret = state.length < state.highWaterMark; // we must ensure that previous needDrain will not be reset to false. if (!ret) state.needDrain = true; if (state.writing || state.corked) { var last = state.lastBufferedRequest; state.lastBufferedRequest = { chunk: chunk, encoding: encoding, isBuf: isBuf, callback: cb, next: null }; if (last) { last.next = state.lastBufferedRequest; } else { state.bufferedRequest = state.lastBufferedRequest; } state.bufferedRequestCount += 1; } else { doWrite(stream, state, false, len, chunk, encoding, cb); } return ret; } function doWrite(stream, state, writev, len, chunk, encoding, cb) { state.writelen = len; state.writecb = cb; state.writing = true; state.sync = true; if (state.destroyed) state.onwrite(new ERR_STREAM_DESTROYED('write'));else if (writev) stream._writev(chunk, state.onwrite);else stream._write(chunk, encoding, state.onwrite); state.sync = false; } function onwriteError(stream, state, sync, er, cb) { --state.pendingcb; if (sync) { // defer the callback if we are being called synchronously // to avoid piling up things on the stack process.nextTick(cb, er); // this can emit finish, and it will always happen // after error process.nextTick(finishMaybe, stream, state); stream._writableState.errorEmitted = true; errorOrDestroy(stream, er); } else { // the caller expect this to happen before if // it is async cb(er); stream._writableState.errorEmitted = true; errorOrDestroy(stream, er); // this can emit finish, but finish must // always follow error finishMaybe(stream, state); } } function onwriteStateUpdate(state) { state.writing = false; state.writecb = null; state.length -= state.writelen; state.writelen = 0; } function onwrite(stream, er) { var state = stream._writableState; var sync = state.sync; var cb = state.writecb; if (typeof cb !== 'function') throw new ERR_MULTIPLE_CALLBACK(); onwriteStateUpdate(state); if (er) onwriteError(stream, state, sync, er, cb);else { // Check if we're actually ready to finish, but don't emit yet var finished = needFinish(state) || stream.destroyed; if (!finished && !state.corked && !state.bufferProcessing && state.bufferedRequest) { clearBuffer(stream, state); } if (sync) { process.nextTick(afterWrite, stream, state, finished, cb); } else { afterWrite(stream, state, finished, cb); } } } function afterWrite(stream, state, finished, cb) { if (!finished) onwriteDrain(stream, state); state.pendingcb--; cb(); finishMaybe(stream, state); } // Must force callback to be called on nextTick, so that we don't // emit 'drain' before the write() consumer gets the 'false' return // value, and has a chance to attach a 'drain' listener. function onwriteDrain(stream, state) { if (state.length === 0 && state.needDrain) { state.needDrain = false; stream.emit('drain'); } } // if there's something in the buffer waiting, then process it function clearBuffer(stream, state) { state.bufferProcessing = true; var entry = state.bufferedRequest; if (stream._writev && entry && entry.next) { // Fast case, write everything using _writev() var l = state.bufferedRequestCount; var buffer = new Array(l); var holder = state.corkedRequestsFree; holder.entry = entry; var count = 0; var allBuffers = true; while (entry) { buffer[count] = entry; if (!entry.isBuf) allBuffers = false; entry = entry.next; count += 1; } buffer.allBuffers = allBuffers; doWrite(stream, state, true, state.length, buffer, '', holder.finish); // doWrite is almost always async, defer these to save a bit of time // as the hot path ends with doWrite state.pendingcb++; state.lastBufferedRequest = null; if (holder.next) { state.corkedRequestsFree = holder.next; holder.next = null; } else { state.corkedRequestsFree = new CorkedRequest(state); } state.bufferedRequestCount = 0; } else { // Slow case, write chunks one-by-one while (entry) { var chunk = entry.chunk; var encoding = entry.encoding; var cb = entry.callback; var len = state.objectMode ? 1 : chunk.length; doWrite(stream, state, false, len, chunk, encoding, cb); entry = entry.next; state.bufferedRequestCount--; // if we didn't call the onwrite immediately, then // it means that we need to wait until it does. // also, that means that the chunk and cb are currently // being processed, so move the buffer counter past them. if (state.writing) { break; } } if (entry === null) state.lastBufferedRequest = null; } state.bufferedRequest = entry; state.bufferProcessing = false; } Writable.prototype._write = function (chunk, encoding, cb) { cb(new ERR_METHOD_NOT_IMPLEMENTED('_write()')); }; Writable.prototype._writev = null; Writable.prototype.end = function (chunk, encoding, cb) { var state = this._writableState; if (typeof chunk === 'function') { cb = chunk; chunk = null; encoding = null; } else if (typeof encoding === 'function') { cb = encoding; encoding = null; } if (chunk !== null && chunk !== undefined) this.write(chunk, encoding); // .end() fully uncorks if (state.corked) { state.corked = 1; this.uncork(); } // ignore unnecessary end() calls. if (!state.ending) endWritable(this, state, cb); return this; }; Object.defineProperty(Writable.prototype, 'writableLength', { // making it explicit this property is not enumerable // because otherwise some prototype manipulation in // userland will fail enumerable: false, get: function get() { return this._writableState.length; } }); function needFinish(state) { return state.ending && state.length === 0 && state.bufferedRequest === null && !state.finished && !state.writing; } function callFinal(stream, state) { stream._final(function (err) { state.pendingcb--; if (err) { errorOrDestroy(stream, err); } state.prefinished = true; stream.emit('prefinish'); finishMaybe(stream, state); }); } function prefinish(stream, state) { if (!state.prefinished && !state.finalCalled) { if (typeof stream._final === 'function' && !state.destroyed) { state.pendingcb++; state.finalCalled = true; process.nextTick(callFinal, stream, state); } else { state.prefinished = true; stream.emit('prefinish'); } } } function finishMaybe(stream, state) { var need = needFinish(state); if (need) { prefinish(stream, state); if (state.pendingcb === 0) { state.finished = true; stream.emit('finish'); if (state.autoDestroy) { // In case of duplex streams we need a way to detect // if the readable side is ready for autoDestroy as well var rState = stream._readableState; if (!rState || rState.autoDestroy && rState.endEmitted) { stream.destroy(); } } } } return need; } function endWritable(stream, state, cb) { state.ending = true; finishMaybe(stream, state); if (cb) { if (state.finished) process.nextTick(cb);else stream.once('finish', cb); } state.ended = true; stream.writable = false; } function onCorkedFinish(corkReq, state, err) { var entry = corkReq.entry; corkReq.entry = null; while (entry) { var cb = entry.callback; state.pendingcb--; cb(err); entry = entry.next; } // reuse the free corkReq. state.corkedRequestsFree.next = corkReq; } Object.defineProperty(Writable.prototype, 'destroyed', { // making it explicit this property is not enumerable // because otherwise some prototype manipulation in // userland will fail enumerable: false, get: function get() { if (this._writableState === undefined) { return false; } return this._writableState.destroyed; }, set: function set(value) { // we ignore the value if the stream // has not been initialized yet if (!this._writableState) { return; } // backward compatibility, the user is explicitly // managing destroyed this._writableState.destroyed = value; } }); Writable.prototype.destroy = destroyImpl.destroy; Writable.prototype._undestroy = destroyImpl.undestroy; Writable.prototype._destroy = function (err, cb) { cb(err); }; }).call(this)}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) },{"../errors":736,"./_stream_duplex":737,"./internal/streams/destroy":744,"./internal/streams/state":748,"./internal/streams/stream":749,"_process":714,"buffer":81,"inherits":88,"util-deprecate":755}],742:[function(require,module,exports){ (function (process){(function (){ 'use strict'; var _Object$setPrototypeO; function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } var finished = require('./end-of-stream'); var kLastResolve = Symbol('lastResolve'); var kLastReject = Symbol('lastReject'); var kError = Symbol('error'); var kEnded = Symbol('ended'); var kLastPromise = Symbol('lastPromise'); var kHandlePromise = Symbol('handlePromise'); var kStream = Symbol('stream'); function createIterResult(value, done) { return { value: value, done: done }; } function readAndResolve(iter) { var resolve = iter[kLastResolve]; if (resolve !== null) { var data = iter[kStream].read(); // we defer if data is null // we can be expecting either 'end' or // 'error' if (data !== null) { iter[kLastPromise] = null; iter[kLastResolve] = null; iter[kLastReject] = null; resolve(createIterResult(data, false)); } } } function onReadable(iter) { // we wait for the next tick, because it might // emit an error with process.nextTick process.nextTick(readAndResolve, iter); } function wrapForNext(lastPromise, iter) { return function (resolve, reject) { lastPromise.then(function () { if (iter[kEnded]) { resolve(createIterResult(undefined, true)); return; } iter[kHandlePromise](resolve, reject); }, reject); }; } var AsyncIteratorPrototype = Object.getPrototypeOf(function () {}); var ReadableStreamAsyncIteratorPrototype = Object.setPrototypeOf((_Object$setPrototypeO = { get stream() { return this[kStream]; }, next: function next() { var _this = this; // if we have detected an error in the meanwhile // reject straight away var error = this[kError]; if (error !== null) { return Promise.reject(error); } if (this[kEnded]) { return Promise.resolve(createIterResult(undefined, true)); } if (this[kStream].destroyed) { // We need to defer via nextTick because if .destroy(err) is // called, the error will be emitted via nextTick, and // we cannot guarantee that there is no error lingering around // waiting to be emitted. return new Promise(function (resolve, reject) { process.nextTick(function () { if (_this[kError]) { reject(_this[kError]); } else { resolve(createIterResult(undefined, true)); } }); }); } // if we have multiple next() calls // we will wait for the previous Promise to finish // this logic is optimized to support for await loops, // where next() is only called once at a time var lastPromise = this[kLastPromise]; var promise; if (lastPromise) { promise = new Promise(wrapForNext(lastPromise, this)); } else { // fast path needed to support multiple this.push() // without triggering the next() queue var data = this[kStream].read(); if (data !== null) { return Promise.resolve(createIterResult(data, false)); } promise = new Promise(this[kHandlePromise]); } this[kLastPromise] = promise; return promise; } }, _defineProperty(_Object$setPrototypeO, Symbol.asyncIterator, function () { return this; }), _defineProperty(_Object$setPrototypeO, "return", function _return() { var _this2 = this; // destroy(err, cb) is a private API // we can guarantee we have that here, because we control the // Readable class this is attached to return new Promise(function (resolve, reject) { _this2[kStream].destroy(null, function (err) { if (err) { reject(err); return; } resolve(createIterResult(undefined, true)); }); }); }), _Object$setPrototypeO), AsyncIteratorPrototype); var createReadableStreamAsyncIterator = function createReadableStreamAsyncIterator(stream) { var _Object$create; var iterator = Object.create(ReadableStreamAsyncIteratorPrototype, (_Object$create = {}, _defineProperty(_Object$create, kStream, { value: stream, writable: true }), _defineProperty(_Object$create, kLastResolve, { value: null, writable: true }), _defineProperty(_Object$create, kLastReject, { value: null, writable: true }), _defineProperty(_Object$create, kError, { value: null, writable: true }), _defineProperty(_Object$create, kEnded, { value: stream._readableState.endEmitted, writable: true }), _defineProperty(_Object$create, kHandlePromise, { value: function value(resolve, reject) { var data = iterator[kStream].read(); if (data) { iterator[kLastPromise] = null; iterator[kLastResolve] = null; iterator[kLastReject] = null; resolve(createIterResult(data, false)); } else { iterator[kLastResolve] = resolve; iterator[kLastReject] = reject; } }, writable: true }), _Object$create)); iterator[kLastPromise] = null; finished(stream, function (err) { if (err && err.code !== 'ERR_STREAM_PREMATURE_CLOSE') { var reject = iterator[kLastReject]; // reject if we are waiting for data in the Promise // returned by next() and store the error if (reject !== null) { iterator[kLastPromise] = null; iterator[kLastResolve] = null; iterator[kLastReject] = null; reject(err); } iterator[kError] = err; return; } var resolve = iterator[kLastResolve]; if (resolve !== null) { iterator[kLastPromise] = null; iterator[kLastResolve] = null; iterator[kLastReject] = null; resolve(createIterResult(undefined, true)); } iterator[kEnded] = true; }); stream.on('readable', onReadable.bind(null, iterator)); return iterator; }; module.exports = createReadableStreamAsyncIterator; }).call(this)}).call(this,require('_process')) },{"./end-of-stream":745,"_process":714}],743:[function(require,module,exports){ 'use strict'; function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } var _require = require('buffer'), Buffer = _require.Buffer; var _require2 = require('util'), inspect = _require2.inspect; var custom = inspect && inspect.custom || 'inspect'; function copyBuffer(src, target, offset) { Buffer.prototype.copy.call(src, target, offset); } module.exports = /*#__PURE__*/ function () { function BufferList() { _classCallCheck(this, BufferList); this.head = null; this.tail = null; this.length = 0; } _createClass(BufferList, [{ key: "push", value: function push(v) { var entry = { data: v, next: null }; if (this.length > 0) this.tail.next = entry;else this.head = entry; this.tail = entry; ++this.length; } }, { key: "unshift", value: function unshift(v) { var entry = { data: v, next: this.head }; if (this.length === 0) this.tail = entry; this.head = entry; ++this.length; } }, { key: "shift", value: function shift() { if (this.length === 0) return; var ret = this.head.data; if (this.length === 1) this.head = this.tail = null;else this.head = this.head.next; --this.length; return ret; } }, { key: "clear", value: function clear() { this.head = this.tail = null; this.length = 0; } }, { key: "join", value: function join(s) { if (this.length === 0) return ''; var p = this.head; var ret = '' + p.data; while (p = p.next) { ret += s + p.data; } return ret; } }, { key: "concat", value: function concat(n) { if (this.length === 0) return Buffer.alloc(0); var ret = Buffer.allocUnsafe(n >>> 0); var p = this.head; var i = 0; while (p) { copyBuffer(p.data, ret, i); i += p.data.length; p = p.next; } return ret; } // Consumes a specified amount of bytes or characters from the buffered data. }, { key: "consume", value: function consume(n, hasStrings) { var ret; if (n < this.head.data.length) { // `slice` is the same for buffers and strings. ret = this.head.data.slice(0, n); this.head.data = this.head.data.slice(n); } else if (n === this.head.data.length) { // First chunk is a perfect match. ret = this.shift(); } else { // Result spans more than one buffer. ret = hasStrings ? this._getString(n) : this._getBuffer(n); } return ret; } }, { key: "first", value: function first() { return this.head.data; } // Consumes a specified amount of characters from the buffered data. }, { key: "_getString", value: function _getString(n) { var p = this.head; var c = 1; var ret = p.data; n -= ret.length; while (p = p.next) { var str = p.data; var nb = n > str.length ? str.length : n; if (nb === str.length) ret += str;else ret += str.slice(0, n); n -= nb; if (n === 0) { if (nb === str.length) { ++c; if (p.next) this.head = p.next;else this.head = this.tail = null; } else { this.head = p; p.data = str.slice(nb); } break; } ++c; } this.length -= c; return ret; } // Consumes a specified amount of bytes from the buffered data. }, { key: "_getBuffer", value: function _getBuffer(n) { var ret = Buffer.allocUnsafe(n); var p = this.head; var c = 1; p.data.copy(ret); n -= p.data.length; while (p = p.next) { var buf = p.data; var nb = n > buf.length ? buf.length : n; buf.copy(ret, ret.length - n, 0, nb); n -= nb; if (n === 0) { if (nb === buf.length) { ++c; if (p.next) this.head = p.next;else this.head = this.tail = null; } else { this.head = p; p.data = buf.slice(nb); } break; } ++c; } this.length -= c; return ret; } // Make sure the linked list only shows the minimal necessary information. }, { key: custom, value: function value(_, options) { return inspect(this, _objectSpread({}, options, { // Only inspect one level. depth: 0, // It should not recurse. customInspect: false })); } }]); return BufferList; }(); },{"buffer":81,"util":80}],744:[function(require,module,exports){ (function (process){(function (){ 'use strict'; // undocumented cb() API, needed for core, not for public API function destroy(err, cb) { var _this = this; var readableDestroyed = this._readableState && this._readableState.destroyed; var writableDestroyed = this._writableState && this._writableState.destroyed; if (readableDestroyed || writableDestroyed) { if (cb) { cb(err); } else if (err) { if (!this._writableState) { process.nextTick(emitErrorNT, this, err); } else if (!this._writableState.errorEmitted) { this._writableState.errorEmitted = true; process.nextTick(emitErrorNT, this, err); } } return this; } // we set destroyed to true before firing error callbacks in order // to make it re-entrance safe in case destroy() is called within callbacks if (this._readableState) { this._readableState.destroyed = true; } // if this is a duplex stream mark the writable part as destroyed as well if (this._writableState) { this._writableState.destroyed = true; } this._destroy(err || null, function (err) { if (!cb && err) { if (!_this._writableState) { process.nextTick(emitErrorAndCloseNT, _this, err); } else if (!_this._writableState.errorEmitted) { _this._writableState.errorEmitted = true; process.nextTick(emitErrorAndCloseNT, _this, err); } else { process.nextTick(emitCloseNT, _this); } } else if (cb) { process.nextTick(emitCloseNT, _this); cb(err); } else { process.nextTick(emitCloseNT, _this); } }); return this; } function emitErrorAndCloseNT(self, err) { emitErrorNT(self, err); emitCloseNT(self); } function emitCloseNT(self) { if (self._writableState && !self._writableState.emitClose) return; if (self._readableState && !self._readableState.emitClose) return; self.emit('close'); } function undestroy() { if (this._readableState) { this._readableState.destroyed = false; this._readableState.reading = false; this._readableState.ended = false; this._readableState.endEmitted = false; } if (this._writableState) { this._writableState.destroyed = false; this._writableState.ended = false; this._writableState.ending = false; this._writableState.finalCalled = false; this._writableState.prefinished = false; this._writableState.finished = false; this._writableState.errorEmitted = false; } } function emitErrorNT(self, err) { self.emit('error', err); } function errorOrDestroy(stream, err) { // We have tests that rely on errors being emitted // in the same tick, so changing this is semver major. // For now when you opt-in to autoDestroy we allow // the error to be emitted nextTick. In a future // semver major update we should change the default to this. var rState = stream._readableState; var wState = stream._writableState; if (rState && rState.autoDestroy || wState && wState.autoDestroy) stream.destroy(err);else stream.emit('error', err); } module.exports = { destroy: destroy, undestroy: undestroy, errorOrDestroy: errorOrDestroy }; }).call(this)}).call(this,require('_process')) },{"_process":714}],745:[function(require,module,exports){ // Ported from https://github.com/mafintosh/end-of-stream with // permission from the author, Mathias Buus (@mafintosh). 'use strict'; var ERR_STREAM_PREMATURE_CLOSE = require('../../../errors').codes.ERR_STREAM_PREMATURE_CLOSE; function once(callback) { var called = false; return function () { if (called) return; called = true; for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } callback.apply(this, args); }; } function noop() {} function isRequest(stream) { return stream.setHeader && typeof stream.abort === 'function'; } function eos(stream, opts, callback) { if (typeof opts === 'function') return eos(stream, null, opts); if (!opts) opts = {}; callback = once(callback || noop); var readable = opts.readable || opts.readable !== false && stream.readable; var writable = opts.writable || opts.writable !== false && stream.writable; var onlegacyfinish = function onlegacyfinish() { if (!stream.writable) onfinish(); }; var writableEnded = stream._writableState && stream._writableState.finished; var onfinish = function onfinish() { writable = false; writableEnded = true; if (!readable) callback.call(stream); }; var readableEnded = stream._readableState && stream._readableState.endEmitted; var onend = function onend() { readable = false; readableEnded = true; if (!writable) callback.call(stream); }; var onerror = function onerror(err) { callback.call(stream, err); }; var onclose = function onclose() { var err; if (readable && !readableEnded) { if (!stream._readableState || !stream._readableState.ended) err = new ERR_STREAM_PREMATURE_CLOSE(); return callback.call(stream, err); } if (writable && !writableEnded) { if (!stream._writableState || !stream._writableState.ended) err = new ERR_STREAM_PREMATURE_CLOSE(); return callback.call(stream, err); } }; var onrequest = function onrequest() { stream.req.on('finish', onfinish); }; if (isRequest(stream)) { stream.on('complete', onfinish); stream.on('abort', onclose); if (stream.req) onrequest();else stream.on('request', onrequest); } else if (writable && !stream._writableState) { // legacy streams stream.on('end', onlegacyfinish); stream.on('close', onlegacyfinish); } stream.on('end', onend); stream.on('finish', onfinish); if (opts.error !== false) stream.on('error', onerror); stream.on('close', onclose); return function () { stream.removeListener('complete', onfinish); stream.removeListener('abort', onclose); stream.removeListener('request', onrequest); if (stream.req) stream.req.removeListener('finish', onfinish); stream.removeListener('end', onlegacyfinish); stream.removeListener('close', onlegacyfinish); stream.removeListener('finish', onfinish); stream.removeListener('end', onend); stream.removeListener('error', onerror); stream.removeListener('close', onclose); }; } module.exports = eos; },{"../../../errors":736}],746:[function(require,module,exports){ module.exports = function () { throw new Error('Readable.from is not available in the browser') }; },{}],747:[function(require,module,exports){ // Ported from https://github.com/mafintosh/pump with // permission from the author, Mathias Buus (@mafintosh). 'use strict'; var eos; function once(callback) { var called = false; return function () { if (called) return; called = true; callback.apply(void 0, arguments); }; } var _require$codes = require('../../../errors').codes, ERR_MISSING_ARGS = _require$codes.ERR_MISSING_ARGS, ERR_STREAM_DESTROYED = _require$codes.ERR_STREAM_DESTROYED; function noop(err) { // Rethrow the error if it exists to avoid swallowing it if (err) throw err; } function isRequest(stream) { return stream.setHeader && typeof stream.abort === 'function'; } function destroyer(stream, reading, writing, callback) { callback = once(callback); var closed = false; stream.on('close', function () { closed = true; }); if (eos === undefined) eos = require('./end-of-stream'); eos(stream, { readable: reading, writable: writing }, function (err) { if (err) return callback(err); closed = true; callback(); }); var destroyed = false; return function (err) { if (closed) return; if (destroyed) return; destroyed = true; // request.destroy just do .end - .abort is what we want if (isRequest(stream)) return stream.abort(); if (typeof stream.destroy === 'function') return stream.destroy(); callback(err || new ERR_STREAM_DESTROYED('pipe')); }; } function call(fn) { fn(); } function pipe(from, to) { return from.pipe(to); } function popCallback(streams) { if (!streams.length) return noop; if (typeof streams[streams.length - 1] !== 'function') return noop; return streams.pop(); } function pipeline() { for (var _len = arguments.length, streams = new Array(_len), _key = 0; _key < _len; _key++) { streams[_key] = arguments[_key]; } var callback = popCallback(streams); if (Array.isArray(streams[0])) streams = streams[0]; if (streams.length < 2) { throw new ERR_MISSING_ARGS('streams'); } var error; var destroys = streams.map(function (stream, i) { var reading = i < streams.length - 1; var writing = i > 0; return destroyer(stream, reading, writing, function (err) { if (!error) error = err; if (err) destroys.forEach(call); if (reading) return; destroys.forEach(call); callback(error); }); }); return streams.reduce(pipe); } module.exports = pipeline; },{"../../../errors":736,"./end-of-stream":745}],748:[function(require,module,exports){ 'use strict'; var ERR_INVALID_OPT_VALUE = require('../../../errors').codes.ERR_INVALID_OPT_VALUE; function highWaterMarkFrom(options, isDuplex, duplexKey) { return options.highWaterMark != null ? options.highWaterMark : isDuplex ? options[duplexKey] : null; } function getHighWaterMark(state, options, duplexKey, isDuplex) { var hwm = highWaterMarkFrom(options, isDuplex, duplexKey); if (hwm != null) { if (!(isFinite(hwm) && Math.floor(hwm) === hwm) || hwm < 0) { var name = isDuplex ? duplexKey : 'highWaterMark'; throw new ERR_INVALID_OPT_VALUE(name, hwm); } return Math.floor(hwm); } // Default value return state.objectMode ? 16 : 16 * 1024; } module.exports = { getHighWaterMark: getHighWaterMark }; },{"../../../errors":736}],749:[function(require,module,exports){ module.exports = require('events').EventEmitter; },{"events":84}],750:[function(require,module,exports){ exports = module.exports = require('./lib/_stream_readable.js'); exports.Stream = exports; exports.Readable = exports; exports.Writable = require('./lib/_stream_writable.js'); exports.Duplex = require('./lib/_stream_duplex.js'); exports.Transform = require('./lib/_stream_transform.js'); exports.PassThrough = require('./lib/_stream_passthrough.js'); exports.finished = require('./lib/internal/streams/end-of-stream.js'); exports.pipeline = require('./lib/internal/streams/pipeline.js'); },{"./lib/_stream_duplex.js":737,"./lib/_stream_passthrough.js":738,"./lib/_stream_readable.js":739,"./lib/_stream_transform.js":740,"./lib/_stream_writable.js":741,"./lib/internal/streams/end-of-stream.js":745,"./lib/internal/streams/pipeline.js":747}],751:[function(require,module,exports){ // Copyright Joyent, Inc. and other Node contributors. // // Permission is hereby granted, free of charge, to any person obtaining a // copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to permit // persons to whom the Software is furnished to do so, subject to the // following conditions: // // The above copyright notice and this permission notice shall be included // in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE // USE OR OTHER DEALINGS IN THE SOFTWARE. 'use strict'; /**/ var Buffer = require('safe-buffer').Buffer; /**/ var isEncoding = Buffer.isEncoding || function (encoding) { encoding = '' + encoding; switch (encoding && encoding.toLowerCase()) { case 'hex':case 'utf8':case 'utf-8':case 'ascii':case 'binary':case 'base64':case 'ucs2':case 'ucs-2':case 'utf16le':case 'utf-16le':case 'raw': return true; default: return false; } }; function _normalizeEncoding(enc) { if (!enc) return 'utf8'; var retried; while (true) { switch (enc) { case 'utf8': case 'utf-8': return 'utf8'; case 'ucs2': case 'ucs-2': case 'utf16le': case 'utf-16le': return 'utf16le'; case 'latin1': case 'binary': return 'latin1'; case 'base64': case 'ascii': case 'hex': return enc; default: if (retried) return; // undefined enc = ('' + enc).toLowerCase(); retried = true; } } }; // Do not cache `Buffer.isEncoding` when checking encoding names as some // modules monkey-patch it to support additional encodings function normalizeEncoding(enc) { var nenc = _normalizeEncoding(enc); if (typeof nenc !== 'string' && (Buffer.isEncoding === isEncoding || !isEncoding(enc))) throw new Error('Unknown encoding: ' + enc); return nenc || enc; } // StringDecoder provides an interface for efficiently splitting a series of // buffers into a series of JS strings without breaking apart multi-byte // characters. exports.StringDecoder = StringDecoder; function StringDecoder(encoding) { this.encoding = normalizeEncoding(encoding); var nb; switch (this.encoding) { case 'utf16le': this.text = utf16Text; this.end = utf16End; nb = 4; break; case 'utf8': this.fillLast = utf8FillLast; nb = 4; break; case 'base64': this.text = base64Text; this.end = base64End; nb = 3; break; default: this.write = simpleWrite; this.end = simpleEnd; return; } this.lastNeed = 0; this.lastTotal = 0; this.lastChar = Buffer.allocUnsafe(nb); } StringDecoder.prototype.write = function (buf) { if (buf.length === 0) return ''; var r; var i; if (this.lastNeed) { r = this.fillLast(buf); if (r === undefined) return ''; i = this.lastNeed; this.lastNeed = 0; } else { i = 0; } if (i < buf.length) return r ? r + this.text(buf, i) : this.text(buf, i); return r || ''; }; StringDecoder.prototype.end = utf8End; // Returns only complete characters in a Buffer StringDecoder.prototype.text = utf8Text; // Attempts to complete a partial non-UTF-8 character using bytes from a Buffer StringDecoder.prototype.fillLast = function (buf) { if (this.lastNeed <= buf.length) { buf.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, this.lastNeed); return this.lastChar.toString(this.encoding, 0, this.lastTotal); } buf.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, buf.length); this.lastNeed -= buf.length; }; // Checks the type of a UTF-8 byte, whether it's ASCII, a leading byte, or a // continuation byte. If an invalid byte is detected, -2 is returned. function utf8CheckByte(byte) { if (byte <= 0x7F) return 0;else if (byte >> 5 === 0x06) return 2;else if (byte >> 4 === 0x0E) return 3;else if (byte >> 3 === 0x1E) return 4; return byte >> 6 === 0x02 ? -1 : -2; } // Checks at most 3 bytes at the end of a Buffer in order to detect an // incomplete multi-byte UTF-8 character. The total number of bytes (2, 3, or 4) // needed to complete the UTF-8 character (if applicable) are returned. function utf8CheckIncomplete(self, buf, i) { var j = buf.length - 1; if (j < i) return 0; var nb = utf8CheckByte(buf[j]); if (nb >= 0) { if (nb > 0) self.lastNeed = nb - 1; return nb; } if (--j < i || nb === -2) return 0; nb = utf8CheckByte(buf[j]); if (nb >= 0) { if (nb > 0) self.lastNeed = nb - 2; return nb; } if (--j < i || nb === -2) return 0; nb = utf8CheckByte(buf[j]); if (nb >= 0) { if (nb > 0) { if (nb === 2) nb = 0;else self.lastNeed = nb - 3; } return nb; } return 0; } // Validates as many continuation bytes for a multi-byte UTF-8 character as // needed or are available. If we see a non-continuation byte where we expect // one, we "replace" the validated continuation bytes we've seen so far with // a single UTF-8 replacement character ('\ufffd'), to match v8's UTF-8 decoding // behavior. The continuation byte check is included three times in the case // where all of the continuation bytes for a character exist in the same buffer. // It is also done this way as a slight performance increase instead of using a // loop. function utf8CheckExtraBytes(self, buf, p) { if ((buf[0] & 0xC0) !== 0x80) { self.lastNeed = 0; return '\ufffd'; } if (self.lastNeed > 1 && buf.length > 1) { if ((buf[1] & 0xC0) !== 0x80) { self.lastNeed = 1; return '\ufffd'; } if (self.lastNeed > 2 && buf.length > 2) { if ((buf[2] & 0xC0) !== 0x80) { self.lastNeed = 2; return '\ufffd'; } } } } // Attempts to complete a multi-byte UTF-8 character using bytes from a Buffer. function utf8FillLast(buf) { var p = this.lastTotal - this.lastNeed; var r = utf8CheckExtraBytes(this, buf, p); if (r !== undefined) return r; if (this.lastNeed <= buf.length) { buf.copy(this.lastChar, p, 0, this.lastNeed); return this.lastChar.toString(this.encoding, 0, this.lastTotal); } buf.copy(this.lastChar, p, 0, buf.length); this.lastNeed -= buf.length; } // Returns all complete UTF-8 characters in a Buffer. If the Buffer ended on a // partial character, the character's bytes are buffered until the required // number of bytes are available. function utf8Text(buf, i) { var total = utf8CheckIncomplete(this, buf, i); if (!this.lastNeed) return buf.toString('utf8', i); this.lastTotal = total; var end = buf.length - (total - this.lastNeed); buf.copy(this.lastChar, 0, end); return buf.toString('utf8', i, end); } // For UTF-8, a replacement character is added when ending on a partial // character. function utf8End(buf) { var r = buf && buf.length ? this.write(buf) : ''; if (this.lastNeed) return r + '\ufffd'; return r; } // UTF-16LE typically needs two bytes per character, but even if we have an even // number of bytes available, we need to check if we end on a leading/high // surrogate. In that case, we need to wait for the next two bytes in order to // decode the last character properly. function utf16Text(buf, i) { if ((buf.length - i) % 2 === 0) { var r = buf.toString('utf16le', i); if (r) { var c = r.charCodeAt(r.length - 1); if (c >= 0xD800 && c <= 0xDBFF) { this.lastNeed = 2; this.lastTotal = 4; this.lastChar[0] = buf[buf.length - 2]; this.lastChar[1] = buf[buf.length - 1]; return r.slice(0, -1); } } return r; } this.lastNeed = 1; this.lastTotal = 2; this.lastChar[0] = buf[buf.length - 1]; return buf.toString('utf16le', i, buf.length - 1); } // For UTF-16LE we do not explicitly append special replacement characters if we // end on a partial character, we simply let v8 handle that. function utf16End(buf) { var r = buf && buf.length ? this.write(buf) : ''; if (this.lastNeed) { var end = this.lastTotal - this.lastNeed; return r + this.lastChar.toString('utf16le', 0, end); } return r; } function base64Text(buf, i) { var n = (buf.length - i) % 3; if (n === 0) return buf.toString('base64', i); this.lastNeed = 3 - n; this.lastTotal = 3; if (n === 1) { this.lastChar[0] = buf[buf.length - 1]; } else { this.lastChar[0] = buf[buf.length - 2]; this.lastChar[1] = buf[buf.length - 1]; } return buf.toString('base64', i, buf.length - n); } function base64End(buf) { var r = buf && buf.length ? this.write(buf) : ''; if (this.lastNeed) return r + this.lastChar.toString('base64', 0, 3 - this.lastNeed); return r; } // Pass bytes on through for single-byte encodings (e.g. ascii, latin1, hex) function simpleWrite(buf) { return buf.toString(this.encoding); } function simpleEnd(buf) { return buf && buf.length ? this.write(buf) : ''; } },{"safe-buffer":731}],752:[function(require,module,exports){ (function (setImmediate,clearImmediate){(function (){ var nextTick = require('process/browser.js').nextTick; var apply = Function.prototype.apply; var slice = Array.prototype.slice; var immediateIds = {}; var nextImmediateId = 0; // DOM APIs, for completeness exports.setTimeout = function() { return new Timeout(apply.call(setTimeout, window, arguments), clearTimeout); }; exports.setInterval = function() { return new Timeout(apply.call(setInterval, window, arguments), clearInterval); }; exports.clearTimeout = exports.clearInterval = function(timeout) { timeout.close(); }; function Timeout(id, clearFn) { this._id = id; this._clearFn = clearFn; } Timeout.prototype.unref = Timeout.prototype.ref = function() {}; Timeout.prototype.close = function() { this._clearFn.call(window, this._id); }; // Does not start the time, just sets up the members needed. exports.enroll = function(item, msecs) { clearTimeout(item._idleTimeoutId); item._idleTimeout = msecs; }; exports.unenroll = function(item) { clearTimeout(item._idleTimeoutId); item._idleTimeout = -1; }; exports._unrefActive = exports.active = function(item) { clearTimeout(item._idleTimeoutId); var msecs = item._idleTimeout; if (msecs >= 0) { item._idleTimeoutId = setTimeout(function onTimeout() { if (item._onTimeout) item._onTimeout(); }, msecs); } }; // That's not how node.js implements it but the exposed api is the same. exports.setImmediate = typeof setImmediate === "function" ? setImmediate : function(fn) { var id = nextImmediateId++; var args = arguments.length < 2 ? false : slice.call(arguments, 1); immediateIds[id] = true; nextTick(function onNextTick() { if (immediateIds[id]) { // fn.call() is faster so we optimize for the common use-case // @see http://jsperf.com/call-apply-segu if (args) { fn.apply(null, args); } else { fn.call(null); } // Prevent ids from leaking exports.clearImmediate(id); } }); return id; }; exports.clearImmediate = typeof clearImmediate === "function" ? clearImmediate : function(id) { delete immediateIds[id]; }; }).call(this)}).call(this,require("timers").setImmediate,require("timers").clearImmediate) },{"process/browser.js":714,"timers":752}],753:[function(require,module,exports){ // Copyright Joyent, Inc. and other Node contributors. // // Permission is hereby granted, free of charge, to any person obtaining a // copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to permit // persons to whom the Software is furnished to do so, subject to the // following conditions: // // The above copyright notice and this permission notice shall be included // in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE // USE OR OTHER DEALINGS IN THE SOFTWARE. 'use strict'; var punycode = require('punycode'); var util = require('./util'); exports.parse = urlParse; exports.resolve = urlResolve; exports.resolveObject = urlResolveObject; exports.format = urlFormat; exports.Url = Url; function Url() { this.protocol = null; this.slashes = null; this.auth = null; this.host = null; this.port = null; this.hostname = null; this.hash = null; this.search = null; this.query = null; this.pathname = null; this.path = null; this.href = null; } // Reference: RFC 3986, RFC 1808, RFC 2396 // define these here so at least they only have to be // compiled once on the first module load. var protocolPattern = /^([a-z0-9.+-]+:)/i, portPattern = /:[0-9]*$/, // Special case for a simple path URL simplePathPattern = /^(\/\/?(?!\/)[^\?\s]*)(\?[^\s]*)?$/, // RFC 2396: characters reserved for delimiting URLs. // We actually just auto-escape these. delims = ['<', '>', '"', '`', ' ', '\r', '\n', '\t'], // RFC 2396: characters not allowed for various reasons. unwise = ['{', '}', '|', '\\', '^', '`'].concat(delims), // Allowed by RFCs, but cause of XSS attacks. Always escape these. autoEscape = ['\''].concat(unwise), // Characters that are never ever allowed in a hostname. // Note that any invalid chars are also handled, but these // are the ones that are *expected* to be seen, so we fast-path // them. nonHostChars = ['%', '/', '?', ';', '#'].concat(autoEscape), hostEndingChars = ['/', '?', '#'], hostnameMaxLen = 255, hostnamePartPattern = /^[+a-z0-9A-Z_-]{0,63}$/, hostnamePartStart = /^([+a-z0-9A-Z_-]{0,63})(.*)$/, // protocols that can allow "unsafe" and "unwise" chars. unsafeProtocol = { 'javascript': true, 'javascript:': true }, // protocols that never have a hostname. hostlessProtocol = { 'javascript': true, 'javascript:': true }, // protocols that always contain a // bit. slashedProtocol = { 'http': true, 'https': true, 'ftp': true, 'gopher': true, 'file': true, 'http:': true, 'https:': true, 'ftp:': true, 'gopher:': true, 'file:': true }, querystring = require('querystring'); function urlParse(url, parseQueryString, slashesDenoteHost) { if (url && util.isObject(url) && url instanceof Url) return url; var u = new Url; u.parse(url, parseQueryString, slashesDenoteHost); return u; } Url.prototype.parse = function(url, parseQueryString, slashesDenoteHost) { if (!util.isString(url)) { throw new TypeError("Parameter 'url' must be a string, not " + typeof url); } // Copy chrome, IE, opera backslash-handling behavior. // Back slashes before the query string get converted to forward slashes // See: https://code.google.com/p/chromium/issues/detail?id=25916 var queryIndex = url.indexOf('?'), splitter = (queryIndex !== -1 && queryIndex < url.indexOf('#')) ? '?' : '#', uSplit = url.split(splitter), slashRegex = /\\/g; uSplit[0] = uSplit[0].replace(slashRegex, '/'); url = uSplit.join(splitter); var rest = url; // trim before proceeding. // This is to support parse stuff like " http://foo.com \n" rest = rest.trim(); if (!slashesDenoteHost && url.split('#').length === 1) { // Try fast path regexp var simplePath = simplePathPattern.exec(rest); if (simplePath) { this.path = rest; this.href = rest; this.pathname = simplePath[1]; if (simplePath[2]) { this.search = simplePath[2]; if (parseQueryString) { this.query = querystring.parse(this.search.substr(1)); } else { this.query = this.search.substr(1); } } else if (parseQueryString) { this.search = ''; this.query = {}; } return this; } } var proto = protocolPattern.exec(rest); if (proto) { proto = proto[0]; var lowerProto = proto.toLowerCase(); this.protocol = lowerProto; rest = rest.substr(proto.length); } // figure out if it's got a host // user@server is *always* interpreted as a hostname, and url // resolution will treat //foo/bar as host=foo,path=bar because that's // how the browser resolves relative URLs. if (slashesDenoteHost || proto || rest.match(/^\/\/[^@\/]+@[^@\/]+/)) { var slashes = rest.substr(0, 2) === '//'; if (slashes && !(proto && hostlessProtocol[proto])) { rest = rest.substr(2); this.slashes = true; } } if (!hostlessProtocol[proto] && (slashes || (proto && !slashedProtocol[proto]))) { // there's a hostname. // the first instance of /, ?, ;, or # ends the host. // // If there is an @ in the hostname, then non-host chars *are* allowed // to the left of the last @ sign, unless some host-ending character // comes *before* the @-sign. // URLs are obnoxious. // // ex: // http://a@b@c/ => user:a@b host:c // http://a@b?@c => user:a host:c path:/?@c // v0.12 TODO(isaacs): This is not quite how Chrome does things. // Review our test case against browsers more comprehensively. // find the first instance of any hostEndingChars var hostEnd = -1; for (var i = 0; i < hostEndingChars.length; i++) { var hec = rest.indexOf(hostEndingChars[i]); if (hec !== -1 && (hostEnd === -1 || hec < hostEnd)) hostEnd = hec; } // at this point, either we have an explicit point where the // auth portion cannot go past, or the last @ char is the decider. var auth, atSign; if (hostEnd === -1) { // atSign can be anywhere. atSign = rest.lastIndexOf('@'); } else { // atSign must be in auth portion. // http://a@b/c@d => host:b auth:a path:/c@d atSign = rest.lastIndexOf('@', hostEnd); } // Now we have a portion which is definitely the auth. // Pull that off. if (atSign !== -1) { auth = rest.slice(0, atSign); rest = rest.slice(atSign + 1); this.auth = decodeURIComponent(auth); } // the host is the remaining to the left of the first non-host char hostEnd = -1; for (var i = 0; i < nonHostChars.length; i++) { var hec = rest.indexOf(nonHostChars[i]); if (hec !== -1 && (hostEnd === -1 || hec < hostEnd)) hostEnd = hec; } // if we still have not hit it, then the entire thing is a host. if (hostEnd === -1) hostEnd = rest.length; this.host = rest.slice(0, hostEnd); rest = rest.slice(hostEnd); // pull out port. this.parseHost(); // we've indicated that there is a hostname, // so even if it's empty, it has to be present. this.hostname = this.hostname || ''; // if hostname begins with [ and ends with ] // assume that it's an IPv6 address. var ipv6Hostname = this.hostname[0] === '[' && this.hostname[this.hostname.length - 1] === ']'; // validate a little. if (!ipv6Hostname) { var hostparts = this.hostname.split(/\./); for (var i = 0, l = hostparts.length; i < l; i++) { var part = hostparts[i]; if (!part) continue; if (!part.match(hostnamePartPattern)) { var newpart = ''; for (var j = 0, k = part.length; j < k; j++) { if (part.charCodeAt(j) > 127) { // we replace non-ASCII char with a temporary placeholder // we need this to make sure size of hostname is not // broken by replacing non-ASCII by nothing newpart += 'x'; } else { newpart += part[j]; } } // we test again with ASCII char only if (!newpart.match(hostnamePartPattern)) { var validParts = hostparts.slice(0, i); var notHost = hostparts.slice(i + 1); var bit = part.match(hostnamePartStart); if (bit) { validParts.push(bit[1]); notHost.unshift(bit[2]); } if (notHost.length) { rest = '/' + notHost.join('.') + rest; } this.hostname = validParts.join('.'); break; } } } } if (this.hostname.length > hostnameMaxLen) { this.hostname = ''; } else { // hostnames are always lower case. this.hostname = this.hostname.toLowerCase(); } if (!ipv6Hostname) { // IDNA Support: Returns a punycoded representation of "domain". // It only converts parts of the domain name that // have non-ASCII characters, i.e. it doesn't matter if // you call it with a domain that already is ASCII-only. this.hostname = punycode.toASCII(this.hostname); } var p = this.port ? ':' + this.port : ''; var h = this.hostname || ''; this.host = h + p; this.href += this.host; // strip [ and ] from the hostname // the host field still retains them, though if (ipv6Hostname) { this.hostname = this.hostname.substr(1, this.hostname.length - 2); if (rest[0] !== '/') { rest = '/' + rest; } } } // now rest is set to the post-host stuff. // chop off any delim chars. if (!unsafeProtocol[lowerProto]) { // First, make 100% sure that any "autoEscape" chars get // escaped, even if encodeURIComponent doesn't think they // need to be. for (var i = 0, l = autoEscape.length; i < l; i++) { var ae = autoEscape[i]; if (rest.indexOf(ae) === -1) continue; var esc = encodeURIComponent(ae); if (esc === ae) { esc = escape(ae); } rest = rest.split(ae).join(esc); } } // chop off from the tail first. var hash = rest.indexOf('#'); if (hash !== -1) { // got a fragment string. this.hash = rest.substr(hash); rest = rest.slice(0, hash); } var qm = rest.indexOf('?'); if (qm !== -1) { this.search = rest.substr(qm); this.query = rest.substr(qm + 1); if (parseQueryString) { this.query = querystring.parse(this.query); } rest = rest.slice(0, qm); } else if (parseQueryString) { // no query string, but parseQueryString still requested this.search = ''; this.query = {}; } if (rest) this.pathname = rest; if (slashedProtocol[lowerProto] && this.hostname && !this.pathname) { this.pathname = '/'; } //to support http.request if (this.pathname || this.search) { var p = this.pathname || ''; var s = this.search || ''; this.path = p + s; } // finally, reconstruct the href based on what has been validated. this.href = this.format(); return this; }; // format a parsed object into a url string function urlFormat(obj) { // ensure it's an object, and not a string url. // If it's an obj, this is a no-op. // this way, you can call url_format() on strings // to clean up potentially wonky urls. if (util.isString(obj)) obj = urlParse(obj); if (!(obj instanceof Url)) return Url.prototype.format.call(obj); return obj.format(); } Url.prototype.format = function() { var auth = this.auth || ''; if (auth) { auth = encodeURIComponent(auth); auth = auth.replace(/%3A/i, ':'); auth += '@'; } var protocol = this.protocol || '', pathname = this.pathname || '', hash = this.hash || '', host = false, query = ''; if (this.host) { host = auth + this.host; } else if (this.hostname) { host = auth + (this.hostname.indexOf(':') === -1 ? this.hostname : '[' + this.hostname + ']'); if (this.port) { host += ':' + this.port; } } if (this.query && util.isObject(this.query) && Object.keys(this.query).length) { query = querystring.stringify(this.query); } var search = this.search || (query && ('?' + query)) || ''; if (protocol && protocol.substr(-1) !== ':') protocol += ':'; // only the slashedProtocols get the //. Not mailto:, xmpp:, etc. // unless they had them to begin with. if (this.slashes || (!protocol || slashedProtocol[protocol]) && host !== false) { host = '//' + (host || ''); if (pathname && pathname.charAt(0) !== '/') pathname = '/' + pathname; } else if (!host) { host = ''; } if (hash && hash.charAt(0) !== '#') hash = '#' + hash; if (search && search.charAt(0) !== '?') search = '?' + search; pathname = pathname.replace(/[?#]/g, function(match) { return encodeURIComponent(match); }); search = search.replace('#', '%23'); return protocol + host + pathname + search + hash; }; function urlResolve(source, relative) { return urlParse(source, false, true).resolve(relative); } Url.prototype.resolve = function(relative) { return this.resolveObject(urlParse(relative, false, true)).format(); }; function urlResolveObject(source, relative) { if (!source) return relative; return urlParse(source, false, true).resolveObject(relative); } Url.prototype.resolveObject = function(relative) { if (util.isString(relative)) { var rel = new Url(); rel.parse(relative, false, true); relative = rel; } var result = new Url(); var tkeys = Object.keys(this); for (var tk = 0; tk < tkeys.length; tk++) { var tkey = tkeys[tk]; result[tkey] = this[tkey]; } // hash is always overridden, no matter what. // even href="" will remove it. result.hash = relative.hash; // if the relative url is empty, then there's nothing left to do here. if (relative.href === '') { result.href = result.format(); return result; } // hrefs like //foo/bar always cut to the protocol. if (relative.slashes && !relative.protocol) { // take everything except the protocol from relative var rkeys = Object.keys(relative); for (var rk = 0; rk < rkeys.length; rk++) { var rkey = rkeys[rk]; if (rkey !== 'protocol') result[rkey] = relative[rkey]; } //urlParse appends trailing / to urls like http://www.example.com if (slashedProtocol[result.protocol] && result.hostname && !result.pathname) { result.path = result.pathname = '/'; } result.href = result.format(); return result; } if (relative.protocol && relative.protocol !== result.protocol) { // if it's a known url protocol, then changing // the protocol does weird things // first, if it's not file:, then we MUST have a host, // and if there was a path // to begin with, then we MUST have a path. // if it is file:, then the host is dropped, // because that's known to be hostless. // anything else is assumed to be absolute. if (!slashedProtocol[relative.protocol]) { var keys = Object.keys(relative); for (var v = 0; v < keys.length; v++) { var k = keys[v]; result[k] = relative[k]; } result.href = result.format(); return result; } result.protocol = relative.protocol; if (!relative.host && !hostlessProtocol[relative.protocol]) { var relPath = (relative.pathname || '').split('/'); while (relPath.length && !(relative.host = relPath.shift())); if (!relative.host) relative.host = ''; if (!relative.hostname) relative.hostname = ''; if (relPath[0] !== '') relPath.unshift(''); if (relPath.length < 2) relPath.unshift(''); result.pathname = relPath.join('/'); } else { result.pathname = relative.pathname; } result.search = relative.search; result.query = relative.query; result.host = relative.host || ''; result.auth = relative.auth; result.hostname = relative.hostname || relative.host; result.port = relative.port; // to support http.request if (result.pathname || result.search) { var p = result.pathname || ''; var s = result.search || ''; result.path = p + s; } result.slashes = result.slashes || relative.slashes; result.href = result.format(); return result; } var isSourceAbs = (result.pathname && result.pathname.charAt(0) === '/'), isRelAbs = ( relative.host || relative.pathname && relative.pathname.charAt(0) === '/' ), mustEndAbs = (isRelAbs || isSourceAbs || (result.host && relative.pathname)), removeAllDots = mustEndAbs, srcPath = result.pathname && result.pathname.split('/') || [], relPath = relative.pathname && relative.pathname.split('/') || [], psychotic = result.protocol && !slashedProtocol[result.protocol]; // if the url is a non-slashed url, then relative // links like ../.. should be able // to crawl up to the hostname, as well. This is strange. // result.protocol has already been set by now. // Later on, put the first path part into the host field. if (psychotic) { result.hostname = ''; result.port = null; if (result.host) { if (srcPath[0] === '') srcPath[0] = result.host; else srcPath.unshift(result.host); } result.host = ''; if (relative.protocol) { relative.hostname = null; relative.port = null; if (relative.host) { if (relPath[0] === '') relPath[0] = relative.host; else relPath.unshift(relative.host); } relative.host = null; } mustEndAbs = mustEndAbs && (relPath[0] === '' || srcPath[0] === ''); } if (isRelAbs) { // it's absolute. result.host = (relative.host || relative.host === '') ? relative.host : result.host; result.hostname = (relative.hostname || relative.hostname === '') ? relative.hostname : result.hostname; result.search = relative.search; result.query = relative.query; srcPath = relPath; // fall through to the dot-handling below. } else if (relPath.length) { // it's relative // throw away the existing file, and take the new path instead. if (!srcPath) srcPath = []; srcPath.pop(); srcPath = srcPath.concat(relPath); result.search = relative.search; result.query = relative.query; } else if (!util.isNullOrUndefined(relative.search)) { // just pull out the search. // like href='?foo'. // Put this after the other two cases because it simplifies the booleans if (psychotic) { result.hostname = result.host = srcPath.shift(); //occationaly the auth can get stuck only in host //this especially happens in cases like //url.resolveObject('mailto:local1@domain1', 'local2@domain2') var authInHost = result.host && result.host.indexOf('@') > 0 ? result.host.split('@') : false; if (authInHost) { result.auth = authInHost.shift(); result.host = result.hostname = authInHost.shift(); } } result.search = relative.search; result.query = relative.query; //to support http.request if (!util.isNull(result.pathname) || !util.isNull(result.search)) { result.path = (result.pathname ? result.pathname : '') + (result.search ? result.search : ''); } result.href = result.format(); return result; } if (!srcPath.length) { // no path at all. easy. // we've already handled the other stuff above. result.pathname = null; //to support http.request if (result.search) { result.path = '/' + result.search; } else { result.path = null; } result.href = result.format(); return result; } // if a url ENDs in . or .., then it must get a trailing slash. // however, if it ends in anything else non-slashy, // then it must NOT get a trailing slash. var last = srcPath.slice(-1)[0]; var hasTrailingSlash = ( (result.host || relative.host || srcPath.length > 1) && (last === '.' || last === '..') || last === ''); // strip single dots, resolve double dots to parent dir // if the path tries to go above the root, `up` ends up > 0 var up = 0; for (var i = srcPath.length; i >= 0; i--) { last = srcPath[i]; if (last === '.') { srcPath.splice(i, 1); } else if (last === '..') { srcPath.splice(i, 1); up++; } else if (up) { srcPath.splice(i, 1); up--; } } // if the path is allowed to go above the root, restore leading ..s if (!mustEndAbs && !removeAllDots) { for (; up--; up) { srcPath.unshift('..'); } } if (mustEndAbs && srcPath[0] !== '' && (!srcPath[0] || srcPath[0].charAt(0) !== '/')) { srcPath.unshift(''); } if (hasTrailingSlash && (srcPath.join('/').substr(-1) !== '/')) { srcPath.push(''); } var isAbsolute = srcPath[0] === '' || (srcPath[0] && srcPath[0].charAt(0) === '/'); // put the host back if (psychotic) { result.hostname = result.host = isAbsolute ? '' : srcPath.length ? srcPath.shift() : ''; //occationaly the auth can get stuck only in host //this especially happens in cases like //url.resolveObject('mailto:local1@domain1', 'local2@domain2') var authInHost = result.host && result.host.indexOf('@') > 0 ? result.host.split('@') : false; if (authInHost) { result.auth = authInHost.shift(); result.host = result.hostname = authInHost.shift(); } } mustEndAbs = mustEndAbs || (result.host && srcPath.length); if (mustEndAbs && !isAbsolute) { srcPath.unshift(''); } if (!srcPath.length) { result.pathname = null; result.path = null; } else { result.pathname = srcPath.join('/'); } //to support request.http if (!util.isNull(result.pathname) || !util.isNull(result.search)) { result.path = (result.pathname ? result.pathname : '') + (result.search ? result.search : ''); } result.auth = relative.auth || result.auth; result.slashes = result.slashes || relative.slashes; result.href = result.format(); return result; }; Url.prototype.parseHost = function() { var host = this.host; var port = portPattern.exec(host); if (port) { port = port[0]; if (port !== ':') { this.port = port.substr(1); } host = host.substr(0, host.length - port.length); } if (host) this.hostname = host; }; },{"./util":754,"punycode":726,"querystring":729}],754:[function(require,module,exports){ 'use strict'; module.exports = { isString: function(arg) { return typeof(arg) === 'string'; }, isObject: function(arg) { return typeof(arg) === 'object' && arg !== null; }, isNull: function(arg) { return arg === null; }, isNullOrUndefined: function(arg) { return arg == null; } }; },{}],755:[function(require,module,exports){ (function (global){(function (){ /** * Module exports. */ module.exports = deprecate; /** * Mark that a method should not be used. * Returns a modified function which warns once by default. * * If `localStorage.noDeprecation = true` is set, then it is a no-op. * * If `localStorage.throwDeprecation = true` is set, then deprecated functions * will throw an Error when invoked. * * If `localStorage.traceDeprecation = true` is set, then deprecated functions * will invoke `console.trace()` instead of `console.error()`. * * @param {Function} fn - the function to deprecate * @param {String} msg - the string to print to the console when `fn` is invoked * @returns {Function} a new "deprecated" version of `fn` * @api public */ function deprecate (fn, msg) { if (config('noDeprecation')) { return fn; } var warned = false; function deprecated() { if (!warned) { if (config('throwDeprecation')) { throw new Error(msg); } else if (config('traceDeprecation')) { console.trace(msg); } else { console.warn(msg); } warned = true; } return fn.apply(this, arguments); } return deprecated; } /** * Checks `localStorage` for boolean values for the given `name`. * * @param {String} name * @returns {Boolean} * @api private */ function config (name) { // accessing global.localStorage can trigger a DOMException in sandboxed iframes try { if (!global.localStorage) return false; } catch (_) { return false; } var val = global.localStorage[name]; if (null == val) return false; return String(val).toLowerCase() === 'true'; } }).call(this)}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) },{}],756:[function(require,module,exports){ module.exports = extend var hasOwnProperty = Object.prototype.hasOwnProperty; function extend() { var target = {} for (var i = 0; i < arguments.length; i++) { var source = arguments[i] for (var key in source) { if (hasOwnProperty.call(source, key)) { target[key] = source[key] } } } return target } },{}]},{},[1]) //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJicm93c2VyL2FwcC5qcyIsImRpc3QvYXNzZXJ0LWV4aXN0cy5qcyIsImRpc3QvY29uc3RzLmpzIiwiZGlzdC9jb252YXJzLmpzIiwiZGlzdC9jcm9zc2hhaXIuanMiLCJkaXN0L2RlbW8uanMiLCJkaXN0L2VudGl0aWVzLmpzIiwiZGlzdC9lbnRpdGllcy9iYXNlZW50aXR5LmpzIiwiZGlzdC9lbnRpdGllcy9nYW1lcnVsZXMuanMiLCJkaXN0L2VudGl0aWVzL2l0ZW1kZWZzLmpzIiwiZGlzdC9lbnRpdGllcy9uZXR3b3JrYWJsZS5qcyIsImRpc3QvZW50aXRpZXMvcGxheWVyLmpzIiwiZGlzdC9lbnRpdGllcy9wcm9qZWN0aWxlLmpzIiwiZGlzdC9lbnRpdGllcy90ZWFtLmpzIiwiZGlzdC9lbnRpdGllcy93ZWFwb24uanMiLCJkaXN0L2VudGl0eWhhbmRsZS5qcyIsImRpc3QvZXZlbnR0eXBlcy5qcyIsImRpc3QvZXh0L2JpdGJ1ZmZlci5qcyIsImRpc3QvZ2FtZWV2ZW50LmpzIiwiZGlzdC9nYW1lZXZlbnRzLmpzIiwiZGlzdC9pY2VrZXkuanMiLCJkaXN0L25ldC5qcyIsImRpc3QvcHJvcHMuanMiLCJkaXN0L3Byb3RvYnVmcy9jc3RyaWtlMTVfZ2NtZXNzYWdlcy5qcyIsImRpc3QvcHJvdG9idWZzL2NzdHJpa2UxNV91c2VybWVzc2FnZXMuanMiLCJkaXN0L3Byb3RvYnVmcy9lbmdpbmVfZ2NtZXNzYWdlcy5qcyIsImRpc3QvcHJvdG9idWZzL25ldG1lc3NhZ2VzLmpzIiwiZGlzdC9zaGFyZWNvZGUuanMiLCJkaXN0L3N0cmluZ3RhYmxlcy5qcyIsImRpc3Qvc3VwcGxlbWVudHMvZ3JlbmFkZXRyYWplY3RvcnkuanMiLCJkaXN0L3N1cHBsZW1lbnRzL2l0ZW1wdXJjaGFzZS5qcyIsImRpc3Qvc3VwcGxlbWVudHMvbW9sb3RvdmRldG9uYXRlLmpzIiwiZGlzdC91c2VybWVzc2FnZXMuanMiLCJkaXN0L3VzZXJtZXNzYWdldHlwZXMuanMiLCJub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9Bc3luY0dlbmVyYXRvci5qcyIsIm5vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL0F3YWl0VmFsdWUuanMiLCJub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9hcnJheUxpa2VUb0FycmF5LmpzIiwibm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvYXJyYXlXaXRoSG9sZXMuanMiLCJub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9hcnJheVdpdGhvdXRIb2xlcy5qcyIsIm5vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2Fzc2VydFRoaXNJbml0aWFsaXplZC5qcyIsIm5vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2FzeW5jR2VuZXJhdG9yRGVsZWdhdGUuanMiLCJub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9hc3luY0l0ZXJhdG9yLmpzIiwibm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvYXN5bmNUb0dlbmVyYXRvci5qcyIsIm5vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2F3YWl0QXN5bmNHZW5lcmF0b3IuanMiLCJub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVjay5qcyIsIm5vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2NvbnN0cnVjdC5qcyIsIm5vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2NyZWF0ZUNsYXNzLmpzIiwibm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZGVmaW5lUHJvcGVydHkuanMiLCJub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9nZXQuanMiLCJub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9nZXRQcm90b3R5cGVPZi5qcyIsIm5vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2luaGVyaXRzLmpzIiwibm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0LmpzIiwibm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvaXRlcmFibGVUb0FycmF5LmpzIiwibm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvaXRlcmFibGVUb0FycmF5TGltaXQuanMiLCJub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9ub25JdGVyYWJsZVJlc3QuanMiLCJub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9ub25JdGVyYWJsZVNwcmVhZC5qcyIsIm5vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4uanMiLCJub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9zZXRQcm90b3R5cGVPZi5qcyIsIm5vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL3NsaWNlZFRvQXJyYXkuanMiLCJub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9zdXBlclByb3BCYXNlLmpzIiwibm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvdG9Db25zdW1hYmxlQXJyYXkuanMiLCJub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy90eXBlb2YuanMiLCJub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheS5qcyIsIm5vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL3dyYXBBc3luY0dlbmVyYXRvci5qcyIsIm5vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9yZWdlbmVyYXRvci9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9AcHJvdG9idWZqcy9hc3Byb21pc2UvaW5kZXguanMiLCJub2RlX21vZHVsZXMvQHByb3RvYnVmanMvYmFzZTY0L2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL0Bwcm90b2J1ZmpzL2V2ZW50ZW1pdHRlci9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9AcHJvdG9idWZqcy9mbG9hdC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9AcHJvdG9idWZqcy9pbnF1aXJlL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL0Bwcm90b2J1ZmpzL3Bvb2wvaW5kZXguanMiLCJub2RlX21vZHVsZXMvQHByb3RvYnVmanMvdXRmOC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9hc3NlcnQvYXNzZXJ0LmpzIiwibm9kZV9tb2R1bGVzL2Fzc2VydC9ub2RlX21vZHVsZXMvaW5oZXJpdHMvaW5oZXJpdHNfYnJvd3Nlci5qcyIsIm5vZGVfbW9kdWxlcy9hc3NlcnQvbm9kZV9tb2R1bGVzL3V0aWwvc3VwcG9ydC9pc0J1ZmZlckJyb3dzZXIuanMiLCJub2RlX21vZHVsZXMvYXNzZXJ0L25vZGVfbW9kdWxlcy91dGlsL3V0aWwuanMiLCJub2RlX21vZHVsZXMvYmFzZTY0LWpzL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2JpZy1pbnRlZ2VyL0JpZ0ludGVnZXIuanMiLCJub2RlX21vZHVsZXMvYml0LWJ1ZmZlci9iaXQtYnVmZmVyLmpzIiwibm9kZV9tb2R1bGVzL2Jyb3dzZXItcmVzb2x2ZS9lbXB0eS5qcyIsIm5vZGVfbW9kdWxlcy9icm93c2VyaWZ5L25vZGVfbW9kdWxlcy9idWZmZXIvaW5kZXguanMiLCJub2RlX21vZHVsZXMvYnVpbHRpbi1zdGF0dXMtY29kZXMvYnJvd3Nlci5qcyIsIm5vZGVfbW9kdWxlcy9ieXRlYnVmZmVyL2Rpc3QvYnl0ZWJ1ZmZlci5qcyIsIm5vZGVfbW9kdWxlcy9ldmVudHMvZXZlbnRzLmpzIiwibm9kZV9tb2R1bGVzL2h0dHBzLWJyb3dzZXJpZnkvaW5kZXguanMiLCJub2RlX21vZHVsZXMvaWVlZTc1NC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9pbW11dGFibGUvZGlzdC9pbW11dGFibGUuanMiLCJub2RlX21vZHVsZXMvaW5oZXJpdHMvaW5oZXJpdHNfYnJvd3Nlci5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL19fbWV0aG9kcy9hcHBlbmQuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9fX21ldGhvZHMvYXBwbHkuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9fX21ldGhvZHMvYXJyYXktcmV2ZXJzZS5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL19fbWV0aG9kcy9hc3luYy1hcHBlbmQuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9fX21ldGhvZHMvYXN5bmMtYmF0Y2guanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9fX21ldGhvZHMvYXN5bmMtYmlzZWN0LmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvX19tZXRob2RzL2FzeW5jLWJ1ZmZlci5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL19fbWV0aG9kcy9hc3luYy1jb2xsYXRlLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvX19tZXRob2RzL2FzeW5jLWNvbXByZXNzLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvX19tZXRob2RzL2FzeW5jLWNvbmNhdC5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL19fbWV0aG9kcy9hc3luYy1jb25zdW1lLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvX19tZXRob2RzL2FzeW5jLWN5Y2xlLXRpbWVzLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvX19tZXRob2RzL2FzeW5jLWN5Y2xlLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvX19tZXRob2RzL2FzeW5jLWRlZXAtZXF1YWwuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9fX21ldGhvZHMvYXN5bmMtZGlzdGluY3QuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9fX21ldGhvZHMvYXN5bmMtZHJvcC13aGlsZS5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL19fbWV0aG9kcy9hc3luYy1kcm9wLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvX19tZXRob2RzL2FzeW5jLWVudW1lcmF0ZS5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL19fbWV0aG9kcy9hc3luYy1lcXVhbC5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL19fbWV0aG9kcy9hc3luYy1ldmVyeS5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL19fbWV0aG9kcy9hc3luYy1maWx0ZXIuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9fX21ldGhvZHMvYXN5bmMtZmluZC1iZXN0LW9yLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvX19tZXRob2RzL2FzeW5jLWZpbmQtYmVzdC5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL19fbWV0aG9kcy9hc3luYy1maW5kLW9yLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvX19tZXRob2RzL2FzeW5jLWZpbmQuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9fX21ldGhvZHMvYXN5bmMtZmlyc3Qtb3IuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9fX21ldGhvZHMvYXN5bmMtZmlyc3QuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9fX21ldGhvZHMvYXN5bmMtZmxhdC1tYXAuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9fX21ldGhvZHMvYXN5bmMtZmxhdC5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL19fbWV0aG9kcy9hc3luYy1mb3ItZWFjaC5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL19fbWV0aG9kcy9hc3luYy1mb3JrLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvX19tZXRob2RzL2FzeW5jLWZvcmtlcmF0ZS5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL19fbWV0aG9kcy9hc3luYy1pbmNsdWRlcy1hbnktc2VxLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvX19tZXRob2RzL2FzeW5jLWluY2x1ZGVzLWFueS5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL19fbWV0aG9kcy9hc3luYy1pbmNsdWRlcy1zZXEuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9fX21ldGhvZHMvYXN5bmMtaW5jbHVkZXMuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9fX21ldGhvZHMvYXN5bmMtaW50ZXJsZWF2ZS1yZWFkeS5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL19fbWV0aG9kcy9hc3luYy1pbnRlcmxlYXZlLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvX19tZXRob2RzL2FzeW5jLWludGVycG9zZS1zZXEuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9fX21ldGhvZHMvYXN5bmMtaW50ZXJwb3NlLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvX19tZXRob2RzL2FzeW5jLWlzLWVtcHR5LmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvX19tZXRob2RzL2FzeW5jLWlzLXNvcnRlZC5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL19fbWV0aG9kcy9hc3luYy1qb2luLXdpdGgtc2VxLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvX19tZXRob2RzL2FzeW5jLWpvaW4td2l0aC5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL19fbWV0aG9kcy9hc3luYy1qb2luLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvX19tZXRob2RzL2FzeW5jLW1hcC5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL19fbWV0aG9kcy9hc3luYy1wZWVrZXJhdGUuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9fX21ldGhvZHMvYXN5bmMtcHJlcGVuZC5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL19fbWV0aG9kcy9hc3luYy1yZWR1Y2UuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9fX21ldGhvZHMvYXN5bmMtcmV2ZXJzZS5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL19fbWV0aG9kcy9hc3luYy1yb3VuZC1yb2Jpbi5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL19fbWV0aG9kcy9hc3luYy1zaXplLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvX19tZXRob2RzL2FzeW5jLXNsaWNlLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvX19tZXRob2RzL2FzeW5jLXNvbWUuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9fX21ldGhvZHMvYXN5bmMtc3BsaXQtZ3JvdXBzLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvX19tZXRob2RzL2FzeW5jLXNwbGl0LW9uLWFueS1zZXEuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9fX21ldGhvZHMvYXN5bmMtc3BsaXQtb24tYW55LmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvX19tZXRob2RzL2FzeW5jLXNwbGl0LW9uLXNlcS5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL19fbWV0aG9kcy9hc3luYy1zcGxpdC1vbi5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL19fbWV0aG9kcy9hc3luYy1zcGxpdC13aGVuLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvX19tZXRob2RzL2FzeW5jLXNwbGl0LmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvX19tZXRob2RzL2FzeW5jLXNwbGl0ZXJhdGUtZ3JvdXBlZC5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL19fbWV0aG9kcy9hc3luYy1zcGxpdGVyYXRlLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvX19tZXRob2RzL2FzeW5jLXN0YXJ0cy13aXRoLWFueS1zZXEuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9fX21ldGhvZHMvYXN5bmMtc3RhcnRzLXdpdGgtYW55LmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvX19tZXRob2RzL2FzeW5jLXN0YXJ0cy13aXRoLXNlcS5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL19fbWV0aG9kcy9hc3luYy1zdGFydHMtd2l0aC5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL19fbWV0aG9kcy9hc3luYy1zdHIuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9fX21ldGhvZHMvYXN5bmMtdGFrZS1sYXN0LW9yLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvX19tZXRob2RzL2FzeW5jLXRha2UtbGFzdC5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL19fbWV0aG9kcy9hc3luYy10YWtlLXNvcnRlZC5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL19fbWV0aG9kcy9hc3luYy10YWtlLXdoaWxlLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvX19tZXRob2RzL2FzeW5jLXRha2UuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9fX21ldGhvZHMvYXN5bmMtdGFwLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvX19tZXRob2RzL2FzeW5jLXRocm90dGxlLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvX19tZXRob2RzL2FzeW5jLXRvLWFycmF5LmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvX19tZXRob2RzL2FzeW5jLXRvLW9iamVjdC5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL19fbWV0aG9kcy9hc3luYy13aW5kb3ctYWhlYWQuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9fX21ldGhvZHMvYXN5bmMtd2luZG93LWJlaGluZC5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL19fbWV0aG9kcy9hc3luYy13aW5kb3cuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9fX21ldGhvZHMvYXN5bmMtemlwLWFsbC5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL19fbWV0aG9kcy9hc3luYy16aXAuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9fX21ldGhvZHMvYmF0Y2guanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9fX21ldGhvZHMvYmlzZWN0LmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvX19tZXRob2RzL2NhbGwuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9fX21ldGhvZHMvY29sbGF0ZS5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL19fbWV0aG9kcy9jb21wcmVzcy5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL19fbWV0aG9kcy9jb25jYXQuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9fX21ldGhvZHMvY29uc3VtZS5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL19fbWV0aG9kcy9jeWNsZS10aW1lcy5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL19fbWV0aG9kcy9jeWNsZS5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL19fbWV0aG9kcy9kZWVwLWVxdWFsLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvX19tZXRob2RzL2Rpc3RpbmN0LmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvX19tZXRob2RzL2Ryb3Atd2hpbGUuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9fX21ldGhvZHMvZHJvcC5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL19fbWV0aG9kcy9lbnVtZXJhdGUuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9fX21ldGhvZHMvZXF1YWwuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9fX21ldGhvZHMvZXZlcnkuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9fX21ldGhvZHMvZmlsdGVyLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvX19tZXRob2RzL2ZpbmQtYmVzdC1vci5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL19fbWV0aG9kcy9maW5kLWJlc3QuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9fX21ldGhvZHMvZmluZC1vci5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL19fbWV0aG9kcy9maW5kLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvX19tZXRob2RzL2ZpcnN0LW9yLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvX19tZXRob2RzL2ZpcnN0LmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvX19tZXRob2RzL2ZsYXQtbWFwLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvX19tZXRob2RzL2ZsYXQuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9fX21ldGhvZHMvZm9yLWVhY2guanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9fX21ldGhvZHMvZm9yay5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL19fbWV0aG9kcy9mb3JrZXJhdGUuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9fX21ldGhvZHMvaW5jbHVkZXMtYW55LXNlcS5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL19fbWV0aG9kcy9pbmNsdWRlcy1hbnkuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9fX21ldGhvZHMvaW5jbHVkZXMtc2VxLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvX19tZXRob2RzL2luY2x1ZGVzLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvX19tZXRob2RzL2ludGVybGVhdmUuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9fX21ldGhvZHMvaW50ZXJwb3NlLXNlcS5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL19fbWV0aG9kcy9pbnRlcnBvc2UuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9fX21ldGhvZHMvaXMtZW1wdHkuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9fX21ldGhvZHMvaXMtc29ydGVkLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvX19tZXRob2RzL2pvaW4td2l0aC1zZXEuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9fX21ldGhvZHMvam9pbi13aXRoLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvX19tZXRob2RzL2pvaW4uanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9fX21ldGhvZHMvbWFwLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvX19tZXRob2RzL29iamVjdC1lbnRyaWVzLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvX19tZXRob2RzL29iamVjdC1rZXlzLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvX19tZXRob2RzL29iamVjdC12YWx1ZXMuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9fX21ldGhvZHMvcGVla2VyYXRlLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvX19tZXRob2RzL3ByZXBlbmQuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9fX21ldGhvZHMvcmFuZ2UuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9fX21ldGhvZHMvcmVkdWNlLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvX19tZXRob2RzL3JlcGVhdC10aW1lcy5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL19fbWV0aG9kcy9yZXBlYXQuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9fX21ldGhvZHMvcmV2ZXJzZS5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL19fbWV0aG9kcy9yb3VuZC1yb2Jpbi5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL19fbWV0aG9kcy9zaXplLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvX19tZXRob2RzL3NsaWNlLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvX19tZXRob2RzL3NvbWUuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9fX21ldGhvZHMvc3BsaXQtZ3JvdXBzLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvX19tZXRob2RzL3NwbGl0LW9uLWFueS1zZXEuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9fX21ldGhvZHMvc3BsaXQtb24tYW55LmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvX19tZXRob2RzL3NwbGl0LW9uLXNlcS5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL19fbWV0aG9kcy9zcGxpdC1vbi5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL19fbWV0aG9kcy9zcGxpdC13aGVuLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvX19tZXRob2RzL3NwbGl0LmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvX19tZXRob2RzL3NwbGl0ZXJhdGUtZ3JvdXBlZC5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL19fbWV0aG9kcy9zcGxpdGVyYXRlLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvX19tZXRob2RzL3N0YXJ0cy13aXRoLWFueS1zZXEuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9fX21ldGhvZHMvc3RhcnRzLXdpdGgtYW55LmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvX19tZXRob2RzL3N0YXJ0cy13aXRoLXNlcS5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL19fbWV0aG9kcy9zdGFydHMtd2l0aC5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL19fbWV0aG9kcy9zdHIuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9fX21ldGhvZHMvdGFrZS1sYXN0LW9yLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvX19tZXRob2RzL3Rha2UtbGFzdC5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL19fbWV0aG9kcy90YWtlLXNvcnRlZC5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL19fbWV0aG9kcy90YWtlLXdoaWxlLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvX19tZXRob2RzL3Rha2UuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9fX21ldGhvZHMvdGFwLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvX19tZXRob2RzL3RvLWFycmF5LmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvX19tZXRob2RzL3RvLW9iamVjdC5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL19fbWV0aG9kcy93aW5kb3ctYWhlYWQuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9fX21ldGhvZHMvd2luZG93LWJlaGluZC5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL19fbWV0aG9kcy93aW5kb3cuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9fX21ldGhvZHMvd3JhcC1lbnRyaWVzLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvX19tZXRob2RzL3dyYXAta2V5cy5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL19fbWV0aG9kcy93cmFwLXZhbHVlcy5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL19fbWV0aG9kcy96aXAtYWxsLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvX19tZXRob2RzL3ppcC5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL2ltcGxzLyRhcHBlbmQvYXBwZW5kLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvaW1wbHMvJGFwcGVuZC9hc3luYy1hcHBlbmQuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9pbXBscy8kYmF0Y2gvYXN5bmMtYmF0Y2guanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9pbXBscy8kYmF0Y2gvYmF0Y2guanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9pbXBscy8kYmlzZWN0L2FzeW5jLWJpc2VjdC5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL2ltcGxzLyRiaXNlY3QvYmlzZWN0LmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvaW1wbHMvJGNvbGxhdGUvYXN5bmMtY29sbGF0ZS5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL2ltcGxzLyRjb2xsYXRlL2NvbGxhdGUuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9pbXBscy8kY29tcHJlc3MvYXN5bmMtY29tcHJlc3MuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9pbXBscy8kY29tcHJlc3MvY29tcHJlc3MuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9pbXBscy8kY29uY2F0L2FzeW5jLWNvbmNhdC5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL2ltcGxzLyRjb25jYXQvY29uY2F0LmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvaW1wbHMvJGNvbnN1bWUvYXN5bmMtY29uc3VtZS5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL2ltcGxzLyRjb25zdW1lL2NvbnN1bWUuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9pbXBscy8kY3ljbGUtdGltZXMvYXN5bmMtY3ljbGUtdGltZXMuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9pbXBscy8kY3ljbGUtdGltZXMvY3ljbGUtdGltZXMuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9pbXBscy8kY3ljbGUvYXN5bmMtY3ljbGUuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9pbXBscy8kY3ljbGUvY3ljbGUuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9pbXBscy8kZGVlcC1lcXVhbC9hc3luYy1kZWVwLWVxdWFsLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvaW1wbHMvJGRlZXAtZXF1YWwvZGVlcC1lcXVhbC5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL2ltcGxzLyRkaXN0aW5jdC9hc3luYy1kaXN0aW5jdC5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL2ltcGxzLyRkaXN0aW5jdC9kaXN0aW5jdC5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL2ltcGxzLyRkcm9wLXdoaWxlL2FzeW5jLWRyb3Atd2hpbGUuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9pbXBscy8kZHJvcC13aGlsZS9kcm9wLXdoaWxlLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvaW1wbHMvJGRyb3AvYXN5bmMtZHJvcC5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL2ltcGxzLyRkcm9wL2Ryb3AuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9pbXBscy8kZW51bWVyYXRlL2FzeW5jLWVudW1lcmF0ZS5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL2ltcGxzLyRlbnVtZXJhdGUvZW51bWVyYXRlLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvaW1wbHMvJGVxdWFsL2FzeW5jLWVxdWFsLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvaW1wbHMvJGVxdWFsL2VxdWFsLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvaW1wbHMvJGV2ZXJ5L2FzeW5jLWV2ZXJ5LmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvaW1wbHMvJGV2ZXJ5L2V2ZXJ5LmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvaW1wbHMvJGZpbHRlci9hc3luYy1maWx0ZXIuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9pbXBscy8kZmlsdGVyL2ZpbHRlci5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL2ltcGxzLyRmaW5kLWJlc3Qtb3IvYXN5bmMtZmluZC1iZXN0LW9yLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvaW1wbHMvJGZpbmQtYmVzdC1vci9maW5kLWJlc3Qtb3IuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9pbXBscy8kZmluZC1iZXN0L2FzeW5jLWZpbmQtYmVzdC5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL2ltcGxzLyRmaW5kLWJlc3QvZmluZC1iZXN0LmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvaW1wbHMvJGZpbmQtb3IvYXN5bmMtZmluZC1vci5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL2ltcGxzLyRmaW5kLW9yL2ZpbmQtb3IuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9pbXBscy8kZmluZC9hc3luYy1maW5kLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvaW1wbHMvJGZpbmQvZmluZC5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL2ltcGxzLyRmaXJzdC1vci9hc3luYy1maXJzdC1vci5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL2ltcGxzLyRmaXJzdC1vci9maXJzdC1vci5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL2ltcGxzLyRmaXJzdC9hc3luYy1maXJzdC5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL2ltcGxzLyRmaXJzdC9maXJzdC5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL2ltcGxzLyRmbGF0LW1hcC9hc3luYy1mbGF0LW1hcC5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL2ltcGxzLyRmbGF0LW1hcC9mbGF0LW1hcC5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL2ltcGxzLyRmbGF0L2FzeW5jLWZsYXQuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9pbXBscy8kZmxhdC9mbGF0LmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvaW1wbHMvJGZsYXQvaW50ZXJuYWwvdmFsaWRhdGUtYXJncy5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL2ltcGxzLyRmb3ItZWFjaC9hc3luYy1mb3ItZWFjaC5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL2ltcGxzLyRmb3ItZWFjaC9mb3ItZWFjaC5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL2ltcGxzLyRmb3JrL2FzeW5jLWZvcmsuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9pbXBscy8kZm9yay9mb3JrLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvaW1wbHMvJGZvcmtlcmF0ZS9hc3luYy1mb3JrZXJhdGUuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9pbXBscy8kZm9ya2VyYXRlL2ZvcmtlcmF0ZS5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL2ltcGxzLyRpbmNsdWRlcy1hbnktc2VxL2FzeW5jLWluY2x1ZGVzLWFueS1zZXEuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9pbXBscy8kaW5jbHVkZXMtYW55LXNlcS9pbmNsdWRlcy1hbnktc2VxLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvaW1wbHMvJGluY2x1ZGVzLWFueS9hc3luYy1pbmNsdWRlcy1hbnkuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9pbXBscy8kaW5jbHVkZXMtYW55L2luY2x1ZGVzLWFueS5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL2ltcGxzLyRpbmNsdWRlcy1zZXEvYXN5bmMtaW5jbHVkZXMtc2VxLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvaW1wbHMvJGluY2x1ZGVzLXNlcS9pbmNsdWRlcy1zZXEuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9pbXBscy8kaW5jbHVkZXMvYXN5bmMtaW5jbHVkZXMuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9pbXBscy8kaW5jbHVkZXMvaW5jbHVkZXMuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9pbXBscy8kaW50ZXJsZWF2ZS9hc3luYy1pbnRlcmxlYXZlLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvaW1wbHMvJGludGVybGVhdmUvaW50ZXJsZWF2ZS5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL2ltcGxzLyRpbnRlcnBvc2Utc2VxL2FzeW5jLWludGVycG9zZS1zZXEuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9pbXBscy8kaW50ZXJwb3NlLXNlcS9pbnRlcnBvc2Utc2VxLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvaW1wbHMvJGludGVycG9zZS9hc3luYy1pbnRlcnBvc2UuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9pbXBscy8kaW50ZXJwb3NlL2ludGVycG9zZS5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL2ltcGxzLyRpcy1lbXB0eS9hc3luYy1pcy1lbXB0eS5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL2ltcGxzLyRpcy1lbXB0eS9pcy1lbXB0eS5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL2ltcGxzLyRpcy1zb3J0ZWQvYXN5bmMtaXMtc29ydGVkLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvaW1wbHMvJGlzLXNvcnRlZC9pcy1zb3J0ZWQuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9pbXBscy8kam9pbi13aXRoLXNlcS9hc3luYy1qb2luLXdpdGgtc2VxLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvaW1wbHMvJGpvaW4td2l0aC1zZXEvam9pbi13aXRoLXNlcS5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL2ltcGxzLyRqb2luLXdpdGgvYXN5bmMtam9pbi13aXRoLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvaW1wbHMvJGpvaW4td2l0aC9qb2luLXdpdGguanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9pbXBscy8kam9pbi9hc3luYy1qb2luLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvaW1wbHMvJGpvaW4vam9pbi5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL2ltcGxzLyRtYXAvYXN5bmMtbWFwLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvaW1wbHMvJG1hcC9tYXAuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9pbXBscy8kcGVla2VyYXRlL2FzeW5jLXBlZWtlcmF0ZS5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL2ltcGxzLyRwZWVrZXJhdGUvcGVla2VyYXRlLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvaW1wbHMvJHByZXBlbmQvYXN5bmMtcHJlcGVuZC5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL2ltcGxzLyRwcmVwZW5kL3ByZXBlbmQuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9pbXBscy8kcmVkdWNlL2FzeW5jLXJlZHVjZS5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL2ltcGxzLyRyZWR1Y2UvcmVkdWNlLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvaW1wbHMvJHJldmVyc2UvYXN5bmMtcmV2ZXJzZS5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL2ltcGxzLyRyZXZlcnNlL3JldmVyc2UuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9pbXBscy8kcm91bmQtcm9iaW4vYXN5bmMtcm91bmQtcm9iaW4uanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9pbXBscy8kcm91bmQtcm9iaW4vaW50ZXJuYWwvdmFsaWRhdGUtYXJncy5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL2ltcGxzLyRyb3VuZC1yb2Jpbi9yb3VuZC1yb2Jpbi5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL2ltcGxzLyRzaXplL2FzeW5jLXNpemUuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9pbXBscy8kc2l6ZS9zaXplLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvaW1wbHMvJHNsaWNlL2FzeW5jLXNsaWNlLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvaW1wbHMvJHNsaWNlL2ludGVybmFsL3ZhbGlkYXRlLWFyZ3MuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9pbXBscy8kc2xpY2Uvc2xpY2UuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9pbXBscy8kc29tZS9hc3luYy1zb21lLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvaW1wbHMvJHNvbWUvc29tZS5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL2ltcGxzLyRzcGxpdC1ncm91cHMvYXN5bmMtc3BsaXQtZ3JvdXBzLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvaW1wbHMvJHNwbGl0LWdyb3Vwcy9zcGxpdC1ncm91cHMuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9pbXBscy8kc3BsaXQtb24tYW55LXNlcS9hc3luYy1zcGxpdC1vbi1hbnktc2VxLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvaW1wbHMvJHNwbGl0LW9uLWFueS1zZXEvc3BsaXQtb24tYW55LXNlcS5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL2ltcGxzLyRzcGxpdC1vbi1hbnkvYXN5bmMtc3BsaXQtb24tYW55LmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvaW1wbHMvJHNwbGl0LW9uLWFueS9zcGxpdC1vbi1hbnkuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9pbXBscy8kc3BsaXQtb24tc2VxL2FzeW5jLXNwbGl0LW9uLXNlcS5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL2ltcGxzLyRzcGxpdC1vbi1zZXEvc3BsaXQtb24tc2VxLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvaW1wbHMvJHNwbGl0LW9uL2FzeW5jLXNwbGl0LW9uLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvaW1wbHMvJHNwbGl0LW9uL3NwbGl0LW9uLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvaW1wbHMvJHNwbGl0LXdoZW4vYXN5bmMtc3BsaXQtd2hlbi5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL2ltcGxzLyRzcGxpdC13aGVuL3NwbGl0LXdoZW4uanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9pbXBscy8kc3BsaXQvYXN5bmMtc3BsaXQuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9pbXBscy8kc3BsaXQvc3BsaXQuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9pbXBscy8kc3BsaXRlcmF0ZS1ncm91cGVkL2FzeW5jLXNwbGl0ZXJhdGUtZ3JvdXBlZC5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL2ltcGxzLyRzcGxpdGVyYXRlLWdyb3VwZWQvc3BsaXRlcmF0ZS1ncm91cGVkLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvaW1wbHMvJHNwbGl0ZXJhdGUvYXN5bmMtc3BsaXRlcmF0ZS5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL2ltcGxzLyRzcGxpdGVyYXRlL3NwbGl0ZXJhdGUuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9pbXBscy8kc3RhcnRzLXdpdGgtYW55LXNlcS9hc3luYy1zdGFydHMtd2l0aC1hbnktc2VxLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvaW1wbHMvJHN0YXJ0cy13aXRoLWFueS1zZXEvc3RhcnRzLXdpdGgtYW55LXNlcS5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL2ltcGxzLyRzdGFydHMtd2l0aC1hbnkvYXN5bmMtc3RhcnRzLXdpdGgtYW55LmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvaW1wbHMvJHN0YXJ0cy13aXRoLWFueS9zdGFydHMtd2l0aC1hbnkuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9pbXBscy8kc3RhcnRzLXdpdGgtc2VxL2FzeW5jLXN0YXJ0cy13aXRoLXNlcS5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL2ltcGxzLyRzdGFydHMtd2l0aC1zZXEvc3RhcnRzLXdpdGgtc2VxLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvaW1wbHMvJHN0YXJ0cy13aXRoL2FzeW5jLXN0YXJ0cy13aXRoLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvaW1wbHMvJHN0YXJ0cy13aXRoL3N0YXJ0cy13aXRoLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvaW1wbHMvJHN0ci9hc3luYy1zdHIuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9pbXBscy8kc3RyL3N0ci5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL2ltcGxzLyR0YWtlLWxhc3Qtb3IvYXN5bmMtdGFrZS1sYXN0LW9yLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvaW1wbHMvJHRha2UtbGFzdC1vci90YWtlLWxhc3Qtb3IuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9pbXBscy8kdGFrZS1sYXN0L2FzeW5jLXRha2UtbGFzdC5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL2ltcGxzLyR0YWtlLWxhc3QvdGFrZS1sYXN0LmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvaW1wbHMvJHRha2Utc29ydGVkL2FzeW5jLXRha2Utc29ydGVkLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvaW1wbHMvJHRha2Utc29ydGVkL2ludGVybmFsL2hlYXAuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9pbXBscy8kdGFrZS1zb3J0ZWQvdGFrZS1zb3J0ZWQuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9pbXBscy8kdGFrZS13aGlsZS9hc3luYy10YWtlLXdoaWxlLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvaW1wbHMvJHRha2Utd2hpbGUvdGFrZS13aGlsZS5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL2ltcGxzLyR0YWtlL2FzeW5jLXRha2UuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9pbXBscy8kdGFrZS90YWtlLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvaW1wbHMvJHRhcC9hc3luYy10YXAuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9pbXBscy8kdGFwL3RhcC5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL2ltcGxzLyR0by1hcnJheS9hc3luYy10by1hcnJheS5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL2ltcGxzLyR0by1hcnJheS90by1hcnJheS5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL2ltcGxzLyR0by1vYmplY3QvYXN5bmMtdG8tb2JqZWN0LmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvaW1wbHMvJHRvLW9iamVjdC90by1vYmplY3QuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9pbXBscy8kd2luZG93LWFoZWFkL2FzeW5jLXdpbmRvdy1haGVhZC5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL2ltcGxzLyR3aW5kb3ctYWhlYWQvd2luZG93LWFoZWFkLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvaW1wbHMvJHdpbmRvdy1iZWhpbmQvYXN5bmMtd2luZG93LWJlaGluZC5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL2ltcGxzLyR3aW5kb3ctYmVoaW5kL3dpbmRvdy1iZWhpbmQuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9pbXBscy8kd2luZG93L2FzeW5jLXdpbmRvdy5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL2ltcGxzLyR3aW5kb3cvd2luZG93LmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvaW1wbHMvJHdyYXAvYXN5bmMtd3JhcC5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL2ltcGxzLyR3cmFwL3dyYXAuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9pbXBscy8kemlwLWFsbC9hc3luYy16aXAtYWxsLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvaW1wbHMvJHppcC1hbGwvemlwLWFsbC5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL2ltcGxzLyR6aXAvYXN5bmMtemlwLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvaW1wbHMvJHppcC96aXAuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9pbXBscy9hcHBseS9hcHBseS5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL2ltcGxzL2FycmF5LWZpcnN0LW9yL2FycmF5LWZpcnN0LW9yLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvaW1wbHMvYXJyYXktZmlyc3QvYXJyYXktZmlyc3QuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9pbXBscy9hcnJheS1mcm9tLWFzeW5jL2FycmF5LWZyb20tYXN5bmMuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9pbXBscy9hcnJheS1mcm9tL2FycmF5LWZyb20uanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9pbXBscy9hcnJheS1sYXN0LW9yL2FycmF5LWxhc3Qtb3IuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9pbXBscy9hcnJheS1sYXN0L2FycmF5LWxhc3QuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9pbXBscy9hcnJheS1yZXZlcnNlL2FycmF5LXJldmVyc2UuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9pbXBscy9hc3luYy1idWZmZXIvYXN5bmMtYnVmZmVyLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvaW1wbHMvYXN5bmMtaW50ZXJsZWF2ZS1yZWFkeS9hc3luYy1pbnRlcmxlYXZlLXJlYWR5LmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvaW1wbHMvYXN5bmMtaW50ZXJsZWF2ZS1yZWFkeS9pbnRlcm5hbC9yYWNlLXRvLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvaW1wbHMvYXN5bmMtdGhyb3R0bGUvYXN5bmMtdGhyb3R0bGUuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9pbXBscy9jYWxsL2NhbGwuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9pbXBscy9jb21wb3NlL2NvbXBvc2UuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9pbXBscy9leGVjLXBpcGUvZXhlYy1waXBlLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvaW1wbHMvZmlyc3QtaGlnaGVzdC9maXJzdC1oaWdoZXN0LmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvaW1wbHMvZmlyc3QtbG93ZXN0L2ZpcnN0LWxvd2VzdC5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL2ltcGxzL2dldC1zaXplL2dldC1zaXplLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvaW1wbHMvaXMtYXJyYXkvaXMtYXJyYXkuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9pbXBscy9pcy1hc3luYy1pdGVyYWJsZS9pcy1hc3luYy1pdGVyYWJsZS5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL2ltcGxzL2lzLWFzeW5jLWxvb3BhYmxlL2lzLWFzeW5jLWxvb3BhYmxlLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvaW1wbHMvaXMtYXN5bmMtd3JhcHBhYmxlL2lzLWFzeW5jLXdyYXBwYWJsZS5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL2ltcGxzL2lzLWl0ZXJhYmxlL2lzLWl0ZXJhYmxlLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvaW1wbHMvaXMtbG9vcGFibGUvaXMtbG9vcGFibGUuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9pbXBscy9pcy1uaWwvaXMtbmlsLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvaW1wbHMvaXMtbnVsbC9pcy1udWxsLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvaW1wbHMvaXMtb2JqZWN0L2lzLW9iamVjdC5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL2ltcGxzL2lzLXN0cmluZy9pcy1zdHJpbmcuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9pbXBscy9pcy11bmRlZmluZWQvaXMtdW5kZWZpbmVkLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvaW1wbHMvaXMtd3JhcHBhYmxlL2lzLXdyYXBwYWJsZS5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL2ltcGxzL2xhc3QtaGlnaGVzdC9sYXN0LWhpZ2hlc3QuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9pbXBscy9sYXN0LWxvd2VzdC9sYXN0LWxvd2VzdC5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL2ltcGxzL25vdC1hcnJheS9ub3QtYXJyYXkuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9pbXBscy9ub3QtYXN5bmMtaXRlcmFibGUvbm90LWFzeW5jLWl0ZXJhYmxlLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvaW1wbHMvbm90LWFzeW5jLWxvb3BhYmxlL25vdC1hc3luYy1sb29wYWJsZS5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL2ltcGxzL25vdC1hc3luYy13cmFwcGFibGUvbm90LWFzeW5jLXdyYXBwYWJsZS5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL2ltcGxzL25vdC1pdGVyYWJsZS9ub3QtaXRlcmFibGUuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9pbXBscy9ub3QtbG9vcGFibGUvbm90LWxvb3BhYmxlLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvaW1wbHMvbm90LW5pbC9ub3QtbmlsLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvaW1wbHMvbm90LW51bGwvbm90LW51bGwuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9pbXBscy9ub3Qtb2JqZWN0L25vdC1vYmplY3QuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9pbXBscy9ub3Qtc3RyaW5nL25vdC1zdHJpbmcuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9pbXBscy9ub3QtdW5kZWZpbmVkL25vdC11bmRlZmluZWQuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9pbXBscy9ub3Qtd3JhcHBhYmxlL25vdC13cmFwcGFibGUuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9pbXBscy9vYmplY3QtZW50cmllcy9vYmplY3QtZW50cmllcy5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL2ltcGxzL29iamVjdC1mcm9tLWFzeW5jL29iamVjdC1mcm9tLWFzeW5jLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvaW1wbHMvb2JqZWN0LWZyb20vb2JqZWN0LWZyb20uanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9pbXBscy9vYmplY3Qta2V5cy9vYmplY3Qta2V5cy5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL2ltcGxzL29iamVjdC12YWx1ZXMvb2JqZWN0LXZhbHVlcy5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL2ltcGxzL3BpcGUvcGlwZS5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL2ltcGxzL3JhbmdlL3JhbmdlLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvaW1wbHMvcmVwZWF0LXRpbWVzL3JlcGVhdC10aW1lcy5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL2ltcGxzL3JlcGVhdC9yZXBlYXQuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9pbXBscy9zdHJpbmctZnJvbS1hc3luYy9zdHJpbmctZnJvbS1hc3luYy5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL2ltcGxzL3N0cmluZy1mcm9tL3N0cmluZy1mcm9tLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvaW1wbHMvd2hlbi93aGVuLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvaW1wbHMvd3JhcC1lbnRyaWVzL3dyYXAtZW50cmllcy5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL2ltcGxzL3dyYXAta2V5cy93cmFwLWtleXMuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9pbXBscy93cmFwLXZhbHVlcy93cmFwLXZhbHVlcy5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvaW50ZXJuYWwvYW55LXNlcS5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL2ludGVybmFsL2FzeW5jLWFueS1zZXEuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9pbnRlcm5hbC9hc3luYy1iaXNlY3Rvci5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL2ludGVybmFsL2FzeW5jLWZvcmsuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9pbnRlcm5hbC9hc3luYy1ncm91cHMtaXRlcmF0b3IuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9pbnRlcm5hbC9hc3luYy1pdGVyYWJsZS1pdGVyYXRvci5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL2ludGVybmFsL2FzeW5jLWl0ZXJhYmxlLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvaW50ZXJuYWwvYXN5bmMtcGFyYWxsZWwtZWFjaC5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL2ludGVybmFsL2FzeW5jLXBhcnRzLWl0ZXJhdG9yLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvaW50ZXJuYWwvYXN5bmMtcGVla2VyYXRvci5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL2ludGVybmFsL2FzeW5jLXdyYXAuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9pbnRlcm5hbC9iaXNlY3Rvci5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL2ludGVybmFsL2NpcmN1bGFyLWJ1ZmZlci5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL2ludGVybmFsL2NvbXBhcmUuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9pbnRlcm5hbC9jdXJyeS5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL2ludGVybmFsL2RlbGF5LmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvaW50ZXJuYWwvZm9yay5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL2ludGVybmFsL2dyb3Vwcy1pdGVyYXRvci5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL2ludGVybmFsL2l0ZXJhYmxlLWl0ZXJhdG9yLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvaW50ZXJuYWwvaXRlcmFibGUuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9pbnRlcm5hbC9udW1iZXIuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9pbnRlcm5hbC9wYXJhbGxlbC1lYWNoLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvaW50ZXJuYWwvcGFydHMtaXRlcmF0b3IuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9pbnRlcm5hbC9wZWVrZXJhdG9yLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvaW50ZXJuYWwvc3ltYm9scy5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL2ludGVybmFsL3dyYXAuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9tZXRob2RzL2FwcGVuZC5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL21ldGhvZHMvYXBwbHkuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9tZXRob2RzL2FycmF5LWZpcnN0LW9yLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvbWV0aG9kcy9hcnJheS1maXJzdC5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL21ldGhvZHMvYXJyYXktZnJvbS1hc3luYy5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL21ldGhvZHMvYXJyYXktZnJvbS5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL21ldGhvZHMvYXJyYXktbGFzdC1vci5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL21ldGhvZHMvYXJyYXktbGFzdC5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL21ldGhvZHMvYXJyYXktcmV2ZXJzZS5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL21ldGhvZHMvYXN5bmMtYXBwZW5kLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvbWV0aG9kcy9hc3luYy1iYXRjaC5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL21ldGhvZHMvYXN5bmMtYmlzZWN0LmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvbWV0aG9kcy9hc3luYy1idWZmZXIuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9tZXRob2RzL2FzeW5jLWNvbGxhdGUuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9tZXRob2RzL2FzeW5jLWNvbXByZXNzLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvbWV0aG9kcy9hc3luYy1jb25jYXQuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9tZXRob2RzL2FzeW5jLWNvbnN1bWUuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9tZXRob2RzL2FzeW5jLWN5Y2xlLXRpbWVzLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvbWV0aG9kcy9hc3luYy1jeWNsZS5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL21ldGhvZHMvYXN5bmMtZGVlcC1lcXVhbC5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL21ldGhvZHMvYXN5bmMtZGlzdGluY3QuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9tZXRob2RzL2FzeW5jLWRyb3Atd2hpbGUuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9tZXRob2RzL2FzeW5jLWRyb3AuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9tZXRob2RzL2FzeW5jLWVudW1lcmF0ZS5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL21ldGhvZHMvYXN5bmMtZXF1YWwuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9tZXRob2RzL2FzeW5jLWV2ZXJ5LmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvbWV0aG9kcy9hc3luYy1maWx0ZXIuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9tZXRob2RzL2FzeW5jLWZpbmQtYmVzdC1vci5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL21ldGhvZHMvYXN5bmMtZmluZC1iZXN0LmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvbWV0aG9kcy9hc3luYy1maW5kLW9yLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvbWV0aG9kcy9hc3luYy1maW5kLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvbWV0aG9kcy9hc3luYy1maXJzdC1vci5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL21ldGhvZHMvYXN5bmMtZmlyc3QuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9tZXRob2RzL2FzeW5jLWZsYXQtbWFwLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvbWV0aG9kcy9hc3luYy1mbGF0LmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvbWV0aG9kcy9hc3luYy1mb3ItZWFjaC5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL21ldGhvZHMvYXN5bmMtZm9yay5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL21ldGhvZHMvYXN5bmMtZm9ya2VyYXRlLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvbWV0aG9kcy9hc3luYy1pbmNsdWRlcy1hbnktc2VxLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvbWV0aG9kcy9hc3luYy1pbmNsdWRlcy1hbnkuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9tZXRob2RzL2FzeW5jLWluY2x1ZGVzLXNlcS5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL21ldGhvZHMvYXN5bmMtaW5jbHVkZXMuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9tZXRob2RzL2FzeW5jLWludGVybGVhdmUtcmVhZHkuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9tZXRob2RzL2FzeW5jLWludGVybGVhdmUuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9tZXRob2RzL2FzeW5jLWludGVycG9zZS1zZXEuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9tZXRob2RzL2FzeW5jLWludGVycG9zZS5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL21ldGhvZHMvYXN5bmMtaXMtZW1wdHkuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9tZXRob2RzL2FzeW5jLWlzLXNvcnRlZC5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL21ldGhvZHMvYXN5bmMtam9pbi13aXRoLXNlcS5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL21ldGhvZHMvYXN5bmMtam9pbi13aXRoLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvbWV0aG9kcy9hc3luYy1qb2luLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvbWV0aG9kcy9hc3luYy1tYXAuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9tZXRob2RzL2FzeW5jLXBlZWtlcmF0ZS5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL21ldGhvZHMvYXN5bmMtcHJlcGVuZC5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL21ldGhvZHMvYXN5bmMtcmVkdWNlLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvbWV0aG9kcy9hc3luYy1yZXZlcnNlLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvbWV0aG9kcy9hc3luYy1yb3VuZC1yb2Jpbi5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL21ldGhvZHMvYXN5bmMtc2l6ZS5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL21ldGhvZHMvYXN5bmMtc2xpY2UuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9tZXRob2RzL2FzeW5jLXNvbWUuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9tZXRob2RzL2FzeW5jLXNwbGl0LWdyb3Vwcy5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL21ldGhvZHMvYXN5bmMtc3BsaXQtb24tYW55LXNlcS5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL21ldGhvZHMvYXN5bmMtc3BsaXQtb24tYW55LmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvbWV0aG9kcy9hc3luYy1zcGxpdC1vbi1zZXEuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9tZXRob2RzL2FzeW5jLXNwbGl0LW9uLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvbWV0aG9kcy9hc3luYy1zcGxpdC13aGVuLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvbWV0aG9kcy9hc3luYy1zcGxpdC5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL21ldGhvZHMvYXN5bmMtc3BsaXRlcmF0ZS1ncm91cGVkLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvbWV0aG9kcy9hc3luYy1zcGxpdGVyYXRlLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvbWV0aG9kcy9hc3luYy1zdGFydHMtd2l0aC1hbnktc2VxLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvbWV0aG9kcy9hc3luYy1zdGFydHMtd2l0aC1hbnkuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9tZXRob2RzL2FzeW5jLXN0YXJ0cy13aXRoLXNlcS5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL21ldGhvZHMvYXN5bmMtc3RhcnRzLXdpdGguanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9tZXRob2RzL2FzeW5jLXN0ci5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL21ldGhvZHMvYXN5bmMtdGFrZS1sYXN0LW9yLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvbWV0aG9kcy9hc3luYy10YWtlLWxhc3QuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9tZXRob2RzL2FzeW5jLXRha2Utc29ydGVkLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvbWV0aG9kcy9hc3luYy10YWtlLXdoaWxlLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvbWV0aG9kcy9hc3luYy10YWtlLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvbWV0aG9kcy9hc3luYy10YXAuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9tZXRob2RzL2FzeW5jLXRocm90dGxlLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvbWV0aG9kcy9hc3luYy10by1hcnJheS5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL21ldGhvZHMvYXN5bmMtdG8tb2JqZWN0LmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvbWV0aG9kcy9hc3luYy13aW5kb3ctYWhlYWQuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9tZXRob2RzL2FzeW5jLXdpbmRvdy1iZWhpbmQuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9tZXRob2RzL2FzeW5jLXdpbmRvdy5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL21ldGhvZHMvYXN5bmMtd3JhcC5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL21ldGhvZHMvYXN5bmMtemlwLWFsbC5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL21ldGhvZHMvYXN5bmMtemlwLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvbWV0aG9kcy9iYXRjaC5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL21ldGhvZHMvYmlzZWN0LmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvbWV0aG9kcy9jYWxsLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvbWV0aG9kcy9jb2xsYXRlLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvbWV0aG9kcy9jb21wb3NlLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvbWV0aG9kcy9jb21wcmVzcy5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL21ldGhvZHMvY29uY2F0LmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvbWV0aG9kcy9jb25zdW1lLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvbWV0aG9kcy9jeWNsZS10aW1lcy5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL21ldGhvZHMvY3ljbGUuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9tZXRob2RzL2RlZXAtZXF1YWwuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9tZXRob2RzL2Rpc3RpbmN0LmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvbWV0aG9kcy9kcm9wLXdoaWxlLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvbWV0aG9kcy9kcm9wLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvbWV0aG9kcy9lbnVtZXJhdGUuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9tZXRob2RzL2VxdWFsLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvbWV0aG9kcy9ldmVyeS5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL21ldGhvZHMvZXhlYy1waXBlLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvbWV0aG9kcy9maWx0ZXIuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9tZXRob2RzL2ZpbmQtYmVzdC1vci5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL21ldGhvZHMvZmluZC1iZXN0LmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvbWV0aG9kcy9maW5kLW9yLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvbWV0aG9kcy9maW5kLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvbWV0aG9kcy9maXJzdC1oaWdoZXN0LmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvbWV0aG9kcy9maXJzdC1sb3dlc3QuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9tZXRob2RzL2ZpcnN0LW9yLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvbWV0aG9kcy9maXJzdC5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL21ldGhvZHMvZmxhdC1tYXAuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9tZXRob2RzL2ZsYXQuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9tZXRob2RzL2Zvci1lYWNoLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvbWV0aG9kcy9mb3JrLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvbWV0aG9kcy9mb3JrZXJhdGUuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9tZXRob2RzL2dldC1zaXplLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvbWV0aG9kcy9pbmNsdWRlcy1hbnktc2VxLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvbWV0aG9kcy9pbmNsdWRlcy1hbnkuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9tZXRob2RzL2luY2x1ZGVzLXNlcS5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL21ldGhvZHMvaW5jbHVkZXMuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9tZXRob2RzL2ludGVybGVhdmUuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9tZXRob2RzL2ludGVycG9zZS1zZXEuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9tZXRob2RzL2ludGVycG9zZS5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL21ldGhvZHMvaXMtYXJyYXkuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9tZXRob2RzL2lzLWFzeW5jLWl0ZXJhYmxlLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvbWV0aG9kcy9pcy1hc3luYy1sb29wYWJsZS5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL21ldGhvZHMvaXMtYXN5bmMtd3JhcHBhYmxlLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvbWV0aG9kcy9pcy1lbXB0eS5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL21ldGhvZHMvaXMtaXRlcmFibGUuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9tZXRob2RzL2lzLWxvb3BhYmxlLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvbWV0aG9kcy9pcy1uaWwuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9tZXRob2RzL2lzLW51bGwuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9tZXRob2RzL2lzLW9iamVjdC5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL21ldGhvZHMvaXMtc29ydGVkLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvbWV0aG9kcy9pcy1zdHJpbmcuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9tZXRob2RzL2lzLXVuZGVmaW5lZC5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL21ldGhvZHMvaXMtd3JhcHBhYmxlLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvbWV0aG9kcy9qb2luLXdpdGgtc2VxLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvbWV0aG9kcy9qb2luLXdpdGguanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9tZXRob2RzL2pvaW4uanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9tZXRob2RzL2xhc3QtaGlnaGVzdC5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL21ldGhvZHMvbGFzdC1sb3dlc3QuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9tZXRob2RzL21hcC5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL21ldGhvZHMvbm90LWFycmF5LmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvbWV0aG9kcy9ub3QtYXN5bmMtaXRlcmFibGUuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9tZXRob2RzL25vdC1hc3luYy1sb29wYWJsZS5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL21ldGhvZHMvbm90LWFzeW5jLXdyYXBwYWJsZS5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL21ldGhvZHMvbm90LWl0ZXJhYmxlLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvbWV0aG9kcy9ub3QtbG9vcGFibGUuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9tZXRob2RzL25vdC1uaWwuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9tZXRob2RzL25vdC1udWxsLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvbWV0aG9kcy9ub3Qtb2JqZWN0LmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvbWV0aG9kcy9ub3Qtc3RyaW5nLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvbWV0aG9kcy9ub3QtdW5kZWZpbmVkLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvbWV0aG9kcy9ub3Qtd3JhcHBhYmxlLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvbWV0aG9kcy9vYmplY3QtZW50cmllcy5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL21ldGhvZHMvb2JqZWN0LWZyb20tYXN5bmMuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9tZXRob2RzL29iamVjdC1mcm9tLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvbWV0aG9kcy9vYmplY3Qta2V5cy5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL21ldGhvZHMvb2JqZWN0LXZhbHVlcy5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL21ldGhvZHMvcGVla2VyYXRlLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvbWV0aG9kcy9waXBlLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvbWV0aG9kcy9wcmVwZW5kLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvbWV0aG9kcy9yYW5nZS5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL21ldGhvZHMvcmVkdWNlLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvbWV0aG9kcy9yZXBlYXQtdGltZXMuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9tZXRob2RzL3JlcGVhdC5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL21ldGhvZHMvcmV2ZXJzZS5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL21ldGhvZHMvcm91bmQtcm9iaW4uanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9tZXRob2RzL3NpemUuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9tZXRob2RzL3NsaWNlLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvbWV0aG9kcy9zb21lLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvbWV0aG9kcy9zcGxpdC1ncm91cHMuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9tZXRob2RzL3NwbGl0LW9uLWFueS1zZXEuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9tZXRob2RzL3NwbGl0LW9uLWFueS5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL21ldGhvZHMvc3BsaXQtb24tc2VxLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvbWV0aG9kcy9zcGxpdC1vbi5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL21ldGhvZHMvc3BsaXQtd2hlbi5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL21ldGhvZHMvc3BsaXQuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9tZXRob2RzL3NwbGl0ZXJhdGUtZ3JvdXBlZC5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL21ldGhvZHMvc3BsaXRlcmF0ZS5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL21ldGhvZHMvc3RhcnRzLXdpdGgtYW55LXNlcS5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL21ldGhvZHMvc3RhcnRzLXdpdGgtYW55LmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvbWV0aG9kcy9zdGFydHMtd2l0aC1zZXEuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9tZXRob2RzL3N0YXJ0cy13aXRoLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvbWV0aG9kcy9zdHIuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9tZXRob2RzL3N0cmluZy1mcm9tLWFzeW5jLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvbWV0aG9kcy9zdHJpbmctZnJvbS5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL21ldGhvZHMvdGFrZS1sYXN0LW9yLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvbWV0aG9kcy90YWtlLWxhc3QuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9tZXRob2RzL3Rha2Utc29ydGVkLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvbWV0aG9kcy90YWtlLXdoaWxlLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvbWV0aG9kcy90YWtlLmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvbWV0aG9kcy90YXAuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9tZXRob2RzL3RvLWFycmF5LmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvbWV0aG9kcy90by1vYmplY3QuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9tZXRob2RzL3doZW4uanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9tZXRob2RzL3dpbmRvdy1haGVhZC5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL21ldGhvZHMvd2luZG93LWJlaGluZC5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL21ldGhvZHMvd2luZG93LmpzIiwibm9kZV9tb2R1bGVzL2l0ZXItdG9vbHMvbWV0aG9kcy93cmFwLWVudHJpZXMuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9tZXRob2RzL3dyYXAta2V5cy5qcyIsIm5vZGVfbW9kdWxlcy9pdGVyLXRvb2xzL21ldGhvZHMvd3JhcC12YWx1ZXMuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9tZXRob2RzL3dyYXAuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9tZXRob2RzL3ppcC1hbGwuanMiLCJub2RlX21vZHVsZXMvaXRlci10b29scy9tZXRob2RzL3ppcC5qcyIsIm5vZGVfbW9kdWxlcy9sb25nL2Rpc3QvbG9uZy5qcyIsIm5vZGVfbW9kdWxlcy9vYmplY3QtYXNzaWduL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3Byb2Nlc3MvYnJvd3Nlci5qcyIsIm5vZGVfbW9kdWxlcy9wcm90b2J1ZmpzL21pbmltYWwuanMiLCJub2RlX21vZHVsZXMvcHJvdG9idWZqcy9zcmMvaW5kZXgtbWluaW1hbC5qcyIsIm5vZGVfbW9kdWxlcy9wcm90b2J1ZmpzL3NyYy9yZWFkZXIuanMiLCJub2RlX21vZHVsZXMvcHJvdG9idWZqcy9zcmMvcmVhZGVyX2J1ZmZlci5qcyIsIm5vZGVfbW9kdWxlcy9wcm90b2J1ZmpzL3NyYy9yb290cy5qcyIsIm5vZGVfbW9kdWxlcy9wcm90b2J1ZmpzL3NyYy9ycGMuanMiLCJub2RlX21vZHVsZXMvcHJvdG9idWZqcy9zcmMvcnBjL3NlcnZpY2UuanMiLCJub2RlX21vZHVsZXMvcHJvdG9idWZqcy9zcmMvdXRpbC9sb25nYml0cy5qcyIsIm5vZGVfbW9kdWxlcy9wcm90b2J1ZmpzL3NyYy91dGlsL21pbmltYWwuanMiLCJub2RlX21vZHVsZXMvcHJvdG9idWZqcy9zcmMvd3JpdGVyLmpzIiwibm9kZV9tb2R1bGVzL3Byb3RvYnVmanMvc3JjL3dyaXRlcl9idWZmZXIuanMiLCJub2RlX21vZHVsZXMvcHVueWNvZGUvcHVueWNvZGUuanMiLCJub2RlX21vZHVsZXMvcXVlcnlzdHJpbmctZXMzL2RlY29kZS5qcyIsIm5vZGVfbW9kdWxlcy9xdWVyeXN0cmluZy1lczMvZW5jb2RlLmpzIiwibm9kZV9tb2R1bGVzL3F1ZXJ5c3RyaW5nLWVzMy9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9yZWdlbmVyYXRvci1ydW50aW1lL3J1bnRpbWUuanMiLCJub2RlX21vZHVsZXMvc2FmZS1idWZmZXIvaW5kZXguanMiLCJub2RlX21vZHVsZXMvc3RyZWFtLWh0dHAvaW5kZXguanMiLCJub2RlX21vZHVsZXMvc3RyZWFtLWh0dHAvbGliL2NhcGFiaWxpdHkuanMiLCJub2RlX21vZHVsZXMvc3RyZWFtLWh0dHAvbGliL3JlcXVlc3QuanMiLCJub2RlX21vZHVsZXMvc3RyZWFtLWh0dHAvbGliL3Jlc3BvbnNlLmpzIiwibm9kZV9tb2R1bGVzL3N0cmVhbS1odHRwL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vZXJyb3JzLWJyb3dzZXIuanMiLCJub2RlX21vZHVsZXMvc3RyZWFtLWh0dHAvbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvX3N0cmVhbV9kdXBsZXguanMiLCJub2RlX21vZHVsZXMvc3RyZWFtLWh0dHAvbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvX3N0cmVhbV9wYXNzdGhyb3VnaC5qcyIsIm5vZGVfbW9kdWxlcy9zdHJlYW0taHR0cC9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9fc3RyZWFtX3JlYWRhYmxlLmpzIiwibm9kZV9tb2R1bGVzL3N0cmVhbS1odHRwL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL19zdHJlYW1fdHJhbnNmb3JtLmpzIiwibm9kZV9tb2R1bGVzL3N0cmVhbS1odHRwL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL19zdHJlYW1fd3JpdGFibGUuanMiLCJub2RlX21vZHVsZXMvc3RyZWFtLWh0dHAvbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvaW50ZXJuYWwvc3RyZWFtcy9hc3luY19pdGVyYXRvci5qcyIsIm5vZGVfbW9kdWxlcy9zdHJlYW0taHR0cC9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9pbnRlcm5hbC9zdHJlYW1zL2J1ZmZlcl9saXN0LmpzIiwibm9kZV9tb2R1bGVzL3N0cmVhbS1odHRwL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL2ludGVybmFsL3N0cmVhbXMvZGVzdHJveS5qcyIsIm5vZGVfbW9kdWxlcy9zdHJlYW0taHR0cC9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9pbnRlcm5hbC9zdHJlYW1zL2VuZC1vZi1zdHJlYW0uanMiLCJub2RlX21vZHVsZXMvc3RyZWFtLWh0dHAvbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvaW50ZXJuYWwvc3RyZWFtcy9mcm9tLWJyb3dzZXIuanMiLCJub2RlX21vZHVsZXMvc3RyZWFtLWh0dHAvbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvaW50ZXJuYWwvc3RyZWFtcy9waXBlbGluZS5qcyIsIm5vZGVfbW9kdWxlcy9zdHJlYW0taHR0cC9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9pbnRlcm5hbC9zdHJlYW1zL3N0YXRlLmpzIiwibm9kZV9tb2R1bGVzL3N0cmVhbS1odHRwL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL2ludGVybmFsL3N0cmVhbXMvc3RyZWFtLWJyb3dzZXIuanMiLCJub2RlX21vZHVsZXMvc3RyZWFtLWh0dHAvbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9yZWFkYWJsZS1icm93c2VyLmpzIiwibm9kZV9tb2R1bGVzL3N0cmluZ19kZWNvZGVyL2xpYi9zdHJpbmdfZGVjb2Rlci5qcyIsIm5vZGVfbW9kdWxlcy90aW1lcnMtYnJvd3NlcmlmeS9tYWluLmpzIiwibm9kZV9tb2R1bGVzL3VybC91cmwuanMiLCJub2RlX21vZHVsZXMvdXJsL3V0aWwuanMiLCJub2RlX21vZHVsZXMvdXRpbC1kZXByZWNhdGUvYnJvd3Nlci5qcyIsIm5vZGVfbW9kdWxlcy94dGVuZC9pbW11dGFibGUuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUNBQTtBQUNBO0FBQ0E7O0FDRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ3pDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDaHVCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xwQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbEVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pxSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMxWUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNUZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDak5BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDek1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoUkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkpBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNU5BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbHhWQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3YwSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1SEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3Y4R0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUNwQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUMzTkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzU0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdkRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNOQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNOQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDZkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDYkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNkQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDWkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDVkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNSQTtBQUNBOztBQ0RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcERBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDM0lBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvVUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ3pHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUMxZkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ0xBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUMxa0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUM3NkNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUNyVUE7OztBQ0FBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUNqdkRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaEVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNscUhBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDM2dCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQy9CQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2wyTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDM0JBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMxSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbEdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0RkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25DQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdkdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQy9DQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNaQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNaQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeFBBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdkdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekhBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3TEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNySEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDZEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNkQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDZEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcEVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdkpBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMxR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbERBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUpBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDM0ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbktBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDalpBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuT0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNkQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQy9FQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDZEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5RkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JXQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOU1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOU5BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25CQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcklBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDckJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDM0RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDZEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdkpBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5SEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDM0hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3SEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL0lBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0SUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3SEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNSQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeEdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbEdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1RkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDWkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0pBO0FBQ0E7O0FDREE7QUFDQTs7QUNEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaExBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNWQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoQkE7QUFDQTs7QUNEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1BBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1BBOztBQ0FBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNOQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1BBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNQQTs7QUNBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL0RBO0FBQ0E7O0FDREE7QUFDQTs7QUNEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL0RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsQ0E7QUFDQTs7QUNEQTtBQUNBOztBQ0RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMxQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDN0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMVhBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDalBBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeElBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdlBBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3WUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BRQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2SkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNWQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDWkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaklBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25CQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDM0pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbExBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFDQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6ckNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzWkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5SUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUN4TUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQ3JhQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqZEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDckZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQ3JoQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcEZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDckZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsdkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDakVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQ3BGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FDM0RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FDaFdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUNuTkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDL0hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDMUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDdENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUNubUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDeE1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQ3hyQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDOU1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDak5BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQ3hHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZHQTtBQUNBO0FBQ0E7QUFDQTs7QUNIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFCQTtBQUNBOztBQ0RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ3ZTQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQzNFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1dEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ2hCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDbkVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiZ2VuZXJhdGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbigpe2Z1bmN0aW9uIHIoZSxuLHQpe2Z1bmN0aW9uIG8oaSxmKXtpZighbltpXSl7aWYoIWVbaV0pe3ZhciBjPVwiZnVuY3Rpb25cIj09dHlwZW9mIHJlcXVpcmUmJnJlcXVpcmU7aWYoIWYmJmMpcmV0dXJuIGMoaSwhMCk7aWYodSlyZXR1cm4gdShpLCEwKTt2YXIgYT1uZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiK2krXCInXCIpO3Rocm93IGEuY29kZT1cIk1PRFVMRV9OT1RfRk9VTkRcIixhfXZhciBwPW5baV09e2V4cG9ydHM6e319O2VbaV1bMF0uY2FsbChwLmV4cG9ydHMsZnVuY3Rpb24ocil7dmFyIG49ZVtpXVsxXVtyXTtyZXR1cm4gbyhufHxyKX0scCxwLmV4cG9ydHMscixlLG4sdCl9cmV0dXJuIG5baV0uZXhwb3J0c31mb3IodmFyIHU9XCJmdW5jdGlvblwiPT10eXBlb2YgcmVxdWlyZSYmcmVxdWlyZSxpPTA7aTx0Lmxlbmd0aDtpKyspbyh0W2ldKTtyZXR1cm4gb31yZXR1cm4gcn0pKCkiLCJ3aW5kb3cuQnVmZmVyID0gcmVxdWlyZShcImJ1ZmZlclwiKS5CdWZmZXI7XG53aW5kb3cuZGVtb2ZpbGUgPSByZXF1aXJlKFwiLi4vZGlzdC9kZW1vXCIpO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5mdW5jdGlvbiBhc3NlcnRFeGlzdHModmFsdWUsIG1lc3NhZ2UpIHtcbiAgICBpZiAodmFsdWUgPT0gbnVsbClcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UgfHwgXCJleHBlY3RlZCBub24tbnVsbCB2YWx1ZVwiKTtcbiAgICByZXR1cm4gdmFsdWU7XG59XG5leHBvcnRzLmRlZmF1bHQgPSBhc3NlcnRFeGlzdHM7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1hc3NlcnQtZXhpc3RzLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5TTkRfU1RPUCA9IGV4cG9ydHMuSU5WQUxJRF9ORVRXT1JLRURfRUhBTkRMRV9WQUxVRSA9IGV4cG9ydHMuTUFYX1VTRVJEQVRBX0JJVFMgPSBleHBvcnRzLlNVQlNUUklOR19CSVRTID0gZXhwb3J0cy5NQVhfQ1VTVE9NX0ZJTEVTID0gZXhwb3J0cy5TSUdORURfR1VJRF9MRU4gPSBleHBvcnRzLk1BWF9QTEFZRVJfTkFNRV9MRU5HVEggPSBleHBvcnRzLk1BWF9TUExJVFNDUkVFTl9DTElFTlRTID0gZXhwb3J0cy5NQVhfT1NQQVRIID0gZXhwb3J0cy5OVU1fTkVUV09SS0VEX0VIQU5ETEVfQklUUyA9IGV4cG9ydHMuTlVNX05FVFdPUktFRF9FSEFORExFX1NFUklBTF9OVU1CRVJfQklUUyA9IGV4cG9ydHMuTkVUV09SS0VEX0VIQU5ETEVfRU5UX0VOVFJZX01BU0sgPSBleHBvcnRzLk1BWF9FRElDVFMgPSBleHBvcnRzLk1BWF9FRElDVF9CSVRTID0gdm9pZCAwO1xuZXhwb3J0cy5NQVhfRURJQ1RfQklUUyA9IDExO1xuZXhwb3J0cy5NQVhfRURJQ1RTID0gMSA8PCBleHBvcnRzLk1BWF9FRElDVF9CSVRTO1xuZXhwb3J0cy5ORVRXT1JLRURfRUhBTkRMRV9FTlRfRU5UUllfTUFTSyA9IGV4cG9ydHMuTUFYX0VESUNUUyAtIDE7XG5leHBvcnRzLk5VTV9ORVRXT1JLRURfRUhBTkRMRV9TRVJJQUxfTlVNQkVSX0JJVFMgPSAxMDtcbmV4cG9ydHMuTlVNX05FVFdPUktFRF9FSEFORExFX0JJVFMgPSBleHBvcnRzLk1BWF9FRElDVF9CSVRTICsgZXhwb3J0cy5OVU1fTkVUV09SS0VEX0VIQU5ETEVfU0VSSUFMX05VTUJFUl9CSVRTO1xuZXhwb3J0cy5NQVhfT1NQQVRIID0gMjYwO1xuZXhwb3J0cy5NQVhfU1BMSVRTQ1JFRU5fQ0xJRU5UUyA9IDI2MDtcbmV4cG9ydHMuTUFYX1BMQVlFUl9OQU1FX0xFTkdUSCA9IDEyODtcbmV4cG9ydHMuU0lHTkVEX0dVSURfTEVOID0gMzI7XG5leHBvcnRzLk1BWF9DVVNUT01fRklMRVMgPSA0O1xuZXhwb3J0cy5TVUJTVFJJTkdfQklUUyA9IDU7XG5leHBvcnRzLk1BWF9VU0VSREFUQV9CSVRTID0gMTQ7XG5leHBvcnRzLklOVkFMSURfTkVUV09SS0VEX0VIQU5ETEVfVkFMVUUgPSAoMSA8PCBleHBvcnRzLk5VTV9ORVRXT1JLRURfRUhBTkRMRV9CSVRTKSAtIDE7XG5leHBvcnRzLlNORF9TVE9QID0gMSA8PCAyO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29uc3RzLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5Db25WYXJzID0gdm9pZCAwO1xuY29uc3QgZXZlbnRzXzEgPSByZXF1aXJlKFwiZXZlbnRzXCIpO1xuLyoqXG4gKiBNYW5hZ2VzIGNvbnNvbGUgdmFyaWFibGVzLlxuICovXG5jbGFzcyBDb25WYXJzIGV4dGVuZHMgZXZlbnRzXzEuRXZlbnRFbWl0dGVyIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcbiAgICAgICAgdGhpcy52YXJzID0gbmV3IE1hcCgpO1xuICAgIH1cbiAgICBsaXN0ZW4oZGVtbykge1xuICAgICAgICBkZW1vLm9uKFwibmV0X1NldENvblZhclwiLCAobXNnKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjb252YXJzID0gbXNnLmNvbnZhcnM7XG4gICAgICAgICAgICBpZiAoIWNvbnZhcnMpXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgZm9yIChjb25zdCBjdmFyIG9mIGNvbnZhcnMuY3ZhcnMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBvbGRWYWx1ZSA9IHRoaXMudmFycy5nZXQoY3Zhci5uYW1lKTtcbiAgICAgICAgICAgICAgICB0aGlzLnZhcnMuc2V0KGN2YXIubmFtZSwgY3Zhci52YWx1ZSk7XG4gICAgICAgICAgICAgICAgY29uc3QgYXJncyA9IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogY3Zhci5uYW1lLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogY3Zhci52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgb2xkVmFsdWVcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHRoaXMuZW1pdChjdmFyLm5hbWUsIGFyZ3MpO1xuICAgICAgICAgICAgICAgIHRoaXMuZW1pdChcImNoYW5nZVwiLCBhcmdzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxufVxuZXhwb3J0cy5Db25WYXJzID0gQ29uVmFycztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNvbnZhcnMuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmRlY29kZUNyb3NzaGFpckNvZGUgPSBleHBvcnRzLkNyb3NzaGFpclN0eWxlID0gdm9pZCAwO1xuY29uc3Qgc2hhcmVjb2RlXzEgPSByZXF1aXJlKFwiLi9zaGFyZWNvZGVcIik7XG52YXIgQ3Jvc3NoYWlyU3R5bGU7XG4oZnVuY3Rpb24gKENyb3NzaGFpclN0eWxlKSB7XG4gICAgQ3Jvc3NoYWlyU3R5bGVbQ3Jvc3NoYWlyU3R5bGVbXCJEZWZhdWx0XCJdID0gMF0gPSBcIkRlZmF1bHRcIjtcbiAgICBDcm9zc2hhaXJTdHlsZVtDcm9zc2hhaXJTdHlsZVtcIkRlZmF1bHRTdGF0aWNcIl0gPSAxXSA9IFwiRGVmYXVsdFN0YXRpY1wiO1xuICAgIENyb3NzaGFpclN0eWxlW0Nyb3NzaGFpclN0eWxlW1wiQ2xhc3NpY1wiXSA9IDJdID0gXCJDbGFzc2ljXCI7XG4gICAgQ3Jvc3NoYWlyU3R5bGVbQ3Jvc3NoYWlyU3R5bGVbXCJDbGFzc2ljRHluYW1pY1wiXSA9IDNdID0gXCJDbGFzc2ljRHluYW1pY1wiO1xuICAgIENyb3NzaGFpclN0eWxlW0Nyb3NzaGFpclN0eWxlW1wiQ2xhc3NpY1N0YXRpY1wiXSA9IDRdID0gXCJDbGFzc2ljU3RhdGljXCI7XG59KShDcm9zc2hhaXJTdHlsZSA9IGV4cG9ydHMuQ3Jvc3NoYWlyU3R5bGUgfHwgKGV4cG9ydHMuQ3Jvc3NoYWlyU3R5bGUgPSB7fSkpO1xuZnVuY3Rpb24gZGVjb2RlQ3Jvc3NoYWlyQ29kZShzaGFyZUNvZGUpIHtcbiAgICBmdW5jdGlvbiBzaWduZWQoYnl0ZSkge1xuICAgICAgICByZXR1cm4gYnl0ZSA+IDEyNyA/IC0ofmJ5dGUgJiAweGZmKSAtIDEgOiBieXRlO1xuICAgIH1cbiAgICBjb25zdCBieXRlcyA9ICgwLCBzaGFyZWNvZGVfMS5kZWNvZGVTaGFyZUNvZGUpKHNoYXJlQ29kZSk7XG4gICAgaWYgKGJ5dGVzWzFdICE9PSBieXRlcy5zbGljZSgyKS5yZWR1Y2UoKHgsIHkpID0+IHggKyB5KSAlIDI1Nikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJpbnZhbGlkIGNyb3NzaGFpciBjb2RlXCIpO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICBvdXRsaW5lOiBieXRlc1s0XSAvIDIsXG4gICAgICAgIHJlZDogYnl0ZXNbNV0sXG4gICAgICAgIGdyZWVuOiBieXRlc1s2XSxcbiAgICAgICAgYmx1ZTogYnl0ZXNbN10sXG4gICAgICAgIGFscGhhOiBieXRlc1s4XSxcbiAgICAgICAgc3BsaXREaXN0YW5jZTogYnl0ZXNbOV0sXG4gICAgICAgIGlubmVyU3BsaXRBbHBoYTogKGJ5dGVzWzExXSA+PiA0KSAvIDEwLFxuICAgICAgICBoYXNPdXRsaW5lOiAhIShieXRlc1sxMV0gJiA4KSxcbiAgICAgICAgb3V0ZXJTcGxpdEFscGhhOiAoYnl0ZXNbMTJdICYgMHhmKSAvIDEwLFxuICAgICAgICBzcGxpdFNpemVSYXRpbzogKGJ5dGVzWzEyXSA+PiA0KSAvIDEwLFxuICAgICAgICB0aGlja25lc3M6IGJ5dGVzWzEzXSAvIDEwLFxuICAgICAgICBsZW5ndGg6IGJ5dGVzWzE1XSAvIDEwLFxuICAgICAgICBnYXA6IHNpZ25lZChieXRlc1szXSkgLyAxMCxcbiAgICAgICAgaGFzQ2VudGVyRG90OiAhISgoYnl0ZXNbMTRdID4+IDQpICYgMSksXG4gICAgICAgIGhhc0FscGhhOiAhISgoYnl0ZXNbMTRdID4+IDQpICYgNCksXG4gICAgICAgIGlzVFN0eWxlOiAhISgoYnl0ZXNbMTRdID4+IDQpICYgOCksXG4gICAgICAgIHN0eWxlOiBDcm9zc2hhaXJTdHlsZVsoYnl0ZXNbMTRdICYgMHhmKSA+PiAxXVxuICAgIH07XG59XG5leHBvcnRzLmRlY29kZUNyb3NzaGFpckNvZGUgPSBkZWNvZGVDcm9zc2hhaXJDb2RlO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y3Jvc3NoYWlyLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5EZW1vRmlsZSA9IGV4cG9ydHMucGFyc2VIZWFkZXIgPSB2b2lkIDA7XG5jb25zdCBldmVudHNfMSA9IHJlcXVpcmUoXCJldmVudHNcIik7XG5jb25zdCB0aW1lcnMgPSByZXF1aXJlKFwidGltZXJzXCIpO1xuY29uc3QgdXJsXzEgPSByZXF1aXJlKFwidXJsXCIpO1xuY29uc3QgaHR0cHMgPSByZXF1aXJlKFwiaHR0cHNcIik7XG5jb25zdCBCeXRlQnVmZmVyID0gcmVxdWlyZShcImJ5dGVidWZmZXJcIik7XG5jb25zdCBiaXRidWZmZXJfMSA9IHJlcXVpcmUoXCIuL2V4dC9iaXRidWZmZXJcIik7XG5jb25zdCBhc3NlcnQgPSByZXF1aXJlKFwiYXNzZXJ0XCIpO1xuY29uc3QgY29uc3RzXzEgPSByZXF1aXJlKFwiLi9jb25zdHNcIik7XG5jb25zdCBjb252YXJzXzEgPSByZXF1aXJlKFwiLi9jb252YXJzXCIpO1xuY29uc3QgZW50aXRpZXNfMSA9IHJlcXVpcmUoXCIuL2VudGl0aWVzXCIpO1xuY29uc3QgZ2FtZWV2ZW50c18xID0gcmVxdWlyZShcIi4vZ2FtZWV2ZW50c1wiKTtcbmNvbnN0IGljZWtleV8xID0gcmVxdWlyZShcIi4vaWNla2V5XCIpO1xuY29uc3QgbmV0ID0gcmVxdWlyZShcIi4vbmV0XCIpO1xuY29uc3Qgc3RyaW5ndGFibGVzXzEgPSByZXF1aXJlKFwiLi9zdHJpbmd0YWJsZXNcIik7XG5jb25zdCB1c2VybWVzc2FnZXNfMSA9IHJlcXVpcmUoXCIuL3VzZXJtZXNzYWdlc1wiKTtcbmNvbnN0IGFzc2VydF9leGlzdHNfMSA9IHJlcXVpcmUoXCIuL2Fzc2VydC1leGlzdHNcIik7XG5jb25zdCBncmVuYWRldHJhamVjdG9yeV8xID0gcmVxdWlyZShcIi4vc3VwcGxlbWVudHMvZ3JlbmFkZXRyYWplY3RvcnlcIik7XG5jb25zdCBtb2xvdG92ZGV0b25hdGVfMSA9IHJlcXVpcmUoXCIuL3N1cHBsZW1lbnRzL21vbG90b3ZkZXRvbmF0ZVwiKTtcbmNvbnN0IGl0ZW1wdXJjaGFzZV8xID0gcmVxdWlyZShcIi4vc3VwcGxlbWVudHMvaXRlbXB1cmNoYXNlXCIpO1xuZnVuY3Rpb24gaHR0cEdldCh1cmwpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBodHRwc1xuICAgICAgICAgICAgLnJlcXVlc3QodXJsLCByZXMgPT4ge1xuICAgICAgICAgICAgY29uc3QgY2h1bmtzID0gW107XG4gICAgICAgICAgICByZXMub24oXCJkYXRhXCIsIGNodW5rID0+IHtcbiAgICAgICAgICAgICAgICBjaHVua3MucHVzaChjaHVuayk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJlcy5vbihcImVuZFwiLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHJlcy5zdGF0dXNDb2RlID09IDIwMCkge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKEJ1ZmZlci5jb25jYXQoY2h1bmtzKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZWplY3QoYHJlcXVlc3QgJyR7dXJsfScgZmFpbGVkOiAke3Jlcy5zdGF0dXNDb2RlfSAoJHtyZXMuc3RhdHVzTWVzc2FnZX0pYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pXG4gICAgICAgICAgICAuZW5kKCk7XG4gICAgfSk7XG59XG5mdW5jdGlvbiBwYXJzZUhlYWRlckJ5dGVidWYoYnl0ZWJ1Zikge1xuICAgIHJldHVybiB7XG4gICAgICAgIG1hZ2ljOiBieXRlYnVmLnJlYWRTdHJpbmcoOCwgQnl0ZUJ1ZmZlci5NRVRSSUNTX0JZVEVTKS5zcGxpdChcIlxcMFwiLCAyKVswXSxcbiAgICAgICAgcHJvdG9jb2w6IGJ5dGVidWYucmVhZEludDMyKCksXG4gICAgICAgIG5ldHdvcmtQcm90b2NvbDogYnl0ZWJ1Zi5yZWFkSW50MzIoKSxcbiAgICAgICAgc2VydmVyTmFtZTogYnl0ZWJ1ZlxuICAgICAgICAgICAgLnJlYWRTdHJpbmcoY29uc3RzXzEuTUFYX09TUEFUSCwgQnl0ZUJ1ZmZlci5NRVRSSUNTX0JZVEVTKVxuICAgICAgICAgICAgLnNwbGl0KFwiXFwwXCIsIDIpWzBdLFxuICAgICAgICBjbGllbnROYW1lOiBieXRlYnVmXG4gICAgICAgICAgICAucmVhZFN0cmluZyhjb25zdHNfMS5NQVhfT1NQQVRILCBCeXRlQnVmZmVyLk1FVFJJQ1NfQllURVMpXG4gICAgICAgICAgICAuc3BsaXQoXCJcXDBcIiwgMilbMF0sXG4gICAgICAgIG1hcE5hbWU6IGJ5dGVidWZcbiAgICAgICAgICAgIC5yZWFkU3RyaW5nKGNvbnN0c18xLk1BWF9PU1BBVEgsIEJ5dGVCdWZmZXIuTUVUUklDU19CWVRFUylcbiAgICAgICAgICAgIC5zcGxpdChcIlxcMFwiLCAyKVswXSxcbiAgICAgICAgZ2FtZURpcmVjdG9yeTogYnl0ZWJ1ZlxuICAgICAgICAgICAgLnJlYWRTdHJpbmcoY29uc3RzXzEuTUFYX09TUEFUSCwgQnl0ZUJ1ZmZlci5NRVRSSUNTX0JZVEVTKVxuICAgICAgICAgICAgLnNwbGl0KFwiXFwwXCIsIDIpWzBdLFxuICAgICAgICBwbGF5YmFja1RpbWU6IGJ5dGVidWYucmVhZEZsb2F0KCksXG4gICAgICAgIHBsYXliYWNrVGlja3M6IGJ5dGVidWYucmVhZEludDMyKCksXG4gICAgICAgIHBsYXliYWNrRnJhbWVzOiBieXRlYnVmLnJlYWRJbnQzMigpLFxuICAgICAgICBzaWdub25MZW5ndGg6IGJ5dGVidWYucmVhZEludDMyKClcbiAgICB9O1xufVxuLyoqXG4gKiBQYXJzZXMgYSBkZW1vIGZpbGUgaGVhZGVyIGZyb20gdGhlIGJ1ZmZlci5cbiAqIEBwYXJhbSB7QXJyYXlCdWZmZXJ9IGJ1ZmZlciAtIEJ1ZmZlciBvZiB0aGUgZGVtbyBoZWFkZXJcbiAqIEByZXR1cm5zIHtJRGVtb0hlYWRlcn0gSGVhZGVyIG9iamVjdFxuICovXG5mdW5jdGlvbiBwYXJzZUhlYWRlcihidWZmZXIpIHtcbiAgICBjb25zdCBieXRlYnVmID0gQnl0ZUJ1ZmZlci53cmFwKGJ1ZmZlciwgdHJ1ZSk7XG4gICAgcmV0dXJuIHBhcnNlSGVhZGVyQnl0ZWJ1ZihieXRlYnVmKTtcbn1cbmV4cG9ydHMucGFyc2VIZWFkZXIgPSBwYXJzZUhlYWRlcjtcbi8qKlxuICogUmVwcmVzZW50cyBhIGRlbW8gZmlsZSBmb3IgcGFyc2luZy5cbiAqL1xuY2xhc3MgRGVtb0ZpbGUgZXh0ZW5kcyBldmVudHNfMS5FdmVudEVtaXR0ZXIge1xuICAgIC8qKlxuICAgICAqIFN0YXJ0cyBwYXJzaW5nIGJ1ZmZlciBhcyBhIGRlbW8gZmlsZS5cbiAgICAgKlxuICAgICAqIEBmaXJlcyBEZW1vRmlsZSN0aWNrc3RhcnRcbiAgICAgKiBAZmlyZXMgRGVtb0ZpbGUjdGlja2VuZFxuICAgICAqIEBmaXJlcyBEZW1vRmlsZSNlbmRcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7QXJyYXlCdWZmZXJ9IGJ1ZmZlciAtIEJ1ZmZlciBwb2ludGluZyB0byBzdGFydCBvZiBkZW1vIGhlYWRlclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICAvKipcbiAgICAgICAgICogV2hlbiBwYXJzaW5nLCBzZXQgdG8gY3VycmVudCB0aWNrLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5jdXJyZW50VGljayA9IC0xO1xuICAgICAgICAvKipcbiAgICAgICAgICogTnVtYmVyIG9mIHNlY29uZHMgcGVyIHRpY2tcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMudGlja0ludGVydmFsID0gTmFOO1xuICAgICAgICAvKipcbiAgICAgICAgICogV2hlbiBwYXJzaW5nLCBzZXQgdG8gdGhlIHNwbGl0c2NyZWVuIHNsb3QgZm9yIHRoZSBjdXJyZW50IGNvbW1hbmQuXG4gICAgICAgICAqIEBkZXByZWNhdGVkIFNwbGl0c2NyZWVuIHNsb3QgaXMgdW51c2VkIGZvciBQQyBnYW1lcy5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMucGxheWVyU2xvdCA9IDA7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBTZXQgdG8gdGhlIGNsaWVudCBzbG90IG9mIHRoZSByZWNvcmRpbmcgcGxheWVyLlxuICAgICAgICAgKiBBbHdheXMgbnVsbCBmb3IgR09UViBkZW1vcy5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMucmVjb3JkaW5nQ2xpZW50U2xvdCA9IG51bGw7XG4gICAgICAgIHRoaXMuX2NodW5rcyA9IFtdO1xuICAgICAgICB0aGlzLl9sYXN0VGhyZWFkWWllbGRUaW1lID0gMDtcbiAgICAgICAgdGhpcy5faW1tZWRpYXRlVGltZXJUb2tlbiA9IG51bGw7XG4gICAgICAgIHRoaXMuX3RpbWVvdXRUaW1lclRva2VuID0gbnVsbDtcbiAgICAgICAgdGhpcy5fZW5jcnlwdGlvbktleSA9IG51bGw7XG4gICAgICAgIHRoaXMuX2hhc0VuZGVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX2lzQnJvYWRjYXN0RnJhZ21lbnQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fc3VwcGxlbWVudEV2ZW50cyA9IFtcbiAgICAgICAgICAgIGdyZW5hZGV0cmFqZWN0b3J5XzEuZGVmYXVsdCxcbiAgICAgICAgICAgIG1vbG90b3ZkZXRvbmF0ZV8xLmRlZmF1bHQsXG4gICAgICAgICAgICBpdGVtcHVyY2hhc2VfMS5kZWZhdWx0XG4gICAgICAgIF07XG4gICAgICAgIHRoaXMuX3N1cHBsZW1lbnRDbGVhbnVwRm5zID0gbmV3IE1hcCgpO1xuICAgICAgICB0aGlzLmVudGl0aWVzID0gbmV3IGVudGl0aWVzXzEuRW50aXRpZXMoKTtcbiAgICAgICAgdGhpcy5nYW1lRXZlbnRzID0gbmV3IGdhbWVldmVudHNfMS5HYW1lRXZlbnRzKCk7XG4gICAgICAgIHRoaXMuc3RyaW5nVGFibGVzID0gbmV3IHN0cmluZ3RhYmxlc18xLlN0cmluZ1RhYmxlcygpO1xuICAgICAgICB0aGlzLnVzZXJNZXNzYWdlcyA9IG5ldyB1c2VybWVzc2FnZXNfMS5Vc2VyTWVzc2FnZXMoKTtcbiAgICAgICAgdGhpcy5jb25WYXJzID0gbmV3IGNvbnZhcnNfMS5Db25WYXJzKCk7XG4gICAgICAgIHRoaXMuZ2FtZUV2ZW50cy5saXN0ZW4odGhpcyk7XG4gICAgICAgIC8vIEl0IGlzIGltcG9ydGFudCB0aGF0IGVudGl0aWVzIGxpc3RlbnMgYWZ0ZXIgZ2FtZSBldmVudHMsIGFzIHRoZXkgYm90aCBsaXN0ZW4gb25cbiAgICAgICAgLy8gdGlja2VuZC5cbiAgICAgICAgdGhpcy5lbnRpdGllcy5saXN0ZW4odGhpcyk7XG4gICAgICAgIHRoaXMuc3RyaW5nVGFibGVzLmxpc3Rlbih0aGlzKTtcbiAgICAgICAgdGhpcy51c2VyTWVzc2FnZXMubGlzdGVuKHRoaXMpO1xuICAgICAgICB0aGlzLmNvblZhcnMubGlzdGVuKHRoaXMpO1xuICAgICAgICAvLyAjNjU6IFNvbWUgZGVtb3MgYXJlIG1pc3NpbmcgcGxheWJhY2tUaWNrcyBmcm9tIHRoZSBoZWFkZXJcbiAgICAgICAgLy8gUHVsbCB0aGUgdGljayBpbnRlcnZhbCBmcm9tIFNlcnZlckluZm9cbiAgICAgICAgdGhpcy5vbihcInN2Y19TZXJ2ZXJJbmZvXCIsIG1zZyA9PiB7XG4gICAgICAgICAgICB0aGlzLnRpY2tJbnRlcnZhbCA9IG1zZy50aWNrSW50ZXJ2YWw7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLm9uKFwic3ZjX0VuY3J5cHRlZERhdGFcIiwgbXNnID0+IHtcbiAgICAgICAgICAgIGlmICghdGhpcy5faGFuZGxlRW5jcnlwdGVkRGF0YShtc2cpKSB7XG4gICAgICAgICAgICAgICAgLy8gU29tZSBkZW1vcyBhcHBlYXIgdG8gaGF2ZSB0aGUgZW5jcnlwdGlvbiBrZXkgcmVjb3JkZWRcbiAgICAgICAgICAgICAgICAvLyBpbmNvcnJlY3RseSBpbiB0aGUgLmRlbS5pbmZvIGZpbGUuIERvbid0IHRocm93IGFuIGVycm9yXG4gICAgICAgICAgICAgICAgLy8gaWYgd2UgY2FuJ3QgZGVjb2RlIGl0IGNvcnJlY3RseS5cbiAgICAgICAgICAgICAgICAvLyBUaGUgZ2FtZSBjbGllbnQgc2lsZW50bHkgc2tpcHMgYmFkIGVuY3J5cHRlZCBtZXNzYWdlcy5cbiAgICAgICAgICAgICAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3NhdWwvZGVtb2ZpbGUvaXNzdWVzLzMyMiNpc3N1ZWNvbW1lbnQtMTA4NTc3NjM3OVxuICAgICAgICAgICAgICAgIHRoaXMuZW1pdChcIndhcm5pbmdcIiwgeyBtZXNzYWdlOiBcIlVuYWJsZSB0byByZWFkIGVuY3J5cHRlZCBtZXNzYWdlXCIgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLm9uKFwibmV3TGlzdGVuZXJcIiwgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAvLyBJZiB3ZSBhbHJlYWR5IGhhdmUgbGlzdGVuZXJzIGZvciB0aGlzIGV2ZW50LCBub3RoaW5nIHRvIGRvXG4gICAgICAgICAgICBpZiAodGhpcy5saXN0ZW5lckNvdW50KGV2ZW50KSA+IDApXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgY29uc3Qgc3VwcGxlbWVudCA9IHRoaXMuX2ZpbmRTdXBwbGVtZW50KGV2ZW50KTtcbiAgICAgICAgICAgIGlmIChzdXBwbGVtZW50ID09IG51bGwpXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgY29uc3QgY2xlYW51cEZuID0gc3VwcGxlbWVudC5zZXR1cCh0aGlzKTtcbiAgICAgICAgICAgIHRoaXMuX3N1cHBsZW1lbnRDbGVhbnVwRm5zLnNldChzdXBwbGVtZW50LCBjbGVhbnVwRm4pO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5vbihcInJlbW92ZUxpc3RlbmVyXCIsIChldmVudCkgPT4ge1xuICAgICAgICAgICAgLy8gSWYgdGhlcmUgYXJlIHN0aWxsIGxpc3RlbmVycyBmb3IgdGhpcyBldmVudCwgZWFybHkgb3V0XG4gICAgICAgICAgICBpZiAodGhpcy5saXN0ZW5lckNvdW50KGV2ZW50KSA+IDApXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgY29uc3Qgc3VwcGxlbWVudCA9IHRoaXMuX2ZpbmRTdXBwbGVtZW50KGV2ZW50KTtcbiAgICAgICAgICAgIGlmIChzdXBwbGVtZW50ID09IG51bGwpXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgLy8gRG9uJ3QgY2xlYW51cCBpZiB0aGVyZSBhcmUgbGlzdGVuZXJzIG9uIG90aGVyIGVtaXRzIHRoYXQgdGhpcyBzdXBwbGVtZW50IGVtaXRzXG4gICAgICAgICAgICBjb25zdCBleGlzdGluZ0xpc3RlbmVyQ291bnQgPSBzdXBwbGVtZW50LmVtaXRzLnJlZHVjZSgocHJldiwgbmFtZSkgPT4gcHJldiArIHRoaXMubGlzdGVuZXJDb3VudChuYW1lKSwgMCk7XG4gICAgICAgICAgICBpZiAoZXhpc3RpbmdMaXN0ZW5lckNvdW50ID4gMClcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICBjb25zdCBjbGVhbnVwRm4gPSAoMCwgYXNzZXJ0X2V4aXN0c18xLmRlZmF1bHQpKHRoaXMuX3N1cHBsZW1lbnRDbGVhbnVwRm5zLmdldChzdXBwbGVtZW50KSk7XG4gICAgICAgICAgICBjbGVhbnVwRm4oKTtcbiAgICAgICAgICAgIHRoaXMuX3N1cHBsZW1lbnRDbGVhbnVwRm5zLmRlbGV0ZShzdXBwbGVtZW50KTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEByZXR1cm5zIE51bWJlciBvZiB0aWNrcyBwZXIgc2Vjb25kXG4gICAgICovXG4gICAgZ2V0IHRpY2tSYXRlKCkge1xuICAgICAgICByZXR1cm4gMS4wIC8gdGhpcy50aWNrSW50ZXJ2YWw7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEByZXR1cm5zIE51bWJlciBvZiBzZWNvbmRzIGVsYXBzZWRcbiAgICAgKi9cbiAgICBnZXQgY3VycmVudFRpbWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmN1cnJlbnRUaWNrICogdGhpcy50aWNrSW50ZXJ2YWw7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNob3J0Y3V0IGZvciBgdGhpcy5lbnRpdGllcy5wbGF5ZXJzYFxuICAgICAqIEByZXR1cm5zIEFsbCBjb25uZWN0ZWQgcGxheWVyIGVudGl0aWVzXG4gICAgICovXG4gICAgZ2V0IHBsYXllcnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVudGl0aWVzLnBsYXllcnM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNob3J0Y3V0IGZvciBgdGhpcy5lbnRpdGllcy50ZWFtc2BcbiAgICAgKiBAcmV0dXJucyBBbGwgdGVhbSBlbnRpdGllc1xuICAgICAqL1xuICAgIGdldCB0ZWFtcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW50aXRpZXMudGVhbXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNob3J0Y3V0IGZvciBgdGhpcy5lbnRpdGllcy5nYW1lUnVsZXNgXG4gICAgICogQHJldHVybnMgR2FtZVJ1bGVzIGVudGl0eVxuICAgICAqL1xuICAgIGdldCBnYW1lUnVsZXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVudGl0aWVzLmdhbWVSdWxlcztcbiAgICB9XG4gICAgX2ZpbmRTdXBwbGVtZW50KGV2ZW50TmFtZSkge1xuICAgICAgICBmb3IgKGNvbnN0IHN1cHBsZW1lbnQgb2YgdGhpcy5fc3VwcGxlbWVudEV2ZW50cykge1xuICAgICAgICAgICAgaWYgKHN1cHBsZW1lbnQuZW1pdHMuaW5kZXhPZihldmVudE5hbWUpID49IDApXG4gICAgICAgICAgICAgICAgcmV0dXJuIHN1cHBsZW1lbnQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFN0YXJ0IHN0cmVhbWluZyBhIEdPVFYgYnJvYWRjYXN0IG92ZXIgSFRUUC5cbiAgICAgKiBXaWxsIGtlZXAgc3RyZWFtaW5nIHVudGlsIHRoZSBicm9hZGNhc3QgZmluaXNoZXMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdXJsIFVSTCB0byB0aGUgR09UViBicm9hZGNhc3QuXG4gICAgICogQHJldHVybnMgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHRoZW4gdGhlIGJyb2FkY2FzdCBmaW5pc2hlcy5cbiAgICAgKi9cbiAgICBhc3luYyBwYXJzZUJyb2FkY2FzdCh1cmwpIHtcbiAgICAgICAgaWYgKCF1cmwuZW5kc1dpdGgoXCIvXCIpKVxuICAgICAgICAgICAgdXJsICs9IFwiL1wiO1xuICAgICAgICAvLyBTb21lIHBhY2tldHMgYXJlIGZvcm1hdHRlZCBzbGlnaHRseSBkaWZmZXJlbnRseSBpblxuICAgICAgICAvLyBicm9hZGNhc3QgZnJhZ21lbnRzIGNvbXBhcmVkIHRvIGEgbm9ybWFsIGRlbW8gZmlsZS5cbiAgICAgICAgdGhpcy5faXNCcm9hZGNhc3RGcmFnbWVudCA9IHRydWU7XG4gICAgICAgIGNvbnN0IHN5bmNVcmwgPSBuZXcgdXJsXzEuVVJMKFwic3luY1wiLCB1cmwpLnRvU3RyaW5nKCk7XG4gICAgICAgIGNvbnN0IHN5bmNSZXNwb25zZSA9IGF3YWl0IGh0dHBHZXQoc3luY1VybCk7XG4gICAgICAgIGNvbnN0IHN5bmNEdG8gPSBKU09OLnBhcnNlKHN5bmNSZXNwb25zZS50b1N0cmluZygpKTtcbiAgICAgICAgaWYgKHN5bmNEdG8ucHJvdG9jb2wgIT09IDQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgZXhwZWN0ZWQgcHJvdG9jb2wgdmVyc2lvbiA0LCBnb3Q6ICR7c3luY0R0by5wcm90b2NvbH1gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3luY0R0by50b2tlbl9yZWRpcmVjdCAhPSBudWxsKSB7XG4gICAgICAgICAgICB1cmwgPSBuZXcgdXJsXzEuVVJMKHN5bmNEdG8udG9rZW5fcmVkaXJlY3QsIHVybCkudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIGlmICghdXJsLmVuZHNXaXRoKFwiL1wiKSlcbiAgICAgICAgICAgICAgICB1cmwgKz0gXCIvXCI7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5oZWFkZXIgPSB7XG4gICAgICAgICAgICBtYWdpYzogXCJITDJERU1PXCIsXG4gICAgICAgICAgICBwcm90b2NvbDogc3luY0R0by5wcm90b2NvbCxcbiAgICAgICAgICAgIG5ldHdvcmtQcm90b2NvbDogMCxcbiAgICAgICAgICAgIHNlcnZlck5hbWU6IGBHT1RWIEJyb2FkY2FzdDogJHt1cmx9YCxcbiAgICAgICAgICAgIGNsaWVudE5hbWU6IFwiR09UViBEZW1vXCIsXG4gICAgICAgICAgICBtYXBOYW1lOiBzeW5jRHRvLm1hcCxcbiAgICAgICAgICAgIGdhbWVEaXJlY3Rvcnk6IFwiY3Nnb1wiLFxuICAgICAgICAgICAgcGxheWJhY2tUaW1lOiAwLFxuICAgICAgICAgICAgcGxheWJhY2tUaWNrczogMCxcbiAgICAgICAgICAgIHBsYXliYWNrRnJhbWVzOiAwLFxuICAgICAgICAgICAgc2lnbm9uTGVuZ3RoOiAwXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMudGlja0ludGVydmFsID0gMSAvIHN5bmNEdG8udHBzO1xuICAgICAgICBsZXQgY2FuY2VsbGVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZW1pdChcInN0YXJ0XCIsIHtcbiAgICAgICAgICAgIGNhbmNlbCgpIHtcbiAgICAgICAgICAgICAgICBjYW5jZWxsZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS1jb25kaXRpb25cbiAgICAgICAgaWYgKGNhbmNlbGxlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHN0YXJ0VXJsID0gbmV3IHVybF8xLlVSTChgJHtzeW5jRHRvLnNpZ251cF9mcmFnbWVudCB8IDB9L3N0YXJ0YCwgdXJsKS50b1N0cmluZygpO1xuICAgICAgICBjb25zdCBzdGFydFJlc3BvbnNlID0gYXdhaXQgaHR0cEdldChzdGFydFVybCk7XG4gICAgICAgIC8vIFJlYWQgdGhlIHNpZ25vbiBmcmFnbWVudFxuICAgICAgICB0aGlzLl9ieXRlYnVmID0gQnl0ZUJ1ZmZlci53cmFwKHN0YXJ0UmVzcG9uc2UsIHRydWUpO1xuICAgICAgICB3aGlsZSAodGhpcy5fYnl0ZWJ1Zi5yZW1haW5pbmcoKSA+IDApIHtcbiAgICAgICAgICAgIHRoaXMuX3JlYWRDb21tYW5kKCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gS2VlcCByZWFkaW5nIGZyYWdtZW50cyB1bnRpbCB3ZSBydW4gb3V0XG4gICAgICAgIGxldCBmcmFnbWVudCA9IHN5bmNEdG8uZnJhZ21lbnQgfCAwO1xuICAgICAgICBsZXQgZnJhZ21lbnRUeXBlID0gXCJmdWxsXCI7XG4gICAgICAgIHdoaWxlICghdGhpcy5faGFzRW5kZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGZyYWdtZW50VXJsID0gbmV3IHVybF8xLlVSTChgJHtmcmFnbWVudH0vJHtmcmFnbWVudFR5cGV9YCwgdXJsKS50b1N0cmluZygpO1xuICAgICAgICAgICAgbGV0IGZyYWdtZW50UmVzcG9uc2U7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGZyYWdtZW50UmVzcG9uc2UgPSBhd2FpdCBodHRwR2V0KGZyYWdtZW50VXJsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIHtcbiAgICAgICAgICAgICAgICAvLyBIVFRQIDQwNCBlcnJvcnMgYXJlIGV4cGVjdGVkIC0gZWFjaCBmcmFnbWVudCBvbmx5IGxhc3RzIGZvciBhIGZldyBzZWNvbmRzLlxuICAgICAgICAgICAgICAgIC8vIFdhaXQgZm9yIDEtMiBzZWNzIGJlZm9yZSByZXRyeWluZyB0byBhdm9pZCBzcGFtbWluZyB0aGUgcmVsYXkuXG4gICAgICAgICAgICAgICAgYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIDEwMDAgKyBNYXRoLnJhbmRvbSgpICogMTAwMCkpO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gV2UgbmVlZCB0byByZXF1ZXN0IHtmcmFnbWVudH0vZnVsbCArIHtmcmFnbWVudH0vZGVsdGFcbiAgICAgICAgICAgIGlmIChmcmFnbWVudFR5cGUgPT0gXCJmdWxsXCIpIHtcbiAgICAgICAgICAgICAgICBmcmFnbWVudFR5cGUgPSBcImRlbHRhXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBmcmFnbWVudCArPSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fYnl0ZWJ1ZiA9IEJ5dGVCdWZmZXIud3JhcChmcmFnbWVudFJlc3BvbnNlLCB0cnVlKTtcbiAgICAgICAgICAgIHdoaWxlICh0aGlzLl9ieXRlYnVmLnJlbWFpbmluZygpID4gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3JlYWRDb21tYW5kKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcGFyc2VTdHJlYW0oc3RyZWFtKSB7XG4gICAgICAgIHRoaXMuX2hhc0VuZGVkID0gZmFsc2U7XG4gICAgICAgIGNvbnN0IG9uUmVjZWl2ZUNodW5rID0gKGNodW5rKSA9PiB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LWNvbmRpdGlvblxuICAgICAgICAgICAgaWYgKHRoaXMuX2J5dGVidWYgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2J5dGVidWYgPSBCeXRlQnVmZmVyLndyYXAoY2h1bmssIHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fY2h1bmtzLnB1c2goY2h1bmspO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBjb25zdCByZWFkUGFja2V0Q2h1bmsgPSAoKSA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIC8vIEtlZXAgcmVhZGluZyB1bnRpbCB3ZSBjYW4ndCByZWFkIGFueSBtb3JlXG4gICAgICAgICAgICAgICAgd2hpbGUgKHRoaXMuX2J5dGVidWYucmVtYWluaW5nKCkgPiAwIHx8IHRoaXMuX2NodW5rcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2J5dGVidWYubWFyaygpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9yZWFkQ29tbWFuZCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBSYW5nZUVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFJlc2V0IHRoZSBieXRlIGJ1ZmZlciB0byB0aGUgc3RhcnQgb2YgdGhlIGxhc3QgY29tbWFuZFxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9ieXRlYnVmLm9mZnNldCA9IE1hdGgubWF4KDAsIHRoaXMuX2J5dGVidWYubWFya2VkT2Zmc2V0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5vZmYoXCJkYXRhXCIsIG9uUmVjZWl2ZUNodW5rKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBlIGluc3RhbmNlb2YgRXJyb3JcbiAgICAgICAgICAgICAgICAgICAgICAgID8gZVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBuZXcgRXJyb3IoYEV4Y2VwdGlvbiBkdXJpbmcgcGFyc2luZzogJHtlfWApO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9lbWl0RW5kKHsgZXJyb3IsIGluY29tcGxldGU6IGZhbHNlIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgcmVhZEhlYWRlckNodW5rID0gKCkgPT4ge1xuICAgICAgICAgICAgLy8gV2FpdCBmb3IgZW5vdWdoIGJ5dGVzIGZvciB1cyB0byByZWFkIHRoZSBoZWFkZXJcbiAgICAgICAgICAgIGlmICghdGhpcy5fdHJ5RW5zdXJlUmVtYWluaW5nKDEwNzIpKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIC8vIE9uY2Ugd2UndmUgcmVhZCB0aGUgaGVhZGVyLCByZW1vdmUgdGhpcyBoYW5kbGVyXG4gICAgICAgICAgICBzdHJlYW0ub2ZmKFwiZGF0YVwiLCByZWFkSGVhZGVyQ2h1bmspO1xuICAgICAgICAgICAgY29uc3QgY2FuY2VsbGVkID0gdGhpcy5fcGFyc2VIZWFkZXIoKTtcbiAgICAgICAgICAgIGlmICghY2FuY2VsbGVkKVxuICAgICAgICAgICAgICAgIHN0cmVhbS5vbihcImRhdGFcIiwgcmVhZFBhY2tldENodW5rKTtcbiAgICAgICAgfTtcbiAgICAgICAgc3RyZWFtLm9uKFwiZGF0YVwiLCBvblJlY2VpdmVDaHVuayk7XG4gICAgICAgIHN0cmVhbS5vbihcImRhdGFcIiwgcmVhZEhlYWRlckNodW5rKTtcbiAgICAgICAgc3RyZWFtLm9uKFwiZXJyb3JcIiwgZSA9PiB7XG4gICAgICAgICAgICBzdHJlYW0ub2ZmKFwiZGF0YVwiLCBvblJlY2VpdmVDaHVuayk7XG4gICAgICAgICAgICB0aGlzLl9lbWl0RW5kKHsgZXJyb3I6IGUsIGluY29tcGxldGU6IGZhbHNlIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgc3RyZWFtLm9uKFwiZW5kXCIsICgpID0+IHtcbiAgICAgICAgICAgIHZhciBfYTtcbiAgICAgICAgICAgIGNvbnN0IGZ1bGx5Q29uc3VtZWQgPSBcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktY29uZGl0aW9uXG4gICAgICAgICAgICAoKF9hID0gdGhpcy5fYnl0ZWJ1ZikgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnJlbWFpbmluZygpKSA9PT0gMCAmJiB0aGlzLl9jaHVua3MubGVuZ3RoID09PSAwO1xuICAgICAgICAgICAgaWYgKGZ1bGx5Q29uc3VtZWQpXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgdGhpcy5fZW1pdEVuZCh7IGluY29tcGxldGU6IHRydWUgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBwYXJzZShidWZmZXIpIHtcbiAgICAgICAgdGhpcy5faGFzRW5kZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fYnl0ZWJ1ZiA9IEJ5dGVCdWZmZXIud3JhcChidWZmZXIsIHRydWUpO1xuICAgICAgICBjb25zdCBjYW5jZWxsZWQgPSB0aGlzLl9wYXJzZUhlYWRlcigpO1xuICAgICAgICBpZiAoIWNhbmNlbGxlZClcbiAgICAgICAgICAgIHRpbWVycy5zZXRUaW1lb3V0KHRoaXMuX3BhcnNlUmVjdXJzZS5iaW5kKHRoaXMpLCAwKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2FuY2VsIHRoZSBjdXJyZW50IHBhcnNlIG9wZXJhdGlvbi5cbiAgICAgKi9cbiAgICBjYW5jZWwoKSB7XG4gICAgICAgIGlmICh0aGlzLl9pbW1lZGlhdGVUaW1lclRva2VuKSB7XG4gICAgICAgICAgICB0aW1lcnMuY2xlYXJJbW1lZGlhdGUodGhpcy5faW1tZWRpYXRlVGltZXJUb2tlbik7XG4gICAgICAgICAgICB0aGlzLl9pbW1lZGlhdGVUaW1lclRva2VuID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fdGltZW91dFRpbWVyVG9rZW4pIHtcbiAgICAgICAgICAgIHRpbWVycy5jbGVhclRpbWVvdXQodGhpcy5fdGltZW91dFRpbWVyVG9rZW4pO1xuICAgICAgICAgICAgdGhpcy5fdGltZW91dFRpbWVyVG9rZW4gPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldCBlbmNyeXB0aW9uIGtleSBmb3IgZGVjcnlwdGluZyBgc3ZjX0VuY3J5cHRlZERhdGFgIHBhY2tldHMuXG4gICAgICogVGhpcyBhbGxvd3MgZGVjcnlwdGlvbiBvZiBtZXNzYWdlcyBmcm9tIHB1YmxpYyBtYXRjaG1ha2luZywgbGlrZVxuICAgICAqIGNoYXQgbWVzc2FnZXMgYW5kIGNhc3RlciB2b2ljZSBkYXRhLlxuICAgICAqXG4gICAgICogVGhlIGtleSBjYW4gYmUgZXh0cmFjdGVkIGZyb20gYG1hdGNoNzMwXyouZGVtLmluZm9gIGZpbGVzIHdpdGggYGV4dHJhY3RQdWJsaWNFbmNyeXB0aW9uS2V5YC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBwdWJsaWNLZXkgUHVibGljIGVuY3J5cHRpb24ga2V5LlxuICAgICAqL1xuICAgIHNldEVuY3J5cHRpb25LZXkocHVibGljS2V5KSB7XG4gICAgICAgIGlmIChwdWJsaWNLZXkgIT0gbnVsbCAmJiBwdWJsaWNLZXkubGVuZ3RoICE9PSAxNikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBQdWJsaWMga2V5IG11c3QgYmUgMTYgYnl0ZXMgbG9uZywgZ290ICR7cHVibGljS2V5Lmxlbmd0aH0gYnl0ZXMgaW5zdGVhZGApO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2VuY3J5cHRpb25LZXkgPSBwdWJsaWNLZXk7XG4gICAgfVxuICAgIF9lbWl0RW5kKGUpIHtcbiAgICAgICAgaWYgKHRoaXMuX2hhc0VuZGVkKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBpZiAoZS5lcnJvcikge1xuICAgICAgICAgICAgdGhpcy5lbWl0KFwiZXJyb3JcIiwgZS5lcnJvcik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5lbWl0KFwiZW5kXCIsIGUpO1xuICAgICAgICB0aGlzLl9oYXNFbmRlZCA9IHRydWU7XG4gICAgfVxuICAgIF9wYXJzZUhlYWRlcigpIHtcbiAgICAgICAgdGhpcy5oZWFkZXIgPSBwYXJzZUhlYWRlckJ5dGVidWYodGhpcy5fYnl0ZWJ1Zik7XG4gICAgICAgIC8vICM2NTogU29tZSBkZW1vcyBhcmUgbWlzc2luZyBwbGF5YmFja1RpY2tzIGZyb20gdGhlIGhlYWRlclxuICAgICAgICBpZiAodGhpcy5oZWFkZXIucGxheWJhY2tUaWNrcyA+IDApIHtcbiAgICAgICAgICAgIHRoaXMudGlja0ludGVydmFsID0gdGhpcy5oZWFkZXIucGxheWJhY2tUaW1lIC8gdGhpcy5oZWFkZXIucGxheWJhY2tUaWNrcztcbiAgICAgICAgfVxuICAgICAgICAvLyBJZiB0aGlzIGlzIGEgUE9WIGRlbW8sIHRyeSB0byBmaWd1cmUgb3V0IHdobyB0aGUgcmVjb3JkaW5nIHBsYXllciBpc1xuICAgICAgICBpZiAodGhpcy5oZWFkZXIuY2xpZW50TmFtZSAhPT0gXCJHT1RWIERlbW9cIikge1xuICAgICAgICAgICAgdGhpcy5zdHJpbmdUYWJsZXMub24oXCJ1cGRhdGVcIiwgdGhpcy5faGFuZGxlU3RyaW5nVGFibGVVcGRhdGUuYmluZCh0aGlzKSk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGNhbmNlbGxlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmVtaXQoXCJzdGFydFwiLCB7XG4gICAgICAgICAgICBjYW5jZWw6ICgpID0+IHtcbiAgICAgICAgICAgICAgICBjYW5jZWxsZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGNhbmNlbGxlZDtcbiAgICB9XG4gICAgX3JlYWRJQnl0ZXMoKSB7XG4gICAgICAgIHRoaXMuX2Vuc3VyZVJlbWFpbmluZyg0KTtcbiAgICAgICAgY29uc3QgbGVuZ3RoID0gdGhpcy5fYnl0ZWJ1Zi5yZWFkSW50MzIoKTtcbiAgICAgICAgdGhpcy5fZW5zdXJlUmVtYWluaW5nKGxlbmd0aCk7XG4gICAgICAgIHJldHVybiB0aGlzLl9ieXRlYnVmLnJlYWRCeXRlcyhsZW5ndGgpO1xuICAgIH1cbiAgICBfaGFuZGxlRW5jcnlwdGVkRGF0YShtc2cpIHtcbiAgICAgICAgaWYgKG1zZy5rZXlUeXBlICE9PSAyIHx8IHRoaXMuX2VuY3J5cHRpb25LZXkgPT0gbnVsbClcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICBjb25zdCBrZXkgPSBuZXcgaWNla2V5XzEuSWNlS2V5KDIpO1xuICAgICAgICBrZXkuc2V0KHRoaXMuX2VuY3J5cHRpb25LZXkpO1xuICAgICAgICBhc3NlcnQobXNnLmVuY3J5cHRlZC5sZW5ndGggJSBrZXkuYmxvY2tTaXplKCkgPT09IDApO1xuICAgICAgICBjb25zdCBwbGFpblRleHQgPSBuZXcgVWludDhBcnJheShtc2cuZW5jcnlwdGVkLmxlbmd0aCk7XG4gICAgICAgIGtleS5kZWNyeXB0VWludDhBcnJheShtc2cuZW5jcnlwdGVkLCBwbGFpblRleHQpO1xuICAgICAgICAvLyBDcmVhdGUgYSBCeXRlQnVmZmVyIHNraXBwZWQgcGFzdCB0aGUgcGFkZGluZ1xuICAgICAgICBjb25zdCBidWYgPSBCeXRlQnVmZmVyLndyYXAocGxhaW5UZXh0LCB0cnVlKTtcbiAgICAgICAgY29uc3QgcGFkZGluZ0J5dGVzID0gYnVmLnJlYWRVaW50OCgpO1xuICAgICAgICBpZiAocGFkZGluZ0J5dGVzICsgNCA+IGJ1Zi5yZW1haW5pbmcoKSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgYnVmLnNraXAocGFkZGluZ0J5dGVzKTtcbiAgICAgICAgLy8gRm9yIHNvbWUgcmVhc29uLCB0aGUgc2l6ZSBpcyBlbmNvZGVkIGFzIGFuIGludDMyLCB0aGVuIGFzIGEgdmFyaW50MzJcbiAgICAgICAgYnVmLkJFKCk7XG4gICAgICAgIGNvbnN0IGJ5dGVzV3JpdHRlbiA9IGJ1Zi5yZWFkSW50MzIoKTtcbiAgICAgICAgYnVmLkxFKCk7XG4gICAgICAgIGlmIChidWYucmVtYWluaW5nKCkgIT09IGJ5dGVzV3JpdHRlbilcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgY29uc3QgY21kID0gYnVmLnJlYWRWYXJpbnQzMigpO1xuICAgICAgICBjb25zdCBzaXplID0gYnVmLnJlYWRWYXJpbnQzMigpO1xuICAgICAgICBpZiAoYnVmLnJlbWFpbmluZygpICE9PSBzaXplKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gbmV0LmZpbmRCeVR5cGUoY21kKTtcbiAgICAgICAgYXNzZXJ0KG1lc3NhZ2UgIT0gbnVsbCwgYE5vIG1lc3NhZ2UgaGFuZGxlciBmb3IgJHtjbWR9YCk7XG4gICAgICAgIGlmICh0aGlzLmxpc3RlbmVyQ291bnQobWVzc2FnZS5uYW1lKSkge1xuICAgICAgICAgICAgY29uc3QgbXNnSW5zdCA9IG1lc3NhZ2UuY2xhc3MuZGVjb2RlKG5ldyBVaW50OEFycmF5KGJ1Zi50b0J1ZmZlcigpKSk7XG4gICAgICAgICAgICB0aGlzLmVtaXQobWVzc2FnZS5uYW1lLCBtc2dJbnN0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgX2hhbmRsZVN0cmluZ1RhYmxlVXBkYXRlKHVwZGF0ZSkge1xuICAgICAgICBpZiAodGhpcy5yZWNvcmRpbmdDbGllbnRTbG90ICE9IG51bGwpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGlmICh1cGRhdGUudGFibGUubmFtZSA9PT0gXCJ1c2VyaW5mb1wiICYmIHVwZGF0ZS51c2VyRGF0YSAhPSBudWxsKSB7XG4gICAgICAgICAgICBjb25zdCBwbGF5ZXJJbmZvID0gdXBkYXRlLnVzZXJEYXRhO1xuICAgICAgICAgICAgaWYgKHBsYXllckluZm8ubmFtZSA9PT0gdGhpcy5oZWFkZXIuY2xpZW50TmFtZSkge1xuICAgICAgICAgICAgICAgIHRoaXMucmVjb3JkaW5nQ2xpZW50U2xvdCA9IHVwZGF0ZS5lbnRyeUluZGV4O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEZpcmVkIHdoZW4gYSBwYWNrZXQgb2YgdGhpcyB0eXBlIGlzIGhpdC4gYHN2Y19NZXNzYWdlTmFtZWAgZXZlbnRzIGFyZSBhbHNvIGZpcmVkLlxuICAgICAqIEBwdWJsaWNcbiAgICAgKiBAZXZlbnQgRGVtb0ZpbGUjbmV0X01lc3NhZ2VOYW1lXG4gICAgICovXG4gICAgX2hhbmRsZURlbW9QYWNrZXQoKSB7XG4gICAgICAgIGlmICghdGhpcy5faXNCcm9hZGNhc3RGcmFnbWVudCkge1xuICAgICAgICAgICAgdGhpcy5fZW5zdXJlUmVtYWluaW5nKDE2MCk7XG4gICAgICAgICAgICAvLyBza2lwIGNtZCBpbmZvXG4gICAgICAgICAgICB0aGlzLl9ieXRlYnVmLnNraXAoMTUyKTtcbiAgICAgICAgICAgIC8vIHNraXAgb3ZlciBzZXF1ZW5jZSBpbmZvXG4gICAgICAgICAgICB0aGlzLl9ieXRlYnVmLnJlYWRJbnQzMigpO1xuICAgICAgICAgICAgdGhpcy5fYnl0ZWJ1Zi5yZWFkSW50MzIoKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjaHVuayA9IHRoaXMuX3JlYWRJQnl0ZXMoKTtcbiAgICAgICAgd2hpbGUgKGNodW5rLnJlbWFpbmluZygpKSB7XG4gICAgICAgICAgICBjb25zdCBjbWQgPSBjaHVuay5yZWFkVmFyaW50MzIoKTtcbiAgICAgICAgICAgIGNvbnN0IHNpemUgPSBjaHVuay5yZWFkVmFyaW50MzIoKTtcbiAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBuZXQuZmluZEJ5VHlwZShjbWQpO1xuICAgICAgICAgICAgYXNzZXJ0KG1lc3NhZ2UgIT0gbnVsbCwgYE5vIG1lc3NhZ2UgaGFuZGxlciBmb3IgJHtjbWR9YCk7XG4gICAgICAgICAgICBpZiAodGhpcy5saXN0ZW5lckNvdW50KG1lc3NhZ2UubmFtZSkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBtZXNzYWdlQnVmZmVyID0gY2h1bmsucmVhZEJ5dGVzKHNpemUpO1xuICAgICAgICAgICAgICAgIGNvbnN0IG1zZ0luc3QgPSBtZXNzYWdlLmNsYXNzLmRlY29kZShuZXcgVWludDhBcnJheShtZXNzYWdlQnVmZmVyLnRvQnVmZmVyKCkpKTtcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXQobWVzc2FnZS5uYW1lLCBtc2dJbnN0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNodW5rLnNraXAoc2l6ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgX2hhbmRsZURhdGFDaHVuaygpIHtcbiAgICAgICAgdGhpcy5fcmVhZElCeXRlcygpO1xuICAgIH1cbiAgICBfaGFuZGxlRGF0YVRhYmxlcygpIHtcbiAgICAgICAgY29uc3QgY2h1bmsgPSB0aGlzLl9pc0Jyb2FkY2FzdEZyYWdtZW50XG4gICAgICAgICAgICA/IHRoaXMuX2J5dGVidWZcbiAgICAgICAgICAgIDogdGhpcy5fcmVhZElCeXRlcygpO1xuICAgICAgICB0aGlzLmVudGl0aWVzLmhhbmRsZURhdGFUYWJsZXMoY2h1bmspO1xuICAgIH1cbiAgICBfaGFuZGxlVXNlckNtZCgpIHtcbiAgICAgICAgdGhpcy5fZW5zdXJlUmVtYWluaW5nKDQpO1xuICAgICAgICB0aGlzLl9ieXRlYnVmLnJlYWRJbnQzMigpOyAvLyBvdXRnb2luZyBzZXF1ZW5jZVxuICAgICAgICBjb25zdCBjaHVuayA9IHRoaXMuX3JlYWRJQnl0ZXMoKTtcbiAgICAgICAgLy8gSWYgbm9ib2R5J3MgbGlzdGVuaW5nLCBkb24ndCB3YXN0ZSBjeWNsZXMgZGVjb2RpbmcgaXRcbiAgICAgICAgaWYgKCF0aGlzLmxpc3RlbmVyQ291bnQoXCJ1c2VyY21kXCIpKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBjb25zdCBiaXRidWYgPSBiaXRidWZmZXJfMS5CaXRTdHJlYW0uZnJvbShjaHVuay5idWZmZXIuc2xpY2UoY2h1bmsub2Zmc2V0LCBjaHVuay5saW1pdCkpO1xuICAgICAgICBjb25zdCBtb3ZlID0ge1xuICAgICAgICAgICAgY29tbWFuZE51bWJlcjogMCxcbiAgICAgICAgICAgIHRpY2tDb3VudDogMCxcbiAgICAgICAgICAgIHZpZXdBbmdsZXM6IHsgeDogMCwgeTogMCwgejogMCB9LFxuICAgICAgICAgICAgYWltRGlyZWN0aW9uOiB7IHg6IDAsIHk6IDAsIHo6IDAgfSxcbiAgICAgICAgICAgIGZvcndhcmRNb3ZlOiAwLFxuICAgICAgICAgICAgc2lkZU1vdmU6IDAsXG4gICAgICAgICAgICB1cE1vdmU6IDAsXG4gICAgICAgICAgICBidXR0b25zOiBuZXcgQXJyYXkoKSxcbiAgICAgICAgICAgIGltcHVsc2U6IDAsXG4gICAgICAgICAgICB3ZWFwb25TZWxlY3Q6IDAsXG4gICAgICAgICAgICB3ZWFwb25TdWJUeXBlOiAwLFxuICAgICAgICAgICAgcmFuZG9tU2VlZDogMCxcbiAgICAgICAgICAgIG1vdXNlRGVsdGFYOiAwLFxuICAgICAgICAgICAgbW91c2VEZWx0YVk6IDBcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKGJpdGJ1Zi5yZWFkT25lQml0KCkpIHtcbiAgICAgICAgICAgIG1vdmUuY29tbWFuZE51bWJlciA9IGJpdGJ1Zi5yZWFkVUludDMyKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBtb3ZlLmNvbW1hbmROdW1iZXIgPSAxO1xuICAgICAgICB9XG4gICAgICAgIGlmIChiaXRidWYucmVhZE9uZUJpdCgpKSB7XG4gICAgICAgICAgICBtb3ZlLnRpY2tDb3VudCA9IGJpdGJ1Zi5yZWFkVUludDMyKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBtb3ZlLnRpY2tDb3VudCA9IDE7XG4gICAgICAgIH1cbiAgICAgICAgLy8gUmVhZCBkaXJlY3Rpb25cbiAgICAgICAgaWYgKGJpdGJ1Zi5yZWFkT25lQml0KCkpXG4gICAgICAgICAgICBtb3ZlLnZpZXdBbmdsZXMueCA9IGJpdGJ1Zi5yZWFkRmxvYXQzMigpO1xuICAgICAgICBpZiAoYml0YnVmLnJlYWRPbmVCaXQoKSlcbiAgICAgICAgICAgIG1vdmUudmlld0FuZ2xlcy55ID0gYml0YnVmLnJlYWRGbG9hdDMyKCk7XG4gICAgICAgIGlmIChiaXRidWYucmVhZE9uZUJpdCgpKVxuICAgICAgICAgICAgbW92ZS52aWV3QW5nbGVzLnogPSBiaXRidWYucmVhZEZsb2F0MzIoKTtcbiAgICAgICAgLy8gUmVhZCBhaW0gZGlyZWN0aW9uXG4gICAgICAgIGlmIChiaXRidWYucmVhZE9uZUJpdCgpKVxuICAgICAgICAgICAgbW92ZS5haW1EaXJlY3Rpb24ueCA9IGJpdGJ1Zi5yZWFkRmxvYXQzMigpO1xuICAgICAgICBpZiAoYml0YnVmLnJlYWRPbmVCaXQoKSlcbiAgICAgICAgICAgIG1vdmUuYWltRGlyZWN0aW9uLnkgPSBiaXRidWYucmVhZEZsb2F0MzIoKTtcbiAgICAgICAgaWYgKGJpdGJ1Zi5yZWFkT25lQml0KCkpXG4gICAgICAgICAgICBtb3ZlLmFpbURpcmVjdGlvbi56ID0gYml0YnVmLnJlYWRGbG9hdDMyKCk7XG4gICAgICAgIC8vIFJlYWQgbW92ZW1lbnRcbiAgICAgICAgaWYgKGJpdGJ1Zi5yZWFkT25lQml0KCkpXG4gICAgICAgICAgICBtb3ZlLmZvcndhcmRNb3ZlID0gYml0YnVmLnJlYWRGbG9hdDMyKCk7XG4gICAgICAgIGlmIChiaXRidWYucmVhZE9uZUJpdCgpKVxuICAgICAgICAgICAgbW92ZS5zaWRlTW92ZSA9IGJpdGJ1Zi5yZWFkRmxvYXQzMigpO1xuICAgICAgICBpZiAoYml0YnVmLnJlYWRPbmVCaXQoKSlcbiAgICAgICAgICAgIG1vdmUudXBNb3ZlID0gYml0YnVmLnJlYWRGbG9hdDMyKCk7XG4gICAgICAgIGlmIChiaXRidWYucmVhZE9uZUJpdCgpKSB7XG4gICAgICAgICAgICBjb25zdCBidXR0b25zID0gYml0YnVmLnJlYWRVSW50MzIoKTtcbiAgICAgICAgICAgIGlmIChidXR0b25zICYgKDEgPDwgMCkpXG4gICAgICAgICAgICAgICAgbW92ZS5idXR0b25zLnB1c2goXCJhdHRhY2tcIik7XG4gICAgICAgICAgICBpZiAoYnV0dG9ucyAmICgxIDw8IDEpKVxuICAgICAgICAgICAgICAgIG1vdmUuYnV0dG9ucy5wdXNoKFwianVtcFwiKTtcbiAgICAgICAgICAgIGlmIChidXR0b25zICYgKDEgPDwgMikpXG4gICAgICAgICAgICAgICAgbW92ZS5idXR0b25zLnB1c2goXCJkdWNrXCIpO1xuICAgICAgICAgICAgaWYgKGJ1dHRvbnMgJiAoMSA8PCAzKSlcbiAgICAgICAgICAgICAgICBtb3ZlLmJ1dHRvbnMucHVzaChcImZvcndhcmRcIik7XG4gICAgICAgICAgICBpZiAoYnV0dG9ucyAmICgxIDw8IDQpKVxuICAgICAgICAgICAgICAgIG1vdmUuYnV0dG9ucy5wdXNoKFwiYmFja1wiKTtcbiAgICAgICAgICAgIGlmIChidXR0b25zICYgKDEgPDwgNSkpXG4gICAgICAgICAgICAgICAgbW92ZS5idXR0b25zLnB1c2goXCJ1c2VcIik7XG4gICAgICAgICAgICBpZiAoYnV0dG9ucyAmICgxIDw8IDYpKVxuICAgICAgICAgICAgICAgIG1vdmUuYnV0dG9ucy5wdXNoKFwiY2FuY2VsXCIpO1xuICAgICAgICAgICAgaWYgKGJ1dHRvbnMgJiAoMSA8PCA3KSlcbiAgICAgICAgICAgICAgICBtb3ZlLmJ1dHRvbnMucHVzaChcImxlZnRcIik7XG4gICAgICAgICAgICBpZiAoYnV0dG9ucyAmICgxIDw8IDgpKVxuICAgICAgICAgICAgICAgIG1vdmUuYnV0dG9ucy5wdXNoKFwicmlnaHRcIik7XG4gICAgICAgICAgICBpZiAoYnV0dG9ucyAmICgxIDw8IDkpKVxuICAgICAgICAgICAgICAgIG1vdmUuYnV0dG9ucy5wdXNoKFwibW92ZWxlZnRcIik7XG4gICAgICAgICAgICBpZiAoYnV0dG9ucyAmICgxIDw8IDEwKSlcbiAgICAgICAgICAgICAgICBtb3ZlLmJ1dHRvbnMucHVzaChcIm1vdmVyaWdodFwiKTtcbiAgICAgICAgICAgIGlmIChidXR0b25zICYgKDEgPDwgMTEpKVxuICAgICAgICAgICAgICAgIG1vdmUuYnV0dG9ucy5wdXNoKFwiYXR0YWNrMlwiKTtcbiAgICAgICAgICAgIGlmIChidXR0b25zICYgKDEgPDwgMTIpKVxuICAgICAgICAgICAgICAgIG1vdmUuYnV0dG9ucy5wdXNoKFwicnVuXCIpO1xuICAgICAgICAgICAgaWYgKGJ1dHRvbnMgJiAoMSA8PCAxMykpXG4gICAgICAgICAgICAgICAgbW92ZS5idXR0b25zLnB1c2goXCJyZWxvYWRcIik7XG4gICAgICAgICAgICBpZiAoYnV0dG9ucyAmICgxIDw8IDE0KSlcbiAgICAgICAgICAgICAgICBtb3ZlLmJ1dHRvbnMucHVzaChcImFsdDFcIik7XG4gICAgICAgICAgICBpZiAoYnV0dG9ucyAmICgxIDw8IDE1KSlcbiAgICAgICAgICAgICAgICBtb3ZlLmJ1dHRvbnMucHVzaChcImFsdDJcIik7XG4gICAgICAgICAgICBpZiAoYnV0dG9ucyAmICgxIDw8IDE2KSlcbiAgICAgICAgICAgICAgICBtb3ZlLmJ1dHRvbnMucHVzaChcInNjb3JlXCIpO1xuICAgICAgICAgICAgaWYgKGJ1dHRvbnMgJiAoMSA8PCAxNykpXG4gICAgICAgICAgICAgICAgbW92ZS5idXR0b25zLnB1c2goXCJzcGVlZFwiKTtcbiAgICAgICAgICAgIGlmIChidXR0b25zICYgKDEgPDwgMTgpKVxuICAgICAgICAgICAgICAgIG1vdmUuYnV0dG9ucy5wdXNoKFwid2Fsa1wiKTtcbiAgICAgICAgICAgIGlmIChidXR0b25zICYgKDEgPDwgMTkpKVxuICAgICAgICAgICAgICAgIG1vdmUuYnV0dG9ucy5wdXNoKFwiem9vbVwiKTtcbiAgICAgICAgICAgIGlmIChidXR0b25zICYgKDEgPDwgMjApKVxuICAgICAgICAgICAgICAgIG1vdmUuYnV0dG9ucy5wdXNoKFwid2VhcG9uMVwiKTtcbiAgICAgICAgICAgIGlmIChidXR0b25zICYgKDEgPDwgMjEpKVxuICAgICAgICAgICAgICAgIG1vdmUuYnV0dG9ucy5wdXNoKFwid2VhcG9uMlwiKTtcbiAgICAgICAgICAgIGlmIChidXR0b25zICYgKDEgPDwgMjIpKVxuICAgICAgICAgICAgICAgIG1vdmUuYnV0dG9ucy5wdXNoKFwiYnVsbHJ1c2hcIik7XG4gICAgICAgICAgICBpZiAoYnV0dG9ucyAmICgxIDw8IDIzKSlcbiAgICAgICAgICAgICAgICBtb3ZlLmJ1dHRvbnMucHVzaChcImdyZW5hZGUxXCIpO1xuICAgICAgICAgICAgaWYgKGJ1dHRvbnMgJiAoMSA8PCAyNCkpXG4gICAgICAgICAgICAgICAgbW92ZS5idXR0b25zLnB1c2goXCJncmVuYWRlMlwiKTtcbiAgICAgICAgICAgIGlmIChidXR0b25zICYgKDEgPDwgMjUpKVxuICAgICAgICAgICAgICAgIG1vdmUuYnV0dG9ucy5wdXNoKFwibG9va3NwaW5cIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGJpdGJ1Zi5yZWFkT25lQml0KCkpXG4gICAgICAgICAgICBtb3ZlLmltcHVsc2UgPSBiaXRidWYucmVhZFVJbnQ4KCk7XG4gICAgICAgIGlmIChiaXRidWYucmVhZE9uZUJpdCgpKSB7XG4gICAgICAgICAgICBtb3ZlLndlYXBvblNlbGVjdCA9IGJpdGJ1Zi5yZWFkVUJpdHMoY29uc3RzXzEuTUFYX0VESUNUX0JJVFMpO1xuICAgICAgICAgICAgaWYgKGJpdGJ1Zi5yZWFkT25lQml0KCkpXG4gICAgICAgICAgICAgICAgbW92ZS53ZWFwb25TdWJUeXBlID0gYml0YnVmLnJlYWRVQml0cyg2KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYml0YnVmLnJlYWRPbmVCaXQoKSlcbiAgICAgICAgICAgIG1vdmUubW91c2VEZWx0YVggPSBiaXRidWYucmVhZEludDE2KCk7XG4gICAgICAgIGlmIChiaXRidWYucmVhZE9uZUJpdCgpKVxuICAgICAgICAgICAgbW92ZS5tb3VzZURlbHRhWSA9IGJpdGJ1Zi5yZWFkSW50MTYoKTtcbiAgICAgICAgdGhpcy5lbWl0KFwidXNlcmNtZFwiLCBtb3ZlKTtcbiAgICB9XG4gICAgX2hhbmRsZVN0cmluZ1RhYmxlcygpIHtcbiAgICAgICAgY29uc3QgY2h1bmsgPSB0aGlzLl9yZWFkSUJ5dGVzKCk7XG4gICAgICAgIGNvbnN0IGJpdGJ1ZiA9IGJpdGJ1ZmZlcl8xLkJpdFN0cmVhbS5mcm9tKGNodW5rLmJ1ZmZlci5zbGljZShjaHVuay5vZmZzZXQsIGNodW5rLmxpbWl0KSk7XG4gICAgICAgIHRoaXMuc3RyaW5nVGFibGVzLmhhbmRsZVN0cmluZ1RhYmxlcyhiaXRidWYpO1xuICAgIH1cbiAgICBfdHJ5RW5zdXJlUmVtYWluaW5nKGJ5dGVzKSB7XG4gICAgICAgIGNvbnN0IHJlbWFpbmluZyA9IHRoaXMuX2J5dGVidWYucmVtYWluaW5nKCk7XG4gICAgICAgIGlmIChyZW1haW5pbmcgPj0gYnl0ZXMpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgbGV0IGxlZnQgPSBieXRlcyAtIHJlbWFpbmluZztcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl9jaHVua3MubGVuZ3RoICYmIGxlZnQgPiAwOyArK2kpXG4gICAgICAgICAgICBsZWZ0IC09IHRoaXMuX2NodW5rc1tpXS5sZW5ndGg7XG4gICAgICAgIC8vIFdlIGRvbid0IGhhdmUgZW5vdWdoIGJ5dGVzIHdpdGggd2hhdCB3ZSBoYXZlIGJ1ZmZlcmVkIHVwXG4gICAgICAgIGlmIChsZWZ0ID4gMClcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgY29uc3QgbWFyayA9IE1hdGgubWF4KDAsIHRoaXMuX2J5dGVidWYubWFya2VkT2Zmc2V0KTtcbiAgICAgICAgY29uc3QgbmV3T2Zmc2V0ID0gdGhpcy5fYnl0ZWJ1Zi5vZmZzZXQgLSBtYXJrO1xuICAgICAgICAvLyBSZXNldCB0byB0aGUgbWFya2VkIG9mZnNldC4gV2UncmUgbmV2ZXIgZ29pbmcgdG8gbmVlZCB0aGUgYnl0ZXMgcHJlY2VkaW5nIGl0XG4gICAgICAgIHRoaXMuX2J5dGVidWYub2Zmc2V0ID0gbWFyaztcbiAgICAgICAgdGhpcy5fYnl0ZWJ1ZiA9IEJ5dGVCdWZmZXIud3JhcChCdWZmZXIuY29uY2F0KFtcbiAgICAgICAgICAgIG5ldyBVaW50OEFycmF5KHRoaXMuX2J5dGVidWYudG9CdWZmZXIoKSksXG4gICAgICAgICAgICAuLi50aGlzLl9jaHVua3NcbiAgICAgICAgXSksIHRydWUpO1xuICAgICAgICB0aGlzLl9jaHVua3MgPSBbXTtcbiAgICAgICAgLy8gQWR2YW5jZSB0byB0aGUgcG9pbnQgd2UnZCBhbHJlYWR5IHJlYWQgdXAgdG9cbiAgICAgICAgdGhpcy5fYnl0ZWJ1Zi5vZmZzZXQgPSBuZXdPZmZzZXQ7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBfZW5zdXJlUmVtYWluaW5nKGJ5dGVzKSB7XG4gICAgICAgIGlmICghdGhpcy5fdHJ5RW5zdXJlUmVtYWluaW5nKGJ5dGVzKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoYE5vdCBlbm91Z2ggZGF0YSB0byBjb250aW51ZSBwYXJzaW5nLiAke2J5dGVzfSBieXRlcyBuZWVkZWRgKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBfcmVhZENvbW1hbmQoKSB7XG4gICAgICAgIHRoaXMuX2Vuc3VyZVJlbWFpbmluZyg2KTtcbiAgICAgICAgY29uc3QgY29tbWFuZCA9IHRoaXMuX2J5dGVidWYucmVhZFVpbnQ4KCk7XG4gICAgICAgIGNvbnN0IHRpY2sgPSB0aGlzLl9ieXRlYnVmLnJlYWRJbnQzMigpO1xuICAgICAgICB0aGlzLnBsYXllclNsb3QgPSB0aGlzLl9ieXRlYnVmLnJlYWRVaW50OCgpO1xuICAgICAgICBpZiAodGljayAhPT0gdGhpcy5jdXJyZW50VGljaykge1xuICAgICAgICAgICAgdGhpcy5lbWl0KFwidGlja2VuZFwiLCB0aGlzLmN1cnJlbnRUaWNrKTtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFRpY2sgPSB0aWNrO1xuICAgICAgICAgICAgdGhpcy5lbWl0KFwidGlja3N0YXJ0XCIsIHRoaXMuY3VycmVudFRpY2spO1xuICAgICAgICB9XG4gICAgICAgIHN3aXRjaCAoY29tbWFuZCkge1xuICAgICAgICAgICAgY2FzZSAyIC8qIERlbW9Db21tYW5kcy5QYWNrZXQgKi86XG4gICAgICAgICAgICBjYXNlIDEgLyogRGVtb0NvbW1hbmRzLlNpZ25vbiAqLzpcbiAgICAgICAgICAgICAgICB0aGlzLl9oYW5kbGVEZW1vUGFja2V0KCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDYgLyogRGVtb0NvbW1hbmRzLkRhdGFUYWJsZXMgKi86XG4gICAgICAgICAgICAgICAgdGhpcy5faGFuZGxlRGF0YVRhYmxlcygpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSA5IC8qIERlbW9Db21tYW5kcy5TdHJpbmdUYWJsZXMgKi86XG4gICAgICAgICAgICAgICAgdGhpcy5faGFuZGxlU3RyaW5nVGFibGVzKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDQgLyogRGVtb0NvbW1hbmRzLkNvbnNvbGVDbWQgKi86IC8vIFRPRE9cbiAgICAgICAgICAgICAgICB0aGlzLl9oYW5kbGVEYXRhQ2h1bmsoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgNSAvKiBEZW1vQ29tbWFuZHMuVXNlckNtZCAqLzpcbiAgICAgICAgICAgICAgICB0aGlzLl9oYW5kbGVVc2VyQ21kKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDcgLyogRGVtb0NvbW1hbmRzLlN0b3AgKi86XG4gICAgICAgICAgICAgICAgdGhpcy5jYW5jZWwoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXQoXCJ0aWNrZW5kXCIsIHRoaXMuY3VycmVudFRpY2spO1xuICAgICAgICAgICAgICAgIHRoaXMuX2VtaXRFbmQoeyBpbmNvbXBsZXRlOiBmYWxzZSB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICBjYXNlIDggLyogRGVtb0NvbW1hbmRzLkN1c3RvbURhdGEgKi86XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ3VzdG9tIGRhdGEgbm90IHN1cHBvcnRlZFwiKTtcbiAgICAgICAgICAgIGNhc2UgMyAvKiBEZW1vQ29tbWFuZHMuU3luY1RpY2sgKi86XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5yZWNvZ25pc2VkIGNvbW1hbmQ6ICR7Y29tbWFuZH1gKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBfcGFyc2VSZWN1cnNlKCkge1xuICAgICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgICAgICAvLyBTY2hlZHVsZSBhbm90aGVyIHJvdW5kIG9mIHBhcnNpbmdcbiAgICAgICAgaWYgKG5vdyAtIHRoaXMuX2xhc3RUaHJlYWRZaWVsZFRpbWUgPCAzMikge1xuICAgICAgICAgICAgdGhpcy5faW1tZWRpYXRlVGltZXJUb2tlbiA9IHRpbWVycy5zZXRJbW1lZGlhdGUodGhpcy5fcGFyc2VSZWN1cnNlLmJpbmQodGhpcykpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fbGFzdFRocmVhZFlpZWxkVGltZSA9IG5vdztcbiAgICAgICAgICAgIHRoaXMuX3RpbWVvdXRUaW1lclRva2VuID0gdGltZXJzLnNldFRpbWVvdXQodGhpcy5fcGFyc2VSZWN1cnNlLmJpbmQodGhpcyksIDApO1xuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLmVtaXQoXCJwcm9ncmVzc1wiLCB0aGlzLl9ieXRlYnVmLm9mZnNldCAvIHRoaXMuX2J5dGVidWYubGltaXQpO1xuICAgICAgICAgICAgdGhpcy5fcmVhZENvbW1hbmQoKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgLy8gQWx3YXlzIGNhbmNlbCBpZiB3ZSBoYXZlIGFuIGVycm9yIC0gd2UndmUgYWxyZWFkeSBzY2hlZHVsZWQgdGhlIG5leHQgdGlja1xuICAgICAgICAgICAgdGhpcy5jYW5jZWwoKTtcbiAgICAgICAgICAgIC8vICMxMSwgIzE3MjogU29tZSBkZW1vcyBoYXZlIGJlZW4gd3JpdHRlbiBpbmNvbXBsZXRlbHkuXG4gICAgICAgICAgICAvLyBEb24ndCB0aHJvdyBhbiBlcnJvciB3aGVuIHdlIHJ1biBvdXQgb2YgYnl0ZXMgdG8gcmVhZC5cbiAgICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgUmFuZ2VFcnJvciAmJlxuICAgICAgICAgICAgICAgIHRoaXMuaGVhZGVyLnBsYXliYWNrVGlja3MgPT09IDAgJiZcbiAgICAgICAgICAgICAgICB0aGlzLmhlYWRlci5wbGF5YmFja1RpbWUgPT09IDAgJiZcbiAgICAgICAgICAgICAgICB0aGlzLmhlYWRlci5wbGF5YmFja0ZyYW1lcyA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2VtaXRFbmQoeyBpbmNvbXBsZXRlOiB0cnVlIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBlIGluc3RhbmNlb2YgRXJyb3IgPyBlIDogbmV3IEVycm9yKGBFeGNlcHRpb24gZHVyaW5nIHBhcnNpbmc6ICR7ZX1gKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9lbWl0RW5kKHsgZXJyb3IsIGluY29tcGxldGU6IGZhbHNlIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuZXhwb3J0cy5EZW1vRmlsZSA9IERlbW9GaWxlO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGVtby5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuRW50aXRpZXMgPSB2b2lkIDA7XG5jb25zdCBhc3NlcnQgPSByZXF1aXJlKFwiYXNzZXJ0XCIpO1xuY29uc3QgZXZlbnRzXzEgPSByZXF1aXJlKFwiZXZlbnRzXCIpO1xuY29uc3QgYXNzZXJ0X2V4aXN0c18xID0gcmVxdWlyZShcIi4vYXNzZXJ0LWV4aXN0c1wiKTtcbmNvbnN0IGJpdGJ1ZmZlcl8xID0gcmVxdWlyZShcIi4vZXh0L2JpdGJ1ZmZlclwiKTtcbmNvbnN0IGNvbnN0cyA9IHJlcXVpcmUoXCIuL2NvbnN0c1wiKTtcbmNvbnN0IG5ldCA9IHJlcXVpcmUoXCIuL25ldFwiKTtcbmNvbnN0IGltbXV0YWJsZSA9IHJlcXVpcmUoXCJpbW11dGFibGVcIik7XG5jb25zdCBpdGVyX3Rvb2xzXzEgPSByZXF1aXJlKFwiaXRlci10b29sc1wiKTtcbmNvbnN0IGJhc2VlbnRpdHlfMSA9IHJlcXVpcmUoXCIuL2VudGl0aWVzL2Jhc2VlbnRpdHlcIik7XG5jb25zdCBnYW1lcnVsZXNfMSA9IHJlcXVpcmUoXCIuL2VudGl0aWVzL2dhbWVydWxlc1wiKTtcbmNvbnN0IG5ldHdvcmthYmxlXzEgPSByZXF1aXJlKFwiLi9lbnRpdGllcy9uZXR3b3JrYWJsZVwiKTtcbmNvbnN0IHBsYXllcl8xID0gcmVxdWlyZShcIi4vZW50aXRpZXMvcGxheWVyXCIpO1xuY29uc3QgdGVhbV8xID0gcmVxdWlyZShcIi4vZW50aXRpZXMvdGVhbVwiKTtcbmNvbnN0IHdlYXBvbl8xID0gcmVxdWlyZShcIi4vZW50aXRpZXMvd2VhcG9uXCIpO1xuY29uc3QgcHJvcHNfMSA9IHJlcXVpcmUoXCIuL3Byb3BzXCIpO1xuY29uc3QgTG9uZyA9IHJlcXVpcmUoXCJsb25nXCIpO1xuY29uc3QgcHJvamVjdGlsZV8xID0gcmVxdWlyZShcIi4vZW50aXRpZXMvcHJvamVjdGlsZVwiKTtcbmZ1bmN0aW9uIGlzUHJvcEV4Y2x1ZGVkKGV4Y2x1ZGVzLCB0YWJsZSwgcHJvcCkge1xuICAgIHJldHVybiBleGNsdWRlcy5maW5kKGV4Y2x1ZGVkID0+IHRhYmxlLm5ldFRhYmxlTmFtZSA9PT0gZXhjbHVkZWQuZHROYW1lICYmXG4gICAgICAgIHByb3AudmFyTmFtZSA9PT0gZXhjbHVkZWQudmFyTmFtZSk7XG59XG5mdW5jdGlvbiByZWFkRmllbGRJbmRleChlbnRpdHlCaXRCdWZmZXIsIGxhc3RJbmRleCwgbmV3V2F5KSB7XG4gICAgaWYgKG5ld1dheSAmJiBlbnRpdHlCaXRCdWZmZXIucmVhZE9uZUJpdCgpKSB7XG4gICAgICAgIHJldHVybiBsYXN0SW5kZXggKyAxO1xuICAgIH1cbiAgICBsZXQgcmV0ID0gMDtcbiAgICBpZiAobmV3V2F5ICYmIGVudGl0eUJpdEJ1ZmZlci5yZWFkT25lQml0KCkpIHtcbiAgICAgICAgcmV0ID0gZW50aXR5Qml0QnVmZmVyLnJlYWRVQml0cygzKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldCA9IGVudGl0eUJpdEJ1ZmZlci5yZWFkVUJpdHMoNyk7XG4gICAgICAgIHN3aXRjaCAocmV0ICYgKDMyIHwgNjQpKSB7XG4gICAgICAgICAgICBjYXNlIDMyOlxuICAgICAgICAgICAgICAgIHJldCA9IChyZXQgJiB+OTYpIHwgKGVudGl0eUJpdEJ1ZmZlci5yZWFkVUJpdHMoMikgPDwgNSk7XG4gICAgICAgICAgICAgICAgYXNzZXJ0KHJldCA+PSAzMik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDY0OlxuICAgICAgICAgICAgICAgIHJldCA9IChyZXQgJiB+OTYpIHwgKGVudGl0eUJpdEJ1ZmZlci5yZWFkVUJpdHMoNCkgPDwgNSk7XG4gICAgICAgICAgICAgICAgYXNzZXJ0KHJldCA+PSAxMjgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSA5NjpcbiAgICAgICAgICAgICAgICByZXQgPSAocmV0ICYgfjk2KSB8IChlbnRpdHlCaXRCdWZmZXIucmVhZFVCaXRzKDcpIDw8IDUpO1xuICAgICAgICAgICAgICAgIGFzc2VydChyZXQgPj0gNTEyKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAocmV0ID09PSAweGZmZikge1xuICAgICAgICAvLyBlbmQgbWFya2VyIGlzIDQwOTUgZm9yIENTOkdPXG4gICAgICAgIHJldHVybiAtMTtcbiAgICB9XG4gICAgcmV0dXJuIGxhc3RJbmRleCArIDEgKyByZXQ7XG59XG5mdW5jdGlvbiBjbG9uZVByb3BzKHByb3BzKSB7XG4gICAgY29uc3QgcmVzdWx0ID0ge307XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlc3RyaWN0ZWQtc3ludGF4XG4gICAgZm9yIChjb25zdCB0YWJsZU5hbWUgaW4gcHJvcHMpIHtcbiAgICAgICAgY29uc3Qgb2xkVGFibGUgPSBwcm9wc1t0YWJsZU5hbWVdO1xuICAgICAgICBjb25zdCBuZXdUYWJsZSA9IHt9O1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1zeW50YXhcbiAgICAgICAgZm9yIChjb25zdCBwcm9wIGluIG9sZFRhYmxlKSB7XG4gICAgICAgICAgICBuZXdUYWJsZVtwcm9wXSA9IG9sZFRhYmxlW3Byb3BdO1xuICAgICAgICB9XG4gICAgICAgIHJlc3VsdFt0YWJsZU5hbWVdID0gbmV3VGFibGU7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG4vKipcbiAqIFJlcHJlc2VudHMgZW50aXRpZXMgYW5kIG5ldHdvcmtlZCBwcm9wZXJ0aWVzIHdpdGhpbiBhIGRlbW8uXG4gKi9cbmNsYXNzIEVudGl0aWVzIGV4dGVuZHMgZXZlbnRzXzEuRXZlbnRFbWl0dGVyIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcbiAgICAgICAgdGhpcy5kYXRhVGFibGVzID0gW107XG4gICAgICAgIHRoaXMuc2VydmVyQ2xhc3NlcyA9IFtdO1xuICAgICAgICAvKipcbiAgICAgICAgICogTWFwIG9mIGVudGl0eSBpbmRleCA9PiBuZXR3b3JrYWJsZSBpbnN0YW5jZVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5lbnRpdGllcyA9IG5ldyBNYXAoKTtcbiAgICAgICAgdGhpcy5tYXJrZWRGb3JEZWxldGlvbiA9IFtdO1xuICAgICAgICB0aGlzLnN0YXRpY0Jhc2VsaW5lcyA9IHt9O1xuICAgICAgICB0aGlzLnBlbmRpbmdCYXNlbGluZXMgPSB7fTtcbiAgICAgICAgdGhpcy5zZXJ2ZXJDbGFzc0JpdHMgPSAwO1xuICAgICAgICB0aGlzLnRhYmxlQ2xhc3NNYXAgPSB7XG4gICAgICAgICAgICBEVF9DU1BsYXllcjogcGxheWVyXzEuUGxheWVyLFxuICAgICAgICAgICAgRFRfVGVhbTogdGVhbV8xLlRlYW0sXG4gICAgICAgICAgICBEVF9DU0dhbWVSdWxlczogZ2FtZXJ1bGVzXzEuR2FtZVJ1bGVzLFxuICAgICAgICAgICAgRFRfQmFzZUNTR3JlbmFkZVByb2plY3RpbGU6IHByb2plY3RpbGVfMS5Qcm9qZWN0aWxlLFxuICAgICAgICAgICAgRFRfV2VhcG9uQ1NCYXNlOiB3ZWFwb25fMS5XZWFwb24sXG4gICAgICAgICAgICBEVF9CYXNlRW50aXR5OiBiYXNlZW50aXR5XzEuQmFzZUVudGl0eVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLl9zZXJ2ZXJDbGFzc0NvbnN0cnVjdG9yID0gbmV3IE1hcCgpO1xuICAgICAgICAvKipcbiAgICAgICAgICogU2V0IG9mIHdoaWNoIGVudGl0aWVzIHdlcmUgYWN0aXZlIGluIHRoZSBtb3N0IHJlY2VudCB0aWNrLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy50cmFuc21pdEVudGl0aWVzID0gbnVsbDtcbiAgICAgICAgdGhpcy5fZW50aXR5QmFzZWxpbmVzID0gW1xuICAgICAgICAgICAgbmV3IE1hcCgpLFxuICAgICAgICAgICAgbmV3IE1hcCgpXG4gICAgICAgIF07XG4gICAgICAgIHRoaXMuX2ZyYW1lcyA9IGltbXV0YWJsZS5NYXAoKTtcbiAgICAgICAgdGhpcy5fZGVtbyA9IG51bGw7XG4gICAgICAgIHRoaXMuX3NpbmdsZXRvbkVudHMgPSB7fTtcbiAgICAgICAgdGhpcy5fY3VycmVudFNlcnZlclRpY2sgPSAtMTtcbiAgICAgICAgdGhpcy5fbWF4UGxheWVycyA9IDA7XG4gICAgICAgIHRoaXMuX3VzZXJJbmZvVGFibGUgPSBudWxsO1xuICAgICAgICB0aGlzLl91c2VySWRUb0VudGl0eSA9IG5ldyBNYXAoKTtcbiAgICAgICAgdGhpcy5fc3RlYW02NElkVG9FbnRpdHkgPSBuZXcgTWFwKCk7XG4gICAgICAgIHRoaXMuX2FjY291bnROdW1iZXJUb0VudGl0eSA9IG5ldyBNYXAoKTtcbiAgICB9XG4gICAgZ2V0IHBsYXllclJlc291cmNlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVtby5lbnRpdGllcy5nZXRTaW5nbGV0b24oXCJDQ1NQbGF5ZXJSZXNvdXJjZVwiKTtcbiAgICB9XG4gICAgZ2V0IGdhbWVSdWxlcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0U2luZ2xldG9uKFwiQ0NTR2FtZVJ1bGVzUHJveHlcIik7XG4gICAgfVxuICAgIGdldCB0ZWFtcygpIHtcbiAgICAgICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy5maW5kQWxsV2l0aENsYXNzKHRlYW1fMS5UZWFtKSk7XG4gICAgfVxuICAgIGdldCBwbGF5ZXJzKCkge1xuICAgICAgICBjb25zdCBwbGF5ZXJzID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDw9IHRoaXMuX21heFBsYXllcnM7ICsraSkge1xuICAgICAgICAgICAgY29uc3QgZW50aXR5ID0gdGhpcy5lbnRpdGllcy5nZXQoaSk7XG4gICAgICAgICAgICAvLyBPbmx5IHJldHVybiBwbGF5ZXJzIHRoYXQgYXJlIGZ1bGx5IGNvbm5lY3RlZFxuICAgICAgICAgICAgaWYgKChlbnRpdHkgPT09IG51bGwgfHwgZW50aXR5ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlbnRpdHkudXNlckluZm8pICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBwbGF5ZXJzLnB1c2goZW50aXR5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGxheWVycztcbiAgICB9XG4gICAgZ2V0IHdlYXBvbnMoKSB7XG4gICAgICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMuZmluZEFsbFdpdGhDbGFzcyh3ZWFwb25fMS5XZWFwb24pKTtcbiAgICB9XG4gICAgbGlzdGVuKGRlbW8pIHtcbiAgICAgICAgdGhpcy5fZGVtbyA9IGRlbW87XG4gICAgICAgIGRlbW8ub24oXCJzdmNfUGFja2V0RW50aXRpZXNcIiwgZSA9PiB0aGlzLl9oYW5kbGVQYWNrZXRFbnRpdGllcyhlKSk7XG4gICAgICAgIGRlbW8ub24oXCJzdmNfVGVtcEVudGl0aWVzXCIsIGUgPT4gdGhpcy5faGFuZGxlVGVtcEVudGl0aWVzKGUpKTtcbiAgICAgICAgZGVtby5vbihcInN2Y19TZXJ2ZXJJbmZvXCIsIGUgPT4ge1xuICAgICAgICAgICAgdGhpcy5fbWF4UGxheWVycyA9IGUubWF4Q2xpZW50cztcbiAgICAgICAgfSk7XG4gICAgICAgIGRlbW8ub24oXCJuZXRfVGlja1wiLCBlID0+IHtcbiAgICAgICAgICAgIHRoaXMuX2N1cnJlbnRTZXJ2ZXJUaWNrID0gZS50aWNrO1xuICAgICAgICB9KTtcbiAgICAgICAgZGVtby5zdHJpbmdUYWJsZXMub24oXCJjcmVhdGVcIiwgdGFibGUgPT4ge1xuICAgICAgICAgICAgaWYgKHRhYmxlLm5hbWUgPT09IFwidXNlcmluZm9cIilcbiAgICAgICAgICAgICAgICB0aGlzLl91c2VySW5mb1RhYmxlID0gdGFibGU7XG4gICAgICAgIH0pO1xuICAgICAgICBkZW1vLnN0cmluZ1RhYmxlcy5vbihcInVwZGF0ZVwiLCBlID0+IHRoaXMuX2hhbmRsZVN0cmluZ1RhYmxlVXBkYXRlKGUpKTtcbiAgICAgICAgZGVtby5vbihcInRpY2tlbmRcIiwgKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMubWFya2VkRm9yRGVsZXRpb24ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgaW5kZXggb2YgdGhpcy5tYXJrZWRGb3JEZWxldGlvbikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmVudGl0aWVzLmRlbGV0ZShpbmRleCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZW1pdChcInJlbW92ZVwiLCB7IGluZGV4IH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLm1hcmtlZEZvckRlbGV0aW9uLmxlbmd0aCA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgaGFuZGxlIGlzIHNldC5cbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IGRldGVybWluZSB3aGV0aGVyIHRoZSBoYW5kbGUgcG9pbnRzIHRvIGEgdmFsaWQgZW50aXR5LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBoYW5kbGUgLSBOZXR3b3JrZWQgZW50aXR5IGhhbmRsZSB2YWx1ZVxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSB0cnVlIGlmIGhhbmRsZSBpcyBzZXRcbiAgICAgKi9cbiAgICBpc0hhbmRsZVNldChoYW5kbGUpIHtcbiAgICAgICAgcmV0dXJuIGhhbmRsZSAhPT0gY29uc3RzLklOVkFMSURfTkVUV09SS0VEX0VIQU5ETEVfVkFMVUU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGVudGl0eSBzcGVjaWZpZWQgYnkgYSBwYXJ0aWN1bGFyIGhhbmRsZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gaGFuZGxlIC0gTmV0d29ya2VkIGVudGl0eSBoYW5kbGUgdmFsdWVcbiAgICAgKiBAcmV0dXJucyB7RW50aXR5fG51bGx9IEVudGl0eSByZWZlcmVuY2VkIGJ5IHRoZSBoYW5kbGUuIGBudWxsYCBpZiBubyBtYXRjaGluZyBlbnRpdHkuXG4gICAgICovXG4gICAgZ2V0QnlIYW5kbGUoaGFuZGxlKSB7XG4gICAgICAgIGlmICghaGFuZGxlLmlzVmFsaWQpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGVudCA9IHRoaXMuZW50aXRpZXMuZ2V0KGhhbmRsZS5pbmRleCk7XG4gICAgICAgIGlmIChlbnQgPT0gbnVsbCB8fCBlbnQuc2VyaWFsTnVtICE9PSBoYW5kbGUuc2VyaWFsTnVtKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZW50O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBlbnRpdHkgdGhhdCBiZWxvbmdzIHRvIHRoZSBwbGF5ZXIgd2l0aCBhIGdpdmVuIHVzZXIgSUQuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHVzZXJJZCAtIFBsYXllciB1c2VyIElEXG4gICAgICogQHJldHVybnMge1BsYXllcnxudWxsfSBFbnRpdHkgcmVmZXJlbmNlZCBieSB0aGUgdXNlciBJRC4gYG51bGxgIGlmIG5vIG1hdGNoaW5nIHBsYXllci5cbiAgICAgKi9cbiAgICBnZXRCeVVzZXJJZCh1c2VySWQpIHtcbiAgICAgICAgY29uc3QgZW50aXR5SW5kZXggPSB0aGlzLl91c2VySWRUb0VudGl0eS5nZXQodXNlcklkKTtcbiAgICAgICAgaWYgKGVudGl0eUluZGV4ID09PSB1bmRlZmluZWQpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW50aXRpZXMuZ2V0KGVudGl0eUluZGV4KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgZW50aXR5IHRoYXQgYmVsb25ncyB0byB0aGUgcGxheWVyIHdpdGggYSBnaXZlbiBTdGVhbSBhY2NvdW50IElELlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBhY2NvdW50SWQgLSBTdGVhbSBhY2NvdW50IElEXG4gICAgICogQHJldHVybnMge1BsYXllcnxudWxsfSBFbnRpdHkgcmVmZXJlbmNlZCBieSB0aGUgYWNjb3VudCBJRC4gYG51bGxgIGlmIG5vIG1hdGNoaW5nIHBsYXllci5cbiAgICAgKi9cbiAgICBnZXRCeUFjY291bnRJZChhY2NvdW50SWQpIHtcbiAgICAgICAgY29uc3QgZW50aXR5SW5kZXggPSB0aGlzLl9hY2NvdW50TnVtYmVyVG9FbnRpdHkuZ2V0KGFjY291bnRJZCk7XG4gICAgICAgIGlmIChlbnRpdHlJbmRleCA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIHJldHVybiB0aGlzLmVudGl0aWVzLmdldChlbnRpdHlJbmRleCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGVudGl0eSB0aGF0IGJlbG9uZ3MgdG8gdGhlIHBsYXllciB3aXRoIGEgZ2l2ZW4gNjQtYml0IFN0ZWFtIElELlxuICAgICAqIEBwYXJhbSB7TG9uZ3xzdHJpbmd9IHN0ZWFtNjRJZCAtIDY0LWJpdCBTdGVhbSBJRFxuICAgICAqIEByZXR1cm5zIHtQbGF5ZXJ8bnVsbH0gRW50aXR5IHJlZmVyZW5jZWQgYnkgdGhlIFN0ZWFtIElELiBgbnVsbGAgaWYgbm8gbWF0Y2hpbmcgcGxheWVyLlxuICAgICAqL1xuICAgIGdldEJ5U3RlYW02NElkKHN0ZWFtNjRJZCkge1xuICAgICAgICBjb25zdCBpZFN0cmluZyA9IHN0ZWFtNjRJZCBpbnN0YW5jZW9mIExvbmcgPyBzdGVhbTY0SWQudG9TdHJpbmcoKSA6IHN0ZWFtNjRJZDtcbiAgICAgICAgY29uc3QgZW50aXR5SW5kZXggPSB0aGlzLl9zdGVhbTY0SWRUb0VudGl0eS5nZXQoaWRTdHJpbmcpO1xuICAgICAgICBpZiAoZW50aXR5SW5kZXggPT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICByZXR1cm4gdGhpcy5lbnRpdGllcy5nZXQoZW50aXR5SW5kZXgpO1xuICAgIH1cbiAgICBnZXRTaW5nbGV0b24oc2VydmVyQ2xhc3MpIHtcbiAgICAgICAgY29uc3QgZXhpc3RpbmcgPSB0aGlzLl9zaW5nbGV0b25FbnRzW3NlcnZlckNsYXNzXTtcbiAgICAgICAgaWYgKGV4aXN0aW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gZXhpc3Rpbmc7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gKDAsIGl0ZXJfdG9vbHNfMS5maW5kKSgoWywgZW50XSkgPT4gZW50LnNlcnZlckNsYXNzLm5hbWUgPT09IHNlcnZlckNsYXNzLCB0aGlzLmVudGl0aWVzKTtcbiAgICAgICAgaWYgKCFyZXN1bHQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyBzaW5nbGV0b24gJHtzZXJ2ZXJDbGFzc31gKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBbLCBlbnRpdHldID0gcmVzdWx0O1xuICAgICAgICB0aGlzLl9zaW5nbGV0b25FbnRzW3NlcnZlckNsYXNzXSA9IGVudGl0eTtcbiAgICAgICAgcmV0dXJuIGVudGl0eTtcbiAgICB9XG4gICAgKmZpbmRBbGxXaXRoVGFibGUodGFibGUpIHtcbiAgICAgICAgZm9yIChjb25zdCBlbnQgb2YgdGhpcy5lbnRpdGllcy52YWx1ZXMoKSkge1xuICAgICAgICAgICAgaWYgKHRhYmxlIGluIGVudC5wcm9wcykge1xuICAgICAgICAgICAgICAgIHlpZWxkIGVudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAqZmluZEFsbFdpdGhDbGFzcyhrbGFzcykge1xuICAgICAgICBmb3IgKGNvbnN0IGVudCBvZiB0aGlzLmVudGl0aWVzLnZhbHVlcygpKSB7XG4gICAgICAgICAgICBpZiAoZW50IGluc3RhbmNlb2Yga2xhc3MpIHtcbiAgICAgICAgICAgICAgICB5aWVsZCBlbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgaGFuZGxlRGF0YVRhYmxlcyhjaHVuaykge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc3RhbnQtY29uZGl0aW9uXG4gICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICBjb25zdCBkZXNjcmlwdG9yID0gbmV0LmZpbmRCeVR5cGUoY2h1bmsucmVhZFZhcmludDMyKCkpO1xuICAgICAgICAgICAgYXNzZXJ0KChkZXNjcmlwdG9yID09PSBudWxsIHx8IGRlc2NyaXB0b3IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGRlc2NyaXB0b3IubmFtZSkgPT09IFwic3ZjX1NlbmRUYWJsZVwiLCBcImV4cGVjdGVkIFNlbmRUYWJsZSBtZXNzYWdlXCIpO1xuICAgICAgICAgICAgY29uc3QgbGVuZ3RoID0gY2h1bmsucmVhZFZhcmludDMyKCk7XG4gICAgICAgICAgICBjb25zdCBtc2cgPSBkZXNjcmlwdG9yLmNsYXNzLmRlY29kZShuZXcgVWludDhBcnJheShjaHVuay5yZWFkQnl0ZXMobGVuZ3RoKS50b0J1ZmZlcigpKSk7XG4gICAgICAgICAgICBpZiAobXNnLmlzRW5kKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmRhdGFUYWJsZXMucHVzaChtc2cpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNlcnZlckNsYXNzZXMgPSBjaHVuay5yZWFkU2hvcnQoKTtcbiAgICAgICAgdGhpcy5zZXJ2ZXJDbGFzc0JpdHMgPSBNYXRoLmNlaWwoTWF0aC5sb2cyKHNlcnZlckNsYXNzZXMpKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZXJ2ZXJDbGFzc2VzOyArK2kpIHtcbiAgICAgICAgICAgIGNvbnN0IGNsYXNzSWQgPSBjaHVuay5yZWFkU2hvcnQoKTtcbiAgICAgICAgICAgIGFzc2VydChjbGFzc0lkID09PSBpLCBcInNlcnZlciBjbGFzcyBlbnRyeSBmb3IgaW52YWxpZCBjbGFzcyBJRFwiKTtcbiAgICAgICAgICAgIGNvbnN0IG5hbWUgPSBjaHVuay5yZWFkQ1N0cmluZygpO1xuICAgICAgICAgICAgY29uc3QgZHROYW1lID0gY2h1bmsucmVhZENTdHJpbmcoKTtcbiAgICAgICAgICAgIGNvbnN0IGRhdGFUYWJsZSA9ICgwLCBhc3NlcnRfZXhpc3RzXzEuZGVmYXVsdCkodGhpcy5fZmluZFRhYmxlQnlOYW1lKGR0TmFtZSksIFwibm8gZGF0YSB0YWJsZSBmb3Igc2VydmVyIGNsYXNzXCIpO1xuICAgICAgICAgICAgY29uc3Qgc2VydmVyQ2xhc3MgPSB7XG4gICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICBkdE5hbWUsXG4gICAgICAgICAgICAgICAgZGF0YVRhYmxlLFxuICAgICAgICAgICAgICAgIGZsYXR0ZW5lZFByb3BzOiB0aGlzLl9mbGF0dGVuRGF0YVRhYmxlKGRhdGFUYWJsZSlcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0aGlzLnNlcnZlckNsYXNzZXMucHVzaChzZXJ2ZXJDbGFzcyk7XG4gICAgICAgICAgICAvLyBGaW5kIHRoZSBjb25zdHJ1Y3RvciBmb3IgdGhpcyBzZXJ2ZXIgY2xhc3NcbiAgICAgICAgICAgIGNvbnN0IHRhYmxlc0luQ2xhc3MgPSBuZXcgU2V0KHNlcnZlckNsYXNzLmZsYXR0ZW5lZFByb3BzLm1hcChwcm9wID0+IHByb3AudGFibGUubmV0VGFibGVOYW1lKSk7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1zeW50YXhcbiAgICAgICAgICAgIGZvciAoY29uc3QgdGFibGVOYW1lIGluIHRoaXMudGFibGVDbGFzc01hcCkge1xuICAgICAgICAgICAgICAgIGlmICh0YWJsZXNJbkNsYXNzLmhhcyh0YWJsZU5hbWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3NlcnZlckNsYXNzQ29uc3RydWN0b3Iuc2V0KGNsYXNzSWQsIHRoaXMudGFibGVDbGFzc01hcFt0YWJsZU5hbWVdKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gcGFyc2UgYW55IHBlbmRpbmcgYmFzZWxpbmVcbiAgICAgICAgICAgIGNvbnN0IHBlbmRpbmdCYXNlbGluZSA9IHRoaXMucGVuZGluZ0Jhc2VsaW5lc1tjbGFzc0lkXTtcbiAgICAgICAgICAgIGlmIChwZW5kaW5nQmFzZWxpbmUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXRpY0Jhc2VsaW5lc1tjbGFzc0lkXSA9IHRoaXMuX3BhcnNlSW5zdGFuY2VCYXNlbGluZShwZW5kaW5nQmFzZWxpbmUsIGNsYXNzSWQpO1xuICAgICAgICAgICAgICAgIHRoaXMuZW1pdChcImJhc2VsaW5ldXBkYXRlXCIsIHtcbiAgICAgICAgICAgICAgICAgICAgY2xhc3NJZCxcbiAgICAgICAgICAgICAgICAgICAgc2VydmVyQ2xhc3MsXG4gICAgICAgICAgICAgICAgICAgIGJhc2VsaW5lOiB0aGlzLnN0YXRpY0Jhc2VsaW5lc1tjbGFzc0lkXVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnBlbmRpbmdCYXNlbGluZXNbY2xhc3NJZF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5lbWl0KFwiZGF0YXRhYmxlc3JlYWR5XCIpO1xuICAgIH1cbiAgICBfZ2F0aGVyRXhjbHVkZXModGFibGUpIHtcbiAgICAgICAgY29uc3QgZXhjbHVkZXMgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBwcm9wIG9mIHRhYmxlLnByb3BzKSB7XG4gICAgICAgICAgICBpZiAoKHByb3AuZmxhZ3MgJiBwcm9wc18xLlNQUk9QX0VYQ0xVREUpICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgZXhjbHVkZXMucHVzaChwcm9wKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwcm9wLnR5cGUgPT09IDYgLyogUHJvcFR5cGUuRGF0YVRhYmxlICovKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3ViVGFibGUgPSAoMCwgYXNzZXJ0X2V4aXN0c18xLmRlZmF1bHQpKHRoaXMuX2ZpbmRUYWJsZUJ5TmFtZShwcm9wLmR0TmFtZSkpO1xuICAgICAgICAgICAgICAgIGV4Y2x1ZGVzLnB1c2goLi4udGhpcy5fZ2F0aGVyRXhjbHVkZXMoc3ViVGFibGUpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZXhjbHVkZXM7XG4gICAgfVxuICAgIF9nYXRoZXJQcm9wcyh0YWJsZSwgZXhjbHVkZXMpIHtcbiAgICAgICAgY29uc3QgZmxhdHRlbmVkID0gW107XG4gICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCB0YWJsZS5wcm9wcy5sZW5ndGg7ICsraW5kZXgpIHtcbiAgICAgICAgICAgIGNvbnN0IHByb3AgPSB0YWJsZS5wcm9wc1tpbmRleF07XG4gICAgICAgICAgICBpZiAoKHByb3AuZmxhZ3MgJiBwcm9wc18xLlNQUk9QX0lOU0lERUFSUkFZKSAhPT0gMCB8fFxuICAgICAgICAgICAgICAgIChwcm9wLmZsYWdzICYgcHJvcHNfMS5TUFJPUF9FWENMVURFKSAhPT0gMCB8fFxuICAgICAgICAgICAgICAgIGlzUHJvcEV4Y2x1ZGVkKGV4Y2x1ZGVzLCB0YWJsZSwgcHJvcCkpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwcm9wLnR5cGUgPT09IDYgLyogUHJvcFR5cGUuRGF0YVRhYmxlICovKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3ViVGFibGUgPSAoMCwgYXNzZXJ0X2V4aXN0c18xLmRlZmF1bHQpKHRoaXMuX2ZpbmRUYWJsZUJ5TmFtZShwcm9wLmR0TmFtZSkpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkUHJvcHMgPSB0aGlzLl9nYXRoZXJQcm9wcyhzdWJUYWJsZSwgZXhjbHVkZXMpO1xuICAgICAgICAgICAgICAgIGlmICgocHJvcC5mbGFncyAmIHByb3BzXzEuU1BST1BfQ09MTEFQU0lCTEUpID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZnAgb2YgY2hpbGRQcm9wcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZnAuY29sbGFwc2libGUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmbGF0dGVuZWQucHVzaCguLi5jaGlsZFByb3BzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGZsYXR0ZW5lZC5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgcHJvcCxcbiAgICAgICAgICAgICAgICAgICAgdGFibGUsXG4gICAgICAgICAgICAgICAgICAgIGRlY29kZTogKDAsIHByb3BzXzEubWFrZURlY29kZXIpKHByb3AsIHByb3AudHlwZSA9PT0gNSAvKiBQcm9wVHlwZS5BcnJheSAqLyA/IHRhYmxlLnByb3BzW2luZGV4IC0gMV0gOiB1bmRlZmluZWQpLFxuICAgICAgICAgICAgICAgICAgICBjb2xsYXBzaWJsZTogdHJ1ZVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIGNvbGxhcHNpYmxlIHByb3BzIHNob3VsZCBjb21lIGFmdGVyIG5vbi1jb2xsYXBzaWJsZVxuICAgICAgICByZXR1cm4gZmxhdHRlbmVkLnNvcnQoKHsgY29sbGFwc2libGU6IGEgfSwgeyBjb2xsYXBzaWJsZTogYiB9KSA9PiAoYSA/IDEgOiAwKSAtIChiID8gMSA6IDApKTtcbiAgICB9XG4gICAgX2ZsYXR0ZW5EYXRhVGFibGUodGFibGUpIHtcbiAgICAgICAgY29uc3QgZmxhdHRlbmVkUHJvcHMgPSB0aGlzLl9nYXRoZXJQcm9wcyh0YWJsZSwgdGhpcy5fZ2F0aGVyRXhjbHVkZXModGFibGUpKTtcbiAgICAgICAgY29uc3QgcHJpb3JpdHlTZXQgPSBuZXcgU2V0KGZsYXR0ZW5lZFByb3BzLm1hcChmcCA9PiBmcC5wcm9wLnByaW9yaXR5KSk7XG4gICAgICAgIHByaW9yaXR5U2V0LmFkZCg2NCk7XG4gICAgICAgIGNvbnN0IHByaW9yaXRpZXMgPSBBcnJheS5mcm9tKHByaW9yaXR5U2V0KS5zb3J0KChhLCBiKSA9PiBhIC0gYik7XG4gICAgICAgIGxldCBzdGFydCA9IDA7XG4gICAgICAgIC8vIE9uIHRoaXMgc3VyZmFjZSB0aGlzIGxvb2tzIGxpa2UgYSBzb3J0IGJ5IHByaW9yaXR5IChvciBtaW4oNjQsIHByaW9yaXR5KVxuICAgICAgICAvLyBmb3IgQ0hBTkdFU19PRlRFTiBwcm9wcykuIEl0J3Mgbm90IGEgc3RhYmxlIHNvcnQgc28gaXQgY2FuJ3QganVzdCBiZVxuICAgICAgICAvLyByZXBsYWNlZCB3aXRoIEpTIEFycmF5I3NvcnRcbiAgICAgICAgZm9yIChjb25zdCBwcmlvcml0eSBvZiBwcmlvcml0aWVzKSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc3RhbnQtY29uZGl0aW9uXG4gICAgICAgICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAgICAgICAgIGxldCBjdXJyZW50UHJvcDtcbiAgICAgICAgICAgICAgICBmb3IgKGN1cnJlbnRQcm9wID0gc3RhcnQ7IGN1cnJlbnRQcm9wIDwgZmxhdHRlbmVkUHJvcHMubGVuZ3RoOyArK2N1cnJlbnRQcm9wKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHByb3AgPSBmbGF0dGVuZWRQcm9wc1tjdXJyZW50UHJvcF0ucHJvcDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHByb3AucHJpb3JpdHkgPT09IHByaW9yaXR5IHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAocHJpb3JpdHkgPT09IDY0ICYmIChwcm9wLmZsYWdzICYgcHJvcHNfMS5TUFJPUF9DSEFOR0VTX09GVEVOKSAhPT0gMCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGFydCAhPT0gY3VycmVudFByb3ApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0ZW1wID0gZmxhdHRlbmVkUHJvcHNbc3RhcnRdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYXR0ZW5lZFByb3BzW3N0YXJ0XSA9IGZsYXR0ZW5lZFByb3BzW2N1cnJlbnRQcm9wXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGF0dGVuZWRQcm9wc1tjdXJyZW50UHJvcF0gPSB0ZW1wO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQrKztcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChjdXJyZW50UHJvcCA9PT0gZmxhdHRlbmVkUHJvcHMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmxhdHRlbmVkUHJvcHM7XG4gICAgfVxuICAgIF9maW5kVGFibGVCeU5hbWUobmFtZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5kYXRhVGFibGVzLmZpbmQodGFibGUgPT4gdGFibGUubmV0VGFibGVOYW1lID09PSBuYW1lKTtcbiAgICB9XG4gICAgX2FkZEVudGl0eShpbmRleCwgY2xhc3NJZCwgc2VyaWFsTnVtLCBleGlzdGluZ0VudGl0eSwgZW50aXR5QmFzZWxpbmUpIHtcbiAgICAgICAgY29uc3QgYmFzZWxpbmUgPSBlbnRpdHlCYXNlbGluZSB8fCB0aGlzLnN0YXRpY0Jhc2VsaW5lc1tjbGFzc0lkXTtcbiAgICAgICAgaWYgKCFiYXNlbGluZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBubyBiYXNlbGluZSBmb3IgZW50aXR5ICR7aW5kZXh9IChjbGFzcyBJRCAke2NsYXNzSWR9KWApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHByb3BzID0gY2xvbmVQcm9wcyhiYXNlbGluZSk7XG4gICAgICAgIC8vIElmIHdlIGFscmVhZHkgaGF2ZSB0aGlzIGVudGl0eSwgc3RhcnQgZnJlc2ggd2l0aCBiYXNlbGluZSBwcm9wc1xuICAgICAgICBpZiAoKGV4aXN0aW5nRW50aXR5ID09PSBudWxsIHx8IGV4aXN0aW5nRW50aXR5ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBleGlzdGluZ0VudGl0eS5zZXJpYWxOdW0pID09PSBzZXJpYWxOdW0pIHtcbiAgICAgICAgICAgIGV4aXN0aW5nRW50aXR5LnByb3BzID0gcHJvcHM7XG4gICAgICAgICAgICByZXR1cm4gZXhpc3RpbmdFbnRpdHk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gRGVsZXRlIHRoZSBlbnRpdHkgaWYgdGhlIHNlcmlhbCBudW1iZXJzIG1pc21hdGNoXG4gICAgICAgIGlmIChleGlzdGluZ0VudGl0eSkge1xuICAgICAgICAgICAgdGhpcy5fcmVtb3ZlRW50aXR5KGluZGV4LCB0cnVlKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBrbGFzcyA9IHRoaXMuX3NlcnZlckNsYXNzQ29uc3RydWN0b3IuZ2V0KGNsYXNzSWQpIHx8IG5ldHdvcmthYmxlXzEuTmV0d29ya2FibGU7XG4gICAgICAgIGNvbnN0IGVudGl0eSA9IG5ldyBrbGFzcyh0aGlzLl9kZW1vLCBpbmRleCwgY2xhc3NJZCwgc2VyaWFsTnVtLCBwcm9wcyk7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWFyZ3VtZW50XG4gICAgICAgIHRoaXMuZW50aXRpZXMuc2V0KGluZGV4LCBlbnRpdHkpO1xuICAgICAgICByZXR1cm4gZW50aXR5O1xuICAgIH1cbiAgICBfcmVtb3ZlRW50aXR5KGluZGV4LCBpbW1lZGlhdGUpIHtcbiAgICAgICAgY29uc3QgZW50aXR5ID0gdGhpcy5lbnRpdGllcy5nZXQoaW5kZXgpO1xuICAgICAgICBpZiAoIWVudGl0eSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIEl0J3MgcG9zc2libGUgdGhhdCB0aGUgZW50aXR5IGlzIGFscmVhZHkgbWFya2VkIGZvciBkZWxldGlvbi5cbiAgICAgICAgLy8gVGhpcyBpcyBiZWNhdXNlIGVudGl0aWVzIGFyZSBkZWxldGVkIGF0IHRoZSBlbmQgb2YgdGhlIGRlbV9wYWNrZXQsXG4gICAgICAgIC8vIGFmdGVyIHRoZSBnYW1lIGV2ZW50cyBmaXJlLlxuICAgICAgICBpZiAoIWltbWVkaWF0ZSAmJiBlbnRpdHkuZGVsZXRpbmcpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmVtaXQoXCJiZWZvcmVyZW1vdmVcIiwgeyBlbnRpdHksIGltbWVkaWF0ZSB9KTtcbiAgICAgICAgaWYgKGltbWVkaWF0ZSkge1xuICAgICAgICAgICAgdGhpcy5lbnRpdGllcy5kZWxldGUoaW5kZXgpO1xuICAgICAgICAgICAgdGhpcy5lbWl0KFwicmVtb3ZlXCIsIHsgaW5kZXggfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBlbnRpdHkuZGVsZXRpbmcgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5tYXJrZWRGb3JEZWxldGlvbi5wdXNoKGluZGV4KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBfcGFyc2VFbnRpdHlVcGRhdGUoZW50aXR5Qml0QnVmZmVyLCBjbGFzc0lkKSB7XG4gICAgICAgIGNvbnN0IHNlcnZlckNsYXNzID0gdGhpcy5zZXJ2ZXJDbGFzc2VzW2NsYXNzSWRdO1xuICAgICAgICBjb25zdCBuZXdXYXkgPSBlbnRpdHlCaXRCdWZmZXIucmVhZE9uZUJpdCgpO1xuICAgICAgICBsZXQgbGFzdEluZGV4ID0gLTE7XG4gICAgICAgIGNvbnN0IGZpZWxkSW5kaWNlcyA9IFtdO1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc3RhbnQtY29uZGl0aW9uXG4gICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICBsYXN0SW5kZXggPSByZWFkRmllbGRJbmRleChlbnRpdHlCaXRCdWZmZXIsIGxhc3RJbmRleCwgbmV3V2F5KTtcbiAgICAgICAgICAgIGlmIChsYXN0SW5kZXggPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmaWVsZEluZGljZXMucHVzaChsYXN0SW5kZXgpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHVwZGF0ZWRQcm9wcyA9IG5ldyBBcnJheShmaWVsZEluZGljZXMubGVuZ3RoKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmaWVsZEluZGljZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIGNvbnN0IHByb3BJbmRleCA9IGZpZWxkSW5kaWNlc1tpXTtcbiAgICAgICAgICAgIGNvbnN0IGZsYXR0ZW5lZFByb3AgPSBzZXJ2ZXJDbGFzcy5mbGF0dGVuZWRQcm9wc1twcm9wSW5kZXhdO1xuICAgICAgICAgICAgYXNzZXJ0KGZsYXR0ZW5lZFByb3ApO1xuICAgICAgICAgICAgdXBkYXRlZFByb3BzW2ldID0ge1xuICAgICAgICAgICAgICAgIHByb3A6IGZsYXR0ZW5lZFByb3AsXG4gICAgICAgICAgICAgICAgdmFsdWU6IGZsYXR0ZW5lZFByb3AuZGVjb2RlKGVudGl0eUJpdEJ1ZmZlcilcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVwZGF0ZWRQcm9wcztcbiAgICB9XG4gICAgX3JlYWROZXdFbnRpdHkoZW50aXR5Qml0QnVmZmVyLCBlbnRpdHkpIHtcbiAgICAgICAgY29uc3QgdXBkYXRlcyA9IHRoaXMuX3BhcnNlRW50aXR5VXBkYXRlKGVudGl0eUJpdEJ1ZmZlciwgZW50aXR5LmNsYXNzSWQpO1xuICAgICAgICBjb25zdCByZWNvcmRDaGFuZ2VzID0gdGhpcy5saXN0ZW5lckNvdW50KFwiY2hhbmdlXCIpID4gMDtcbiAgICAgICAgY29uc3QgY2hhbmdlcyA9IHJlY29yZENoYW5nZXNcbiAgICAgICAgICAgID8gbmV3IEFycmF5KHVwZGF0ZXMubGVuZ3RoKVxuICAgICAgICAgICAgOiBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB1cGRhdGVzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICBjb25zdCB1cGRhdGUgPSB1cGRhdGVzW2ldO1xuICAgICAgICAgICAgY29uc3QgdGFibGVOYW1lID0gdXBkYXRlLnByb3AudGFibGUubmV0VGFibGVOYW1lO1xuICAgICAgICAgICAgY29uc3QgdmFyTmFtZSA9IHVwZGF0ZS5wcm9wLnByb3AudmFyTmFtZTtcbiAgICAgICAgICAgIGNvbnN0IHRhYmxlID0gZW50aXR5LnByb3BzW3RhYmxlTmFtZV07XG4gICAgICAgICAgICBjb25zdCBvbGRWYWx1ZSA9IHRhYmxlICYmIHZhck5hbWUgaW4gdGFibGUgPyB0YWJsZVt2YXJOYW1lXSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGVudGl0eS51cGRhdGVQcm9wKHRhYmxlTmFtZSwgdmFyTmFtZSwgdXBkYXRlLnZhbHVlKTtcbiAgICAgICAgICAgIGlmIChyZWNvcmRDaGFuZ2VzKSB7XG4gICAgICAgICAgICAgICAgY2hhbmdlc1tpXSA9IHtcbiAgICAgICAgICAgICAgICAgICAgdGFibGVOYW1lLFxuICAgICAgICAgICAgICAgICAgICB2YXJOYW1lLFxuICAgICAgICAgICAgICAgICAgICBvbGRWYWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgbmV3VmFsdWU6IHVwZGF0ZS52YWx1ZVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlY29yZENoYW5nZXMpIHtcbiAgICAgICAgICAgIHRoaXMuZW1pdChcImNoYW5nZVwiLCB7XG4gICAgICAgICAgICAgICAgZW50aXR5LFxuICAgICAgICAgICAgICAgIGNoYW5nZXNcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIF91cGRhdGVzVG9Qcm9wT2JqZWN0KHRhcmdldCwgdXBkYXRlcykge1xuICAgICAgICBmb3IgKGNvbnN0IHVwZGF0ZSBvZiB1cGRhdGVzKSB7XG4gICAgICAgICAgICBjb25zdCB0YWJsZU5hbWUgPSB1cGRhdGUucHJvcC50YWJsZS5uZXRUYWJsZU5hbWU7XG4gICAgICAgICAgICBjb25zdCB2YXJOYW1lID0gdXBkYXRlLnByb3AucHJvcC52YXJOYW1lO1xuICAgICAgICAgICAgdGFyZ2V0W3RhYmxlTmFtZV0gPSBPYmplY3QuYXNzaWduKHRhcmdldFt0YWJsZU5hbWVdIHx8IHt9LCB7XG4gICAgICAgICAgICAgICAgW3Zhck5hbWVdOiB1cGRhdGUudmFsdWVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgfVxuICAgIF9oYW5kbGVUZW1wRW50aXRpZXMobXNnKSB7XG4gICAgICAgIGNvbnN0IGVudGl0eUJpdEJ1ZmZlciA9IGJpdGJ1ZmZlcl8xLkJpdFN0cmVhbS5mcm9tKG1zZy5lbnRpdHlEYXRhKTtcbiAgICAgICAgbGV0IGxhc3RDbGFzc0lkID0gLTE7XG4gICAgICAgIGxldCBsYXN0UHJvcHMgPSBudWxsO1xuICAgICAgICAvLyBSZWxpYWJsZSB0ZW1wZW50cyBhcmUgc2VudCB3aXRoIDAgZW50cmllcywgYnV0IHJlYWxseSB0aGV5IGhhdmUgMVxuICAgICAgICBjb25zdCBudW1FbnRyaWVzID0gbXNnLm51bUVudHJpZXMgPT09IDAgPyAxIDogbXNnLm51bUVudHJpZXM7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtRW50cmllczsgKytpKSB7XG4gICAgICAgICAgICBsZXQgZmlyZURlbGF5ID0gMC4wO1xuICAgICAgICAgICAgaWYgKGVudGl0eUJpdEJ1ZmZlci5yZWFkT25lQml0KCkpIHtcbiAgICAgICAgICAgICAgICBmaXJlRGVsYXkgPSBlbnRpdHlCaXRCdWZmZXIucmVhZFNCaXRzKDgpIC8gMTAwLjA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZW50aXR5Qml0QnVmZmVyLnJlYWRPbmVCaXQoKSkge1xuICAgICAgICAgICAgICAgIGxhc3RDbGFzc0lkID0gZW50aXR5Qml0QnVmZmVyLnJlYWRVQml0cyh0aGlzLnNlcnZlckNsYXNzQml0cykgLSAxO1xuICAgICAgICAgICAgICAgIGNvbnN0IHVwZGF0ZXMgPSB0aGlzLl9wYXJzZUVudGl0eVVwZGF0ZShlbnRpdHlCaXRCdWZmZXIsIGxhc3RDbGFzc0lkKTtcbiAgICAgICAgICAgICAgICBsYXN0UHJvcHMgPSB0aGlzLl91cGRhdGVzVG9Qcm9wT2JqZWN0KHt9LCB1cGRhdGVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIGRlbHRhIGFnYWluc3QgbGFzdCB0ZW1wIGVudGl0eVxuICAgICAgICAgICAgICAgIGFzc2VydChsYXN0Q2xhc3NJZCAhPT0gLTEsIFwiRGVsdGEgd2l0aCBubyBiYXNlbGluZVwiKTtcbiAgICAgICAgICAgICAgICBjb25zdCB1cGRhdGVzID0gdGhpcy5fcGFyc2VFbnRpdHlVcGRhdGUoZW50aXR5Qml0QnVmZmVyLCBsYXN0Q2xhc3NJZCk7XG4gICAgICAgICAgICAgICAgbGFzdFByb3BzID0gdGhpcy5fdXBkYXRlc1RvUHJvcE9iamVjdChjbG9uZVByb3BzKCgwLCBhc3NlcnRfZXhpc3RzXzEuZGVmYXVsdCkobGFzdFByb3BzKSksIHVwZGF0ZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5lbWl0KFwidGVtcGVudFwiLCB7XG4gICAgICAgICAgICAgICAgZGVsYXk6IGZpcmVEZWxheSxcbiAgICAgICAgICAgICAgICBjbGFzc0lkOiBsYXN0Q2xhc3NJZCxcbiAgICAgICAgICAgICAgICBzZXJ2ZXJDbGFzczogdGhpcy5zZXJ2ZXJDbGFzc2VzW2xhc3RDbGFzc0lkXSxcbiAgICAgICAgICAgICAgICBwcm9wczogbGFzdFByb3BzXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBfaGFuZGxlUGFja2V0RW50aXRpZXMobXNnKSB7XG4gICAgICAgIC8vIFRha2UgYSBjb3B5IG9mIHRoZSB0cmFuc21pdHRlZCBlbnRpdGllcyBmcm9tIHRoZSBkZWx0YSBmcmFtZVxuICAgICAgICAvLyBPdGhlcndpc2Ugc3RhcnQgd2l0aCBhIGJsYW5rIHNsYXRlXG4gICAgICAgIGNvbnN0IGJhc2VUcmFuc21pdEVudGl0aWVzID0gKDAsIGFzc2VydF9leGlzdHNfMS5kZWZhdWx0KShtc2cuaXNEZWx0YVxuICAgICAgICAgICAgPyB0aGlzLl9mcmFtZXMuZ2V0KG1zZy5kZWx0YUZyb20pXG4gICAgICAgICAgICA6IGltbXV0YWJsZS5TZXQoKSwgYGRlbHRhIGZyb20gdW5rbm93biBmcmFtZSAke21zZy5kZWx0YUZyb219YCk7XG4gICAgICAgIGlmICghbXNnLmlzRGVsdGEpIHtcbiAgICAgICAgICAgIC8vIENsZWFyIG91dCBvbGQgZW50aXRpZXMgLSB0aGlzIGlzIGEgZnVsbCB1cGRhdGVcbiAgICAgICAgICAgIGZvciAoY29uc3QgZW50aXR5SW5kZXggb2YgQXJyYXkuZnJvbSh0aGlzLmVudGl0aWVzLmtleXMoKSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9yZW1vdmVFbnRpdHkoZW50aXR5SW5kZXgsIHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gUmVtb3ZlIGFsbCBmcmFtZXMgLSB3ZSB3b24ndCBiZSB1c2luZyB0aGVtXG4gICAgICAgICAgICB0aGlzLl9mcmFtZXMgPSBpbW11dGFibGUuTWFwKCk7XG4gICAgICAgICAgICAvLyBDbGVhciBhbGwgZW50aXR5IGJhc2VsaW5lc1xuICAgICAgICAgICAgZm9yIChjb25zdCBiYXNlbGluZSBvZiB0aGlzLl9lbnRpdHlCYXNlbGluZXMpIHtcbiAgICAgICAgICAgICAgICBiYXNlbGluZS5jbGVhcigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG5ld0ZyYW1lID0gYmFzZVRyYW5zbWl0RW50aXRpZXMud2l0aE11dGF0aW9ucyhtdXRhYmxlRnJhbWUgPT4gdGhpcy5fcmVhZFBhY2tldEVudGl0aWVzKG1zZywgbXV0YWJsZUZyYW1lKSk7XG4gICAgICAgIHRoaXMuX2ZyYW1lcyA9IHRoaXMuX2ZyYW1lcy5zZXQodGhpcy5fY3VycmVudFNlcnZlclRpY2ssIG5ld0ZyYW1lKTtcbiAgICAgICAgdGhpcy50cmFuc21pdEVudGl0aWVzID0gbmV3RnJhbWU7XG4gICAgICAgIC8vIERlbGV0ZSBvbGQgZnJhbWVzIHRoYXQgd2Ugbm8gbG9uZ2VyIG5lZWQgdG8gcmVmZXJlbmNlXG4gICAgICAgIGlmIChtc2cuaXNEZWx0YSkge1xuICAgICAgICAgICAgY29uc3Qgb2xkRnJhbWVzID0gKDAsIGl0ZXJfdG9vbHNfMS5maWx0ZXIpKHRpY2sgPT4gdGljayA8IG1zZy5kZWx0YUZyb20sIHRoaXMuX2ZyYW1lcy5rZXlzKCkpO1xuICAgICAgICAgICAgdGhpcy5fZnJhbWVzID0gdGhpcy5fZnJhbWVzLnJlbW92ZUFsbChvbGRGcmFtZXMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIF9yZWFkUGFja2V0RW50aXRpZXMobXNnLCBmcmFtZSkge1xuICAgICAgICBjb25zdCBlbnRpdHlCaXRCdWZmZXIgPSBiaXRidWZmZXJfMS5CaXRTdHJlYW0uZnJvbShtc2cuZW50aXR5RGF0YSk7XG4gICAgICAgIGxldCBlbnRpdHlJbmRleCA9IC0xO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1zZy51cGRhdGVkRW50cmllczsgKytpKSB7XG4gICAgICAgICAgICBlbnRpdHlJbmRleCArPSAxICsgZW50aXR5Qml0QnVmZmVyLnJlYWRVQml0VmFyKCk7XG4gICAgICAgICAgICBhc3NlcnQoZW50aXR5SW5kZXggPCBjb25zdHMuTUFYX0VESUNUUywgXCJuZXdFbnRpdHkgPj0gTUFYX0VESUNUU1wiKTtcbiAgICAgICAgICAgIGlmIChlbnRpdHlCaXRCdWZmZXIucmVhZE9uZUJpdCgpKSB7XG4gICAgICAgICAgICAgICAgYXNzZXJ0KG1zZy5pc0RlbHRhLCBcImVudGl0eSBsZWF2aW5nIFBWUyBvbiBmdWxsIHVwZGF0ZVwiKTtcbiAgICAgICAgICAgICAgICBmcmFtZS5yZW1vdmUoZW50aXR5SW5kZXgpO1xuICAgICAgICAgICAgICAgIGlmIChlbnRpdHlCaXRCdWZmZXIucmVhZE9uZUJpdCgpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIDBiMTE6IEZIRFJfTEVBVkVQVlMgfCBGSERSX0RFTEVURVxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9yZW1vdmVFbnRpdHkoZW50aXR5SW5kZXgsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIDBiMTA6IEZIRFJfTEVBVkVQVlNcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWR1cGUtZWxzZS1pZlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoZW50aXR5Qml0QnVmZmVyLnJlYWRPbmVCaXQoKSkge1xuICAgICAgICAgICAgICAgIC8vIDBiMDE6IEZIRFJfRU5URVJQVlNcbiAgICAgICAgICAgICAgICBmcmFtZS5hZGQoZW50aXR5SW5kZXgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGNsYXNzSWQgPSBlbnRpdHlCaXRCdWZmZXIucmVhZFVCaXRzKHRoaXMuc2VydmVyQ2xhc3NCaXRzKTtcbiAgICAgICAgICAgICAgICBjb25zdCBzZXJpYWxOdW0gPSBlbnRpdHlCaXRCdWZmZXIucmVhZFVCaXRzKGNvbnN0cy5OVU1fTkVUV09SS0VEX0VIQU5ETEVfU0VSSUFMX05VTUJFUl9CSVRTKTtcbiAgICAgICAgICAgICAgICBjb25zdCBleGlzdGluZ0Jhc2VsaW5lID0gdGhpcy5fZW50aXR5QmFzZWxpbmVzW21zZy5iYXNlbGluZV0uZ2V0KGVudGl0eUluZGV4KTtcbiAgICAgICAgICAgICAgICBjb25zdCBlbnRpdHlCYXNlbGluZVByb3BzID0gbXNnLmlzRGVsdGEgJiYgKGV4aXN0aW5nQmFzZWxpbmUgPT09IG51bGwgfHwgZXhpc3RpbmdCYXNlbGluZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogZXhpc3RpbmdCYXNlbGluZS5jbGFzc0lkKSA9PT0gY2xhc3NJZFxuICAgICAgICAgICAgICAgICAgICA/IGV4aXN0aW5nQmFzZWxpbmUucHJvcHNcbiAgICAgICAgICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgY29uc3QgZXhpc3RpbmdFbnRpdHkgPSB0aGlzLmVudGl0aWVzLmdldChlbnRpdHlJbmRleCk7XG4gICAgICAgICAgICAgICAgY29uc3QgZW50aXR5ID0gdGhpcy5fYWRkRW50aXR5KGVudGl0eUluZGV4LCBjbGFzc0lkLCBzZXJpYWxOdW0sIGV4aXN0aW5nRW50aXR5LCBlbnRpdHlCYXNlbGluZVByb3BzKTtcbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1hcmd1bWVudFxuICAgICAgICAgICAgICAgIHRoaXMuX3JlYWROZXdFbnRpdHkoZW50aXR5Qml0QnVmZmVyLCBlbnRpdHkpO1xuICAgICAgICAgICAgICAgIGlmIChlbnRpdHkgIT09IGV4aXN0aW5nRW50aXR5KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGV2ZW50VmFycyA9IHsgZW50aXR5IH07XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZW1pdChcImNyZWF0ZVwiLCBldmVudFZhcnMpO1xuICAgICAgICAgICAgICAgICAgICAvLyBTdGlsbCBlbWl0ICdwb3N0Y3JlYXRlJyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0KFwicG9zdGNyZWF0ZVwiLCBldmVudFZhcnMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBVcGRhdGUgdGhlIE9USEVSIGJhc2VsaW5lIHdpdGggdGhlIG1lcmdlZCByZXN1bHQgb2YgYG9sZCBiYXNlbGluZSArIG5ldyBwcm9wc2BcbiAgICAgICAgICAgICAgICBpZiAobXNnLnVwZGF0ZUJhc2VsaW5lKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2VudGl0eUJhc2VsaW5lc1ttc2cuYmFzZWxpbmUgPyAwIDogMV0uc2V0KGVudGl0eUluZGV4LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzc0lkLFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtYXJndW1lbnRcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3BzOiBjbG9uZVByb3BzKGVudGl0eS5wcm9wcylcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gMGIwMDogRGVsdGFFbnRcbiAgICAgICAgICAgICAgICBjb25zdCBlbnRpdHkgPSAoMCwgYXNzZXJ0X2V4aXN0c18xLmRlZmF1bHQpKHRoaXMuZW50aXRpZXMuZ2V0KGVudGl0eUluZGV4KSwgYG1pc3NpbmcgY2xpZW50IGVudGl0eSAke2VudGl0eUluZGV4fWApO1xuICAgICAgICAgICAgICAgIGFzc2VydChmcmFtZS5jb250YWlucyhlbnRpdHlJbmRleCksIGBkZWx0YSBvbiBkb3JtYW50IGVudGl0eSAke2VudGl0eUluZGV4fWApO1xuICAgICAgICAgICAgICAgIHRoaXMuX3JlYWROZXdFbnRpdHkoZW50aXR5Qml0QnVmZmVyLCBlbnRpdHkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIFJlYWQgZGVsZXRpb25zXG4gICAgICAgIGlmIChtc2cuaXNEZWx0YSkge1xuICAgICAgICAgICAgZW50aXR5SW5kZXggPSAtMTtcbiAgICAgICAgICAgIGNvbnN0IGRlbGV0aW9ucyA9IGVudGl0eUJpdEJ1ZmZlci5yZWFkVUJpdFZhcigpO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkZWxldGlvbnM7ICsraSkge1xuICAgICAgICAgICAgICAgIGVudGl0eUluZGV4ICs9IGVudGl0eUJpdEJ1ZmZlci5yZWFkVUJpdFZhcigpO1xuICAgICAgICAgICAgICAgIC8vIEVudGl0eSB3YXNuJ3QgZGVhbHQgd2l0aCBpbiBwYWNrZXQsIGJ1dCBoYXMgYmVlbiBkZWxldGVkXG4gICAgICAgICAgICAgICAgZnJhbWUucmVtb3ZlKGVudGl0eUluZGV4KTtcbiAgICAgICAgICAgICAgICB0aGlzLl9yZW1vdmVFbnRpdHkoZW50aXR5SW5kZXgsIGZhbHNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBfcGFyc2VJbnN0YW5jZUJhc2VsaW5lKGJhc2VsaW5lQnVmLCBjbGFzc0lkKSB7XG4gICAgICAgIGNvbnN0IGNsYXNzQmFzZWxpbmUgPSB7fTtcbiAgICAgICAgZm9yIChjb25zdCBibCBvZiB0aGlzLl9wYXJzZUVudGl0eVVwZGF0ZShiYXNlbGluZUJ1ZiwgY2xhc3NJZCkpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhYmxlTmFtZSA9IGJsLnByb3AudGFibGUubmV0VGFibGVOYW1lO1xuICAgICAgICAgICAgY29uc3QgdmFyTmFtZSA9IGJsLnByb3AucHJvcC52YXJOYW1lO1xuICAgICAgICAgICAgY29uc3QgdGFibGUgPSBjbGFzc0Jhc2VsaW5lW3RhYmxlTmFtZV07XG4gICAgICAgICAgICBpZiAodGFibGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGNsYXNzQmFzZWxpbmVbdGFibGVOYW1lXSA9IHsgW3Zhck5hbWVdOiBibC52YWx1ZSB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGFibGVbdmFyTmFtZV0gPSBibC52YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2xhc3NCYXNlbGluZTtcbiAgICB9XG4gICAgX2hhbmRsZVVzZXJJbmZvVXBkYXRlKGNsaWVudFNsb3QsIG9sZFBsYXllckluZm8sIHBsYXllckluZm8pIHtcbiAgICAgICAgaWYgKG9sZFBsYXllckluZm8gIT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5fdXNlcklkVG9FbnRpdHkuZGVsZXRlKG9sZFBsYXllckluZm8udXNlcklkKTtcbiAgICAgICAgICAgIHRoaXMuX3N0ZWFtNjRJZFRvRW50aXR5LmRlbGV0ZShvbGRQbGF5ZXJJbmZvLnh1aWQudG9TdHJpbmcoKSk7XG4gICAgICAgICAgICB0aGlzLl9hY2NvdW50TnVtYmVyVG9FbnRpdHkuZGVsZXRlKG9sZFBsYXllckluZm8uZnJpZW5kc0lkKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGxheWVySW5mbyAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLl91c2VySWRUb0VudGl0eS5zZXQocGxheWVySW5mby51c2VySWQsIGNsaWVudFNsb3QgKyAxKTtcbiAgICAgICAgICAgIHRoaXMuX3N0ZWFtNjRJZFRvRW50aXR5LnNldChwbGF5ZXJJbmZvLnh1aWQudG9TdHJpbmcoKSwgY2xpZW50U2xvdCArIDEpO1xuICAgICAgICAgICAgdGhpcy5fYWNjb3VudE51bWJlclRvRW50aXR5LnNldChwbGF5ZXJJbmZvLmZyaWVuZHNJZCwgY2xpZW50U2xvdCArIDEpO1xuICAgICAgICB9XG4gICAgfVxuICAgIF9oYW5kbGVJbnN0YW5jZUJhc2VsaW5lVXBkYXRlKGV2ZW50KSB7XG4gICAgICAgIGlmICghZXZlbnQudXNlckRhdGEpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGNvbnN0IGNsYXNzSWQgPSBwYXJzZUludChldmVudC5lbnRyeSwgMTApO1xuICAgICAgICBjb25zdCBiYXNlbGluZUJ1ZiA9IGJpdGJ1ZmZlcl8xLkJpdFN0cmVhbS5mcm9tKGV2ZW50LnVzZXJEYXRhKTtcbiAgICAgICAgaWYgKCF0aGlzLnNlcnZlckNsYXNzZXNbY2xhc3NJZF0pIHtcbiAgICAgICAgICAgIHRoaXMucGVuZGluZ0Jhc2VsaW5lc1tjbGFzc0lkXSA9IGJhc2VsaW5lQnVmO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGJhc2VsaW5lID0gdGhpcy5fcGFyc2VJbnN0YW5jZUJhc2VsaW5lKGJhc2VsaW5lQnVmLCBjbGFzc0lkKTtcbiAgICAgICAgdGhpcy5zdGF0aWNCYXNlbGluZXNbY2xhc3NJZF0gPSBiYXNlbGluZTtcbiAgICAgICAgdGhpcy5lbWl0KFwiYmFzZWxpbmV1cGRhdGVcIiwge1xuICAgICAgICAgICAgY2xhc3NJZCxcbiAgICAgICAgICAgIHNlcnZlckNsYXNzOiB0aGlzLnNlcnZlckNsYXNzZXNbY2xhc3NJZF0sXG4gICAgICAgICAgICBiYXNlbGluZVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgX2hhbmRsZVN0cmluZ1RhYmxlVXBkYXRlKGV2ZW50KSB7XG4gICAgICAgIGlmIChldmVudC50YWJsZS5uYW1lID09PSBcInVzZXJpbmZvXCIpIHtcbiAgICAgICAgICAgIHRoaXMuX2hhbmRsZVVzZXJJbmZvVXBkYXRlKGV2ZW50LmVudHJ5SW5kZXgsIGV2ZW50Lm9sZFVzZXJEYXRhLCBldmVudC51c2VyRGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZXZlbnQudGFibGUubmFtZSA9PT0gXCJpbnN0YW5jZWJhc2VsaW5lXCIpIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWFyZ3VtZW50XG4gICAgICAgICAgICB0aGlzLl9oYW5kbGVJbnN0YW5jZUJhc2VsaW5lVXBkYXRlKGV2ZW50KTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmV4cG9ydHMuRW50aXRpZXMgPSBFbnRpdGllcztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWVudGl0aWVzLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5CYXNlRW50aXR5ID0gdm9pZCAwO1xuY29uc3QgbmV0d29ya2FibGVfMSA9IHJlcXVpcmUoXCIuL25ldHdvcmthYmxlXCIpO1xuLyoqXG4gKiBSZXByZXNlbnRzIGFuIGluLWdhbWUgZW50aXR5LlxuICovXG5jbGFzcyBCYXNlRW50aXR5IGV4dGVuZHMgbmV0d29ya2FibGVfMS5OZXR3b3JrYWJsZSB7XG4gICAgLyoqXG4gICAgICogUG9zaXRpb24gb2YgdGhpcyBlbnRpdHkgaW4gdGhlIGdhbWUgd29ybGQuXG4gICAgICogQHJldHVybnMgV29ybGQtc3BhY2UgY29vcmRpbmF0ZXNcbiAgICAgKi9cbiAgICBnZXQgcG9zaXRpb24oKSB7XG4gICAgICAgIGNvbnN0IGNlbGxXaWR0aCA9IDEgPDwgdGhpcy5nZXRQcm9wKFwiRFRfQmFzZUVudGl0eVwiLCBcIm1fY2VsbGJpdHNcIik7XG4gICAgICAgIGNvbnN0IGNlbGxYID0gdGhpcy5nZXRQcm9wKFwiRFRfQmFzZUVudGl0eVwiLCBcIm1fY2VsbFhcIik7XG4gICAgICAgIGNvbnN0IGNlbGxZID0gdGhpcy5nZXRQcm9wKFwiRFRfQmFzZUVudGl0eVwiLCBcIm1fY2VsbFlcIik7XG4gICAgICAgIGNvbnN0IGNlbGxaID0gdGhpcy5nZXRQcm9wKFwiRFRfQmFzZUVudGl0eVwiLCBcIm1fY2VsbFpcIik7XG4gICAgICAgIGNvbnN0IGNlbGxPZmZzZXQgPSB0aGlzLmdldFByb3AoXCJEVF9CYXNlRW50aXR5XCIsIFwibV92ZWNPcmlnaW5cIik7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB4OiBjZWxsWCAqIGNlbGxXaWR0aCAtIDE2Mzg0ICsgY2VsbE9mZnNldC54LFxuICAgICAgICAgICAgeTogY2VsbFkgKiBjZWxsV2lkdGggLSAxNjM4NCArIGNlbGxPZmZzZXQueSxcbiAgICAgICAgICAgIHo6IGNlbGxaICogY2VsbFdpZHRoIC0gMTYzODQgKyBjZWxsT2Zmc2V0LnpcbiAgICAgICAgfTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHJldHVybnMgRW50aXR5IHdoaWNoIHRoaXMgZW50aXR5IGlzIG1vdmluZyB3aXRoLCBpZiBhbnlcbiAgICAgKi9cbiAgICBnZXQgbW92ZVBhcmVudCgpIHtcbiAgICAgICAgLy8gVU5TQUZFOiBjYXN0IGhlcmUgYXMgbW92ZSBwYXJlbnQgd2lsbCBhbHdheXMgYmUgYSBwcm9wZXIgZW50aXR5XG4gICAgICAgIHJldHVybiB0aGlzLl9kZW1vLmVudGl0aWVzLmdldEJ5SGFuZGxlKHRoaXMuZ2V0UHJvcChcIkRUX0Jhc2VFbnRpdHlcIiwgXCJtb3ZlcGFyZW50XCIpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHJldHVybnMgT3duaW5nIGVudGl0eSwgaWYgYW55XG4gICAgICovXG4gICAgZ2V0IG93bmVyKCkge1xuICAgICAgICAvLyBVTlNBRkU6IGNhc3QgaGVyZSBhcyBvd25lciB3aWxsIGFsd2F5cyBiZSBhIHByb3BlciBlbnRpdHlcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlbW8uZW50aXRpZXMuZ2V0QnlIYW5kbGUodGhpcy5nZXRQcm9wKFwiRFRfQmFzZUVudGl0eVwiLCBcIm1faE93bmVyRW50aXR5XCIpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHJldHVybnMgVGVhbSBudW1iZXIgKDA6IFVuYXNzaWduZWQsIDE6IFNwZWN0YXRvciwgMjogVGVycm9yaXN0LCAzOiBDb3VudGVyLVRlcnJvcmlzdClcbiAgICAgKi9cbiAgICBnZXQgdGVhbU51bWJlcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UHJvcChcIkRUX0Jhc2VFbnRpdHlcIiwgXCJtX2lUZWFtTnVtXCIpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAcmV0dXJucyBUZWFtIGlmIGFzc2lnbmVkLCBudWxsIGlmIHVuYXNzaWduZWQuXG4gICAgICovXG4gICAgZ2V0IHRlYW0oKSB7XG4gICAgICAgIGNvbnN0IHRlYW1OdW0gPSB0aGlzLnRlYW1OdW1iZXI7XG4gICAgICAgIGlmICh0ZWFtTnVtID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fZGVtby5lbnRpdGllcy50ZWFtc1t0ZWFtTnVtXTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHJldHVybnMgTmFtZSBvZiB0aGUgbW9kZWwgdGhhdCBzaG91bGQgYmUgcmVuZGVyZWQgZm9yIHRoaXMgZW50aXR5LiAoZS5nLiAnbW9kZWxzL1dlYXBvbnMvd19lcV9zbW9rZWdyZW5hZGVfdGhyb3duLm1kbCcpXG4gICAgICovXG4gICAgZ2V0IG1vZGVsTmFtZSgpIHtcbiAgICAgICAgY29uc3QgbW9kZWxwcmVjYWNoZSA9IHRoaXMuX2RlbW8uc3RyaW5nVGFibGVzLmZpbmRUYWJsZUJ5TmFtZShcIm1vZGVscHJlY2FjaGVcIik7XG4gICAgICAgIGlmICghbW9kZWxwcmVjYWNoZSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1vZGVscHJlY2FjaGUuZW50cmllc1t0aGlzLmdldFByb3AoXCJEVF9CYXNlRW50aXR5XCIsIFwibV9uTW9kZWxJbmRleFwiKV0uZW50cnk7XG4gICAgfVxufVxuZXhwb3J0cy5CYXNlRW50aXR5ID0gQmFzZUVudGl0eTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWJhc2VlbnRpdHkuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLkdhbWVSdWxlcyA9IHZvaWQgMDtcbmNvbnN0IG5ldHdvcmthYmxlXzEgPSByZXF1aXJlKFwiLi9uZXR3b3JrYWJsZVwiKTtcbi8qKlxuICogUmVwcmVzZW50cyB0aGUgZ2FtZSBydWxlcy5cbiAqL1xuY2xhc3MgR2FtZVJ1bGVzIGV4dGVuZHMgbmV0d29ya2FibGVfMS5OZXR3b3JrYWJsZSB7XG4gICAgLyoqXG4gICAgICogQHJldHVybnMgSXMgdGhlIGdhbWUgY3VycmVudGx5IGluICd3YXJtdXAnIG1vZGU/XG4gICAgICovXG4gICAgZ2V0IGlzV2FybXVwKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQcm9wKFwiRFRfQ1NHYW1lUnVsZXNcIiwgXCJtX2JXYXJtdXBQZXJpb2RcIik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkIFVzZSBgR2FtZVJ1bGVzI3JvdW5kc1BsYXllZGAgaW5zdGVhZC5cbiAgICAgKi9cbiAgICBnZXQgcm91bmROdW1iZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJvdW5kc1BsYXllZDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhpcyB2YWx1ZSBpcyBpbmNyZW1lbnRlZCB3aGVuIHRoZSBzY29yZXMgYXJlIHVwZGF0ZWQgYXQgcm91bmQgZW5kLlxuICAgICAqIElmIHlvdSBuZWVkIHRvIGtlZXAgdHJhY2sgb2YgdGhlIGN1cnJlbnQgcm91bmQgbnVtYmVyLCBzdG9yZSB0aGlzIHZhbHVlXG4gICAgICogYXQgZWFjaCBgcm91bmRfc3RhcnRgLlxuICAgICAqXG4gICAgICogQHJldHVybnMgVG90YWwgbnVtYmVyIG9mIHJvdW5kcyBwbGF5ZWQuXG4gICAgICovXG4gICAgZ2V0IHJvdW5kc1BsYXllZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UHJvcChcIkRUX0NTR2FtZVJ1bGVzXCIsIFwibV90b3RhbFJvdW5kc1BsYXllZFwiKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHJldHVybnMgJ2ZpcnN0JywgJ3NlY29uZCcsICdoYWxmdGltZScgb3IgJ3Bvc3RnYW1lJ1xuICAgICAqL1xuICAgIGdldCBwaGFzZSgpIHtcbiAgICAgICAgY29uc3QgZ2FtZVBoYXNlcyA9IHtcbiAgICAgICAgICAgIDI6IFwiZmlyc3RcIixcbiAgICAgICAgICAgIDM6IFwic2Vjb25kXCIsXG4gICAgICAgICAgICA0OiBcImhhbGZ0aW1lXCIsXG4gICAgICAgICAgICA1OiBcInBvc3RnYW1lXCJcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgcGhhc2UgPSB0aGlzLmdldFByb3AoXCJEVF9DU0dhbWVSdWxlc1wiLCBcIm1fZ2FtZVBoYXNlXCIpO1xuICAgICAgICByZXR1cm4gZ2FtZVBoYXNlc1twaGFzZV07XG4gICAgfVxufVxuZXhwb3J0cy5HYW1lUnVsZXMgPSBHYW1lUnVsZXM7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1nYW1lcnVsZXMuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vLyBETyBOT1QgTU9ESUZZIVxuLy8gQXV0by1nZW5lcmF0ZWQgYnkgLi9nZW5lcmF0b3JzL2l0ZW1kZWZzLnRzXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLnBhaW50S2l0SW5kZXhNYXAgPSBleHBvcnRzLml0ZW1EZWZpbml0aW9uSW5kZXhNYXAgPSB2b2lkIDA7XG5leHBvcnRzLml0ZW1EZWZpbml0aW9uSW5kZXhNYXAgPSB7XG4gICAgXCIxXCI6IHtcbiAgICAgICAgY2xhc3NOYW1lOiBcIndlYXBvbl9kZWFnbGVcIixcbiAgICAgICAgaXRlbU5hbWU6IFwiRGVzZXJ0IEVhZ2xlXCJcbiAgICB9LFxuICAgIFwiMlwiOiB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJ3ZWFwb25fZWxpdGVcIixcbiAgICAgICAgaXRlbU5hbWU6IFwiRHVhbCBCZXJldHRhc1wiXG4gICAgfSxcbiAgICBcIjNcIjoge1xuICAgICAgICBjbGFzc05hbWU6IFwid2VhcG9uX2ZpdmVzZXZlblwiLFxuICAgICAgICBpdGVtTmFtZTogXCJGaXZlLVNldmVOXCJcbiAgICB9LFxuICAgIFwiNFwiOiB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJ3ZWFwb25fZ2xvY2tcIixcbiAgICAgICAgaXRlbU5hbWU6IFwiR2xvY2stMThcIlxuICAgIH0sXG4gICAgXCI3XCI6IHtcbiAgICAgICAgY2xhc3NOYW1lOiBcIndlYXBvbl9hazQ3XCIsXG4gICAgICAgIGl0ZW1OYW1lOiBcIkFLLTQ3XCJcbiAgICB9LFxuICAgIFwiOFwiOiB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJ3ZWFwb25fYXVnXCIsXG4gICAgICAgIGl0ZW1OYW1lOiBcIkFVR1wiXG4gICAgfSxcbiAgICBcIjlcIjoge1xuICAgICAgICBjbGFzc05hbWU6IFwid2VhcG9uX2F3cFwiLFxuICAgICAgICBpdGVtTmFtZTogXCJBV1BcIlxuICAgIH0sXG4gICAgXCIxMFwiOiB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJ3ZWFwb25fZmFtYXNcIixcbiAgICAgICAgaXRlbU5hbWU6IFwiRkFNQVNcIlxuICAgIH0sXG4gICAgXCIxMVwiOiB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJ3ZWFwb25fZzNzZzFcIixcbiAgICAgICAgaXRlbU5hbWU6IFwiRzNTRzFcIlxuICAgIH0sXG4gICAgXCIxM1wiOiB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJ3ZWFwb25fZ2FsaWxhclwiLFxuICAgICAgICBpdGVtTmFtZTogXCJHYWxpbCBBUlwiXG4gICAgfSxcbiAgICBcIjE0XCI6IHtcbiAgICAgICAgY2xhc3NOYW1lOiBcIndlYXBvbl9tMjQ5XCIsXG4gICAgICAgIGl0ZW1OYW1lOiBcIk0yNDlcIlxuICAgIH0sXG4gICAgXCIxNlwiOiB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJ3ZWFwb25fbTRhMVwiLFxuICAgICAgICBpdGVtTmFtZTogXCJNNEE0XCJcbiAgICB9LFxuICAgIFwiMTdcIjoge1xuICAgICAgICBjbGFzc05hbWU6IFwid2VhcG9uX21hYzEwXCIsXG4gICAgICAgIGl0ZW1OYW1lOiBcIk1BQy0xMFwiXG4gICAgfSxcbiAgICBcIjE5XCI6IHtcbiAgICAgICAgY2xhc3NOYW1lOiBcIndlYXBvbl9wOTBcIixcbiAgICAgICAgaXRlbU5hbWU6IFwiUDkwXCJcbiAgICB9LFxuICAgIFwiMjBcIjoge1xuICAgICAgICBjbGFzc05hbWU6IFwid2VhcG9uX3pvbmVfcmVwdWxzb3JcIixcbiAgICAgICAgaXRlbU5hbWU6IFwiUmVwdWxzb3IgRGV2aWNlXCJcbiAgICB9LFxuICAgIFwiMjNcIjoge1xuICAgICAgICBjbGFzc05hbWU6IFwid2VhcG9uX21wNXNkXCIsXG4gICAgICAgIGl0ZW1OYW1lOiBcIk1QNS1TRFwiXG4gICAgfSxcbiAgICBcIjI0XCI6IHtcbiAgICAgICAgY2xhc3NOYW1lOiBcIndlYXBvbl91bXA0NVwiLFxuICAgICAgICBpdGVtTmFtZTogXCJVTVAtNDVcIlxuICAgIH0sXG4gICAgXCIyNVwiOiB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJ3ZWFwb25feG0xMDE0XCIsXG4gICAgICAgIGl0ZW1OYW1lOiBcIlhNMTAxNFwiXG4gICAgfSxcbiAgICBcIjI2XCI6IHtcbiAgICAgICAgY2xhc3NOYW1lOiBcIndlYXBvbl9iaXpvblwiLFxuICAgICAgICBpdGVtTmFtZTogXCJQUC1CaXpvblwiXG4gICAgfSxcbiAgICBcIjI3XCI6IHtcbiAgICAgICAgY2xhc3NOYW1lOiBcIndlYXBvbl9tYWc3XCIsXG4gICAgICAgIGl0ZW1OYW1lOiBcIk1BRy03XCJcbiAgICB9LFxuICAgIFwiMjhcIjoge1xuICAgICAgICBjbGFzc05hbWU6IFwid2VhcG9uX25lZ2V2XCIsXG4gICAgICAgIGl0ZW1OYW1lOiBcIk5lZ2V2XCJcbiAgICB9LFxuICAgIFwiMjlcIjoge1xuICAgICAgICBjbGFzc05hbWU6IFwid2VhcG9uX3Nhd2Vkb2ZmXCIsXG4gICAgICAgIGl0ZW1OYW1lOiBcIlNhd2VkLU9mZlwiXG4gICAgfSxcbiAgICBcIjMwXCI6IHtcbiAgICAgICAgY2xhc3NOYW1lOiBcIndlYXBvbl90ZWM5XCIsXG4gICAgICAgIGl0ZW1OYW1lOiBcIlRlYy05XCJcbiAgICB9LFxuICAgIFwiMzFcIjoge1xuICAgICAgICBjbGFzc05hbWU6IFwid2VhcG9uX3Rhc2VyXCIsXG4gICAgICAgIGl0ZW1OYW1lOiBcIlpldXMgeDI3XCJcbiAgICB9LFxuICAgIFwiMzJcIjoge1xuICAgICAgICBjbGFzc05hbWU6IFwid2VhcG9uX2hrcDIwMDBcIixcbiAgICAgICAgaXRlbU5hbWU6IFwiUDIwMDBcIlxuICAgIH0sXG4gICAgXCIzM1wiOiB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJ3ZWFwb25fbXA3XCIsXG4gICAgICAgIGl0ZW1OYW1lOiBcIk1QN1wiXG4gICAgfSxcbiAgICBcIjM0XCI6IHtcbiAgICAgICAgY2xhc3NOYW1lOiBcIndlYXBvbl9tcDlcIixcbiAgICAgICAgaXRlbU5hbWU6IFwiTVA5XCJcbiAgICB9LFxuICAgIFwiMzVcIjoge1xuICAgICAgICBjbGFzc05hbWU6IFwid2VhcG9uX25vdmFcIixcbiAgICAgICAgaXRlbU5hbWU6IFwiTm92YVwiXG4gICAgfSxcbiAgICBcIjM2XCI6IHtcbiAgICAgICAgY2xhc3NOYW1lOiBcIndlYXBvbl9wMjUwXCIsXG4gICAgICAgIGl0ZW1OYW1lOiBcIlAyNTBcIlxuICAgIH0sXG4gICAgXCIzN1wiOiB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJ3ZWFwb25fc2hpZWxkXCIsXG4gICAgICAgIGl0ZW1OYW1lOiBcIlJpb3QgU2hpZWxkXCJcbiAgICB9LFxuICAgIFwiMzhcIjoge1xuICAgICAgICBjbGFzc05hbWU6IFwid2VhcG9uX3NjYXIyMFwiLFxuICAgICAgICBpdGVtTmFtZTogXCJTQ0FSLTIwXCJcbiAgICB9LFxuICAgIFwiMzlcIjoge1xuICAgICAgICBjbGFzc05hbWU6IFwid2VhcG9uX3NnNTU2XCIsXG4gICAgICAgIGl0ZW1OYW1lOiBcIlNHIDU1M1wiXG4gICAgfSxcbiAgICBcIjQwXCI6IHtcbiAgICAgICAgY2xhc3NOYW1lOiBcIndlYXBvbl9zc2cwOFwiLFxuICAgICAgICBpdGVtTmFtZTogXCJTU0cgMDhcIlxuICAgIH0sXG4gICAgXCI0MVwiOiB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJ3ZWFwb25fa25pZmVnZ1wiLFxuICAgICAgICBpdGVtTmFtZTogXCJLbmlmZVwiXG4gICAgfSxcbiAgICBcIjQyXCI6IHtcbiAgICAgICAgY2xhc3NOYW1lOiBcIndlYXBvbl9rbmlmZVwiLFxuICAgICAgICBpdGVtTmFtZTogXCJLbmlmZVwiXG4gICAgfSxcbiAgICBcIjQzXCI6IHtcbiAgICAgICAgY2xhc3NOYW1lOiBcIndlYXBvbl9mbGFzaGJhbmdcIixcbiAgICAgICAgaXRlbU5hbWU6IFwiRmxhc2hiYW5nXCJcbiAgICB9LFxuICAgIFwiNDRcIjoge1xuICAgICAgICBjbGFzc05hbWU6IFwid2VhcG9uX2hlZ3JlbmFkZVwiLFxuICAgICAgICBpdGVtTmFtZTogXCJIaWdoIEV4cGxvc2l2ZSBHcmVuYWRlXCJcbiAgICB9LFxuICAgIFwiNDVcIjoge1xuICAgICAgICBjbGFzc05hbWU6IFwid2VhcG9uX3Ntb2tlZ3JlbmFkZVwiLFxuICAgICAgICBpdGVtTmFtZTogXCJTbW9rZSBHcmVuYWRlXCJcbiAgICB9LFxuICAgIFwiNDZcIjoge1xuICAgICAgICBjbGFzc05hbWU6IFwid2VhcG9uX21vbG90b3ZcIixcbiAgICAgICAgaXRlbU5hbWU6IFwiTW9sb3RvdlwiXG4gICAgfSxcbiAgICBcIjQ3XCI6IHtcbiAgICAgICAgY2xhc3NOYW1lOiBcIndlYXBvbl9kZWNveVwiLFxuICAgICAgICBpdGVtTmFtZTogXCJEZWNveSBHcmVuYWRlXCJcbiAgICB9LFxuICAgIFwiNDhcIjoge1xuICAgICAgICBjbGFzc05hbWU6IFwid2VhcG9uX2luY2dyZW5hZGVcIixcbiAgICAgICAgaXRlbU5hbWU6IFwiSW5jZW5kaWFyeSBHcmVuYWRlXCJcbiAgICB9LFxuICAgIFwiNDlcIjoge1xuICAgICAgICBjbGFzc05hbWU6IFwid2VhcG9uX2M0XCIsXG4gICAgICAgIGl0ZW1OYW1lOiBcIkM0IEV4cGxvc2l2ZVwiXG4gICAgfSxcbiAgICBcIjU3XCI6IHtcbiAgICAgICAgY2xhc3NOYW1lOiBcIndlYXBvbl9oZWFsdGhzaG90XCIsXG4gICAgICAgIGl0ZW1OYW1lOiBcIk1lZGktU2hvdFwiXG4gICAgfSxcbiAgICBcIjU5XCI6IHtcbiAgICAgICAgY2xhc3NOYW1lOiBcIndlYXBvbl9rbmlmZV90XCIsXG4gICAgICAgIGl0ZW1OYW1lOiBcIktuaWZlXCJcbiAgICB9LFxuICAgIFwiNjBcIjoge1xuICAgICAgICBjbGFzc05hbWU6IFwid2VhcG9uX200YTFfc2lsZW5jZXJcIixcbiAgICAgICAgaXRlbU5hbWU6IFwiTTRBMS1TXCJcbiAgICB9LFxuICAgIFwiNjFcIjoge1xuICAgICAgICBjbGFzc05hbWU6IFwid2VhcG9uX3VzcF9zaWxlbmNlclwiLFxuICAgICAgICBpdGVtTmFtZTogXCJVU1AtU1wiXG4gICAgfSxcbiAgICBcIjYzXCI6IHtcbiAgICAgICAgY2xhc3NOYW1lOiBcIndlYXBvbl9jejc1YVwiLFxuICAgICAgICBpdGVtTmFtZTogXCJDWjc1LUF1dG9cIlxuICAgIH0sXG4gICAgXCI2NFwiOiB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJ3ZWFwb25fcmV2b2x2ZXJcIixcbiAgICAgICAgaXRlbU5hbWU6IFwiUjggUmV2b2x2ZXJcIlxuICAgIH0sXG4gICAgXCI2OFwiOiB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJ3ZWFwb25fdGFncmVuYWRlXCIsXG4gICAgICAgIGl0ZW1OYW1lOiBcIlRhY3RpY2FsIEF3YXJlbmVzcyBHcmVuYWRlXCJcbiAgICB9LFxuICAgIFwiNjlcIjoge1xuICAgICAgICBjbGFzc05hbWU6IFwid2VhcG9uX2Zpc3RzXCIsXG4gICAgICAgIGl0ZW1OYW1lOiBcIkJhcmUgSGFuZHNcIlxuICAgIH0sXG4gICAgXCI3MFwiOiB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJ3ZWFwb25fYnJlYWNoY2hhcmdlXCIsXG4gICAgICAgIGl0ZW1OYW1lOiBcIkJyZWFjaCBDaGFyZ2VcIlxuICAgIH0sXG4gICAgXCI3MlwiOiB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJ3ZWFwb25fdGFibGV0XCIsXG4gICAgICAgIGl0ZW1OYW1lOiBcIlRhYmxldFwiXG4gICAgfSxcbiAgICBcIjc1XCI6IHtcbiAgICAgICAgY2xhc3NOYW1lOiBcIndlYXBvbl9heGVcIixcbiAgICAgICAgaXRlbU5hbWU6IFwiQXhlXCJcbiAgICB9LFxuICAgIFwiNzZcIjoge1xuICAgICAgICBjbGFzc05hbWU6IFwid2VhcG9uX2hhbW1lclwiLFxuICAgICAgICBpdGVtTmFtZTogXCJIYW1tZXJcIlxuICAgIH0sXG4gICAgXCI3OFwiOiB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJ3ZWFwb25fc3Bhbm5lclwiLFxuICAgICAgICBpdGVtTmFtZTogXCJXcmVuY2hcIlxuICAgIH0sXG4gICAgXCI4MFwiOiB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJ3ZWFwb25fa25pZmVfZ2hvc3RcIixcbiAgICAgICAgaXRlbU5hbWU6IFwiS25pZmVcIlxuICAgIH0sXG4gICAgXCI4MVwiOiB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJ3ZWFwb25fZmlyZWJvbWJcIixcbiAgICAgICAgaXRlbU5hbWU6IFwiRmlyZSBCb21iXCJcbiAgICB9LFxuICAgIFwiODJcIjoge1xuICAgICAgICBjbGFzc05hbWU6IFwid2VhcG9uX2RpdmVyc2lvblwiLFxuICAgICAgICBpdGVtTmFtZTogXCJEaXZlcnNpb24gRGV2aWNlXCJcbiAgICB9LFxuICAgIFwiODNcIjoge1xuICAgICAgICBjbGFzc05hbWU6IFwid2VhcG9uX2ZyYWdfZ3JlbmFkZVwiLFxuICAgICAgICBpdGVtTmFtZTogXCJGcmFnIEdyZW5hZGVcIlxuICAgIH0sXG4gICAgXCI4NFwiOiB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJ3ZWFwb25fc25vd2JhbGxcIixcbiAgICAgICAgaXRlbU5hbWU6IFwiU25vd2JhbGxcIlxuICAgIH0sXG4gICAgXCI4NVwiOiB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJ3ZWFwb25fYnVtcG1pbmVcIixcbiAgICAgICAgaXRlbU5hbWU6IFwiQnVtcCBNaW5lXCJcbiAgICB9LFxuICAgIFwiNTAwXCI6IHtcbiAgICAgICAgY2xhc3NOYW1lOiBcIndlYXBvbl9iYXlvbmV0XCIsXG4gICAgICAgIGl0ZW1OYW1lOiBcIkJheW9uZXRcIlxuICAgIH0sXG4gICAgXCI1MDNcIjoge1xuICAgICAgICBjbGFzc05hbWU6IFwid2VhcG9uX2tuaWZlX2Nzc1wiLFxuICAgICAgICBpdGVtTmFtZTogXCJDbGFzc2ljIEtuaWZlXCJcbiAgICB9LFxuICAgIFwiNTA1XCI6IHtcbiAgICAgICAgY2xhc3NOYW1lOiBcIndlYXBvbl9rbmlmZV9mbGlwXCIsXG4gICAgICAgIGl0ZW1OYW1lOiBcIkZsaXAgS25pZmVcIlxuICAgIH0sXG4gICAgXCI1MDZcIjoge1xuICAgICAgICBjbGFzc05hbWU6IFwid2VhcG9uX2tuaWZlX2d1dFwiLFxuICAgICAgICBpdGVtTmFtZTogXCJHdXQgS25pZmVcIlxuICAgIH0sXG4gICAgXCI1MDdcIjoge1xuICAgICAgICBjbGFzc05hbWU6IFwid2VhcG9uX2tuaWZlX2thcmFtYml0XCIsXG4gICAgICAgIGl0ZW1OYW1lOiBcIkthcmFtYml0XCJcbiAgICB9LFxuICAgIFwiNTA4XCI6IHtcbiAgICAgICAgY2xhc3NOYW1lOiBcIndlYXBvbl9rbmlmZV9tOV9iYXlvbmV0XCIsXG4gICAgICAgIGl0ZW1OYW1lOiBcIk05IEJheW9uZXRcIlxuICAgIH0sXG4gICAgXCI1MDlcIjoge1xuICAgICAgICBjbGFzc05hbWU6IFwid2VhcG9uX2tuaWZlX3RhY3RpY2FsXCIsXG4gICAgICAgIGl0ZW1OYW1lOiBcIkh1bnRzbWFuIEtuaWZlXCJcbiAgICB9LFxuICAgIFwiNTEyXCI6IHtcbiAgICAgICAgY2xhc3NOYW1lOiBcIndlYXBvbl9rbmlmZV9mYWxjaGlvblwiLFxuICAgICAgICBpdGVtTmFtZTogXCJGYWxjaGlvbiBLbmlmZVwiXG4gICAgfSxcbiAgICBcIjUxNFwiOiB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJ3ZWFwb25fa25pZmVfc3Vydml2YWxfYm93aWVcIixcbiAgICAgICAgaXRlbU5hbWU6IFwiQm93aWUgS25pZmVcIlxuICAgIH0sXG4gICAgXCI1MTVcIjoge1xuICAgICAgICBjbGFzc05hbWU6IFwid2VhcG9uX2tuaWZlX2J1dHRlcmZseVwiLFxuICAgICAgICBpdGVtTmFtZTogXCJCdXR0ZXJmbHkgS25pZmVcIlxuICAgIH0sXG4gICAgXCI1MTZcIjoge1xuICAgICAgICBjbGFzc05hbWU6IFwid2VhcG9uX2tuaWZlX3B1c2hcIixcbiAgICAgICAgaXRlbU5hbWU6IFwiU2hhZG93IERhZ2dlcnNcIlxuICAgIH0sXG4gICAgXCI1MTdcIjoge1xuICAgICAgICBjbGFzc05hbWU6IFwid2VhcG9uX2tuaWZlX2NvcmRcIixcbiAgICAgICAgaXRlbU5hbWU6IFwiUGFyYWNvcmQgS25pZmVcIlxuICAgIH0sXG4gICAgXCI1MThcIjoge1xuICAgICAgICBjbGFzc05hbWU6IFwid2VhcG9uX2tuaWZlX2NhbmlzXCIsXG4gICAgICAgIGl0ZW1OYW1lOiBcIlN1cnZpdmFsIEtuaWZlXCJcbiAgICB9LFxuICAgIFwiNTE5XCI6IHtcbiAgICAgICAgY2xhc3NOYW1lOiBcIndlYXBvbl9rbmlmZV91cnN1c1wiLFxuICAgICAgICBpdGVtTmFtZTogXCJVcnN1cyBLbmlmZVwiXG4gICAgfSxcbiAgICBcIjUyMFwiOiB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJ3ZWFwb25fa25pZmVfZ3lwc3lfamFja2tuaWZlXCIsXG4gICAgICAgIGl0ZW1OYW1lOiBcIk5hdmFqYSBLbmlmZVwiXG4gICAgfSxcbiAgICBcIjUyMVwiOiB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJ3ZWFwb25fa25pZmVfb3V0ZG9vclwiLFxuICAgICAgICBpdGVtTmFtZTogXCJOb21hZCBLbmlmZVwiXG4gICAgfSxcbiAgICBcIjUyMlwiOiB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJ3ZWFwb25fa25pZmVfc3RpbGV0dG9cIixcbiAgICAgICAgaXRlbU5hbWU6IFwiU3RpbGV0dG8gS25pZmVcIlxuICAgIH0sXG4gICAgXCI1MjNcIjoge1xuICAgICAgICBjbGFzc05hbWU6IFwid2VhcG9uX2tuaWZlX3dpZG93bWFrZXJcIixcbiAgICAgICAgaXRlbU5hbWU6IFwiVGFsb24gS25pZmVcIlxuICAgIH0sXG4gICAgXCI1MjVcIjoge1xuICAgICAgICBjbGFzc05hbWU6IFwid2VhcG9uX2tuaWZlX3NrZWxldG9uXCIsXG4gICAgICAgIGl0ZW1OYW1lOiBcIlNrZWxldG9uIEtuaWZlXCJcbiAgICB9XG59O1xuZXhwb3J0cy5wYWludEtpdEluZGV4TWFwID0ge1xuICAgIFwiMFwiOiB7XG4gICAgICAgIG5hbWU6IFwiZGVmYXVsdFwiLFxuICAgICAgICB0YWc6IFwiLVwiXG4gICAgfSxcbiAgICBcIjJcIjoge1xuICAgICAgICBuYW1lOiBcInNvX29saXZlXCIsXG4gICAgICAgIHRhZzogXCJHcm91bmR3YXRlclwiXG4gICAgfSxcbiAgICBcIjNcIjoge1xuICAgICAgICBuYW1lOiBcInNvX3JlZFwiLFxuICAgICAgICB0YWc6IFwiQ2FuZHkgQXBwbGVcIlxuICAgIH0sXG4gICAgXCI1XCI6IHtcbiAgICAgICAgbmFtZTogXCJoeV9kZHBhdFwiLFxuICAgICAgICB0YWc6IFwiRm9yZXN0IEREUEFUXCJcbiAgICB9LFxuICAgIFwiNlwiOiB7XG4gICAgICAgIG5hbWU6IFwiaHlfYXJjdGljXCIsXG4gICAgICAgIHRhZzogXCJBcmN0aWMgQ2Ftb1wiXG4gICAgfSxcbiAgICBcIjhcIjoge1xuICAgICAgICBuYW1lOiBcImh5X2Rlc2VydFwiLFxuICAgICAgICB0YWc6IFwiRGVzZXJ0IFN0b3JtXCJcbiAgICB9LFxuICAgIFwiOVwiOiB7XG4gICAgICAgIG5hbWU6IFwiaHlfdGlnZXJcIixcbiAgICAgICAgdGFnOiBcIkJlbmdhbCBUaWdlclwiXG4gICAgfSxcbiAgICBcIjEwXCI6IHtcbiAgICAgICAgbmFtZTogXCJoeV9jb3BwZXJoZWFkXCIsXG4gICAgICAgIHRhZzogXCJDb3BwZXJoZWFkXCJcbiAgICB9LFxuICAgIFwiMTFcIjoge1xuICAgICAgICBuYW1lOiBcImh5X3NrdWxsc1wiLFxuICAgICAgICB0YWc6IFwiU2t1bGxzXCJcbiAgICB9LFxuICAgIFwiMTJcIjoge1xuICAgICAgICBuYW1lOiBcImh5X3dlYnNcIixcbiAgICAgICAgdGFnOiBcIkNyaW1zb24gV2ViXCJcbiAgICB9LFxuICAgIFwiMTNcIjoge1xuICAgICAgICBuYW1lOiBcImh5X3NwbGF0dGVyXCIsXG4gICAgICAgIHRhZzogXCJCbHVlIFN0cmVha1wiXG4gICAgfSxcbiAgICBcIjE0XCI6IHtcbiAgICAgICAgbmFtZTogXCJoeV9hazQ3bGFtXCIsXG4gICAgICAgIHRhZzogXCJSZWQgTGFtaW5hdGVcIlxuICAgIH0sXG4gICAgXCIxNVwiOiB7XG4gICAgICAgIG5hbWU6IFwiaHlfZ2VscGVuXCIsXG4gICAgICAgIHRhZzogXCJHdW5zbW9rZVwiXG4gICAgfSxcbiAgICBcIjE2XCI6IHtcbiAgICAgICAgbmFtZTogXCJoeV92X3RpZ2VyXCIsXG4gICAgICAgIHRhZzogXCJKdW5nbGUgVGlnZXJcIlxuICAgIH0sXG4gICAgXCIxN1wiOiB7XG4gICAgICAgIG5hbWU6IFwiaHlfZGRwYXRfdXJiXCIsXG4gICAgICAgIHRhZzogXCJVcmJhbiBERFBBVFwiXG4gICAgfSxcbiAgICBcIjIwXCI6IHtcbiAgICAgICAgbmFtZTogXCJoeV96b21iaWVcIixcbiAgICAgICAgdGFnOiBcIlZpcnVzXCJcbiAgICB9LFxuICAgIFwiMjFcIjoge1xuICAgICAgICBuYW1lOiBcImh5X2dyYW5pdGVcIixcbiAgICAgICAgdGFnOiBcIkdyYW5pdGUgTWFyYmxlaXplZFwiXG4gICAgfSxcbiAgICBcIjIyXCI6IHtcbiAgICAgICAgbmFtZTogXCJzcF9zcHJheVwiLFxuICAgICAgICB0YWc6IFwiQ29udHJhc3QgU3ByYXlcIlxuICAgIH0sXG4gICAgXCIyNVwiOiB7XG4gICAgICAgIG5hbWU6IFwic3BfbGVhdmVzXCIsXG4gICAgICAgIHRhZzogXCJGb3Jlc3QgTGVhdmVzXCJcbiAgICB9LFxuICAgIFwiMjZcIjoge1xuICAgICAgICBuYW1lOiBcInNwX3Nob3J0X3RhcGVcIixcbiAgICAgICAgdGFnOiBcIkxpY2hlbiBEYXNoZWRcIlxuICAgIH0sXG4gICAgXCIyN1wiOiB7XG4gICAgICAgIG5hbWU6IFwic3BfdGFwZVwiLFxuICAgICAgICB0YWc6IFwiQm9uZSBNYXNrXCJcbiAgICB9LFxuICAgIFwiMjhcIjoge1xuICAgICAgICBuYW1lOiBcImFuX25hdnlcIixcbiAgICAgICAgdGFnOiBcIkFub2RpemVkIE5hdnlcIlxuICAgIH0sXG4gICAgXCIzMFwiOiB7XG4gICAgICAgIG5hbWU6IFwic3Bfc25ha2VcIixcbiAgICAgICAgdGFnOiBcIlNuYWtlIENhbW9cIlxuICAgIH0sXG4gICAgXCIzMlwiOiB7XG4gICAgICAgIG5hbWU6IFwiYW5fc2lsdmVyXCIsXG4gICAgICAgIHRhZzogXCJTaWx2ZXJcIlxuICAgIH0sXG4gICAgXCIzM1wiOiB7XG4gICAgICAgIG5hbWU6IFwiYW5fcmVkXCIsXG4gICAgICAgIHRhZzogXCJIb3QgUm9kXCJcbiAgICB9LFxuICAgIFwiMzRcIjoge1xuICAgICAgICBuYW1lOiBcImFtX3VyYmFuXCIsXG4gICAgICAgIHRhZzogXCJNZXRhbGxpYyBERFBBVFwiXG4gICAgfSxcbiAgICBcIjM2XCI6IHtcbiAgICAgICAgbmFtZTogXCJhbV9vc3NpZnlcIixcbiAgICAgICAgdGFnOiBcIk9zc2lmaWVkXCJcbiAgICB9LFxuICAgIFwiMzdcIjoge1xuICAgICAgICBuYW1lOiBcImFhX2ZsYW1lc1wiLFxuICAgICAgICB0YWc6IFwiQmxhemVcIlxuICAgIH0sXG4gICAgXCIzOFwiOiB7XG4gICAgICAgIG5hbWU6IFwiYWFfZmFkZVwiLFxuICAgICAgICB0YWc6IFwiRmFkZVwiXG4gICAgfSxcbiAgICBcIjM5XCI6IHtcbiAgICAgICAgbmFtZTogXCJzb195ZWxsb3dcIixcbiAgICAgICAgdGFnOiBcIkJ1bGxkb3plclwiXG4gICAgfSxcbiAgICBcIjQwXCI6IHtcbiAgICAgICAgbmFtZTogXCJzb19uaWdodFwiLFxuICAgICAgICB0YWc6IFwiTmlnaHRcIlxuICAgIH0sXG4gICAgXCI0MVwiOiB7XG4gICAgICAgIG5hbWU6IFwiYXFfY29wcGVyXCIsXG4gICAgICAgIHRhZzogXCJDb3BwZXJcIlxuICAgIH0sXG4gICAgXCI0MlwiOiB7XG4gICAgICAgIG5hbWU6IFwiYXFfYmx1ZWRcIixcbiAgICAgICAgdGFnOiBcIkJsdWUgU3RlZWxcIlxuICAgIH0sXG4gICAgXCI0M1wiOiB7XG4gICAgICAgIG5hbWU6IFwiYXFfZm9yY2VkXCIsXG4gICAgICAgIHRhZzogXCJTdGFpbmVkXCJcbiAgICB9LFxuICAgIFwiNDRcIjoge1xuICAgICAgICBuYW1lOiBcImFxX29pbGVkXCIsXG4gICAgICAgIHRhZzogXCJDYXNlIEhhcmRlbmVkXCJcbiAgICB9LFxuICAgIFwiNDZcIjoge1xuICAgICAgICBuYW1lOiBcInNvX3BtY1wiLFxuICAgICAgICB0YWc6IFwiQ29udHJhY3RvclwiXG4gICAgfSxcbiAgICBcIjQ3XCI6IHtcbiAgICAgICAgbmFtZTogXCJzb19zcGFjZV9tYXJpbmVcIixcbiAgICAgICAgdGFnOiBcIkNvbG9ueVwiXG4gICAgfSxcbiAgICBcIjQ4XCI6IHtcbiAgICAgICAgbmFtZTogXCJhbV9kcmFnb25fZ2xvY2tcIixcbiAgICAgICAgdGFnOiBcIkRyYWdvbiBUYXR0b29cIlxuICAgIH0sXG4gICAgXCI1MVwiOiB7XG4gICAgICAgIG5hbWU6IFwiYW1fbGlnaHRuaW5nX2F3cFwiLFxuICAgICAgICB0YWc6IFwiTGlnaHRuaW5nIFN0cmlrZVwiXG4gICAgfSxcbiAgICBcIjU5XCI6IHtcbiAgICAgICAgbmFtZTogXCJhbV96ZWJyYVwiLFxuICAgICAgICB0YWc6IFwiU2xhdWdodGVyXCJcbiAgICB9LFxuICAgIFwiNjBcIjoge1xuICAgICAgICBuYW1lOiBcImFtX3plYnJhX2RhcmtcIixcbiAgICAgICAgdGFnOiBcIkRhcmsgV2F0ZXJcIlxuICAgIH0sXG4gICAgXCI2MVwiOiB7XG4gICAgICAgIG5hbWU6IFwiYWFfdmVydGlnb1wiLFxuICAgICAgICB0YWc6IFwiSHlwbm90aWNcIlxuICAgIH0sXG4gICAgXCI2MlwiOiB7XG4gICAgICAgIG5hbWU6IFwiY3Vfc3ByaW5nX25vdmFcIixcbiAgICAgICAgdGFnOiBcIkJsb29tc3RpY2tcIlxuICAgIH0sXG4gICAgXCI2N1wiOiB7XG4gICAgICAgIG5hbWU6IFwiYW1fc2xpdGhlcl9wOTBcIixcbiAgICAgICAgdGFnOiBcIkNvbGQgQmxvb2RlZFwiXG4gICAgfSxcbiAgICBcIjcwXCI6IHtcbiAgICAgICAgbmFtZTogXCJhbV9jYXJib25fZmliZXJcIixcbiAgICAgICAgdGFnOiBcIkNhcmJvbiBGaWJlclwiXG4gICAgfSxcbiAgICBcIjcxXCI6IHtcbiAgICAgICAgbmFtZTogXCJhbV9zY29ycGlvbl9wMjAwMFwiLFxuICAgICAgICB0YWc6IFwiU2NvcnBpb25cIlxuICAgIH0sXG4gICAgXCI3MlwiOiB7XG4gICAgICAgIG5hbWU6IFwic3BfbWVzaF90YW5cIixcbiAgICAgICAgdGFnOiBcIlNhZmFyaSBNZXNoXCJcbiAgICB9LFxuICAgIFwiNzNcIjoge1xuICAgICAgICBuYW1lOiBcImh5X2ZlYXRoZXJzX2F1Z1wiLFxuICAgICAgICB0YWc6IFwiV2luZ3NcIlxuICAgIH0sXG4gICAgXCI3NFwiOiB7XG4gICAgICAgIG5hbWU6IFwiaHlfYXJjdGljX2NvbnRyYXN0XCIsXG4gICAgICAgIHRhZzogXCJQb2xhciBDYW1vXCJcbiAgICB9LFxuICAgIFwiNzVcIjoge1xuICAgICAgICBuYW1lOiBcImh5X2JsaXp6YXJkXCIsXG4gICAgICAgIHRhZzogXCJCbGl6emFyZCBNYXJibGVpemVkXCJcbiAgICB9LFxuICAgIFwiNzZcIjoge1xuICAgICAgICBuYW1lOiBcImh5X2ZvcmVzdF93aW50ZXJcIixcbiAgICAgICAgdGFnOiBcIldpbnRlciBGb3Jlc3RcIlxuICAgIH0sXG4gICAgXCI3N1wiOiB7XG4gICAgICAgIG5hbWU6IFwiaHlfZm9yZXN0X2JvcmVhbFwiLFxuICAgICAgICB0YWc6IFwiQm9yZWFsIEZvcmVzdFwiXG4gICAgfSxcbiAgICBcIjc4XCI6IHtcbiAgICAgICAgbmFtZTogXCJoeV9mb3Jlc3RfbmlnaHRcIixcbiAgICAgICAgdGFnOiBcIkZvcmVzdCBOaWdodFwiXG4gICAgfSxcbiAgICBcIjgzXCI6IHtcbiAgICAgICAgbmFtZTogXCJoeV9kZHBhdF9vcmFuZ2VcIixcbiAgICAgICAgdGFnOiBcIk9yYW5nZSBERFBBVFwiXG4gICAgfSxcbiAgICBcIjg0XCI6IHtcbiAgICAgICAgbmFtZTogXCJoeV9kZHBhdF9waW5rXCIsXG4gICAgICAgIHRhZzogXCJQaW5rIEREUEFUXCJcbiAgICB9LFxuICAgIFwiOTBcIjoge1xuICAgICAgICBuYW1lOiBcImh5X21vdHRsZWRfc2FuZFwiLFxuICAgICAgICB0YWc6IFwiTXVkZGVyXCJcbiAgICB9LFxuICAgIFwiOTJcIjoge1xuICAgICAgICBuYW1lOiBcImh5X3JlZWZcIixcbiAgICAgICAgdGFnOiBcIkN5YW5vc3BhdHRlclwiXG4gICAgfSxcbiAgICBcIjkzXCI6IHtcbiAgICAgICAgbmFtZTogXCJzb19jYXJhbWVsXCIsXG4gICAgICAgIHRhZzogXCJDYXJhbWVsXCJcbiAgICB9LFxuICAgIFwiOTVcIjoge1xuICAgICAgICBuYW1lOiBcInNvX2dyYXNzbGFuZFwiLFxuICAgICAgICB0YWc6IFwiR3Jhc3NsYW5kXCJcbiAgICB9LFxuICAgIFwiOTZcIjoge1xuICAgICAgICBuYW1lOiBcInNvX21vc3NcIixcbiAgICAgICAgdGFnOiBcIkJsdWUgU3BydWNlXCJcbiAgICB9LFxuICAgIFwiOThcIjoge1xuICAgICAgICBuYW1lOiBcInNvX3B1cnBsZVwiLFxuICAgICAgICB0YWc6IFwiVWx0cmF2aW9sZXRcIlxuICAgIH0sXG4gICAgXCI5OVwiOiB7XG4gICAgICAgIG5hbWU6IFwic29fc2FuZFwiLFxuICAgICAgICB0YWc6IFwiU2FuZCBEdW5lXCJcbiAgICB9LFxuICAgIFwiMTAwXCI6IHtcbiAgICAgICAgbmFtZTogXCJzb19zdG9ybWZyb250XCIsXG4gICAgICAgIHRhZzogXCJTdG9ybVwiXG4gICAgfSxcbiAgICBcIjEwMVwiOiB7XG4gICAgICAgIG5hbWU6IFwic29fdG9ybmFkb1wiLFxuICAgICAgICB0YWc6IFwiVG9ybmFkb1wiXG4gICAgfSxcbiAgICBcIjEwMlwiOiB7XG4gICAgICAgIG5hbWU6IFwic29fd2hpdGVvdXRcIixcbiAgICAgICAgdGFnOiBcIldoaXRlb3V0XCJcbiAgICB9LFxuICAgIFwiMTA0XCI6IHtcbiAgICAgICAgbmFtZTogXCJzcF9sZWF2ZXNfZ3Jhc3NsYW5kXCIsXG4gICAgICAgIHRhZzogXCJHcmFzc2xhbmQgTGVhdmVzXCJcbiAgICB9LFxuICAgIFwiMTA3XCI6IHtcbiAgICAgICAgbmFtZTogXCJzcF9tZXNoX2FyY3RpY19jb250cmFzdFwiLFxuICAgICAgICB0YWc6IFwiUG9sYXIgTWVzaFwiXG4gICAgfSxcbiAgICBcIjExMFwiOiB7XG4gICAgICAgIG5hbWU6IFwic3BfbWVzaF9mb3Jlc3RfZmlyZVwiLFxuICAgICAgICB0YWc6IFwiQ29uZGVtbmVkXCJcbiAgICB9LFxuICAgIFwiMTExXCI6IHtcbiAgICAgICAgbmFtZTogXCJzcF9tZXNoX2dsYWNpZXJcIixcbiAgICAgICAgdGFnOiBcIkdsYWNpZXIgTWVzaFwiXG4gICAgfSxcbiAgICBcIjExNlwiOiB7XG4gICAgICAgIG5hbWU6IFwic3BfbWVzaF9zYW5kXCIsXG4gICAgICAgIHRhZzogXCJTYW5kIE1lc2hcIlxuICAgIH0sXG4gICAgXCIxMTlcIjoge1xuICAgICAgICBuYW1lOiBcInNwX3NwcmF5X2Rlc2VydF9zYWdlXCIsXG4gICAgICAgIHRhZzogXCJTYWdlIFNwcmF5XCJcbiAgICB9LFxuICAgIFwiMTIyXCI6IHtcbiAgICAgICAgbmFtZTogXCJzcF9zcHJheV9qdW5nbGVcIixcbiAgICAgICAgdGFnOiBcIkp1bmdsZSBTcHJheVwiXG4gICAgfSxcbiAgICBcIjEyNFwiOiB7XG4gICAgICAgIG5hbWU6IFwic3Bfc3ByYXlfc2FuZFwiLFxuICAgICAgICB0YWc6IFwiU2FuZCBTcHJheVwiXG4gICAgfSxcbiAgICBcIjEyNVwiOiB7XG4gICAgICAgIG5hbWU6IFwiY3VfeHJheV9wMjUwXCIsXG4gICAgICAgIHRhZzogXCJYLVJheVwiXG4gICAgfSxcbiAgICBcIjEzNVwiOiB7XG4gICAgICAgIG5hbWU6IFwic3BfdGFwZV9kb3RzX3VyYmFuXCIsXG4gICAgICAgIHRhZzogXCJVcmJhbiBQZXJmb3JhdGVkXCJcbiAgICB9LFxuICAgIFwiMTM2XCI6IHtcbiAgICAgICAgbmFtZTogXCJzcF90YXBlX2RvdHNfd2F2ZXNcIixcbiAgICAgICAgdGFnOiBcIldhdmVzIFBlcmZvcmF0ZWRcIlxuICAgIH0sXG4gICAgXCIxNDFcIjoge1xuICAgICAgICBuYW1lOiBcInNwX3RhcGVfb3JhbmdlXCIsXG4gICAgICAgIHRhZzogXCJPcmFuZ2UgUGVlbFwiXG4gICAgfSxcbiAgICBcIjE0M1wiOiB7XG4gICAgICAgIG5hbWU6IFwic3BfdGFwZV91cmJhblwiLFxuICAgICAgICB0YWc6IFwiVXJiYW4gTWFza2VkXCJcbiAgICB9LFxuICAgIFwiMTQ3XCI6IHtcbiAgICAgICAgbmFtZTogXCJzcF90YXBlX3Nob3J0X2p1bmdsZVwiLFxuICAgICAgICB0YWc6IFwiSnVuZ2xlIERhc2hlZFwiXG4gICAgfSxcbiAgICBcIjE0OFwiOiB7XG4gICAgICAgIG5hbWU6IFwic3BfdGFwZV9zaG9ydF9zYW5kXCIsXG4gICAgICAgIHRhZzogXCJTYW5kIERhc2hlZFwiXG4gICAgfSxcbiAgICBcIjE0OVwiOiB7XG4gICAgICAgIG5hbWU6IFwic3BfdGFwZV9zaG9ydF91cmJhblwiLFxuICAgICAgICB0YWc6IFwiVXJiYW4gRGFzaGVkXCJcbiAgICB9LFxuICAgIFwiMTUxXCI6IHtcbiAgICAgICAgbmFtZTogXCJzb19qdW5nbGVcIixcbiAgICAgICAgdGFnOiBcIkp1bmdsZVwiXG4gICAgfSxcbiAgICBcIjE1M1wiOiB7XG4gICAgICAgIG5hbWU6IFwic29fdGFuZ2VyaW5lXCIsXG4gICAgICAgIHRhZzogXCJEZW1vbGl0aW9uXCJcbiAgICB9LFxuICAgIFwiMTU0XCI6IHtcbiAgICAgICAgbmFtZTogXCJjdV9icm9rZW5fcGF0aF9mYW1hc1wiLFxuICAgICAgICB0YWc6IFwiQWZ0ZXJpbWFnZVwiXG4gICAgfSxcbiAgICBcIjE1NVwiOiB7XG4gICAgICAgIG5hbWU6IFwiY3VfYnVsbGV0X3JhaW5fbTRhMVwiLFxuICAgICAgICB0YWc6IFwiQnVsbGV0IFJhaW5cIlxuICAgIH0sXG4gICAgXCIxNTZcIjoge1xuICAgICAgICBuYW1lOiBcImN1X2NhdHNrdWxsc19wOTBcIixcbiAgICAgICAgdGFnOiBcIkRlYXRoIGJ5IEtpdHR5XCJcbiAgICB9LFxuICAgIFwiMTU3XCI6IHtcbiAgICAgICAgbmFtZTogXCJzcF9wYWxtXCIsXG4gICAgICAgIHRhZzogXCJQYWxtXCJcbiAgICB9LFxuICAgIFwiMTU4XCI6IHtcbiAgICAgICAgbmFtZTogXCJjdV93YWxudXRfbm92YVwiLFxuICAgICAgICB0YWc6IFwiV2FsbnV0XCJcbiAgICB9LFxuICAgIFwiMTU5XCI6IHtcbiAgICAgICAgbmFtZTogXCJhcV9icmFzc1wiLFxuICAgICAgICB0YWc6IFwiQnJhc3NcIlxuICAgIH0sXG4gICAgXCIxNjJcIjoge1xuICAgICAgICBuYW1lOiBcInNwX3NwbGFzaF9wMjUwXCIsXG4gICAgICAgIHRhZzogXCJTcGxhc2hcIlxuICAgIH0sXG4gICAgXCIxNjRcIjoge1xuICAgICAgICBuYW1lOiBcImh5X2h1bnRlcl9tb2Rlcm5cIixcbiAgICAgICAgdGFnOiBcIk1vZGVybiBIdW50ZXJcIlxuICAgIH0sXG4gICAgXCIxNjVcIjoge1xuICAgICAgICBuYW1lOiBcImh5X2h1bnRlcl9ibGF6ZV9waW5rXCIsXG4gICAgICAgIHRhZzogXCJTcGxhc2ggSmFtXCJcbiAgICB9LFxuICAgIFwiMTY2XCI6IHtcbiAgICAgICAgbmFtZTogXCJoeV9odW50ZXJfYmxhemVfb3JhbmdlXCIsXG4gICAgICAgIHRhZzogXCJCbGF6ZSBPcmFuZ2VcIlxuICAgIH0sXG4gICAgXCIxNjdcIjoge1xuICAgICAgICBuYW1lOiBcInNwX251a2VzdHJpcGVfb3JhbmdlXCIsXG4gICAgICAgIHRhZzogXCJSYWRpYXRpb24gSGF6YXJkXCJcbiAgICB9LFxuICAgIFwiMTY4XCI6IHtcbiAgICAgICAgbmFtZTogXCJzcF9udWtlc3RyaXBlX2dyZWVuXCIsXG4gICAgICAgIHRhZzogXCJOdWNsZWFyIFRocmVhdFwiXG4gICAgfSxcbiAgICBcIjE2OVwiOiB7XG4gICAgICAgIG5hbWU6IFwic3BfbnVrZXN0cmlwZV9tYXJvb25cIixcbiAgICAgICAgdGFnOiBcIkZhbGxvdXQgV2FybmluZ1wiXG4gICAgfSxcbiAgICBcIjE3MFwiOiB7XG4gICAgICAgIG5hbWU6IFwic3BfemVicmFjYW1cIixcbiAgICAgICAgdGFnOiBcIlByZWRhdG9yXCJcbiAgICB9LFxuICAgIFwiMTcxXCI6IHtcbiAgICAgICAgbmFtZTogXCJzcF9udWtlc3RyaXBlX2Jyb3duXCIsXG4gICAgICAgIHRhZzogXCJJcnJhZGlhdGVkIEFsZXJ0XCJcbiAgICB9LFxuICAgIFwiMTcyXCI6IHtcbiAgICAgICAgbmFtZTogXCJoeV9hazQ3bGFtX2J3XCIsXG4gICAgICAgIHRhZzogXCJCbGFjayBMYW1pbmF0ZVwiXG4gICAgfSxcbiAgICBcIjE3NFwiOiB7XG4gICAgICAgIG5hbWU6IFwiaHlfYmxhbV9zaW1wbGVcIixcbiAgICAgICAgdGFnOiBcIkJPT01cIlxuICAgIH0sXG4gICAgXCIxNzVcIjoge1xuICAgICAgICBuYW1lOiBcInNwX2RhcHBsZVwiLFxuICAgICAgICB0YWc6IFwiU2NvcmNoZWRcIlxuICAgIH0sXG4gICAgXCIxNzZcIjoge1xuICAgICAgICBuYW1lOiBcInNwX3plYnJhY2FtX2J3XCIsXG4gICAgICAgIHRhZzogXCJGYWRlZCBaZWJyYVwiXG4gICAgfSxcbiAgICBcIjE3N1wiOiB7XG4gICAgICAgIG5hbWU6IFwiaHlfaWNvc2FoZWRyb25cIixcbiAgICAgICAgdGFnOiBcIk1lbWVudG9cIlxuICAgIH0sXG4gICAgXCIxNzhcIjoge1xuICAgICAgICBuYW1lOiBcImh5X2Rvb21raXR0eVwiLFxuICAgICAgICB0YWc6IFwiRG9vbWtpdHR5XCJcbiAgICB9LFxuICAgIFwiMTc5XCI6IHtcbiAgICAgICAgbmFtZTogXCJzcF9udWtlc3RyaXBlX2dyZWVuX3RlYzlcIixcbiAgICAgICAgdGFnOiBcIk51Y2xlYXIgVGhyZWF0XCJcbiAgICB9LFxuICAgIFwiMTgwXCI6IHtcbiAgICAgICAgbmFtZTogXCJjdV9maXJlc2VycGVudF9hazQ3X2JyYXZvXCIsXG4gICAgICAgIHRhZzogXCJGaXJlIFNlcnBlbnRcIlxuICAgIH0sXG4gICAgXCIxODFcIjoge1xuICAgICAgICBuYW1lOiBcImN1X2ZhdmVsYV9hd3BcIixcbiAgICAgICAgdGFnOiBcIkNvcnRpY2VyYVwiXG4gICAgfSxcbiAgICBcIjE4MlwiOiB7XG4gICAgICAgIG5hbWU6IFwiY3VfZHJhZ29uX3A5MF9icmF2b1wiLFxuICAgICAgICB0YWc6IFwiRW1lcmFsZCBEcmFnb25cIlxuICAgIH0sXG4gICAgXCIxODNcIjoge1xuICAgICAgICBuYW1lOiBcImh5X3NpZWdlX2JyYXZvXCIsXG4gICAgICAgIHRhZzogXCJPdmVyZ3Jvd3RoXCJcbiAgICB9LFxuICAgIFwiMTg0XCI6IHtcbiAgICAgICAgbmFtZTogXCJjdV9mYXZlbGFfcDIwMDBcIixcbiAgICAgICAgdGFnOiBcIkNvcnRpY2VyYVwiXG4gICAgfSxcbiAgICBcIjE4NVwiOiB7XG4gICAgICAgIG5hbWU6IFwiYW1fc2NhbGVzX2JyYXZvXCIsXG4gICAgICAgIHRhZzogXCJHb2xkZW4gS29pXCJcbiAgICB9LFxuICAgIFwiMTg2XCI6IHtcbiAgICAgICAgbmFtZTogXCJzcF9zcHJheV93YXZlc19icmF2b1wiLFxuICAgICAgICB0YWc6IFwiV2F2ZSBTcHJheVwiXG4gICAgfSxcbiAgICBcIjE4N1wiOiB7XG4gICAgICAgIG5hbWU6IFwic3Bfc3Rhcl9icmF2b1wiLFxuICAgICAgICB0YWc6IFwiWmlya2FcIlxuICAgIH0sXG4gICAgXCIxODhcIjoge1xuICAgICAgICBuYW1lOiBcImFxX2V0Y2hlZF9tYWMxMF9icmF2b1wiLFxuICAgICAgICB0YWc6IFwiR3JhdmVuXCJcbiAgICB9LFxuICAgIFwiMTg5XCI6IHtcbiAgICAgICAgbmFtZTogXCJoeV9vY2Vhbl9icmF2b1wiLFxuICAgICAgICB0YWc6IFwiQnJpZ2h0IFdhdGVyXCJcbiAgICB9LFxuICAgIFwiMTkwXCI6IHtcbiAgICAgICAgbmFtZTogXCJjdV9zZWFzb25fZWxpdGVzX2JyYXZvXCIsXG4gICAgICAgIHRhZzogXCJCbGFjayBMaW1iYVwiXG4gICAgfSxcbiAgICBcIjE5MVwiOiB7XG4gICAgICAgIG5hbWU6IFwiaHlfc2Vhc2lkZV9icmF2b1wiLFxuICAgICAgICB0YWc6IFwiVGVtcGVzdFwiXG4gICAgfSxcbiAgICBcIjE5MlwiOiB7XG4gICAgICAgIG5hbWU6IFwiaHlfY3J1bXBsZV9icmF2b1wiLFxuICAgICAgICB0YWc6IFwiU2hhdHRlcmVkXCJcbiAgICB9LFxuICAgIFwiMTkzXCI6IHtcbiAgICAgICAgbmFtZTogXCJzcF9za3VsbF9kaWFncmFtX2JyYXZvXCIsXG4gICAgICAgIHRhZzogXCJCb25lIFBpbGVcIlxuICAgIH0sXG4gICAgXCIxOTRcIjoge1xuICAgICAgICBuYW1lOiBcInNwX3NwaXRmaXJlX2ZhbWFzX2JyYXZvXCIsXG4gICAgICAgIHRhZzogXCJTcGl0ZmlyZVwiXG4gICAgfSxcbiAgICBcIjE5NVwiOiB7XG4gICAgICAgIG5hbWU6IFwiaHlfYmx1ZXBvbHlnb25fYnJhdm9cIixcbiAgICAgICAgdGFnOiBcIkRlbWV0ZXJcIlxuICAgIH0sXG4gICAgXCIxOTZcIjoge1xuICAgICAgICBuYW1lOiBcImFuX2VtZXJhbGRfYnJhdm9cIixcbiAgICAgICAgdGFnOiBcIkVtZXJhbGRcIlxuICAgIH0sXG4gICAgXCIxOTdcIjoge1xuICAgICAgICBuYW1lOiBcImFuX25hdnlfYnJhdm9cIixcbiAgICAgICAgdGFnOiBcIkFub2RpemVkIE5hdnlcIlxuICAgIH0sXG4gICAgXCIxOThcIjoge1xuICAgICAgICBuYW1lOiBcInNwX2hhemFyZF9icmF2b1wiLFxuICAgICAgICB0YWc6IFwiSGF6YXJkXCJcbiAgICB9LFxuICAgIFwiMTk5XCI6IHtcbiAgICAgICAgbmFtZTogXCJzcF90YXBlX2RvdHNfYnJhdm9cIixcbiAgICAgICAgdGFnOiBcIkRyeSBTZWFzb25cIlxuICAgIH0sXG4gICAgXCIyMDBcIjoge1xuICAgICAgICBuYW1lOiBcImh5X21heWFuX2RyZWFtc19icmF2b1wiLFxuICAgICAgICB0YWc6IFwiTWF5YW4gRHJlYW1zXCJcbiAgICB9LFxuICAgIFwiMjAxXCI6IHtcbiAgICAgICAgbmFtZTogXCJzcF9wYWxtX2JyYXZvXCIsXG4gICAgICAgIHRhZzogXCJQYWxtXCJcbiAgICB9LFxuICAgIFwiMjAyXCI6IHtcbiAgICAgICAgbmFtZTogXCJoeV9kZHBhdF9qdW5nbGVfYnJhdm9cIixcbiAgICAgICAgdGFnOiBcIkp1bmdsZSBERFBBVFwiXG4gICAgfSxcbiAgICBcIjIwM1wiOiB7XG4gICAgICAgIG5hbWU6IFwiYXFfc3RlZWxfYnJhdm9cIixcbiAgICAgICAgdGFnOiBcIlJ1c3QgQ29hdFwiXG4gICAgfSxcbiAgICBcIjIwNFwiOiB7XG4gICAgICAgIG5hbWU6IFwiaHlfYWxpX3RpbGVfYnJhdm9cIixcbiAgICAgICAgdGFnOiBcIk1vc2FpY29cIlxuICAgIH0sXG4gICAgXCIyMDVcIjoge1xuICAgICAgICBuYW1lOiBcInNvX2p1bmdsZV9icmF2b1wiLFxuICAgICAgICB0YWc6IFwiSnVuZ2xlXCJcbiAgICB9LFxuICAgIFwiMjA2XCI6IHtcbiAgICAgICAgbmFtZTogXCJzb190b3JuYWRvX2JyYXZvXCIsXG4gICAgICAgIHRhZzogXCJUb3JuYWRvXCJcbiAgICB9LFxuICAgIFwiMjA3XCI6IHtcbiAgICAgICAgbmFtZTogXCJoeV9jcnVtcGxlX2RhcmtfYnJhdm9cIixcbiAgICAgICAgdGFnOiBcIkZhY2V0c1wiXG4gICAgfSxcbiAgICBcIjIwOFwiOiB7XG4gICAgICAgIG5hbWU6IFwic29fc2FuZF9icmF2b1wiLFxuICAgICAgICB0YWc6IFwiU2FuZCBEdW5lXCJcbiAgICB9LFxuICAgIFwiMjA5XCI6IHtcbiAgICAgICAgbmFtZTogXCJzb19vbGl2ZV9icmF2b1wiLFxuICAgICAgICB0YWc6IFwiR3JvdW5kd2F0ZXJcIlxuICAgIH0sXG4gICAgXCIyMTBcIjoge1xuICAgICAgICBuYW1lOiBcImFuX2d1bm1ldGFsX2JyYXZvXCIsXG4gICAgICAgIHRhZzogXCJBbm9kaXplZCBHdW5tZXRhbFwiXG4gICAgfSxcbiAgICBcIjIxMVwiOiB7XG4gICAgICAgIG5hbWU6IFwiYW1fb3NzaWZ5X2JsdWVfcDIwMDBfYnJhdm9cIixcbiAgICAgICAgdGFnOiBcIk9jZWFuIEZvYW1cIlxuICAgIH0sXG4gICAgXCIyMTJcIjoge1xuICAgICAgICBuYW1lOiBcImFtX2NydW1wbGVfYnJhdm9cIixcbiAgICAgICAgdGFnOiBcIkdyYXBoaXRlXCJcbiAgICB9LFxuICAgIFwiMjEzXCI6IHtcbiAgICAgICAgbmFtZTogXCJhbV9vc3NpZnlfYmx1ZVwiLFxuICAgICAgICB0YWc6IFwiT2NlYW4gRm9hbVwiXG4gICAgfSxcbiAgICBcIjIxNFwiOiB7XG4gICAgICAgIG5hbWU6IFwiYW1fY3J1bXBsZVwiLFxuICAgICAgICB0YWc6IFwiR3JhcGhpdGVcIlxuICAgIH0sXG4gICAgXCIyMTVcIjoge1xuICAgICAgICBuYW1lOiBcImN1X3hyYXlfbTRcIixcbiAgICAgICAgdGFnOiBcIlgtUmF5XCJcbiAgICB9LFxuICAgIFwiMjE2XCI6IHtcbiAgICAgICAgbmFtZTogXCJhbl90aXRhbml1bTMwdlwiLFxuICAgICAgICB0YWc6IFwiQmx1ZSBUaXRhbml1bVwiXG4gICAgfSxcbiAgICBcIjIxN1wiOiB7XG4gICAgICAgIG5hbWU6IFwiaHlfcmVkdGlnZXJcIixcbiAgICAgICAgdGFnOiBcIkJsb29kIFRpZ2VyXCJcbiAgICB9LFxuICAgIFwiMjE4XCI6IHtcbiAgICAgICAgbmFtZTogXCJoeV9ibHVlaGV4XCIsXG4gICAgICAgIHRhZzogXCJIZXhhbmVcIlxuICAgIH0sXG4gICAgXCIyMTlcIjoge1xuICAgICAgICBuYW1lOiBcImh5X3JlZGhleFwiLFxuICAgICAgICB0YWc6IFwiSGl2ZVwiXG4gICAgfSxcbiAgICBcIjIyMFwiOiB7XG4gICAgICAgIG5hbWU6IFwiYW1fb3NzaWZ5X3JlZFwiLFxuICAgICAgICB0YWc6IFwiSGVtb2dsb2JpblwiXG4gICAgfSxcbiAgICBcIjIyMVwiOiB7XG4gICAgICAgIG5hbWU6IFwiYW1fZWxlY3RyaWNfcmVkXCIsXG4gICAgICAgIHRhZzogXCJTZXJ1bVwiXG4gICAgfSxcbiAgICBcIjIyMlwiOiB7XG4gICAgICAgIG5hbWU6IFwiY3Vfc2hhcmtcIixcbiAgICAgICAgdGFnOiBcIkJsb29kIGluIHRoZSBXYXRlclwiXG4gICAgfSxcbiAgICBcIjIyM1wiOiB7XG4gICAgICAgIG5hbWU6IFwiaHlfZmxvd2Vyc1wiLFxuICAgICAgICB0YWc6IFwiTmlnaHRzaGFkZVwiXG4gICAgfSxcbiAgICBcIjIyNFwiOiB7XG4gICAgICAgIG5hbWU6IFwiaHlfd2F0ZXJfY3Jlc3RcIixcbiAgICAgICAgdGFnOiBcIldhdGVyIFNpZ2lsXCJcbiAgICB9LFxuICAgIFwiMjI1XCI6IHtcbiAgICAgICAgbmFtZTogXCJzcF9jYW1vX3dvb2RfYmx1ZVwiLFxuICAgICAgICB0YWc6IFwiR2hvc3QgQ2Ftb1wiXG4gICAgfSxcbiAgICBcIjIyNlwiOiB7XG4gICAgICAgIG5hbWU6IFwiaHlfYWs0N2xhbV9ibHVlXCIsXG4gICAgICAgIHRhZzogXCJCbHVlIExhbWluYXRlXCJcbiAgICB9LFxuICAgIFwiMjI3XCI6IHtcbiAgICAgICAgbmFtZTogXCJoeV9oaXZlXCIsXG4gICAgICAgIHRhZzogXCJFbGVjdHJpYyBIaXZlXCJcbiAgICB9LFxuICAgIFwiMjI4XCI6IHtcbiAgICAgICAgbmFtZTogXCJoeV9tb2RzcG90c1wiLFxuICAgICAgICB0YWc6IFwiQmxpbmQgU3BvdFwiXG4gICAgfSxcbiAgICBcIjIyOVwiOiB7XG4gICAgICAgIG5hbWU6IFwic3BfemVicmFjYW1fYmx1ZVwiLFxuICAgICAgICB0YWc6IFwiQXp1cmUgWmVicmFcIlxuICAgIH0sXG4gICAgXCIyMzBcIjoge1xuICAgICAgICBuYW1lOiBcImFtX2RkcGF0ZGVuc2Vfc2lsdmVyXCIsXG4gICAgICAgIHRhZzogXCJTdGVlbCBEaXNydXB0aW9uXCJcbiAgICB9LFxuICAgIFwiMjMxXCI6IHtcbiAgICAgICAgbmFtZTogXCJhbV9kZHBhdGRlbnNlX3BlYWNvY2tcIixcbiAgICAgICAgdGFnOiBcIkNvYmFsdCBEaXNydXB0aW9uXCJcbiAgICB9LFxuICAgIFwiMjMyXCI6IHtcbiAgICAgICAgbmFtZTogXCJoeV93ZWJzX2RhcmtlclwiLFxuICAgICAgICB0YWc6IFwiQ3JpbXNvbiBXZWJcIlxuICAgIH0sXG4gICAgXCIyMzNcIjoge1xuICAgICAgICBuYW1lOiBcInNwX3BhbG1fc2hhZG93XCIsXG4gICAgICAgIHRhZzogXCJUcm9waWNhbCBTdG9ybVwiXG4gICAgfSxcbiAgICBcIjIzNFwiOiB7XG4gICAgICAgIG5hbWU6IFwic3BfdHdpZ3NcIixcbiAgICAgICAgdGFnOiBcIkFzaCBXb29kXCJcbiAgICB9LFxuICAgIFwiMjM1XCI6IHtcbiAgICAgICAgbmFtZTogXCJoeV92YXJpY2Ftb1wiLFxuICAgICAgICB0YWc6IFwiVmFyaUNhbW9cIlxuICAgIH0sXG4gICAgXCIyMzZcIjoge1xuICAgICAgICBuYW1lOiBcImh5X3ZhcmljYW1vX25pZ2h0XCIsXG4gICAgICAgIHRhZzogXCJOaWdodCBPcHNcIlxuICAgIH0sXG4gICAgXCIyMzdcIjoge1xuICAgICAgICBuYW1lOiBcImh5X3ZhcmljYW1vX3VyYmFuXCIsXG4gICAgICAgIHRhZzogXCJVcmJhbiBSdWJibGVcIlxuICAgIH0sXG4gICAgXCIyMzhcIjoge1xuICAgICAgICBuYW1lOiBcImh5X3ZhcmljYW1vX2JsdWVcIixcbiAgICAgICAgdGFnOiBcIlZhcmlDYW1vIEJsdWVcIlxuICAgIH0sXG4gICAgXCIyNDBcIjoge1xuICAgICAgICBuYW1lOiBcImh5X3ZhcmljYW1vX2Rlc2VydFwiLFxuICAgICAgICB0YWc6IFwiQ2FsaUNhbW9cIlxuICAgIH0sXG4gICAgXCIyNDFcIjoge1xuICAgICAgICBuYW1lOiBcInNwX21lc2hfc2xhc2hlc1wiLFxuICAgICAgICB0YWc6IFwiSHVudGluZyBCbGluZFwiXG4gICAgfSxcbiAgICBcIjI0MlwiOiB7XG4gICAgICAgIG5hbWU6IFwic3BfbWVzaF9hcm15XCIsXG4gICAgICAgIHRhZzogXCJBcm15IE1lc2hcIlxuICAgIH0sXG4gICAgXCIyNDNcIjoge1xuICAgICAgICBuYW1lOiBcInNwX21lc2hfcHl0aG9uXCIsXG4gICAgICAgIHRhZzogXCJHYXRvciBNZXNoXCJcbiAgICB9LFxuICAgIFwiMjQ0XCI6IHtcbiAgICAgICAgbmFtZTogXCJzcF9tZXNoX2hvdF9hbmRfY29sZFwiLFxuICAgICAgICB0YWc6IFwiVGVhcmRvd25cIlxuICAgIH0sXG4gICAgXCIyNDVcIjoge1xuICAgICAgICBuYW1lOiBcInNwX3NwcmF5X2FybXlcIixcbiAgICAgICAgdGFnOiBcIkFybXkgUmVjb25cIlxuICAgIH0sXG4gICAgXCIyNDZcIjoge1xuICAgICAgICBuYW1lOiBcImFhX2ZhZGVfbWV0YWxsaWNcIixcbiAgICAgICAgdGFnOiBcIkFtYmVyIEZhZGVcIlxuICAgIH0sXG4gICAgXCIyNDdcIjoge1xuICAgICAgICBuYW1lOiBcImFxX2RhbWFzY3VzX3NnNTUzXCIsXG4gICAgICAgIHRhZzogXCJEYW1hc2N1cyBTdGVlbFwiXG4gICAgfSxcbiAgICBcIjI0OFwiOiB7XG4gICAgICAgIG5hbWU6IFwiYW1fY3J5c3RhbGxpemVkXCIsXG4gICAgICAgIHRhZzogXCJSZWQgUXVhcnR6XCJcbiAgICB9LFxuICAgIFwiMjQ5XCI6IHtcbiAgICAgICAgbmFtZTogXCJhbV9jcnlzdGFsbGl6ZWRfYmx1ZVwiLFxuICAgICAgICB0YWc6IFwiQ29iYWx0IFF1YXJ0elwiXG4gICAgfSxcbiAgICBcIjI1MFwiOiB7XG4gICAgICAgIG5hbWU6IFwiaHlfdmFyaWNhbW9fcmVkXCIsXG4gICAgICAgIHRhZzogXCJGdWxsIFN0b3BcIlxuICAgIH0sXG4gICAgXCIyNTFcIjoge1xuICAgICAgICBuYW1lOiBcImh5X3NuYWtlc2tpblwiLFxuICAgICAgICB0YWc6IFwiUGl0IFZpcGVyXCJcbiAgICB9LFxuICAgIFwiMjUyXCI6IHtcbiAgICAgICAgbmFtZTogXCJhbV9jcnlzdGFsbGl6ZWRfc2lsdmVyXCIsXG4gICAgICAgIHRhZzogXCJTaWx2ZXIgUXVhcnR6XCJcbiAgICB9LFxuICAgIFwiMjUzXCI6IHtcbiAgICAgICAgbmFtZTogXCJhYV9mYWRlX2dyYXNzbGFuZFwiLFxuICAgICAgICB0YWc6IFwiQWNpZCBGYWRlXCJcbiAgICB9LFxuICAgIFwiMjU0XCI6IHtcbiAgICAgICAgbmFtZTogXCJzb19vcmFuZ2VfYWNjZW50c1wiLFxuICAgICAgICB0YWc6IFwiTml0cm9cIlxuICAgIH0sXG4gICAgXCIyNTVcIjoge1xuICAgICAgICBuYW1lOiBcImN1X200X2FzaW1vdlwiLFxuICAgICAgICB0YWc6IFwiQXNpaW1vdlwiXG4gICAgfSxcbiAgICBcIjI1NlwiOiB7XG4gICAgICAgIG5hbWU6IFwiY3Vfc2F3ZWRvZmZfb2N0b3B1bXBcIixcbiAgICAgICAgdGFnOiBcIlRoZSBLcmFrZW5cIlxuICAgIH0sXG4gICAgXCIyNTdcIjoge1xuICAgICAgICBuYW1lOiBcImN1X200YTEtc19lbGVnYW50XCIsXG4gICAgICAgIHRhZzogXCJHdWFyZGlhblwiXG4gICAgfSxcbiAgICBcIjI1OFwiOiB7XG4gICAgICAgIG5hbWU6IFwiY3VfcDI1MF9yZWZpbmVkXCIsXG4gICAgICAgIHRhZzogXCJNZWhuZGlcIlxuICAgIH0sXG4gICAgXCIyNTlcIjoge1xuICAgICAgICBuYW1lOiBcImN1X2F3cF9jb2JyYVwiLFxuICAgICAgICB0YWc6IFwiUmVkbGluZVwiXG4gICAgfSxcbiAgICBcIjI2MFwiOiB7XG4gICAgICAgIG5hbWU6IFwiY3VfZmFtYXNfcHVsc2VcIixcbiAgICAgICAgdGFnOiBcIlB1bHNlXCJcbiAgICB9LFxuICAgIFwiMjYxXCI6IHtcbiAgICAgICAgbmFtZTogXCJoeV9tYXJpbmFfc3VucmlzZVwiLFxuICAgICAgICB0YWc6IFwiTWFyaW5hXCJcbiAgICB9LFxuICAgIFwiMjYyXCI6IHtcbiAgICAgICAgbmFtZTogXCJhbV90aG9ybnlfcm9zZV9tcDlcIixcbiAgICAgICAgdGFnOiBcIlJvc2UgSXJvblwiXG4gICAgfSxcbiAgICBcIjI2M1wiOiB7XG4gICAgICAgIG5hbWU6IFwiY3Vfc2t1bGxfbm92YVwiLFxuICAgICAgICB0YWc6IFwiUmlzaW5nIFNrdWxsXCJcbiAgICB9LFxuICAgIFwiMjY0XCI6IHtcbiAgICAgICAgbmFtZTogXCJjdV9zYW5kc3Rvcm1cIixcbiAgICAgICAgdGFnOiBcIlNhbmRzdG9ybVwiXG4gICAgfSxcbiAgICBcIjI2NVwiOiB7XG4gICAgICAgIG5hbWU6IFwiaHlfa2FtaVwiLFxuICAgICAgICB0YWc6IFwiS2FtaVwiXG4gICAgfSxcbiAgICBcIjI2NlwiOiB7XG4gICAgICAgIG5hbWU6IFwiYXFfb2JzaWRpYW5cIixcbiAgICAgICAgdGFnOiBcIk1hZ21hXCJcbiAgICB9LFxuICAgIFwiMjY3XCI6IHtcbiAgICAgICAgbmFtZTogXCJhbV90dXJxb2lzZV9oYWxmdG9uZVwiLFxuICAgICAgICB0YWc6IFwiQ29iYWx0IEhhbGZ0b25lXCJcbiAgICB9LFxuICAgIFwiMjY4XCI6IHtcbiAgICAgICAgbmFtZTogXCJhbV9kaWFtb25kX3BsYXRlXCIsXG4gICAgICAgIHRhZzogXCJUcmVhZCBQbGF0ZVwiXG4gICAgfSxcbiAgICBcIjI2OVwiOiB7XG4gICAgICAgIG5hbWU6IFwiYW1fZnVzY2hpYVwiLFxuICAgICAgICB0YWc6IFwiVGhlIEZ1c2NoaWEgSXMgTm93XCJcbiAgICB9LFxuICAgIFwiMjcwXCI6IHtcbiAgICAgICAgbmFtZTogXCJhcV9ldGNoZWRfY3o3NVwiLFxuICAgICAgICB0YWc6IFwiVmljdG9yaWFcIlxuICAgIH0sXG4gICAgXCIyNzFcIjoge1xuICAgICAgICBuYW1lOiBcImFtX3AyNTBfYmVhZGVkX3BhaW50XCIsXG4gICAgICAgIHRhZzogXCJVbmRlcnRvd1wiXG4gICAgfSxcbiAgICBcIjI3MlwiOiB7XG4gICAgICAgIG5hbWU6IFwiYW1fZmx1dGVkX3RlYzlcIixcbiAgICAgICAgdGFnOiBcIlRpdGFuaXVtIEJpdFwiXG4gICAgfSxcbiAgICBcIjI3M1wiOiB7XG4gICAgICAgIG5hbWU6IFwiYXFfZW5ncmF2ZWRfZGVhZ2xlXCIsXG4gICAgICAgIHRhZzogXCJIZWlybG9vbVwiXG4gICAgfSxcbiAgICBcIjI3NFwiOiB7XG4gICAgICAgIG5hbWU6IFwiYW1fY29wcGVyX2ZsZWNrc1wiLFxuICAgICAgICB0YWc6IFwiQ29wcGVyIEdhbGF4eVwiXG4gICAgfSxcbiAgICBcIjI3NVwiOiB7XG4gICAgICAgIG5hbWU6IFwiaHlfcG9seV9jYW1vXCIsXG4gICAgICAgIHRhZzogXCJSZWQgRnJhZ0NhbVwiXG4gICAgfSxcbiAgICBcIjI3NlwiOiB7XG4gICAgICAgIG5hbWU6IFwic29fcGFudGhlclwiLFxuICAgICAgICB0YWc6IFwiUGFudGhlclwiXG4gICAgfSxcbiAgICBcIjI3N1wiOiB7XG4gICAgICAgIG5hbWU6IFwiYXFfdXNwX3N0YWlubGVzc1wiLFxuICAgICAgICB0YWc6IFwiU3RhaW5sZXNzXCJcbiAgICB9LFxuICAgIFwiMjc4XCI6IHtcbiAgICAgICAgbmFtZTogXCJoeV9jcmFxdWVsdXJlXCIsXG4gICAgICAgIHRhZzogXCJCbHVlIEZpc3N1cmVcIlxuICAgIH0sXG4gICAgXCIyNzlcIjoge1xuICAgICAgICBuYW1lOiBcImN1X2F3cF9hc2ltb3ZcIixcbiAgICAgICAgdGFnOiBcIkFzaWltb3ZcIlxuICAgIH0sXG4gICAgXCIyODBcIjoge1xuICAgICAgICBuYW1lOiBcImN1X2F1Z19jaGFtZWxlb25haXJlXCIsXG4gICAgICAgIHRhZzogXCJDaGFtZWxlb25cIlxuICAgIH0sXG4gICAgXCIyODFcIjoge1xuICAgICAgICBuYW1lOiBcImN1X3VtcF9jb3Jwb3JhbFwiLFxuICAgICAgICB0YWc6IFwiQ29ycG9yYWxcIlxuICAgIH0sXG4gICAgXCIyODJcIjoge1xuICAgICAgICBuYW1lOiBcImN1X2FrNDdfY29icmFcIixcbiAgICAgICAgdGFnOiBcIlJlZGxpbmVcIlxuICAgIH0sXG4gICAgXCIyODNcIjoge1xuICAgICAgICBuYW1lOiBcImN1X3A5MF90cmlnb25cIixcbiAgICAgICAgdGFnOiBcIlRyaWdvblwiXG4gICAgfSxcbiAgICBcIjI4NFwiOiB7XG4gICAgICAgIG5hbWU6IFwiY3VfbWFjMTBfcmVkaG90XCIsXG4gICAgICAgIHRhZzogXCJIZWF0XCJcbiAgICB9LFxuICAgIFwiMjg1XCI6IHtcbiAgICAgICAgbmFtZTogXCJzcF9uZWdldl90dXJxX3RlcnJhaW5cIixcbiAgICAgICAgdGFnOiBcIlRlcnJhaW5cIlxuICAgIH0sXG4gICAgXCIyODZcIjoge1xuICAgICAgICBuYW1lOiBcImN1X25vdmFfYW50aXF1ZVwiLFxuICAgICAgICB0YWc6IFwiQW50aXF1ZVwiXG4gICAgfSxcbiAgICBcIjI4N1wiOiB7XG4gICAgICAgIG5hbWU6IFwiY3Vfc2c1NTNfcHVsc2VcIixcbiAgICAgICAgdGFnOiBcIlB1bHNlXCJcbiAgICB9LFxuICAgIFwiMjg4XCI6IHtcbiAgICAgICAgbmFtZTogXCJhbl9mYW1hc19zZ3RcIixcbiAgICAgICAgdGFnOiBcIlNlcmdlYW50XCJcbiAgICB9LFxuICAgIFwiMjg5XCI6IHtcbiAgICAgICAgbmFtZTogXCJjdV90ZWM5X3NhbmRzdG9ybVwiLFxuICAgICAgICB0YWc6IFwiU2FuZHN0b3JtXCJcbiAgICB9LFxuICAgIFwiMjkwXCI6IHtcbiAgICAgICAgbmFtZTogXCJjdV91c3BfZWxlZ2FudFwiLFxuICAgICAgICB0YWc6IFwiR3VhcmRpYW5cIlxuICAgIH0sXG4gICAgXCIyOTFcIjoge1xuICAgICAgICBuYW1lOiBcImN1X21hZzdfaGVhdmVuXCIsXG4gICAgICAgIHRhZzogXCJIZWF2ZW4gR3VhcmRcIlxuICAgIH0sXG4gICAgXCIyOTNcIjoge1xuICAgICAgICBuYW1lOiBcImh5X25lcm9kaWFcIixcbiAgICAgICAgdGFnOiBcIkRlYXRoIFJhdHRsZVwiXG4gICAgfSxcbiAgICBcIjI5NFwiOiB7XG4gICAgICAgIG5hbWU6IFwic29fZ3JlZW5cIixcbiAgICAgICAgdGFnOiBcIkdyZWVuIEFwcGxlXCJcbiAgICB9LFxuICAgIFwiMjk1XCI6IHtcbiAgICAgICAgbmFtZTogXCJjdV9tb25leVwiLFxuICAgICAgICB0YWc6IFwiRnJhbmtsaW5cIlxuICAgIH0sXG4gICAgXCIyOTZcIjoge1xuICAgICAgICBuYW1lOiBcImFtX2NyeXN0YWxsaXplZF9kYXJrXCIsXG4gICAgICAgIHRhZzogXCJNZXRlb3JpdGVcIlxuICAgIH0sXG4gICAgXCIyOTdcIjoge1xuICAgICAgICBuYW1lOiBcInNvX29yY2FcIixcbiAgICAgICAgdGFnOiBcIlR1eGVkb1wiXG4gICAgfSxcbiAgICBcIjI5OFwiOiB7XG4gICAgICAgIG5hbWU6IFwiYW1fYXJteV9zaGluZVwiLFxuICAgICAgICB0YWc6IFwiQXJteSBTaGVlblwiXG4gICAgfSxcbiAgICBcIjI5OVwiOiB7XG4gICAgICAgIG5hbWU6IFwiYW1fb3ZhbF9oZXhcIixcbiAgICAgICAgdGFnOiBcIkNhZ2VkIFN0ZWVsXCJcbiAgICB9LFxuICAgIFwiMzAwXCI6IHtcbiAgICAgICAgbmFtZTogXCJjdV9waW5zdHJpcGVfYWs0N1wiLFxuICAgICAgICB0YWc6IFwiRW1lcmFsZCBQaW5zdHJpcGVcIlxuICAgIH0sXG4gICAgXCIzMDFcIjoge1xuICAgICAgICBuYW1lOiBcImFtX200YTEtc19hbGxveV9vcmFuZ2VcIixcbiAgICAgICAgdGFnOiBcIkF0b21pYyBBbGxveVwiXG4gICAgfSxcbiAgICBcIjMwMlwiOiB7XG4gICAgICAgIG5hbWU6IFwiY3VfYWs0N19ydWJiZXJcIixcbiAgICAgICAgdGFnOiBcIlZ1bGNhblwiXG4gICAgfSxcbiAgICBcIjMwM1wiOiB7XG4gICAgICAgIG5hbWU6IFwiY3VfdGVjOV9hc2lpbW92XCIsXG4gICAgICAgIHRhZzogXCJJc2FhY1wiXG4gICAgfSxcbiAgICBcIjMwNFwiOiB7XG4gICAgICAgIG5hbWU6IFwiY3Vfc3NnMDhfaW1tb3J0YWxcIixcbiAgICAgICAgdGFnOiBcIlNsYXNoZWRcIlxuICAgIH0sXG4gICAgXCIzMDVcIjoge1xuICAgICAgICBuYW1lOiBcImN1X2F1Z19wcm9ncmVzc2l2XCIsXG4gICAgICAgIHRhZzogXCJUb3JxdWVcIlxuICAgIH0sXG4gICAgXCIzMDZcIjoge1xuICAgICAgICBuYW1lOiBcImN1X2Jpem9uX2FudGlxdWVcIixcbiAgICAgICAgdGFnOiBcIkFudGlxdWVcIlxuICAgIH0sXG4gICAgXCIzMDdcIjoge1xuICAgICAgICBuYW1lOiBcImN1X3JldHJpYnV0aW9uXCIsXG4gICAgICAgIHRhZzogXCJSZXRyaWJ1dGlvblwiXG4gICAgfSxcbiAgICBcIjMwOFwiOiB7XG4gICAgICAgIG5hbWU6IFwiaHlfZ2FsaWxfa2FtaVwiLFxuICAgICAgICB0YWc6IFwiS2FtaVwiXG4gICAgfSxcbiAgICBcIjMwOVwiOiB7XG4gICAgICAgIG5hbWU6IFwiY3VfbTRhMV9ob3dsaW5nXCIsXG4gICAgICAgIHRhZzogXCJIb3dsXCJcbiAgICB9LFxuICAgIFwiMzEwXCI6IHtcbiAgICAgICAgbmFtZTogXCJjdV9tYWMxMF9kZWNheVwiLFxuICAgICAgICB0YWc6IFwiQ3Vyc2VcIlxuICAgIH0sXG4gICAgXCIzMTFcIjoge1xuICAgICAgICBuYW1lOiBcImN1X3A5MF9zY29ycGl1c1wiLFxuICAgICAgICB0YWc6IFwiRGVzZXJ0IFdhcmZhcmVcIlxuICAgIH0sXG4gICAgXCIzMTJcIjoge1xuICAgICAgICBuYW1lOiBcImN1X3NjYXJfY3lyZXhcIixcbiAgICAgICAgdGFnOiBcIkN5cmV4XCJcbiAgICB9LFxuICAgIFwiMzEzXCI6IHtcbiAgICAgICAgbmFtZTogXCJjdV91c3Bfc3BpdGZpcmVcIixcbiAgICAgICAgdGFnOiBcIk9yaW9uXCJcbiAgICB9LFxuICAgIFwiMzE0XCI6IHtcbiAgICAgICAgbmFtZTogXCJjdV94bTEwMTRfaGVhdmVuX2d1YXJkXCIsXG4gICAgICAgIHRhZzogXCJIZWF2ZW4gR3VhcmRcIlxuICAgIH0sXG4gICAgXCIzMTVcIjoge1xuICAgICAgICBuYW1lOiBcImFtX25pdHJvZ2VuXCIsXG4gICAgICAgIHRhZzogXCJQb2lzb24gRGFydFwiXG4gICAgfSxcbiAgICBcIjMxNlwiOiB7XG4gICAgICAgIG5hbWU6IFwiY3VfcGFudGhlcl9hazQ3XCIsXG4gICAgICAgIHRhZzogXCJKYWd1YXJcIlxuICAgIH0sXG4gICAgXCIzMTdcIjoge1xuICAgICAgICBuYW1lOiBcImN1X2JyYXRhdGF0X25lZ2V2XCIsXG4gICAgICAgIHRhZzogXCJCcmF0YXRhdFwiXG4gICAgfSxcbiAgICBcIjMxOFwiOiB7XG4gICAgICAgIG5hbWU6IFwiY3VfdXNwX3NhbmRwYXBlcmVkXCIsXG4gICAgICAgIHRhZzogXCJSb2FkIFJhc2hcIlxuICAgIH0sXG4gICAgXCIzMTlcIjoge1xuICAgICAgICBuYW1lOiBcImh5X3NzZzA4X21hcmtlclwiLFxuICAgICAgICB0YWc6IFwiRGV0b3VyXCJcbiAgICB9LFxuICAgIFwiMzIwXCI6IHtcbiAgICAgICAgbmFtZTogXCJoeV9zbmFrZXNraW5fcmVkXCIsXG4gICAgICAgIHRhZzogXCJSZWQgUHl0aG9uXCJcbiAgICB9LFxuICAgIFwiMzIxXCI6IHtcbiAgICAgICAgbmFtZTogXCJjdV9tNGExLXNfc2lsZW5jZVwiLFxuICAgICAgICB0YWc6IFwiTWFzdGVyIFBpZWNlXCJcbiAgICB9LFxuICAgIFwiMzIyXCI6IHtcbiAgICAgICAgbmFtZTogXCJzb19vcmFuZ2VfYWNjZW50czJcIixcbiAgICAgICAgdGFnOiBcIk5pdHJvXCJcbiAgICB9LFxuICAgIFwiMzIzXCI6IHtcbiAgICAgICAgbmFtZTogXCJhcV9zdGVlbFwiLFxuICAgICAgICB0YWc6IFwiUnVzdCBDb2F0XCJcbiAgICB9LFxuICAgIFwiMzI1XCI6IHtcbiAgICAgICAgbmFtZTogXCJhbV9yb3lhbFwiLFxuICAgICAgICB0YWc6IFwiQ2hhbGljZVwiXG4gICAgfSxcbiAgICBcIjMyNlwiOiB7XG4gICAgICAgIG5hbWU6IFwiYW1fbWV0YWxzXCIsXG4gICAgICAgIHRhZzogXCJLbmlnaHRcIlxuICAgIH0sXG4gICAgXCIzMjdcIjoge1xuICAgICAgICBuYW1lOiBcImFtX2NoYWlubWFpbFwiLFxuICAgICAgICB0YWc6IFwiQ2hhaW5tYWlsXCJcbiAgICB9LFxuICAgIFwiMzI4XCI6IHtcbiAgICAgICAgbmFtZTogXCJhcV9oYW5kY2Fubm9uXCIsXG4gICAgICAgIHRhZzogXCJIYW5kIENhbm5vblwiXG4gICAgfSxcbiAgICBcIjMyOVwiOiB7XG4gICAgICAgIG5hbWU6IFwiYW1fbWV0YWxfaW5sYXlcIixcbiAgICAgICAgdGFnOiBcIkRhcmsgQWdlXCJcbiAgICB9LFxuICAgIFwiMzMwXCI6IHtcbiAgICAgICAgbmFtZTogXCJoeV92aW5lc1wiLFxuICAgICAgICB0YWc6IFwiQnJpYXJcIlxuICAgIH0sXG4gICAgXCIzMzJcIjoge1xuICAgICAgICBuYW1lOiBcImh5X2luZGlnb191c3BcIixcbiAgICAgICAgdGFnOiBcIlJveWFsIEJsdWVcIlxuICAgIH0sXG4gICAgXCIzMzNcIjoge1xuICAgICAgICBuYW1lOiBcInNvX2luZGlnb19hbmRfZ3JleVwiLFxuICAgICAgICB0YWc6IFwiSW5kaWdvXCJcbiAgICB9LFxuICAgIFwiMzM0XCI6IHtcbiAgICAgICAgbmFtZTogXCJhbV9neXJhdGVcIixcbiAgICAgICAgdGFnOiBcIlR3aXN0XCJcbiAgICB9LFxuICAgIFwiMzM1XCI6IHtcbiAgICAgICAgbmFtZTogXCJhbl9yb3lhbGJsZWVkXCIsXG4gICAgICAgIHRhZzogXCJNb2R1bGVcIlxuICAgIH0sXG4gICAgXCIzMzZcIjoge1xuICAgICAgICBuYW1lOiBcImN1X3RpdGFuc3Rvcm1cIixcbiAgICAgICAgdGFnOiBcIkRlc2VydC1TdHJpa2VcIlxuICAgIH0sXG4gICAgXCIzMzdcIjoge1xuICAgICAgICBuYW1lOiBcImN1X2tvcnVwdFwiLFxuICAgICAgICB0YWc6IFwiVGF0dGVyXCJcbiAgICB9LFxuICAgIFwiMzM4XCI6IHtcbiAgICAgICAgbmFtZTogXCJjdV9wMjAwMF9wdWxzZVwiLFxuICAgICAgICB0YWc6IFwiUHVsc2VcIlxuICAgIH0sXG4gICAgXCIzMzlcIjoge1xuICAgICAgICBuYW1lOiBcImN1X2thaW1hblwiLFxuICAgICAgICB0YWc6IFwiQ2FpbWFuXCJcbiAgICB9LFxuICAgIFwiMzQwXCI6IHtcbiAgICAgICAgbmFtZTogXCJjdV93ZWxsX3RyYXZlbGVkX2FrNDdcIixcbiAgICAgICAgdGFnOiBcIkpldCBTZXRcIlxuICAgIH0sXG4gICAgXCIzNDFcIjoge1xuICAgICAgICBuYW1lOiBcImN1X2dyZWVuX2xlYXRoZXJfYWs0N1wiLFxuICAgICAgICB0YWc6IFwiRmlyc3QgQ2xhc3NcIlxuICAgIH0sXG4gICAgXCIzNDJcIjoge1xuICAgICAgICBuYW1lOiBcImN1X2Jyb3duX2xlYXRoZXJfcDkwXCIsXG4gICAgICAgIHRhZzogXCJMZWF0aGVyXCJcbiAgICB9LFxuICAgIFwiMzQzXCI6IHtcbiAgICAgICAgbmFtZTogXCJjdV9sdWdnYWdlX21hYzEwXCIsXG4gICAgICAgIHRhZzogXCJDb21tdXRlclwiXG4gICAgfSxcbiAgICBcIjM0NFwiOiB7XG4gICAgICAgIG5hbWU6IFwiY3VfbWVkaWV2YWxfZHJhZ29uX2F3cFwiLFxuICAgICAgICB0YWc6IFwiRHJhZ29uIExvcmVcIlxuICAgIH0sXG4gICAgXCIzNDVcIjoge1xuICAgICAgICBuYW1lOiBcImN1X2dyZWVuX2xlYXRoZXJfc2F3ZWRvZmZcIixcbiAgICAgICAgdGFnOiBcIkZpcnN0IENsYXNzXCJcbiAgICB9LFxuICAgIFwiMzQ2XCI6IHtcbiAgICAgICAgbmFtZTogXCJjdV9sdWdnYWdlX3AyMDAwXCIsXG4gICAgICAgIHRhZzogXCJDb2FjaCBDbGFzc1wiXG4gICAgfSxcbiAgICBcIjM0N1wiOiB7XG4gICAgICAgIG5hbWU6IFwiYXFfcGlsb3RfZGVhZ2xlXCIsXG4gICAgICAgIHRhZzogXCJQaWxvdFwiXG4gICAgfSxcbiAgICBcIjM0OFwiOiB7XG4gICAgICAgIG5hbWU6IFwiY3VfbGVhdGhlcl94bTEwMTRcIixcbiAgICAgICAgdGFnOiBcIlJlZCBMZWF0aGVyXCJcbiAgICB9LFxuICAgIFwiMzQ5XCI6IHtcbiAgICAgICAgbmFtZTogXCJjdV9iaXpvbi1vc2lyaXNcIixcbiAgICAgICAgdGFnOiBcIk9zaXJpc1wiXG4gICAgfSxcbiAgICBcIjM1MFwiOiB7XG4gICAgICAgIG5hbWU6IFwiY3VfYzc1YS10aWdlclwiLFxuICAgICAgICB0YWc6IFwiVGlncmlzXCJcbiAgICB9LFxuICAgIFwiMzUxXCI6IHtcbiAgICAgICAgbmFtZTogXCJjdV9kZWFnbGVfYXVyZXVzXCIsXG4gICAgICAgIHRhZzogXCJDb25zcGlyYWN5XCJcbiAgICB9LFxuICAgIFwiMzUyXCI6IHtcbiAgICAgICAgbmFtZTogXCJhcV81N19mZWF0aGVyc1wiLFxuICAgICAgICB0YWc6IFwiRm93bCBQbGF5XCJcbiAgICB9LFxuICAgIFwiMzUzXCI6IHtcbiAgICAgICAgbmFtZTogXCJjdV9nbG9jay1saXF1ZXNjZW50XCIsXG4gICAgICAgIHRhZzogXCJXYXRlciBFbGVtZW50YWxcIlxuICAgIH0sXG4gICAgXCIzNTRcIjoge1xuICAgICAgICBuYW1lOiBcImN1X21wNy1jb21tYW5kZXJcIixcbiAgICAgICAgdGFnOiBcIlVyYmFuIEhhemFyZFwiXG4gICAgfSxcbiAgICBcIjM1NVwiOiB7XG4gICAgICAgIG5hbWU6IFwiY3VfbmVnZXZfdGl0YW5zdG9ybVwiLFxuICAgICAgICB0YWc6IFwiRGVzZXJ0LVN0cmlrZVwiXG4gICAgfSxcbiAgICBcIjM1NlwiOiB7XG4gICAgICAgIG5hbWU6IFwiY3Vfbm92YV9rb2lcIixcbiAgICAgICAgdGFnOiBcIktvaVwiXG4gICAgfSxcbiAgICBcIjM1N1wiOiB7XG4gICAgICAgIG5hbWU6IFwiY3VfcDIwMDBfaXZvcnlcIixcbiAgICAgICAgdGFnOiBcIkl2b3J5XCJcbiAgICB9LFxuICAgIFwiMzU4XCI6IHtcbiAgICAgICAgbmFtZTogXCJjdV9iaXR0ZXJzd2VldFwiLFxuICAgICAgICB0YWc6IFwiU3VwZXJub3ZhXCJcbiAgICB9LFxuICAgIFwiMzU5XCI6IHtcbiAgICAgICAgbmFtZTogXCJjdV9wOTAtYXNpaW1vdlwiLFxuICAgICAgICB0YWc6IFwiQXNpaW1vdlwiXG4gICAgfSxcbiAgICBcIjM2MFwiOiB7XG4gICAgICAgIG5hbWU6IFwiY3VfbTRhMXNfY3lyZXhcIixcbiAgICAgICAgdGFnOiBcIkN5cmV4XCJcbiAgICB9LFxuICAgIFwiMzYxXCI6IHtcbiAgICAgICAgbmFtZTogXCJhcV9sZXZpYXRoYW5cIixcbiAgICAgICAgdGFnOiBcIkFieXNzXCJcbiAgICB9LFxuICAgIFwiMzYyXCI6IHtcbiAgICAgICAgbmFtZTogXCJoeV9saW5lc19vcmFuZ2VcIixcbiAgICAgICAgdGFnOiBcIkxhYnlyaW50aFwiXG4gICAgfSxcbiAgICBcIjM2M1wiOiB7XG4gICAgICAgIG5hbWU6IFwiY3VfbHVnZ2FnZV9zZzU1M1wiLFxuICAgICAgICB0YWc6IFwiVHJhdmVsZXJcIlxuICAgIH0sXG4gICAgXCIzNjRcIjoge1xuICAgICAgICBuYW1lOiBcImN1X2x1Z2dhZ2VfdXNwLXNcIixcbiAgICAgICAgdGFnOiBcIkJ1c2luZXNzIENsYXNzXCJcbiAgICB9LFxuICAgIFwiMzY1XCI6IHtcbiAgICAgICAgbmFtZTogXCJoeV9wbGFpZDFcIixcbiAgICAgICAgdGFnOiBcIk9saXZlIFBsYWlkXCJcbiAgICB9LFxuICAgIFwiMzY2XCI6IHtcbiAgICAgICAgbmFtZTogXCJoeV9wbGFpZDJcIixcbiAgICAgICAgdGFnOiBcIkdyZWVuIFBsYWlkXCJcbiAgICB9LFxuICAgIFwiMzY3XCI6IHtcbiAgICAgICAgbmFtZTogXCJhbV9udWNsZWFyX3BhdHRlcm4xX2dsb2NrXCIsXG4gICAgICAgIHRhZzogXCJSZWFjdG9yXCJcbiAgICB9LFxuICAgIFwiMzY4XCI6IHtcbiAgICAgICAgbmFtZTogXCJoeV9udWNsZWFyX3BhdHRlcm4yX21wOVwiLFxuICAgICAgICB0YWc6IFwiU2V0dGluZyBTdW5cIlxuICAgIH0sXG4gICAgXCIzNjlcIjoge1xuICAgICAgICBuYW1lOiBcInNwX251Y2xlYXJfcGF0dGVybjNfbmVnZXZcIixcbiAgICAgICAgdGFnOiBcIk51Y2xlYXIgV2FzdGVcIlxuICAgIH0sXG4gICAgXCIzNzBcIjoge1xuICAgICAgICBuYW1lOiBcImFtX251Y2xlYXJfc2t1bGxzMV94bTEwMTRcIixcbiAgICAgICAgdGFnOiBcIkJvbmUgTWFjaGluZVwiXG4gICAgfSxcbiAgICBcIjM3MVwiOiB7XG4gICAgICAgIG5hbWU6IFwiYW1fbnVjbGVhcl9za3VsbHMyX2ZhbWFzXCIsXG4gICAgICAgIHRhZzogXCJTdHl4XCJcbiAgICB9LFxuICAgIFwiMzcyXCI6IHtcbiAgICAgICAgbmFtZTogXCJhbV9udWNsZWFyX3NrdWxsczNfbWFjMTBcIixcbiAgICAgICAgdGFnOiBcIk51Y2xlYXIgR2FyZGVuXCJcbiAgICB9LFxuICAgIFwiMzczXCI6IHtcbiAgICAgICAgbmFtZTogXCJoeV9udWNsZWFyX3NrdWxsczRfcDI1MFwiLFxuICAgICAgICB0YWc6IFwiQ29udGFtaW5hdGlvblwiXG4gICAgfSxcbiAgICBcIjM3NFwiOiB7XG4gICAgICAgIG5hbWU6IFwiaHlfbnVjbGVhcl9za3VsbHM1X3RlYzlcIixcbiAgICAgICAgdGFnOiBcIlRveGljXCJcbiAgICB9LFxuICAgIFwiMzc1XCI6IHtcbiAgICAgICAgbmFtZTogXCJzcF9udWtlc3RyaXBlX29yYW5nZV9hdWdcIixcbiAgICAgICAgdGFnOiBcIlJhZGlhdGlvbiBIYXphcmRcIlxuICAgIH0sXG4gICAgXCIzNzZcIjoge1xuICAgICAgICBuYW1lOiBcInNvX2dyZXlfbnVjbGVhcl9ncmVlbl9iaXpvblwiLFxuICAgICAgICB0YWc6IFwiQ2hlbWljYWwgR3JlZW5cIlxuICAgIH0sXG4gICAgXCIzNzdcIjoge1xuICAgICAgICBuYW1lOiBcInNvX2dyZXlfbnVjbGVhcl9vcmFuZ2VfZml2ZV9zZXZlblwiLFxuICAgICAgICB0YWc6IFwiSG90IFNob3RcIlxuICAgIH0sXG4gICAgXCIzNzhcIjoge1xuICAgICAgICBuYW1lOiBcInNwX251a2VzdHJpcGVfbWFyb29uX3NnNTUzXCIsXG4gICAgICAgIHRhZzogXCJGYWxsb3V0IFdhcm5pbmdcIlxuICAgIH0sXG4gICAgXCIzNzlcIjoge1xuICAgICAgICBuYW1lOiBcImN1X2NlcmJydXNfZ2FsaWxcIixcbiAgICAgICAgdGFnOiBcIkNlcmJlcnVzXCJcbiAgICB9LFxuICAgIFwiMzgwXCI6IHtcbiAgICAgICAgbmFtZTogXCJjdV90cmlidXRlX2FrNDdcIixcbiAgICAgICAgdGFnOiBcIldhc3RlbGFuZCBSZWJlbFwiXG4gICAgfSxcbiAgICBcIjM4MVwiOiB7XG4gICAgICAgIG5hbWU6IFwiYXFfZ2xvY2tfY29pbGVkXCIsXG4gICAgICAgIHRhZzogXCJHcmluZGVyXCJcbiAgICB9LFxuICAgIFwiMzgyXCI6IHtcbiAgICAgICAgbmFtZTogXCJhbV9nM3NnMV9tdXJreVwiLFxuICAgICAgICB0YWc6IFwiTXVya3lcIlxuICAgIH0sXG4gICAgXCIzODNcIjoge1xuICAgICAgICBuYW1lOiBcImFxX200YTFzX2Jhc2lsaXNrXCIsXG4gICAgICAgIHRhZzogXCJCYXNpbGlza1wiXG4gICAgfSxcbiAgICBcIjM4NFwiOiB7XG4gICAgICAgIG5hbWU6IFwiY3VfbTRhNF9ncmlmZmluXCIsXG4gICAgICAgIHRhZzogXCJHcmlmZmluXCJcbiAgICB9LFxuICAgIFwiMzg1XCI6IHtcbiAgICAgICAgbmFtZTogXCJzcF9tYWc3X2ZpcmViaXR0ZW5cIixcbiAgICAgICAgdGFnOiBcIkZpcmVzdGFydGVyXCJcbiAgICB9LFxuICAgIFwiMzg2XCI6IHtcbiAgICAgICAgbmFtZTogXCJjdV9tcDlfY2hldnJvblwiLFxuICAgICAgICB0YWc6IFwiRGFydFwiXG4gICAgfSxcbiAgICBcIjM4N1wiOiB7XG4gICAgICAgIG5hbWU6IFwiY3VfZml2ZXNldmVuX3VyYmFuX2hhemFyZFwiLFxuICAgICAgICB0YWc6IFwiVXJiYW4gSGF6YXJkXCJcbiAgICB9LFxuICAgIFwiMzg4XCI6IHtcbiAgICAgICAgbmFtZTogXCJhcV9wMjUwX2NhcnRlbFwiLFxuICAgICAgICB0YWc6IFwiQ2FydGVsXCJcbiAgICB9LFxuICAgIFwiMzg5XCI6IHtcbiAgICAgICAgbmFtZTogXCJjdV9wMjAwMF9maXJlX2VsZW1lbnRhbFwiLFxuICAgICAgICB0YWc6IFwiRmlyZSBFbGVtZW50YWxcIlxuICAgIH0sXG4gICAgXCIzOTBcIjoge1xuICAgICAgICBuYW1lOiBcImFxX3Nhd2Vkb2ZmX2JsYWNrZ29sZFwiLFxuICAgICAgICB0YWc6IFwiSGlnaHdheW1hblwiXG4gICAgfSxcbiAgICBcIjM5MVwiOiB7XG4gICAgICAgIG5hbWU6IFwiY3Vfc2NhcjIwX2ludGVydmVudGlvblwiLFxuICAgICAgICB0YWc6IFwiQ2FyZGlhY1wiXG4gICAgfSxcbiAgICBcIjM5MlwiOiB7XG4gICAgICAgIG5hbWU6IFwic3BfdW1wNDVfZC12aXNpb25zXCIsXG4gICAgICAgIHRhZzogXCJEZWx1c2lvblwiXG4gICAgfSxcbiAgICBcIjM5M1wiOiB7XG4gICAgICAgIG5hbWU6IFwiY3VfeG0xMDE0X2Nhcml0YXNcIixcbiAgICAgICAgdGFnOiBcIlRyYW5xdWlsaXR5XCJcbiAgICB9LFxuICAgIFwiMzk0XCI6IHtcbiAgICAgICAgbmFtZTogXCJhcV9hazQ3X2NhcnRlbFwiLFxuICAgICAgICB0YWc6IFwiQ2FydGVsXCJcbiAgICB9LFxuICAgIFwiMzk1XCI6IHtcbiAgICAgICAgbmFtZTogXCJhbV9hd3BfZ2xvcnlcIixcbiAgICAgICAgdGFnOiBcIk1hbi1vJy13YXJcIlxuICAgIH0sXG4gICAgXCIzOTZcIjoge1xuICAgICAgICBuYW1lOiBcImN1X2VsaXRlc191cmJhbnN0b3JtXCIsXG4gICAgICAgIHRhZzogXCJVcmJhbiBTaG9ja1wiXG4gICAgfSxcbiAgICBcIjM5N1wiOiB7XG4gICAgICAgIG5hbWU6IFwiYXFfZGVhZ2xlX25hZ2FcIixcbiAgICAgICAgdGFnOiBcIk5hZ2FcIlxuICAgIH0sXG4gICAgXCIzOThcIjoge1xuICAgICAgICBuYW1lOiBcImN1X2dhbGlsX2FicmFzaW9uXCIsXG4gICAgICAgIHRhZzogXCJDaGF0dGVyYm94XCJcbiAgICB9LFxuICAgIFwiMzk5XCI6IHtcbiAgICAgICAgbmFtZTogXCJjdV9nbG9ja19kZWF0aHRvbGxcIixcbiAgICAgICAgdGFnOiBcIkNhdGFjb21ic1wiXG4gICAgfSxcbiAgICBcIjQwMFwiOiB7XG4gICAgICAgIG5hbWU6IFwiY3VfbTRhNF9hbmNlc3RyYWxcIixcbiAgICAgICAgdGFnOiBcIum+jeeOiyAoRHJhZ29uIEtpbmcpXCJcbiAgICB9LFxuICAgIFwiNDAxXCI6IHtcbiAgICAgICAgbmFtZTogXCJjdV9tMjQ5X3Nla3RvclwiLFxuICAgICAgICB0YWc6IFwiU3lzdGVtIExvY2tcIlxuICAgIH0sXG4gICAgXCI0MDJcIjoge1xuICAgICAgICBuYW1lOiBcImFtX21hYzEwX21hbGFjaGl0ZVwiLFxuICAgICAgICB0YWc6IFwiTWFsYWNoaXRlXCJcbiAgICB9LFxuICAgIFwiNDAzXCI6IHtcbiAgICAgICAgbmFtZTogXCJjdV9tcDlfZGVhZGx5X3BvaXNvblwiLFxuICAgICAgICB0YWc6IFwiRGVhZGx5IFBvaXNvblwiXG4gICAgfSxcbiAgICBcIjQwNFwiOiB7XG4gICAgICAgIG5hbWU6IFwiY3VfcDI1MF9tYW5kYWxhXCIsXG4gICAgICAgIHRhZzogXCJNdWVydG9zXCJcbiAgICB9LFxuICAgIFwiNDA1XCI6IHtcbiAgICAgICAgbmFtZTogXCJjdV9zYXdlZG9mZl9kZXZhXCIsXG4gICAgICAgIHRhZzogXCJTZXJlbml0eVwiXG4gICAgfSxcbiAgICBcIjQwNlwiOiB7XG4gICAgICAgIG5hbWU6IFwiYXFfc2NhcjIwX2xlYWtcIixcbiAgICAgICAgdGFnOiBcIkdyb3R0b1wiXG4gICAgfSxcbiAgICBcIjQwN1wiOiB7XG4gICAgICAgIG5hbWU6IFwiYXFfeG0xMDE0X3NpZ2xhXCIsXG4gICAgICAgIHRhZzogXCJRdWlja3NpbHZlclwiXG4gICAgfSxcbiAgICBcIjQwOVwiOiB7XG4gICAgICAgIG5hbWU6IFwiYW5fdGlnZXJfb3JhbmdlXCIsXG4gICAgICAgIHRhZzogXCJUaWdlciBUb290aFwiXG4gICAgfSxcbiAgICBcIjQxMFwiOiB7XG4gICAgICAgIG5hbWU6IFwiYXFfZGFtYXNjdXNcIixcbiAgICAgICAgdGFnOiBcIkRhbWFzY3VzIFN0ZWVsXCJcbiAgICB9LFxuICAgIFwiNDExXCI6IHtcbiAgICAgICAgbmFtZTogXCJhcV9kYW1hc2N1c185MFwiLFxuICAgICAgICB0YWc6IFwiRGFtYXNjdXMgU3RlZWxcIlxuICAgIH0sXG4gICAgXCI0MTNcIjoge1xuICAgICAgICBuYW1lOiBcImFtX21hcmJsZV9mYWRlXCIsXG4gICAgICAgIHRhZzogXCJNYXJibGUgRmFkZVwiXG4gICAgfSxcbiAgICBcIjQxNFwiOiB7XG4gICAgICAgIG5hbWU6IFwiYXFfc3RlZWxfa25pZmVcIixcbiAgICAgICAgdGFnOiBcIlJ1c3QgQ29hdFwiXG4gICAgfSxcbiAgICBcIjQxNVwiOiB7XG4gICAgICAgIG5hbWU6IFwiYW1fcnVieV9tYXJibGVpemVkXCIsXG4gICAgICAgIHRhZzogXCJEb3BwbGVyXCJcbiAgICB9LFxuICAgIFwiNDE2XCI6IHtcbiAgICAgICAgbmFtZTogXCJhbV9zYXBwaGlyZV9tYXJibGVpemVkXCIsXG4gICAgICAgIHRhZzogXCJEb3BwbGVyXCJcbiAgICB9LFxuICAgIFwiNDE3XCI6IHtcbiAgICAgICAgbmFtZTogXCJhbV9ibGFja3BlYXJsX21hcmJsZWl6ZWRcIixcbiAgICAgICAgdGFnOiBcIkRvcHBsZXJcIlxuICAgIH0sXG4gICAgXCI0MThcIjoge1xuICAgICAgICBuYW1lOiBcImFtX2RvcHBsZXJfcGhhc2UxXCIsXG4gICAgICAgIHRhZzogXCJEb3BwbGVyXCJcbiAgICB9LFxuICAgIFwiNDE5XCI6IHtcbiAgICAgICAgbmFtZTogXCJhbV9kb3BwbGVyX3BoYXNlMlwiLFxuICAgICAgICB0YWc6IFwiRG9wcGxlclwiXG4gICAgfSxcbiAgICBcIjQyMFwiOiB7XG4gICAgICAgIG5hbWU6IFwiYW1fZG9wcGxlcl9waGFzZTNcIixcbiAgICAgICAgdGFnOiBcIkRvcHBsZXJcIlxuICAgIH0sXG4gICAgXCI0MjFcIjoge1xuICAgICAgICBuYW1lOiBcImFtX2RvcHBsZXJfcGhhc2U0XCIsXG4gICAgICAgIHRhZzogXCJEb3BwbGVyXCJcbiAgICB9LFxuICAgIFwiNDIyXCI6IHtcbiAgICAgICAgbmFtZTogXCJjdV9hazQ3X21hc3RlcnlcIixcbiAgICAgICAgdGFnOiBcIkVsaXRlIEJ1aWxkXCJcbiAgICB9LFxuICAgIFwiNDIzXCI6IHtcbiAgICAgICAgbmFtZTogXCJhcV9tcDdfdWx0cmFtb2Rlcm5cIixcbiAgICAgICAgdGFnOiBcIkFybW9yIENvcmVcIlxuICAgIH0sXG4gICAgXCI0MjRcIjoge1xuICAgICAgICBuYW1lOiBcImFxX2F3cF90d2luZVwiLFxuICAgICAgICB0YWc6IFwiV29ybSBHb2RcIlxuICAgIH0sXG4gICAgXCI0MjVcIjoge1xuICAgICAgICBuYW1lOiBcImFtX2Jyb256ZV9zcGFya2xlXCIsXG4gICAgICAgIHRhZzogXCJCcm9uemUgRGVjb1wiXG4gICAgfSxcbiAgICBcIjQyNlwiOiB7XG4gICAgICAgIG5hbWU6IFwiYXFfcDI1MF9jb250b3VyXCIsXG4gICAgICAgIHRhZzogXCJWYWxlbmNlXCJcbiAgICB9LFxuICAgIFwiNDI3XCI6IHtcbiAgICAgICAgbmFtZTogXCJjdV9maXZlc2V2ZW5fYmFuYW5hXCIsXG4gICAgICAgIHRhZzogXCJNb25rZXkgQnVzaW5lc3NcIlxuICAgIH0sXG4gICAgXCI0MjhcIjoge1xuICAgICAgICBuYW1lOiBcImN1X2dhbGlsX2Vjb1wiLFxuICAgICAgICB0YWc6IFwiRWNvXCJcbiAgICB9LFxuICAgIFwiNDI5XCI6IHtcbiAgICAgICAgbmFtZTogXCJhcV9mYW1hc19qaW5uXCIsXG4gICAgICAgIHRhZzogXCJEamlublwiXG4gICAgfSxcbiAgICBcIjQzMFwiOiB7XG4gICAgICAgIG5hbWU6IFwiY3VfbTRhMV9oeXBlcl9iZWFzdFwiLFxuICAgICAgICB0YWc6IFwiSHlwZXIgQmVhc3RcIlxuICAgIH0sXG4gICAgXCI0MzFcIjoge1xuICAgICAgICBuYW1lOiBcImN1X21hZzdfcmVkaG90XCIsXG4gICAgICAgIHRhZzogXCJIZWF0XCJcbiAgICB9LFxuICAgIFwiNDMyXCI6IHtcbiAgICAgICAgbmFtZTogXCJhbV9uZWdldl9nbG9yeVwiLFxuICAgICAgICB0YWc6IFwiTWFuLW8nLXdhclwiXG4gICAgfSxcbiAgICBcIjQzM1wiOiB7XG4gICAgICAgIG5hbWU6IFwiY3VfbWFjMTBfbmVvbnJpZGVyXCIsXG4gICAgICAgIHRhZzogXCJOZW9uIFJpZGVyXCJcbiAgICB9LFxuICAgIFwiNDM0XCI6IHtcbiAgICAgICAgbmFtZTogXCJjdV9zYXdlZG9mZl9vcmlnYW1pXCIsXG4gICAgICAgIHRhZzogXCJPcmlnYW1pXCJcbiAgICB9LFxuICAgIFwiNDM1XCI6IHtcbiAgICAgICAgbmFtZTogXCJjdV9jejc1X3ByZWNpc2lvblwiLFxuICAgICAgICB0YWc6IFwiUG9sZSBQb3NpdGlvblwiXG4gICAgfSxcbiAgICBcIjQzNlwiOiB7XG4gICAgICAgIG5hbWU6IFwiYW1fdW1wX3JhY2VyXCIsXG4gICAgICAgIHRhZzogXCJHcmFuZCBQcml4XCJcbiAgICB9LFxuICAgIFwiNDM3XCI6IHtcbiAgICAgICAgbmFtZTogXCJhbV9hcXVhX2ZsZWNrc1wiLFxuICAgICAgICB0YWc6IFwiVHdpbGlnaHQgR2FsYXh5XCJcbiAgICB9LFxuICAgIFwiNDM4XCI6IHtcbiAgICAgICAgbmFtZTogXCJjdV9jaHJvbm9zX2czc2cxXCIsXG4gICAgICAgIHRhZzogXCJDaHJvbm9zXCJcbiAgICB9LFxuICAgIFwiNDM5XCI6IHtcbiAgICAgICAgbmFtZTogXCJoeV9oYWRlc1wiLFxuICAgICAgICB0YWc6IFwiSGFkZXNcIlxuICAgIH0sXG4gICAgXCI0NDBcIjoge1xuICAgICAgICBuYW1lOiBcImh5X2ljYXJ1c1wiLFxuICAgICAgICB0YWc6IFwiSWNhcnVzIEZlbGxcIlxuICAgIH0sXG4gICAgXCI0NDFcIjoge1xuICAgICAgICBuYW1lOiBcImN1X2xhYnlyaW50aFwiLFxuICAgICAgICB0YWc6IFwiTWlub3RhdXIncyBMYWJ5cmludGhcIlxuICAgIH0sXG4gICAgXCI0NDJcIjoge1xuICAgICAgICBuYW1lOiBcInNwX2xhYnlyaW50aFwiLFxuICAgICAgICB0YWc6IFwiQXN0ZXJpb25cIlxuICAgIH0sXG4gICAgXCI0NDNcIjoge1xuICAgICAgICBuYW1lOiBcInNwX2xhYnlyaW50aDJcIixcbiAgICAgICAgdGFnOiBcIlBhdGhmaW5kZXJcIlxuICAgIH0sXG4gICAgXCI0NDRcIjoge1xuICAgICAgICBuYW1lOiBcInNwX2xhYnlyaW50aDNcIixcbiAgICAgICAgdGFnOiBcIkRhZWRhbHVzXCJcbiAgICB9LFxuICAgIFwiNDQ1XCI6IHtcbiAgICAgICAgbmFtZTogXCJhbl9yZWRfbTRhMXNcIixcbiAgICAgICAgdGFnOiBcIkhvdCBSb2RcIlxuICAgIH0sXG4gICAgXCI0NDZcIjoge1xuICAgICAgICBuYW1lOiBcImN1X21lZHVzYV9hd3BcIixcbiAgICAgICAgdGFnOiBcIk1lZHVzYVwiXG4gICAgfSxcbiAgICBcIjQ0N1wiOiB7XG4gICAgICAgIG5hbWU6IFwiZ3NfbW90aGVyX29mX3BlYXJsX2VsaXRlXCIsXG4gICAgICAgIHRhZzogXCJEdWVsaXN0XCJcbiAgICB9LFxuICAgIFwiNDQ4XCI6IHtcbiAgICAgICAgbmFtZTogXCJhYV9wYW5kb3JhXCIsXG4gICAgICAgIHRhZzogXCJQYW5kb3JhJ3MgQm94XCJcbiAgICB9LFxuICAgIFwiNDQ5XCI6IHtcbiAgICAgICAgbmFtZTogXCJjdV9wb3NlaWRvblwiLFxuICAgICAgICB0YWc6IFwiUG9zZWlkb25cIlxuICAgIH0sXG4gICAgXCI0NTBcIjoge1xuICAgICAgICBuYW1lOiBcImh5X3pvZGlhYzFcIixcbiAgICAgICAgdGFnOiBcIk1vb24gaW4gTGlicmFcIlxuICAgIH0sXG4gICAgXCI0NTFcIjoge1xuICAgICAgICBuYW1lOiBcImh5X3pvZGlhYzJcIixcbiAgICAgICAgdGFnOiBcIlN1biBpbiBMZW9cIlxuICAgIH0sXG4gICAgXCI0NTJcIjoge1xuICAgICAgICBuYW1lOiBcImh5X3pvZGlhYzNcIixcbiAgICAgICAgdGFnOiBcIlNoaXBwaW5nIEZvcmVjYXN0XCJcbiAgICB9LFxuICAgIFwiNDUzXCI6IHtcbiAgICAgICAgbmFtZTogXCJhbl9lbWVyYWxkXCIsXG4gICAgICAgIHRhZzogXCJFbWVyYWxkXCJcbiAgICB9LFxuICAgIFwiNDU0XCI6IHtcbiAgICAgICAgbmFtZTogXCJzb19raGFraV9ncmVlblwiLFxuICAgICAgICB0YWc6IFwiUGFyYSBHcmVlblwiXG4gICAgfSxcbiAgICBcIjQ1NVwiOiB7XG4gICAgICAgIG5hbWU6IFwiY3VfYW5pbWVfYXVnXCIsXG4gICAgICAgIHRhZzogXCJBa2loYWJhcmEgQWNjZXB0XCJcbiAgICB9LFxuICAgIFwiNDU2XCI6IHtcbiAgICAgICAgbmFtZTogXCJhbV9iYW1ib29fanVuZ2xlXCIsXG4gICAgICAgIHRhZzogXCJIeWRyb3BvbmljXCJcbiAgICB9LFxuICAgIFwiNDU3XCI6IHtcbiAgICAgICAgbmFtZTogXCJoeV9iYW1ib29fanVuZ2xlX2lua1wiLFxuICAgICAgICB0YWc6IFwiQmFtYm9vIFByaW50XCJcbiAgICB9LFxuICAgIFwiNDU4XCI6IHtcbiAgICAgICAgbmFtZTogXCJoeV9iYW1ib29fanVuZ2xlX2JsYWNrXCIsXG4gICAgICAgIHRhZzogXCJCYW1ib28gU2hhZG93XCJcbiAgICB9LFxuICAgIFwiNDU5XCI6IHtcbiAgICAgICAgbmFtZTogXCJoeV9iYW1ib29fanVuZ2xlXCIsXG4gICAgICAgIHRhZzogXCJCYW1ib28gRm9yZXN0XCJcbiAgICB9LFxuICAgIFwiNDYwXCI6IHtcbiAgICAgICAgbmFtZTogXCJhbV9nZW9tZXRyaWNfc3RlcHNcIixcbiAgICAgICAgdGFnOiBcIkFxdWEgVGVycmFjZVwiXG4gICAgfSxcbiAgICBcIjQ2MlwiOiB7XG4gICAgICAgIG5hbWU6IFwiaHlfZ2VvbWV0cmljX3N0ZXBzX2dyZWVuXCIsXG4gICAgICAgIHRhZzogXCJDb3VudGVyIFRlcnJhY2VcIlxuICAgIH0sXG4gICAgXCI0NjNcIjoge1xuICAgICAgICBuYW1lOiBcImh5X2dlb21ldHJpY19zdGVwc195ZWxsb3dcIixcbiAgICAgICAgdGFnOiBcIlRlcnJhY2VcIlxuICAgIH0sXG4gICAgXCI0NjRcIjoge1xuICAgICAgICBuYW1lOiBcImh5X2tpbW9ub19kaWFtb25kc1wiLFxuICAgICAgICB0YWc6IFwiTmVvbiBLaW1vbm9cIlxuICAgIH0sXG4gICAgXCI0NjVcIjoge1xuICAgICAgICBuYW1lOiBcImh5X2tpbW9ub19kaWFtb25kc19vcmFuZ2VcIixcbiAgICAgICAgdGFnOiBcIk9yYW5nZSBLaW1vbm9cIlxuICAgIH0sXG4gICAgXCI0NjZcIjoge1xuICAgICAgICBuYW1lOiBcImh5X2tpbW9ub19kaWFtb25kc19yZWRcIixcbiAgICAgICAgdGFnOiBcIkNyaW1zb24gS2ltb25vXCJcbiAgICB9LFxuICAgIFwiNDY3XCI6IHtcbiAgICAgICAgbmFtZTogXCJzcF9raW1vbm9fZGlhbW9uZHNcIixcbiAgICAgICAgdGFnOiBcIk1pbnQgS2ltb25vXCJcbiAgICB9LFxuICAgIFwiNDY4XCI6IHtcbiAgICAgICAgbmFtZTogXCJhbV9zZWFzdG9ybVwiLFxuICAgICAgICB0YWc6IFwiTWlkbmlnaHQgU3Rvcm1cIlxuICAgIH0sXG4gICAgXCI0NjlcIjoge1xuICAgICAgICBuYW1lOiBcImFtX3NlYXN0b3JtX2Jsb29kXCIsXG4gICAgICAgIHRhZzogXCJTdW5zZXQgU3Rvcm0g5aOxXCJcbiAgICB9LFxuICAgIFwiNDcwXCI6IHtcbiAgICAgICAgbmFtZTogXCJhbV9zZWFzdG9ybV9zaG9qb1wiLFxuICAgICAgICB0YWc6IFwiU3Vuc2V0IFN0b3JtIOW8kFwiXG4gICAgfSxcbiAgICBcIjQ3MVwiOiB7XG4gICAgICAgIG5hbWU6IFwiYW1fa2ltb25vX3N1bnJpc2VcIixcbiAgICAgICAgdGFnOiBcIkRheWJyZWFrXCJcbiAgICB9LFxuICAgIFwiNDcyXCI6IHtcbiAgICAgICAgbmFtZTogXCJzb19rZXljb2xvcnNcIixcbiAgICAgICAgdGFnOiBcIkltcGFjdCBEcmlsbFwiXG4gICAgfSxcbiAgICBcIjQ3M1wiOiB7XG4gICAgICAgIG5hbWU6IFwic29fYXF1YVwiLFxuICAgICAgICB0YWc6IFwiU2VhYmlyZFwiXG4gICAgfSxcbiAgICBcIjQ3NFwiOiB7XG4gICAgICAgIG5hbWU6IFwiY3VfYWs0N19jb3VyYWdlX2FsdFwiLFxuICAgICAgICB0YWc6IFwiQXF1YW1hcmluZSBSZXZlbmdlXCJcbiAgICB9LFxuICAgIFwiNDc1XCI6IHtcbiAgICAgICAgbmFtZTogXCJjdV9hd3BfaHlwZXJfYmVhc3RcIixcbiAgICAgICAgdGFnOiBcIkh5cGVyIEJlYXN0XCJcbiAgICB9LFxuICAgIFwiNDc2XCI6IHtcbiAgICAgICAgbmFtZTogXCJjdV9jejc1YV9jaGFzdGl6ZXJcIixcbiAgICAgICAgdGFnOiBcIlllbGxvdyBKYWNrZXRcIlxuICAgIH0sXG4gICAgXCI0NzdcIjoge1xuICAgICAgICBuYW1lOiBcImFtX2ZhbWFzX2RvdHNcIixcbiAgICAgICAgdGFnOiBcIk5ldXJhbCBOZXRcIlxuICAgIH0sXG4gICAgXCI0NzhcIjoge1xuICAgICAgICBuYW1lOiBcImN1X2dhbGlsYXJfcGFydGljbGVzXCIsXG4gICAgICAgIHRhZzogXCJSb2NrZXQgUG9wXCJcbiAgICB9LFxuICAgIFwiNDc5XCI6IHtcbiAgICAgICAgbmFtZTogXCJhcV9nbG9jazE4X2ZsYW1lc19ibHVlXCIsXG4gICAgICAgIHRhZzogXCJCdW5zZW4gQnVybmVyXCJcbiAgICB9LFxuICAgIFwiNDgwXCI6IHtcbiAgICAgICAgbmFtZTogXCJjdV9tNGE0X2V2aWxfZGFpbXlvXCIsXG4gICAgICAgIHRhZzogXCJFdmlsIERhaW15b1wiXG4gICAgfSxcbiAgICBcIjQ4MVwiOiB7XG4gICAgICAgIG5hbWU6IFwiY3VfbXA3X25lbXNpc1wiLFxuICAgICAgICB0YWc6IFwiTmVtZXNpc1wiXG4gICAgfSxcbiAgICBcIjQ4MlwiOiB7XG4gICAgICAgIG5hbWU6IFwiYW1fbXA5X25pdHJvZ2VuXCIsXG4gICAgICAgIHRhZzogXCJSdWJ5IFBvaXNvbiBEYXJ0XCJcbiAgICB9LFxuICAgIFwiNDgzXCI6IHtcbiAgICAgICAgbmFtZTogXCJjdV9uZWdldl9hbm5paGlsYXRvclwiLFxuICAgICAgICB0YWc6IFwiTG91ZG1vdXRoXCJcbiAgICB9LFxuICAgIFwiNDg0XCI6IHtcbiAgICAgICAgbmFtZTogXCJjdV9ub3ZhX3JhbmdlclwiLFxuICAgICAgICB0YWc6IFwiUmFuZ2VyXCJcbiAgICB9LFxuICAgIFwiNDg1XCI6IHtcbiAgICAgICAgbmFtZTogXCJhcV9wMjAwMF9ib29tXCIsXG4gICAgICAgIHRhZzogXCJIYW5kZ3VuXCJcbiAgICB9LFxuICAgIFwiNDg2XCI6IHtcbiAgICAgICAgbmFtZTogXCJjdV9wOTBfbWFzdGVyeVwiLFxuICAgICAgICB0YWc6IFwiRWxpdGUgQnVpbGRcIlxuICAgIH0sXG4gICAgXCI0ODdcIjoge1xuICAgICAgICBuYW1lOiBcImN1X3NnNTUzX2N5cmV4XCIsXG4gICAgICAgIHRhZzogXCJDeXJleFwiXG4gICAgfSxcbiAgICBcIjQ4OFwiOiB7XG4gICAgICAgIG5hbWU6IFwiY3VfdW1wNDVfdXByb2FyXCIsXG4gICAgICAgIHRhZzogXCJSaW90XCJcbiAgICB9LFxuICAgIFwiNDg5XCI6IHtcbiAgICAgICAgbmFtZTogXCJjdV91c3BfcHJvZ3Jlc3NpdlwiLFxuICAgICAgICB0YWc6IFwiVG9ycXVlXCJcbiAgICB9LFxuICAgIFwiNDkwXCI6IHtcbiAgICAgICAgbmFtZTogXCJjdV9hazQ3X3dpbnRlcl9zcG9ydFwiLFxuICAgICAgICB0YWc6IFwiRnJvbnRzaWRlIE1pc3R5XCJcbiAgICB9LFxuICAgIFwiNDkxXCI6IHtcbiAgICAgICAgbmFtZTogXCJjdV9kdWFsYmVycmV0dGFfZHJhZ29uc1wiLFxuICAgICAgICB0YWc6IFwiRHVhbGluZyBEcmFnb25zXCJcbiAgICB9LFxuICAgIFwiNDkyXCI6IHtcbiAgICAgICAgbmFtZTogXCJjdV9mYW1hc19sZW50YVwiLFxuICAgICAgICB0YWc6IFwiU3Vydml2b3IgWlwiXG4gICAgfSxcbiAgICBcIjQ5M1wiOiB7XG4gICAgICAgIG5hbWU6IFwiZ3NfZzNzZzFfZmx1eF9wdXJwbGVcIixcbiAgICAgICAgdGFnOiBcIkZsdXhcIlxuICAgIH0sXG4gICAgXCI0OTRcIjoge1xuICAgICAgICBuYW1lOiBcImdzX2dhbGlsX25pZ2h0d2luZ1wiLFxuICAgICAgICB0YWc6IFwiU3RvbmUgQ29sZFwiXG4gICAgfSxcbiAgICBcIjQ5NVwiOiB7XG4gICAgICAgIG5hbWU6IFwiZ3NfZ2xvY2sxOF93cmF0aHlzXCIsXG4gICAgICAgIHRhZzogXCJXcmFpdGhzXCJcbiAgICB9LFxuICAgIFwiNDk2XCI6IHtcbiAgICAgICAgbmFtZTogXCJnc19tMjQ5X25lYnVsYV9jcnVzYWRlclwiLFxuICAgICAgICB0YWc6IFwiTmVidWxhIENydXNhZGVyXCJcbiAgICB9LFxuICAgIFwiNDk3XCI6IHtcbiAgICAgICAgbmFtZTogXCJnc19tNGExc19zbmFrZWJpdGVfZ29sZFwiLFxuICAgICAgICB0YWc6IFwiR29sZGVuIENvaWxcIlxuICAgIH0sXG4gICAgXCI0OThcIjoge1xuICAgICAgICBuYW1lOiBcImN1X21hYzEwX2FsZWtoeWFfZHVvXCIsXG4gICAgICAgIHRhZzogXCJSYW5nZWVuXCJcbiAgICB9LFxuICAgIFwiNDk5XCI6IHtcbiAgICAgICAgbmFtZTogXCJjdV9tYWc3X215cmNlbmVcIixcbiAgICAgICAgdGFnOiBcIkNvYmFsdCBDb3JlXCJcbiAgICB9LFxuICAgIFwiNTAwXCI6IHtcbiAgICAgICAgbmFtZTogXCJjdV9tcDdfY2xhc3NpZmllZFwiLFxuICAgICAgICB0YWc6IFwiU3BlY2lhbCBEZWxpdmVyeVwiXG4gICAgfSxcbiAgICBcIjUwMVwiOiB7XG4gICAgICAgIG5hbWU6IFwiaHlfcDI1MF9jcmFja3Nob3RcIixcbiAgICAgICAgdGFnOiBcIldpbmdzaG90XCJcbiAgICB9LFxuICAgIFwiNTAyXCI6IHtcbiAgICAgICAgbmFtZTogXCJnc19zY2FyMjBfcGVhY2VtYWtlcjAzXCIsXG4gICAgICAgIHRhZzogXCJHcmVlbiBNYXJpbmVcIlxuICAgIH0sXG4gICAgXCI1MDNcIjoge1xuICAgICAgICBuYW1lOiBcImN1X3NzZzA4X3RlY2huaWNhbGl0eVwiLFxuICAgICAgICB0YWc6IFwiQmlnIElyb25cIlxuICAgIH0sXG4gICAgXCI1MDRcIjoge1xuICAgICAgICBuYW1lOiBcImN1X3VzcF9raWxsX2NvbmZpcm1lZFwiLFxuICAgICAgICB0YWc6IFwiS2lsbCBDb25maXJtZWRcIlxuICAgIH0sXG4gICAgXCI1MDVcIjoge1xuICAgICAgICBuYW1lOiBcImFxX3htMTAxNF9zY3VtYnJpYVwiLFxuICAgICAgICB0YWc6IFwiU2N1bWJyaWFcIlxuICAgIH0sXG4gICAgXCI1MDZcIjoge1xuICAgICAgICBuYW1lOiBcImN1X2FrNDdfcG9pbnRfZGlzYXJyYXlcIixcbiAgICAgICAgdGFnOiBcIlBvaW50IERpc2FycmF5XCJcbiAgICB9LFxuICAgIFwiNTA3XCI6IHtcbiAgICAgICAgbmFtZTogXCJhbV9hdWdfanVtYmxlXCIsXG4gICAgICAgIHRhZzogXCJSaWNvY2hldFwiXG4gICAgfSxcbiAgICBcIjUwOFwiOiB7XG4gICAgICAgIG5hbWU6IFwiY3VfYml6b25fbm94aW91c1wiLFxuICAgICAgICB0YWc6IFwiRnVlbCBSb2RcIlxuICAgIH0sXG4gICAgXCI1MDlcIjoge1xuICAgICAgICBuYW1lOiBcImFxX2RlYWdsZV9jb3JpbnRoaWFuXCIsXG4gICAgICAgIHRhZzogXCJDb3JpbnRoaWFuXCJcbiAgICB9LFxuICAgIFwiNTEwXCI6IHtcbiAgICAgICAgbmFtZTogXCJjdV9maXZlc2V2ZW5fcmV0cm9idXRpb25cIixcbiAgICAgICAgdGFnOiBcIlJldHJvYnV0aW9uXCJcbiAgICB9LFxuICAgIFwiNTExXCI6IHtcbiAgICAgICAgbmFtZTogXCJjdV9nM3NnMV9leGVjdXRpb25lclwiLFxuICAgICAgICB0YWc6IFwiVGhlIEV4ZWN1dGlvbmVyXCJcbiAgICB9LFxuICAgIFwiNTEyXCI6IHtcbiAgICAgICAgbmFtZTogXCJnc19tNGE0X3JveWFsX3NxdWlyZVwiLFxuICAgICAgICB0YWc6IFwiUm95YWwgUGFsYWRpblwiXG4gICAgfSxcbiAgICBcIjUxNFwiOiB7XG4gICAgICAgIG5hbWU6IFwiY3VfbmVnZXZfaW1wYWN0XCIsXG4gICAgICAgIHRhZzogXCJQb3dlciBMb2FkZXJcIlxuICAgIH0sXG4gICAgXCI1MTVcIjoge1xuICAgICAgICBuYW1lOiBcImFtX3AyMDAwX2ltcGVyaWFsX3JlZFwiLFxuICAgICAgICB0YWc6IFwiSW1wZXJpYWxcIlxuICAgIH0sXG4gICAgXCI1MTZcIjoge1xuICAgICAgICBuYW1lOiBcImN1X3A5MF9zaGFwZXdvb2RcIixcbiAgICAgICAgdGFnOiBcIlNoYXBld29vZFwiXG4gICAgfSxcbiAgICBcIjUxN1wiOiB7XG4gICAgICAgIG5hbWU6IFwiZ3Nfc2F3ZWRvZmZfbmVjcm9tYW5jZXJcIixcbiAgICAgICAgdGFnOiBcIllvcmlja1wiXG4gICAgfSxcbiAgICBcIjUxOFwiOiB7XG4gICAgICAgIG5hbWU6IFwiaHlfc2NhcjIwX2p1bmdsZXJcIixcbiAgICAgICAgdGFnOiBcIk91dGJyZWFrXCJcbiAgICB9LFxuICAgIFwiNTE5XCI6IHtcbiAgICAgICAgbmFtZTogXCJnc19zZzU1M190aWdlcl9tb3RoXCIsXG4gICAgICAgIHRhZzogXCJUaWdlciBNb3RoXCJcbiAgICB9LFxuICAgIFwiNTIwXCI6IHtcbiAgICAgICAgbmFtZTogXCJjdV90ZWM5X2F2YWxhbmNoZVwiLFxuICAgICAgICB0YWc6IFwiQXZhbGFuY2hlXCJcbiAgICB9LFxuICAgIFwiNTIxXCI6IHtcbiAgICAgICAgbmFtZTogXCJhcV94bTEwMTRfaG90X3JvZFwiLFxuICAgICAgICB0YWc6IFwiVGVjbHUgQnVybmVyXCJcbiAgICB9LFxuICAgIFwiNTIyXCI6IHtcbiAgICAgICAgbmFtZTogXCJhYV9mYWRlX3Jldm9sdmVyXCIsXG4gICAgICAgIHRhZzogXCJGYWRlXCJcbiAgICB9LFxuICAgIFwiNTIzXCI6IHtcbiAgICAgICAgbmFtZTogXCJhYV9mYWRlX21ldGFsbGljX3Jldm9sdmVyXCIsXG4gICAgICAgIHRhZzogXCJBbWJlciBGYWRlXCJcbiAgICB9LFxuICAgIFwiNTI0XCI6IHtcbiAgICAgICAgbmFtZTogXCJnc19hazQ3X3N1cGVyY2hhcmdlZFwiLFxuICAgICAgICB0YWc6IFwiRnVlbCBJbmplY3RvclwiXG4gICAgfSxcbiAgICBcIjUyNVwiOiB7XG4gICAgICAgIG5hbWU6IFwiY3VfYXdwX21hc3RlcnlcIixcbiAgICAgICAgdGFnOiBcIkVsaXRlIEJ1aWxkXCJcbiAgICB9LFxuICAgIFwiNTI2XCI6IHtcbiAgICAgICAgbmFtZTogXCJjdV9iaXpvbl9jaXRpemVuXCIsXG4gICAgICAgIHRhZzogXCJQaG90aWMgWm9uZVwiXG4gICAgfSxcbiAgICBcIjUyN1wiOiB7XG4gICAgICAgIG5hbWU6IFwiYXFfZGVzZXJ0ZWFnbGVfa3VtaWNob2RyYWdvblwiLFxuICAgICAgICB0YWc6IFwiS3VtaWNobyBEcmFnb25cIlxuICAgIH0sXG4gICAgXCI1MjhcIjoge1xuICAgICAgICBuYW1lOiBcImFxX2R1YWxiZXJldHRhc19jYXJ0ZWxcIixcbiAgICAgICAgdGFnOiBcIkNhcnRlbFwiXG4gICAgfSxcbiAgICBcIjUyOVwiOiB7XG4gICAgICAgIG5hbWU6IFwiYXFfZmFtYXNfY29udG91clwiLFxuICAgICAgICB0YWc6IFwiVmFsZW5jZVwiXG4gICAgfSxcbiAgICBcIjUzMFwiOiB7XG4gICAgICAgIG5hbWU6IFwiY3VfZml2ZXNldmVuX2F1Z21lbnRlZFwiLFxuICAgICAgICB0YWc6IFwiVHJpdW12aXJhdGVcIlxuICAgIH0sXG4gICAgXCI1MzJcIjoge1xuICAgICAgICBuYW1lOiBcImdzX2dsb2NrMThfYXdhcmRcIixcbiAgICAgICAgdGFnOiBcIlJveWFsIExlZ2lvblwiXG4gICAgfSxcbiAgICBcIjUzM1wiOiB7XG4gICAgICAgIG5hbWU6IFwiZ3NfbTRhNF9waW9uZWVyXCIsXG4gICAgICAgIHRhZzogXCJUaGUgQmF0dGxlc3RhclwiXG4gICAgfSxcbiAgICBcIjUzNFwiOiB7XG4gICAgICAgIG5hbWU6IFwiYW1fbWFjMTBfZWxlY3RyaWNpdHlcIixcbiAgICAgICAgdGFnOiBcIkxhcGlzIEdhdG9yXCJcbiAgICB9LFxuICAgIFwiNTM1XCI6IHtcbiAgICAgICAgbmFtZTogXCJnc19tYWc3X3ByYWV0b3JpYW5cIixcbiAgICAgICAgdGFnOiBcIlByYWV0b3JpYW5cIlxuICAgIH0sXG4gICAgXCI1MzZcIjoge1xuICAgICAgICBuYW1lOiBcInNwX21wN19pbXBpcmVcIixcbiAgICAgICAgdGFnOiBcIkltcGlyZVwiXG4gICAgfSxcbiAgICBcIjUzN1wiOiB7XG4gICAgICAgIG5hbWU6IFwiY3Vfbm92YV9oeXBlcmJlYXN0XCIsXG4gICAgICAgIHRhZzogXCJIeXBlciBCZWFzdFwiXG4gICAgfSxcbiAgICBcIjUzOFwiOiB7XG4gICAgICAgIG5hbWU6IFwiY3Vfc3NnMDhfbmVjcm9wb3NcIixcbiAgICAgICAgdGFnOiBcIk5lY3JvcG9zXCJcbiAgICB9LFxuICAgIFwiNTM5XCI6IHtcbiAgICAgICAgbmFtZTogXCJnc190ZWM5X2phbWJpeWFcIixcbiAgICAgICAgdGFnOiBcIkphbWJpeWFcIlxuICAgIH0sXG4gICAgXCI1NDBcIjoge1xuICAgICAgICBuYW1lOiBcImdzX3VzcF92b2x0YWdlXCIsXG4gICAgICAgIHRhZzogXCJMZWFkIENvbmR1aXRcIlxuICAgIH0sXG4gICAgXCI1NDFcIjoge1xuICAgICAgICBuYW1lOiBcImN1X2F1Z19zd2FsbG93c1wiLFxuICAgICAgICB0YWc6IFwiRmxlZXQgRmxvY2tcIlxuICAgIH0sXG4gICAgXCI1NDJcIjoge1xuICAgICAgICBuYW1lOiBcImN1X2Jpem9uX0N1cnNlXCIsXG4gICAgICAgIHRhZzogXCJKdWRnZW1lbnQgb2YgQW51YmlzXCJcbiAgICB9LFxuICAgIFwiNTQzXCI6IHtcbiAgICAgICAgbmFtZTogXCJnc19jejc1YV9yZWRhc3RvclwiLFxuICAgICAgICB0YWc6IFwiUmVkIEFzdG9yXCJcbiAgICB9LFxuICAgIFwiNTQ0XCI6IHtcbiAgICAgICAgbmFtZTogXCJnc19kdWFsYmVyZXR0YXNfdmVudGlsYXRvcnNcIixcbiAgICAgICAgdGFnOiBcIlZlbnRpbGF0b3JzXCJcbiAgICB9LFxuICAgIFwiNTQ1XCI6IHtcbiAgICAgICAgbmFtZTogXCJzcF9nM3NnMV9taWxpdGlhb3JhbmdlXCIsXG4gICAgICAgIHRhZzogXCJPcmFuZ2UgQ3Jhc2hcIlxuICAgIH0sXG4gICAgXCI1NDZcIjoge1xuICAgICAgICBuYW1lOiBcImdzX2dhbGlsYXJfaW5jZW5lcmF0b3JcIixcbiAgICAgICAgdGFnOiBcIkZpcmVmaWdodFwiXG4gICAgfSxcbiAgICBcIjU0N1wiOiB7XG4gICAgICAgIG5hbWU6IFwiY3VfbTI0OV9zcGVjdHJlXCIsXG4gICAgICAgIHRhZzogXCJTcGVjdHJlXCJcbiAgICB9LFxuICAgIFwiNTQ4XCI6IHtcbiAgICAgICAgbmFtZTogXCJjdV9tNGExc19zb3VsdGFrZXJcIixcbiAgICAgICAgdGFnOiBcIkNoYW50aWNvJ3MgRmlyZVwiXG4gICAgfSxcbiAgICBcIjU0OVwiOiB7XG4gICAgICAgIG5hbWU6IFwiYW1fbXA5X2Jpb2xlYWtcIixcbiAgICAgICAgdGFnOiBcIkJpb2xlYWtcIlxuICAgIH0sXG4gICAgXCI1NTBcIjoge1xuICAgICAgICBuYW1lOiBcImh5X3AyMDAwX29jZWFuaVwiLFxuICAgICAgICB0YWc6IFwiT2NlYW5pY1wiXG4gICAgfSxcbiAgICBcIjU1MVwiOiB7XG4gICAgICAgIG5hbWU6IFwiY3VfcDI1MF9hc2lpbW92XCIsXG4gICAgICAgIHRhZzogXCJBc2lpbW92XCJcbiAgICB9LFxuICAgIFwiNTUyXCI6IHtcbiAgICAgICAgbmFtZTogXCJnc19zYXdlZG9mZl9mdWJhclwiLFxuICAgICAgICB0YWc6IFwiRnViYXJcIlxuICAgIH0sXG4gICAgXCI1NTNcIjoge1xuICAgICAgICBuYW1lOiBcImN1X3NnNTUzX2F0bGFzXCIsXG4gICAgICAgIHRhZzogXCJBdGxhc1wiXG4gICAgfSxcbiAgICBcIjU1NFwiOiB7XG4gICAgICAgIG5hbWU6IFwiZ3Nfc3NnMDhfYXJtYWNvcmVcIixcbiAgICAgICAgdGFnOiBcIkdob3N0IENydXNhZGVyXCJcbiAgICB9LFxuICAgIFwiNTU1XCI6IHtcbiAgICAgICAgbmFtZTogXCJhbV90ZWM5X3JlZGJsYXN0XCIsXG4gICAgICAgIHRhZzogXCJSZS1FbnRyeVwiXG4gICAgfSxcbiAgICBcIjU1NlwiOiB7XG4gICAgICAgIG5hbWU6IFwiY3VfdW1wNDVfcHJpbWFsc2FiZXJcIixcbiAgICAgICAgdGFnOiBcIlByaW1hbCBTYWJlclwiXG4gICAgfSxcbiAgICBcIjU1N1wiOiB7XG4gICAgICAgIG5hbWU6IFwiY3VfeG0xMDE0X3NwZWN0cnVtXCIsXG4gICAgICAgIHRhZzogXCJCbGFjayBUaWVcIlxuICAgIH0sXG4gICAgXCI1NThcIjoge1xuICAgICAgICBuYW1lOiBcImN1X2JheW9uZXRfbG9yZVwiLFxuICAgICAgICB0YWc6IFwiTG9yZVwiXG4gICAgfSxcbiAgICBcIjU1OVwiOiB7XG4gICAgICAgIG5hbWU6IFwiY3VfZmxpcF9sb3JlXCIsXG4gICAgICAgIHRhZzogXCJMb3JlXCJcbiAgICB9LFxuICAgIFwiNTYwXCI6IHtcbiAgICAgICAgbmFtZTogXCJjdV9ndXRfbG9yZVwiLFxuICAgICAgICB0YWc6IFwiTG9yZVwiXG4gICAgfSxcbiAgICBcIjU2MVwiOiB7XG4gICAgICAgIG5hbWU6IFwiY3Vfa2FyYW1fbG9yZVwiLFxuICAgICAgICB0YWc6IFwiTG9yZVwiXG4gICAgfSxcbiAgICBcIjU2MlwiOiB7XG4gICAgICAgIG5hbWU6IFwiY3VfbTlfYmF5X2xvcmVcIixcbiAgICAgICAgdGFnOiBcIkxvcmVcIlxuICAgIH0sXG4gICAgXCI1NjNcIjoge1xuICAgICAgICBuYW1lOiBcImN1X2JheW9uZXRfc3RvbmV3YXNoXCIsXG4gICAgICAgIHRhZzogXCJCbGFjayBMYW1pbmF0ZVwiXG4gICAgfSxcbiAgICBcIjU2NFwiOiB7XG4gICAgICAgIG5hbWU6IFwiY3VfZmxpcF9zdG9uZXdhc2hcIixcbiAgICAgICAgdGFnOiBcIkJsYWNrIExhbWluYXRlXCJcbiAgICB9LFxuICAgIFwiNTY1XCI6IHtcbiAgICAgICAgbmFtZTogXCJjdV9ndXRfc3RvbmV3YXNoXCIsXG4gICAgICAgIHRhZzogXCJCbGFjayBMYW1pbmF0ZVwiXG4gICAgfSxcbiAgICBcIjU2NlwiOiB7XG4gICAgICAgIG5hbWU6IFwiY3Vfa2FyYW1fc3RvbmV3YXNoXCIsXG4gICAgICAgIHRhZzogXCJCbGFjayBMYW1pbmF0ZVwiXG4gICAgfSxcbiAgICBcIjU2N1wiOiB7XG4gICAgICAgIG5hbWU6IFwiY3VfbTlfYmF5X3N0b25ld2FzaFwiLFxuICAgICAgICB0YWc6IFwiQmxhY2sgTGFtaW5hdGVcIlxuICAgIH0sXG4gICAgXCI1NjhcIjoge1xuICAgICAgICBuYW1lOiBcImFtX2VtZXJhbGRfbWFyYmxlaXplZFwiLFxuICAgICAgICB0YWc6IFwiR2FtbWEgRG9wcGxlclwiXG4gICAgfSxcbiAgICBcIjU2OVwiOiB7XG4gICAgICAgIG5hbWU6IFwiYW1fZ2FtbWFfZG9wcGxlcl9waGFzZTFcIixcbiAgICAgICAgdGFnOiBcIkdhbW1hIERvcHBsZXJcIlxuICAgIH0sXG4gICAgXCI1NzBcIjoge1xuICAgICAgICBuYW1lOiBcImFtX2dhbW1hX2RvcHBsZXJfcGhhc2UyXCIsXG4gICAgICAgIHRhZzogXCJHYW1tYSBEb3BwbGVyXCJcbiAgICB9LFxuICAgIFwiNTcxXCI6IHtcbiAgICAgICAgbmFtZTogXCJhbV9nYW1tYV9kb3BwbGVyX3BoYXNlM1wiLFxuICAgICAgICB0YWc6IFwiR2FtbWEgRG9wcGxlclwiXG4gICAgfSxcbiAgICBcIjU3MlwiOiB7XG4gICAgICAgIG5hbWU6IFwiYW1fZ2FtbWFfZG9wcGxlcl9waGFzZTRcIixcbiAgICAgICAgdGFnOiBcIkdhbW1hIERvcHBsZXJcIlxuICAgIH0sXG4gICAgXCI1NzNcIjoge1xuICAgICAgICBuYW1lOiBcImdzX2JheW9uZXRfYXV0b3Ryb25pY1wiLFxuICAgICAgICB0YWc6IFwiQXV0b3Ryb25pY1wiXG4gICAgfSxcbiAgICBcIjU3NFwiOiB7XG4gICAgICAgIG5hbWU6IFwiZ3NfZmxpcF9hdXRvdHJvbmljXCIsXG4gICAgICAgIHRhZzogXCJBdXRvdHJvbmljXCJcbiAgICB9LFxuICAgIFwiNTc1XCI6IHtcbiAgICAgICAgbmFtZTogXCJnc19ndXRfYXV0b3Ryb25pY1wiLFxuICAgICAgICB0YWc6IFwiQXV0b3Ryb25pY1wiXG4gICAgfSxcbiAgICBcIjU3NlwiOiB7XG4gICAgICAgIG5hbWU6IFwiZ3Nfa2FyYW1fYXV0b3Ryb25pY1wiLFxuICAgICAgICB0YWc6IFwiQXV0b3Ryb25pY1wiXG4gICAgfSxcbiAgICBcIjU3N1wiOiB7XG4gICAgICAgIG5hbWU6IFwiZ3NfbTlfYmF5X2F1dG90cm9uaWNcIixcbiAgICAgICAgdGFnOiBcIkF1dG90cm9uaWNcIlxuICAgIH0sXG4gICAgXCI1NzhcIjoge1xuICAgICAgICBuYW1lOiBcImh5X29jZWFuX2tuaWZlXCIsXG4gICAgICAgIHRhZzogXCJCcmlnaHQgV2F0ZXJcIlxuICAgIH0sXG4gICAgXCI1NzlcIjoge1xuICAgICAgICBuYW1lOiBcImh5X29jZWFuX2tuaWZlXzkwXCIsXG4gICAgICAgIHRhZzogXCJCcmlnaHQgV2F0ZXJcIlxuICAgIH0sXG4gICAgXCI1ODBcIjoge1xuICAgICAgICBuYW1lOiBcImFtX21hcmtlZF91cFwiLFxuICAgICAgICB0YWc6IFwiRnJlZWhhbmRcIlxuICAgIH0sXG4gICAgXCI1ODFcIjoge1xuICAgICAgICBuYW1lOiBcImFtX21hcmtlZF91cF85MFwiLFxuICAgICAgICB0YWc6IFwiRnJlZWhhbmRcIlxuICAgIH0sXG4gICAgXCI1ODJcIjoge1xuICAgICAgICBuYW1lOiBcImFtX21hcmtlZF91cF9maW5lXCIsXG4gICAgICAgIHRhZzogXCJGcmVlaGFuZFwiXG4gICAgfSxcbiAgICBcIjU4M1wiOiB7XG4gICAgICAgIG5hbWU6IFwiZ3NfYXVnX2FyaXN0b2NyYXRcIixcbiAgICAgICAgdGFnOiBcIkFyaXN0b2NyYXRcIlxuICAgIH0sXG4gICAgXCI1ODRcIjoge1xuICAgICAgICBuYW1lOiBcImdzX2F3cF9waG9ib3NcIixcbiAgICAgICAgdGFnOiBcIlBob2Jvc1wiXG4gICAgfSxcbiAgICBcIjU4NVwiOiB7XG4gICAgICAgIG5hbWU6IFwiY3VfZml2ZV9zZXZlbl9kYWlteW9cIixcbiAgICAgICAgdGFnOiBcIlZpb2xlbnQgRGFpbXlvXCJcbiAgICB9LFxuICAgIFwiNTg2XCI6IHtcbiAgICAgICAgbmFtZTogXCJjdV9nbG9ja193YXN0ZWxhbmRfcmViZWxcIixcbiAgICAgICAgdGFnOiBcIldhc3RlbGFuZCBSZWJlbFwiXG4gICAgfSxcbiAgICBcIjU4N1wiOiB7XG4gICAgICAgIG5hbWU6IFwiZ3NfbTRhMV9tZWNoYV9pbmR1c3RyaWVzXCIsXG4gICAgICAgIHRhZzogXCJNZWNoYSBJbmR1c3RyaWVzXCJcbiAgICB9LFxuICAgIFwiNTg4XCI6IHtcbiAgICAgICAgbmFtZTogXCJjdV9tNGE0X2Rlc29sYXRlX3NwYWNlXCIsXG4gICAgICAgIHRhZzogXCJEZXNvbGF0ZSBTcGFjZVwiXG4gICAgfSxcbiAgICBcIjU4OVwiOiB7XG4gICAgICAgIG5hbWU6IFwiYXFfbWFjXzEwX2FsaWVuX2NhbW9cIixcbiAgICAgICAgdGFnOiBcIkNhcm5pdm9yZVwiXG4gICAgfSxcbiAgICBcIjU5MFwiOiB7XG4gICAgICAgIG5hbWU6IFwiYXFfbm92YV9zY2lfZmlcIixcbiAgICAgICAgdGFnOiBcIkV4b1wiXG4gICAgfSxcbiAgICBcIjU5MVwiOiB7XG4gICAgICAgIG5hbWU6IFwiZ3NfcDIwMDBfaW1wZXJpYWxfZHJhZ29uXCIsXG4gICAgICAgIHRhZzogXCJJbXBlcmlhbCBEcmFnb25cIlxuICAgIH0sXG4gICAgXCI1OTJcIjoge1xuICAgICAgICBuYW1lOiBcImdzX3AyNTBfbWV0YWxfcGFuZWxzXCIsXG4gICAgICAgIHRhZzogXCJJcm9uIENsYWRcIlxuICAgIH0sXG4gICAgXCI1OTNcIjoge1xuICAgICAgICBuYW1lOiBcImdzX3A5MF9mdWxsX3Rocm90dGxlXCIsXG4gICAgICAgIHRhZzogXCJDaG9wcGVyXCJcbiAgICB9LFxuICAgIFwiNTk0XCI6IHtcbiAgICAgICAgbmFtZTogXCJnc19wcF9iaXpvbl9oYXJ2ZXN0ZXJcIixcbiAgICAgICAgdGFnOiBcIkhhcnZlc3RlclwiXG4gICAgfSxcbiAgICBcIjU5NVwiOiB7XG4gICAgICAgIG5hbWU6IFwiY3VfcjhfY3liZXJzcG9ydFwiLFxuICAgICAgICB0YWc6IFwiUmVib290XCJcbiAgICB9LFxuICAgIFwiNTk2XCI6IHtcbiAgICAgICAgbmFtZTogXCJjdV9zYXdlZF9vZmZfbGltZVwiLFxuICAgICAgICB0YWc6IFwiTGltZWxpZ2h0XCJcbiAgICB9LFxuICAgIFwiNTk3XCI6IHtcbiAgICAgICAgbmFtZTogXCJnc19zY2FyMjBfYmxvb2RzcG9ydFwiLFxuICAgICAgICB0YWc6IFwiQmxvb2RzcG9ydFwiXG4gICAgfSxcbiAgICBcIjU5OFwiOiB7XG4gICAgICAgIG5hbWU6IFwiY3Vfc2c1NTNfYWVyaWFsXCIsXG4gICAgICAgIHRhZzogXCJBZXJpYWxcIlxuICAgIH0sXG4gICAgXCI1OTlcIjoge1xuICAgICAgICBuYW1lOiBcImFtX3RlY185X3NlYV9zYWx0XCIsXG4gICAgICAgIHRhZzogXCJJY2UgQ2FwXCJcbiAgICB9LFxuICAgIFwiNjAwXCI6IHtcbiAgICAgICAgbmFtZTogXCJjdV9hazQ3X2FuYXJjaHlcIixcbiAgICAgICAgdGFnOiBcIk5lb24gUmV2b2x1dGlvblwiXG4gICAgfSxcbiAgICBcIjYwMVwiOiB7XG4gICAgICAgIG5hbWU6IFwiZ3NfYXVnX3N5ZF9tZWFkXCIsXG4gICAgICAgIHRhZzogXCJTeWQgTWVhZFwiXG4gICAgfSxcbiAgICBcIjYwMlwiOiB7XG4gICAgICAgIG5hbWU6IFwiZ3NfY3o3NV90cmVhZFwiLFxuICAgICAgICB0YWc6IFwiSW1wcmludFwiXG4gICAgfSxcbiAgICBcIjYwM1wiOiB7XG4gICAgICAgIG5hbWU6IFwiYXFfZGVzZXJ0X2VhZ2xlX2NvbnN0YWJsZVwiLFxuICAgICAgICB0YWc6IFwiRGlyZWN0aXZlXCJcbiAgICB9LFxuICAgIFwiNjA0XCI6IHtcbiAgICAgICAgbmFtZTogXCJnc19mYW1hc19yYWxseVwiLFxuICAgICAgICB0YWc6IFwiUm9sbCBDYWdlXCJcbiAgICB9LFxuICAgIFwiNjA1XCI6IHtcbiAgICAgICAgbmFtZTogXCJhcV9maXZlX3NldmVuX3NjdW1icmlhXCIsXG4gICAgICAgIHRhZzogXCJTY3VtYnJpYVwiXG4gICAgfSxcbiAgICBcIjYwNlwiOiB7XG4gICAgICAgIG5hbWU6IFwiZ3NfZzNzZzFfdmVudGlsYXRvclwiLFxuICAgICAgICB0YWc6IFwiVmVudGlsYXRvclwiXG4gICAgfSxcbiAgICBcIjYwN1wiOiB7XG4gICAgICAgIG5hbWU6IFwiY3VfZ2xvY2sxOF93ZWFzZWxcIixcbiAgICAgICAgdGFnOiBcIldlYXNlbFwiXG4gICAgfSxcbiAgICBcIjYwOFwiOiB7XG4gICAgICAgIG5hbWU6IFwiY3VfbWFnN190cmliYWxcIixcbiAgICAgICAgdGFnOiBcIlBldHJvZ2x5cGhcIlxuICAgIH0sXG4gICAgXCI2MDlcIjoge1xuICAgICAgICBuYW1lOiBcImN1X21wOV9uYXJjaXNcIixcbiAgICAgICAgdGFnOiBcIkFpcmxvY2tcIlxuICAgIH0sXG4gICAgXCI2MTBcIjoge1xuICAgICAgICBuYW1lOiBcImh5X25lZ2V2X2RhenpsZVwiLFxuICAgICAgICB0YWc6IFwiRGF6emxlXCJcbiAgICB9LFxuICAgIFwiNjExXCI6IHtcbiAgICAgICAgbmFtZTogXCJjdV9wOTBfZ3JpbW1cIixcbiAgICAgICAgdGFnOiBcIkdyaW1cIlxuICAgIH0sXG4gICAgXCI2MTJcIjoge1xuICAgICAgICBuYW1lOiBcImdzX3NjYXIyMF9wb3dlcmNvcmVcIixcbiAgICAgICAgdGFnOiBcIlBvd2VyY29yZVwiXG4gICAgfSxcbiAgICBcIjYxM1wiOiB7XG4gICAgICAgIG5hbWU6IFwiY3Vfc2c1NTZfdHJpYXJjaFwiLFxuICAgICAgICB0YWc6IFwiVHJpYXJjaFwiXG4gICAgfSxcbiAgICBcIjYxNFwiOiB7XG4gICAgICAgIG5hbWU6IFwiZ3NfdGVjOV9zdXBlcmNoYXJnZWRcIixcbiAgICAgICAgdGFnOiBcIkZ1ZWwgSW5qZWN0b3JcIlxuICAgIH0sXG4gICAgXCI2MTVcIjoge1xuICAgICAgICBuYW1lOiBcImN1X3VtcDQ1X21ldHJpdGVyYVwiLFxuICAgICAgICB0YWc6IFwiQnJpZWZpbmdcIlxuICAgIH0sXG4gICAgXCI2MTZcIjoge1xuICAgICAgICBuYW1lOiBcImh5X3htMTAxNF9mcmFjdGFsX2JsdWVcIixcbiAgICAgICAgdGFnOiBcIlNsaXBzdHJlYW1cIlxuICAgIH0sXG4gICAgXCI2MTdcIjoge1xuICAgICAgICBuYW1lOiBcImFtX2JsYWNrcGVhcmxfbWFyYmxlaXplZF9iXCIsXG4gICAgICAgIHRhZzogXCJEb3BwbGVyXCJcbiAgICB9LFxuICAgIFwiNjE4XCI6IHtcbiAgICAgICAgbmFtZTogXCJhbV9kb3BwbGVyX3BoYXNlMl9iXCIsXG4gICAgICAgIHRhZzogXCJEb3BwbGVyXCJcbiAgICB9LFxuICAgIFwiNjE5XCI6IHtcbiAgICAgICAgbmFtZTogXCJhbV9zYXBwaGlyZV9tYXJibGVpemVkX2JcIixcbiAgICAgICAgdGFnOiBcIkRvcHBsZXJcIlxuICAgIH0sXG4gICAgXCI2MjBcIjoge1xuICAgICAgICBuYW1lOiBcImN1X3B1cnBsZV9odW50c21hblwiLFxuICAgICAgICB0YWc6IFwiVWx0cmF2aW9sZXRcIlxuICAgIH0sXG4gICAgXCI2MjFcIjoge1xuICAgICAgICBuYW1lOiBcInNvX3B1cnBsZV9mYWxjaGlvblwiLFxuICAgICAgICB0YWc6IFwiVWx0cmF2aW9sZXRcIlxuICAgIH0sXG4gICAgXCI2MjJcIjoge1xuICAgICAgICBuYW1lOiBcImFtX2N6djJfbWZcIixcbiAgICAgICAgdGFnOiBcIlBvbHltZXJcIlxuICAgIH0sXG4gICAgXCI2MjNcIjoge1xuICAgICAgICBuYW1lOiBcImFxX2dsb2NrX2RhcmstZmFsbFwiLFxuICAgICAgICB0YWc6IFwiSXJvbndvcmtcIlxuICAgIH0sXG4gICAgXCI2MjRcIjoge1xuICAgICAgICBuYW1lOiBcImN1X3NzZzA4X2RyYWdvbmZpcmVfc2NvcGVcIixcbiAgICAgICAgdGFnOiBcIkRyYWdvbmZpcmVcIlxuICAgIH0sXG4gICAgXCI2MjVcIjoge1xuICAgICAgICBuYW1lOiBcImdzX2R1YWxfYmVyZXR0YXNfZ29sZGVuX3ZlbmljZVwiLFxuICAgICAgICB0YWc6IFwiUm95YWwgQ29uc29ydHNcIlxuICAgIH0sXG4gICAgXCI2MjZcIjoge1xuICAgICAgICBuYW1lOiBcImdzX2ZhbWFzX21lY2hhXCIsXG4gICAgICAgIHRhZzogXCJNZWNoYSBJbmR1c3RyaWVzXCJcbiAgICB9LFxuICAgIFwiNjI3XCI6IHtcbiAgICAgICAgbmFtZTogXCJnc19maW5hbF9wb29sZGVhZHYyXCIsXG4gICAgICAgIHRhZzogXCJDaXJydXNcIlxuICAgIH0sXG4gICAgXCI2MjhcIjoge1xuICAgICAgICBuYW1lOiBcImdzX2czc2cxX3ZpcGVyX3llbGxvd1wiLFxuICAgICAgICB0YWc6IFwiU3RpbmdlclwiXG4gICAgfSxcbiAgICBcIjYyOVwiOiB7XG4gICAgICAgIG5hbWU6IFwiY3VfZ2FsaWxfYXItY2Ftb1wiLFxuICAgICAgICB0YWc6IFwiQmxhY2sgU2FuZFwiXG4gICAgfSxcbiAgICBcIjYzMFwiOiB7XG4gICAgICAgIG5hbWU6IFwiYWFfaGlkZS1tcDlcIixcbiAgICAgICAgdGFnOiBcIlNhbmQgU2NhbGVcIlxuICAgIH0sXG4gICAgXCI2MzFcIjoge1xuICAgICAgICBuYW1lOiBcImN1X200YTFfZmxhc2hiYWNrXCIsXG4gICAgICAgIHRhZzogXCJGbGFzaGJhY2tcIlxuICAgIH0sXG4gICAgXCI2MzJcIjoge1xuICAgICAgICBuYW1lOiBcImdzX200YTRfc2VjdG9yXCIsXG4gICAgICAgIHRhZzogXCJCdXp6IEtpbGxcIlxuICAgIH0sXG4gICAgXCI2MzNcIjoge1xuICAgICAgICBuYW1lOiBcImFtX21hZzdfbWFsZm9ybVwiLFxuICAgICAgICB0YWc6IFwiU29uYXJcIlxuICAgIH0sXG4gICAgXCI2MzRcIjoge1xuICAgICAgICBuYW1lOiBcImFtX25vdmFfc2FuZFwiLFxuICAgICAgICB0YWc6IFwiR2lsYVwiXG4gICAgfSxcbiAgICBcIjYzNVwiOiB7XG4gICAgICAgIG5hbWU6IFwiZ3NfcDIwMDAtc3BvcnRcIixcbiAgICAgICAgdGFnOiBcIlR1cmZcIlxuICAgIH0sXG4gICAgXCI2MzZcIjoge1xuICAgICAgICBuYW1lOiBcImdzX3A5MF9zaGFsbG93X2dyYXZlXCIsXG4gICAgICAgIHRhZzogXCJTaGFsbG93IEdyYXZlXCJcbiAgICB9LFxuICAgIFwiNjM3XCI6IHtcbiAgICAgICAgbmFtZTogXCJjdV91c3BfY3lyZXhcIixcbiAgICAgICAgdGFnOiBcIkN5cmV4XCJcbiAgICB9LFxuICAgIFwiNjM4XCI6IHtcbiAgICAgICAgbmFtZTogXCJjdV93cF9zYXdlZG9mZlwiLFxuICAgICAgICB0YWc6IFwiV2FzdGVsYW5kIFByaW5jZXNzXCJcbiAgICB9LFxuICAgIFwiNjM5XCI6IHtcbiAgICAgICAgbmFtZTogXCJnc19hazQ3X2Jsb29kc3BvcnRcIixcbiAgICAgICAgdGFnOiBcIkJsb29kc3BvcnRcIlxuICAgIH0sXG4gICAgXCI2NDBcIjoge1xuICAgICAgICBuYW1lOiBcImN1X2F3cF9wc3ljaG9wYXRoXCIsXG4gICAgICAgIHRhZzogXCJGZXZlciBEcmVhbVwiXG4gICAgfSxcbiAgICBcIjY0MVwiOiB7XG4gICAgICAgIG5hbWU6IFwiaHlfYml6b25fdG9ybl9ncmVlblwiLFxuICAgICAgICB0YWc6IFwiSnVuZ2xlIFNsaXBzdHJlYW1cIlxuICAgIH0sXG4gICAgXCI2NDJcIjoge1xuICAgICAgICBuYW1lOiBcImN1X2JsdWVwcmludF9zY2FyXCIsXG4gICAgICAgIHRhZzogXCJCbHVlcHJpbnRcIlxuICAgIH0sXG4gICAgXCI2NDNcIjoge1xuICAgICAgICBuYW1lOiBcImdzX2N6X3NuYWtlc19wdXJwbGVcIixcbiAgICAgICAgdGFnOiBcIlhpYW5nbGl1XCJcbiAgICB9LFxuICAgIFwiNjQ0XCI6IHtcbiAgICAgICAgbmFtZTogXCJnc19tNGExX2RlY2ltYXRvclwiLFxuICAgICAgICB0YWc6IFwiRGVjaW1hdG9yXCJcbiAgICB9LFxuICAgIFwiNjQ1XCI6IHtcbiAgICAgICAgbmFtZTogXCJjdV9kZXNlcnRfZWFnbGVfY29ycm9kZW5cIixcbiAgICAgICAgdGFnOiBcIk94aWRlIEJsYXplXCJcbiAgICB9LFxuICAgIFwiNjQ2XCI6IHtcbiAgICAgICAgbmFtZTogXCJjdV9maXZlc2V2ZW5fdmVpblwiLFxuICAgICAgICB0YWc6IFwiQ2FwaWxsYXJ5XCJcbiAgICB9LFxuICAgIFwiNjQ3XCI6IHtcbiAgICAgICAgbmFtZTogXCJzcF9nYWxpbF93YXZlXCIsXG4gICAgICAgIHRhZzogXCJDcmltc29uIFRzdW5hbWlcIlxuICAgIH0sXG4gICAgXCI2NDhcIjoge1xuICAgICAgICBuYW1lOiBcInNwX20yNDlfZnJvZ19vcmlnaW5hbFwiLFxuICAgICAgICB0YWc6IFwiRW1lcmFsZCBQb2lzb24gRGFydFwiXG4gICAgfSxcbiAgICBcIjY0OVwiOiB7XG4gICAgICAgIG5hbWU6IFwic3BfbXA3X3RyaWJhbF95ZWxsb3dcIixcbiAgICAgICAgdGFnOiBcIkFrb2JlblwiXG4gICAgfSxcbiAgICBcIjY1MFwiOiB7XG4gICAgICAgIG5hbWU6IFwiYW1fcDI1MF9zcHV0bmlrXCIsXG4gICAgICAgIHRhZzogXCJSaXBwbGVcIlxuICAgIH0sXG4gICAgXCI2NTFcIjoge1xuICAgICAgICBuYW1lOiBcImFhX21hYzEwX3RoZV9sYXN0X2RpdmVcIixcbiAgICAgICAgdGFnOiBcIkxhc3QgRGl2ZVwiXG4gICAgfSxcbiAgICBcIjY1MlwiOiB7XG4gICAgICAgIG5hbWU6IFwiZ3NfdW1wX2FieXNzXCIsXG4gICAgICAgIHRhZzogXCJTY2FmZm9sZFwiXG4gICAgfSxcbiAgICBcIjY1M1wiOiB7XG4gICAgICAgIG5hbWU6IFwiY3VfdXNwc19ub2lyXCIsXG4gICAgICAgIHRhZzogXCJOZW8tTm9pclwiXG4gICAgfSxcbiAgICBcIjY1NFwiOiB7XG4gICAgICAgIG5hbWU6IFwiYXFfeG1fbGVhZl9mYWRlXCIsXG4gICAgICAgIHRhZzogXCJTZWFzb25zXCJcbiAgICB9LFxuICAgIFwiNjU1XCI6IHtcbiAgICAgICAgbmFtZTogXCJhcV9zYXdlZG9mZl96YW5kZXIyXCIsXG4gICAgICAgIHRhZzogXCJaYW5kZXJcIlxuICAgIH0sXG4gICAgXCI2NTZcIjoge1xuICAgICAgICBuYW1lOiBcImdzX2FrX2NvbG9ueTAxX3JlZFwiLFxuICAgICAgICB0YWc6IFwiT3JiaXQgTWswMVwiXG4gICAgfSxcbiAgICBcIjY1N1wiOiB7XG4gICAgICAgIG5hbWU6IFwiY3VfdXNwc19ibHVlcHJpbnRcIixcbiAgICAgICAgdGFnOiBcIkJsdWVwcmludFwiXG4gICAgfSxcbiAgICBcIjY1OFwiOiB7XG4gICAgICAgIG5hbWU6IFwiZ3NfZHVhbGJlcmV0dGFzX2NvYnJhXCIsXG4gICAgICAgIHRhZzogXCJDb2JyYSBTdHJpa2VcIlxuICAgIH0sXG4gICAgXCI2NTlcIjoge1xuICAgICAgICBuYW1lOiBcInNwX2ZhbWFzX21hY2FicmVcIixcbiAgICAgICAgdGFnOiBcIk1hY2FicmVcIlxuICAgIH0sXG4gICAgXCI2NjBcIjoge1xuICAgICAgICBuYW1lOiBcImN1X2ZpdmVzZXZlbl9oeXBlcmJlYXN0XCIsXG4gICAgICAgIHRhZzogXCJIeXBlciBCZWFzdFwiXG4gICAgfSxcbiAgICBcIjY2MVwiOiB7XG4gICAgICAgIG5hbWU6IFwiY3VfZ2FsaWxfY2FuZHljaGFvc1wiLFxuICAgICAgICB0YWc6IFwiU3VnYXIgUnVzaFwiXG4gICAgfSxcbiAgICBcIjY2MlwiOiB7XG4gICAgICAgIG5hbWU6IFwiY3VfYXdwX2hhbm55YVwiLFxuICAgICAgICB0YWc6IFwiT25pIFRhaWppXCJcbiAgICB9LFxuICAgIFwiNjYzXCI6IHtcbiAgICAgICAgbmFtZTogXCJjdV9tNGExc19tZXRyaXRlcmFcIixcbiAgICAgICAgdGFnOiBcIkJyaWVmaW5nXCJcbiAgICB9LFxuICAgIFwiNjY0XCI6IHtcbiAgICAgICAgbmFtZTogXCJjdV9tNGE0X2hlbGxmaXJlXCIsXG4gICAgICAgIHRhZzogXCJIZWxsZmlyZVwiXG4gICAgfSxcbiAgICBcIjY2NVwiOiB7XG4gICAgICAgIG5hbWU6IFwiYW1fbWFjMTBfYWxvaGFcIixcbiAgICAgICAgdGFnOiBcIkFsb2hhXCJcbiAgICB9LFxuICAgIFwiNjY2XCI6IHtcbiAgICAgICAgbmFtZTogXCJhbV9tYWc3X2NhdXN0aWNcIixcbiAgICAgICAgdGFnOiBcIkhhcmQgV2F0ZXJcIlxuICAgIH0sXG4gICAgXCI2NjdcIjoge1xuICAgICAgICBuYW1lOiBcImN1X3AyMDAwX2h1bnRlclwiLFxuICAgICAgICB0YWc6IFwiV29vZHNtYW5cIlxuICAgIH0sXG4gICAgXCI2NjhcIjoge1xuICAgICAgICBuYW1lOiBcImN1X3AyNTBfYXhpb21cIixcbiAgICAgICAgdGFnOiBcIlJlZCBSb2NrXCJcbiAgICB9LFxuICAgIFwiNjY5XCI6IHtcbiAgICAgICAgbmFtZTogXCJoeV9wOTBfYmFyZWJvbmVzX2JsdWVcIixcbiAgICAgICAgdGFnOiBcIkRlYXRoIEdyaXBcIlxuICAgIH0sXG4gICAgXCI2NzBcIjoge1xuICAgICAgICBuYW1lOiBcImN1X3NzZzA4X2RlYXRoc2hlYWRcIixcbiAgICAgICAgdGFnOiBcIkRlYXRoJ3MgSGVhZFwiXG4gICAgfSxcbiAgICBcIjY3MVwiOiB7XG4gICAgICAgIG5hbWU6IFwiYXFfdGVjOV9jaGFsa19wYXR0ZXJuXCIsXG4gICAgICAgIHRhZzogXCJDdXQgT3V0XCJcbiAgICB9LFxuICAgIFwiNjcyXCI6IHtcbiAgICAgICAgbmFtZTogXCJhcV91bXA0NV9mbGFtZWZsb3dlclwiLFxuICAgICAgICB0YWc6IFwiTWV0YWwgRmxvd2Vyc1wiXG4gICAgfSxcbiAgICBcIjY3M1wiOiB7XG4gICAgICAgIG5hbWU6IFwiYXFfc2F3ZWQtb2ZmX2Zsb3dlclwiLFxuICAgICAgICB0YWc6IFwiTW9ycmlzXCJcbiAgICB9LFxuICAgIFwiNjc0XCI6IHtcbiAgICAgICAgbmFtZTogXCJjdV9hdWdfb3JhbmdlX3RyaWFuZ2xlXCIsXG4gICAgICAgIHRhZzogXCJUcmlxdWFcIlxuICAgIH0sXG4gICAgXCI2NzVcIjoge1xuICAgICAgICBuYW1lOiBcImdzX2FrNDdfZW1wcmVzc1wiLFxuICAgICAgICB0YWc6IFwiVGhlIEVtcHJlc3NcIlxuICAgIH0sXG4gICAgXCI2NzZcIjoge1xuICAgICAgICBuYW1lOiBcImN1X2Jpem9uX2FsbF9pblwiLFxuICAgICAgICB0YWc6IFwiSGlnaCBSb2xsZXJcIlxuICAgIH0sXG4gICAgXCI2NzdcIjoge1xuICAgICAgICBuYW1lOiBcImdzX2czc2cxX2NldG1lX3JlZHV4XCIsXG4gICAgICAgIHRhZzogXCJIdW50ZXJcIlxuICAgIH0sXG4gICAgXCI2NzhcIjoge1xuICAgICAgICBuYW1lOiBcImN1X3AyNTBfY3liZXJjcm9jXCIsXG4gICAgICAgIHRhZzogXCJTZWUgWWEgTGF0ZXJcIlxuICAgIH0sXG4gICAgXCI2NzlcIjoge1xuICAgICAgICBuYW1lOiBcImN1X21wOV9nb29cIixcbiAgICAgICAgdGFnOiBcIkdvb1wiXG4gICAgfSxcbiAgICBcIjY4MFwiOiB7XG4gICAgICAgIG5hbWU6IFwiY3VfZ2xvY2tfaW5kaWdvXCIsXG4gICAgICAgIHRhZzogXCJPZmYgV29ybGRcIlxuICAgIH0sXG4gICAgXCI2ODFcIjoge1xuICAgICAgICBuYW1lOiBcImdzX200YTFfc2hhdHRlclwiLFxuICAgICAgICB0YWc6IFwiTGVhZGVkIEdsYXNzXCJcbiAgICB9LFxuICAgIFwiNjgyXCI6IHtcbiAgICAgICAgbmFtZTogXCJhbV9tYWMxMF9vY2VhbmlcIixcbiAgICAgICAgdGFnOiBcIk9jZWFuaWNcIlxuICAgIH0sXG4gICAgXCI2ODNcIjoge1xuICAgICAgICBuYW1lOiBcImdzX3I4X2xsYW1hY2Fubm9uXCIsXG4gICAgICAgIHRhZzogXCJMbGFtYSBDYW5ub25cIlxuICAgIH0sXG4gICAgXCI2ODRcIjoge1xuICAgICAgICBuYW1lOiBcImN1X3RlYzlfY3JhY2tlZF9vcGFsXCIsXG4gICAgICAgIHRhZzogXCJDcmFja2VkIE9wYWxcIlxuICAgIH0sXG4gICAgXCI2ODVcIjoge1xuICAgICAgICBuYW1lOiBcImh5X3NjYXIyMF9qdW5nbGVfc2xpcHN0cmVhbVwiLFxuICAgICAgICB0YWc6IFwiSnVuZ2xlIFNsaXBzdHJlYW1cIlxuICAgIH0sXG4gICAgXCI2ODZcIjoge1xuICAgICAgICBuYW1lOiBcImdzX3NnNTUzX3BoYW50b21cIixcbiAgICAgICAgdGFnOiBcIlBoYW50b21cIlxuICAgIH0sXG4gICAgXCI2ODdcIjoge1xuICAgICAgICBuYW1lOiBcImdzX2N6NzVfdGFjdGljYXRcIixcbiAgICAgICAgdGFnOiBcIlRhY3RpY2F0XCJcbiAgICB9LFxuICAgIFwiNjg4XCI6IHtcbiAgICAgICAgbmFtZTogXCJjdV91bXA0NV94LXJheV9tYWNoaW5lXCIsXG4gICAgICAgIHRhZzogXCJFeHBvc3VyZVwiXG4gICAgfSxcbiAgICBcIjY4OVwiOiB7XG4gICAgICAgIG5hbWU6IFwiYXFfeG0xMDE0X3ppZ2d5X2FuYXJjaHlcIixcbiAgICAgICAgdGFnOiBcIlppZ2d5XCJcbiAgICB9LFxuICAgIFwiNjkwXCI6IHtcbiAgICAgICAgbmFtZTogXCJnc19hdWdfc3R5bXBoYWxpYW5fYmlyZHNcIixcbiAgICAgICAgdGFnOiBcIlN0eW1waGFsaWFuXCJcbiAgICB9LFxuICAgIFwiNjkxXCI6IHtcbiAgICAgICAgbmFtZTogXCJnc19hd3BfZGVhdGhcIixcbiAgICAgICAgdGFnOiBcIk1vcnRpc1wiXG4gICAgfSxcbiAgICBcIjY5MlwiOiB7XG4gICAgICAgIG5hbWU6IFwiY3VfYml6b25fcmlvdFwiLFxuICAgICAgICB0YWc6IFwiTmlnaHQgUmlvdFwiXG4gICAgfSxcbiAgICBcIjY5M1wiOiB7XG4gICAgICAgIG5hbWU6IFwiZ3NfZml2ZXNldmVuX2hvdF9yb2RfdmlvbGV0XCIsXG4gICAgICAgIHRhZzogXCJGbGFtZSBUZXN0XCJcbiAgICB9LFxuICAgIFwiNjk0XCI6IHtcbiAgICAgICAgbmFtZTogXCJhYV9nbG9ja18xOF91cmJhbl9tb29uX2ZldmVyXCIsXG4gICAgICAgIHRhZzogXCJNb29ucmlzZVwiXG4gICAgfSxcbiAgICBcIjY5NVwiOiB7XG4gICAgICAgIG5hbWU6IFwiY3VfbTRhNF9uZW9fbm9pclwiLFxuICAgICAgICB0YWc6IFwiTmVvLU5vaXJcIlxuICAgIH0sXG4gICAgXCI2OTZcIjoge1xuICAgICAgICBuYW1lOiBcImdzX21wN19ibG9vZHNwb3J0XCIsXG4gICAgICAgIHRhZzogXCJCbG9vZHNwb3J0XCJcbiAgICB9LFxuICAgIFwiNjk3XCI6IHtcbiAgICAgICAgbmFtZTogXCJjdV9tcDlfYmxhY2tfc2FuZFwiLFxuICAgICAgICB0YWc6IFwiQmxhY2sgU2FuZFwiXG4gICAgfSxcbiAgICBcIjY5OFwiOiB7XG4gICAgICAgIG5hbWU6IFwic3BfbmVnZXZfbGlvbmZpc2hcIixcbiAgICAgICAgdGFnOiBcIkxpb25maXNoXCJcbiAgICB9LFxuICAgIFwiNjk5XCI6IHtcbiAgICAgICAgbmFtZTogXCJnc19ub3ZhX2FuY2hvcml0ZVwiLFxuICAgICAgICB0YWc6IFwiV2lsZCBTaXhcIlxuICAgIH0sXG4gICAgXCI3MDBcIjoge1xuICAgICAgICBuYW1lOiBcImN1X3AyMDAwX3VyYmFuX2hhemFyZFwiLFxuICAgICAgICB0YWc6IFwiVXJiYW4gSGF6YXJkXCJcbiAgICB9LFxuICAgIFwiNzAxXCI6IHtcbiAgICAgICAgbmFtZTogXCJnc19yZXZvbHZlcl90cmVhZFwiLFxuICAgICAgICB0YWc6IFwiR3JpcFwiXG4gICAgfSxcbiAgICBcIjcwMlwiOiB7XG4gICAgICAgIG5hbWU6IFwic3Bfc2c1MzNfYWxvaGFcIixcbiAgICAgICAgdGFnOiBcIkFsb2hhXCJcbiAgICB9LFxuICAgIFwiNzAzXCI6IHtcbiAgICAgICAgbmFtZTogXCJhcV9tYWc3X3N3YWc3XCIsXG4gICAgICAgIHRhZzogXCJTV0FHLTdcIlxuICAgIH0sXG4gICAgXCI3MDRcIjoge1xuICAgICAgICBuYW1lOiBcImN1X3VtcDQ1X3doaXRlX2ZhbmdcIixcbiAgICAgICAgdGFnOiBcIkFyY3RpYyBXb2xmXCJcbiAgICB9LFxuICAgIFwiNzA1XCI6IHtcbiAgICAgICAgbmFtZTogXCJjdV91c3BfY3V0XCIsXG4gICAgICAgIHRhZzogXCJDb3J0ZXhcIlxuICAgIH0sXG4gICAgXCI3MDZcIjoge1xuICAgICAgICBuYW1lOiBcImN1X3htMTAxNF9veGlkZV9ibGF6ZVwiLFxuICAgICAgICB0YWc6IFwiT3hpZGUgQmxhemVcIlxuICAgIH0sXG4gICAgXCI3MDdcIjoge1xuICAgICAgICBuYW1lOiBcImN1X2FrX25lb25fcmlkZXJcIixcbiAgICAgICAgdGFnOiBcIk5lb24gUmlkZXJcIlxuICAgIH0sXG4gICAgXCI3MDhcIjoge1xuICAgICAgICBuYW1lOiBcImh5X2F1Z190b3JuX29yYW5nZVwiLFxuICAgICAgICB0YWc6IFwiQW1iZXIgU2xpcHN0cmVhbVwiXG4gICAgfSxcbiAgICBcIjcwOVwiOiB7XG4gICAgICAgIG5hbWU6IFwiY3VfY3o3NV9lY29cIixcbiAgICAgICAgdGFnOiBcIkVjb1wiXG4gICAgfSxcbiAgICBcIjcxMFwiOiB7XG4gICAgICAgIG5hbWU6IFwic3BfZWxpdGVzX3dpbnRlcl9yYWlkZXJcIixcbiAgICAgICAgdGFnOiBcIlNocmVkXCJcbiAgICB9LFxuICAgIFwiNzExXCI6IHtcbiAgICAgICAgbmFtZTogXCJnc19kZWFnbGVfYWdncmVzc29yXCIsXG4gICAgICAgIHRhZzogXCJDb2RlIFJlZFwiXG4gICAgfSxcbiAgICBcIjcxMlwiOiB7XG4gICAgICAgIG5hbWU6IFwiZ3NfZzNzZzFfYnVjY2FuZWVyXCIsXG4gICAgICAgIHRhZzogXCJIaWdoIFNlYXNcIlxuICAgIH0sXG4gICAgXCI3MTNcIjoge1xuICAgICAgICBuYW1lOiBcImdzX2dsb2NrX3RodW5kZXJfZHVzdFwiLFxuICAgICAgICB0YWc6IFwiV2FyaGF3a1wiXG4gICAgfSxcbiAgICBcIjcxNFwiOiB7XG4gICAgICAgIG5hbWU6IFwiY3VfbTRhMXNfbmlnaHRtYXJlXCIsXG4gICAgICAgIHRhZzogXCJOaWdodG1hcmVcIlxuICAgIH0sXG4gICAgXCI3MTVcIjoge1xuICAgICAgICBuYW1lOiBcImN1X21wOV92ZWluXCIsXG4gICAgICAgIHRhZzogXCJDYXBpbGxhcnlcIlxuICAgIH0sXG4gICAgXCI3MTZcIjoge1xuICAgICAgICBuYW1lOiBcImN1X25vdmFfdG95X3NvbGRpZXJcIixcbiAgICAgICAgdGFnOiBcIlRveSBTb2xkaWVyXCJcbiAgICB9LFxuICAgIFwiNzE3XCI6IHtcbiAgICAgICAgbmFtZTogXCJnc19wOTBfdHJlYWRcIixcbiAgICAgICAgdGFnOiBcIlRyYWN0aW9uXCJcbiAgICB9LFxuICAgIFwiNzE4XCI6IHtcbiAgICAgICAgbmFtZTogXCJhbV9hd3BfcGF3cGF3XCIsXG4gICAgICAgIHRhZzogXCJQQVdcIlxuICAgIH0sXG4gICAgXCI3MTlcIjoge1xuICAgICAgICBuYW1lOiBcImdzX3Bvd2VyY29yZV9tcDdcIixcbiAgICAgICAgdGFnOiBcIlBvd2VyY29yZVwiXG4gICAgfSxcbiAgICBcIjcyMFwiOiB7XG4gICAgICAgIG5hbWU6IFwiY3Vfc2F3ZWRvZmZfZGV2b3VyZXJcIixcbiAgICAgICAgdGFnOiBcIkRldm91cmVyXCJcbiAgICB9LFxuICAgIFwiNzIxXCI6IHtcbiAgICAgICAgbmFtZTogXCJjdV9yOF9zdXJ2aXZhbGlzdFwiLFxuICAgICAgICB0YWc6IFwiU3Vydml2YWxpc3RcIlxuICAgIH0sXG4gICAgXCI3MjJcIjoge1xuICAgICAgICBuYW1lOiBcImN1X3RlYzlfc25ha2VcIixcbiAgICAgICAgdGFnOiBcIlNuZWstOVwiXG4gICAgfSxcbiAgICBcIjcyM1wiOiB7XG4gICAgICAgIG5hbWU6IFwiY3VfZmFtYXNfb3dsX29yYW5nZVwiLFxuICAgICAgICB0YWc6IFwiRXllIG9mIEF0aGVuYVwiXG4gICAgfSxcbiAgICBcIjcyNFwiOiB7XG4gICAgICAgIG5hbWU6IFwiY3VfYWtfaXNsYW5kX2Zsb3JhbFwiLFxuICAgICAgICB0YWc6IFwiV2lsZCBMb3R1c1wiXG4gICAgfSxcbiAgICBcIjcyNVwiOiB7XG4gICAgICAgIG5hbWU6IFwiaHlfYmxvb21fcmVkXCIsXG4gICAgICAgIHRhZzogXCJEYXkgTGlseVwiXG4gICAgfSxcbiAgICBcIjcyNlwiOiB7XG4gICAgICAgIG5hbWU6IFwic3BfYmxvb21fb3JhbmdlXCIsXG4gICAgICAgIHRhZzogXCJTdW5zZXQgTGlseVwiXG4gICAgfSxcbiAgICBcIjcyN1wiOiB7XG4gICAgICAgIG5hbWU6IFwiYW1fYmxvb21fYmx1ZVwiLFxuICAgICAgICB0YWc6IFwiTWlkbmlnaHQgTGlseVwiXG4gICAgfSxcbiAgICBcIjcyOFwiOiB7XG4gICAgICAgIG5hbWU6IFwic3BfYnVkX2dyZWVuXCIsXG4gICAgICAgIHRhZzogXCJUZWFsIEJsb3Nzb21cIlxuICAgIH0sXG4gICAgXCI3MjlcIjoge1xuICAgICAgICBuYW1lOiBcImh5X2J1ZF9yZWRcIixcbiAgICAgICAgdGFnOiBcIkNyaW1zb24gQmxvc3NvbVwiXG4gICAgfSxcbiAgICBcIjczMFwiOiB7XG4gICAgICAgIG5hbWU6IFwic3BfYnVkX2JsdWVcIixcbiAgICAgICAgdGFnOiBcIkRhcmsgQmxvc3NvbVwiXG4gICAgfSxcbiAgICBcIjczMVwiOiB7XG4gICAgICAgIG5hbWU6IFwiaHlfbGVhZl9ncmVlblwiLFxuICAgICAgICB0YWc6IFwiQmFuYW5hIExlYWZcIlxuICAgIH0sXG4gICAgXCI3MzJcIjoge1xuICAgICAgICBuYW1lOiBcImh5X2xlYWZfYmx1ZVwiLFxuICAgICAgICB0YWc6IFwiU3ludGggTGVhZlwiXG4gICAgfSxcbiAgICBcIjczM1wiOiB7XG4gICAgICAgIG5hbWU6IFwic3BfbGVhZl9vcmFuZ2VcIixcbiAgICAgICAgdGFnOiBcIlJ1c3QgTGVhZlwiXG4gICAgfSxcbiAgICBcIjczNFwiOiB7XG4gICAgICAgIG5hbWU6IFwiY3VfbXA5X2lzbGFuZF9mbG9yYWxcIixcbiAgICAgICAgdGFnOiBcIldpbGQgTGlseVwiXG4gICAgfSxcbiAgICBcIjczNVwiOiB7XG4gICAgICAgIG5hbWU6IFwic3BfbmlnaHRzdHJpcGVcIixcbiAgICAgICAgdGFnOiBcIk5pZ2h0IFN0cmlwZVwiXG4gICAgfSxcbiAgICBcIjczNlwiOiB7XG4gICAgICAgIG5hbWU6IFwiZ3NfYXdwX2VuYW1lbFwiLFxuICAgICAgICB0YWc6IFwiVGhlIFByaW5jZVwiXG4gICAgfSxcbiAgICBcIjczN1wiOiB7XG4gICAgICAgIG5hbWU6IFwiZ3NfbWFnN19nbGFzc1wiLFxuICAgICAgICB0YWc6IFwiQ2lucXVlZGVhXCJcbiAgICB9LFxuICAgIFwiNzM4XCI6IHtcbiAgICAgICAgbmFtZTogXCJoeV9tdXJhbm9fb3JhbmdlXCIsXG4gICAgICAgIHRhZzogXCJPcmFuZ2UgTXVyYW5vXCJcbiAgICB9LFxuICAgIFwiNzM5XCI6IHtcbiAgICAgICAgbmFtZTogXCJhbV9tdXJhbm9fdmlvbGV0XCIsXG4gICAgICAgIHRhZzogXCJWaW9sZXQgTXVyYW5vXCJcbiAgICB9LFxuICAgIFwiNzQwXCI6IHtcbiAgICAgICAgbmFtZTogXCJoeV9tdXJhbm9fYmx1ZVwiLFxuICAgICAgICB0YWc6IFwiTmF2eSBNdXJhbm9cIlxuICAgIH0sXG4gICAgXCI3NDFcIjoge1xuICAgICAgICBuYW1lOiBcImFtX3Jlbl9kYXJrXCIsXG4gICAgICAgIHRhZzogXCJEYXJrIEZpbGlncmVlXCJcbiAgICB9LFxuICAgIFwiNzQyXCI6IHtcbiAgICAgICAgbmFtZTogXCJhbV9yZW5fcmVkXCIsXG4gICAgICAgIHRhZzogXCJSZWQgRmlsaWdyZWVcIlxuICAgIH0sXG4gICAgXCI3NDNcIjoge1xuICAgICAgICBuYW1lOiBcImh5X3Jlbl9vcmFuZ2VcIixcbiAgICAgICAgdGFnOiBcIk9yYW5nZSBGaWxpZ3JlZVwiXG4gICAgfSxcbiAgICBcIjc0NFwiOiB7XG4gICAgICAgIG5hbWU6IFwiYW1fdmVuZXRvX3JlZFwiLFxuICAgICAgICB0YWc6IFwiQmFyb3F1ZSBSZWRcIlxuICAgIH0sXG4gICAgXCI3NDVcIjoge1xuICAgICAgICBuYW1lOiBcImh5X3ZlbmV0b19wdXJwbGVcIixcbiAgICAgICAgdGFnOiBcIkJhcm9xdWUgUHVycGxlXCJcbiAgICB9LFxuICAgIFwiNzQ2XCI6IHtcbiAgICAgICAgbmFtZTogXCJhbV92ZW5ldG8yXCIsXG4gICAgICAgIHRhZzogXCJCYXJvcXVlIE9yYW5nZVwiXG4gICAgfSxcbiAgICBcIjc0N1wiOiB7XG4gICAgICAgIG5hbWU6IFwiY3VfZHVhbF9lbGl0ZXNfcmFsbHlcIixcbiAgICAgICAgdGFnOiBcIlR3aW4gVHVyYm9cIlxuICAgIH0sXG4gICAgXCI3NDhcIjoge1xuICAgICAgICBuYW1lOiBcImdzX21hYzEwX2NoZWNrZXJcIixcbiAgICAgICAgdGFnOiBcIkNhbGYgU2tpblwiXG4gICAgfSxcbiAgICBcIjc0OVwiOiB7XG4gICAgICAgIG5hbWU6IFwiZ3NfcDI1MF9jaGVja2VyXCIsXG4gICAgICAgIHRhZzogXCJWaW5vIFByaW1vXCJcbiAgICB9LFxuICAgIFwiNzUwXCI6IHtcbiAgICAgICAgbmFtZTogXCJjdV9zZzU1M19yYWxseVwiLFxuICAgICAgICB0YWc6IFwiSW50ZWdyYWxlXCJcbiAgICB9LFxuICAgIFwiNzUxXCI6IHtcbiAgICAgICAgbmFtZTogXCJnc19zc2cwOF9jaGVja2VyXCIsXG4gICAgICAgIHRhZzogXCJIYW5kIEJyYWtlXCJcbiAgICB9LFxuICAgIFwiNzUyXCI6IHtcbiAgICAgICAgbmFtZTogXCJhYV9mYWRlX21wN1wiLFxuICAgICAgICB0YWc6IFwiRmFkZVwiXG4gICAgfSxcbiAgICBcIjc1M1wiOiB7XG4gICAgICAgIG5hbWU6IFwic3BfdGFwZV9zaG9ydF9yYWxseVwiLFxuICAgICAgICB0YWc6IFwiRGlydCBEcm9wXCJcbiAgICB9LFxuICAgIFwiNzU0XCI6IHtcbiAgICAgICAgbmFtZTogXCJhcV9zdGVlbF9pbmZlcm5vXCIsXG4gICAgICAgIHRhZzogXCJSdXN0IENvYXRcIlxuICAgIH0sXG4gICAgXCI3NTVcIjoge1xuICAgICAgICBuYW1lOiBcImh5X3NwbGF0dGVyM1wiLFxuICAgICAgICB0YWc6IFwiU2xpZGVcIlxuICAgIH0sXG4gICAgXCI3NTZcIjoge1xuICAgICAgICBuYW1lOiBcImdzX2F3cF9ndW5nbmlyXCIsXG4gICAgICAgIHRhZzogXCJHdW5nbmlyXCJcbiAgICB9LFxuICAgIFwiNzU3XCI6IHtcbiAgICAgICAgbmFtZTogXCJhbV9qb3JtX2dyZWVuXCIsXG4gICAgICAgIHRhZzogXCJFbWVyYWxkIErDtnJtdW5nYW5kclwiXG4gICAgfSxcbiAgICBcIjc1OFwiOiB7XG4gICAgICAgIG5hbWU6IFwiYW1fam9ybV9vcmFuZ2VcIixcbiAgICAgICAgdGFnOiBcIkZsYW1lIErDtnJtdW5nYW5kclwiXG4gICAgfSxcbiAgICBcIjc1OVwiOiB7XG4gICAgICAgIG5hbWU6IFwiYW1fam9ybV9ibHVlXCIsXG4gICAgICAgIHRhZzogXCJBc3RyYWwgSsO2cm11bmdhbmRyXCJcbiAgICB9LFxuICAgIFwiNzYwXCI6IHtcbiAgICAgICAgbmFtZTogXCJhbV9rbm90c19zaWx2ZXJcIixcbiAgICAgICAgdGFnOiBcIkZyb3N0IEJvcnJlXCJcbiAgICB9LFxuICAgIFwiNzYxXCI6IHtcbiAgICAgICAgbmFtZTogXCJhbV9rbm90c19icm93blwiLFxuICAgICAgICB0YWc6IFwiQ29wcGVyIEJvcnJlXCJcbiAgICB9LFxuICAgIFwiNzYyXCI6IHtcbiAgICAgICAgbmFtZTogXCJzb19ydW5lX3N0b25lXCIsXG4gICAgICAgIHRhZzogXCJSZWQgU3RvbmVcIlxuICAgIH0sXG4gICAgXCI3NjNcIjoge1xuICAgICAgICBuYW1lOiBcImdzX25lZ2V2X3Rob3JcIixcbiAgICAgICAgdGFnOiBcIk1qw7ZsbmlyXCJcbiAgICB9LFxuICAgIFwiNzY0XCI6IHtcbiAgICAgICAgbmFtZTogXCJnc19kZWFnbGVfZmVubmVjXCIsXG4gICAgICAgIHRhZzogXCJGZW5uZWMgRm94XCJcbiAgICB9LFxuICAgIFwiNzY1XCI6IHtcbiAgICAgICAgbmFtZTogXCJhYV9kZXNlcnRfYmxvb21fYnJpZ2h0XCIsXG4gICAgICAgIHRhZzogXCJEZXNlcnQgQmxvc3NvbVwiXG4gICAgfSxcbiAgICBcIjc3NVwiOiB7XG4gICAgICAgIG5hbWU6IFwiaHlfYmx1ZXByaW50X3doaXRlXCIsXG4gICAgICAgIHRhZzogXCJGYWNpbGl0eSBTa2V0Y2hcIlxuICAgIH0sXG4gICAgXCI3NzZcIjoge1xuICAgICAgICBuYW1lOiBcImh5X2JsdWVwcmludF9hcXVhXCIsXG4gICAgICAgIHRhZzogXCJGYWNpbGl0eSBOZWdhdGl2ZVwiXG4gICAgfSxcbiAgICBcIjc3N1wiOiB7XG4gICAgICAgIG5hbWU6IFwiaHlfYmx1ZXByaW50X3JlZFwiLFxuICAgICAgICB0YWc6IFwiRmFjaWxpdHkgRHJhZnRcIlxuICAgIH0sXG4gICAgXCI3NzhcIjoge1xuICAgICAgICBuYW1lOiBcImh5X2JsdWVwcmludF9ibHVlcmVkXCIsXG4gICAgICAgIHRhZzogXCJGYWNpbGl0eSBEYXJrXCJcbiAgICB9LFxuICAgIFwiNzc5XCI6IHtcbiAgICAgICAgbmFtZTogXCJhbV9jaXJjdWl0Ym9hcmRfb3JhbmdlXCIsXG4gICAgICAgIHRhZzogXCJSYW5kb20gQWNjZXNzXCJcbiAgICB9LFxuICAgIFwiNzgwXCI6IHtcbiAgICAgICAgbmFtZTogXCJhbV9jaXJjdWl0Ym9hcmRfc2lsdmVyXCIsXG4gICAgICAgIHRhZzogXCJNYWluZnJhbWVcIlxuICAgIH0sXG4gICAgXCI3ODFcIjoge1xuICAgICAgICBuYW1lOiBcImFtX2NpcmN1aXRib2FyZF9hcXVhXCIsXG4gICAgICAgIHRhZzogXCJDby1Qcm9jZXNzb3JcIlxuICAgIH0sXG4gICAgXCI3ODJcIjoge1xuICAgICAgICBuYW1lOiBcImFtX2NpcmN1aXRib2FyZF9ncmVlblwiLFxuICAgICAgICB0YWc6IFwiTW90aGVyYm9hcmRcIlxuICAgIH0sXG4gICAgXCI3ODNcIjoge1xuICAgICAgICBuYW1lOiBcImh5X2R1Y3RzX3llbGxvd1wiLFxuICAgICAgICB0YWc6IFwiQnVsa2hlYWRcIlxuICAgIH0sXG4gICAgXCI3ODRcIjoge1xuICAgICAgICBuYW1lOiBcImh5X2R1Y3RzX2dyZWVuXCIsXG4gICAgICAgIHRhZzogXCJDb29sYW50XCJcbiAgICB9LFxuICAgIFwiNzg1XCI6IHtcbiAgICAgICAgbmFtZTogXCJoeV9kdWN0c19ncmV5XCIsXG4gICAgICAgIHRhZzogXCJNYW5kcmVsXCJcbiAgICB9LFxuICAgIFwiNzg2XCI6IHtcbiAgICAgICAgbmFtZTogXCJoeV9kdWN0c19ibHVlXCIsXG4gICAgICAgIHRhZzogXCJFeGNoYW5nZXJcIlxuICAgIH0sXG4gICAgXCI3ODdcIjoge1xuICAgICAgICBuYW1lOiBcImh5X251Y2xlYXJfaG90b3JhbmdlXCIsXG4gICAgICAgIHRhZzogXCJDb3JlIEJyZWFjaFwiXG4gICAgfSxcbiAgICBcIjc4OFwiOiB7XG4gICAgICAgIG5hbWU6IFwiaHlfbnVjbGVhcl9za3VsbHNfcmVkYmx1ZVwiLFxuICAgICAgICB0YWc6IFwiQWNoZXJvblwiXG4gICAgfSxcbiAgICBcIjc4OVwiOiB7XG4gICAgICAgIG5hbWU6IFwiYW1fbnVjbGVhcl9za3VsbHNfZ3JlZW5cIixcbiAgICAgICAgdGFnOiBcIk51Y2xlYXIgR2FyZGVuXCJcbiAgICB9LFxuICAgIFwiNzkwXCI6IHtcbiAgICAgICAgbmFtZTogXCJoeV9udWNsZWFyX3NrdWxsc19hcXVhXCIsXG4gICAgICAgIHRhZzogXCJDb2xkIEZ1c2lvblwiXG4gICAgfSxcbiAgICBcIjc5MVwiOiB7XG4gICAgICAgIG5hbWU6IFwiZ3NfdGVjOV9lbnZveVwiLFxuICAgICAgICB0YWc6IFwiUmVtb3RlIENvbnRyb2xcIlxuICAgIH0sXG4gICAgXCI3OTJcIjoge1xuICAgICAgICBuYW1lOiBcImdzX200YTFzX29wZXJhdG9yXCIsXG4gICAgICAgIHRhZzogXCJDb250cm9sIFBhbmVsXCJcbiAgICB9LFxuICAgIFwiNzkzXCI6IHtcbiAgICAgICAgbmFtZTogXCJoeV9yZWRfaGV4XCIsXG4gICAgICAgIHRhZzogXCJDb252ZXJ0ZXJcIlxuICAgIH0sXG4gICAgXCI3OTRcIjoge1xuICAgICAgICBuYW1lOiBcInNwX21lc2hfc2FmZXR5YmxhY2tcIixcbiAgICAgICAgdGFnOiBcIlN3ZWVwZXJcIlxuICAgIH0sXG4gICAgXCI3OTVcIjoge1xuICAgICAgICBuYW1lOiBcImh5X21lc2hfc2FmZXR5b3JhbmdlXCIsXG4gICAgICAgIHRhZzogXCJTYWZldHkgTmV0XCJcbiAgICB9LFxuICAgIFwiNzk2XCI6IHtcbiAgICAgICAgbmFtZTogXCJzcF9tZXNoX3NhZmV0eXJlZFwiLFxuICAgICAgICB0YWc6IFwiQ2hlY2sgRW5naW5lXCJcbiAgICB9LFxuICAgIFwiNzk3XCI6IHtcbiAgICAgICAgbmFtZTogXCJhYV92ZXJ0aWdvX3JlZFwiLFxuICAgICAgICB0YWc6IFwiQnJha2UgTGlnaHRcIlxuICAgIH0sXG4gICAgXCI3OThcIjoge1xuICAgICAgICBuYW1lOiBcInNvX29yYW5nZV9hY2NlbnRzM1wiLFxuICAgICAgICB0YWc6IFwiTml0cm9cIlxuICAgIH0sXG4gICAgXCI3OTlcIjoge1xuICAgICAgICBuYW1lOiBcImFhX3ZlcnRpZ29fYmx1ZVwiLFxuICAgICAgICB0YWc6IFwiSGlnaCBCZWFtXCJcbiAgICB9LFxuICAgIFwiODAwXCI6IHtcbiAgICAgICAgbmFtZTogXCJoeV9sYWJyYXRfbXA1XCIsXG4gICAgICAgIHRhZzogXCJMYWIgUmF0c1wiXG4gICAgfSxcbiAgICBcIjgwMVwiOiB7XG4gICAgICAgIG5hbWU6IFwiY3VfYWs0N19hc2lpbW92XCIsXG4gICAgICAgIHRhZzogXCJBc2lpbW92XCJcbiAgICB9LFxuICAgIFwiODAyXCI6IHtcbiAgICAgICAgbmFtZTogXCJjdV91bXBfYXJyb3dzXCIsXG4gICAgICAgIHRhZzogXCJNb21lbnR1bVwiXG4gICAgfSxcbiAgICBcIjgwM1wiOiB7XG4gICAgICAgIG5hbWU6IFwiY3VfYXdwX25lb25vaXJcIixcbiAgICAgICAgdGFnOiBcIk5lby1Ob2lyXCJcbiAgICB9LFxuICAgIFwiODA0XCI6IHtcbiAgICAgICAgbmFtZTogXCJnc19tcDlfY29sb255MDFcIixcbiAgICAgICAgdGFnOiBcIk1vZGVzdCBUaHJlYXRcIlxuICAgIH0sXG4gICAgXCI4MDVcIjoge1xuICAgICAgICBuYW1lOiBcImdzX2RlYWdsZV9tZWNoYVwiLFxuICAgICAgICB0YWc6IFwiTWVjaGEgSW5kdXN0cmllc1wiXG4gICAgfSxcbiAgICBcIjgwNlwiOiB7XG4gICAgICAgIG5hbWU6IFwiZ3NfZzNzZzFfc2F2YWdlXCIsXG4gICAgICAgIHRhZzogXCJTY2F2ZW5nZXJcIlxuICAgIH0sXG4gICAgXCI4MDdcIjoge1xuICAgICAgICBuYW1lOiBcImh5X2dhbGlsX3NpZ25hbF9yZWRcIixcbiAgICAgICAgdGFnOiBcIlNpZ25hbFwiXG4gICAgfSxcbiAgICBcIjgwOFwiOiB7XG4gICAgICAgIG5hbWU6IFwiY3VfZ2xvY2sxOF9jb3Jyb2RlblwiLFxuICAgICAgICB0YWc6IFwiT3hpZGUgQmxhemVcIlxuICAgIH0sXG4gICAgXCI4MDlcIjoge1xuICAgICAgICBuYW1lOiBcImdzX25vdmFfaHVudGVyX2JydXRlXCIsXG4gICAgICAgIHRhZzogXCJXb29kIEZpcmVkXCJcbiAgICB9LFxuICAgIFwiODEwXCI6IHtcbiAgICAgICAgbmFtZTogXCJnc19tcDVfZmVzdGl2YWxfZHJpcFwiLFxuICAgICAgICB0YWc6IFwiUGhvc3Bob3JcIlxuICAgIH0sXG4gICAgXCI4MTFcIjoge1xuICAgICAgICBuYW1lOiBcImdzX200YTRfY2hvcHBlcl9naG9zdFwiLFxuICAgICAgICB0YWc6IFwiTWFnbmVzaXVtXCJcbiAgICB9LFxuICAgIFwiODEyXCI6IHtcbiAgICAgICAgbmFtZTogXCJnc19tYWMxMF9leG9fcGlwZXNcIixcbiAgICAgICAgdGFnOiBcIlBpcGUgRG93blwiXG4gICAgfSxcbiAgICBcIjgxM1wiOiB7XG4gICAgICAgIG5hbWU6IFwiYWFfcDI1MF9ncmF2ZWRpZ2dlcnNcIixcbiAgICAgICAgdGFnOiBcIk5ldmVybW9yZVwiXG4gICAgfSxcbiAgICBcIjgxNFwiOiB7XG4gICAgICAgIG5hbWU6IFwiY3Vfc2F3ZWRvZmZfYmxhY2tfc2FuZFwiLFxuICAgICAgICB0YWc6IFwiQmxhY2sgU2FuZFwiXG4gICAgfSxcbiAgICBcIjgxNVwiOiB7XG4gICAgICAgIG5hbWU6IFwiZ3Nfc2c1NTNfb3Zlcl9oZWF0ZWRcIixcbiAgICAgICAgdGFnOiBcIkRhbmdlciBDbG9zZVwiXG4gICAgfSxcbiAgICBcIjgxNlwiOiB7XG4gICAgICAgIG5hbWU6IFwiZ3NfdGVjOV9mdWJhclwiLFxuICAgICAgICB0YWc6IFwiRnViYXJcIlxuICAgIH0sXG4gICAgXCI4MTdcIjoge1xuICAgICAgICBuYW1lOiBcImN1X3VzcF9mbGFzaGJhY2tcIixcbiAgICAgICAgdGFnOiBcIkZsYXNoYmFja1wiXG4gICAgfSxcbiAgICBcIjgxOFwiOiB7XG4gICAgICAgIG5hbWU6IFwiYW1fZGRwYXRfcHVycGxlXCIsXG4gICAgICAgIHRhZzogXCJQdXJwbGUgRERQQVRcIlxuICAgIH0sXG4gICAgXCI4MTlcIjoge1xuICAgICAgICBuYW1lOiBcImdzX2F3cF9oeWRyYVwiLFxuICAgICAgICB0YWc6IFwiRGVzZXJ0IEh5ZHJhXCJcbiAgICB9LFxuICAgIFwiODIwXCI6IHtcbiAgICAgICAgbmFtZTogXCJhbV9taXJhZ2VfZmxvd2Vyc19tZXRhbGljXCIsXG4gICAgICAgIHRhZzogXCJNdXNpYyBCb3hcIlxuICAgIH0sXG4gICAgXCI4MjFcIjoge1xuICAgICAgICBuYW1lOiBcImFtX21vcm9fdGV4dGlsZV9icmlnaHRcIixcbiAgICAgICAgdGFnOiBcIkVsZWdhbnQgVmluZXNcIlxuICAgIH0sXG4gICAgXCI4MjJcIjoge1xuICAgICAgICBuYW1lOiBcImFtX25hdnlfc2hpbmVcIixcbiAgICAgICAgdGFnOiBcIk5hdnkgU2hlZW5cIlxuICAgIH0sXG4gICAgXCI4MjNcIjoge1xuICAgICAgICBuYW1lOiBcImdzX2F1Z19zYW5kX3N0b3JtXCIsXG4gICAgICAgIHRhZzogXCJTYW5kIFN0b3JtXCJcbiAgICB9LFxuICAgIFwiODI0XCI6IHtcbiAgICAgICAgbmFtZTogXCJzcF9kcnlfd29vZFwiLFxuICAgICAgICB0YWc6IFwiRHJpZnQgV29vZFwiXG4gICAgfSxcbiAgICBcIjgyNVwiOiB7XG4gICAgICAgIG5hbWU6IFwic3BfZGVzZXJ0X3NrdWxsc19kYXduXCIsXG4gICAgICAgIHRhZzogXCJEcm91Z2h0XCJcbiAgICB9LFxuICAgIFwiODI2XCI6IHtcbiAgICAgICAgbmFtZTogXCJzcF9taXJhZ2VfZmxvd2Vyc190YW5cIixcbiAgICAgICAgdGFnOiBcIlNpZW5uYSBEYW1hc2tcIlxuICAgIH0sXG4gICAgXCI4MjdcIjoge1xuICAgICAgICBuYW1lOiBcInNwX21vcm9fY2FydmluZ19idXJudFwiLFxuICAgICAgICB0YWc6IFwiSHVtaWRvclwiXG4gICAgfSxcbiAgICBcIjgyOFwiOiB7XG4gICAgICAgIG5hbWU6IFwic3BfbW9yb190ZXh0aWxlX2dyZWVuX3ZpbmVcIixcbiAgICAgICAgdGFnOiBcIlZlcmRhbnQgR3Jvd3RoXCJcbiAgICB9LFxuICAgIFwiODI5XCI6IHtcbiAgICAgICAgbmFtZTogXCJoeV9saXphcmRfc2tpblwiLFxuICAgICAgICB0YWc6IFwiQW5vbGlzXCJcbiAgICB9LFxuICAgIFwiODM1XCI6IHtcbiAgICAgICAgbmFtZTogXCJzcF9mYW1hc19naG9zdF9pbnNlY3RzXCIsXG4gICAgICAgIHRhZzogXCJDcnlwc2lzXCJcbiAgICB9LFxuICAgIFwiODM2XCI6IHtcbiAgICAgICAgbmFtZTogXCJjdV9hazQ3X2F6dGVjXCIsXG4gICAgICAgIHRhZzogXCJVbmNoYXJ0ZWRcIlxuICAgIH0sXG4gICAgXCI4MzdcIjoge1xuICAgICAgICBuYW1lOiBcImN1X2ZpdmVfc2V2ZW5fYW5ncnlcIixcbiAgICAgICAgdGFnOiBcIkFuZ3J5IE1vYlwiXG4gICAgfSxcbiAgICBcIjgzOFwiOiB7XG4gICAgICAgIG5hbWU6IFwiY3VfYXdwX3ZpcGVyXCIsXG4gICAgICAgIHRhZzogXCJBdGhlcmlzXCJcbiAgICB9LFxuICAgIFwiODM5XCI6IHtcbiAgICAgICAgbmFtZTogXCJjdV90ZWM5X2JhbWJvb1wiLFxuICAgICAgICB0YWc6IFwiQmFtYm9vemxlXCJcbiAgICB9LFxuICAgIFwiODQwXCI6IHtcbiAgICAgICAgbmFtZTogXCJnc19tYWMxMF9maXNoX2JhaXRcIixcbiAgICAgICAgdGFnOiBcIldoaXRlZmlzaFwiXG4gICAgfSxcbiAgICBcIjg0MVwiOiB7XG4gICAgICAgIG5hbWU6IFwiZ3NfZGVhZ2xlX2V4b1wiLFxuICAgICAgICB0YWc6IFwiTGlnaHQgUmFpbFwiXG4gICAgfSxcbiAgICBcIjg0MlwiOiB7XG4gICAgICAgIG5hbWU6IFwic3BfZ2FsaWxfYWtvYmVuXCIsXG4gICAgICAgIHRhZzogXCJBa29iZW5cIlxuICAgIH0sXG4gICAgXCI4NDNcIjoge1xuICAgICAgICBuYW1lOiBcImN1X3Jldm9sdmVyX29wcHJlc3NvclwiLFxuICAgICAgICB0YWc6IFwiU2t1bGwgQ3J1c2hlclwiXG4gICAgfSxcbiAgICBcIjg0NFwiOiB7XG4gICAgICAgIG5hbWU6IFwiZ3NfbTRhNF9lbXBlcm9yXCIsXG4gICAgICAgIHRhZzogXCJUaGUgRW1wZXJvclwiXG4gICAgfSxcbiAgICBcIjg0NVwiOiB7XG4gICAgICAgIG5hbWU6IFwiY3VfYXVnX21vbWVudHVtXCIsXG4gICAgICAgIHRhZzogXCJNb21lbnR1bVwiXG4gICAgfSxcbiAgICBcIjg0NlwiOiB7XG4gICAgICAgIG5hbWU6IFwiZ3NfbXA1c2RfYXN0cm9tYXRpY1wiLFxuICAgICAgICB0YWc6IFwiR2F1c3NcIlxuICAgIH0sXG4gICAgXCI4NDdcIjoge1xuICAgICAgICBuYW1lOiBcImN1X21wN19yYWNrZXRlZXJcIixcbiAgICAgICAgdGFnOiBcIk1pc2NoaWVmXCJcbiAgICB9LFxuICAgIFwiODQ4XCI6IHtcbiAgICAgICAgbmFtZTogXCJhcV9wMjUwX3ZlcmRpZ3Jpc1wiLFxuICAgICAgICB0YWc6IFwiVmVyZGlncmlzXCJcbiAgICB9LFxuICAgIFwiODQ5XCI6IHtcbiAgICAgICAgbmFtZTogXCJjdV9wOTBfb2Zmd29ybGRcIixcbiAgICAgICAgdGFnOiBcIk9mZiBXb3JsZFwiXG4gICAgfSxcbiAgICBcIjg1MFwiOiB7XG4gICAgICAgIG5hbWU6IFwiY3VfeG0xMDE0X2luY2luZXJhdG9yXCIsXG4gICAgICAgIHRhZzogXCJJbmNpbmVnYXRvclwiXG4gICAgfSxcbiAgICBcIjg1MVwiOiB7XG4gICAgICAgIG5hbWU6IFwiYWFfdW1wNDVfbW9vbnJpc2Vfc3Vuc2V0XCIsXG4gICAgICAgIHRhZzogXCJNb29ucmlzZVwiXG4gICAgfSxcbiAgICBcIjg1MlwiOiB7XG4gICAgICAgIG5hbWU6IFwiYW1fZG9wcGxlcl9waGFzZTFfd2lkb3dcIixcbiAgICAgICAgdGFnOiBcIkRvcHBsZXJcIlxuICAgIH0sXG4gICAgXCI4NTNcIjoge1xuICAgICAgICBuYW1lOiBcImFtX2RvcHBsZXJfcGhhc2UyX3dpZG93XCIsXG4gICAgICAgIHRhZzogXCJEb3BwbGVyXCJcbiAgICB9LFxuICAgIFwiODU0XCI6IHtcbiAgICAgICAgbmFtZTogXCJhbV9kb3BwbGVyX3BoYXNlM193aWRvd1wiLFxuICAgICAgICB0YWc6IFwiRG9wcGxlclwiXG4gICAgfSxcbiAgICBcIjg1NVwiOiB7XG4gICAgICAgIG5hbWU6IFwiYW1fZG9wcGxlcl9waGFzZTRfd2lkb3dcIixcbiAgICAgICAgdGFnOiBcIkRvcHBsZXJcIlxuICAgIH0sXG4gICAgXCI4NTZcIjoge1xuICAgICAgICBuYW1lOiBcImFtX21hcmJsZV9mYWRlX3dpZG93XCIsXG4gICAgICAgIHRhZzogXCJNYXJibGUgRmFkZVwiXG4gICAgfSxcbiAgICBcIjg1N1wiOiB7XG4gICAgICAgIG5hbWU6IFwiYXFfZGFtYXNjdXNfcHJpc21hXCIsXG4gICAgICAgIHRhZzogXCJEYW1hc2N1cyBTdGVlbFwiXG4gICAgfSxcbiAgICBcIjg1OFwiOiB7XG4gICAgICAgIG5hbWU6IFwiYXFfZGFtYXNjdXNfd2lkb3dcIixcbiAgICAgICAgdGFnOiBcIkRhbWFzY3VzIFN0ZWVsXCJcbiAgICB9LFxuICAgIFwiODU5XCI6IHtcbiAgICAgICAgbmFtZTogXCJhbV9jcnlzdGFsbGl6ZWRfZ3JlZW5cIixcbiAgICAgICAgdGFnOiBcIkVtZXJhbGQgUXVhcnR6XCJcbiAgICB9LFxuICAgIFwiODYwXCI6IHtcbiAgICAgICAgbmFtZTogXCJoeV9nZWxwZW5fZGFya1wiLFxuICAgICAgICB0YWc6IFwiUHlyZVwiXG4gICAgfSxcbiAgICBcIjg2MVwiOiB7XG4gICAgICAgIG5hbWU6IFwic3BfYXNnYXJkX3dhbGxcIixcbiAgICAgICAgdGFnOiBcIkJhcnJpY2FkZVwiXG4gICAgfSxcbiAgICBcIjg2MlwiOiB7XG4gICAgICAgIG5hbWU6IFwiYW1fY3J5c3RhbGxpemVkX2RhcmtfZ3JlZW5cIixcbiAgICAgICAgdGFnOiBcIk1vc3MgUXVhcnR6XCJcbiAgICB9LFxuICAgIFwiODYzXCI6IHtcbiAgICAgICAgbmFtZTogXCJzcF9rbm90c19ibHVlXCIsXG4gICAgICAgIHRhZzogXCJOaWdodCBCb3JyZVwiXG4gICAgfSxcbiAgICBcIjg2NFwiOiB7XG4gICAgICAgIG5hbWU6IFwic29fcmVkX3NnNTUzXCIsXG4gICAgICAgIHRhZzogXCJDYW5keSBBcHBsZVwiXG4gICAgfSxcbiAgICBcIjg2NVwiOiB7XG4gICAgICAgIG5hbWU6IFwiaHlfY2FuYWxzX3RpbGVcIixcbiAgICAgICAgdGFnOiBcIlN0b25lIE1vc2FpY29cIlxuICAgIH0sXG4gICAgXCI4NjZcIjoge1xuICAgICAgICBuYW1lOiBcInNwX3NwcmF5X3dhdGVyXCIsXG4gICAgICAgIHRhZzogXCJDYW5hbCBTcHJheVwiXG4gICAgfSxcbiAgICBcIjg2N1wiOiB7XG4gICAgICAgIG5hbWU6IFwiYW1fc3RhaW5lZF9nbGFzc1wiLFxuICAgICAgICB0YWc6IFwiU3RhaW5lZCBHbGFzc1wiXG4gICAgfSxcbiAgICBcIjg2OFwiOiB7XG4gICAgICAgIG5hbWU6IFwiaHlfZmxvd2Vyc19zdG1hcmNcIixcbiAgICAgICAgdGFnOiBcIlNlYSBDYWxpY29cIlxuICAgIH0sXG4gICAgXCI4NjlcIjoge1xuICAgICAgICBuYW1lOiBcInNwX3BhbG1fc3Vuc2V0XCIsXG4gICAgICAgIHRhZzogXCJTdW5kb3duXCJcbiAgICB9LFxuICAgIFwiODcwXCI6IHtcbiAgICAgICAgbmFtZTogXCJzcF9wYWxtX2dyZWVuXCIsXG4gICAgICAgIHRhZzogXCJKdW5nbGUgVGhpY2tldFwiXG4gICAgfSxcbiAgICBcIjg3MVwiOiB7XG4gICAgICAgIG5hbWU6IFwic3BfdHdpZ3NfYmVhY2hcIixcbiAgICAgICAgdGFnOiBcIlN1cmZ3b29kXCJcbiAgICB9LFxuICAgIFwiODcyXCI6IHtcbiAgICAgICAgbmFtZTogXCJoeV9iYW1ib29fc3RtYXJjXCIsXG4gICAgICAgIHRhZzogXCJCYW1ib28gR2FyZGVuXCJcbiAgICB9LFxuICAgIFwiODczXCI6IHtcbiAgICAgICAgbmFtZTogXCJzb19hcXVhX3N0bWFyY1wiLFxuICAgICAgICB0YWc6IFwiU2VhYmlyZFwiXG4gICAgfSxcbiAgICBcIjg3OVwiOiB7XG4gICAgICAgIG5hbWU6IFwiYWFfZmFkZV91bXBcIixcbiAgICAgICAgdGFnOiBcIkZhZGVcIlxuICAgIH0sXG4gICAgXCI4ODBcIjoge1xuICAgICAgICBuYW1lOiBcImh5X2Rlc2VydF9ibG9vbVwiLFxuICAgICAgICB0YWc6IFwiUGFyY2hlZFwiXG4gICAgfSxcbiAgICBcIjg4NFwiOiB7XG4gICAgICAgIG5hbWU6IFwiY3VfYml6b25fcm9hZF93YXJyaW9yXCIsXG4gICAgICAgIHRhZzogXCJFbWJhcmdvXCJcbiAgICB9LFxuICAgIFwiODg1XCI6IHtcbiAgICAgICAgbmFtZTogXCJnc19hazQ3X25pYmJsZXJcIixcbiAgICAgICAgdGFnOiBcIlJhdCBSb2RcIlxuICAgIH0sXG4gICAgXCI4ODZcIjoge1xuICAgICAgICBuYW1lOiBcImN1X2F1Z193aGl0ZWZhbmdcIixcbiAgICAgICAgdGFnOiBcIkFyY3RpYyBXb2xmXCJcbiAgICB9LFxuICAgIFwiODg3XCI6IHtcbiAgICAgICAgbmFtZTogXCJjdV9hd3BfdmlydXNcIixcbiAgICAgICAgdGFnOiBcIkNvbnRhaW5tZW50IEJyZWFjaFwiXG4gICAgfSxcbiAgICBcIjg4OFwiOiB7XG4gICAgICAgIG5hbWU6IFwiZ3NfbXA1X2V0Y2hcIixcbiAgICAgICAgdGFnOiBcIkFjaWQgV2FzaFwiXG4gICAgfSxcbiAgICBcIjg4OVwiOiB7XG4gICAgICAgIG5hbWU6IFwiZ3NfdGVjOV9kZWNpbWF0b3JcIixcbiAgICAgICAgdGFnOiBcIkRlY2ltYXRvclwiXG4gICAgfSxcbiAgICBcIjg5MFwiOiB7XG4gICAgICAgIG5hbWU6IFwiY3Vfbm92YV9mZWF0aGVyc3dpbmdcIixcbiAgICAgICAgdGFnOiBcIlBsdW1lXCJcbiAgICB9LFxuICAgIFwiODkxXCI6IHtcbiAgICAgICAgbmFtZTogXCJjdV9nM3NnMV9ibGFja3NhbmRcIixcbiAgICAgICAgdGFnOiBcIkJsYWNrIFNhbmRcIlxuICAgIH0sXG4gICAgXCI4OTJcIjoge1xuICAgICAgICBuYW1lOiBcImdzX3I4X21lbWVudG9cIixcbiAgICAgICAgdGFnOiBcIk1lbWVudG9cIlxuICAgIH0sXG4gICAgXCI4OTNcIjoge1xuICAgICAgICBuYW1lOiBcImN1X21wN19yZXBsaWNhXCIsXG4gICAgICAgIHRhZzogXCJOZW9uIFBseVwiXG4gICAgfSxcbiAgICBcIjg5NFwiOiB7XG4gICAgICAgIG5hbWU6IFwiY3VfcDIwMDBfb2JzaWRpYW5cIixcbiAgICAgICAgdGFnOiBcIk9ic2lkaWFuXCJcbiAgICB9LFxuICAgIFwiODk1XCI6IHtcbiAgICAgICAgbmFtZTogXCJnc19kdWFsX2VsaXRlc19yb3NlXCIsXG4gICAgICAgIHRhZzogXCJCYWxhbmNlXCJcbiAgICB9LFxuICAgIFwiODk2XCI6IHtcbiAgICAgICAgbmFtZTogXCJzcF9zY2FyMjBfc3RyaWtlcl9kdXN0XCIsXG4gICAgICAgIHRhZzogXCJUb3JuXCJcbiAgICB9LFxuICAgIFwiODk3XCI6IHtcbiAgICAgICAgbmFtZTogXCJjdV9zZzU1M19yZWFjdG9yXCIsXG4gICAgICAgIHRhZzogXCJDb2xvbnkgSVZcIlxuICAgIH0sXG4gICAgXCI4OThcIjoge1xuICAgICAgICBuYW1lOiBcImdzX21hYzEwX3N0YWxrZXJcIixcbiAgICAgICAgdGFnOiBcIlN0YWxrZXJcIlxuICAgIH0sXG4gICAgXCI4OTlcIjoge1xuICAgICAgICBuYW1lOiBcImN1X3NzZzA4X3RpY2tsZXJcIixcbiAgICAgICAgdGFnOiBcIkJsb29kc2hvdFwiXG4gICAgfSxcbiAgICBcIjkwMFwiOiB7XG4gICAgICAgIG5hbWU6IFwiZ3NfbTI0OV93YXJiaXJkX3ZldGVyYW5cIixcbiAgICAgICAgdGFnOiBcIldhcmJpcmRcIlxuICAgIH0sXG4gICAgXCI5MDJcIjoge1xuICAgICAgICBuYW1lOiBcImFxX20yNDlfYXp0ZWNcIixcbiAgICAgICAgdGFnOiBcIkF6dGVjXCJcbiAgICB9LFxuICAgIFwiOTAzXCI6IHtcbiAgICAgICAgbmFtZTogXCJnc19kdWFsX2VsaXRlc19jbGFzc2ljXCIsXG4gICAgICAgIHRhZzogXCJFbGl0ZSAxLjZcIlxuICAgIH0sXG4gICAgXCI5MDRcIjoge1xuICAgICAgICBuYW1lOiBcImN1X2ZhbWFzX251a2VfdGVuc2lvblwiLFxuICAgICAgICB0YWc6IFwiRGVjb21taXNzaW9uZWRcIlxuICAgIH0sXG4gICAgXCI5MDVcIjoge1xuICAgICAgICBuYW1lOiBcImN1X3RlYzlfZmxhc2hcIixcbiAgICAgICAgdGFnOiBcIkZsYXNoIE91dFwiXG4gICAgfSxcbiAgICBcIjkwNlwiOiB7XG4gICAgICAgIG5hbWU6IFwiY3VfZml2ZXNldmVuX2dzZzlcIixcbiAgICAgICAgdGFnOiBcIkJ1ZGR5XCJcbiAgICB9LFxuICAgIFwiOTA3XCI6IHtcbiAgICAgICAgbmFtZTogXCJnc19wMjUwX2luZmVybm9cIixcbiAgICAgICAgdGFnOiBcIkluZmVybm9cIlxuICAgIH0sXG4gICAgXCI5MDhcIjoge1xuICAgICAgICBuYW1lOiBcImdzX21hYzEwX2R1c3RfY3JhdGVcIixcbiAgICAgICAgdGFnOiBcIkNsYXNzaWMgQ3JhdGVcIlxuICAgIH0sXG4gICAgXCI5MDlcIjoge1xuICAgICAgICBuYW1lOiBcImdzX21hZzdfcG9wZG9nXCIsXG4gICAgICAgIHRhZzogXCJQb3Bkb2dcIlxuICAgIH0sXG4gICAgXCI5MTBcIjoge1xuICAgICAgICBuYW1lOiBcImN1X21wOV9oeWRyYVwiLFxuICAgICAgICB0YWc6IFwiSHlkcmFcIlxuICAgIH0sXG4gICAgXCI5MTFcIjoge1xuICAgICAgICBuYW1lOiBcImN1X3A5MF9ub3N0YWxnaWFcIixcbiAgICAgICAgdGFnOiBcIk5vc3RhbGdpYVwiXG4gICAgfSxcbiAgICBcIjkxM1wiOiB7XG4gICAgICAgIG5hbWU6IFwiYW1fYXVnX2RlYXRoX2J5X2RvZ2d5XCIsXG4gICAgICAgIHRhZzogXCJEZWF0aCBieSBQdXBweVwiXG4gICAgfSxcbiAgICBcIjkxNFwiOiB7XG4gICAgICAgIG5hbWU6IFwiY3Vfc2Nhcl9hc3NhdWx0XCIsXG4gICAgICAgIHRhZzogXCJBc3NhdWx0XCJcbiAgICB9LFxuICAgIFwiOTE1XCI6IHtcbiAgICAgICAgbmFtZTogXCJnc19tcDVfZmJpXCIsXG4gICAgICAgIHRhZzogXCJBZ2VudFwiXG4gICAgfSxcbiAgICBcIjkxNlwiOiB7XG4gICAgICAgIG5hbWU6IFwiY3VfdW1wX2JvbWJcIixcbiAgICAgICAgdGFnOiBcIlBsYXN0aXF1ZVwiXG4gICAgfSxcbiAgICBcIjkxN1wiOiB7XG4gICAgICAgIG5hbWU6IFwiY3VfYXdwX3dpbGRmaXJlXCIsXG4gICAgICAgIHRhZzogXCJXaWxkZmlyZVwiXG4gICAgfSxcbiAgICBcIjkxOFwiOiB7XG4gICAgICAgIG5hbWU6IFwiY3VfZ2xvY2tfaGVyb1wiLFxuICAgICAgICB0YWc6IFwiU2FjcmlmaWNlXCJcbiAgICB9LFxuICAgIFwiOTE5XCI6IHtcbiAgICAgICAgbmFtZTogXCJnc19mYW1hc19sZWdhY3lfZ29sZFwiLFxuICAgICAgICB0YWc6IFwiQ29tbWVtb3JhdGlvblwiXG4gICAgfSxcbiAgICBcIjkyMFwiOiB7XG4gICAgICAgIG5hbWU6IFwiaHlfdmVuZXRvX3RhblwiLFxuICAgICAgICB0YWc6IFwiQm9yb3F1ZSBTYW5kXCJcbiAgICB9LFxuICAgIFwiOTIxXCI6IHtcbiAgICAgICAgbmFtZTogXCJnc19hazQ3X2dvbGRfYXJhYmVzcXVlXCIsXG4gICAgICAgIHRhZzogXCJHb2xkIEFyYWJlc3F1ZVwiXG4gICAgfSxcbiAgICBcIjkyMlwiOiB7XG4gICAgICAgIG5hbWU6IFwiYW1fbGl6YXJkX3JlZFwiLFxuICAgICAgICB0YWc6IFwiT3JhbmdlIEFub2xpc1wiXG4gICAgfSxcbiAgICBcIjkyM1wiOiB7XG4gICAgICAgIG5hbWU6IFwiZ3NfbXA1X25lb25fZmxla3Rhcm5cIixcbiAgICAgICAgdGFnOiBcIk94aWRlIE9hc2lzXCJcbiAgICB9LFxuICAgIFwiOTI0XCI6IHtcbiAgICAgICAgbmFtZTogXCJoeV9icnVzaF9jYW1vX3RhblwiLFxuICAgICAgICB0YWc6IFwiRGVzZXJ0IEJydXNoXCJcbiAgICB9LFxuICAgIFwiOTI1XCI6IHtcbiAgICAgICAgbmFtZTogXCJoeV9kZHBhdF9kZXNlcnRcIixcbiAgICAgICAgdGFnOiBcIkRlc2VydCBERFBBVFwiXG4gICAgfSxcbiAgICBcIjkyNlwiOiB7XG4gICAgICAgIG5hbWU6IFwiaHlfZGRwYXRfdXJiYW5fcmVkXCIsXG4gICAgICAgIHRhZzogXCJSZWQgRERQQVRcIlxuICAgIH0sXG4gICAgXCI5MjdcIjoge1xuICAgICAgICBuYW1lOiBcImh5X2RyeV93b29kXCIsXG4gICAgICAgIHRhZzogXCJTcGFsdGVkIFdvb2RcIlxuICAgIH0sXG4gICAgXCI5MjhcIjoge1xuICAgICAgICBuYW1lOiBcImh5X2Rlc2VydF9tdWx0aWNhbVwiLFxuICAgICAgICB0YWc6IFwiQmxhY2sgJiBUYW5cIlxuICAgIH0sXG4gICAgXCI5MjlcIjoge1xuICAgICAgICBuYW1lOiBcImh5X3Rvcm5fY2Ftb19wYWludHNcIixcbiAgICAgICAgdGFnOiBcIlF1aWNrIFNhbmRcIlxuICAgIH0sXG4gICAgXCI5MzBcIjoge1xuICAgICAgICBuYW1lOiBcInNwX21vcm9fY2FydmluZ19saWdodGJsdWVcIixcbiAgICAgICAgdGFnOiBcIk5ldyBSb290c1wiXG4gICAgfSxcbiAgICBcIjkzMVwiOiB7XG4gICAgICAgIG5hbWU6IFwic3BfbW9yb19jYXJ2aW5nX3llbGxvd1wiLFxuICAgICAgICB0YWc6IFwiT2xkIFJvb3RzXCJcbiAgICB9LFxuICAgIFwiOTMyXCI6IHtcbiAgICAgICAgbmFtZTogXCJzcF9tb3JvX3RleHRpbGVfcHVycGxlX3llbGxvd1wiLFxuICAgICAgICB0YWc6IFwiV2l0aGVyZWQgVmluZVwiXG4gICAgfSxcbiAgICBcIjkzM1wiOiB7XG4gICAgICAgIG5hbWU6IFwic3BfcGFsbV9uaWdodFwiLFxuICAgICAgICB0YWc6IFwiTWlkbmlnaHQgUGFsbVwiXG4gICAgfSxcbiAgICBcIjkzNFwiOiB7XG4gICAgICAgIG5hbWU6IFwic3BfZGVzZXJ0X3NrdWxsc1wiLFxuICAgICAgICB0YWc6IFwiQmxlYWNoZWRcIlxuICAgIH0sXG4gICAgXCI5MzVcIjoge1xuICAgICAgICBuYW1lOiBcInNwX3plYnJhY2FtX3JlZFwiLFxuICAgICAgICB0YWc6IFwiUHJleVwiXG4gICAgfSxcbiAgICBcIjk0MVwiOiB7XG4gICAgICAgIG5hbWU6IFwiY3VfYWstNDdfcGhhbnRvbV9kaXNydXB0b3JcIixcbiAgICAgICAgdGFnOiBcIlBoYW50b20gRGlzcnVwdG9yXCJcbiAgICB9LFxuICAgIFwiOTQyXCI6IHtcbiAgICAgICAgbmFtZTogXCJnc19hdWdfdGh1bmRlcnN0b3JtXCIsXG4gICAgICAgIHRhZzogXCJUb20gQ2F0XCJcbiAgICB9LFxuICAgIFwiOTQzXCI6IHtcbiAgICAgICAgbmFtZTogXCJjdV9hd3BfdmVpblwiLFxuICAgICAgICB0YWc6IFwiQ2FwaWxsYXJ5XCJcbiAgICB9LFxuICAgIFwiOTQ0XCI6IHtcbiAgICAgICAgbmFtZTogXCJjdV9jejc1X2NlcmFrb3RlXCIsXG4gICAgICAgIHRhZzogXCJEaXN0cmVzc2VkXCJcbiAgICB9LFxuICAgIFwiOTQ1XCI6IHtcbiAgICAgICAgbmFtZTogXCJjdV9kZWFnbGVfcmVwbGljYVwiLFxuICAgICAgICB0YWc6IFwiQmx1ZSBQbHlcIlxuICAgIH0sXG4gICAgXCI5NDZcIjoge1xuICAgICAgICBuYW1lOiBcImN1X200YTFzX2NzZ28yMDQ4XCIsXG4gICAgICAgIHRhZzogXCJQbGF5ZXIgVHdvXCJcbiAgICB9LFxuICAgIFwiOTQ3XCI6IHtcbiAgICAgICAgbmFtZTogXCJjdV9tYWMxMF9uYWNyZVwiLFxuICAgICAgICB0YWc6IFwiRGlzY28gVGVjaFwiXG4gICAgfSxcbiAgICBcIjk0OFwiOiB7XG4gICAgICAgIG5hbWU6IFwiZ3NfbWFnN19qdXN0aWNlXCIsXG4gICAgICAgIHRhZzogXCJKdXN0aWNlXCJcbiAgICB9LFxuICAgIFwiOTQ5XCI6IHtcbiAgICAgICAgbmFtZTogXCJjdV9tcDVfZGVzZXJ0X3N0cmlrZVwiLFxuICAgICAgICB0YWc6IFwiRGVzZXJ0IFN0cmlrZVwiXG4gICAgfSxcbiAgICBcIjk1MFwiOiB7XG4gICAgICAgIG5hbWU6IFwiY3VfbmVnZXZfcHJvdG90eXBlXCIsXG4gICAgICAgIHRhZzogXCJQcm90b3R5cGVcIlxuICAgIH0sXG4gICAgXCI5NTFcIjoge1xuICAgICAgICBuYW1lOiBcImFxX3AyMDAwX2FjaWRfY2xvdmVyXCIsXG4gICAgICAgIHRhZzogXCJBY2lkIEV0Y2hlZFwiXG4gICAgfSxcbiAgICBcIjk1MlwiOiB7XG4gICAgICAgIG5hbWU6IFwiZ3NfcjhfbGV2aWF0aGFuXCIsXG4gICAgICAgIHRhZzogXCJCb25lIEZvcmdlZFwiXG4gICAgfSxcbiAgICBcIjk1M1wiOiB7XG4gICAgICAgIG5hbWU6IFwiY3Vfc2F3ZWRvZmZfYXBvY2FseXB0b1wiLFxuICAgICAgICB0YWc6IFwiQXBvY2FseXB0b1wiXG4gICAgfSxcbiAgICBcIjk1NFwiOiB7XG4gICAgICAgIG5hbWU6IFwiZ3Nfc2NhcjIwX2VuZm9yY2VyXCIsXG4gICAgICAgIHRhZzogXCJFbmZvcmNlclwiXG4gICAgfSxcbiAgICBcIjk1NVwiOiB7XG4gICAgICAgIG5hbWU6IFwiY3Vfc2c1NTNfZGFya3dpbmdcIixcbiAgICAgICAgdGFnOiBcIkRhcmt3aW5nXCJcbiAgICB9LFxuICAgIFwiOTU2XCI6IHtcbiAgICAgICAgbmFtZTogXCJjdV9zc2cwOF9mZXZlcl9kcmVhbVwiLFxuICAgICAgICB0YWc6IFwiRmV2ZXIgRHJlYW1cIlxuICAgIH0sXG4gICAgXCI5NTdcIjoge1xuICAgICAgICBuYW1lOiBcImN1X2dsb2NrMThfd2FybWFpZGVuXCIsXG4gICAgICAgIHRhZzogXCJCdWxsZXQgUXVlZW5cIlxuICAgIH0sXG4gICAgXCI5NThcIjoge1xuICAgICAgICBuYW1lOiBcImN1X25lZ2V2X3VsdHJhbGlnaHRcIixcbiAgICAgICAgdGFnOiBcIlVsdHJhbGlnaHRcIlxuICAgIH0sXG4gICAgXCI5NTlcIjoge1xuICAgICAgICBuYW1lOiBcImN1X2FrNDdfYW51YmlzXCIsXG4gICAgICAgIHRhZzogXCJMZWdpb24gb2YgQW51YmlzXCJcbiAgICB9LFxuICAgIFwiOTYwXCI6IHtcbiAgICAgICAgbmFtZTogXCJhcV9wMjAwMF9sb3N0X3dvcmxkXCIsXG4gICAgICAgIHRhZzogXCJHbmFybGVkXCJcbiAgICB9LFxuICAgIFwiOTYxXCI6IHtcbiAgICAgICAgbmFtZTogXCJjdV9tYWc3X21vbnN0ZXJfY2FsbFwiLFxuICAgICAgICB0YWc6IFwiTW9uc3RlciBDYWxsXCJcbiAgICB9LFxuICAgIFwiOTYyXCI6IHtcbiAgICAgICAgbmFtZTogXCJjdV9kZWFnX3ByaW50c3RyZWFtXCIsXG4gICAgICAgIHRhZzogXCJQcmludHN0cmVhbVwiXG4gICAgfSxcbiAgICBcIjk2M1wiOiB7XG4gICAgICAgIG5hbWU6IFwiY3VfZ2xvY2tfZXllY29udGFjdFwiLFxuICAgICAgICB0YWc6IFwiVm9ndWVcIlxuICAgIH0sXG4gICAgXCI5NjRcIjoge1xuICAgICAgICBuYW1lOiBcImdzX3RlYzlfZ3VlcmlsbGFcIixcbiAgICAgICAgdGFnOiBcIkJyb3RoZXJcIlxuICAgIH0sXG4gICAgXCI5NjVcIjoge1xuICAgICAgICBuYW1lOiBcImN1X21hYzEwX2lzb29ubmFcIixcbiAgICAgICAgdGFnOiBcIkFsbHVyZVwiXG4gICAgfSxcbiAgICBcIjk2NlwiOiB7XG4gICAgICAgIG5hbWU6IFwiZ3Nfc2c1NTNfcnVzdHlcIixcbiAgICAgICAgdGFnOiBcIk9sJyBSdXN0eVwiXG4gICAgfSxcbiAgICBcIjk2N1wiOiB7XG4gICAgICAgIG5hbWU6IFwiY3Vfc3NnMDhfbWFpbmZyYW1lXCIsXG4gICAgICAgIHRhZzogXCJNYWluZnJhbWUgMDAxXCJcbiAgICB9LFxuICAgIFwiOTY4XCI6IHtcbiAgICAgICAgbmFtZTogXCJjdV9wMjUwX2Nhc3NldHRlXCIsXG4gICAgICAgIHRhZzogXCJDYXNzZXR0ZVwiXG4gICAgfSxcbiAgICBcIjk2OVwiOiB7XG4gICAgICAgIG5hbWU6IFwiZ3NfcDkwX2NvbnRhaW5lclwiLFxuICAgICAgICB0YWc6IFwiRnJlaWdodFwiXG4gICAgfSxcbiAgICBcIjk3MFwiOiB7XG4gICAgICAgIG5hbWU6IFwiY3VfeG0xMDE0X2FtdWxldF9ibHVlXCIsXG4gICAgICAgIHRhZzogXCJFbnRvbWJlZFwiXG4gICAgfSxcbiAgICBcIjk3MVwiOiB7XG4gICAgICAgIG5hbWU6IFwiY3VfbTRhNF9xdWVlbmZhaXJ5XCIsXG4gICAgICAgIHRhZzogXCJUb290aCBGYWlyeVwiXG4gICAgfSxcbiAgICBcIjk3MlwiOiB7XG4gICAgICAgIG5hbWU6IFwiZ3NfZ2FsaWxfcGhvZW5peFwiLFxuICAgICAgICB0YWc6IFwiQ29ubmV4aW9uXCJcbiAgICB9LFxuICAgIFwiOTczXCI6IHtcbiAgICAgICAgbmFtZTogXCJnc19iaXpvbl9oZWxscmFpZGVyXCIsXG4gICAgICAgIHRhZzogXCJSdW5pY1wiXG4gICAgfSxcbiAgICBcIjk3NFwiOiB7XG4gICAgICAgIG5hbWU6IFwiZ3NfbXA1c2Rfd2FzdGVsYW5kX2xlZ2FjeVwiLFxuICAgICAgICB0YWc6IFwiS2l0YmFzaFwiXG4gICAgfSxcbiAgICBcIjk3NVwiOiB7XG4gICAgICAgIG5hbWU6IFwiZ3NfYXdwX2V4b3NrZWxldG9uXCIsXG4gICAgICAgIHRhZzogXCJFeG9za2VsZXRvblwiXG4gICAgfSxcbiAgICBcIjk3NlwiOiB7XG4gICAgICAgIG5hbWU6IFwiZ3NfY3o3NV92ZW5kZXR0YVwiLFxuICAgICAgICB0YWc6IFwiVmVuZGV0dGFcIlxuICAgIH0sXG4gICAgXCI5NzdcIjoge1xuICAgICAgICBuYW1lOiBcImh5X3A5MF9kaW5vX3JhbXBhZ2VcIixcbiAgICAgICAgdGFnOiBcIkNvY29hIFJhbXBhZ2VcIlxuICAgIH0sXG4gICAgXCI5NzhcIjoge1xuICAgICAgICBuYW1lOiBcImdzX2R1YWxfZWxpdGVzX2RlemFzdHJlXCIsXG4gICAgICAgIHRhZzogXCJEZXphc3RyZVwiXG4gICAgfSxcbiAgICBcIjk3OVwiOiB7XG4gICAgICAgIG5hbWU6IFwiY3VfZml2ZV9zZXZlbl9kaWFyeVwiLFxuICAgICAgICB0YWc6IFwiRmFpcnkgVGFsZVwiXG4gICAgfSxcbiAgICBcIjk4MFwiOiB7XG4gICAgICAgIG5hbWU6IFwiZ3NfZzNzZzFfZGlzcnVwdFwiLFxuICAgICAgICB0YWc6IFwiRGlnaXRhbCBNZXNoXCJcbiAgICB9LFxuICAgIFwiOTgxXCI6IHtcbiAgICAgICAgbmFtZTogXCJnc19nYWxpbF92YW5kYWxcIixcbiAgICAgICAgdGFnOiBcIlZhbmRhbFwiXG4gICAgfSxcbiAgICBcIjk4MlwiOiB7XG4gICAgICAgIG5hbWU6IFwiY3VfcDI1MF9pbmZlY3RcIixcbiAgICAgICAgdGFnOiBcIkNvbnRhbWluYW50XCJcbiAgICB9LFxuICAgIFwiOTgzXCI6IHtcbiAgICAgICAgbmFtZTogXCJjdV9tMjQ5X2RlZXBfcmVsaWVmXCIsXG4gICAgICAgIHRhZzogXCJEZWVwIFJlbGllZlwiXG4gICAgfSxcbiAgICBcIjk4NFwiOiB7XG4gICAgICAgIG5hbWU6IFwiY3VfbTRhMXNfcHJpbnRzdHJlYW1cIixcbiAgICAgICAgdGFnOiBcIlByaW50c3RyZWFtXCJcbiAgICB9LFxuICAgIFwiOTg1XCI6IHtcbiAgICAgICAgbmFtZTogXCJjdV9tNGE0X2N5YmVycHVua1wiLFxuICAgICAgICB0YWc6IFwiQ3liZXIgU2VjdXJpdHlcIlxuICAgIH0sXG4gICAgXCI5ODZcIjoge1xuICAgICAgICBuYW1lOiBcImdzX21wNV9jb25kaXRpb256ZXJvXCIsXG4gICAgICAgIHRhZzogXCJDb25kaXRpb24gWmVyb1wiXG4gICAgfSxcbiAgICBcIjk4N1wiOiB7XG4gICAgICAgIG5hbWU6IFwiY3Vfbm92YV9wb2x5bWVyXCIsXG4gICAgICAgIHRhZzogXCJDbGVhciBQb2x5bWVyXCJcbiAgICB9LFxuICAgIFwiOTg4XCI6IHtcbiAgICAgICAgbmFtZTogXCJjdV9nbG9ja19ub2lyXCIsXG4gICAgICAgIHRhZzogXCJOZW8tTm9pclwiXG4gICAgfSxcbiAgICBcIjk4OVwiOiB7XG4gICAgICAgIG5hbWU6IFwiY3Vfc3NnMDhfY2hyb21hdGljXCIsXG4gICAgICAgIHRhZzogXCJQYXJhbGxheFwiXG4gICAgfSxcbiAgICBcIjk5MFwiOiB7XG4gICAgICAgIG5hbWU6IFwiZ3NfdW1wX2dvbGRfYmlzbXV0aFwiLFxuICAgICAgICB0YWc6IFwiR29sZCBCaXNtdXRoXCJcbiAgICB9LFxuICAgIFwiOTkxXCI6IHtcbiAgICAgICAgbmFtZTogXCJjdV91c3Bfa3Jva29zXCIsXG4gICAgICAgIHRhZzogXCJNb25zdGVyIE1hc2h1cFwiXG4gICAgfSxcbiAgICBcIjk5MlwiOiB7XG4gICAgICAgIG5hbWU6IFwiYW1fbnVtYmVyc19icm9uemVcIixcbiAgICAgICAgdGFnOiBcIlRoZSBCcm9uemVcIlxuICAgIH0sXG4gICAgXCI5OTNcIjoge1xuICAgICAgICBuYW1lOiBcImN1X2NzZ29fY2Ftb1wiLFxuICAgICAgICB0YWc6IFwiR2xvYmFsIE9mZmVuc2l2ZVwiXG4gICAgfSxcbiAgICBcIjk5NFwiOiB7XG4gICAgICAgIG5hbWU6IFwiYW1fYXV0aG9yaXR5X2Jyb3duXCIsXG4gICAgICAgIHRhZzogXCJDaGFydGVyXCJcbiAgICB9LFxuICAgIFwiOTk1XCI6IHtcbiAgICAgICAgbmFtZTogXCJhbV9pbnRlbGxpZ2VuY2VfZ3JleVwiLFxuICAgICAgICB0YWc6IFwiU3VydmVpbGxhbmNlXCJcbiAgICB9LFxuICAgIFwiOTk2XCI6IHtcbiAgICAgICAgbmFtZTogXCJhbV9pbnRlbGxpZ2VuY2Vfb3JhbmdlXCIsXG4gICAgICAgIHRhZzogXCJUaHJlYXQgRGV0ZWN0ZWRcIlxuICAgIH0sXG4gICAgXCI5OTdcIjoge1xuICAgICAgICBuYW1lOiBcImFtX251bWJlcnNfcmVkX2JsdWVcIixcbiAgICAgICAgdGFnOiBcIkRpc3BhdGNoXCJcbiAgICB9LFxuICAgIFwiOTk4XCI6IHtcbiAgICAgICAgbmFtZTogXCJoeV9udW1iZXJzX2dyZWVuXCIsXG4gICAgICAgIHRhZzogXCJTd2l0Y2ggQm9hcmRcIlxuICAgIH0sXG4gICAgXCI5OTlcIjoge1xuICAgICAgICBuYW1lOiBcImFtX251bWJlcnNfbWFnZW50YVwiLFxuICAgICAgICB0YWc6IFwiUHJpbWUgQ29uc3BpcmFjeVwiXG4gICAgfSxcbiAgICBcIjEwMDBcIjoge1xuICAgICAgICBuYW1lOiBcImN1X2phZ3Vhcl9wOTBcIixcbiAgICAgICAgdGFnOiBcIlJ1biBhbmQgSGlkZVwiXG4gICAgfSxcbiAgICBcIjEwMDFcIjoge1xuICAgICAgICBuYW1lOiBcImN1X200YTFfc25ha2VcIixcbiAgICAgICAgdGFnOiBcIldlbGNvbWUgdG8gdGhlIEp1bmdsZVwiXG4gICAgfSxcbiAgICBcIjEwMDJcIjoge1xuICAgICAgICBuYW1lOiBcImFhX2ZhZGVfcmVkX2JsdWVcIixcbiAgICAgICAgdGFnOiBcIkJlcnJpZXMgQW5kIENoZXJyaWVzXCJcbiAgICB9LFxuICAgIFwiMTAwM1wiOiB7XG4gICAgICAgIG5hbWU6IFwiY3VfdW1wX2NyaW1lX3NjZW5lXCIsXG4gICAgICAgIHRhZzogXCJDcmltZSBTY2VuZVwiXG4gICAgfSxcbiAgICBcIjEwMDRcIjoge1xuICAgICAgICBuYW1lOiBcImN1X2FrX3hyYXlcIixcbiAgICAgICAgdGFnOiBcIlgtUmF5XCJcbiAgICB9LFxuICAgIFwiMTAwNVwiOiB7XG4gICAgICAgIG5hbWU6IFwiYW1faGVpc3RfcGxhbnNfZ3JlZW5cIixcbiAgICAgICAgdGFnOiBcIkhlaXN0XCJcbiAgICB9LFxuICAgIFwiMTAwNlwiOiB7XG4gICAgICAgIG5hbWU6IFwiYW1faGVpc3RfcGxhbnNfcHVycGxlXCIsXG4gICAgICAgIHRhZzogXCJOaWdodCBIZWlzdFwiXG4gICAgfSxcbiAgICBcIjEwMDdcIjoge1xuICAgICAgICBuYW1lOiBcImFtX2hlaXN0X3BsYW5zX3llbGxvd1wiLFxuICAgICAgICB0YWc6IFwiVmF1bHQgSGVpc3RcIlxuICAgIH0sXG4gICAgXCIxMDA4XCI6IHtcbiAgICAgICAgbmFtZTogXCJoeV9ob3VuZHN0b290aF9icm93blwiLFxuICAgICAgICB0YWc6IFwiSG91bmRzdG9vdGhcIlxuICAgIH0sXG4gICAgXCIxMDA5XCI6IHtcbiAgICAgICAgbmFtZTogXCJnc19tYWMxMF9zbmFrZVwiLFxuICAgICAgICB0YWc6IFwiSG90IFNuYWtlc1wiXG4gICAgfSxcbiAgICBcIjEwMTBcIjoge1xuICAgICAgICBuYW1lOiBcImh5X3Bob2VuaXhfdGFnc19saWxhY1wiLFxuICAgICAgICB0YWc6IFwiUGhvZW5peCBDaGFsa1wiXG4gICAgfSxcbiAgICBcIjEwMTFcIjoge1xuICAgICAgICBuYW1lOiBcImFtX3Bob2VuaXhfdGFnc19ibHVlXCIsXG4gICAgICAgIHRhZzogXCJQaG9lbml4IE1hcmtlclwiXG4gICAgfSxcbiAgICBcIjEwMTJcIjoge1xuICAgICAgICBuYW1lOiBcImh5X3Bob2VuaXhfdGFnc19yZWRcIixcbiAgICAgICAgdGFnOiBcIlBob2VuaXggU3RlbmNpbFwiXG4gICAgfSxcbiAgICBcIjEwMTNcIjoge1xuICAgICAgICBuYW1lOiBcInNwX3Bob2VuaXhfdGFnc19wdXJwbGVcIixcbiAgICAgICAgdGFnOiBcIlBob2VuaXggQmxhY2tsaWdodFwiXG4gICAgfSxcbiAgICBcIjEwMTRcIjoge1xuICAgICAgICBuYW1lOiBcImh5X3RpZ2Vyc190YW5cIixcbiAgICAgICAgdGFnOiBcIkNsYXkgQW1idXNoXCJcbiAgICB9LFxuICAgIFwiMTAxNVwiOiB7XG4gICAgICAgIG5hbWU6IFwiYW1fdGlnZXJzX2Jyb3duXCIsXG4gICAgICAgIHRhZzogXCJUaWdlciBQaXRcIlxuICAgIH0sXG4gICAgXCIxMDE2XCI6IHtcbiAgICAgICAgbmFtZTogXCJjdV9tb25leV9nbG9ja1wiLFxuICAgICAgICB0YWc6IFwiRnJhbmtsaW5cIlxuICAgIH0sXG4gICAgXCIxMDE3XCI6IHtcbiAgICAgICAgbmFtZTogXCJhbV9tNGExc19ibHVlc21va2VcIixcbiAgICAgICAgdGFnOiBcIkJsdWUgUGhvc3Bob3JcIlxuICAgIH0sXG4gICAgXCIxMDE4XCI6IHtcbiAgICAgICAgbmFtZTogXCJjdV9ha19qYWd1YXJcIixcbiAgICAgICAgdGFnOiBcIlBhbnRoZXJhIG9uY2FcIlxuICAgIH0sXG4gICAgXCIxMDE5XCI6IHtcbiAgICAgICAgbmFtZTogXCJhbV9ibGFja19wYW50aGVyXCIsXG4gICAgICAgIHRhZzogXCJQYW50aGVyIENhbW9cIlxuICAgIH0sXG4gICAgXCIxMDIwXCI6IHtcbiAgICAgICAgbmFtZTogXCJhYV9hbmNpZW50X2Jyb3duXCIsXG4gICAgICAgIHRhZzogXCJBbmNpZW50IEVhcnRoXCJcbiAgICB9LFxuICAgIFwiMTAyMVwiOiB7XG4gICAgICAgIG5hbWU6IFwiYW1fYW5jaWVudF93YXJtXCIsXG4gICAgICAgIHRhZzogXCJBbmNpZW50IExvcmVcIlxuICAgIH0sXG4gICAgXCIxMDIyXCI6IHtcbiAgICAgICAgbmFtZTogXCJhYV9ydWluc19ncmVlblwiLFxuICAgICAgICB0YWc6IFwiTHVzaCBSdWluc1wiXG4gICAgfSxcbiAgICBcIjEwMjNcIjoge1xuICAgICAgICBuYW1lOiBcImh5X2RyeXdvb2RfZ3JlZW5cIixcbiAgICAgICAgdGFnOiBcIlRhbGwgR3Jhc3NcIlxuICAgIH0sXG4gICAgXCIxMDI0XCI6IHtcbiAgICAgICAgbmFtZTogXCJoeV9hbmNpZW50X3RpbGVzX3BlYWNoXCIsXG4gICAgICAgIHRhZzogXCJCbGFzdCBGcm9tIHRoZSBQYXN0XCJcbiAgICB9LFxuICAgIFwiMTAyNVwiOiB7XG4gICAgICAgIG5hbWU6IFwiYW1fZ29sZF9icmlja1wiLFxuICAgICAgICB0YWc6IFwiR29sZCBCcmlja1wiXG4gICAgfSxcbiAgICBcIjEwMjZcIjoge1xuICAgICAgICBuYW1lOiBcImFhX2F3cF9mYWRlXCIsXG4gICAgICAgIHRhZzogXCJGYWRlXCJcbiAgICB9LFxuICAgIFwiMTAyN1wiOiB7XG4gICAgICAgIG5hbWU6IFwiYW1faW50ZWxsaWdlbmNlX21hZ2VudGFcIixcbiAgICAgICAgdGFnOiBcIlRhcmdldCBBY3F1aXJlZFwiXG4gICAgfSxcbiAgICBcIjEwMjhcIjoge1xuICAgICAgICBuYW1lOiBcImh5X2F1dGhvcml0eV9wdXJwbGVcIixcbiAgICAgICAgdGFnOiBcIk1hZ25hIENhcnRhXCJcbiAgICB9LFxuICAgIFwiMTAyOVwiOiB7XG4gICAgICAgIG5hbWU6IFwiYW1fdGlnZXJzX2JsdWVcIixcbiAgICAgICAgdGFnOiBcIlNpbGsgVGlnZXJcIlxuICAgIH0sXG4gICAgXCIxMDMwXCI6IHtcbiAgICAgICAgbmFtZTogXCJoeV9wMjUwX3RpZ2VyXCIsXG4gICAgICAgIHRhZzogXCJCZW5nYWwgVGlnZXJcIlxuICAgIH0sXG4gICAgXCIxMDMxXCI6IHtcbiAgICAgICAgbmFtZTogXCJzcF9hbmNpZW50X2JyaWdodFwiLFxuICAgICAgICB0YWc6IFwiQW5jaWVudCBWaXNpb25zXCJcbiAgICB9LFxuICAgIFwiMTAzMlwiOiB7XG4gICAgICAgIG5hbWU6IFwiaHlfcnVpbnNfcmVkXCIsXG4gICAgICAgIHRhZzogXCJEdXNrIFJ1aW5zXCJcbiAgICB9LFxuICAgIFwiMTAzM1wiOiB7XG4gICAgICAgIG5hbWU6IFwiYW1famFkZVwiLFxuICAgICAgICB0YWc6IFwiQ2FydmVkIEphZGVcIlxuICAgIH0sXG4gICAgXCIxMDM0XCI6IHtcbiAgICAgICAgbmFtZTogXCJhbV9hbmNpZW50X3dpbmVcIixcbiAgICAgICAgdGFnOiBcIkFuY2llbnQgUml0dWFsXCJcbiAgICB9LFxuICAgIFwiMTAzNVwiOiB7XG4gICAgICAgIG5hbWU6IFwiZ3NfYWs0N19wcm9mZXNzaW9uYWxcIixcbiAgICAgICAgdGFnOiBcIlNsYXRlXCJcbiAgICB9LFxuICAgIFwiMTAzNlwiOiB7XG4gICAgICAgIG5hbWU6IFwiY3VfY3o3NV93aGlybHdpbmRcIixcbiAgICAgICAgdGFnOiBcIkNpcmNhZXR1c1wiXG4gICAgfSxcbiAgICBcIjEwMzdcIjoge1xuICAgICAgICBuYW1lOiBcImN1X21wOV9mb29kX2NoYWluXCIsXG4gICAgICAgIHRhZzogXCJGb29kIENoYWluXCJcbiAgICB9LFxuICAgIFwiMTAzOFwiOiB7XG4gICAgICAgIG5hbWU6IFwiY3VfZ2FsaWxfY2hyb21hX3BpbmtcIixcbiAgICAgICAgdGFnOiBcIkNocm9tYXRpYyBBYmVycmF0aW9uXCJcbiAgICB9LFxuICAgIFwiMTAzOVwiOiB7XG4gICAgICAgIG5hbWU6IFwiZ3NfZ2xvY2tfcG9seW1lclwiLFxuICAgICAgICB0YWc6IFwiQ2xlYXIgUG9seW1lclwiXG4gICAgfSxcbiAgICBcIjEwNDBcIjoge1xuICAgICAgICBuYW1lOiBcImdzX3VzcHNfaGFuZ2VkbWFuXCIsXG4gICAgICAgIHRhZzogXCJUaGUgVHJhaXRvclwiXG4gICAgfSxcbiAgICBcIjEwNDFcIjoge1xuICAgICAgICBuYW1lOiBcImN1X200YTRfbG92ZVwiLFxuICAgICAgICB0YWc6IFwiSW4gTGl2aW5nIENvbG9yXCJcbiAgICB9LFxuICAgIFwiMTA0MlwiOiB7XG4gICAgICAgIG5hbWU6IFwiZ3NfbTI0OV9jb21iaW5lXCIsXG4gICAgICAgIHRhZzogXCJPLlMuSS5QLlIuXCJcbiAgICB9LFxuICAgIFwiMTA0M1wiOiB7XG4gICAgICAgIG5hbWU6IFwiY3VfbmVnZXZfZGV2dGV4dHVyZVwiLFxuICAgICAgICB0YWc6IFwiZGV2X3RleHR1cmVcIlxuICAgIH0sXG4gICAgXCIxMDQ0XCI6IHtcbiAgICAgICAgbmFtZTogXCJnc19wMjUwX2N5YmVyc2hlbGxcIixcbiAgICAgICAgdGFnOiBcIkN5YmVyIFNoZWxsXCJcbiAgICB9LFxuICAgIFwiMTA0NVwiOiB7XG4gICAgICAgIG5hbWU6IFwiY3VfbWFjMTBfcG9ydGFibGVcIixcbiAgICAgICAgdGFnOiBcIkJ1dHRvbiBNYXNoZXJcIlxuICAgIH0sXG4gICAgXCIxMDQ2XCI6IHtcbiAgICAgICAgbmFtZTogXCJhcV94bTEwMTRfcHVua1wiLFxuICAgICAgICB0YWc6IFwiWE9YT1wiXG4gICAgfSxcbiAgICBcIjEwNDdcIjoge1xuICAgICAgICBuYW1lOiBcImdzX3I4X3J1c3RraW5nXCIsXG4gICAgICAgIHRhZzogXCJKdW5rIFlhcmRcIlxuICAgIH0sXG4gICAgXCIxMDQ4XCI6IHtcbiAgICAgICAgbmFtZTogXCJnc19zZzU1M19kZWF0aG1ldGFsXCIsXG4gICAgICAgIHRhZzogXCJIZWF2eSBNZXRhbFwiXG4gICAgfSxcbiAgICBcIjEwNDlcIjoge1xuICAgICAgICBuYW1lOiBcImFtX3VtcDQ1X2VsZWN0cm93YXZlXCIsXG4gICAgICAgIHRhZzogXCJPc2NpbGxhdG9yXCJcbiAgICB9LFxuICAgIFwiMTA1MFwiOiB7XG4gICAgICAgIG5hbWU6IFwiY3VfZGVhZ190cmlnZ2VyX2Rpc2NpcGxpbmVcIixcbiAgICAgICAgdGFnOiBcIlRyaWdnZXIgRGlzY2lwbGluZVwiXG4gICAgfSxcbiAgICBcIjEwNTFcIjoge1xuICAgICAgICBuYW1lOiBcInNwX25vdmFfd2luZF9kaXNwZXJzYWxcIixcbiAgICAgICAgdGFnOiBcIldpbmRibG93blwiXG4gICAgfSxcbiAgICBcIjEwNTJcIjoge1xuICAgICAgICBuYW1lOiBcImN1X3NzZzA4X3Njb3JwaW9uXCIsXG4gICAgICAgIHRhZzogXCJEZWF0aCBTdHJpa2VcIlxuICAgIH0sXG4gICAgXCIxMDUzXCI6IHtcbiAgICAgICAgbmFtZTogXCJhbV9udWNsZWFyX3BhdHRlcm40X2ZhbWFzXCIsXG4gICAgICAgIHRhZzogXCJNZWx0ZG93blwiXG4gICAgfSxcbiAgICBcIjEwNTVcIjoge1xuICAgICAgICBuYW1lOiBcImFhX3NwYWNlcmFjZV9vcmFuZ2VcIixcbiAgICAgICAgdGFnOiBcIlNwYWNlIFJhY2VcIlxuICAgIH0sXG4gICAgXCIxMDU2XCI6IHtcbiAgICAgICAgbmFtZTogXCJzcF9zcGFjZXJhY2VfYmx1ZVwiLFxuICAgICAgICB0YWc6IFwiU3B1dG5pa1wiXG4gICAgfSxcbiAgICBcIjEwNThcIjoge1xuICAgICAgICBuYW1lOiBcImh5X3RlY2hub3dhcl9yd2JcIixcbiAgICAgICAgdGFnOiBcIlBPUCBBV1BcIlxuICAgIH0sXG4gICAgXCIxMDU5XCI6IHtcbiAgICAgICAgbmFtZTogXCJzcF90ZWNobm93YXJfcmVkXCIsXG4gICAgICAgIHRhZzogXCJGaXp6eSBQT1BcIlxuICAgIH0sXG4gICAgXCIxMDYwXCI6IHtcbiAgICAgICAgbmFtZTogXCJoeV90cmFpbmFyY2hpdGVjdF9ncmVlblwiLFxuICAgICAgICB0YWc6IFwiU3ByaW5nIFR3aWxseVwiXG4gICAgfSxcbiAgICBcIjEwNjFcIjoge1xuICAgICAgICBuYW1lOiBcImh5X3RyYWluYXJjaGl0ZWN0XCIsXG4gICAgICAgIHRhZzogXCJBdXR1bW4gVHdpbGx5XCJcbiAgICB9LFxuICAgIFwiMTA2M1wiOiB7XG4gICAgICAgIG5hbWU6IFwiZ3NfbTRhNF9jb2FsaXRpb25cIixcbiAgICAgICAgdGFnOiBcIlRoZSBDb2FsaXRpb25cIlxuICAgIH0sXG4gICAgXCIxMDY0XCI6IHtcbiAgICAgICAgbmFtZTogXCJnc190cmFpbl9jejc1XCIsXG4gICAgICAgIHRhZzogXCJTeW5kaWNhdGVcIlxuICAgIH0sXG4gICAgXCIxMDY1XCI6IHtcbiAgICAgICAgbmFtZTogXCJzb193aGl0ZW91dF9yaXB0aWRlXCIsXG4gICAgICAgIHRhZzogXCJXaGl0ZW91dFwiXG4gICAgfSxcbiAgICBcIjEwNjZcIjoge1xuICAgICAgICBuYW1lOiBcImFhX3dpcmluZ195ZWxsb3dcIixcbiAgICAgICAgdGFnOiBcIkZhdWx0eSBXaXJpbmdcIlxuICAgIH0sXG4gICAgXCIxMDY3XCI6IHtcbiAgICAgICAgbmFtZTogXCJjdV9tYWMxMF9wcm9wYWdhbmRhXCIsXG4gICAgICAgIHRhZzogXCJQcm9wYWdhbmRhXCJcbiAgICB9LFxuICAgIFwiMTA3MFwiOiB7XG4gICAgICAgIG5hbWU6IFwiaHlfYWs0N2xhbV9ncmVlblwiLFxuICAgICAgICB0YWc6IFwiR3JlZW4gTGFtaW5hdGVcIlxuICAgIH0sXG4gICAgXCIxMDcxXCI6IHtcbiAgICAgICAgbmFtZTogXCJzcF9nYWxpbF9jYXV0aW9uXCIsXG4gICAgICAgIHRhZzogXCJDQVVUSU9OIVwiXG4gICAgfSxcbiAgICBcIjEwNzJcIjoge1xuICAgICAgICBuYW1lOiBcImh5X2dlb21ldHJpY19zdGVwc19wZWFybFwiLFxuICAgICAgICB0YWc6IFwiUHJpc20gVGVycmFjZVwiXG4gICAgfSxcbiAgICBcIjEwNzNcIjoge1xuICAgICAgICBuYW1lOiBcImdzX200YTFfdmVydGlnb1wiLFxuICAgICAgICB0YWc6IFwiSW1taW5lbnQgRGFuZ2VyXCJcbiAgICB9LFxuICAgIFwiMTA3NFwiOiB7XG4gICAgICAgIG5hbWU6IFwiaHlfdmVydGlnb2dlb1wiLFxuICAgICAgICB0YWc6IFwiU2NoZW1hdGljXCJcbiAgICB9LFxuICAgIFwiMTA3NVwiOiB7XG4gICAgICAgIG5hbWU6IFwiaHlfdmVydGlnb3NwcmF5X2JsdWVcIixcbiAgICAgICAgdGFnOiBcIlN0cmF0c1wiXG4gICAgfSxcbiAgICBcIjEwNzZcIjoge1xuICAgICAgICBuYW1lOiBcImh5X3ZlcnRpZ29pbGx1c2lvblwiLFxuICAgICAgICB0YWc6IFwiRnJhbWV3b3JrXCJcbiAgICB9LFxuICAgIFwiMTA3N1wiOiB7XG4gICAgICAgIG5hbWU6IFwiaHlfdmVydGlnb2lsbHVzaW9uX3llbGxvd1wiLFxuICAgICAgICB0YWc6IFwiSW50ZXJsb2NrXCJcbiAgICB9LFxuICAgIFwiMTA3OFwiOiB7XG4gICAgICAgIG5hbWU6IFwic3BfdGlyZV90cmVhZF9ibHVlXCIsXG4gICAgICAgIHRhZzogXCJCbHVlIFRpcmVcIlxuICAgIH0sXG4gICAgXCIxMDc5XCI6IHtcbiAgICAgICAgbmFtZTogXCJzcF90aXJlX3RyZWFkX3JlZFwiLFxuICAgICAgICB0YWc6IFwiUmVkIFRpcmVcIlxuICAgIH0sXG4gICAgXCIxMDgwXCI6IHtcbiAgICAgICAgbmFtZTogXCJoeV92ZXJ0aWdvc3ByYXlcIixcbiAgICAgICAgdGFnOiBcIkluZnJhc3RydWN0dXJlXCJcbiAgICB9LFxuICAgIFwiMTA4MVwiOiB7XG4gICAgICAgIG5hbWU6IFwiYWFfdmVydGlnb2dlb19uZW9uXCIsXG4gICAgICAgIHRhZzogXCJEaWdpdGFsIEFyY2hpdGVjdFwiXG4gICAgfSxcbiAgICBcIjEwODJcIjoge1xuICAgICAgICBuYW1lOiBcImN1X3ZlcnRpZ29fZml2ZXNldmVuXCIsXG4gICAgICAgIHRhZzogXCJGYWxsIEhhemFyZFwiXG4gICAgfSxcbiAgICBcIjEwODNcIjoge1xuICAgICAgICBuYW1lOiBcImFhX3dpcmluZ1wiLFxuICAgICAgICB0YWc6IFwiQnJlYWtlciBCb3hcIlxuICAgIH0sXG4gICAgXCIxMDg0XCI6IHtcbiAgICAgICAgbmFtZTogXCJjdV9zZzU1M19jYXV0aW9uXCIsXG4gICAgICAgIHRhZzogXCJIYXphcmQgUGF5XCJcbiAgICB9LFxuICAgIFwiMTA4NVwiOiB7XG4gICAgICAgIG5hbWU6IFwiYWFfZW5naW5lX3BlcmZvcm1hbmNlXCIsXG4gICAgICAgIHRhZzogXCJNZWNoYW5pc21cIlxuICAgIH0sXG4gICAgXCIxMDg2XCI6IHtcbiAgICAgICAgbmFtZTogXCJzcF9lbmdpbmVfZGlydHlcIixcbiAgICAgICAgdGFnOiBcIk9pbCBDaGFuZ2VcIlxuICAgIH0sXG4gICAgXCIxMDg3XCI6IHtcbiAgICAgICAgbmFtZTogXCJnc19hazQ3X2Fic3RyYWN0XCIsXG4gICAgICAgIHRhZzogXCJMZWV0IE11c2VvXCJcbiAgICB9LFxuICAgIFwiMTA4OFwiOiB7XG4gICAgICAgIG5hbWU6IFwiZ3NfYXVnX3BsYWd1ZVwiLFxuICAgICAgICB0YWc6IFwiUGxhZ3VlXCJcbiAgICB9LFxuICAgIFwiMTA4OVwiOiB7XG4gICAgICAgIG5hbWU6IFwiZ3NfbWFnN19iaXNtdXRoXCIsXG4gICAgICAgIHRhZzogXCJCSTgzIFNwZWN0cnVtXCJcbiAgICB9LFxuICAgIFwiMTA5MFwiOiB7XG4gICAgICAgIG5hbWU6IFwiY3VfZGVhZ2xlX2tpdGNoXCIsXG4gICAgICAgIHRhZzogXCJPY2VhbiBEcml2ZVwiXG4gICAgfSxcbiAgICBcIjEwOTFcIjoge1xuICAgICAgICBuYW1lOiBcImdzX2R1YWxfYmVyZXR0YXNfdHJlYWRcIixcbiAgICAgICAgdGFnOiBcIlRyZWFkXCJcbiAgICB9LFxuICAgIFwiMTA5MlwiOiB7XG4gICAgICAgIG5hbWU6IFwiY3VfZmFtYXNfc3BlY3Ryb25cIixcbiAgICAgICAgdGFnOiBcIlpYIFNwZWN0cm9uXCJcbiAgICB9LFxuICAgIFwiMTA5M1wiOiB7XG4gICAgICAgIG5hbWU6IFwiZ3NfZml2ZV9zZXZlbl9lZnVzaW9uXCIsXG4gICAgICAgIHRhZzogXCJCb29zdCBQcm90b2NvbFwiXG4gICAgfSxcbiAgICBcIjEwOTRcIjoge1xuICAgICAgICBuYW1lOiBcImFhX21wOV9mdWppX3BpbmtcIixcbiAgICAgICAgdGFnOiBcIk1vdW50IEZ1amlcIlxuICAgIH0sXG4gICAgXCIxMDk1XCI6IHtcbiAgICAgICAgbmFtZTogXCJjdV9nM3NnMV90YWN0aWNhbG1hcFwiLFxuICAgICAgICB0YWc6IFwiS2VlcGluZyBUYWJzXCJcbiAgICB9LFxuICAgIFwiMTA5NlwiOiB7XG4gICAgICAgIG5hbWU6IFwiY3VfbXA3X2toYWtpXCIsXG4gICAgICAgIHRhZzogXCJHdWVycmlsbGFcIlxuICAgIH0sXG4gICAgXCIxMDk3XCI6IHtcbiAgICAgICAgbmFtZTogXCJnc19tNF9mbG93ZXJzXCIsXG4gICAgICAgIHRhZzogXCJTcGlkZXIgTGlseVwiXG4gICAgfSxcbiAgICBcIjEwOThcIjoge1xuICAgICAgICBuYW1lOiBcImN1X21hYzEwX3RveWJveFwiLFxuICAgICAgICB0YWc6IFwiVG95Ym94XCJcbiAgICB9LFxuICAgIFwiMTA5OVwiOiB7XG4gICAgICAgIG5hbWU6IFwiZ3NfYml6b25fZmxhc2hlclwiLFxuICAgICAgICB0YWc6IFwiTHVtZW5cIlxuICAgIH0sXG4gICAgXCIxMTAwXCI6IHtcbiAgICAgICAgbmFtZTogXCJjdV9nbG9ja19zbmFja2F0dGFja1wiLFxuICAgICAgICB0YWc6IFwiU25hY2sgQXR0YWNrXCJcbiAgICB9LFxuICAgIFwiMTEwMVwiOiB7XG4gICAgICAgIG5hbWU6IFwiY3Vfc3NnX292ZXJ0YWtlXCIsXG4gICAgICAgIHRhZzogXCJUdXJibyBQZWVrXCJcbiAgICB9LFxuICAgIFwiMTEwMlwiOiB7XG4gICAgICAgIG5hbWU6IFwiY3VfdXNwX2JsYWNrX2xvdHVzXCIsXG4gICAgICAgIHRhZzogXCJCbGFjayBMb3R1c1wiXG4gICAgfSxcbiAgICBcIjExMDNcIjoge1xuICAgICAgICBuYW1lOiBcImdzX3htMTAxNF93YXRjaGRvZ1wiLFxuICAgICAgICB0YWc6IFwiV2F0Y2hkb2dcIlxuICAgIH0sXG4gICAgXCIxMTA0XCI6IHtcbiAgICAgICAgbmFtZTogXCJjdV9ib3dpZV9sb3JlXCIsXG4gICAgICAgIHRhZzogXCJMb3JlXCJcbiAgICB9LFxuICAgIFwiMTEwNVwiOiB7XG4gICAgICAgIG5hbWU6IFwiY3VfYnV0dGVyZmx5X2xvcmVcIixcbiAgICAgICAgdGFnOiBcIkxvcmVcIlxuICAgIH0sXG4gICAgXCIxMTA2XCI6IHtcbiAgICAgICAgbmFtZTogXCJjdV9mYWxjaGlvbl9sb3JlXCIsXG4gICAgICAgIHRhZzogXCJMb3JlXCJcbiAgICB9LFxuICAgIFwiMTEwN1wiOiB7XG4gICAgICAgIG5hbWU6IFwiY3VfaHVudHNtYW5fbG9yZVwiLFxuICAgICAgICB0YWc6IFwiTG9yZVwiXG4gICAgfSxcbiAgICBcIjExMDhcIjoge1xuICAgICAgICBuYW1lOiBcImN1X3B1c2hfbG9yZVwiLFxuICAgICAgICB0YWc6IFwiTG9yZVwiXG4gICAgfSxcbiAgICBcIjExMDlcIjoge1xuICAgICAgICBuYW1lOiBcImdzX2Jvd2llX2JsYWNrX2xhbWluYXRlXCIsXG4gICAgICAgIHRhZzogXCJCbGFjayBMYW1pbmF0ZVwiXG4gICAgfSxcbiAgICBcIjExMTBcIjoge1xuICAgICAgICBuYW1lOiBcImdzX2J1dHRlcmZseV9ibGFja19sYW1pbmF0ZVwiLFxuICAgICAgICB0YWc6IFwiQmxhY2sgTGFtaW5hdGVcIlxuICAgIH0sXG4gICAgXCIxMTExXCI6IHtcbiAgICAgICAgbmFtZTogXCJnc19mYWxjaGlvbl9ibGFja19sYW1pbmF0ZVwiLFxuICAgICAgICB0YWc6IFwiQmxhY2sgTGFtaW5hdGVcIlxuICAgIH0sXG4gICAgXCIxMTEyXCI6IHtcbiAgICAgICAgbmFtZTogXCJnc19odW50c21hbl9ibGFja19sYW1pbmF0ZVwiLFxuICAgICAgICB0YWc6IFwiQmxhY2sgTGFtaW5hdGVcIlxuICAgIH0sXG4gICAgXCIxMTEzXCI6IHtcbiAgICAgICAgbmFtZTogXCJnc19wdXNoX2JsYWNrX2xhbWluYXRlXCIsXG4gICAgICAgIHRhZzogXCJCbGFjayBMYW1pbmF0ZVwiXG4gICAgfSxcbiAgICBcIjExMTRcIjoge1xuICAgICAgICBuYW1lOiBcImdzX2Jvd2llX2F1dG90cm9uaWNcIixcbiAgICAgICAgdGFnOiBcIkF1dG90cm9uaWNcIlxuICAgIH0sXG4gICAgXCIxMTE1XCI6IHtcbiAgICAgICAgbmFtZTogXCJnc19idXR0ZXJmbHlfYXV0b3Ryb25pY1wiLFxuICAgICAgICB0YWc6IFwiQXV0b3Ryb25pY1wiXG4gICAgfSxcbiAgICBcIjExMTZcIjoge1xuICAgICAgICBuYW1lOiBcImdzX2ZhbGNoaW9uX2F1dG90cm9uaWNcIixcbiAgICAgICAgdGFnOiBcIkF1dG90cm9uaWNcIlxuICAgIH0sXG4gICAgXCIxMTE3XCI6IHtcbiAgICAgICAgbmFtZTogXCJnc19odW50c21hbl9hdXRvdHJvbmljXCIsXG4gICAgICAgIHRhZzogXCJBdXRvdHJvbmljXCJcbiAgICB9LFxuICAgIFwiMTExOFwiOiB7XG4gICAgICAgIG5hbWU6IFwiZ3NfcHVzaF9hdXRvdHJvbmljXCIsXG4gICAgICAgIHRhZzogXCJBdXRvdHJvbmljXCJcbiAgICB9LFxuICAgIFwiMTExOVwiOiB7XG4gICAgICAgIG5hbWU6IFwiYW1fZW1lcmFsZF9tYXJibGVpemVkX2dsb2NrXCIsXG4gICAgICAgIHRhZzogXCJHYW1tYSBEb3BwbGVyXCJcbiAgICB9LFxuICAgIFwiMTEyMFwiOiB7XG4gICAgICAgIG5hbWU6IFwiYW1fZ2FtbWFfZG9wcGxlcl9waGFzZTFfZ2xvY2tcIixcbiAgICAgICAgdGFnOiBcIkdhbW1hIERvcHBsZXJcIlxuICAgIH0sXG4gICAgXCIxMTIxXCI6IHtcbiAgICAgICAgbmFtZTogXCJhbV9nYW1tYV9kb3BwbGVyX3BoYXNlMl9nbG9ja1wiLFxuICAgICAgICB0YWc6IFwiR2FtbWEgRG9wcGxlclwiXG4gICAgfSxcbiAgICBcIjExMjJcIjoge1xuICAgICAgICBuYW1lOiBcImFtX2dhbW1hX2RvcHBsZXJfcGhhc2UzX2dsb2NrXCIsXG4gICAgICAgIHRhZzogXCJHYW1tYSBEb3BwbGVyXCJcbiAgICB9LFxuICAgIFwiMTEyM1wiOiB7XG4gICAgICAgIG5hbWU6IFwiYW1fZ2FtbWFfZG9wcGxlcl9waGFzZTRfZ2xvY2tcIixcbiAgICAgICAgdGFnOiBcIkdhbW1hIERvcHBsZXJcIlxuICAgIH0sXG4gICAgXCIxMTI1XCI6IHtcbiAgICAgICAgbmFtZTogXCJjdV9iaXpvbl9zcGFjZWNhdFwiLFxuICAgICAgICB0YWc6IFwiU3BhY2UgQ2F0XCJcbiAgICB9LFxuICAgIFwiMTEyNlwiOiB7XG4gICAgICAgIG5hbWU6IFwiY3VfZWxpdGVzX2Jld2FyZVwiLFxuICAgICAgICB0YWc6IFwiTWVsb25kcmFtYVwiXG4gICAgfSxcbiAgICBcIjExMjdcIjoge1xuICAgICAgICBuYW1lOiBcImdzX2ZhbWFzX3JhcGlkX2V5ZXNcIixcbiAgICAgICAgdGFnOiBcIlJhcGlkIEV5ZSBNb3ZlbWVudFwiXG4gICAgfSxcbiAgICBcIjExMjhcIjoge1xuICAgICAgICBuYW1lOiBcImN1X2ZpdmVzZXZlbl9hbHBoYV9vbWVnYVwiLFxuICAgICAgICB0YWc6IFwiU2NyYXdsXCJcbiAgICB9LFxuICAgIFwiMTEyOVwiOiB7XG4gICAgICAgIG5hbWU6IFwiY3VfZzNzZzFfZ2xhZGVcIixcbiAgICAgICAgdGFnOiBcIkRyZWFtIEdsYWRlXCJcbiAgICB9LFxuICAgIFwiMTEzMFwiOiB7XG4gICAgICAgIG5hbWU6IFwiZ3NfbTRhMXNfaW5zb21uaWFcIixcbiAgICAgICAgdGFnOiBcIk5pZ2h0IFRlcnJvclwiXG4gICAgfSxcbiAgICBcIjExMzFcIjoge1xuICAgICAgICBuYW1lOiBcImN1X21hYzEwX3BpeGllXCIsXG4gICAgICAgIHRhZzogXCJFbnNuYXJlZFwiXG4gICAgfSxcbiAgICBcIjExMzJcIjoge1xuICAgICAgICBuYW1lOiBcImN1X21hZzdfcHJlZGljdG9yXCIsXG4gICAgICAgIHRhZzogXCJGb3Jlc2lnaHRcIlxuICAgIH0sXG4gICAgXCIxMTMzXCI6IHtcbiAgICAgICAgbmFtZTogXCJjdV9tcDdfZmVhclwiLFxuICAgICAgICB0YWc6IFwiQWJ5c3NhbCBBcHBhcml0aW9uXCJcbiAgICB9LFxuICAgIFwiMTEzNFwiOiB7XG4gICAgICAgIG5hbWU6IFwiZ3NfbXA5X3N0YXJsaWdodFwiLFxuICAgICAgICB0YWc6IFwiU3RhcmxpZ2h0IFByb3RlY3RvclwiXG4gICAgfSxcbiAgICBcIjExMzVcIjoge1xuICAgICAgICBuYW1lOiBcImFtX3htX3pvbWJpZV9vZmZlbnNpdmVcIixcbiAgICAgICAgdGFnOiBcIlpvbWJpZSBPZmZlbnNpdmVcIlxuICAgIH0sXG4gICAgXCIxMTM2XCI6IHtcbiAgICAgICAgbmFtZTogXCJjdV91c3BfdG9faGVsbFwiLFxuICAgICAgICB0YWc6IFwiVGlja2V0IHRvIEhlbGxcIlxuICAgIH0sXG4gICAgXCIxMTM3XCI6IHtcbiAgICAgICAgbmFtZTogXCJnc19tcDVfa2lkX25lY3Jvbm9taWNvblwiLFxuICAgICAgICB0YWc6IFwiTmVjcm8gSnIuXCJcbiAgICB9LFxuICAgIFwiMTEzOFwiOiB7XG4gICAgICAgIG5hbWU6IFwiY3VfcDJrX2ZseWluZ19kcmVhbVwiLFxuICAgICAgICB0YWc6IFwiTGlmdGVkIFNwaXJpdHNcIlxuICAgIH0sXG4gICAgXCIxMTM5XCI6IHtcbiAgICAgICAgbmFtZTogXCJzcF9zY2FyX2NoaWNrZW5maWdodFwiLFxuICAgICAgICB0YWc6IFwiUG91bHRyeWdlaXN0XCJcbiAgICB9LFxuICAgIFwiMTE0MFwiOiB7XG4gICAgICAgIG5hbWU6IFwiY3Vfc2F3ZWRvZmZfb3VpamFcIixcbiAgICAgICAgdGFnOiBcIlNwaXJpdCBCb2FyZFwiXG4gICAgfSxcbiAgICBcIjExNDFcIjoge1xuICAgICAgICBuYW1lOiBcImN1X2FrNDdfbmlnaHR3aXNoXCIsXG4gICAgICAgIHRhZzogXCJOaWdodHdpc2hcIlxuICAgIH0sXG4gICAgXCIxMTQyXCI6IHtcbiAgICAgICAgbmFtZTogXCJjdV91c3BfcHJpbnRzdHJlYW1cIixcbiAgICAgICAgdGFnOiBcIlByaW50c3RyZWFtXCJcbiAgICB9LFxuICAgIFwiMTE0M1wiOiB7XG4gICAgICAgIG5hbWU6IFwiY3VfYWs0N19jb2d0aGluZ3NcIixcbiAgICAgICAgdGFnOiBcIkljZSBDb2FsZWRcIlxuICAgIH0sXG4gICAgXCIxMTQ0XCI6IHtcbiAgICAgICAgbmFtZTogXCJjdV9hd3BfY2hyb21hX3BpbmtcIixcbiAgICAgICAgdGFnOiBcIkNocm9tYXRpYyBBYmVycmF0aW9uXCJcbiAgICB9LFxuICAgIFwiMTE0NVwiOiB7XG4gICAgICAgIG5hbWU6IFwiZ3NfcmV2b2x2ZXJfcHVycGxlX2VsaXRlXCIsXG4gICAgICAgIHRhZzogXCJDcmF6eSA4XCJcbiAgICB9LFxuICAgIFwiMTE0NlwiOiB7XG4gICAgICAgIG5hbWU6IFwiZ3NfZmFtYXNfY29ycF9tZW93XCIsXG4gICAgICAgIHRhZzogXCJNZW93IDM2XCJcbiAgICB9LFxuICAgIFwiMTE0N1wiOiB7XG4gICAgICAgIG5hbWU6IFwiY3VfZ2FsaWxfZGVzdHJveWVyXCIsXG4gICAgICAgIHRhZzogXCJEZXN0cm95ZXJcIlxuICAgIH0sXG4gICAgXCIxMTQ4XCI6IHtcbiAgICAgICAgbmFtZTogXCJjdV9tMjQ5X2Rvd252b3RlXCIsXG4gICAgICAgIHRhZzogXCJEb3dudG93blwiXG4gICAgfSxcbiAgICBcIjExNDlcIjoge1xuICAgICAgICBuYW1lOiBcImN1X200YTRfZWxpdGVfdGFjdGljYWxcIixcbiAgICAgICAgdGFnOiBcIlBvbHkgTWFnXCJcbiAgICB9LFxuICAgIFwiMTE1MFwiOiB7XG4gICAgICAgIG5hbWU6IFwiY3VfbWFjMTBfbW9ua2V5ZmxhZ2VcIixcbiAgICAgICAgdGFnOiBcIk1vbmtleWZsYWdlXCJcbiAgICB9LFxuICAgIFwiMTE1MVwiOiB7XG4gICAgICAgIG5hbWU6IFwiY3Vfc2c1NTNfY3liZXJfZHJhZ29uXCIsXG4gICAgICAgIHRhZzogXCJEcmFnb24gVGVjaFwiXG4gICAgfSxcbiAgICBcIjExNTJcIjoge1xuICAgICAgICBuYW1lOiBcImN1X25lZ2V2X2NsZWFyX3NreVwiLFxuICAgICAgICB0YWc6IFwiRHJvcCBNZVwiXG4gICAgfSxcbiAgICBcIjExNTNcIjoge1xuICAgICAgICBuYW1lOiBcImdzX3AyNTBfdmlzaW9uc1wiLFxuICAgICAgICB0YWc6IFwiVmlzaW9uc1wiXG4gICAgfSxcbiAgICBcIjExNTRcIjoge1xuICAgICAgICBuYW1lOiBcImdzX3A5MF90YW5nbGVkXCIsXG4gICAgICAgIHRhZzogXCJWZW50IFJ1c2hcIlxuICAgIH0sXG4gICAgXCIxMTU1XCI6IHtcbiAgICAgICAgbmFtZTogXCJjdV9zYXdlZG9mZl9raXNzbG92ZVwiLFxuICAgICAgICB0YWc6IFwiS2lzc+KZpUxvdmVcIlxuICAgIH0sXG4gICAgXCIxMTU2XCI6IHtcbiAgICAgICAgbmFtZTogXCJjdV9kdWFsX2VsaXRlc19ldmlsX2Zsb3JhXCIsXG4gICAgICAgIHRhZzogXCJGbG9yYSBDYXJuaXZvcmFcIlxuICAgIH0sXG4gICAgXCIxMTU3XCI6IHtcbiAgICAgICAgbmFtZTogXCJnc191bXBfcm9hZGJsb2NrXCIsXG4gICAgICAgIHRhZzogXCJSb2FkYmxvY2tcIlxuICAgIH0sXG4gICAgXCIxMTU4XCI6IHtcbiAgICAgICAgbmFtZTogXCJnc19nbG9ja19lbGl0ZV9jYW1vXCIsXG4gICAgICAgIHRhZzogXCJXaW50ZXJpemVkXCJcbiAgICB9LFxuICAgIFwiMTAwMDZcIjoge1xuICAgICAgICBuYW1lOiBcImJsb29kaG91bmRfYmxhY2tfc2lsdmVyXCIsXG4gICAgICAgIHRhZzogXCJDaGFycmVkXCJcbiAgICB9LFxuICAgIFwiMTAwMDdcIjoge1xuICAgICAgICBuYW1lOiBcImJsb29kaG91bmRfc25ha2Vza2luX2JyYXNzXCIsXG4gICAgICAgIHRhZzogXCJTbmFrZWJpdGVcIlxuICAgIH0sXG4gICAgXCIxMDAwOFwiOiB7XG4gICAgICAgIG5hbWU6IFwiYmxvb2Rob3VuZF9tZXRhbGxpY1wiLFxuICAgICAgICB0YWc6IFwiQnJvbnplZFwiXG4gICAgfSxcbiAgICBcIjEwMDA5XCI6IHtcbiAgICAgICAgbmFtZTogXCJoYW5kd3JhcF9sZWF0aGVyeVwiLFxuICAgICAgICB0YWc6IFwiTGVhdGhlclwiXG4gICAgfSxcbiAgICBcIjEwMDEwXCI6IHtcbiAgICAgICAgbmFtZTogXCJoYW5kd3JhcF9jYW1vX2dyZXlcIixcbiAgICAgICAgdGFnOiBcIlNwcnVjZSBERFBBVFwiXG4gICAgfSxcbiAgICBcIjEwMDEzXCI6IHtcbiAgICAgICAgbmFtZTogXCJzbGlja19ibGFja1wiLFxuICAgICAgICB0YWc6IFwiTHVuYXIgV2VhdmVcIlxuICAgIH0sXG4gICAgXCIxMDAxNVwiOiB7XG4gICAgICAgIG5hbWU6IFwic2xpY2tfbWlsaXRhcnlcIixcbiAgICAgICAgdGFnOiBcIkNvbnZveVwiXG4gICAgfSxcbiAgICBcIjEwMDE2XCI6IHtcbiAgICAgICAgbmFtZTogXCJzbGlja19yZWRcIixcbiAgICAgICAgdGFnOiBcIkNyaW1zb24gV2VhdmVcIlxuICAgIH0sXG4gICAgXCIxMDAxOFwiOiB7XG4gICAgICAgIG5hbWU6IFwic3BvcnR5X2xpZ2h0X2JsdWVcIixcbiAgICAgICAgdGFnOiBcIlN1cGVyY29uZHVjdG9yXCJcbiAgICB9LFxuICAgIFwiMTAwMTlcIjoge1xuICAgICAgICBuYW1lOiBcInNwb3J0eV9taWxpdGFyeVwiLFxuICAgICAgICB0YWc6IFwiQXJpZFwiXG4gICAgfSxcbiAgICBcIjEwMDIxXCI6IHtcbiAgICAgICAgbmFtZTogXCJoYW5kd3JhcF9yZWRfc2xhdWdodGVyXCIsXG4gICAgICAgIHRhZzogXCJTbGF1Z2h0ZXJcIlxuICAgIH0sXG4gICAgXCIxMDAyNFwiOiB7XG4gICAgICAgIG5hbWU6IFwibW90b3JjeWNsZV9iYXNpY19ibGFja1wiLFxuICAgICAgICB0YWc6IFwiRWNsaXBzZVwiXG4gICAgfSxcbiAgICBcIjEwMDI2XCI6IHtcbiAgICAgICAgbmFtZTogXCJtb3RvcmN5Y2xlX21pbnRfdHJpYW5nbGVcIixcbiAgICAgICAgdGFnOiBcIlNwZWFybWludFwiXG4gICAgfSxcbiAgICBcIjEwMDI3XCI6IHtcbiAgICAgICAgbmFtZTogXCJtb3RvcmN5Y2xlX21vbm9fYm9vbVwiLFxuICAgICAgICB0YWc6IFwiQm9vbSFcIlxuICAgIH0sXG4gICAgXCIxMDAyOFwiOiB7XG4gICAgICAgIG5hbWU6IFwibW90b3JjeWNsZV90cmlhbmdsZV9ibHVlXCIsXG4gICAgICAgIHRhZzogXCJDb29sIE1pbnRcIlxuICAgIH0sXG4gICAgXCIxMDAzMFwiOiB7XG4gICAgICAgIG5hbWU6IFwic3BlY2lhbGlzdF9kZHBhdF9ncmVlbl9jYW1vXCIsXG4gICAgICAgIHRhZzogXCJGb3Jlc3QgRERQQVRcIlxuICAgIH0sXG4gICAgXCIxMDAzM1wiOiB7XG4gICAgICAgIG5hbWU6IFwic3BlY2lhbGlzdF9raW1vbm9fZGlhbW9uZHNfcmVkXCIsXG4gICAgICAgIHRhZzogXCJDcmltc29uIEtpbW9ub1wiXG4gICAgfSxcbiAgICBcIjEwMDM0XCI6IHtcbiAgICAgICAgbmFtZTogXCJzcGVjaWFsaXN0X2VtZXJhbGRfd2ViXCIsXG4gICAgICAgIHRhZzogXCJFbWVyYWxkIFdlYlwiXG4gICAgfSxcbiAgICBcIjEwMDM1XCI6IHtcbiAgICAgICAgbmFtZTogXCJzcGVjaWFsaXN0X29yYW5nZV93aGl0ZVwiLFxuICAgICAgICB0YWc6IFwiRm91bmRhdGlvblwiXG4gICAgfSxcbiAgICBcIjEwMDM2XCI6IHtcbiAgICAgICAgbmFtZTogXCJoYW5kd3JhcF9mYWJyaWNfb3JhbmdlX2NhbW9cIixcbiAgICAgICAgdGFnOiBcIkJhZGxhbmRzXCJcbiAgICB9LFxuICAgIFwiMTAwMzdcIjoge1xuICAgICAgICBuYW1lOiBcInNwb3J0eV9wdXJwbGVcIixcbiAgICAgICAgdGFnOiBcIlBhbmRvcmEncyBCb3hcIlxuICAgIH0sXG4gICAgXCIxMDAzOFwiOiB7XG4gICAgICAgIG5hbWU6IFwic3BvcnR5X2dyZWVuXCIsXG4gICAgICAgIHRhZzogXCJIZWRnZSBNYXplXCJcbiAgICB9LFxuICAgIFwiMTAwMzlcIjoge1xuICAgICAgICBuYW1lOiBcImJsb29kaG91bmRfZ3VlcnJpbGxhXCIsXG4gICAgICAgIHRhZzogXCJHdWVycmlsbGFcIlxuICAgIH0sXG4gICAgXCIxMDA0MFwiOiB7XG4gICAgICAgIG5hbWU6IFwic2xpY2tfc25ha2Vza2luX3llbGxvd1wiLFxuICAgICAgICB0YWc6IFwiRGlhbW9uZGJhY2tcIlxuICAgIH0sXG4gICAgXCIxMDA0MVwiOiB7XG4gICAgICAgIG5hbWU6IFwic2xpY2tfc25ha2Vza2luX3doaXRlXCIsXG4gICAgICAgIHRhZzogXCJLaW5nIFNuYWtlXCJcbiAgICB9LFxuICAgIFwiMTAwNDJcIjoge1xuICAgICAgICBuYW1lOiBcInNsaWNrX3BsYWlkX3B1cnBsZVwiLFxuICAgICAgICB0YWc6IFwiSW1wZXJpYWwgUGxhaWRcIlxuICAgIH0sXG4gICAgXCIxMDA0M1wiOiB7XG4gICAgICAgIG5hbWU6IFwic2xpY2tfc3RpdGNoZWRfYmxhY2tfb3JhbmdlXCIsXG4gICAgICAgIHRhZzogXCJPdmVydGFrZVwiXG4gICAgfSxcbiAgICBcIjEwMDQ0XCI6IHtcbiAgICAgICAgbmFtZTogXCJzbGlja19zdGl0Y2hlZF9ncmVlbl9ncmV5XCIsXG4gICAgICAgIHRhZzogXCJSYWNpbmcgR3JlZW5cIlxuICAgIH0sXG4gICAgXCIxMDA0NVwiOiB7XG4gICAgICAgIG5hbWU6IFwic3BvcnR5X3BvaXNvbl9mcm9nX2JsdWVfd2hpdGVcIixcbiAgICAgICAgdGFnOiBcIkFtcGhpYmlvdXNcIlxuICAgIH0sXG4gICAgXCIxMDA0NlwiOiB7XG4gICAgICAgIG5hbWU6IFwic3BvcnR5X3BvaXNvbl9mcm9nX3JlZF9ncmVlblwiLFxuICAgICAgICB0YWc6IFwiQnJvbnplIE1vcnBoXCJcbiAgICB9LFxuICAgIFwiMTAwNDdcIjoge1xuICAgICAgICBuYW1lOiBcInNwb3J0eV9ibGFja193ZWJiaW5nX3llbGxvd1wiLFxuICAgICAgICB0YWc6IFwiT21lZ2FcIlxuICAgIH0sXG4gICAgXCIxMDA0OFwiOiB7XG4gICAgICAgIG5hbWU6IFwic3BvcnR5X2JsdWVfcGlua1wiLFxuICAgICAgICB0YWc6IFwiVmljZVwiXG4gICAgfSxcbiAgICBcIjEwMDQ5XCI6IHtcbiAgICAgICAgbmFtZTogXCJtb3RvcmN5Y2xlX2Nob2NvX2Jvb21cIixcbiAgICAgICAgdGFnOiBcIlBPVyFcIlxuICAgIH0sXG4gICAgXCIxMDA1MFwiOiB7XG4gICAgICAgIG5hbWU6IFwibW90b3JjeWNsZV9iYXNpY19ncmVlbl9vcmFuZ2VcIixcbiAgICAgICAgdGFnOiBcIlR1cnRsZVwiXG4gICAgfSxcbiAgICBcIjEwMDUxXCI6IHtcbiAgICAgICAgbmFtZTogXCJtb3RvcmN5Y2xlX3llbGxvd19jYW1vXCIsXG4gICAgICAgIHRhZzogXCJUcmFuc3BvcnRcIlxuICAgIH0sXG4gICAgXCIxMDA1MlwiOiB7XG4gICAgICAgIG5hbWU6IFwibW90b3JjeWNsZV90cmlncmlkX2JsdWVcIixcbiAgICAgICAgdGFnOiBcIlBvbHlnb25cIlxuICAgIH0sXG4gICAgXCIxMDA1M1wiOiB7XG4gICAgICAgIG5hbWU6IFwiaGFuZHdyYXBfbGVhdGhlcnlfZmFicmljX2JsdWVfc2t1bGxzXCIsXG4gICAgICAgIHRhZzogXCJDb2JhbHQgU2t1bGxzXCJcbiAgICB9LFxuICAgIFwiMTAwNTRcIjoge1xuICAgICAgICBuYW1lOiBcImhhbmR3cmFwX2xlYXRoZXJ5X2ZhYnJpY19nZW9tZXRyaWNfYmx1ZVwiLFxuICAgICAgICB0YWc6IFwiT3ZlcnByaW50XCJcbiAgICB9LFxuICAgIFwiMTAwNTVcIjoge1xuICAgICAgICBuYW1lOiBcImhhbmR3cmFwX2xlYXRoZXJ5X2R1Y3R0YXBlXCIsXG4gICAgICAgIHRhZzogXCJEdWN0IFRhcGVcIlxuICAgIH0sXG4gICAgXCIxMDA1NlwiOiB7XG4gICAgICAgIG5hbWU6IFwiaGFuZHdyYXBfbGVhdGhlcnlfZmFicmljX2dyZWVuX2NhbW9cIixcbiAgICAgICAgdGFnOiBcIkFyYm9yZWFsXCJcbiAgICB9LFxuICAgIFwiMTAwNTdcIjoge1xuICAgICAgICBuYW1lOiBcImJsb29kaG91bmRfaHlkcmFfYmxhY2tfZ3JlZW5cIixcbiAgICAgICAgdGFnOiBcIkVtZXJhbGRcIlxuICAgIH0sXG4gICAgXCIxMDA1OFwiOiB7XG4gICAgICAgIG5hbWU6IFwiYmxvb2Rob3VuZF9oeWRyYV9ncmVlbl9sZWF0aGVyX21lc2hfYnJhc3NcIixcbiAgICAgICAgdGFnOiBcIk1hbmdyb3ZlXCJcbiAgICB9LFxuICAgIFwiMTAwNTlcIjoge1xuICAgICAgICBuYW1lOiBcImJsb29kaG91bmRfaHlkcmFfc25ha2Vza2luX2JyYXNzXCIsXG4gICAgICAgIHRhZzogXCJSYXR0bGVyXCJcbiAgICB9LFxuICAgIFwiMTAwNjBcIjoge1xuICAgICAgICBuYW1lOiBcImJsb29kaG91bmRfaHlkcmFfY2FzZV9oYXJkZW5lZFwiLFxuICAgICAgICB0YWc6IFwiQ2FzZSBIYXJkZW5lZFwiXG4gICAgfSxcbiAgICBcIjEwMDYxXCI6IHtcbiAgICAgICAgbmFtZTogXCJzcGVjaWFsaXN0X3dlYnNfcmVkXCIsXG4gICAgICAgIHRhZzogXCJDcmltc29uIFdlYlwiXG4gICAgfSxcbiAgICBcIjEwMDYyXCI6IHtcbiAgICAgICAgbmFtZTogXCJzcGVjaWFsaXN0X2ZvcmVzdF9icm93blwiLFxuICAgICAgICB0YWc6IFwiQnVja3Nob3RcIlxuICAgIH0sXG4gICAgXCIxMDA2M1wiOiB7XG4gICAgICAgIG5hbWU6IFwic3BlY2lhbGlzdF9mYWRlXCIsXG4gICAgICAgIHRhZzogXCJGYWRlXCJcbiAgICB9LFxuICAgIFwiMTAwNjRcIjoge1xuICAgICAgICBuYW1lOiBcInNwZWNpYWxpc3Rfd2ludGVyaGV4XCIsXG4gICAgICAgIHRhZzogXCJNb2d1bFwiXG4gICAgfSxcbiAgICBcIjEwMDY1XCI6IHtcbiAgICAgICAgbmFtZTogXCJzcGVjaWFsaXN0X21hcmJsZV9mYWRlXCIsXG4gICAgICAgIHRhZzogXCJNYXJibGUgRmFkZVwiXG4gICAgfSxcbiAgICBcIjEwMDY2XCI6IHtcbiAgICAgICAgbmFtZTogXCJzcGVjaWFsaXN0X3JpY2tzYXdfY2Ftb1wiLFxuICAgICAgICB0YWc6IFwiTHQuIENvbW1hbmRlclwiXG4gICAgfSxcbiAgICBcIjEwMDY3XCI6IHtcbiAgICAgICAgbmFtZTogXCJzcGVjaWFsaXN0X3RpZ2VyX29yYW5nZVwiLFxuICAgICAgICB0YWc6IFwiVGlnZXIgU3RyaWtlXCJcbiAgICB9LFxuICAgIFwiMTAwNjhcIjoge1xuICAgICAgICBuYW1lOiBcInNwZWNpYWxpc3RfZmJpXCIsXG4gICAgICAgIHRhZzogXCJGaWVsZCBBZ2VudFwiXG4gICAgfSxcbiAgICBcIjEwMDY5XCI6IHtcbiAgICAgICAgbmFtZTogXCJzbGlja19yZXphblwiLFxuICAgICAgICB0YWc6IFwiUmV6YW4gdGhlIFJlZFwiXG4gICAgfSxcbiAgICBcIjEwMDcwXCI6IHtcbiAgICAgICAgbmFtZTogXCJzbGlja19qYWd1YXJfd2hpdGVcIixcbiAgICAgICAgdGFnOiBcIlNub3cgTGVvcGFyZFwiXG4gICAgfSxcbiAgICBcIjEwMDcxXCI6IHtcbiAgICAgICAgbmFtZTogXCJzbGlja19qYWd1YXJfeWVsbG93XCIsXG4gICAgICAgIHRhZzogXCJRdWVlbiBKYWd1YXJcIlxuICAgIH0sXG4gICAgXCIxMDA3MlwiOiB7XG4gICAgICAgIG5hbWU6IFwic2xpY2tfc3RpdGNoZWRfYmxhY2tfd2hpdGVcIixcbiAgICAgICAgdGFnOiBcIkJsYWNrIFRpZVwiXG4gICAgfSxcbiAgICBcIjEwMDczXCI6IHtcbiAgICAgICAgbmFtZTogXCJzcG9ydHlfc2xpbmdzaG90XCIsXG4gICAgICAgIHRhZzogXCJTbGluZ3Nob3RcIlxuICAgIH0sXG4gICAgXCIxMDA3NFwiOiB7XG4gICAgICAgIG5hbWU6IFwic3BvcnR5X2h1bnRlclwiLFxuICAgICAgICB0YWc6IFwiQmlnIEdhbWVcIlxuICAgIH0sXG4gICAgXCIxMDA3NVwiOiB7XG4gICAgICAgIG5hbWU6IFwic3BvcnR5X2hvdW5kc3Rvb3RoX3JlZFwiLFxuICAgICAgICB0YWc6IFwiU2NhcmxldCBTaGFtYWdoXCJcbiAgICB9LFxuICAgIFwiMTAwNzZcIjoge1xuICAgICAgICBuYW1lOiBcInNwb3J0eV9qYWd1YXJcIixcbiAgICAgICAgdGFnOiBcIk5vY3RzXCJcbiAgICB9LFxuICAgIFwiMTAwNzdcIjoge1xuICAgICAgICBuYW1lOiBcIm1vdG9yY3ljbGVfY2hlY2tlcl9mbGFnX2JsdWVfZ3JlZW5cIixcbiAgICAgICAgdGFnOiBcIkZpbmlzaCBMaW5lXCJcbiAgICB9LFxuICAgIFwiMTAwNzhcIjoge1xuICAgICAgICBuYW1lOiBcIm1vdG9yY3ljbGVfc21va2VcIixcbiAgICAgICAgdGFnOiBcIlNtb2tlIE91dFwiXG4gICAgfSxcbiAgICBcIjEwMDc5XCI6IHtcbiAgICAgICAgbmFtZTogXCJtb3RvcmN5Y2xlX2NhcmJvbmZpYmVyX3JlZFwiLFxuICAgICAgICB0YWc6IFwiQmxvb2QgUHJlc3N1cmVcIlxuICAgIH0sXG4gICAgXCIxMDA4MFwiOiB7XG4gICAgICAgIG5hbWU6IFwibW90b3JjeWNsZV9jb21tYW5kb19rc2tcIixcbiAgICAgICAgdGFnOiBcIjNyZCBDb21tYW5kbyBDb21wYW55XCJcbiAgICB9LFxuICAgIFwiMTAwODFcIjoge1xuICAgICAgICBuYW1lOiBcImhhbmR3cmFwX2ZhYnJpY19ob3VuZHN0b290aF9vcmFuZ2VcIixcbiAgICAgICAgdGFnOiBcIkRlc2VydCBTaGFtYWdoXCJcbiAgICB9LFxuICAgIFwiMTAwODJcIjoge1xuICAgICAgICBuYW1lOiBcImhhbmR3cmFwX2xlYXRoZXJ5X2ZhYnJpY19naXJhZmZlXCIsXG4gICAgICAgIHRhZzogXCJHaXJhZmZlXCJcbiAgICB9LFxuICAgIFwiMTAwODNcIjoge1xuICAgICAgICBuYW1lOiBcImhhbmR3cmFwX2xlYXRoZXJ5X3NuYWtlc2tpbl9vcmFuZ2VcIixcbiAgICAgICAgdGFnOiBcIkNvbnN0cmljdG9yXCJcbiAgICB9LFxuICAgIFwiMTAwODRcIjoge1xuICAgICAgICBuYW1lOiBcImhhbmR3cmFwX2xlYXRoZXJ5X2NhdXRpb25cIixcbiAgICAgICAgdGFnOiBcIkNBVVRJT04hXCJcbiAgICB9LFxuICAgIFwiMTAwODVcIjoge1xuICAgICAgICBuYW1lOiBcIm9wZXJhdGlvbjEwX21ldGFsaWNfZ3JlZW5cIixcbiAgICAgICAgdGFnOiBcIkphZGVcIlxuICAgIH0sXG4gICAgXCIxMDA4NlwiOiB7XG4gICAgICAgIG5hbWU6IFwib3BlcmF0aW9uMTBfcG9pc29uX2Zyb2dfYmxhY2tfeWVsbG93XCIsXG4gICAgICAgIHRhZzogXCJZZWxsb3ctYmFuZGVkXCJcbiAgICB9LFxuICAgIFwiMTAwODdcIjoge1xuICAgICAgICBuYW1lOiBcIm9wZXJhdGlvbjEwX2Zsb3JhbFwiLFxuICAgICAgICB0YWc6IFwiTmVlZGxlIFBvaW50XCJcbiAgICB9LFxuICAgIFwiMTAwODhcIjoge1xuICAgICAgICBuYW1lOiBcIm9wZXJhdGlvbjEwX3NuYWtlc2tpbl9ibGFja1wiLFxuICAgICAgICB0YWc6IFwiVW5oaW5nZWRcIlxuICAgIH1cbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pdGVtZGVmcy5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuTmV0d29ya2FibGUgPSB2b2lkIDA7XG5jb25zdCBjb25zdHNfMSA9IHJlcXVpcmUoXCIuLi9jb25zdHNcIik7XG4vKipcbiAqIFJlcHJlc2VudHMgYW4gaW4tZ2FtZSBlbnRpdHkuXG4gKi9cbmNsYXNzIE5ldHdvcmthYmxlIHtcbiAgICBjb25zdHJ1Y3RvcihkZW1vLCBpbmRleCwgY2xhc3NJZCwgc2VyaWFsTnVtLCBwcm9wcykge1xuICAgICAgICAvKipcbiAgICAgICAgICogRW50aXR5IGlzIHNjaGVkdWxlZCBmb3IgcmVtb3ZhbCB0aGlzIHRpY2suXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmRlbGV0aW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX2RlbW8gPSBkZW1vO1xuICAgICAgICB0aGlzLmluZGV4ID0gaW5kZXg7XG4gICAgICAgIHRoaXMuY2xhc3NJZCA9IGNsYXNzSWQ7XG4gICAgICAgIHRoaXMuc2VyaWFsTnVtID0gc2VyaWFsTnVtO1xuICAgICAgICB0aGlzLnByb3BzID0gcHJvcHMgfHwge307XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgc2VydmVyY2xhc3MgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZW50aXR5LlxuICAgICAqIEByZXR1cm5zIE9iamVjdCByZXByZXNlbnRpbmcgdGhlIGVudGl0eSdzIGNsYXNzXG4gICAgICovXG4gICAgZ2V0IHNlcnZlckNsYXNzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVtby5lbnRpdGllcy5zZXJ2ZXJDbGFzc2VzW3RoaXMuY2xhc3NJZF07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEByZXR1cm5zIE51bWJlciB1bmlxdWVseSBpZGVudGlmeWluZyB0aGlzIGVudGl0eS4gU2hvdWxkIGJlIHVuaXF1ZSB0aHJvdWdob3V0IHRoZSBlbnRpcmUgZGVtby5cbiAgICAgKi9cbiAgICBnZXQgaGFuZGxlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pbmRleCB8ICh0aGlzLnNlcmlhbE51bSA8PCBjb25zdHNfMS5NQVhfRURJQ1RfQklUUyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHJpZXZlcyB0aGUgdmFsdWUgb2YgYSBuZXR3b3JrZWQgcHJvcGVydHlcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGFibGUgbmFtZSAoZS5nLiwgRFRfQmFzZUVudGl0eSlcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdmFyTmFtZSAtIE5ldHdvcmsgdmFyaWFibGUgbmFtZSAoZS5nLiwgbV92ZWNPcmlnaW4pXG4gICAgICogQHJldHVybnMgeyp9IFByb3BlcnR5IHZhbHVlLCBgdW5kZWZpbmVkYCBpZiBub24tZXhpc3RlbnRcbiAgICAgKiBAcHVibGljXG4gICAgICovXG4gICAgZ2V0UHJvcCh0YWJsZU5hbWUsIHZhck5hbWUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucHJvcHNbdGFibGVOYW1lXVt2YXJOYW1lXTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSW50ZXJwcmV0IGFuIGFycmF5LWxpa2UgZGF0YSB0YWJsZSAoZS5nLiwgbV9pQW1tbykgYXMgYW4gYXJyYXlcbiAgICAgKiBAcGFyYW0gdGFibGVOYW1lIE5hbWUgb2YgdGhlIGRhdGEgdGFibGVcbiAgICAgKi9cbiAgICBnZXRJbmRleGVkUHJvcHModGFibGVOYW1lKSB7XG4gICAgICAgIGlmICghKFwiMDAwXCIgaW4gdGhpcy5wcm9wc1t0YWJsZU5hbWVdKSkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyh0aGlzLnByb3BzW3RhYmxlTmFtZV0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBVcGRhdGUgdGhlIHZhbHVlIG9mIGEgcHJvcFxuICAgICAqIEBwYXJhbSB0YWJsZU5hbWUgTmFtZSBvZiB0aGUgZGF0YSB0YWJsZVxuICAgICAqIEBwYXJhbSB2YXJOYW1lIE5hbWUgb2YgdGhlIHByb3AgdG8gdXBkYXRlXG4gICAgICogQHBhcmFtIG5ld1ZhbHVlIE5ldyBwcm9wIHZhbHVlXG4gICAgICovXG4gICAgdXBkYXRlUHJvcCh0YWJsZU5hbWUsIHZhck5hbWUsIG5ld1ZhbHVlKSB7XG4gICAgICAgIGNvbnN0IHRhYmxlID0gdGhpcy5wcm9wc1t0YWJsZU5hbWVdO1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LWNvbmRpdGlvblxuICAgICAgICBpZiAodGFibGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5wcm9wc1t0YWJsZU5hbWVdID0ge1xuICAgICAgICAgICAgICAgIFt2YXJOYW1lXTogbmV3VmFsdWVcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0YWJsZVt2YXJOYW1lXSA9IG5ld1ZhbHVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRydWUgaWYgdGhpcyBlbnRpdHkgaXMgb3V0IG9mIHRoZSBQVlMuXG4gICAgICogQWx3YXlzIGZhbHNlIG9uIEdPVFYgZGVtb3MgYXMgYWxsIGVudGl0aWVzIGFyZSBhbHdheXMgaW4gdGhlIFBWUy5cbiAgICAgKi9cbiAgICBnZXQgaXNEb3JtYW50KCkge1xuICAgICAgICByZXR1cm4gIXRoaXMuX2RlbW8uZW50aXRpZXMudHJhbnNtaXRFbnRpdGllcy5oYXModGhpcy5pbmRleCk7XG4gICAgfVxuICAgIHRvSlNPTigpIHtcbiAgICAgICAgcmV0dXJuIGAjJHt0aGlzLmluZGV4fSgke3RoaXMuc2VydmVyQ2xhc3MubmFtZX0pYDtcbiAgICB9XG59XG5leHBvcnRzLk5ldHdvcmthYmxlID0gTmV0d29ya2FibGU7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1uZXR3b3JrYWJsZS5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuUGxheWVyID0gdm9pZCAwO1xuY29uc3QgY3Jvc3NoYWlyXzEgPSByZXF1aXJlKFwiLi4vY3Jvc3NoYWlyXCIpO1xuY29uc3QgYmFzZWVudGl0eV8xID0gcmVxdWlyZShcIi4vYmFzZWVudGl0eVwiKTtcbmNvbnN0IHdlYXBvbl8xID0gcmVxdWlyZShcIi4vd2VhcG9uXCIpO1xuLyoqXG4gKiBSZXByZXNlbnRzIGFuIGluLWdhbWUgcGxheWVyLlxuICovXG5jbGFzcyBQbGF5ZXIgZXh0ZW5kcyBiYXNlZW50aXR5XzEuQmFzZUVudGl0eSB7XG4gICAgY29uc3RydWN0b3IoZGVtbywgaW5kZXgsIGNsYXNzSWQsIHNlcmlhbE51bSwgYmFzZWxpbmUpIHtcbiAgICAgICAgc3VwZXIoZGVtbywgaW5kZXgsIGNsYXNzSWQsIHNlcmlhbE51bSwgYmFzZWxpbmUpO1xuICAgICAgICAvKipcbiAgICAgICAgICogVGhlICdjbGllbnQgc2xvdCcgaXMgdGhlIGluZGV4IGludG8gdmFyaW91cyBhcnJheXMgc3VjaCBhcyB0aGUgdXNlcmluZm8gdGFibGUuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmNsaWVudFNsb3QgPSBpbmRleCAtIDE7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEByZXR1cm5zIHtpbnR9IEN1cnJlbnQgaGVhbHRoXG4gICAgICovXG4gICAgZ2V0IGhlYWx0aCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UHJvcChcIkRUX0Jhc2VQbGF5ZXJcIiwgXCJtX2lIZWFsdGhcIik7XG4gICAgfVxuICAgIGdldCBleWVBbmdsZXMoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBwaXRjaDogdGhpcy5nZXRQcm9wKFwiRFRfQ1NQbGF5ZXJcIiwgXCJtX2FuZ0V5ZUFuZ2xlc1swXVwiKSxcbiAgICAgICAgICAgIHlhdzogdGhpcy5nZXRQcm9wKFwiRFRfQ1NQbGF5ZXJcIiwgXCJtX2FuZ0V5ZUFuZ2xlc1sxXVwiKVxuICAgICAgICB9O1xuICAgIH1cbiAgICBnZXQgcG9zaXRpb24oKSB7XG4gICAgICAgIGNvbnN0IHRhYmxlID0gdGhpcy5fZGVtby5yZWNvcmRpbmdDbGllbnRTbG90ID09IG51bGwgfHwgdGhpcy5pc1JlY29yZGluZ0RlbW9cbiAgICAgICAgICAgID8gXCJEVF9DU0xvY2FsUGxheWVyRXhjbHVzaXZlXCJcbiAgICAgICAgICAgIDogXCJEVF9DU05vbkxvY2FsUGxheWVyRXhjbHVzaXZlXCI7XG4gICAgICAgIGNvbnN0IHh5ID0gdGhpcy5nZXRQcm9wKHRhYmxlLCBcIm1fdmVjT3JpZ2luXCIpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgeDogeHkueCxcbiAgICAgICAgICAgIHk6IHh5LnksXG4gICAgICAgICAgICB6OiB0aGlzLmdldFByb3AodGFibGUsIFwibV92ZWNPcmlnaW5bMl1cIilcbiAgICAgICAgfTtcbiAgICB9XG4gICAgZ2V0IHZlbG9jaXR5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVtby5yZWNvcmRpbmdDbGllbnRTbG90ID09IG51bGwgfHwgdGhpcy5pc1JlY29yZGluZ0RlbW9cbiAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgIHg6IHRoaXMuZ2V0UHJvcChcIkRUX0xvY2FsUGxheWVyRXhjbHVzaXZlXCIsIFwibV92ZWNWZWxvY2l0eVswXVwiKSxcbiAgICAgICAgICAgICAgICB5OiB0aGlzLmdldFByb3AoXCJEVF9Mb2NhbFBsYXllckV4Y2x1c2l2ZVwiLCBcIm1fdmVjVmVsb2NpdHlbMV1cIiksXG4gICAgICAgICAgICAgICAgejogdGhpcy5nZXRQcm9wKFwiRFRfTG9jYWxQbGF5ZXJFeGNsdXNpdmVcIiwgXCJtX3ZlY1ZlbG9jaXR5WzJdXCIpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICA6IHsgeDogMCwgeTogMCwgejogMCB9O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTcGVlZCBvZiB0aGUgZW50aXR5LlxuICAgICAqIEByZXR1cm5zIFNwZWVkIGluIGdhbWUgdW5pdHMuXG4gICAgICovXG4gICAgZ2V0IHNwZWVkKCkge1xuICAgICAgICBjb25zdCB2ZWwgPSB0aGlzLnZlbG9jaXR5O1xuICAgICAgICByZXR1cm4gTWF0aC5zcXJ0KHZlbC54ICogdmVsLnggKyB2ZWwueSAqIHZlbC55ICsgdmVsLnogKiB2ZWwueik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEByZXR1cm5zIEN1cnJlbnQgY2FzaFxuICAgICAqL1xuICAgIGdldCBhY2NvdW50KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQcm9wKFwiRFRfQ1NQbGF5ZXJcIiwgXCJtX2lBY2NvdW50XCIpO1xuICAgIH1cbiAgICBnZXQgbGlmZVN0YXRlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQcm9wKFwiRFRfQmFzZVBsYXllclwiLCBcIm1fbGlmZVN0YXRlXCIpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAcmV0dXJucyBsaWZlU3RhdGUgPT0gMFxuICAgICAqL1xuICAgIGdldCBpc0FsaXZlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5saWZlU3RhdGUgPT09IDAgLyogTGlmZVN0YXRlLkFsaXZlICovO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAcmV0dXJucyBVc2VyIGluZm8gYXNzb2NpYXRlZCB3aXRoIHRoaXMgcGxheWVyXG4gICAgICovXG4gICAgZ2V0IHVzZXJJbmZvKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVtby5lbnRpdGllcy5fdXNlckluZm9UYWJsZS5lbnRyaWVzW3RoaXMuY2xpZW50U2xvdF1cbiAgICAgICAgICAgIC51c2VyRGF0YTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHJldHVybnMgVXNlciBJRFxuICAgICAqL1xuICAgIGdldCB1c2VySWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnVzZXJJbmZvLnVzZXJJZDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHJldHVybnMgU3RlYW0gSURcbiAgICAgKi9cbiAgICBnZXQgc3RlYW1JZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudXNlckluZm8uZ3VpZDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHJldHVybnMgU3RlYW0gNjQgSURcbiAgICAgKi9cbiAgICBnZXQgc3RlYW02NElkKCkge1xuICAgICAgICBpZiAodGhpcy5fc3RlYW02NElkQ2FjaGUgPT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHRoaXMuX3N0ZWFtNjRJZENhY2hlID0gdGhpcy51c2VySW5mby54dWlkLnRvU3RyaW5nKCk7XG4gICAgICAgIHJldHVybiB0aGlzLl9zdGVhbTY0SWRDYWNoZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHJldHVybnMgUGxheWVyIG5hbWVcbiAgICAgKi9cbiAgICBnZXQgbmFtZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudXNlckluZm8ubmFtZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHJldHVybnMgSXMgdGhpcyBwbGF5ZXIgZmFrZSAoaS5lLiBhIGJvdClcbiAgICAgKi9cbiAgICBnZXQgaXNGYWtlUGxheWVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy51c2VySW5mby5mYWtlUGxheWVyO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAcmV0dXJucyBJcyB0aGlzIHBsYXllciBhIEhMVFYgcmVsYXlcbiAgICAgKi9cbiAgICBnZXQgaXNIbHR2KCkge1xuICAgICAgICByZXR1cm4gdGhpcy51c2VySW5mby5pc0hsdHY7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEByZXR1cm5zIFBsYXllciBhcm1vciAoMC0xMDApXG4gICAgICovXG4gICAgZ2V0IGFybW9yKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQcm9wKFwiRFRfQ1NQbGF5ZXJcIiwgXCJtX0FybW9yVmFsdWVcIik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEByZXR1cm5zIEN1cnJlbnQgbmF2bWVzaCBwbGFjZSBuYW1lXG4gICAgICovXG4gICAgZ2V0IHBsYWNlTmFtZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UHJvcChcIkRUX0Jhc2VQbGF5ZXJcIiwgXCJtX3N6TGFzdFBsYWNlTmFtZVwiKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHJldHVybnMgQ3VycmVudGx5IGhlbGQgd2VhcG9uXG4gICAgICovXG4gICAgZ2V0IHdlYXBvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlbW8uZW50aXRpZXMuZ2V0QnlIYW5kbGUodGhpcy5nZXRQcm9wKFwiRFRfQmFzZUNvbWJhdENoYXJhY3RlclwiLCBcIm1faEFjdGl2ZVdlYXBvblwiKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEByZXR1cm5zIEFsbCB3ZWFwb25zIGhlbGRzIGJ5IHRoaXMgcGxheWVyXG4gICAgICovXG4gICAgZ2V0IHdlYXBvbnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldEluZGV4ZWRQcm9wcyhcIm1faE15V2VhcG9uc1wiKVxuICAgICAgICAgICAgLm1hcChoYW5kbGUgPT4gdGhpcy5fZGVtby5lbnRpdGllcy5nZXRCeUhhbmRsZShoYW5kbGUpKVxuICAgICAgICAgICAgLmZpbHRlcihlbnQgPT4gZW50ID8gZW50IGluc3RhbmNlb2Ygd2VhcG9uXzEuV2VhcG9uIDogZmFsc2UpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAcmV0dXJucyBJcyB0aGUgcGxheWVyIGlzIHRoZSBib21iIHpvbmU/XG4gICAgICovXG4gICAgZ2V0IGlzSW5Cb21iWm9uZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UHJvcChcIkRUX0NTUGxheWVyXCIsIFwibV9iSW5Cb21iWm9uZVwiKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHJldHVybnMgSXMgdGhlIHBsYXllciBpbiB0aGUgYnV5IHpvbmU/XG4gICAgICovXG4gICAgZ2V0IGlzSW5CdXlab25lKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQcm9wKFwiRFRfQ1NQbGF5ZXJcIiwgXCJtX2JJbkJ1eVpvbmVcIik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEByZXR1cm5zIElzIHRoZSBwbGF5ZXIgZGVmdXNpbmc/XG4gICAgICovXG4gICAgZ2V0IGlzRGVmdXNpbmcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFByb3AoXCJEVF9DU1BsYXllclwiLCBcIm1fYklzRGVmdXNpbmdcIik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEByZXR1cm5zIERvZXMgdGhlIHBsYXllciBoYXZlIGEgZGVmdXNlcj9cbiAgICAgKi9cbiAgICBnZXQgaGFzRGVmdXNlcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UHJvcChcIkRUX0NTUGxheWVyXCIsIFwibV9iSGFzRGVmdXNlclwiKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHJldHVybnMgRG9lcyB0aGUgcGxheWVyIGhhdmUgYSBoZWxtZXQ/XG4gICAgICovXG4gICAgZ2V0IGhhc0hlbG1ldCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UHJvcChcIkRUX0NTUGxheWVyXCIsIFwibV9iSGFzSGVsbWV0XCIpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAcmV0dXJucyBEb2VzIHRoZSBwbGF5ZXIgaXMgY29udHJvbGxpbmcgYSBCT1Q/XG4gICAgICovXG4gICAgZ2V0IGlzQ29udHJvbGxpbmdCb3QoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFByb3AoXCJEVF9DU1BsYXllclwiLCBcIm1fYklzQ29udHJvbGxpbmdCb3RcIik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHJpZXZlcyB0aGUgdmFsdWUgb2YgYW4gYXJyYXkgcHJvcGVydHkgb24gdGhlIHNpbmdsZXRvbiBlbnRpdHkgRFRfQ1NQbGF5ZXJSZXNvdXJjZS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcE5hbWUgLSBOYW1lIG9mIHRoZSBwcm9wZXJ0eSBvbiBEVF9DU1BsYXllclJlc291cmNlIHRvIHJldHJpZXZlXG4gICAgICogQHJldHVybnMgeyp9IFByb3BlcnR5IHZhbHVlXG4gICAgICovXG4gICAgcmVzb3VyY2VQcm9wKHRhYmxlTmFtZSkge1xuICAgICAgICBjb25zdCBhcnJheSA9IHRoaXMuX2RlbW8uZW50aXRpZXMucGxheWVyUmVzb3VyY2UuZ2V0SW5kZXhlZFByb3BzKHRhYmxlTmFtZSk7XG4gICAgICAgIHJldHVybiBhcnJheVt0aGlzLmluZGV4XTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHJldHVybnMgSG93IG1hbnkga2lsbHMgdGhlIHBsYXllciBoYXMgbWFkZVxuICAgICAqL1xuICAgIGdldCBraWxscygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVzb3VyY2VQcm9wKFwibV9pS2lsbHNcIik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEByZXR1cm5zIEhvdyBtYW55IGFzc2lzdHMgdGhlIHBsYXllciBoYXMgbWFkZVxuICAgICAqL1xuICAgIGdldCBhc3Npc3RzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yZXNvdXJjZVByb3AoXCJtX2lBc3Npc3RzXCIpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAcmV0dXJucyBIb3cgbWFueSB0aW1lcyB0aGUgcGxheWVyIGhhcyBkaWVkXG4gICAgICovXG4gICAgZ2V0IGRlYXRocygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVzb3VyY2VQcm9wKFwibV9pRGVhdGhzXCIpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAcmV0dXJucyBDYXNoIHRoYXQgdGhpcyBwbGF5ZXIgaGFzIHNwZW50IHRoaXMgcm91bmRcbiAgICAgKi9cbiAgICBnZXQgY2FzaFNwZW5kVGhpc1JvdW5kKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yZXNvdXJjZVByb3AoXCJtX2lDYXNoU3BlbnRUaGlzUm91bmRcIik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEByZXR1cm5zIENhc2ggdGhhdCB0aGUgcGxheWVyIGhhcyBzcGVudCBhbGwgZ2FtZVxuICAgICAqL1xuICAgIGdldCBjYXNoU3BlbmRUb3RhbCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVzb3VyY2VQcm9wKFwibV9pVG90YWxDYXNoU3BlbnRcIik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIHBsYXllciBob2xkcyB0aGUgQzRcbiAgICAgKi9cbiAgICBnZXQgaGFzQzQoKSB7XG4gICAgICAgIGNvbnN0IHByID0gdGhpcy5fZGVtby5lbnRpdGllcy5wbGF5ZXJSZXNvdXJjZTtcbiAgICAgICAgcmV0dXJuIHByLmdldFByb3AoXCJEVF9DU1BsYXllclJlc291cmNlXCIsIFwibV9pUGxheWVyQzRcIikgPT09IHRoaXMuaW5kZXg7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEByZXR1cm5zIFNjb3JlIG9mIHRoZSBwbGF5ZXJcbiAgICAgKi9cbiAgICBnZXQgc2NvcmUoKSB7XG4gICAgICAgIGNvbnN0IHByID0gdGhpcy5fZGVtby5lbnRpdGllcy5wbGF5ZXJSZXNvdXJjZTtcbiAgICAgICAgcmV0dXJuIHByLmdldEluZGV4ZWRQcm9wcyhcIm1faVNjb3JlXCIpW3RoaXMuaW5kZXhdO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAcmV0dXJucyBNVlBzIG9mIHRoZSBwbGF5ZXJcbiAgICAgKi9cbiAgICBnZXQgbXZwcygpIHtcbiAgICAgICAgY29uc3QgcHIgPSB0aGlzLl9kZW1vLmVudGl0aWVzLnBsYXllclJlc291cmNlO1xuICAgICAgICByZXR1cm4gcHIuZ2V0SW5kZXhlZFByb3BzKFwibV9pTVZQc1wiKVt0aGlzLmluZGV4XTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHJldHVybnMgQ2xhbnRhZyBvZiB0aGUgcGxheWVyXG4gICAgICovXG4gICAgZ2V0IGNsYW5UYWcoKSB7XG4gICAgICAgIGNvbnN0IHByID0gdGhpcy5fZGVtby5lbnRpdGllcy5wbGF5ZXJSZXNvdXJjZTtcbiAgICAgICAgcmV0dXJuIHByLmdldEluZGV4ZWRQcm9wcyhcIm1fc3pDbGFuXCIpW3RoaXMuaW5kZXhdO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAcmV0dXJucyBIYXMgdGhpcyBwbGF5ZXIgYmVlbiBzcG90dGVkIGJ5IGFueSBvdGhlcnM/XG4gICAgICovXG4gICAgZ2V0IGlzU3BvdHRlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UHJvcChcIkRUX0Jhc2VFbnRpdHlcIiwgXCJtX2JTcG90dGVkXCIpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgdGhpcyBwbGF5ZXIgaGFzIGJlZW4gc3BvdHRlZCBieSB0aGUgb3RoZXIuXG4gICAgICogTm90ZSB0aGF0IHRoaXMgc3RpbGwgcmV0dXJucyB0cnVlIGlmIHNwb3R0ZWQgYnkgdGhlIG90aGVyIHBsYXllciBldmVuIGlmXG4gICAgICogdGhlIG90aGVyIHBsYXllciBpcyBkZWFkLlxuICAgICAqIEBwYXJhbSBvdGhlciAtIE90aGVyIHBsYXllciBlbnRpdHlcbiAgICAgKiBAcmV0dXJucyBJcyB0aGlzIHBsYXllciBzcG90dGVkIGJ5IHRoZSBvdGhlcj9cbiAgICAgKi9cbiAgICBpc1Nwb3R0ZWRCeShvdGhlcikge1xuICAgICAgICBsZXQgYml0ID0gb3RoZXIuY2xpZW50U2xvdDtcbiAgICAgICAgbGV0IG1hc2sgPSBudWxsO1xuICAgICAgICBpZiAob3RoZXIuY2xpZW50U2xvdCA8IDMyKSB7XG4gICAgICAgICAgICBtYXNrID0gdGhpcy5nZXRQcm9wKFwibV9iU3BvdHRlZEJ5TWFza1wiLCBcIjAwMFwiKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGJpdCA9IG90aGVyLmNsaWVudFNsb3QgLSAzMjtcbiAgICAgICAgICAgIG1hc2sgPSB0aGlzLmdldFByb3AoXCJtX2JTcG90dGVkQnlNYXNrXCIsIFwiMDAxXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAobWFzayAmICgxIDw8IGJpdCkpICE9PSAwO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAcmV0dXJucyBBbGl2ZSBwbGF5ZXJzIHRoYXQgaGF2ZSBzcG90dGVkIHRoaXMgcGxheWVyXG4gICAgICovXG4gICAgZ2V0IGFsbFNwb3R0ZXJzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVtby5wbGF5ZXJzLmZpbHRlcihwID0+IHAuY2xpZW50U2xvdCAhPT0gdGhpcy5jbGllbnRTbG90ICYmIHAuaXNBbGl2ZSAmJiB0aGlzLmlzU3BvdHRlZEJ5KHApKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIHRoaXMgcGxheWVyIGhhcyBzcG90dGVkIGFub3RoZXIuXG4gICAgICogQ2FuIHN0aWxsIHJldHVybiB0cnVlIGV2ZW4gaWYgdGhpcyBwbGF5ZXIgaXMgZGVhZC5cbiAgICAgKiBAcGFyYW0gb3RoZXIgLSBPdGhlciBwbGF5ZXIgZW50aXR5XG4gICAgICogQHJldHVybnMgSGFzIHRoaXMgcGxheWVyIHNwb3R0ZWQgdGhlIG90aGVyP1xuICAgICAqL1xuICAgIGhhc1Nwb3R0ZWQob3RoZXIpIHtcbiAgICAgICAgcmV0dXJuIG90aGVyLmlzU3BvdHRlZEJ5KHRoaXMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAcmV0dXJucyBBbGl2ZSBwbGF5ZXJzIHRoYXQgdGhpcyBwbGF5ZXIgaGFzIHNwb3R0ZWRcbiAgICAgKi9cbiAgICBnZXQgYWxsU3BvdHRlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlbW8ucGxheWVycy5maWx0ZXIocCA9PiBwLmNsaWVudFNsb3QgIT09IHRoaXMuY2xpZW50U2xvdCAmJiBwLmlzQWxpdmUgJiYgdGhpcy5oYXNTcG90dGVkKHApKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHBhcmFtIG90aGVyIC0gT3RoZXIgcGxheWVyIGVudGl0eVxuICAgICAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIHR3byBwbGF5ZXJzIGFyZSBvbiB0aGUgc2FtZSB0ZWFtXG4gICAgICovXG4gICAgaXNGcmllbmRseShvdGhlcikge1xuICAgICAgICBjb25zdCBzYW1lVGVhbSA9IHRoaXMudGVhbU51bWJlciA9PT0gb3RoZXIudGVhbU51bWJlcjtcbiAgICAgICAgY29uc3QgdGVhbW1hdGVzQXJlRW5lbWllcyA9IHRoaXMuX2RlbW8uY29uVmFycy52YXJzLmdldChcIm1wX3RlYW1tYXRlc19hcmVfZW5lbWllc1wiKSB8fCAwO1xuICAgICAgICByZXR1cm4gc2FtZVRlYW0gJiYgIXRlYW1tYXRlc0FyZUVuZW1pZXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEByZXR1cm5zIElzIHNjb3BlZFxuICAgICAqL1xuICAgIGdldCBpc1Njb3BlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UHJvcChcIkRUX0NTUGxheWVyXCIsIFwibV9iSXNTY29wZWRcIik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEByZXR1cm5zIElzIHdhbGtpbmdcbiAgICAgKi9cbiAgICBnZXQgaXNXYWxraW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQcm9wKFwiRFRfQ1NQbGF5ZXJcIiwgXCJtX2JJc1dhbGtpbmdcIik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEByZXR1cm5zIFBsYXllciBpcyB0cmFuc2l0aW9uaW5nIGZyb20gZHVja2VkIC0+IHN0YW5kaW5nIG9yIHN0YW5kaW5nIC0+IGR1Y2tlZFxuICAgICAqL1xuICAgIGdldCBpc0R1Y2tpbmcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFByb3AoXCJEVF9Mb2NhbFwiLCBcIm1fYkR1Y2tpbmdcIik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEByZXR1cm5zIElzIGR1Y2tlZFxuICAgICAqL1xuICAgIGdldCBpc0R1Y2tlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UHJvcChcIkRUX0xvY2FsXCIsIFwibV9iRHVja2VkXCIpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAcmV0dXJucyBEdXJhdGlvbiBvZiBhIGZsYXNoIHRoYXQgaGl0IHRoZSBwbGF5ZXJcbiAgICAgKi9cbiAgICBnZXQgZmxhc2hEdXJhdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UHJvcChcIkRUX0NTUGxheWVyXCIsIFwibV9mbEZsYXNoRHVyYXRpb25cIik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEByZXR1cm5zIEN1cnJlbnQgZXF1aXBtZW50IHZhbHVlXG4gICAgICovXG4gICAgZ2V0IGN1cnJlbnRFcXVpcG1lbnRWYWx1ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UHJvcChcIkRUX0NTUGxheWVyXCIsIFwibV91bkN1cnJlbnRFcXVpcG1lbnRWYWx1ZVwiKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHJldHVybnMgUm91bmQgc3RhcnQgZXF1aXBtZW50IHZhbHVlXG4gICAgICovXG4gICAgZ2V0IHJvdW5kU3RhcnRFcXVpcG1lbnRWYWx1ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UHJvcChcIkRUX0NTUGxheWVyXCIsIFwibV91blJvdW5kU3RhcnRFcXVpcG1lbnRWYWx1ZVwiKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHJldHVybnMgRnJlZXplIHRpbWUgZW5kIGVxdWlwbWVudCB2YWx1ZVxuICAgICAqL1xuICAgIGdldCBmcmVlemVUaW1lRW5kRXF1aXBtZW50VmFsdWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFByb3AoXCJEVF9DU1BsYXllclwiLCBcIm1fdW5GcmVlemV0aW1lRW5kRXF1aXBtZW50VmFsdWVcIik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEByZXR1cm5zIE9iamVjdCByZXByZXNlbnRpbmcgdGhlIHBsYXllcidzIHBlcmZvcm1hbmNlIHBlciByb3VuZFxuICAgICAqL1xuICAgIGdldCBtYXRjaFN0YXRzKCkge1xuICAgICAgICBjb25zdCBraWxscyA9IHRoaXMuZ2V0SW5kZXhlZFByb3BzKFwibV9pTWF0Y2hTdGF0c19LaWxsc1wiKTtcbiAgICAgICAgY29uc3QgZGFtYWdlID0gdGhpcy5nZXRJbmRleGVkUHJvcHMoXCJtX2lNYXRjaFN0YXRzX0RhbWFnZVwiKTtcbiAgICAgICAgY29uc3QgZXF1aXBtZW50VmFsdWUgPSB0aGlzLmdldEluZGV4ZWRQcm9wcyhcIm1faU1hdGNoU3RhdHNfRXF1aXBtZW50VmFsdWVcIik7XG4gICAgICAgIGNvbnN0IG1vbmV5U2F2ZWQgPSB0aGlzLmdldEluZGV4ZWRQcm9wcyhcIm1faU1hdGNoU3RhdHNfTW9uZXlTYXZlZFwiKTtcbiAgICAgICAgY29uc3Qga2lsbFJld2FyZCA9IHRoaXMuZ2V0SW5kZXhlZFByb3BzKFwibV9pTWF0Y2hTdGF0c19LaWxsUmV3YXJkXCIpO1xuICAgICAgICBjb25zdCBsaXZlVGltZSA9IHRoaXMuZ2V0SW5kZXhlZFByb3BzKFwibV9pTWF0Y2hTdGF0c19MaXZlVGltZVwiKTtcbiAgICAgICAgY29uc3QgZGVhdGhzID0gdGhpcy5nZXRJbmRleGVkUHJvcHMoXCJtX2lNYXRjaFN0YXRzX0RlYXRoc1wiKTtcbiAgICAgICAgY29uc3QgYXNzaXN0cyA9IHRoaXMuZ2V0SW5kZXhlZFByb3BzKFwibV9pTWF0Y2hTdGF0c19Bc3Npc3RzXCIpO1xuICAgICAgICBjb25zdCBoZWFkU2hvdEtpbGxzID0gdGhpcy5nZXRJbmRleGVkUHJvcHMoXCJtX2lNYXRjaFN0YXRzX0hlYWRTaG90S2lsbHNcIik7XG4gICAgICAgIGNvbnN0IG9iamVjdGl2ZSA9IHRoaXMuZ2V0SW5kZXhlZFByb3BzKFwibV9pTWF0Y2hTdGF0c19PYmplY3RpdmVcIik7XG4gICAgICAgIGNvbnN0IHJvdW5kcyA9IG5ldyBBcnJheSgpO1xuICAgICAgICBmb3IgKGxldCByb3VuZElkeCA9IDA7IHJvdW5kSWR4IDwga2lsbHMubGVuZ3RoOyArK3JvdW5kSWR4KSB7XG4gICAgICAgICAgICByb3VuZHMucHVzaCh7XG4gICAgICAgICAgICAgICAga2lsbHM6IGtpbGxzW3JvdW5kSWR4XSxcbiAgICAgICAgICAgICAgICBkYW1hZ2U6IGRhbWFnZVtyb3VuZElkeF0sXG4gICAgICAgICAgICAgICAgZXF1aXBtZW50VmFsdWU6IGVxdWlwbWVudFZhbHVlW3JvdW5kSWR4XSxcbiAgICAgICAgICAgICAgICBtb25leVNhdmVkOiBtb25leVNhdmVkW3JvdW5kSWR4XSxcbiAgICAgICAgICAgICAgICBraWxsUmV3YXJkOiBraWxsUmV3YXJkW3JvdW5kSWR4XSxcbiAgICAgICAgICAgICAgICBsaXZlVGltZTogbGl2ZVRpbWVbcm91bmRJZHhdLFxuICAgICAgICAgICAgICAgIGRlYXRoczogZGVhdGhzW3JvdW5kSWR4XSxcbiAgICAgICAgICAgICAgICBhc3Npc3RzOiBhc3Npc3RzW3JvdW5kSWR4XSxcbiAgICAgICAgICAgICAgICBoZWFkU2hvdEtpbGxzOiBoZWFkU2hvdEtpbGxzW3JvdW5kSWR4XSxcbiAgICAgICAgICAgICAgICBvYmplY3RpdmU6IG9iamVjdGl2ZVtyb3VuZElkeF1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByb3VuZHM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEByZXR1cm5zIE9iamVjdCByZXByZXNlbnRpbmcgdXNlci1jdXN0b21pc2FibGUgY3Jvc3NoYWlyIHNldHRpbmdzLlxuICAgICAqL1xuICAgIGdldCBjcm9zc2hhaXJJbmZvKCkge1xuICAgICAgICByZXR1cm4gKDAsIGNyb3NzaGFpcl8xLmRlY29kZUNyb3NzaGFpckNvZGUpKHRoaXMucmVzb3VyY2VQcm9wKFwibV9zekNyb3NzaGFpckNvZGVzXCIpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHJldHVybnMgdHJ1ZSBpZiB0aGlzIHBsYXllciBpcyByZWNvcmRpbmcgdGhlIGRlbW8gZnJvbSB0aGVpciBQT1YuXG4gICAgICovXG4gICAgZ2V0IGlzUmVjb3JkaW5nRGVtbygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlbW8ucmVjb3JkaW5nQ2xpZW50U2xvdCA9PT0gdGhpcy5jbGllbnRTbG90O1xuICAgIH1cbn1cbmV4cG9ydHMuUGxheWVyID0gUGxheWVyO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cGxheWVyLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5Qcm9qZWN0aWxlID0gdm9pZCAwO1xuY29uc3QgYmFzZWVudGl0eV8xID0gcmVxdWlyZShcIi4vYmFzZWVudGl0eVwiKTtcbi8qKlxuICogUmVwcmVzZW50cyBhIGdyZW5hZGUgcHJvamVjdGlsZS5cbiAqL1xuY2xhc3MgUHJvamVjdGlsZSBleHRlbmRzIGJhc2VlbnRpdHlfMS5CYXNlRW50aXR5IHtcbiAgICAvKipcbiAgICAgKiBAcmV0dXJucyB7R3JlbmFkZVR5cGV9IFR5cGUgb2YgZ3JlbmFkZSB0aGF0IHRoaXMgcHJvamVjdGlsZSBpcy5cbiAgICAgKi9cbiAgICBnZXQgZ3JlbmFkZVR5cGUoKSB7XG4gICAgICAgIHN3aXRjaCAodGhpcy5tb2RlbE5hbWUpIHtcbiAgICAgICAgICAgIGNhc2UgXCJtb2RlbHMvV2VhcG9ucy93X2VxX2ZyYWdncmVuYWRlX2Ryb3BwZWQubWRsXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiZXhwbG9zaXZlXCI7XG4gICAgICAgICAgICBjYXNlIFwibW9kZWxzL1dlYXBvbnMvd19lcV9mbGFzaGJhbmdfZHJvcHBlZC5tZGxcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJmbGFzaGJhbmdcIjtcbiAgICAgICAgICAgIGNhc2UgXCJtb2RlbHMvV2VhcG9ucy93X2VxX21vbG90b3ZfZHJvcHBlZC5tZGxcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJtb2xvdG92XCI7XG4gICAgICAgICAgICBjYXNlIFwibW9kZWxzL1dlYXBvbnMvd19lcV9pbmNlbmRpYXJ5Z3JlbmFkZV9kcm9wcGVkLm1kbFwiOlxuICAgICAgICAgICAgICAgIHJldHVybiBcImluY2VuZGlhcnlcIjtcbiAgICAgICAgICAgIGNhc2UgXCJtb2RlbHMvV2VhcG9ucy93X2VxX2RlY295X2Ryb3BwZWQubWRsXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiZGVjb3lcIjtcbiAgICAgICAgICAgIGNhc2UgXCJtb2RlbHMvV2VhcG9ucy93X2VxX3Ntb2tlZ3JlbmFkZV90aHJvd24ubWRsXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwic21va2VcIjtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIHByb2plY3RpbGUgd2l0aCBtb2RlbDogJHt0aGlzLm1vZGVsTmFtZX1gKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmV4cG9ydHMuUHJvamVjdGlsZSA9IFByb2plY3RpbGU7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1wcm9qZWN0aWxlLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5UZWFtID0gdm9pZCAwO1xuY29uc3QgbmV0d29ya2FibGVfMSA9IHJlcXVpcmUoXCIuL25ldHdvcmthYmxlXCIpO1xuY29uc3QgcGxheWVyXzEgPSByZXF1aXJlKFwiLi9wbGF5ZXJcIik7XG4vKipcbiAqIFJlcHJlc2VudHMgYW4gaW4tZ2FtZSB0ZWFtLlxuICovXG5jbGFzcyBUZWFtIGV4dGVuZHMgbmV0d29ya2FibGVfMS5OZXR3b3JrYWJsZSB7XG4gICAgLyoqXG4gICAgICogQHJldHVybnMge1BsYXllcltdfSBBbGwgcGxheWVycyBpbiB0aGlzIHRlYW1cbiAgICAgKi9cbiAgICBnZXQgbWVtYmVycygpIHtcbiAgICAgICAgLy8gVU5TQUZFOiBjYXN0IGhlcmUgYXMgbWVtYmVycyB3aWxsIGFsd2F5cyBiZSBwbGF5ZXJzXG4gICAgICAgIHJldHVybiB0aGlzLmdldFByb3AoXCJEVF9UZWFtXCIsICdcInBsYXllcl9hcnJheVwiJylcbiAgICAgICAgICAgIC5tYXAoaW5kZXggPT4gdGhpcy5fZGVtby5lbnRpdGllcy5lbnRpdGllcy5nZXQoaW5kZXgpKVxuICAgICAgICAgICAgLmZpbHRlcihwbGF5ZXIgPT4gcGxheWVyIGluc3RhbmNlb2YgcGxheWVyXzEuUGxheWVyKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHJldHVybnMge2ludH0gMDogVW5hc3NpZ25lZCwgMTogU3BlY3RhdG9yLCAyOiBUZXJyb3Jpc3QsIDM6IENvdW50ZXItVGVycm9yaXN0XG4gICAgICovXG4gICAgZ2V0IHRlYW1OdW1iZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFByb3AoXCJEVF9UZWFtXCIsIFwibV9pVGVhbU51bVwiKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHJldHVybnMgQ2xhbiBuYW1lXG4gICAgICovXG4gICAgZ2V0IGNsYW5OYW1lKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQcm9wKFwiRFRfVGVhbVwiLCBcIm1fc3pDbGFuVGVhbW5hbWVcIik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEByZXR1cm5zICdTUEVDVEFUT1InLCAnVEVSUk9SSVNUJyBvciAnQ09VTlRFUlRFUlJPUklTVCdcbiAgICAgKi9cbiAgICBnZXQgdGVhbU5hbWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFByb3AoXCJEVF9UZWFtXCIsIFwibV9zelRlYW1uYW1lXCIpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAcmV0dXJucyBUb3RhbCBzY29yZVxuICAgICAqL1xuICAgIGdldCBzY29yZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UHJvcChcIkRUX1RlYW1cIiwgXCJtX3Njb3JlVG90YWxcIik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEByZXR1cm5zIEZpcnN0IGhhbGYgc2NvcmVcbiAgICAgKi9cbiAgICBnZXQgc2NvcmVGaXJzdEhhbGYoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFByb3AoXCJEVF9UZWFtXCIsIFwibV9zY29yZUZpcnN0SGFsZlwiKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHJldHVybnMgU2Vjb25kIGhhbGYgc2NvcmVcbiAgICAgKi9cbiAgICBnZXQgc2NvcmVTZWNvbmRIYWxmKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQcm9wKFwiRFRfVGVhbVwiLCBcIm1fc2NvcmVTZWNvbmRIYWxmXCIpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAcmV0dXJucyBUZWFtIGZsYWcgaW1hZ2VcbiAgICAgKi9cbiAgICBnZXQgZmxhZ0ltYWdlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQcm9wKFwiRFRfVGVhbVwiLCBcIm1fc3pUZWFtRmxhZ0ltYWdlXCIpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAcmV0dXJucyBUZWFtIGxvZ28gaW1hZ2VcbiAgICAgKi9cbiAgICBnZXQgbG9nb0ltYWdlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQcm9wKFwiRFRfVGVhbVwiLCBcIm1fc3pUZWFtTG9nb0ltYWdlXCIpO1xuICAgIH1cbn1cbmV4cG9ydHMuVGVhbSA9IFRlYW07XG4vLyMgc291cmNlTWFwcGluZ1VSTD10ZWFtLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5XZWFwb24gPSB2b2lkIDA7XG5jb25zdCBiYXNlZW50aXR5XzEgPSByZXF1aXJlKFwiLi9iYXNlZW50aXR5XCIpO1xuY29uc3QgaXRlbWRlZnNfMSA9IHJlcXVpcmUoXCIuL2l0ZW1kZWZzXCIpO1xuY29uc3QgcXVhbGl0aWVzID0gW1xuICAgIFwibm9ybWFsXCIsXG4gICAgXCJnZW51aW5lXCIsXG4gICAgXCJ2aW50YWdlXCIsXG4gICAgXCJ1bnVzdWFsXCIsXG4gICAgXCJ1bmlxdWVcIixcbiAgICBcImNvbW11bml0eVwiLFxuICAgIFwiZGV2ZWxvcGVyXCIsXG4gICAgXCJzZWxmbWFkZVwiLFxuICAgIFwiY3VzdG9taXplZFwiLFxuICAgIFwic3RyYW5nZVwiLFxuICAgIFwiY29tcGxldGVkXCIsXG4gICAgXCJoYXVudGVkXCIsXG4gICAgXCJ0b3VybmFtZW50XCIsXG4gICAgXCJmYXZvcmVkXCJcbl07XG4vKipcbiAqIFJlcHJlc2VudHMgYW4gaW4tZ2FtZSB3ZWFwb24gKGd1bnMsIGdyZW5hZGVzLCBrbmlmZXMpLlxuICovXG5jbGFzcyBXZWFwb24gZXh0ZW5kcyBiYXNlZW50aXR5XzEuQmFzZUVudGl0eSB7XG4gICAgLyoqXG4gICAgICogQHJldHVybnMgT3duaW5nIHBsYXllciwgaWYgYW55XG4gICAgICovXG4gICAgZ2V0IG93bmVyKCkge1xuICAgICAgICByZXR1cm4gc3VwZXIub3duZXI7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEByZXR1cm5zIEl0ZW0gZGVmaW5pdGlvbiBpbmRleFxuICAgICAqL1xuICAgIGdldCBpdGVtSW5kZXgoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFByb3AoXCJEVF9TY3JpcHRDcmVhdGVkSXRlbVwiLCBcIm1faUl0ZW1EZWZpbml0aW9uSW5kZXhcIik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEByZXR1cm5zIE5hbWUgb2YgdGhlIHdlYXBvbiAoZS5nLiBcIkZpdmUtU2V2ZU5cIilcbiAgICAgKi9cbiAgICBnZXQgaXRlbU5hbWUoKSB7XG4gICAgICAgIGNvbnN0IHdlYXBvbklkID0gdGhpcy5pdGVtSW5kZXg7XG4gICAgICAgIGNvbnN0IGl0ZW1EZWZpbml0aW9uID0gaXRlbWRlZnNfMS5pdGVtRGVmaW5pdGlvbkluZGV4TWFwW3dlYXBvbklkXTtcbiAgICAgICAgcmV0dXJuIGl0ZW1EZWZpbml0aW9uICE9PSB1bmRlZmluZWQgPyBpdGVtRGVmaW5pdGlvbi5pdGVtTmFtZSA6IG51bGw7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEByZXR1cm5zIEVudGl0eSBjbGFzcyBuYW1lIG9mIHRoZSB3ZWFwb24gKGUuZy4gXCJ3ZWFwb25fYWs0N1wiKVxuICAgICAqL1xuICAgIGdldCBjbGFzc05hbWUoKSB7XG4gICAgICAgIGNvbnN0IHdlYXBvbklkID0gdGhpcy5pdGVtSW5kZXg7XG4gICAgICAgIGNvbnN0IGl0ZW1EZWZpbml0aW9uID0gaXRlbWRlZnNfMS5pdGVtRGVmaW5pdGlvbkluZGV4TWFwW3dlYXBvbklkXTtcbiAgICAgICAgcmV0dXJuIGl0ZW1EZWZpbml0aW9uICE9PSB1bmRlZmluZWQgPyBpdGVtRGVmaW5pdGlvbi5jbGFzc05hbWUgOiBudWxsO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAcmV0dXJucyBQcmV2aW91cyBvd25lclxuICAgICAqL1xuICAgIGdldCBwcmV2T3duZXIoKSB7XG4gICAgICAgIGNvbnN0IGhhbmRsZSA9IHRoaXMuZ2V0UHJvcChcIkRUX1dlYXBvbkNTQmFzZVwiLCBcIm1faFByZXZPd25lclwiKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlbW8uZW50aXRpZXMuZ2V0QnlIYW5kbGUoaGFuZGxlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHJldHVybnMgQW1vdW50IG9mIGFtbW8gaW4gdGhlIGNsaXAgb2YgdGhlIHdlYXBvblxuICAgICAqL1xuICAgIGdldCBjbGlwQW1tbygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UHJvcChcIkRUX0Jhc2VDb21iYXRXZWFwb25cIiwgXCJtX2lDbGlwMVwiKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHJldHVybnMgVGhlIGFtb3VudCBhbW1vIHRoaXMgd2VhcG9uIGhhcyBpbiByZXNlcnZlXG4gICAgICovXG4gICAgZ2V0IHJlc2VydmVBbW1vKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQcm9wKFwiRFRfQmFzZUNvbWJhdFdlYXBvblwiLCBcIm1faVByaW1hcnlSZXNlcnZlQW1tb0NvdW50XCIpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAcmV0dXJucyBUaGUgYW1vdW50IG9mIGFtbW8gdGhlIG93bmVyIGhvbGRzIGZvciB0aGlzIHdlYXBvbi4gTnVsbCBpZiBubyBvd25lci5cbiAgICAgKi9cbiAgICBnZXQgb3duZXJBbW1vKCkge1xuICAgICAgICBpZiAoIXRoaXMub3duZXIpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgY29uc3QgYW1tb1R5cGUgPSB0aGlzLmdldFByb3AoXCJEVF9Mb2NhbFdlYXBvbkRhdGFcIiwgXCJtX2lQcmltYXJ5QW1tb1R5cGVcIik7XG4gICAgICAgIGlmIChhbW1vVHlwZSA9PT0gLTEpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgcmV0dXJuIHRoaXMub3duZXIuZ2V0SW5kZXhlZFByb3BzKFwibV9pQW1tb1wiKVthbW1vVHlwZV07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEByZXR1cm5zIFF1YWxpdHkgb2YgdGhlIGl0ZW0uXG4gICAgICovXG4gICAgZ2V0IHF1YWxpdHkoKSB7XG4gICAgICAgIGNvbnN0IHF1YWxpdHkgPSB0aGlzLmdldFByb3AoXCJEVF9TY3JpcHRDcmVhdGVkSXRlbVwiLCBcIm1faUVudGl0eVF1YWxpdHlcIik7XG4gICAgICAgIHJldHVybiBxdWFsaXRpZXNbcXVhbGl0eV07XG4gICAgfVxufVxuZXhwb3J0cy5XZWFwb24gPSBXZWFwb247XG4vLyMgc291cmNlTWFwcGluZ1VSTD13ZWFwb24uanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLkVudGl0eUhhbmRsZSA9IHZvaWQgMDtcbmNvbnN0IGNvbnN0c18xID0gcmVxdWlyZShcIi4vY29uc3RzXCIpO1xuY2xhc3MgRW50aXR5SGFuZGxlIHtcbiAgICBjb25zdHJ1Y3Rvcih2YWx1ZSkge1xuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgfVxuICAgIGdldCBpc1ZhbGlkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy52YWx1ZSAhPT0gY29uc3RzXzEuSU5WQUxJRF9ORVRXT1JLRURfRUhBTkRMRV9WQUxVRTtcbiAgICB9XG4gICAgZ2V0IGluZGV4KCkge1xuICAgICAgICByZXR1cm4gdGhpcy52YWx1ZSAmIGNvbnN0c18xLk5FVFdPUktFRF9FSEFORExFX0VOVF9FTlRSWV9NQVNLO1xuICAgIH1cbiAgICBnZXQgc2VyaWFsTnVtKCkge1xuICAgICAgICByZXR1cm4gdGhpcy52YWx1ZSA+PiBjb25zdHNfMS5NQVhfRURJQ1RfQklUUztcbiAgICB9XG59XG5leHBvcnRzLkVudGl0eUhhbmRsZSA9IEVudGl0eUhhbmRsZTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWVudGl0eWhhbmRsZS5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtbWVtYmVyLWFjY2VzcywgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1hcmd1bWVudCwgc29uYXJqcy9uby1kdXBsaWNhdGVkLWJyYW5jaGVzICovXG4vLyBETyBOT1QgTU9ESUZZIVxuLy8gQXV0by1nZW5lcmF0ZWQgYnkgLi9nZW5lcmF0b3JzL2V2ZW50dHlwZXMudHNcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuYW5ub3RhdGVFdmVudCA9IHZvaWQgMDtcbmNvbnN0IGl0ZW1kZWZzXzEgPSByZXF1aXJlKFwiLi9lbnRpdGllcy9pdGVtZGVmc1wiKTtcbmNvbnN0IExvbmcgPSByZXF1aXJlKFwibG9uZ1wiKTtcbmZ1bmN0aW9uIGFubm90YXRlRXZlbnQoZW50aXRpZXMsIGV2ZW50TmFtZSwgZXZlbnQpIHtcbiAgICBpZiAoZXZlbnROYW1lID09PSBcImJvbWJfYmVnaW5kZWZ1c2VcIikge1xuICAgICAgICBldmVudC5wbGF5ZXIgPSBlbnRpdGllcy5nZXRCeVVzZXJJZChldmVudC51c2VyaWQpO1xuICAgIH1cbiAgICBlbHNlIGlmIChldmVudE5hbWUgPT09IFwiYm9tYl9iZWdpbnBsYW50XCIpIHtcbiAgICAgICAgZXZlbnQucGxheWVyID0gZW50aXRpZXMuZ2V0QnlVc2VySWQoZXZlbnQudXNlcmlkKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoZXZlbnROYW1lID09PSBcImJvbWJfZGVmdXNlZFwiKSB7XG4gICAgICAgIGV2ZW50LnBsYXllciA9IGVudGl0aWVzLmdldEJ5VXNlcklkKGV2ZW50LnVzZXJpZCk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGV2ZW50TmFtZSA9PT0gXCJib21iX2Ryb3BwZWRcIikge1xuICAgICAgICBldmVudC5wbGF5ZXIgPSBlbnRpdGllcy5nZXRCeVVzZXJJZChldmVudC51c2VyaWQpO1xuICAgICAgICBldmVudC5lbnRpdHkgPSBlbnRpdGllcy5lbnRpdGllcy5nZXQoZXZlbnQuZW50aW5kZXgpO1xuICAgIH1cbiAgICBlbHNlIGlmIChldmVudE5hbWUgPT09IFwiYm9tYl9leHBsb2RlZFwiKSB7XG4gICAgICAgIGV2ZW50LnBsYXllciA9IGVudGl0aWVzLmdldEJ5VXNlcklkKGV2ZW50LnVzZXJpZCk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGV2ZW50TmFtZSA9PT0gXCJib21iX3BpY2t1cFwiKSB7XG4gICAgICAgIGV2ZW50LnBsYXllciA9IGVudGl0aWVzLmdldEJ5VXNlcklkKGV2ZW50LnVzZXJpZCk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGV2ZW50TmFtZSA9PT0gXCJib21iX3BsYW50ZWRcIikge1xuICAgICAgICBldmVudC5wbGF5ZXIgPSBlbnRpdGllcy5nZXRCeVVzZXJJZChldmVudC51c2VyaWQpO1xuICAgIH1cbiAgICBlbHNlIGlmIChldmVudE5hbWUgPT09IFwiYm90X3Rha2VvdmVyXCIpIHtcbiAgICAgICAgZXZlbnQucGxheWVyID0gZW50aXRpZXMuZ2V0QnlVc2VySWQoZXZlbnQudXNlcmlkKTtcbiAgICAgICAgZXZlbnQuYm90ID0gZW50aXRpZXMuZ2V0QnlVc2VySWQoZXZlbnQuYm90aWQpO1xuICAgIH1cbiAgICBlbHNlIGlmIChldmVudE5hbWUgPT09IFwiY3Nfd2luX3BhbmVsX3JvdW5kXCIpIHtcbiAgICAgICAgZXZlbnQucGxheWVyID0gZW50aXRpZXMuZW50aXRpZXMuZ2V0KGV2ZW50LmZ1bmZhY3RfcGxheWVyKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoZXZlbnROYW1lID09PSBcImRlY295X2RldG9uYXRlXCIpIHtcbiAgICAgICAgZXZlbnQucGxheWVyID0gZW50aXRpZXMuZ2V0QnlVc2VySWQoZXZlbnQudXNlcmlkKTtcbiAgICAgICAgZXZlbnQuZW50aXR5ID0gZW50aXRpZXMuZW50aXRpZXMuZ2V0KGV2ZW50LmVudGl0eWlkKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoZXZlbnROYW1lID09PSBcImRlY295X3N0YXJ0ZWRcIikge1xuICAgICAgICBldmVudC5wbGF5ZXIgPSBlbnRpdGllcy5nZXRCeVVzZXJJZChldmVudC51c2VyaWQpO1xuICAgICAgICBldmVudC5lbnRpdHkgPSBlbnRpdGllcy5lbnRpdGllcy5nZXQoZXZlbnQuZW50aXR5aWQpO1xuICAgIH1cbiAgICBlbHNlIGlmIChldmVudE5hbWUgPT09IFwiZGVmdXNlcl9kcm9wcGVkXCIpIHtcbiAgICAgICAgZXZlbnQuZW50aXR5ID0gZW50aXRpZXMuZW50aXRpZXMuZ2V0KGV2ZW50LmVudGl0eWlkKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoZXZlbnROYW1lID09PSBcImRlZnVzZXJfcGlja3VwXCIpIHtcbiAgICAgICAgZXZlbnQuZW50aXR5ID0gZW50aXRpZXMuZW50aXRpZXMuZ2V0KGV2ZW50LmVudGl0eWlkKTtcbiAgICAgICAgZXZlbnQucGxheWVyID0gZW50aXRpZXMuZ2V0QnlVc2VySWQoZXZlbnQudXNlcmlkKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoZXZlbnROYW1lID09PSBcImZsYXNoYmFuZ19kZXRvbmF0ZVwiKSB7XG4gICAgICAgIGV2ZW50LnBsYXllciA9IGVudGl0aWVzLmdldEJ5VXNlcklkKGV2ZW50LnVzZXJpZCk7XG4gICAgICAgIGV2ZW50LmVudGl0eSA9IGVudGl0aWVzLmVudGl0aWVzLmdldChldmVudC5lbnRpdHlpZCk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGV2ZW50TmFtZSA9PT0gXCJoZWdyZW5hZGVfZGV0b25hdGVcIikge1xuICAgICAgICBldmVudC5wbGF5ZXIgPSBlbnRpdGllcy5nZXRCeVVzZXJJZChldmVudC51c2VyaWQpO1xuICAgICAgICBldmVudC5lbnRpdHkgPSBlbnRpdGllcy5lbnRpdGllcy5nZXQoZXZlbnQuZW50aXR5aWQpO1xuICAgIH1cbiAgICBlbHNlIGlmIChldmVudE5hbWUgPT09IFwiaG9zdGFnZV9odXJ0XCIpIHtcbiAgICAgICAgZXZlbnQucGxheWVyID0gZW50aXRpZXMuZ2V0QnlVc2VySWQoZXZlbnQudXNlcmlkKTtcbiAgICAgICAgZXZlbnQuZW50aXR5ID0gZW50aXRpZXMuZW50aXRpZXMuZ2V0KGV2ZW50Lmhvc3RhZ2UpO1xuICAgIH1cbiAgICBlbHNlIGlmIChldmVudE5hbWUgPT09IFwiaG9zdGFnZV9raWxsZWRcIikge1xuICAgICAgICBldmVudC5wbGF5ZXIgPSBlbnRpdGllcy5nZXRCeVVzZXJJZChldmVudC51c2VyaWQpO1xuICAgICAgICBldmVudC5lbnRpdHkgPSBlbnRpdGllcy5lbnRpdGllcy5nZXQoZXZlbnQuaG9zdGFnZSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGV2ZW50TmFtZSA9PT0gXCJob3N0YWdlX3Jlc2N1ZWRcIikge1xuICAgICAgICBldmVudC5wbGF5ZXIgPSBlbnRpdGllcy5nZXRCeVVzZXJJZChldmVudC51c2VyaWQpO1xuICAgICAgICBldmVudC5lbnRpdHkgPSBlbnRpdGllcy5lbnRpdGllcy5nZXQoZXZlbnQuaG9zdGFnZSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGV2ZW50TmFtZSA9PT0gXCJpbmZlcm5vX2V4cGlyZVwiKSB7XG4gICAgICAgIGV2ZW50LmVudGl0eSA9IGVudGl0aWVzLmVudGl0aWVzLmdldChldmVudC5lbnRpdHlpZCk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGV2ZW50TmFtZSA9PT0gXCJpbmZlcm5vX3N0YXJ0YnVyblwiKSB7XG4gICAgICAgIGV2ZW50LmVudGl0eSA9IGVudGl0aWVzLmVudGl0aWVzLmdldChldmVudC5lbnRpdHlpZCk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGV2ZW50TmFtZSA9PT0gXCJpdGVtX2VxdWlwXCIpIHtcbiAgICAgICAgZXZlbnQucGxheWVyID0gZW50aXRpZXMuZ2V0QnlVc2VySWQoZXZlbnQudXNlcmlkKTtcbiAgICAgICAgZXZlbnQuaXRlbURlZmluaXRpb24gPSBpdGVtZGVmc18xLml0ZW1EZWZpbml0aW9uSW5kZXhNYXBbZXZlbnQuZGVmaW5kZXhdIHx8IG51bGw7XG4gICAgfVxuICAgIGVsc2UgaWYgKGV2ZW50TmFtZSA9PT0gXCJpdGVtX3BpY2t1cFwiKSB7XG4gICAgICAgIGV2ZW50LnBsYXllciA9IGVudGl0aWVzLmdldEJ5VXNlcklkKGV2ZW50LnVzZXJpZCk7XG4gICAgICAgIGV2ZW50Lml0ZW1EZWZpbml0aW9uID0gaXRlbWRlZnNfMS5pdGVtRGVmaW5pdGlvbkluZGV4TWFwW2V2ZW50LmRlZmluZGV4XSB8fCBudWxsO1xuICAgIH1cbiAgICBlbHNlIGlmIChldmVudE5hbWUgPT09IFwiaXRlbV9yZW1vdmVcIikge1xuICAgICAgICBldmVudC5wbGF5ZXIgPSBlbnRpdGllcy5nZXRCeVVzZXJJZChldmVudC51c2VyaWQpO1xuICAgICAgICBldmVudC5pdGVtRGVmaW5pdGlvbiA9IGl0ZW1kZWZzXzEuaXRlbURlZmluaXRpb25JbmRleE1hcFtldmVudC5kZWZpbmRleF0gfHwgbnVsbDtcbiAgICB9XG4gICAgZWxzZSBpZiAoZXZlbnROYW1lID09PSBcIml0ZW1zX2dpZnRlZFwiKSB7XG4gICAgICAgIGV2ZW50LmVudGl0eSA9IGVudGl0aWVzLmdldEJ5QWNjb3VudElkKGV2ZW50LmFjY291bnRpZCk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGV2ZW50TmFtZSA9PT0gXCJvdGhlcl9kZWF0aFwiKSB7XG4gICAgICAgIGV2ZW50LnZpY3RpbSA9IGVudGl0aWVzLmVudGl0aWVzLmdldChldmVudC5vdGhlcmlkKTtcbiAgICAgICAgZXZlbnQuYXR0YWNrZXJFbnRpdHkgPSBlbnRpdGllcy5nZXRCeVVzZXJJZChldmVudC5hdHRhY2tlcik7XG4gICAgICAgIGV2ZW50Lml0ZW1EZWZpbml0aW9uID1cbiAgICAgICAgICAgIGV2ZW50LndlYXBvbl9mYXV4aXRlbWlkICE9IFwiXCJcbiAgICAgICAgICAgICAgICA/IGl0ZW1kZWZzXzEuaXRlbURlZmluaXRpb25JbmRleE1hcFtMb25nLmZyb21TdHJpbmcoZXZlbnQud2VhcG9uX2ZhdXhpdGVtaWQsIHRydWUpXG4gICAgICAgICAgICAgICAgICAgIC5hbmQoMHhmZmZmKVxuICAgICAgICAgICAgICAgICAgICAudG9TdHJpbmcoKV1cbiAgICAgICAgICAgICAgICA6IG51bGw7XG4gICAgICAgIGV2ZW50LnBhaW50S2l0ID1cbiAgICAgICAgICAgIGV2ZW50LndlYXBvbl9mYXV4aXRlbWlkICE9IFwiXCJcbiAgICAgICAgICAgICAgICA/IGl0ZW1kZWZzXzEucGFpbnRLaXRJbmRleE1hcFtMb25nLmZyb21TdHJpbmcoZXZlbnQud2VhcG9uX2ZhdXhpdGVtaWQsIHRydWUpXG4gICAgICAgICAgICAgICAgICAgIC5zaGlmdFJpZ2h0VW5zaWduZWQoMTYpXG4gICAgICAgICAgICAgICAgICAgIC5hbmQoMHhmZmZmKVxuICAgICAgICAgICAgICAgICAgICAudG9TdHJpbmcoKV1cbiAgICAgICAgICAgICAgICA6IG51bGw7XG4gICAgICAgIGV2ZW50Lm9yaWdpbmFsT3duZXIgPSBlbnRpdGllcy5nZXRCeVN0ZWFtNjRJZChldmVudC53ZWFwb25fb3JpZ2luYWxvd25lcl94dWlkKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoZXZlbnROYW1lID09PSBcInBsYXllcl9ibGluZFwiKSB7XG4gICAgICAgIGV2ZW50LnBsYXllciA9IGVudGl0aWVzLmdldEJ5VXNlcklkKGV2ZW50LnVzZXJpZCk7XG4gICAgICAgIGV2ZW50LmF0dGFja2VyRW50aXR5ID0gZW50aXRpZXMuZ2V0QnlVc2VySWQoZXZlbnQuYXR0YWNrZXIpO1xuICAgICAgICBldmVudC5lbnRpdHkgPSBlbnRpdGllcy5lbnRpdGllcy5nZXQoZXZlbnQuZW50aXR5aWQpO1xuICAgIH1cbiAgICBlbHNlIGlmIChldmVudE5hbWUgPT09IFwicGxheWVyX2NoYW5nZW5hbWVcIikge1xuICAgICAgICBldmVudC5wbGF5ZXIgPSBlbnRpdGllcy5nZXRCeVVzZXJJZChldmVudC51c2VyaWQpO1xuICAgIH1cbiAgICBlbHNlIGlmIChldmVudE5hbWUgPT09IFwicGxheWVyX2NoYXRcIikge1xuICAgICAgICBldmVudC5wbGF5ZXIgPSBlbnRpdGllcy5nZXRCeVVzZXJJZChldmVudC51c2VyaWQpO1xuICAgIH1cbiAgICBlbHNlIGlmIChldmVudE5hbWUgPT09IFwicGxheWVyX2Nvbm5lY3RfZnVsbFwiKSB7XG4gICAgICAgIGV2ZW50LnBsYXllciA9IGVudGl0aWVzLmdldEJ5VXNlcklkKGV2ZW50LnVzZXJpZCk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGV2ZW50TmFtZSA9PT0gXCJwbGF5ZXJfZGVhdGhcIikge1xuICAgICAgICBldmVudC5wbGF5ZXIgPSBlbnRpdGllcy5nZXRCeVVzZXJJZChldmVudC51c2VyaWQpO1xuICAgICAgICBldmVudC5hdHRhY2tlckVudGl0eSA9IGVudGl0aWVzLmdldEJ5VXNlcklkKGV2ZW50LmF0dGFja2VyKTtcbiAgICAgICAgZXZlbnQuYXNzaXN0ZXJFbnRpdHkgPSBlbnRpdGllcy5nZXRCeVVzZXJJZChldmVudC5hc3Npc3Rlcik7XG4gICAgICAgIGV2ZW50Lml0ZW1EZWZpbml0aW9uID1cbiAgICAgICAgICAgIGV2ZW50LndlYXBvbl9mYXV4aXRlbWlkICE9IFwiXCJcbiAgICAgICAgICAgICAgICA/IGl0ZW1kZWZzXzEuaXRlbURlZmluaXRpb25JbmRleE1hcFtMb25nLmZyb21TdHJpbmcoZXZlbnQud2VhcG9uX2ZhdXhpdGVtaWQsIHRydWUpXG4gICAgICAgICAgICAgICAgICAgIC5hbmQoMHhmZmZmKVxuICAgICAgICAgICAgICAgICAgICAudG9TdHJpbmcoKV1cbiAgICAgICAgICAgICAgICA6IG51bGw7XG4gICAgICAgIGV2ZW50LnBhaW50S2l0ID1cbiAgICAgICAgICAgIGV2ZW50LndlYXBvbl9mYXV4aXRlbWlkICE9IFwiXCJcbiAgICAgICAgICAgICAgICA/IGl0ZW1kZWZzXzEucGFpbnRLaXRJbmRleE1hcFtMb25nLmZyb21TdHJpbmcoZXZlbnQud2VhcG9uX2ZhdXhpdGVtaWQsIHRydWUpXG4gICAgICAgICAgICAgICAgICAgIC5zaGlmdFJpZ2h0VW5zaWduZWQoMTYpXG4gICAgICAgICAgICAgICAgICAgIC5hbmQoMHhmZmZmKVxuICAgICAgICAgICAgICAgICAgICAudG9TdHJpbmcoKV1cbiAgICAgICAgICAgICAgICA6IG51bGw7XG4gICAgICAgIGV2ZW50Lm9yaWdpbmFsT3duZXIgPSBlbnRpdGllcy5nZXRCeVN0ZWFtNjRJZChldmVudC53ZWFwb25fb3JpZ2luYWxvd25lcl94dWlkKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoZXZlbnROYW1lID09PSBcInBsYXllcl9kaXNjb25uZWN0XCIpIHtcbiAgICAgICAgZXZlbnQucGxheWVyID0gZW50aXRpZXMuZ2V0QnlVc2VySWQoZXZlbnQudXNlcmlkKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoZXZlbnROYW1lID09PSBcInBsYXllcl9mYWxsZGFtYWdlXCIpIHtcbiAgICAgICAgZXZlbnQucGxheWVyID0gZW50aXRpZXMuZ2V0QnlVc2VySWQoZXZlbnQudXNlcmlkKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoZXZlbnROYW1lID09PSBcInBsYXllcl9mb290c3RlcFwiKSB7XG4gICAgICAgIGV2ZW50LnBsYXllciA9IGVudGl0aWVzLmdldEJ5VXNlcklkKGV2ZW50LnVzZXJpZCk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGV2ZW50TmFtZSA9PT0gXCJwbGF5ZXJfaHVydFwiKSB7XG4gICAgICAgIGV2ZW50LnBsYXllciA9IGVudGl0aWVzLmdldEJ5VXNlcklkKGV2ZW50LnVzZXJpZCk7XG4gICAgICAgIGV2ZW50LmF0dGFja2VyRW50aXR5ID0gZW50aXRpZXMuZ2V0QnlVc2VySWQoZXZlbnQuYXR0YWNrZXIpO1xuICAgIH1cbiAgICBlbHNlIGlmIChldmVudE5hbWUgPT09IFwicGxheWVyX2luZm9cIikge1xuICAgICAgICBldmVudC5wbGF5ZXIgPSBlbnRpdGllcy5nZXRCeVVzZXJJZChldmVudC51c2VyaWQpO1xuICAgIH1cbiAgICBlbHNlIGlmIChldmVudE5hbWUgPT09IFwicGxheWVyX2p1bXBcIikge1xuICAgICAgICBldmVudC5wbGF5ZXIgPSBlbnRpdGllcy5nZXRCeVVzZXJJZChldmVudC51c2VyaWQpO1xuICAgIH1cbiAgICBlbHNlIGlmIChldmVudE5hbWUgPT09IFwicGxheWVyX3NwYXduXCIpIHtcbiAgICAgICAgZXZlbnQucGxheWVyID0gZW50aXRpZXMuZ2V0QnlVc2VySWQoZXZlbnQudXNlcmlkKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoZXZlbnROYW1lID09PSBcInBsYXllcl90ZWFtXCIpIHtcbiAgICAgICAgZXZlbnQucGxheWVyID0gZW50aXRpZXMuZ2V0QnlVc2VySWQoZXZlbnQudXNlcmlkKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoZXZlbnROYW1lID09PSBcInJvdW5kX212cFwiKSB7XG4gICAgICAgIGV2ZW50LnBsYXllciA9IGVudGl0aWVzLmdldEJ5VXNlcklkKGV2ZW50LnVzZXJpZCk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGV2ZW50TmFtZSA9PT0gXCJzbW9rZWdyZW5hZGVfZGV0b25hdGVcIikge1xuICAgICAgICBldmVudC5wbGF5ZXIgPSBlbnRpdGllcy5nZXRCeVVzZXJJZChldmVudC51c2VyaWQpO1xuICAgICAgICBldmVudC5lbnRpdHkgPSBlbnRpdGllcy5lbnRpdGllcy5nZXQoZXZlbnQuZW50aXR5aWQpO1xuICAgIH1cbiAgICBlbHNlIGlmIChldmVudE5hbWUgPT09IFwic21va2VncmVuYWRlX2V4cGlyZWRcIikge1xuICAgICAgICBldmVudC5wbGF5ZXIgPSBlbnRpdGllcy5nZXRCeVVzZXJJZChldmVudC51c2VyaWQpO1xuICAgICAgICBldmVudC5lbnRpdHkgPSBlbnRpdGllcy5lbnRpdGllcy5nZXQoZXZlbnQuZW50aXR5aWQpO1xuICAgIH1cbiAgICBlbHNlIGlmIChldmVudE5hbWUgPT09IFwic3Vydml2YWxfcGFyYWRyb3BfYnJlYWtcIikge1xuICAgICAgICBldmVudC5lbnRpdHkgPSBlbnRpdGllcy5lbnRpdGllcy5nZXQoZXZlbnQuZW50aXR5aWQpO1xuICAgIH1cbiAgICBlbHNlIGlmIChldmVudE5hbWUgPT09IFwic3Vydml2YWxfcGFyYWRyb3Bfc3Bhd25cIikge1xuICAgICAgICBldmVudC5lbnRpdHkgPSBlbnRpdGllcy5lbnRpdGllcy5nZXQoZXZlbnQuZW50aXR5aWQpO1xuICAgIH1cbiAgICBlbHNlIGlmIChldmVudE5hbWUgPT09IFwidG91cm5hbWVudF9yZXdhcmRcIikge1xuICAgICAgICBldmVudC5pdGVtRGVmaW5pdGlvbiA9IGl0ZW1kZWZzXzEuaXRlbURlZmluaXRpb25JbmRleE1hcFtldmVudC5kZWZpbmRleF0gfHwgbnVsbDtcbiAgICAgICAgZXZlbnQuZW50aXR5ID0gZW50aXRpZXMuZ2V0QnlBY2NvdW50SWQoZXZlbnQuYWNjb3VudGlkKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoZXZlbnROYW1lID09PSBcIndlYXBvbl9maXJlXCIpIHtcbiAgICAgICAgZXZlbnQucGxheWVyID0gZW50aXRpZXMuZ2V0QnlVc2VySWQoZXZlbnQudXNlcmlkKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoZXZlbnROYW1lID09PSBcIndlYXBvbl9maXJlX29uX2VtcHR5XCIpIHtcbiAgICAgICAgZXZlbnQucGxheWVyID0gZW50aXRpZXMuZ2V0QnlVc2VySWQoZXZlbnQudXNlcmlkKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoZXZlbnROYW1lID09PSBcIndlYXBvbl9vdXRvZmFtbW9cIikge1xuICAgICAgICBldmVudC5wbGF5ZXIgPSBlbnRpdGllcy5nZXRCeVVzZXJJZChldmVudC51c2VyaWQpO1xuICAgIH1cbiAgICBlbHNlIGlmIChldmVudE5hbWUgPT09IFwid2VhcG9uX3JlbG9hZFwiKSB7XG4gICAgICAgIGV2ZW50LnBsYXllciA9IGVudGl0aWVzLmdldEJ5VXNlcklkKGV2ZW50LnVzZXJpZCk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGV2ZW50TmFtZSA9PT0gXCJ3ZWFwb25fem9vbVwiKSB7XG4gICAgICAgIGV2ZW50LnBsYXllciA9IGVudGl0aWVzLmdldEJ5VXNlcklkKGV2ZW50LnVzZXJpZCk7XG4gICAgfVxuICAgIHJldHVybiBldmVudDtcbn1cbmV4cG9ydHMuYW5ub3RhdGVFdmVudCA9IGFubm90YXRlRXZlbnQ7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1ldmVudHR5cGVzLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5CaXRWaWV3ID0gZXhwb3J0cy5CaXRTdHJlYW0gPSB2b2lkIDA7XG4vKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvdW5ib3VuZC1tZXRob2QgKi9cbmNvbnN0IGJpdF9idWZmZXJfMSA9IHJlcXVpcmUoXCJiaXQtYnVmZmVyXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiQml0U3RyZWFtXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBiaXRfYnVmZmVyXzEuQml0U3RyZWFtOyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiQml0Vmlld1wiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gYml0X2J1ZmZlcl8xLkJpdFZpZXc7IH0gfSk7XG5jb25zdCBDT09SRF9JTlRFR0VSX0JJVFMgPSAxNDtcbmNvbnN0IENPT1JEX0ZSQUNUSU9OQUxfQklUUyA9IDU7XG5jb25zdCBDT09SRF9ERU5PTUlOQVRPUiA9IDEgPDwgQ09PUkRfRlJBQ1RJT05BTF9CSVRTO1xuY29uc3QgQ09PUkRfUkVTT0xVVElPTiA9IDEuMCAvIENPT1JEX0RFTk9NSU5BVE9SO1xuLy8gU3BlY2lhbCB0aHJlc2hvbGQgZm9yIG5ldHdvcmtpbmcgbXVsdGlwbGF5ZXIgb3JpZ2luc1xuY29uc3QgQ09PUkRfSU5URUdFUl9CSVRTX01QID0gMTE7XG5jb25zdCBDT09SRF9GUkFDVElPTkFMX0JJVFNfTVBfTE9XUFJFQ0lTSU9OID0gMztcbmNvbnN0IENPT1JEX0RFTk9NSU5BVE9SX0xPV1BSRUNJU0lPTiA9IDEgPDwgQ09PUkRfRlJBQ1RJT05BTF9CSVRTX01QX0xPV1BSRUNJU0lPTjtcbmNvbnN0IENPT1JEX1JFU09MVVRJT05fTE9XUFJFQ0lTSU9OID0gMS4wIC8gQ09PUkRfREVOT01JTkFUT1JfTE9XUFJFQ0lTSU9OO1xuY29uc3QgTk9STUFMX0ZSQUNUSU9OQUxfQklUUyA9IDExO1xuY29uc3QgTk9STUFMX0RFTk9NSU5BVE9SID0gKDEgPDwgTk9STUFMX0ZSQUNUSU9OQUxfQklUUykgLSAxO1xuY29uc3QgTk9STUFMX1JFU09MVVRJT04gPSAxLjAgLyBOT1JNQUxfREVOT01JTkFUT1I7XG5jb25zdCBNQVhfVkFSX0lOVDMyX0JZVEVTID0gNTtcbmJpdF9idWZmZXJfMS5CaXRTdHJlYW0uZnJvbSA9IGZ1bmN0aW9uIGZyb20oYXJyYXkpIHtcbiAgICByZXR1cm4gbmV3IGJpdF9idWZmZXJfMS5CaXRTdHJlYW0oYXJyYXkuYnVmZmVyLCBhcnJheS5ieXRlT2Zmc2V0LCBhcnJheS5ieXRlTGVuZ3RoKTtcbn07XG5iaXRfYnVmZmVyXzEuQml0U3RyZWFtLnByb3RvdHlwZS5yZWFkU3RyaW5nID0gZnVuY3Rpb24gKGJ5dGVzKSB7XG4gICAgbGV0IHMgPSBcIlwiO1xuICAgIGxldCByZWNvcmQgPSB0cnVlO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYnl0ZXM7ICsraSkge1xuICAgICAgICBjb25zdCBjID0gdGhpcy5yZWFkVWludDgoKTtcbiAgICAgICAgLy8gU3RvcCBhcHBlbmRpbmcgY2hhcnMgb25jZSB3ZSBoaXQgMHgwMFxuICAgICAgICBpZiAoYyA9PT0gMHgwMCkge1xuICAgICAgICAgICAgcmVjb3JkID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAocmVjb3JkKSB7XG4gICAgICAgICAgICBzICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHM7XG59O1xuYml0X2J1ZmZlcl8xLkJpdFN0cmVhbS5wcm90b3R5cGUucmVhZEJ5dGVzID0gZnVuY3Rpb24gKGJ5dGVzKSB7XG4gICAgY29uc3QgYXJyID0gbmV3IEFycmF5KGJ5dGVzKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJ5dGVzOyArK2kpIHtcbiAgICAgICAgYXJyW2ldID0gdGhpcy5yZWFkVUludDgoKTtcbiAgICB9XG4gICAgcmV0dXJuIEJ1ZmZlci5mcm9tKGFycik7XG59O1xuYml0X2J1ZmZlcl8xLkJpdFN0cmVhbS5wcm90b3R5cGUucmVhZE9uZUJpdCA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy5yZWFkQml0cygxLCBmYWxzZSkgPT09IDE7XG59O1xuYml0X2J1ZmZlcl8xLkJpdFN0cmVhbS5wcm90b3R5cGUucmVhZFVCaXRzID0gYml0X2J1ZmZlcl8xLkJpdFN0cmVhbS5wcm90b3R5cGUucmVhZEJpdHM7XG5iaXRfYnVmZmVyXzEuQml0U3RyZWFtLnByb3RvdHlwZS5yZWFkU0JpdHMgPSBmdW5jdGlvbiAoYml0cykge1xuICAgIHJldHVybiB0aGlzLnJlYWRCaXRzKGJpdHMsIHRydWUpO1xufTtcbmJpdF9idWZmZXJfMS5CaXRTdHJlYW0ucHJvdG90eXBlLnJlYWRVQml0VmFyID0gZnVuY3Rpb24gKCkge1xuICAgIGxldCByZXQgPSB0aGlzLnJlYWRVQml0cyg2KTtcbiAgICBzd2l0Y2ggKHJldCAmICgxNiB8IDMyKSkge1xuICAgICAgICBjYXNlIDE2OlxuICAgICAgICAgICAgcmV0ID0gKHJldCAmIDE1KSB8ICh0aGlzLnJlYWRVQml0cyg0KSA8PCA0KTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDMyOlxuICAgICAgICAgICAgcmV0ID0gKHJldCAmIDE1KSB8ICh0aGlzLnJlYWRVQml0cyg4KSA8PCA0KTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDQ4OlxuICAgICAgICAgICAgcmV0ID0gKHJldCAmIDE1KSB8ICh0aGlzLnJlYWRVQml0cygzMiAtIDQpIDw8IDQpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHJldHVybiByZXQ7XG59O1xuYml0X2J1ZmZlcl8xLkJpdFN0cmVhbS5wcm90b3R5cGUucmVhZEJpdENvb3JkID0gZnVuY3Rpb24gKCkge1xuICAgIGxldCBpbnR2YWwgPSB0aGlzLnJlYWRPbmVCaXQoKSA/IDEgOiAwO1xuICAgIGxldCBmcmFjdHZhbCA9IHRoaXMucmVhZE9uZUJpdCgpID8gMSA6IDA7XG4gICAgaWYgKCFpbnR2YWwgJiYgIWZyYWN0dmFsKSB7XG4gICAgICAgIHJldHVybiAwLjA7XG4gICAgfVxuICAgIGNvbnN0IHNpZ25iaXQgPSB0aGlzLnJlYWRPbmVCaXQoKTtcbiAgICBpZiAoaW50dmFsKSB7XG4gICAgICAgIGludHZhbCA9IHRoaXMucmVhZFVCaXRzKENPT1JEX0lOVEVHRVJfQklUUykgKyAxO1xuICAgIH1cbiAgICBpZiAoZnJhY3R2YWwpIHtcbiAgICAgICAgZnJhY3R2YWwgPSB0aGlzLnJlYWRVQml0cyhDT09SRF9GUkFDVElPTkFMX0JJVFMpO1xuICAgIH1cbiAgICBsZXQgdmFsdWUgPSBpbnR2YWwgKyBmcmFjdHZhbCAqIENPT1JEX1JFU09MVVRJT047XG4gICAgaWYgKHNpZ25iaXQpIHtcbiAgICAgICAgdmFsdWUgPSAtdmFsdWU7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbn07XG5iaXRfYnVmZmVyXzEuQml0U3RyZWFtLnByb3RvdHlwZS5yZWFkVVZhckludDMyID0gZnVuY3Rpb24gKCkge1xuICAgIGxldCByZXN1bHQgPSAwO1xuICAgIGxldCBjb3VudCA9IDA7XG4gICAgbGV0IGJ5dGVzO1xuICAgIGRvIHtcbiAgICAgICAgaWYgKGNvdW50ID09PSBNQVhfVkFSX0lOVDMyX0JZVEVTKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIGJ5dGVzID0gdGhpcy5yZWFkVUludDgoKTtcbiAgICAgICAgcmVzdWx0IHw9IChieXRlcyAmIDB4N2YpIDw8ICg3ICogY291bnQpO1xuICAgICAgICArK2NvdW50O1xuICAgIH0gd2hpbGUgKGJ5dGVzICYgMHg4MCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG5iaXRfYnVmZmVyXzEuQml0U3RyZWFtLnByb3RvdHlwZS5yZWFkVmFySW50MzIgPSBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy5yZWFkVVZhckludDMyKCk7XG4gICAgcmV0dXJuIChyZXN1bHQgPj4gMSkgXiAtKHJlc3VsdCAmIDEpO1xufTtcbmJpdF9idWZmZXJfMS5CaXRTdHJlYW0ucHJvdG90eXBlLnJlYWRCaXRDb29yZE1QTm9uZSA9IGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBpbkJvdW5kcyA9IHRoaXMucmVhZE9uZUJpdCgpO1xuICAgIGxldCBpbnR2YWwgPSB0aGlzLnJlYWRPbmVCaXQoKSA/IDEgOiAwO1xuICAgIGNvbnN0IHNpZ25iaXQgPSB0aGlzLnJlYWRPbmVCaXQoKTtcbiAgICBpZiAoaW50dmFsKSB7XG4gICAgICAgIGlmIChpbkJvdW5kcykge1xuICAgICAgICAgICAgaW50dmFsID0gdGhpcy5yZWFkVUJpdHMoQ09PUkRfSU5URUdFUl9CSVRTX01QKSArIDE7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpbnR2YWwgPSB0aGlzLnJlYWRVQml0cyhDT09SRF9JTlRFR0VSX0JJVFMpICsgMTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBmcmFjdHZhbCA9IHRoaXMucmVhZFVCaXRzKENPT1JEX0ZSQUNUSU9OQUxfQklUUyk7XG4gICAgbGV0IHZhbHVlID0gaW50dmFsICsgZnJhY3R2YWwgKiBDT09SRF9SRVNPTFVUSU9OO1xuICAgIGlmIChzaWduYml0KSB7XG4gICAgICAgIHZhbHVlID0gLXZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG59O1xuYml0X2J1ZmZlcl8xLkJpdFN0cmVhbS5wcm90b3R5cGUucmVhZEJpdENvb3JkTVBMb3dQcmVjaXNpb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgaW5Cb3VuZHMgPSB0aGlzLnJlYWRPbmVCaXQoKTtcbiAgICBsZXQgaW50dmFsID0gdGhpcy5yZWFkT25lQml0KCkgPyAxIDogMDtcbiAgICBjb25zdCBzaWduYml0ID0gdGhpcy5yZWFkT25lQml0KCk7XG4gICAgaWYgKGludHZhbCkge1xuICAgICAgICBpZiAoaW5Cb3VuZHMpIHtcbiAgICAgICAgICAgIGludHZhbCA9IHRoaXMucmVhZFVCaXRzKENPT1JEX0lOVEVHRVJfQklUU19NUCkgKyAxO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaW50dmFsID0gdGhpcy5yZWFkVUJpdHMoQ09PUkRfSU5URUdFUl9CSVRTKSArIDE7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgZnJhY3R2YWwgPSB0aGlzLnJlYWRVQml0cyhDT09SRF9GUkFDVElPTkFMX0JJVFNfTVBfTE9XUFJFQ0lTSU9OKTtcbiAgICBsZXQgdmFsdWUgPSBpbnR2YWwgKyBmcmFjdHZhbCAqIENPT1JEX1JFU09MVVRJT05fTE9XUFJFQ0lTSU9OO1xuICAgIGlmIChzaWduYml0KSB7XG4gICAgICAgIHZhbHVlID0gLXZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG59O1xuYml0X2J1ZmZlcl8xLkJpdFN0cmVhbS5wcm90b3R5cGUucmVhZEJpdENvb3JkTVBJbnRlZ3JhbCA9IGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBpbkJvdW5kcyA9IHRoaXMucmVhZE9uZUJpdCgpO1xuICAgIGlmICghdGhpcy5yZWFkT25lQml0KCkpIHtcbiAgICAgICAgcmV0dXJuIDAuMDtcbiAgICB9XG4gICAgY29uc3Qgc2lnbmJpdCA9IHRoaXMucmVhZE9uZUJpdCgpO1xuICAgIGxldCB2YWx1ZTtcbiAgICBpZiAoaW5Cb3VuZHMpIHtcbiAgICAgICAgdmFsdWUgPSB0aGlzLnJlYWRVQml0cyhDT09SRF9JTlRFR0VSX0JJVFNfTVApICsgMTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHZhbHVlID0gdGhpcy5yZWFkVUJpdHMoQ09PUkRfSU5URUdFUl9CSVRTKSArIDE7XG4gICAgfVxuICAgIGlmIChzaWduYml0KSB7XG4gICAgICAgIHZhbHVlID0gLXZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG59O1xuYml0X2J1ZmZlcl8xLkJpdFN0cmVhbS5wcm90b3R5cGUucmVhZEJpdE5vcm1hbCA9IGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBzaWduYml0ID0gdGhpcy5yZWFkT25lQml0KCk7XG4gICAgY29uc3QgZnJhY3R2YWwgPSB0aGlzLnJlYWRVQml0cyhOT1JNQUxfRlJBQ1RJT05BTF9CSVRTKTtcbiAgICBsZXQgdmFsdWUgPSBmcmFjdHZhbCAqIE5PUk1BTF9SRVNPTFVUSU9OO1xuICAgIGlmIChzaWduYml0KSB7XG4gICAgICAgIHZhbHVlID0gLXZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG59O1xuYml0X2J1ZmZlcl8xLkJpdFN0cmVhbS5wcm90b3R5cGUucmVhZEJpdENlbGxDb29yZE5vbmUgPSBmdW5jdGlvbiAoYml0cykge1xuICAgIGNvbnN0IGludHZhbCA9IHRoaXMucmVhZFVCaXRzKGJpdHMpO1xuICAgIGNvbnN0IGZyYWN0dmFsID0gdGhpcy5yZWFkVUJpdHMoQ09PUkRfRlJBQ1RJT05BTF9CSVRTKTtcbiAgICByZXR1cm4gaW50dmFsICsgZnJhY3R2YWwgKiBDT09SRF9SRVNPTFVUSU9OO1xufTtcbmJpdF9idWZmZXJfMS5CaXRTdHJlYW0ucHJvdG90eXBlLnJlYWRCaXRDZWxsQ29vcmRMb3dQcmVjaXNpb24gPSBmdW5jdGlvbiAoYml0cykge1xuICAgIGNvbnN0IGludHZhbCA9IHRoaXMucmVhZFVCaXRzKGJpdHMpO1xuICAgIGNvbnN0IGZyYWN0dmFsID0gdGhpcy5yZWFkVUJpdHMoQ09PUkRfRlJBQ1RJT05BTF9CSVRTX01QX0xPV1BSRUNJU0lPTik7XG4gICAgcmV0dXJuIGludHZhbCArIGZyYWN0dmFsICogQ09PUkRfUkVTT0xVVElPTl9MT1dQUkVDSVNJT047XG59O1xuYml0X2J1ZmZlcl8xLkJpdFN0cmVhbS5wcm90b3R5cGUucmVhZEJpdENlbGxDb29yZEludGVncmFsID0gZnVuY3Rpb24gKGJpdHMpIHtcbiAgICByZXR1cm4gdGhpcy5yZWFkVUJpdHMoYml0cyk7XG59O1xuYml0X2J1ZmZlcl8xLkJpdFN0cmVhbS5wcm90b3R5cGUucmVhZENTdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgbGV0IHMgPSBcIlwiO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zdGFudC1jb25kaXRpb25cbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICBjb25zdCBjID0gdGhpcy5yZWFkVWludDgoKTtcbiAgICAgICAgLy8gU3RvcCBhcHBlbmRpbmcgY2hhcnMgb25jZSB3ZSBoaXQgMHgwMFxuICAgICAgICBpZiAoYyA9PT0gMHgwMCkge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgcyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGMpO1xuICAgIH1cbiAgICByZXR1cm4gcztcbn07XG5iaXRfYnVmZmVyXzEuQml0U3RyZWFtLnByb3RvdHlwZS5yZWFkVUludDggPSBiaXRfYnVmZmVyXzEuQml0U3RyZWFtLnByb3RvdHlwZS5yZWFkVWludDg7XG5iaXRfYnVmZmVyXzEuQml0U3RyZWFtLnByb3RvdHlwZS5yZWFkVUludDE2ID0gYml0X2J1ZmZlcl8xLkJpdFN0cmVhbS5wcm90b3R5cGUucmVhZFVpbnQxNjtcbmJpdF9idWZmZXJfMS5CaXRTdHJlYW0ucHJvdG90eXBlLnJlYWRVSW50MzIgPSBiaXRfYnVmZmVyXzEuQml0U3RyZWFtLnByb3RvdHlwZS5yZWFkVWludDMyO1xuYml0X2J1ZmZlcl8xLkJpdFN0cmVhbS5wcm90b3R5cGUud3JpdGVVSW50OCA9IGJpdF9idWZmZXJfMS5CaXRTdHJlYW0ucHJvdG90eXBlLndyaXRlVWludDg7XG5iaXRfYnVmZmVyXzEuQml0U3RyZWFtLnByb3RvdHlwZS53cml0ZVVJbnQxNiA9IGJpdF9idWZmZXJfMS5CaXRTdHJlYW0ucHJvdG90eXBlLndyaXRlVWludDE2O1xuYml0X2J1ZmZlcl8xLkJpdFN0cmVhbS5wcm90b3R5cGUud3JpdGVVSW50MzIgPSBiaXRfYnVmZmVyXzEuQml0U3RyZWFtLnByb3RvdHlwZS53cml0ZVVpbnQzMjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWJpdGJ1ZmZlci5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuR2FtZUV2ZW50ID0gdm9pZCAwO1xuY29uc3QgYXNzZXJ0ID0gcmVxdWlyZShcImFzc2VydFwiKTtcbnZhciBFdmVudEtleVR5cGU7XG4oZnVuY3Rpb24gKEV2ZW50S2V5VHlwZSkge1xuICAgIEV2ZW50S2V5VHlwZVtFdmVudEtleVR5cGVbXCJUWVBFX1NUUklOR1wiXSA9IDFdID0gXCJUWVBFX1NUUklOR1wiO1xuICAgIEV2ZW50S2V5VHlwZVtFdmVudEtleVR5cGVbXCJUWVBFX0ZMT0FUXCJdID0gMl0gPSBcIlRZUEVfRkxPQVRcIjtcbiAgICBFdmVudEtleVR5cGVbRXZlbnRLZXlUeXBlW1wiVFlQRV9MT05HXCJdID0gM10gPSBcIlRZUEVfTE9OR1wiO1xuICAgIEV2ZW50S2V5VHlwZVtFdmVudEtleVR5cGVbXCJUWVBFX1NIT1JUXCJdID0gNF0gPSBcIlRZUEVfU0hPUlRcIjtcbiAgICBFdmVudEtleVR5cGVbRXZlbnRLZXlUeXBlW1wiVFlQRV9CWVRFXCJdID0gNV0gPSBcIlRZUEVfQllURVwiO1xuICAgIEV2ZW50S2V5VHlwZVtFdmVudEtleVR5cGVbXCJUWVBFX0JPT0xcIl0gPSA2XSA9IFwiVFlQRV9CT09MXCI7XG4gICAgRXZlbnRLZXlUeXBlW0V2ZW50S2V5VHlwZVtcIlRZUEVfVUlOVDY0XCJdID0gN10gPSBcIlRZUEVfVUlOVDY0XCI7XG4gICAgRXZlbnRLZXlUeXBlW0V2ZW50S2V5VHlwZVtcIlRZUEVfV1NUUklOR1wiXSA9IDhdID0gXCJUWVBFX1dTVFJJTkdcIjtcbn0pKEV2ZW50S2V5VHlwZSB8fCAoRXZlbnRLZXlUeXBlID0ge30pKTtcbmNsYXNzIEdhbWVFdmVudCB7XG4gICAgY29uc3RydWN0b3IoZGVzY3JpcHRvcikge1xuICAgICAgICB0aGlzLm5hbWUgPSBkZXNjcmlwdG9yLm5hbWU7XG4gICAgICAgIHRoaXMuaWQgPSBkZXNjcmlwdG9yLmV2ZW50aWQ7XG4gICAgICAgIHRoaXMua2V5TmFtZXMgPSBkZXNjcmlwdG9yLmtleXMubWFwKGtleSA9PiBrZXkubmFtZSk7XG4gICAgfVxuICAgIG1lc3NhZ2VUb09iamVjdChldmVudE1zZykge1xuICAgICAgICBhc3NlcnQoZXZlbnRNc2cuZXZlbnRpZCA9PT0gdGhpcy5pZCk7XG4gICAgICAgIGNvbnN0IGV2ZW50ID0ge307XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5rZXlOYW1lcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgY29uc3Qga2V5TmFtZSA9IHRoaXMua2V5TmFtZXNbaV07XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGV2ZW50TXNnLmtleXNbaV07XG4gICAgICAgICAgICBzd2l0Y2ggKHZhbHVlLnR5cGUpIHtcbiAgICAgICAgICAgICAgICBjYXNlIEV2ZW50S2V5VHlwZS5UWVBFX1NUUklORzpcbiAgICAgICAgICAgICAgICAgICAgZXZlbnRba2V5TmFtZV0gPSB2YWx1ZS52YWxTdHJpbmc7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgRXZlbnRLZXlUeXBlLlRZUEVfRkxPQVQ6XG4gICAgICAgICAgICAgICAgICAgIGV2ZW50W2tleU5hbWVdID0gdmFsdWUudmFsRmxvYXQ7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgRXZlbnRLZXlUeXBlLlRZUEVfTE9ORzpcbiAgICAgICAgICAgICAgICAgICAgZXZlbnRba2V5TmFtZV0gPSB2YWx1ZS52YWxMb25nO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIEV2ZW50S2V5VHlwZS5UWVBFX1NIT1JUOlxuICAgICAgICAgICAgICAgICAgICBldmVudFtrZXlOYW1lXSA9IHZhbHVlLnZhbFNob3J0O1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIEV2ZW50S2V5VHlwZS5UWVBFX0JZVEU6XG4gICAgICAgICAgICAgICAgICAgIGV2ZW50W2tleU5hbWVdID0gdmFsdWUudmFsQnl0ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBFdmVudEtleVR5cGUuVFlQRV9CT09MOlxuICAgICAgICAgICAgICAgICAgICBldmVudFtrZXlOYW1lXSA9IHZhbHVlLnZhbEJvb2w7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgRXZlbnRLZXlUeXBlLlRZUEVfVUlOVDY0OlxuICAgICAgICAgICAgICAgICAgICBldmVudFtrZXlOYW1lXSA9IHZhbHVlLnZhbFVpbnQ2NDtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBFdmVudEtleVR5cGUuVFlQRV9XU1RSSU5HOlxuICAgICAgICAgICAgICAgICAgICBldmVudFtrZXlOYW1lXSA9IHZhbHVlLnZhbFdzdHJpbmc7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBldmVudDtcbiAgICB9XG59XG5leHBvcnRzLkdhbWVFdmVudCA9IEdhbWVFdmVudDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWdhbWVldmVudC5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuR2FtZUV2ZW50cyA9IHZvaWQgMDtcbmNvbnN0IGV2ZW50c18xID0gcmVxdWlyZShcImV2ZW50c1wiKTtcbmNvbnN0IGdhbWVldmVudF8xID0gcmVxdWlyZShcIi4vZ2FtZWV2ZW50XCIpO1xuY29uc3QgZXZlbnR0eXBlc18xID0gcmVxdWlyZShcIi4vZXZlbnR0eXBlc1wiKTtcbi8qKlxuICogTWFuYWdlcyBnYW1lIGV2ZW50cyBmb3IgYSBkZW1vIGZpbGUuXG4gKi9cbmNsYXNzIEdhbWVFdmVudHMgZXh0ZW5kcyBldmVudHNfMS5FdmVudEVtaXR0ZXIge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuICAgICAgICB0aGlzLmdhbWVFdmVudExpc3QgPSBbXTtcbiAgICAgICAgdGhpcy5fdGlja0V2ZW50cyA9IFtdO1xuICAgIH1cbiAgICBsaXN0ZW4oZGVtbykge1xuICAgICAgICBjb25zdCBlbnRpdGllcyA9IGRlbW8uZW50aXRpZXM7XG4gICAgICAgIGRlbW8ub24oXCJzdmNfR2FtZUV2ZW50TGlzdFwiLCB0aGlzLl9oYW5kbGVHYW1lRXZlbnRMaXN0LmJpbmQodGhpcykpO1xuICAgICAgICBkZW1vLm9uKFwic3ZjX0dhbWVFdmVudFwiLCBtc2cgPT4ge1xuICAgICAgICAgICAgY29uc3QgZXZlbnQgPSB0aGlzLmdhbWVFdmVudExpc3RbbXNnLmV2ZW50aWRdO1xuICAgICAgICAgICAgaWYgKCFldmVudCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGV2ZW50VmFycyA9IGV2ZW50Lm1lc3NhZ2VUb09iamVjdChtc2cpO1xuICAgICAgICAgICAgLy8gYnVmZmVyIGdhbWUgZXZlbnRzIHVudGlsIHRoZSBlbmQgb2YgdGhlIHRpY2tcbiAgICAgICAgICAgIHRoaXMuX3RpY2tFdmVudHMucHVzaCh7XG4gICAgICAgICAgICAgICAgbmFtZTogZXZlbnQubmFtZSxcbiAgICAgICAgICAgICAgICBldmVudDogKDAsIGV2ZW50dHlwZXNfMS5hbm5vdGF0ZUV2ZW50KShlbnRpdGllcywgZXZlbnQubmFtZSwgZXZlbnRWYXJzKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICBkZW1vLm9uKFwidGlja2VuZFwiLCAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl90aWNrRXZlbnRzLmZvckVhY2goZXZlbnQgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuZW1pdChldmVudC5uYW1lLCBldmVudC5ldmVudCk7XG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0KFwiZXZlbnRcIiwge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBldmVudC5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1hc3NpZ25tZW50XG4gICAgICAgICAgICAgICAgICAgIGV2ZW50OiBldmVudC5ldmVudFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLl90aWNrRXZlbnRzID0gW107XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBfaGFuZGxlR2FtZUV2ZW50TGlzdChtc2cpIHtcbiAgICAgICAgZm9yIChjb25zdCBkZXNjcmlwdG9yIG9mIG1zZy5kZXNjcmlwdG9ycykge1xuICAgICAgICAgICAgdGhpcy5nYW1lRXZlbnRMaXN0W2Rlc2NyaXB0b3IuZXZlbnRpZF0gPSBuZXcgZ2FtZWV2ZW50XzEuR2FtZUV2ZW50KGRlc2NyaXB0b3IpO1xuICAgICAgICB9XG4gICAgfVxufVxuZXhwb3J0cy5HYW1lRXZlbnRzID0gR2FtZUV2ZW50cztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWdhbWVldmVudHMuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vLyBDb3BpZWQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vRFNlcmdpdS9ub2RlLWljZVxuLy8gLS0tXG4vLyBUaGUgTUlUIExpY2Vuc2Vcbi8vXG4vLyBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxNyBHb29nbGUsIEluYy4gaHR0cDovL2FuZ3VsYXJqcy5vcmdcbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4vLyBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4vLyBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4vLyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4vLyBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbi8vIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbi8vIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1Jcbi8vIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuLy8gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4vLyBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4vLyBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuLy8gT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuLy8gVEhFIFNPRlRXQVJFLlxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5JY2VLZXkgPSB2b2lkIDA7XG5jbGFzcyBJY2VLZXkge1xuICAgIC8vIENyZWF0ZSBhIG5ldyBJQ0Uga2V5IHdpdGggdGhlIHNwZWNpZmllZCBsZXZlbC5cbiAgICBjb25zdHJ1Y3RvcihsZXZlbCkge1xuICAgICAgICB0aGlzLmNpcGhlckhvbGRlciA9IG5ldyBVaW50OEFycmF5KDgpO1xuICAgICAgICB0aGlzLnBsYWluSG9sZGVyID0gbmV3IFVpbnQ4QXJyYXkoOCk7XG4gICAgICAgIGlmICghSWNlS2V5LnNwQm94SW5pdGlhbGlzZWQpIHtcbiAgICAgICAgICAgIHRoaXMuc3BCb3hJbml0KCk7XG4gICAgICAgICAgICBJY2VLZXkuc3BCb3hJbml0aWFsaXNlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxldmVsIDwgMSkge1xuICAgICAgICAgICAgdGhpcy5zaXplID0gMTtcbiAgICAgICAgICAgIHRoaXMucm91bmRzID0gODtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2l6ZSA9IGxldmVsO1xuICAgICAgICAgICAgdGhpcy5yb3VuZHMgPSBsZXZlbCAqIDE2O1xuICAgICAgICB9XG4gICAgICAgIHRoaXMua2V5U2NoZWR1bGUgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnJvdW5kczsgaSsrKSB7XG4gICAgICAgICAgICB0aGlzLmtleVNjaGVkdWxlW2ldID0gW107XG4gICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IDM7IGorKykge1xuICAgICAgICAgICAgICAgIHRoaXMua2V5U2NoZWR1bGVbaV1bal0gPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8vIFJldHVybiB0aGUga2V5IHNpemUsIGluIGJ5dGVzLlxuICAgIGtleVNpemUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNpemUgKiA4O1xuICAgIH1cbiAgICAvLyBSZXR1cm4gdGhlIGJsb2NrIHNpemUsIGluIGJ5dGVzLlxuICAgIGJsb2NrU2l6ZSgpIHtcbiAgICAgICAgcmV0dXJuIDg7XG4gICAgfVxuICAgIC8vIFNldCB0aGUga2V5IHNjaGVkdWxlIG9mIGFuIElDRSBrZXkuXG4gICAgc2V0KGtleSkge1xuICAgICAgICBjb25zdCBrYiA9IG5ldyBVaW50MTZBcnJheSg0KTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCA0OyBpKyspXG4gICAgICAgICAgICBrYltpXSA9IDA7XG4gICAgICAgIGlmICh0aGlzLnJvdW5kcyA9PT0gOCkge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCA0OyBpKyspXG4gICAgICAgICAgICAgICAga2JbMyAtIGldID0gKChrZXlbaSAqIDJdICYgMHhmZikgPDwgOCkgfCAoa2V5W2kgKiAyICsgMV0gJiAweGZmKTtcbiAgICAgICAgICAgIHRoaXMuc2NoZWR1bGVCdWlsZChrYiwgMCwgMCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnNpemU7IGkrKykge1xuICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCA0OyBqKyspXG4gICAgICAgICAgICAgICAga2JbMyAtIGpdID1cbiAgICAgICAgICAgICAgICAgICAgKChrZXlbaSAqIDggKyBqICogMl0gJiAweGZmKSA8PCA4KSB8XG4gICAgICAgICAgICAgICAgICAgICAgICAoa2V5W2kgKiA4ICsgaiAqIDIgKyAxXSAmIDB4ZmYpO1xuICAgICAgICAgICAgdGhpcy5zY2hlZHVsZUJ1aWxkKGtiLCBpICogOCwgMCk7XG4gICAgICAgICAgICB0aGlzLnNjaGVkdWxlQnVpbGQoa2IsIHRoaXMucm91bmRzIC0gOCAtIGkgKiA4LCA4KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBDbGVhciB0aGUga2V5IHNjaGVkdWxlIHRvIHByZXZlbnQgbWVtb3J5IHNub29waW5nLlxuICAgIGNsZWFyKCkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMucm91bmRzOyBpKyspXG4gICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IDM7IGorKylcbiAgICAgICAgICAgICAgICB0aGlzLmtleVNjaGVkdWxlW2ldW2pdID0gMDtcbiAgICB9XG4gICAgLy8gRW5jcnlwdCBhIGJsb2NrIG9mIDggYnl0ZXMgb2YgZGF0YS5cbiAgICBlbmNyeXB0KHBsYWludGV4dCwgY2lwaGVydGV4dCkge1xuICAgICAgICBsZXQgaTtcbiAgICAgICAgbGV0IGwgPSAwO1xuICAgICAgICBsZXQgciA9IDA7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHtcbiAgICAgICAgICAgIGwgfD0gKHBsYWludGV4dFtpXSAmIDB4ZmYpIDw8ICgyNCAtIGkgKiA4KTtcbiAgICAgICAgICAgIHIgfD0gKHBsYWludGV4dFtpICsgNF0gJiAweGZmKSA8PCAoMjQgLSBpICogOCk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChpID0gMDsgaSA8IHRoaXMucm91bmRzOyBpICs9IDIpIHtcbiAgICAgICAgICAgIGwgXj0gdGhpcy5yb3VuZEZ1bmMociwgdGhpcy5rZXlTY2hlZHVsZVtpXSk7XG4gICAgICAgICAgICByIF49IHRoaXMucm91bmRGdW5jKGwsIHRoaXMua2V5U2NoZWR1bGVbaSArIDFdKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7XG4gICAgICAgICAgICBjaXBoZXJ0ZXh0WzMgLSBpXSA9IE51bWJlcihyICYgMHhmZik7XG4gICAgICAgICAgICBjaXBoZXJ0ZXh0WzcgLSBpXSA9IE51bWJlcihsICYgMHhmZik7XG4gICAgICAgICAgICByID4+Pj0gODtcbiAgICAgICAgICAgIGwgPj4+PSA4O1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIERlY3J5cHQgYSBibG9jayBvZiA4IGJ5dGVzIG9mIGRhdGEuXG4gICAgZGVjcnlwdChjaXBoZXJ0ZXh0LCBwbGFpbnRleHQpIHtcbiAgICAgICAgbGV0IGk7XG4gICAgICAgIGxldCBsID0gMDtcbiAgICAgICAgbGV0IHIgPSAwO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7XG4gICAgICAgICAgICBsIHw9IChjaXBoZXJ0ZXh0W2ldICYgMHhmZikgPDwgKDI0IC0gaSAqIDgpO1xuICAgICAgICAgICAgciB8PSAoY2lwaGVydGV4dFtpICsgNF0gJiAweGZmKSA8PCAoMjQgLSBpICogOCk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChpID0gdGhpcy5yb3VuZHMgLSAxOyBpID4gMDsgaSAtPSAyKSB7XG4gICAgICAgICAgICBsIF49IHRoaXMucm91bmRGdW5jKHIsIHRoaXMua2V5U2NoZWR1bGVbaV0pO1xuICAgICAgICAgICAgciBePSB0aGlzLnJvdW5kRnVuYyhsLCB0aGlzLmtleVNjaGVkdWxlW2kgLSAxXSk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykge1xuICAgICAgICAgICAgcGxhaW50ZXh0WzMgLSBpXSA9IE51bWJlcihyICYgMHhmZik7XG4gICAgICAgICAgICBwbGFpbnRleHRbNyAtIGldID0gTnVtYmVyKGwgJiAweGZmKTtcbiAgICAgICAgICAgIHIgPj4+PSA4O1xuICAgICAgICAgICAgbCA+Pj49IDg7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZGVjcnlwdFVpbnQ4QXJyYXkoY2lwaGVyQXJyYXksIHBsYWluQXJyYXksIGZyb20sIHRvKSB7XG4gICAgICAgIGlmIChmcm9tID09IG51bGwpXG4gICAgICAgICAgICBmcm9tID0gMDtcbiAgICAgICAgaWYgKHRvID09IG51bGwpXG4gICAgICAgICAgICB0byA9IGNpcGhlckFycmF5Lmxlbmd0aDtcbiAgICAgICAgbGV0IGsgPSAwO1xuICAgICAgICAvLyBkZWNyeXB0IGZ1bGwgYmxvY2tzXG4gICAgICAgIHdoaWxlIChmcm9tICsgOCA8PSB0bykge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCA4OyBpKyspIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNpcGhlckhvbGRlcltpXSA9IGNpcGhlckFycmF5W2Zyb20gKyBpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZGVjcnlwdCh0aGlzLmNpcGhlckhvbGRlciwgdGhpcy5wbGFpbkhvbGRlcik7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDg7IGkrKykge1xuICAgICAgICAgICAgICAgIHBsYWluQXJyYXlbayArIGldID0gdGhpcy5wbGFpbkhvbGRlcltpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGsgKz0gODtcbiAgICAgICAgICAgIGZyb20gKz0gODtcbiAgICAgICAgfVxuICAgICAgICAvLyByZW1haW5pbmcgYnl0ZXMgZG8gbm90IGdldCBlbmNyeXB0aW9uLCBqdXN0IGNvcHkgdGhlbVxuICAgICAgICBpZiAoKCh0byAtIGZyb20pICYgMHg3KSAhPT0gMCkge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IGZyb207IGkgPCB0bzsgaSsrKSB7XG4gICAgICAgICAgICAgICAgcGxhaW5BcnJheVtrKytdID0gY2lwaGVyQXJyYXlbaV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gOC1iaXQgR2Fsb2lzIEZpZWxkIG11bHRpcGxpY2F0aW9uIG9mIGEgYnkgYiwgbW9kdWxvIG0uXG4gICAgLy8gSnVzdCBsaWtlIGFyaXRobWV0aWMgbXVsdGlwbGljYXRpb24sIGV4Y2VwdCB0aGF0XG4gICAgLy8gYWRkaXRpb25zIGFuZCBzdWJ0cmFjdGlvbnMgYXJlIHJlcGxhY2VkIGJ5IFhPUi5cbiAgICBnZl9tdWx0KGEsIGIsIG0pIHtcbiAgICAgICAgbGV0IHJlcyA9IDA7XG4gICAgICAgIHdoaWxlIChiICE9PSAwKSB7XG4gICAgICAgICAgICBpZiAoKGIgJiAxKSAhPT0gMClcbiAgICAgICAgICAgICAgICByZXMgXj0gYTtcbiAgICAgICAgICAgIGEgPDw9IDE7XG4gICAgICAgICAgICBiID4+Pj0gMTtcbiAgICAgICAgICAgIGlmIChhID49IDI1NilcbiAgICAgICAgICAgICAgICBhIF49IG07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG4gICAgLy8gOC1iaXQgR2Fsb2lzIEZpZWxkIGV4cG9uZW50aWF0aW9uLlxuICAgIC8vIFJhaXNlIHRoZSBiYXNlIHRvIHRoZSBwb3dlciBvZiA3LCBtb2R1bG8gbS5cbiAgICBnZl9leHA3KGIsIG0pIHtcbiAgICAgICAgbGV0IHg7XG4gICAgICAgIGlmIChiID09PSAwKVxuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIHggPSB0aGlzLmdmX211bHQoYiwgYiwgbSk7XG4gICAgICAgIHggPSB0aGlzLmdmX211bHQoYiwgeCwgbSk7XG4gICAgICAgIHggPSB0aGlzLmdmX211bHQoeCwgeCwgbSk7XG4gICAgICAgIHJldHVybiB0aGlzLmdmX211bHQoYiwgeCwgbSk7XG4gICAgfVxuICAgIC8vIENhcnJ5IG91dCB0aGUgSUNFIDMyLWJpdCBwZXJtdXRhdGlvbi5cbiAgICBwZXJtMzIoeCkge1xuICAgICAgICBsZXQgcmVzID0gMDtcbiAgICAgICAgbGV0IGkgPSAwO1xuICAgICAgICB3aGlsZSAoeCAhPT0gMCkge1xuICAgICAgICAgICAgaWYgKCh4ICYgMSkgIT09IDApXG4gICAgICAgICAgICAgICAgcmVzIHw9IEljZUtleS5wQm94W2ldO1xuICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgeCA+Pj49IDE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG4gICAgLy8gSW5pdGlhbGlzZSB0aGUgc3Vic3RpdHV0aW9uL3Blcm11dGF0aW9uIGJveGVzLlxuICAgIHNwQm94SW5pdCgpIHtcbiAgICAgICAgSWNlS2V5LnNwQm94ID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgNDsgaSsrKSB7XG4gICAgICAgICAgICBJY2VLZXkuc3BCb3hbaV0gPSBbXTtcbiAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgMTAyNDsgaisrKSB7XG4gICAgICAgICAgICAgICAgSWNlS2V5LnNwQm94W2ldW2pdID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDEwMjQ7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgY29sID0gKGkgPj4+IDEpICYgMHhmZjtcbiAgICAgICAgICAgIGNvbnN0IHJvdyA9IChpICYgMHgxKSB8ICgoaSAmIDB4MjAwKSA+Pj4gOCk7XG4gICAgICAgICAgICBsZXQgeDtcbiAgICAgICAgICAgIHggPVxuICAgICAgICAgICAgICAgIHRoaXMuZ2ZfZXhwNyhjb2wgXiBJY2VLZXkuc1hvclswXVtyb3ddLCBJY2VLZXkuc01vZFswXVtyb3ddKSA8PCAyNDtcbiAgICAgICAgICAgIEljZUtleS5zcEJveFswXVtpXSA9IHRoaXMucGVybTMyKHgpO1xuICAgICAgICAgICAgeCA9XG4gICAgICAgICAgICAgICAgdGhpcy5nZl9leHA3KGNvbCBeIEljZUtleS5zWG9yWzFdW3Jvd10sIEljZUtleS5zTW9kWzFdW3Jvd10pIDw8IDE2O1xuICAgICAgICAgICAgSWNlS2V5LnNwQm94WzFdW2ldID0gdGhpcy5wZXJtMzIoeCk7XG4gICAgICAgICAgICB4ID0gdGhpcy5nZl9leHA3KGNvbCBeIEljZUtleS5zWG9yWzJdW3Jvd10sIEljZUtleS5zTW9kWzJdW3Jvd10pIDw8IDg7XG4gICAgICAgICAgICBJY2VLZXkuc3BCb3hbMl1baV0gPSB0aGlzLnBlcm0zMih4KTtcbiAgICAgICAgICAgIHggPSB0aGlzLmdmX2V4cDcoY29sIF4gSWNlS2V5LnNYb3JbM11bcm93XSwgSWNlS2V5LnNNb2RbM11bcm93XSk7XG4gICAgICAgICAgICBJY2VLZXkuc3BCb3hbM11baV0gPSB0aGlzLnBlcm0zMih4KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBTZXQgOCByb3VuZHMgW24sIG4rN10gb2YgdGhlIGtleSBzY2hlZHVsZSBvZiBhbiBJQ0Uga2V5LlxuICAgIHNjaGVkdWxlQnVpbGQoa2IsIG4sIGtyb3RJZHgpIHtcbiAgICAgICAgbGV0IGk7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHtcbiAgICAgICAgICAgIGxldCBqO1xuICAgICAgICAgICAgY29uc3Qga3IgPSBJY2VLZXkua2V5cm90W2tyb3RJZHggKyBpXTtcbiAgICAgICAgICAgIGNvbnN0IHN1YmtleSA9IHRoaXMua2V5U2NoZWR1bGVbbiArIGldO1xuICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDM7IGorKylcbiAgICAgICAgICAgICAgICB0aGlzLmtleVNjaGVkdWxlW24gKyBpXVtqXSA9IDA7XG4gICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgMTU7IGorKykge1xuICAgICAgICAgICAgICAgIGxldCBrO1xuICAgICAgICAgICAgICAgIGNvbnN0IGN1clNrID0gaiAlIDM7XG4gICAgICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IDQ7IGsrKykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjdXJLYiA9IGtiWyhrciArIGspICYgM107XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGJpdCA9IGN1cktiICYgMTtcbiAgICAgICAgICAgICAgICAgICAgc3Via2V5W2N1clNrXSA9IChzdWJrZXlbY3VyU2tdIDw8IDEpIHwgYml0O1xuICAgICAgICAgICAgICAgICAgICBrYlsoa3IgKyBrKSAmIDNdID0gKGN1cktiID4+PiAxKSB8ICgoYml0IF4gMSkgPDwgMTUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBUaGUgc2luZ2xlIHJvdW5kIElDRSBmIGZ1bmN0aW9uLlxuICAgIHJvdW5kRnVuYyhwLCBzdWJrZXkpIHtcbiAgICAgICAgY29uc3QgdGwgPSAoKHAgPj4+IDE2KSAmIDB4M2ZmKSB8ICgoKHAgPj4+IDE0KSB8IChwIDw8IDE4KSkgJiAweGZmYzAwKTtcbiAgICAgICAgY29uc3QgdHIgPSAocCAmIDB4M2ZmKSB8ICgocCA8PCAyKSAmIDB4ZmZjMDApO1xuICAgICAgICBsZXQgYWwgPSBzdWJrZXlbMl0gJiAodGwgXiB0cik7XG4gICAgICAgIGxldCBhciA9IGFsIF4gdHI7XG4gICAgICAgIGFsIF49IHRsO1xuICAgICAgICBhbCBePSBzdWJrZXlbMF07XG4gICAgICAgIGFyIF49IHN1YmtleVsxXTtcbiAgICAgICAgcmV0dXJuIChJY2VLZXkuc3BCb3hbMF1bYWwgPj4+IDEwXSB8XG4gICAgICAgICAgICBJY2VLZXkuc3BCb3hbMV1bYWwgJiAweDNmZl0gfFxuICAgICAgICAgICAgSWNlS2V5LnNwQm94WzJdW2FyID4+PiAxMF0gfFxuICAgICAgICAgICAgSWNlS2V5LnNwQm94WzNdW2FyICYgMHgzZmZdKTtcbiAgICB9XG59XG5leHBvcnRzLkljZUtleSA9IEljZUtleTtcbkljZUtleS5zcEJveEluaXRpYWxpc2VkID0gZmFsc2U7XG5JY2VLZXkuc01vZCA9IFtcbiAgICBbMzMzLCAzMTMsIDUwNSwgMzY5XSxcbiAgICBbMzc5LCAzNzUsIDMxOSwgMzkxXSxcbiAgICBbMzYxLCA0NDUsIDQ1MSwgMzk3XSxcbiAgICBbMzk3LCA0MjUsIDM5NSwgNTA1XVxuXTtcbkljZUtleS5zWG9yID0gW1xuICAgIFsweDgzLCAweDg1LCAweDliLCAweGNkXSxcbiAgICBbMHhjYywgMHhhNywgMHhhZCwgMHg0MV0sXG4gICAgWzB4NGIsIDB4MmUsIDB4ZDQsIDB4MzNdLFxuICAgIFsweGVhLCAweGNiLCAweDJlLCAweDA0XVxuXTtcbkljZUtleS5wQm94ID0gW1xuICAgIDB4MDAwMDAwMDEsIDB4MDAwMDAwODAsIDB4MDAwMDA0MDAsIDB4MDAwMDIwMDAsIDB4MDAwODAwMDAsIDB4MDAyMDAwMDAsXG4gICAgMHgwMTAwMDAwMCwgMHg0MDAwMDAwMCwgMHgwMDAwMDAwOCwgMHgwMDAwMDAyMCwgMHgwMDAwMDEwMCwgMHgwMDAwNDAwMCxcbiAgICAweDAwMDEwMDAwLCAweDAwODAwMDAwLCAweDA0MDAwMDAwLCAweDIwMDAwMDAwLCAweDAwMDAwMDA0LCAweDAwMDAwMDEwLFxuICAgIDB4MDAwMDAyMDAsIDB4MDAwMDgwMDAsIDB4MDAwMjAwMDAsIDB4MDA0MDAwMDAsIDB4MDgwMDAwMDAsIDB4MTAwMDAwMDAsXG4gICAgMHgwMDAwMDAwMiwgMHgwMDAwMDA0MCwgMHgwMDAwMDgwMCwgMHgwMDAwMTAwMCwgMHgwMDA0MDAwMCwgMHgwMDEwMDAwMCxcbiAgICAweDAyMDAwMDAwLCAweDgwMDAwMDAwXG5dO1xuSWNlS2V5LmtleXJvdCA9IFswLCAxLCAyLCAzLCAyLCAxLCAzLCAwLCAxLCAzLCAyLCAwLCAzLCAxLCAwLCAyXTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWljZWtleS5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuZmluZEJ5VHlwZSA9IGV4cG9ydHMuZmluZEJ5TmFtZSA9IGV4cG9ydHMubWVzc2FnZXMgPSB2b2lkIDA7XG5jb25zdCBuZXRtZXNzYWdlc18xID0gcmVxdWlyZShcIi4vcHJvdG9idWZzL25ldG1lc3NhZ2VzXCIpO1xuZXhwb3J0cy5tZXNzYWdlcyA9IFtdO1xuZXhwb3J0cy5tZXNzYWdlc1tuZXRtZXNzYWdlc18xLk5FVE1lc3NhZ2VzLm5ldF9OT1BdID0geyBuYW1lOiBcIm5ldF9OT1BcIiwgY2xhc3M6IG5ldG1lc3NhZ2VzXzEuQ05FVE1zZ05PUCB9O1xuZXhwb3J0cy5tZXNzYWdlc1tuZXRtZXNzYWdlc18xLk5FVE1lc3NhZ2VzLm5ldF9EaXNjb25uZWN0XSA9IHtcbiAgICBuYW1lOiBcIm5ldF9EaXNjb25uZWN0XCIsXG4gICAgY2xhc3M6IG5ldG1lc3NhZ2VzXzEuQ05FVE1zZ0Rpc2Nvbm5lY3Rcbn07XG5leHBvcnRzLm1lc3NhZ2VzW25ldG1lc3NhZ2VzXzEuTkVUTWVzc2FnZXMubmV0X0ZpbGVdID0geyBuYW1lOiBcIm5ldF9GaWxlXCIsIGNsYXNzOiBuZXRtZXNzYWdlc18xLkNORVRNc2dGaWxlIH07XG5leHBvcnRzLm1lc3NhZ2VzW25ldG1lc3NhZ2VzXzEuTkVUTWVzc2FnZXMubmV0X1NwbGl0U2NyZWVuVXNlcl0gPSB7XG4gICAgbmFtZTogXCJuZXRfU3BsaXRTY3JlZW5Vc2VyXCIsXG4gICAgY2xhc3M6IG5ldG1lc3NhZ2VzXzEuQ05FVE1zZ1NwbGl0U2NyZWVuVXNlclxufTtcbmV4cG9ydHMubWVzc2FnZXNbbmV0bWVzc2FnZXNfMS5ORVRNZXNzYWdlcy5uZXRfVGlja10gPSB7IG5hbWU6IFwibmV0X1RpY2tcIiwgY2xhc3M6IG5ldG1lc3NhZ2VzXzEuQ05FVE1zZ1RpY2sgfTtcbmV4cG9ydHMubWVzc2FnZXNbbmV0bWVzc2FnZXNfMS5ORVRNZXNzYWdlcy5uZXRfU3RyaW5nQ21kXSA9IHtcbiAgICBuYW1lOiBcIm5ldF9TdHJpbmdDbWRcIixcbiAgICBjbGFzczogbmV0bWVzc2FnZXNfMS5DTkVUTXNnU3RyaW5nQ21kXG59O1xuZXhwb3J0cy5tZXNzYWdlc1tuZXRtZXNzYWdlc18xLk5FVE1lc3NhZ2VzLm5ldF9TZXRDb25WYXJdID0ge1xuICAgIG5hbWU6IFwibmV0X1NldENvblZhclwiLFxuICAgIGNsYXNzOiBuZXRtZXNzYWdlc18xLkNORVRNc2dTZXRDb25WYXJcbn07XG5leHBvcnRzLm1lc3NhZ2VzW25ldG1lc3NhZ2VzXzEuTkVUTWVzc2FnZXMubmV0X1NpZ25vblN0YXRlXSA9IHtcbiAgICBuYW1lOiBcIm5ldF9TaWdub25TdGF0ZVwiLFxuICAgIGNsYXNzOiBuZXRtZXNzYWdlc18xLkNORVRNc2dTaWdub25TdGF0ZVxufTtcbmV4cG9ydHMubWVzc2FnZXNbbmV0bWVzc2FnZXNfMS5ORVRNZXNzYWdlcy5uZXRfUGxheWVyQXZhdGFyRGF0YV0gPSB7XG4gICAgbmFtZTogXCJuZXRfUGxheWVyQXZhdGFyRGF0YVwiLFxuICAgIGNsYXNzOiBuZXRtZXNzYWdlc18xLkNORVRNc2dQbGF5ZXJBdmF0YXJEYXRhXG59O1xuZXhwb3J0cy5tZXNzYWdlc1tuZXRtZXNzYWdlc18xLlNWQ01lc3NhZ2VzLnN2Y19TZXJ2ZXJJbmZvXSA9IHtcbiAgICBuYW1lOiBcInN2Y19TZXJ2ZXJJbmZvXCIsXG4gICAgY2xhc3M6IG5ldG1lc3NhZ2VzXzEuQ1NWQ01zZ1NlcnZlckluZm9cbn07XG5leHBvcnRzLm1lc3NhZ2VzW25ldG1lc3NhZ2VzXzEuU1ZDTWVzc2FnZXMuc3ZjX1NlbmRUYWJsZV0gPSB7XG4gICAgbmFtZTogXCJzdmNfU2VuZFRhYmxlXCIsXG4gICAgY2xhc3M6IG5ldG1lc3NhZ2VzXzEuQ1NWQ01zZ1NlbmRUYWJsZVxufTtcbmV4cG9ydHMubWVzc2FnZXNbbmV0bWVzc2FnZXNfMS5TVkNNZXNzYWdlcy5zdmNfQ2xhc3NJbmZvXSA9IHtcbiAgICBuYW1lOiBcInN2Y19DbGFzc0luZm9cIixcbiAgICBjbGFzczogbmV0bWVzc2FnZXNfMS5DU1ZDTXNnQ2xhc3NJbmZvXG59O1xuZXhwb3J0cy5tZXNzYWdlc1tuZXRtZXNzYWdlc18xLlNWQ01lc3NhZ2VzLnN2Y19TZXRQYXVzZV0gPSB7XG4gICAgbmFtZTogXCJzdmNfU2V0UGF1c2VcIixcbiAgICBjbGFzczogbmV0bWVzc2FnZXNfMS5DU1ZDTXNnU2V0UGF1c2Vcbn07XG5leHBvcnRzLm1lc3NhZ2VzW25ldG1lc3NhZ2VzXzEuU1ZDTWVzc2FnZXMuc3ZjX0NyZWF0ZVN0cmluZ1RhYmxlXSA9IHtcbiAgICBuYW1lOiBcInN2Y19DcmVhdGVTdHJpbmdUYWJsZVwiLFxuICAgIGNsYXNzOiBuZXRtZXNzYWdlc18xLkNTVkNNc2dDcmVhdGVTdHJpbmdUYWJsZVxufTtcbmV4cG9ydHMubWVzc2FnZXNbbmV0bWVzc2FnZXNfMS5TVkNNZXNzYWdlcy5zdmNfVXBkYXRlU3RyaW5nVGFibGVdID0ge1xuICAgIG5hbWU6IFwic3ZjX1VwZGF0ZVN0cmluZ1RhYmxlXCIsXG4gICAgY2xhc3M6IG5ldG1lc3NhZ2VzXzEuQ1NWQ01zZ1VwZGF0ZVN0cmluZ1RhYmxlXG59O1xuZXhwb3J0cy5tZXNzYWdlc1tuZXRtZXNzYWdlc18xLlNWQ01lc3NhZ2VzLnN2Y19Wb2ljZUluaXRdID0ge1xuICAgIG5hbWU6IFwic3ZjX1ZvaWNlSW5pdFwiLFxuICAgIGNsYXNzOiBuZXRtZXNzYWdlc18xLkNTVkNNc2dWb2ljZUluaXRcbn07XG5leHBvcnRzLm1lc3NhZ2VzW25ldG1lc3NhZ2VzXzEuU1ZDTWVzc2FnZXMuc3ZjX1ZvaWNlRGF0YV0gPSB7XG4gICAgbmFtZTogXCJzdmNfVm9pY2VEYXRhXCIsXG4gICAgY2xhc3M6IG5ldG1lc3NhZ2VzXzEuQ1NWQ01zZ1ZvaWNlRGF0YVxufTtcbmV4cG9ydHMubWVzc2FnZXNbbmV0bWVzc2FnZXNfMS5TVkNNZXNzYWdlcy5zdmNfUHJpbnRdID0geyBuYW1lOiBcInN2Y19QcmludFwiLCBjbGFzczogbmV0bWVzc2FnZXNfMS5DU1ZDTXNnUHJpbnQgfTtcbmV4cG9ydHMubWVzc2FnZXNbbmV0bWVzc2FnZXNfMS5TVkNNZXNzYWdlcy5zdmNfU291bmRzXSA9IHsgbmFtZTogXCJzdmNfU291bmRzXCIsIGNsYXNzOiBuZXRtZXNzYWdlc18xLkNTVkNNc2dTb3VuZHMgfTtcbmV4cG9ydHMubWVzc2FnZXNbbmV0bWVzc2FnZXNfMS5TVkNNZXNzYWdlcy5zdmNfU2V0Vmlld10gPSB7XG4gICAgbmFtZTogXCJzdmNfU2V0Vmlld1wiLFxuICAgIGNsYXNzOiBuZXRtZXNzYWdlc18xLkNTVkNNc2dTZXRWaWV3XG59O1xuZXhwb3J0cy5tZXNzYWdlc1tuZXRtZXNzYWdlc18xLlNWQ01lc3NhZ2VzLnN2Y19GaXhBbmdsZV0gPSB7XG4gICAgbmFtZTogXCJzdmNfRml4QW5nbGVcIixcbiAgICBjbGFzczogbmV0bWVzc2FnZXNfMS5DU1ZDTXNnRml4QW5nbGVcbn07XG5leHBvcnRzLm1lc3NhZ2VzW25ldG1lc3NhZ2VzXzEuU1ZDTWVzc2FnZXMuc3ZjX0Nyb3NzaGFpckFuZ2xlXSA9IHtcbiAgICBuYW1lOiBcInN2Y19Dcm9zc2hhaXJBbmdsZVwiLFxuICAgIGNsYXNzOiBuZXRtZXNzYWdlc18xLkNTVkNNc2dDcm9zc2hhaXJBbmdsZVxufTtcbmV4cG9ydHMubWVzc2FnZXNbbmV0bWVzc2FnZXNfMS5TVkNNZXNzYWdlcy5zdmNfQlNQRGVjYWxdID0ge1xuICAgIG5hbWU6IFwic3ZjX0JTUERlY2FsXCIsXG4gICAgY2xhc3M6IG5ldG1lc3NhZ2VzXzEuQ1NWQ01zZ0JTUERlY2FsXG59O1xuZXhwb3J0cy5tZXNzYWdlc1tuZXRtZXNzYWdlc18xLlNWQ01lc3NhZ2VzLnN2Y19TcGxpdFNjcmVlbl0gPSB7XG4gICAgbmFtZTogXCJzdmNfU3BsaXRTY3JlZW5cIixcbiAgICBjbGFzczogbmV0bWVzc2FnZXNfMS5DU1ZDTXNnU3BsaXRTY3JlZW5cbn07XG5leHBvcnRzLm1lc3NhZ2VzW25ldG1lc3NhZ2VzXzEuU1ZDTWVzc2FnZXMuc3ZjX1VzZXJNZXNzYWdlXSA9IHtcbiAgICBuYW1lOiBcInN2Y19Vc2VyTWVzc2FnZVwiLFxuICAgIGNsYXNzOiBuZXRtZXNzYWdlc18xLkNTVkNNc2dVc2VyTWVzc2FnZVxufTtcbmV4cG9ydHMubWVzc2FnZXNbbmV0bWVzc2FnZXNfMS5TVkNNZXNzYWdlcy5zdmNfRW50aXR5TWVzc2FnZV0gPSB7XG4gICAgbmFtZTogXCJzdmNfRW50aXR5TWVzc2FnZVwiLFxuICAgIGNsYXNzOiBuZXRtZXNzYWdlc18xLkNTVkNNc2dFbnRpdHlNc2dcbn07XG5leHBvcnRzLm1lc3NhZ2VzW25ldG1lc3NhZ2VzXzEuU1ZDTWVzc2FnZXMuc3ZjX0dhbWVFdmVudF0gPSB7XG4gICAgbmFtZTogXCJzdmNfR2FtZUV2ZW50XCIsXG4gICAgY2xhc3M6IG5ldG1lc3NhZ2VzXzEuQ1NWQ01zZ0dhbWVFdmVudFxufTtcbmV4cG9ydHMubWVzc2FnZXNbbmV0bWVzc2FnZXNfMS5TVkNNZXNzYWdlcy5zdmNfUGFja2V0RW50aXRpZXNdID0ge1xuICAgIG5hbWU6IFwic3ZjX1BhY2tldEVudGl0aWVzXCIsXG4gICAgY2xhc3M6IG5ldG1lc3NhZ2VzXzEuQ1NWQ01zZ1BhY2tldEVudGl0aWVzXG59O1xuZXhwb3J0cy5tZXNzYWdlc1tuZXRtZXNzYWdlc18xLlNWQ01lc3NhZ2VzLnN2Y19UZW1wRW50aXRpZXNdID0ge1xuICAgIG5hbWU6IFwic3ZjX1RlbXBFbnRpdGllc1wiLFxuICAgIGNsYXNzOiBuZXRtZXNzYWdlc18xLkNTVkNNc2dUZW1wRW50aXRpZXNcbn07XG5leHBvcnRzLm1lc3NhZ2VzW25ldG1lc3NhZ2VzXzEuU1ZDTWVzc2FnZXMuc3ZjX1ByZWZldGNoXSA9IHtcbiAgICBuYW1lOiBcInN2Y19QcmVmZXRjaFwiLFxuICAgIGNsYXNzOiBuZXRtZXNzYWdlc18xLkNTVkNNc2dQcmVmZXRjaFxufTtcbmV4cG9ydHMubWVzc2FnZXNbbmV0bWVzc2FnZXNfMS5TVkNNZXNzYWdlcy5zdmNfTWVudV0gPSB7IG5hbWU6IFwic3ZjX01lbnVcIiwgY2xhc3M6IG5ldG1lc3NhZ2VzXzEuQ1NWQ01zZ01lbnUgfTtcbmV4cG9ydHMubWVzc2FnZXNbbmV0bWVzc2FnZXNfMS5TVkNNZXNzYWdlcy5zdmNfR2FtZUV2ZW50TGlzdF0gPSB7XG4gICAgbmFtZTogXCJzdmNfR2FtZUV2ZW50TGlzdFwiLFxuICAgIGNsYXNzOiBuZXRtZXNzYWdlc18xLkNTVkNNc2dHYW1lRXZlbnRMaXN0XG59O1xuZXhwb3J0cy5tZXNzYWdlc1tuZXRtZXNzYWdlc18xLlNWQ01lc3NhZ2VzLnN2Y19HZXRDdmFyVmFsdWVdID0ge1xuICAgIG5hbWU6IFwic3ZjX0dldEN2YXJWYWx1ZVwiLFxuICAgIGNsYXNzOiBuZXRtZXNzYWdlc18xLkNTVkNNc2dHZXRDdmFyVmFsdWVcbn07XG5leHBvcnRzLm1lc3NhZ2VzW25ldG1lc3NhZ2VzXzEuU1ZDTWVzc2FnZXMuc3ZjX1BhaW50bWFwRGF0YV0gPSB7XG4gICAgbmFtZTogXCJzdmNfUGFpbnRtYXBEYXRhXCIsXG4gICAgY2xhc3M6IG5ldG1lc3NhZ2VzXzEuQ1NWQ01zZ1BhaW50bWFwRGF0YVxufTtcbmV4cG9ydHMubWVzc2FnZXNbbmV0bWVzc2FnZXNfMS5TVkNNZXNzYWdlcy5zdmNfQ21kS2V5VmFsdWVzXSA9IHtcbiAgICBuYW1lOiBcInN2Y19DbWRLZXlWYWx1ZXNcIixcbiAgICBjbGFzczogbmV0bWVzc2FnZXNfMS5DU1ZDTXNnQ21kS2V5VmFsdWVzXG59O1xuZXhwb3J0cy5tZXNzYWdlc1tuZXRtZXNzYWdlc18xLlNWQ01lc3NhZ2VzLnN2Y19FbmNyeXB0ZWREYXRhXSA9IHtcbiAgICBuYW1lOiBcInN2Y19FbmNyeXB0ZWREYXRhXCIsXG4gICAgY2xhc3M6IG5ldG1lc3NhZ2VzXzEuQ1NWQ01zZ0VuY3J5cHRlZERhdGFcbn07XG5leHBvcnRzLm1lc3NhZ2VzW25ldG1lc3NhZ2VzXzEuU1ZDTWVzc2FnZXMuc3ZjX0hsdHZSZXBsYXldID0ge1xuICAgIG5hbWU6IFwic3ZjX0hsdHZSZXBsYXlcIixcbiAgICBjbGFzczogbmV0bWVzc2FnZXNfMS5DU1ZDTXNnSGx0dlJlcGxheVxufTtcbmV4cG9ydHMubWVzc2FnZXNbbmV0bWVzc2FnZXNfMS5TVkNNZXNzYWdlcy5zdmNfQnJvYWRjYXN0X0NvbW1hbmRdID0ge1xuICAgIG5hbWU6IFwic3ZjX0Jyb2FkY2FzdF9Db21tYW5kXCIsXG4gICAgY2xhc3M6IG5ldG1lc3NhZ2VzXzEuQ1NWQ01zZ0Jyb2FkY2FzdENvbW1hbmRcbn07XG5mdW5jdGlvbiBmaW5kQnlOYW1lKG5hbWUpIHtcbiAgICByZXR1cm4gZXhwb3J0cy5tZXNzYWdlcy5maW5kKGRlc2NyaXB0b3IgPT4gZGVzY3JpcHRvci5uYW1lID09PSBuYW1lKTtcbn1cbmV4cG9ydHMuZmluZEJ5TmFtZSA9IGZpbmRCeU5hbWU7XG5mdW5jdGlvbiBmaW5kQnlUeXBlKHR5cGUpIHtcbiAgICByZXR1cm4gZXhwb3J0cy5tZXNzYWdlc1t0eXBlXTtcbn1cbmV4cG9ydHMuZmluZEJ5VHlwZSA9IGZpbmRCeVR5cGU7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1uZXQuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLm1ha2VEZWNvZGVyID0gZXhwb3J0cy5TUFJPUF9WQVJJTlQgPSBleHBvcnRzLlNQUk9QX0NIQU5HRVNfT0ZURU4gPSBleHBvcnRzLlNQUk9QX0NFTExfQ09PUkRfSU5URUdSQUwgPSBleHBvcnRzLlNQUk9QX0NFTExfQ09PUkRfTE9XUFJFQ0lTSU9OID0gZXhwb3J0cy5TUFJPUF9DRUxMX0NPT1JEID0gZXhwb3J0cy5TUFJPUF9DT09SRF9NUF9JTlRFR1JBTCA9IGV4cG9ydHMuU1BST1BfQ09PUkRfTVBfTE9XUFJFQ0lTSU9OID0gZXhwb3J0cy5TUFJPUF9DT09SRF9NUCA9IGV4cG9ydHMuU1BST1BfQ09MTEFQU0lCTEUgPSBleHBvcnRzLlNQUk9QX0lTX0FfVkVDVE9SX0VMRU0gPSBleHBvcnRzLlNQUk9QX1BST1hZX0FMV0FZU19ZRVMgPSBleHBvcnRzLlNQUk9QX0lOU0lERUFSUkFZID0gZXhwb3J0cy5TUFJPUF9YWVpFID0gZXhwb3J0cy5TUFJPUF9FWENMVURFID0gZXhwb3J0cy5TUFJPUF9OT1JNQUwgPSBleHBvcnRzLlNQUk9QX1JPVU5EVVAgPSBleHBvcnRzLlNQUk9QX1JPVU5ERE9XTiA9IGV4cG9ydHMuU1BST1BfTk9TQ0FMRSA9IGV4cG9ydHMuU1BST1BfQ09PUkQgPSBleHBvcnRzLlNQUk9QX1VOU0lHTkVEID0gdm9pZCAwO1xuY29uc3QgYXNzZXJ0ID0gcmVxdWlyZShcImFzc2VydFwiKTtcbmNvbnN0IExvbmcgPSByZXF1aXJlKFwibG9uZ1wiKTtcbmNvbnN0IGFzc2VydF9leGlzdHNfMSA9IHJlcXVpcmUoXCIuL2Fzc2VydC1leGlzdHNcIik7XG5jb25zdCBjb25zdHNfMSA9IHJlcXVpcmUoXCIuL2NvbnN0c1wiKTtcbmNvbnN0IGVudGl0eWhhbmRsZV8xID0gcmVxdWlyZShcIi4vZW50aXR5aGFuZGxlXCIpO1xuZXhwb3J0cy5TUFJPUF9VTlNJR05FRCA9IDEgPDwgMDsgLy8gVW5zaWduZWQgaW50ZWdlciBkYXRhLlxuZXhwb3J0cy5TUFJPUF9DT09SRCA9IDEgPDwgMTsgLy8gSWYgdGhpcyBpcyBzZXQsIHRoZSBmbG9hdC92ZWN0b3IgaXMgdHJlYXRlZCBsaWtlIGEgd29ybGQgY29vcmRpbmF0ZS4gTm90ZSB0aGF0IHRoZSBiaXQgY291bnQgaXMgaWdub3JlZCBpbiB0aGlzIGNhc2UuXG5leHBvcnRzLlNQUk9QX05PU0NBTEUgPSAxIDw8IDI7IC8vIEZvciBmbG9hdGluZyBwb2ludCwgZG9uJ3Qgc2NhbGUgaW50byByYW5nZSwganVzdCB0YWtlIHZhbHVlIGFzIGlzLlxuZXhwb3J0cy5TUFJPUF9ST1VORERPV04gPSAxIDw8IDM7IC8vIEZvciBmbG9hdGluZyBwb2ludCwgbGltaXQgaGlnaCB2YWx1ZSB0byByYW5nZSBtaW51cyBvbmUgYml0IHVuaXRcbmV4cG9ydHMuU1BST1BfUk9VTkRVUCA9IDEgPDwgNDsgLy8gRm9yIGZsb2F0aW5nIHBvaW50LCBsaW1pdCBsb3cgdmFsdWUgdG8gcmFuZ2UgbWludXMgb25lIGJpdCB1bml0XG5leHBvcnRzLlNQUk9QX05PUk1BTCA9IDEgPDwgNTsgLy8gSWYgdGhpcyBpcyBzZXQsIHRoZSB2ZWN0b3IgaXMgdHJlYXRlZCBsaWtlIGEgbm9ybWFsIChvbmx5IHZhbGlkIGZvciB2ZWN0b3JzKVxuZXhwb3J0cy5TUFJPUF9FWENMVURFID0gMSA8PCA2OyAvLyBUaGlzIGlzIGFuIGV4Y2x1ZGUgcHJvcCAobm90IGV4Y2x1ZEVELCBidXQgaXQgcG9pbnRzIGF0IGFub3RoZXIgcHJvcCB0byBiZSBleGNsdWRlZCkuXG5leHBvcnRzLlNQUk9QX1hZWkUgPSAxIDw8IDc7IC8vIFVzZSBYWVovRXhwb25lbnQgZW5jb2RpbmcgZm9yIHZlY3RvcnMuXG5leHBvcnRzLlNQUk9QX0lOU0lERUFSUkFZID0gMSA8PCA4OyAvLyBUaGlzIHRlbGxzIHVzIHRoYXQgdGhlIHByb3BlcnR5IGlzIGluc2lkZSBhbiBhcnJheSwgc28gaXQgc2hvdWxkbid0IGJlIHB1dCBpbnRvIHRoZSBmbGF0dGVuZWQgcHJvcGVydHkgbGlzdC4gSXRzIGFycmF5IHdpbGwgcG9pbnQgYXQgaXQgd2hlbiBpdCBuZWVkcyB0by5cbmV4cG9ydHMuU1BST1BfUFJPWFlfQUxXQVlTX1lFUyA9IDEgPDwgOTsgLy8gU2V0IGZvciBkYXRhdGFibGUgcHJvcHMgdXNpbmcgb25lIG9mIHRoZSBkZWZhdWx0IGRhdGF0YWJsZSBwcm94aWVzIGxpa2UgU2VuZFByb3h5X0RhdGFUYWJsZVRvRGF0YVRhYmxlIHRoYXQgYWx3YXlzIHNlbmQgdGhlIGRhdGEgdG8gYWxsIGNsaWVudHMuXG5leHBvcnRzLlNQUk9QX0lTX0FfVkVDVE9SX0VMRU0gPSAxIDw8IDEwOyAvLyBTZXQgYXV0b21hdGljYWxseSBpZiBTUFJPUF9WRUNUT1JFTEVNIGlzIHVzZWQuXG5leHBvcnRzLlNQUk9QX0NPTExBUFNJQkxFID0gMSA8PCAxMTsgLy8gU2V0IGF1dG9tYXRpY2FsbHkgaWYgaXQncyBhIGRhdGF0YWJsZSB3aXRoIGFuIG9mZnNldCBvZiAwIHRoYXQgZG9lc24ndCBjaGFuZ2UgdGhlIHBvaW50ZXIgKGllOiBmb3IgYWxsIGF1dG9tYXRpY2FsbHktY2hhaW5lZCBiYXNlIGNsYXNzZXMpLlxuZXhwb3J0cy5TUFJPUF9DT09SRF9NUCA9IDEgPDwgMTI7IC8vIExpa2UgU1BST1BfQ09PUkQsIGJ1dCBzcGVjaWFsIGhhbmRsaW5nIGZvciBtdWx0aXBsYXllciBnYW1lc1xuZXhwb3J0cy5TUFJPUF9DT09SRF9NUF9MT1dQUkVDSVNJT04gPSAxIDw8IDEzOyAvLyBMaWtlIFNQUk9QX0NPT1JELCBidXQgc3BlY2lhbCBoYW5kbGluZyBmb3IgbXVsdGlwbGF5ZXIgZ2FtZXMgd2hlcmUgdGhlIGZyYWN0aW9uYWwgY29tcG9uZW50IG9ubHkgZ2V0cyBhIDMgYml0cyBpbnN0ZWFkIG9mIDVcbmV4cG9ydHMuU1BST1BfQ09PUkRfTVBfSU5URUdSQUwgPSAxIDw8IDE0OyAvLyBTUFJPUF9DT09SRF9NUCwgYnV0IGNvb3JkaW5hdGVzIGFyZSByb3VuZGVkIHRvIGludGVncmFsIGJvdW5kYXJpZXNcbmV4cG9ydHMuU1BST1BfQ0VMTF9DT09SRCA9IDEgPDwgMTU7IC8vIExpa2UgU1BST1BfQ09PUkQsIGJ1dCBzcGVjaWFsIGVuY29kaW5nIGZvciBjZWxsIGNvb3JkaW5hdGVzIHRoYXQgY2FuJ3QgYmUgbmVnYXRpdmUsIGJpdCBjb3VudCBpbmRpY2F0ZSBtYXhpbXVtIHZhbHVlXG5leHBvcnRzLlNQUk9QX0NFTExfQ09PUkRfTE9XUFJFQ0lTSU9OID0gMSA8PCAxNjsgLy8gTGlrZSBTUFJPUF9DRUxMX0NPT1JELCBidXQgc3BlY2lhbCBoYW5kbGluZyB3aGVyZSB0aGUgZnJhY3Rpb25hbCBjb21wb25lbnQgb25seSBnZXRzIGEgMyBiaXRzIGluc3RlYWQgb2YgNVxuZXhwb3J0cy5TUFJPUF9DRUxMX0NPT1JEX0lOVEVHUkFMID0gMSA8PCAxNzsgLy8gU1BST1BfQ0VMTF9DT09SRCwgYnV0IGNvb3JkaW5hdGVzIGFyZSByb3VuZGVkIHRvIGludGVncmFsIGJvdW5kYXJpZXNcbmV4cG9ydHMuU1BST1BfQ0hBTkdFU19PRlRFTiA9IDEgPDwgMTg7IC8vIHRoaXMgaXMgYW4gb2Z0ZW4gY2hhbmdlZCBmaWVsZCwgbW92ZWQgdG8gaGVhZCBvZiBzZW5kdGFibGUgc28gaXQgZ2V0cyBhIHNtYWxsIGluZGV4XG5leHBvcnRzLlNQUk9QX1ZBUklOVCA9IDEgPDwgMTk7IC8vIHVzZSB2YXIgaW50IGVuY29kZWQgKGdvb2dsZSBwcm90b2J1ZiBzdHlsZSksIG5vdGUgeW91IHdhbnQgdG8gaW5jbHVkZSBTUFJPUF9VTlNJR05FRCBpZiBuZWVkZWQsIGl0cyBtb3JlIGVmZmljaWVudFxuY29uc3QgRFRfTUFYX1NUUklOR19CSVRTID0gOTtcbmZ1bmN0aW9uIG1ha2VJbnREZWNvZGVyKHNlbmRQcm9wKSB7XG4gICAgaWYgKChzZW5kUHJvcC5mbGFncyAmIGV4cG9ydHMuU1BST1BfVkFSSU5UKSAhPT0gMCkge1xuICAgICAgICBpZiAoKHNlbmRQcm9wLmZsYWdzICYgZXhwb3J0cy5TUFJPUF9VTlNJR05FRCkgIT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBiaXRidWYgPT4gYml0YnVmLnJlYWRVVmFySW50MzIoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBiaXRidWYgPT4gYml0YnVmLnJlYWRWYXJJbnQzMigpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBjb25zdCBudW1CaXRzID0gc2VuZFByb3AubnVtQml0cztcbiAgICAgICAgaWYgKChzZW5kUHJvcC5mbGFncyAmIGV4cG9ydHMuU1BST1BfVU5TSUdORUQpICE9PSAwKSB7XG4gICAgICAgICAgICBpZiAoKHNlbmRQcm9wLmZsYWdzICYgZXhwb3J0cy5TUFJPUF9OT1NDQUxFKSAhPT0gMCAmJlxuICAgICAgICAgICAgICAgIHNlbmRQcm9wLm51bUJpdHMgPT09IGNvbnN0c18xLk5VTV9ORVRXT1JLRURfRUhBTkRMRV9CSVRTKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGJpdGJ1ZiA9PiBuZXcgZW50aXR5aGFuZGxlXzEuRW50aXR5SGFuZGxlKGJpdGJ1Zi5yZWFkVUJpdHMobnVtQml0cykpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAobnVtQml0cyA9PT0gMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBiaXRidWYgPT4gYml0YnVmLnJlYWRPbmVCaXQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBiaXRidWYgPT4gYml0YnVmLnJlYWRVQml0cyhudW1CaXRzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBiaXRidWYgPT4gYml0YnVmLnJlYWRTQml0cyhudW1CaXRzKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIG1ha2VTcGVjaWFsRmxvYXREZWNvZGVyKHNlbmRQcm9wKSB7XG4gICAgaWYgKChzZW5kUHJvcC5mbGFncyAmIGV4cG9ydHMuU1BST1BfQ09PUkQpICE9PSAwKSB7XG4gICAgICAgIHJldHVybiBiaXRidWYgPT4gYml0YnVmLnJlYWRCaXRDb29yZCgpO1xuICAgIH1cbiAgICBlbHNlIGlmICgoc2VuZFByb3AuZmxhZ3MgJiBleHBvcnRzLlNQUk9QX0NPT1JEX01QKSAhPT0gMCkge1xuICAgICAgICByZXR1cm4gYml0YnVmID0+IGJpdGJ1Zi5yZWFkQml0Q29vcmRNUE5vbmUoKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoKHNlbmRQcm9wLmZsYWdzICYgZXhwb3J0cy5TUFJPUF9DT09SRF9NUF9MT1dQUkVDSVNJT04pICE9PSAwKSB7XG4gICAgICAgIHJldHVybiBiaXRidWYgPT4gYml0YnVmLnJlYWRCaXRDb29yZE1QTG93UHJlY2lzaW9uKCk7XG4gICAgfVxuICAgIGVsc2UgaWYgKChzZW5kUHJvcC5mbGFncyAmIGV4cG9ydHMuU1BST1BfQ09PUkRfTVBfSU5URUdSQUwpICE9PSAwKSB7XG4gICAgICAgIHJldHVybiBiaXRidWYgPT4gYml0YnVmLnJlYWRCaXRDb29yZE1QSW50ZWdyYWwoKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoKHNlbmRQcm9wLmZsYWdzICYgZXhwb3J0cy5TUFJPUF9OT1NDQUxFKSAhPT0gMCkge1xuICAgICAgICByZXR1cm4gYml0YnVmID0+IGJpdGJ1Zi5yZWFkRmxvYXQzMigpO1xuICAgIH1cbiAgICBlbHNlIGlmICgoc2VuZFByb3AuZmxhZ3MgJiBleHBvcnRzLlNQUk9QX05PUk1BTCkgIT09IDApIHtcbiAgICAgICAgcmV0dXJuIGJpdGJ1ZiA9PiBiaXRidWYucmVhZEJpdE5vcm1hbCgpO1xuICAgIH1cbiAgICBlbHNlIGlmICgoc2VuZFByb3AuZmxhZ3MgJiBleHBvcnRzLlNQUk9QX0NFTExfQ09PUkQpICE9PSAwKSB7XG4gICAgICAgIHJldHVybiBiaXRidWYgPT4gYml0YnVmLnJlYWRCaXRDZWxsQ29vcmROb25lKHNlbmRQcm9wLm51bUJpdHMpO1xuICAgIH1cbiAgICBlbHNlIGlmICgoc2VuZFByb3AuZmxhZ3MgJiBleHBvcnRzLlNQUk9QX0NFTExfQ09PUkRfTE9XUFJFQ0lTSU9OKSAhPT0gMCkge1xuICAgICAgICByZXR1cm4gYml0YnVmID0+IGJpdGJ1Zi5yZWFkQml0Q2VsbENvb3JkTG93UHJlY2lzaW9uKHNlbmRQcm9wLm51bUJpdHMpO1xuICAgIH1cbiAgICBlbHNlIGlmICgoc2VuZFByb3AuZmxhZ3MgJiBleHBvcnRzLlNQUk9QX0NFTExfQ09PUkRfSU5URUdSQUwpICE9PSAwKSB7XG4gICAgICAgIHJldHVybiBiaXRidWYgPT4gYml0YnVmLnJlYWRVQml0cyhzZW5kUHJvcC5udW1CaXRzKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxufVxuZnVuY3Rpb24gbWFrZUZsb2F0RGVjb2RlcihzZW5kUHJvcCkge1xuICAgIGNvbnN0IHNwZWNpYWwgPSBtYWtlU3BlY2lhbEZsb2F0RGVjb2RlcihzZW5kUHJvcCk7XG4gICAgaWYgKHNwZWNpYWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gc3BlY2lhbDtcbiAgICB9XG4gICAgY29uc3QgbnVtQml0cyA9IHNlbmRQcm9wLm51bUJpdHM7XG4gICAgY29uc3QgbWF4VmFsdWUgPSAoMSA8PCBudW1CaXRzKSAtIDE7XG4gICAgY29uc3QgbG93VmFsdWUgPSBzZW5kUHJvcC5sb3dWYWx1ZTtcbiAgICBjb25zdCBoaWdoVmFsdWUgPSBzZW5kUHJvcC5oaWdoVmFsdWU7XG4gICAgcmV0dXJuIGJpdGJ1ZiA9PiB7XG4gICAgICAgIGNvbnN0IGludGVycCA9IGJpdGJ1Zi5yZWFkVUJpdHMobnVtQml0cyk7XG4gICAgICAgIGNvbnN0IGZWYWwgPSBpbnRlcnAgLyBtYXhWYWx1ZTtcbiAgICAgICAgcmV0dXJuIGxvd1ZhbHVlICsgKGhpZ2hWYWx1ZSAtIGxvd1ZhbHVlKSAqIGZWYWw7XG4gICAgfTtcbn1cbmZ1bmN0aW9uIG1ha2VWZWN0b3JEZWNvZGVyKHNlbmRQcm9wKSB7XG4gICAgY29uc3QgZmxvYXREZWNvZGUgPSBtYWtlRmxvYXREZWNvZGVyKHNlbmRQcm9wKTtcbiAgICBjb25zdCBpc05vcm1hbCA9IChzZW5kUHJvcC5mbGFncyAmIGV4cG9ydHMuU1BST1BfTk9STUFMKSAhPT0gMDtcbiAgICBpZiAoaXNOb3JtYWwpIHtcbiAgICAgICAgcmV0dXJuIGJpdGJ1ZiA9PiB7XG4gICAgICAgICAgICBjb25zdCB2ID0ge1xuICAgICAgICAgICAgICAgIHg6IGZsb2F0RGVjb2RlKGJpdGJ1ZiksXG4gICAgICAgICAgICAgICAgeTogZmxvYXREZWNvZGUoYml0YnVmKSxcbiAgICAgICAgICAgICAgICB6OiAwLjBcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBjb25zdCBzaWduQml0ID0gYml0YnVmLnJlYWRPbmVCaXQoKTtcbiAgICAgICAgICAgIGNvbnN0IHYwdjB2MXYxID0gdi54ICogdi54ICsgdi55ICogdi55O1xuICAgICAgICAgICAgaWYgKHYwdjB2MXYxIDwgMS4wKSB7XG4gICAgICAgICAgICAgICAgdi56ID0gTWF0aC5zcXJ0KDEuMCAtIHYwdjB2MXYxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHYueiA9IDAuMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzaWduQml0KSB7XG4gICAgICAgICAgICAgICAgdi56ICo9IC0xLjA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdjtcbiAgICAgICAgfTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiBiaXRidWYgPT4gKHtcbiAgICAgICAgICAgIHg6IGZsb2F0RGVjb2RlKGJpdGJ1ZiksXG4gICAgICAgICAgICB5OiBmbG9hdERlY29kZShiaXRidWYpLFxuICAgICAgICAgICAgejogZmxvYXREZWNvZGUoYml0YnVmKVxuICAgICAgICB9KTtcbiAgICB9XG59XG5mdW5jdGlvbiBtYWtlVmVjdG9yWFlEZWNvZGVyKHNlbmRQcm9wKSB7XG4gICAgY29uc3QgZmxvYXREZWNvZGUgPSBtYWtlRmxvYXREZWNvZGVyKHNlbmRQcm9wKTtcbiAgICByZXR1cm4gYml0YnVmID0+ICh7XG4gICAgICAgIHg6IGZsb2F0RGVjb2RlKGJpdGJ1ZiksXG4gICAgICAgIHk6IGZsb2F0RGVjb2RlKGJpdGJ1ZiksXG4gICAgICAgIHo6IDAuMFxuICAgIH0pO1xufVxuZnVuY3Rpb24gbWFrZVN0cmluZ0RlY29kZXIoX3NlbmRQcm9wKSB7XG4gICAgcmV0dXJuIGJpdGJ1ZiA9PiB7XG4gICAgICAgIGNvbnN0IGxlbiA9IGJpdGJ1Zi5yZWFkVUJpdHMoRFRfTUFYX1NUUklOR19CSVRTKTtcbiAgICAgICAgcmV0dXJuIGJpdGJ1Zi5yZWFkU3RyaW5nKGxlbik7XG4gICAgfTtcbn1cbmZ1bmN0aW9uIG1ha2VJbnQ2NERlY29kZXIoc2VuZFByb3ApIHtcbiAgICBpZiAoKHNlbmRQcm9wLmZsYWdzICYgZXhwb3J0cy5TUFJPUF9WQVJJTlQpICE9PSAwKSB7XG4gICAgICAgIGlmICgoc2VuZFByb3AuZmxhZ3MgJiBleHBvcnRzLlNQUk9QX1VOU0lHTkVEKSAhPT0gMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiNjQtYml0IHVuc2lnbmVkIHZhcmludCBub3QgaW1wbGVtZW50ZWRcIik7IC8vIFRPRE9cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIjY0LWJpdCBzaWduZWQgdmFyaW50IG5vdCBpbXBsZW1lbnRlZFwiKTsgLy8gVE9ET1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBjb25zdCBoaWdoQml0cyA9IHNlbmRQcm9wLm51bUJpdHMgLSAzMjtcbiAgICAgICAgaWYgKChzZW5kUHJvcC5mbGFncyAmIGV4cG9ydHMuU1BST1BfVU5TSUdORUQpICE9PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYml0YnVmID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBsb3dJbnQgPSBiaXRidWYucmVhZFVCaXRzKDMyKTtcbiAgICAgICAgICAgICAgICBjb25zdCBoaWdoSW50ID0gYml0YnVmLnJlYWRVQml0cyhoaWdoQml0cyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIExvbmcuZnJvbUJpdHMobG93SW50LCBoaWdoSW50LCBmYWxzZSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGJpdGJ1ZiA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgbmVnID0gYml0YnVmLnJlYWRPbmVCaXQoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBsb3dJbnQgPSBiaXRidWYucmVhZFVCaXRzKDMyKTtcbiAgICAgICAgICAgICAgICBjb25zdCBoaWdoSW50ID0gYml0YnVmLnJlYWRVQml0cyhoaWdoQml0cyAtIDEpO1xuICAgICAgICAgICAgICAgIHJldHVybiBMb25nLmZyb21CaXRzKGxvd0ludCwgaGlnaEludCwgIW5lZyk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfVxufVxuZnVuY3Rpb24gbWFrZVZhbHVlRGVjb2RlcihzZW5kUHJvcCkge1xuICAgIHN3aXRjaCAoc2VuZFByb3AudHlwZSkge1xuICAgICAgICBjYXNlIDAgLyogUHJvcFR5cGUuSW50ICovOlxuICAgICAgICAgICAgcmV0dXJuIG1ha2VJbnREZWNvZGVyKHNlbmRQcm9wKTtcbiAgICAgICAgY2FzZSAxIC8qIFByb3BUeXBlLkZsb2F0ICovOlxuICAgICAgICAgICAgcmV0dXJuIG1ha2VGbG9hdERlY29kZXIoc2VuZFByb3ApO1xuICAgICAgICBjYXNlIDIgLyogUHJvcFR5cGUuVmVjdG9yICovOlxuICAgICAgICAgICAgcmV0dXJuIG1ha2VWZWN0b3JEZWNvZGVyKHNlbmRQcm9wKTtcbiAgICAgICAgY2FzZSAzIC8qIFByb3BUeXBlLlZlY3RvclhZICovOlxuICAgICAgICAgICAgcmV0dXJuIG1ha2VWZWN0b3JYWURlY29kZXIoc2VuZFByb3ApO1xuICAgICAgICBjYXNlIDQgLyogUHJvcFR5cGUuU3RyaW5nICovOlxuICAgICAgICAgICAgcmV0dXJuIG1ha2VTdHJpbmdEZWNvZGVyKHNlbmRQcm9wKTtcbiAgICAgICAgY2FzZSA3IC8qIFByb3BUeXBlLkludDY0ICovOlxuICAgICAgICAgICAgcmV0dXJuIG1ha2VJbnQ2NERlY29kZXIoc2VuZFByb3ApO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCBzZW5kIHByb3AgdHlwZSAke3NlbmRQcm9wLnR5cGV9YCk7XG4gICAgfVxufVxuZnVuY3Rpb24gbWFrZUFycmF5RGVjb2RlcihzZW5kUHJvcCwgYXJyYXlFbGVtZW50UHJvcCkge1xuICAgIGNvbnN0IG1heEVsZW1lbnRzID0gc2VuZFByb3AubnVtRWxlbWVudHM7XG4gICAgY29uc3QgbnVtQml0cyA9IChNYXRoLmxvZzIobWF4RWxlbWVudHMpIHwgMCkgKyAxO1xuICAgIGNvbnN0IGVsZW1lbnREZWNvZGVyID0gbWFrZVZhbHVlRGVjb2RlcihhcnJheUVsZW1lbnRQcm9wKTtcbiAgICByZXR1cm4gYml0YnVmID0+IHtcbiAgICAgICAgY29uc3QgbnVtRWxlbWVudHMgPSBiaXRidWYucmVhZFVCaXRzKG51bUJpdHMpO1xuICAgICAgICBjb25zdCBhcnJheSA9IG5ldyBBcnJheShudW1FbGVtZW50cyk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtRWxlbWVudHM7ICsraSkge1xuICAgICAgICAgICAgYXJyYXlbaV0gPSBlbGVtZW50RGVjb2RlcihiaXRidWYpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhcnJheTtcbiAgICB9O1xufVxuZnVuY3Rpb24gbWFrZURlY29kZXIoc2VuZFByb3AsIGFycmF5RWxlbWVudFByb3ApIHtcbiAgICBjb25zdCB0eXBlID0gc2VuZFByb3AudHlwZTtcbiAgICBhc3NlcnQodHlwZSAhPT0gNiAvKiBQcm9wVHlwZS5EYXRhVGFibGUgKi8pO1xuICAgIGlmICh0eXBlID09PSA1IC8qIFByb3BUeXBlLkFycmF5ICovKSB7XG4gICAgICAgIHJldHVybiBtYWtlQXJyYXlEZWNvZGVyKHNlbmRQcm9wLCAoMCwgYXNzZXJ0X2V4aXN0c18xLmRlZmF1bHQpKGFycmF5RWxlbWVudFByb3AsIFwiYXJyYXkgcHJvcCB3aXRoIG5vIGVsZW1lbnQgcHJvcFwiKSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4gbWFrZVZhbHVlRGVjb2RlcihzZW5kUHJvcCk7XG4gICAgfVxufVxuZXhwb3J0cy5tYWtlRGVjb2RlciA9IG1ha2VEZWNvZGVyO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cHJvcHMuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLkNNc2dHQ0NTdHJpa2UxNVYyTWF0Y2htYWtpbmdTZXJ2ZXJSb3VuZFN0YXRzX0Ryb3BJbmZvID0gZXhwb3J0cy5DTXNnR0NDU3RyaWtlMTVWMk1hdGNobWFraW5nU2VydmVyUm91bmRTdGF0cyA9IGV4cG9ydHMuQ01zZ0dDQ1N0cmlrZTE1VjJNYXRjaG1ha2luZ0dDMkNsaWVudFJlc2VydmUgPSBleHBvcnRzLkNNc2dHQ0NTdHJpa2UxNVYyTWF0Y2htYWtpbmdTZXJ2ZXJSZXNlcnZhdGlvblJlc3BvbnNlID0gZXhwb3J0cy5DTXNnR0NDU3RyaWtlMTVWMk1hdGNobWFraW5nR0MyU2VydmVyUmVzZXJ2ZSA9IGV4cG9ydHMuQ1ByZU1hdGNoSW5mb0RhdGFfVGVhbVN0YXRzID0gZXhwb3J0cy5DUHJlTWF0Y2hJbmZvRGF0YSA9IGV4cG9ydHMuQ0RhdGFHQ0NTdHJpa2UxNVYyVG91cm5hbWVudE1hdGNoRHJhZnRfRW50cnkgPSBleHBvcnRzLkNEYXRhR0NDU3RyaWtlMTVWMlRvdXJuYW1lbnRNYXRjaERyYWZ0ID0gZXhwb3J0cy5DTXNnR0NDU3RyaWtlMTVWMk1hdGNobWFraW5nR0MyQ2xpZW50VXBkYXRlX05vdGUgPSBleHBvcnRzLkNNc2dHQ0NTdHJpa2UxNVYyTWF0Y2htYWtpbmdHQzJDbGllbnRVcGRhdGUgPSBleHBvcnRzLkNNc2dHQ0NTdHJpa2UxNVYyTWF0Y2htYWtpbmdDbGllbnQyU2VydmVyUGluZyA9IGV4cG9ydHMuQ01zZ0dDQ1N0cmlrZTE1VjJNYXRjaG1ha2luZ1N0b3AgPSBleHBvcnRzLkNNc2dHQ0NTdHJpa2UxNVYyTWF0Y2htYWtpbmdTdGFydCA9IGV4cG9ydHMuQ01zZ0dDQ1N0cmlrZTE1VjJHQzJTZXJ2ZXJSZXNlcnZhdGlvblVwZGF0ZSA9IGV4cG9ydHMuQ01zZ0dDQ1N0cmlrZTE1VjJNYXRjaG1ha2luZ0dDMlNlcnZlckNvbmZpcm0gPSBleHBvcnRzLkNNc2dHQ0NTdHJpa2UxNVYyTWF0Y2htYWtpbmdHQ09wZXJhdGlvbmFsU3RhdHMgPSBleHBvcnRzLkNNc2dHQ1NlcnZlclF1ZXN0VXBkYXRlRGF0YSA9IGV4cG9ydHMuRGVlcFBsYXllck1hdGNoRXZlbnQgPSBleHBvcnRzLkRlZXBQbGF5ZXJTdGF0c0VudHJ5ID0gZXhwb3J0cy5QbGF5ZXJRdWVzdERhdGFfUXVlc3RJdGVtRGF0YSA9IGV4cG9ydHMuUGxheWVyUXVlc3REYXRhID0gZXhwb3J0cy5TY29yZUxlYWRlcmJvYXJkRGF0YV9BY2NvdW50RW50cmllcyA9IGV4cG9ydHMuU2NvcmVMZWFkZXJib2FyZERhdGFfRW50cnkgPSBleHBvcnRzLlNjb3JlTGVhZGVyYm9hcmREYXRhID0gZXhwb3J0cy5NYXRjaEVuZEl0ZW1VcGRhdGVzID0gZXhwb3J0cy5YcFByb2dyZXNzRGF0YSA9IGV4cG9ydHMuQ01zZ0NzZ29TdGVhbVVzZXJTdGF0Q2hhbmdlID0gZXhwb3J0cy5JcEFkZHJlc3NNYXNrID0gZXhwb3J0cy5TZXJ2ZXJIbHR2SW5mbyA9IGV4cG9ydHMuVG91cm5hbWVudE1hdGNoU2V0dXAgPSBleHBvcnRzLkFjY291bnRBY3Rpdml0eSA9IGV4cG9ydHMuUGxheWVyTWVkYWxzSW5mbyA9IGV4cG9ydHMuUGxheWVyQ29tbWVuZGF0aW9uSW5mbyA9IGV4cG9ydHMuUGxheWVyUmFua2luZ0luZm8gPSBleHBvcnRzLk9wZXJhdGlvbmFsU3RhdGlzdGljc1BhY2tldCA9IGV4cG9ydHMuT3BlcmF0aW9uYWxTdGF0aXN0aWNFbGVtZW50ID0gZXhwb3J0cy5PcGVyYXRpb25hbFN0YXRpc3RpY0Rlc2NyaXB0aW9uID0gZXhwb3J0cy5HbG9iYWxTdGF0aXN0aWNzID0gZXhwb3J0cy5Ub3VybmFtZW50RXZlbnQgPSBleHBvcnRzLlRvdXJuYW1lbnRUZWFtID0gZXhwb3J0cy5Ub3VybmFtZW50UGxheWVyID0gZXhwb3J0cy5EZXRhaWxlZFNlYXJjaFN0YXRpc3RpYyA9IGV4cG9ydHMuRGF0YUNlbnRlclBpbmcgPSBleHBvcnRzLkdhbWVTZXJ2ZXJQaW5nID0gZXhwb3J0cy5FSW5pdFN5c3RlbVJlc3VsdCA9IGV4cG9ydHMuRUNsaWVudFJlcG9ydGluZ1ZlcnNpb24gPSBleHBvcnRzLkVDc2dvU3RlYW1Vc2VyU3RhdCA9IGV4cG9ydHMuRUNzZ29HQ01zZyA9IGV4cG9ydHMucHJvdG9idWZQYWNrYWdlID0gdm9pZCAwO1xuZXhwb3J0cy5DTXNnR0NDU3RyaWtlMTVWMk1hdGNoTGlzdCA9IGV4cG9ydHMuQ0RhdGFHQ0NTdHJpa2UxNVYyVG91cm5hbWVudEluZm8gPSBleHBvcnRzLkNEYXRhR0NDU3RyaWtlMTVWMlRvdXJuYW1lbnRTZWN0aW9uID0gZXhwb3J0cy5DRGF0YUdDQ1N0cmlrZTE1VjJUb3VybmFtZW50R3JvdXBfUGlja3MgPSBleHBvcnRzLkNEYXRhR0NDU3RyaWtlMTVWMlRvdXJuYW1lbnRHcm91cCA9IGV4cG9ydHMuQ0RhdGFHQ0NTdHJpa2UxNVYyVG91cm5hbWVudEdyb3VwVGVhbSA9IGV4cG9ydHMuQ0RhdGFHQ0NTdHJpa2UxNVYyTWF0Y2hJbmZvID0gZXhwb3J0cy5DTXNnR0NDU3RyaWtlMTVWMk1hdGNoTGlzdFJlcXVlc3RGdWxsR2FtZUluZm8gPSBleHBvcnRzLkNNc2dHQ0NTdHJpa2UxNVYyTWF0Y2hMaXN0UmVxdWVzdFRvdXJuYW1lbnRHYW1lcyA9IGV4cG9ydHMuQ01zZ0dDQ1N0cmlrZTE1VjJNYXRjaExpc3RSZXF1ZXN0UmVjZW50VXNlckdhbWVzID0gZXhwb3J0cy5DTXNnR0NDU3RyaWtlMTVWMk1hdGNoTGlzdFJlcXVlc3RMaXZlR2FtZUZvclVzZXIgPSBleHBvcnRzLkNNc2dHQ0NTdHJpa2UxNVYyTWF0Y2hMaXN0UmVxdWVzdEN1cnJlbnRMaXZlR2FtZXMgPSBleHBvcnRzLkNNc2dHQ0NTdHJpa2UxNVYyQ2xpZW50MkdDRWNvblByZXZpZXdEYXRhQmxvY2tSZXNwb25zZSA9IGV4cG9ydHMuQ01zZ0dDQ1N0cmlrZTE1VjJDbGllbnQyR0NFY29uUHJldmlld0RhdGFCbG9ja1JlcXVlc3QgPSBleHBvcnRzLkNNc2dJdGVtQWNrbm93bGVkZ2VkID0gZXhwb3J0cy5DTXNnR0NDU3RyaWtlMTVWMk1hdGNoRW5kUmV3YXJkRHJvcHNOb3RpZmljYXRpb24gPSBleHBvcnRzLkNFY29uSXRlbVByZXZpZXdEYXRhQmxvY2tfU3RpY2tlciA9IGV4cG9ydHMuQ0Vjb25JdGVtUHJldmlld0RhdGFCbG9jayA9IGV4cG9ydHMuQ01zZ0dDQ1N0cmlrZTE1VjJNYXRjaEVuZFJ1blJld2FyZERyb3BzID0gZXhwb3J0cy5DTXNnR0NDU3RyaWtlMTVWMkNsaWVudDJHQ1RleHRNc2cgPSBleHBvcnRzLkNNc2dHQ0NTdHJpa2UxNVYyR0MyQ2xpZW50VGV4dE1zZyA9IGV4cG9ydHMuQ0NsaWVudEhlYWRlck92ZXJ3YXRjaEV2aWRlbmNlID0gZXhwb3J0cy5DTXNnR0NDU3RyaWtlMTVWMlBsYXllck92ZXJ3YXRjaENhc2VTdGF0dXMgPSBleHBvcnRzLkNNc2dHQ0NTdHJpa2UxNVYyUGxheWVyT3ZlcndhdGNoQ2FzZUFzc2lnbm1lbnQgPSBleHBvcnRzLkNNc2dHQ0NTdHJpa2UxNVYyUGxheWVyT3ZlcndhdGNoQ2FzZVVwZGF0ZSA9IGV4cG9ydHMuQ01zZ0dDQ1N0cmlrZTE1VjJQbGF5ZXJzUHJvZmlsZSA9IGV4cG9ydHMuQ01zZ0dDQ1N0cmlrZTE1VjJDbGllbnRSZXF1ZXN0UGxheWVyc1Byb2ZpbGUgPSBleHBvcnRzLkNNc2dHQ0NTdHJpa2UxNVYyV2F0Y2hJbmZvVXNlcnMgPSBleHBvcnRzLkNNc2dHQ0NTdHJpa2UxNUNsaWVudERlZXBTdGF0c19EZWVwU3RhdHNNYXRjaCA9IGV4cG9ydHMuQ01zZ0dDQ1N0cmlrZTE1Q2xpZW50RGVlcFN0YXRzX0RlZXBTdGF0c1JhbmdlID0gZXhwb3J0cy5DTXNnR0NDU3RyaWtlMTVDbGllbnREZWVwU3RhdHMgPSBleHBvcnRzLkNNc2dHQ0NzdHJpa2UxNVYyR0MyU2VydmVyTm90aWZ5WFBSZXdhcmRlZCA9IGV4cG9ydHMuQ01zZ0dDQ3N0cmlrZTE1VjJDbGllbnRSZWRlZW1NaXNzaW9uUmV3YXJkID0gZXhwb3J0cy5DTXNnR0NDc3RyaWtlMTVWMkNsaWVudFJlcXVlc3ROZXdNaXNzaW9uID0gZXhwb3J0cy5DTXNnR0NDU3RyaWtlMTVWMkNsaWVudFJlcXVlc3RKb2luU2VydmVyRGF0YSA9IGV4cG9ydHMuQ01zZ0dDQ1N0cmlrZTE1VjJDbGllbnRSZXF1ZXN0Sm9pbkZyaWVuZERhdGEgPSBleHBvcnRzLldhdGNoYWJsZU1hdGNoSW5mbyA9IGV4cG9ydHMuQ01zZ0dDQ1N0cmlrZTE1VjJDbGllbnRSZXF1ZXN0V2F0Y2hJbmZvRnJpZW5kcyA9IGV4cG9ydHMuQ01zZ0dDQ1N0cmlrZTE1VjJDbGllbnRSZXBvcnRSZXNwb25zZSA9IGV4cG9ydHMuQ01zZ0dDQ1N0cmlrZTE1VjJDbGllbnRSZXBvcnRTZXJ2ZXIgPSBleHBvcnRzLkNNc2dHQ0NTdHJpa2UxNVYyQ2xpZW50Q29tbWVuZFBsYXllciA9IGV4cG9ydHMuQ01zZ0dDQ1N0cmlrZTE1VjJDbGllbnRSZXBvcnRQbGF5ZXIgPSBleHBvcnRzLkNNc2dHQ0NTdHJpa2UxNVYyU2VydmVyTm90aWZpY2F0aW9uRm9yVXNlclBlbmFsdHkgPSBleHBvcnRzLkNNc2dHQ0NTdHJpa2UxNVYyTWF0Y2htYWtpbmdPcGVyYXRvcjJHQ0Jsb2dVcGRhdGUgPSBleHBvcnRzLkNNc2dHQ0NTdHJpa2UxNVYyQ2xpZW50R0NSYW5rVXBkYXRlID0gZXhwb3J0cy5DTXNnR0NDU3RyaWtlMTVWMk1hdGNobWFraW5nR0MyQ2xpZW50QWJhbmRvbiA9IGV4cG9ydHMuQ01zZ0dDQ1N0cmlrZTE1VjJBY2NvdW50UHJpdmFjeVNldHRpbmdzX1NldHRpbmcgPSBleHBvcnRzLkNNc2dHQ0NTdHJpa2UxNVYyQWNjb3VudFByaXZhY3lTZXR0aW5ncyA9IGV4cG9ydHMuQ01zZ0dDQ1N0cmlrZTE1VjJNYXRjaG1ha2luZ0dDMkNsaWVudEhlbGxvID0gZXhwb3J0cy5DTXNnR0NDU3RyaWtlMTVWMk1hdGNobWFraW5nQ2xpZW50MkdDSGVsbG8gPSB2b2lkIDA7XG5leHBvcnRzLkNNc2dHQ0NTdHJpa2UxNVYyQ2xpZW50UGFydHlXYXJuaW5nID0gZXhwb3J0cy5DTXNnR0NDU3RyaWtlMTVWMkNsaWVudFBhcnR5Sm9pblJlbGF5ID0gZXhwb3J0cy5DTXNnR0NDU3RyaWtlMTVWMkNsaWVudEFjY291bnRCYWxhbmNlID0gZXhwb3J0cy5DTXNnR0NDU3RyaWtlMTVWMkNsaWVudFJlcXVlc3RTb3V2ZW5pciA9IGV4cG9ydHMuQ01zZ0dDQ1N0cmlrZTE1VjJDbGllbnRSZXF1ZXN0T2ZmZXJzID0gZXhwb3J0cy5DTXNnR0NUb0NsaWVudFN0ZWFtRGF0YWdyYW1UaWNrZXQgPSBleHBvcnRzLkNNc2dHQ0NTdHJpa2UxNVYyQ2xpZW50VG9HQ1JlcXVlc3RUaWNrZXQgPSBleHBvcnRzLkNNc2dHQ0NTdHJpa2UxNVYyQWNjb3VudFJlcXVlc3RDb1BsYXlzX1BsYXllciA9IGV4cG9ydHMuQ01zZ0dDQ1N0cmlrZTE1VjJBY2NvdW50UmVxdWVzdENvUGxheXMgPSBleHBvcnRzLkNNc2dHQ0NTdHJpa2UxNVYyUGFydHlJbnZpdGUgPSBleHBvcnRzLkNNc2dHQ0NTdHJpa2UxNVYyUGFydHlTZWFyY2hSZXN1bHRzX0VudHJ5ID0gZXhwb3J0cy5DTXNnR0NDU3RyaWtlMTVWMlBhcnR5U2VhcmNoUmVzdWx0cyA9IGV4cG9ydHMuQ01zZ0dDQ1N0cmlrZTE1VjJQYXJ0eVNlYXJjaCA9IGV4cG9ydHMuQ01zZ0dDQ1N0cmlrZTE1VjJQYXJ0eVJlZ2lzdGVyID0gZXhwb3J0cy5DTXNnR0NDU3RyaWtlMTVWMkNsaWVudFBvbGxTdGF0ZSA9IGV4cG9ydHMuQ01zZ0dDQ1N0cmlrZTE1VjJDbGllbnRMb2dvbkZhdGFsRXJyb3IgPSBleHBvcnRzLkNNc2dHQ0NTdHJpa2UxNVYyQ2xpZW50UGxheWVyRGVjYWxTaWduID0gZXhwb3J0cy5QbGF5ZXJEZWNhbERpZ2l0YWxTaWduYXR1cmUgPSBleHBvcnRzLkNNc2dHQ0NTdHJpa2UxNUdvdHZTeW5jUGFja2V0ID0gZXhwb3J0cy5DTXNnR0NDU3RyaWtlMTVWMkNsaWVudEF1dGhLZXlDb2RlID0gZXhwb3J0cy5DTXNnR0NDU3RyaWtlMTVWMkdDVG9DbGllbnRDaGF0ID0gZXhwb3J0cy5DTXNnR0NDU3RyaWtlMTVWMkNsaWVudFRvR0NDaGF0ID0gZXhwb3J0cy5DTXNnR0NDU3RyaWtlMTVWMkNsaWVudFRvR0NSZXF1ZXN0RWxldmF0ZSA9IGV4cG9ydHMuQ01zZ0dDQ1N0cmlrZTE1VjJDbGllbnQyR0NTdHJlYW1VbmxvY2sgPSBleHBvcnRzLkNNc2dHQ0NTdHJpa2UxNVYyQ2xpZW50MkdDUmVxdWVzdFByZXN0aWdlQ29pbiA9IGV4cG9ydHMuQ01zZ0dDQ1N0cmlrZTE1VjJBY2tub3dsZWRnZVBlbmFsdHkgPSBleHBvcnRzLkNNc2dHQ0dsb2JhbEdhbWVQbGF5ID0gZXhwb3J0cy5DTXNnR0NHbG9iYWxHYW1lVW5zdWJzY3JpYmUgPSBleHBvcnRzLkNNc2dHQ0dsb2JhbEdhbWVTdWJzY3JpYmUgPSBleHBvcnRzLkNTT1BlcnNvbmFEYXRhUHVibGljID0gZXhwb3J0cy5DU09BY2NvdW50UmVjdXJyaW5nU3Vic2NyaXB0aW9uID0gZXhwb3J0cy5DU09BY2NvdW50U2Vhc29uYWxPcGVyYXRpb24gPSBleHBvcnRzLkNTT1F1ZXN0UHJvZ3Jlc3MgPSBleHBvcnRzLkNTT0Vjb25Db3Vwb24gPSBleHBvcnRzLkNNc2dHQ0NTdHJpa2UxNVYyR0MyQ2xpZW50VG91cm5hbWVudEluZm8gPSBleHBvcnRzLkNNc2dHQ0NTdHJpa2UxNVYyU2VydmVyMkdDQ2xpZW50VmFsaWRhdGUgPSBleHBvcnRzLkNNc2dHQ0NTdHJpa2UxNVYyQ2xpZW50U3VibWl0U3VydmV5Vm90ZSA9IGV4cG9ydHMuQ01zZ0dDQ1N0cmlrZTE1VjJHaWZ0c0xlYWRlcmJvYXJkUmVzcG9uc2VfR2lmdExlYWRlcmJvYXJkRW50cnkgPSBleHBvcnRzLkNNc2dHQ0NTdHJpa2UxNVYyR2lmdHNMZWFkZXJib2FyZFJlc3BvbnNlID0gZXhwb3J0cy5DTXNnR0NDU3RyaWtlMTVWMkdpZnRzTGVhZGVyYm9hcmRSZXF1ZXN0ID0gZXhwb3J0cy5DTXNnR0NDU3RyaWtlMTVWMlNlcnZlclZhclZhbHVlTm90aWZpY2F0aW9uSW5mbyA9IGV4cG9ydHMuQ01zZ0dDQ1N0cmlrZTE1VjJDbGllbnRWYXJWYWx1ZU5vdGlmaWNhdGlvbkluZm8gPSBleHBvcnRzLkNNc2dDU3RyaWtlMTVXZWxjb21lID0gZXhwb3J0cy5DQXR0cmlidXRlU3RyaW5nID0gZXhwb3J0cy5DTXNnR0NDU3RyaWtlMTVWMkZhbnRhc3lfRmFudGFzeVRlYW0gPSBleHBvcnRzLkNNc2dHQ0NTdHJpa2UxNVYyRmFudGFzeV9GYW50YXN5U2xvdCA9IGV4cG9ydHMuQ01zZ0dDQ1N0cmlrZTE1VjJGYW50YXN5ID0gZXhwb3J0cy5DTXNnR0NDU3RyaWtlMTVWMlByZWRpY3Rpb25zX0dyb3VwTWF0Y2hUZWFtUGljayA9IGV4cG9ydHMuQ01zZ0dDQ1N0cmlrZTE1VjJQcmVkaWN0aW9ucyA9IGV4cG9ydHMuQ01zZ0dDQ1N0cmlrZTE1VjJNYXRjaExpc3RUb3VybmFtZW50T3BlcmF0b3JNZ210ID0gdm9pZCAwO1xuZXhwb3J0cy5DTXNnR0NDU3RyaWtlMTVWMkdDMkNsaWVudEluaXRTeXN0ZW1SZXNwb25zZSA9IGV4cG9ydHMuQ01zZ0dDQ1N0cmlrZTE1VjJHQzJDbGllbnRJbml0U3lzdGVtID0gZXhwb3J0cy5DTXNnR0NDU3RyaWtlMTVWMkdDMkNsaWVudFJlcXVlc3RWYWxpZGF0aW9uID0gZXhwb3J0cy5DTXNnR0NDU3RyaWtlMTVWMkdDMkNsaWVudFJlZnVzZVNlY3VyZU1vZGUgPSBleHBvcnRzLkNNc2dHQ0NTdHJpa2UxNVYyQ2xpZW50UmVwb3J0VmFsaWRhdGlvbiA9IGV4cG9ydHMuQ1ZEaWFnbm9zdGljID0gZXhwb3J0cy5DTXNnR0NDU3RyaWtlMTVWMkNsaWVudFBlcmZSZXBvcnRfRW50cnkgPSBleHBvcnRzLkNNc2dHQ0NTdHJpa2UxNVYyQ2xpZW50UGVyZlJlcG9ydCA9IGV4cG9ydHMuQ01zZ0dDQ1N0cmlrZTE1VjJHZXRFdmVudEZhdm9yaXRlc1Jlc3BvbnNlID0gZXhwb3J0cy5DTXNnR0NDU3RyaWtlMTVWMkdldEV2ZW50RmF2b3JpdGVzUmVxdWVzdCA9IGV4cG9ydHMuQ01zZ0dDQ1N0cmlrZTE1VjJTZXRFdmVudEZhdm9yaXRlID0gZXhwb3J0cy5DTXNnR0NDU3RyaWtlMTVWMkNsaWVudFBhcnR5V2FybmluZ19FbnRyeSA9IHZvaWQgMDtcbi8qIGVzbGludC1kaXNhYmxlICovXG5jb25zdCBtaW5pbWFsXzEgPSByZXF1aXJlKFwicHJvdG9idWZqcy9taW5pbWFsXCIpO1xuY29uc3QgTG9uZyA9IHJlcXVpcmUoXCJsb25nXCIpO1xuY29uc3QgZW5naW5lX2djbWVzc2FnZXNfMSA9IHJlcXVpcmUoXCIuL2VuZ2luZV9nY21lc3NhZ2VzXCIpO1xuZXhwb3J0cy5wcm90b2J1ZlBhY2thZ2UgPSBcIlwiO1xudmFyIEVDc2dvR0NNc2c7XG4oZnVuY3Rpb24gKEVDc2dvR0NNc2cpIHtcbiAgICBFQ3Nnb0dDTXNnW0VDc2dvR0NNc2dbXCJrX0VNc2dHQ0NTdHJpa2UxNV92Ml9CYXNlXCJdID0gOTEwMF0gPSBcImtfRU1zZ0dDQ1N0cmlrZTE1X3YyX0Jhc2VcIjtcbiAgICBFQ3Nnb0dDTXNnW0VDc2dvR0NNc2dbXCJrX0VNc2dHQ0NTdHJpa2UxNV92Ml9NYXRjaG1ha2luZ1N0YXJ0XCJdID0gOTEwMV0gPSBcImtfRU1zZ0dDQ1N0cmlrZTE1X3YyX01hdGNobWFraW5nU3RhcnRcIjtcbiAgICBFQ3Nnb0dDTXNnW0VDc2dvR0NNc2dbXCJrX0VNc2dHQ0NTdHJpa2UxNV92Ml9NYXRjaG1ha2luZ1N0b3BcIl0gPSA5MTAyXSA9IFwia19FTXNnR0NDU3RyaWtlMTVfdjJfTWF0Y2htYWtpbmdTdG9wXCI7XG4gICAgRUNzZ29HQ01zZ1tFQ3Nnb0dDTXNnW1wia19FTXNnR0NDU3RyaWtlMTVfdjJfTWF0Y2htYWtpbmdDbGllbnQyU2VydmVyUGluZ1wiXSA9IDkxMDNdID0gXCJrX0VNc2dHQ0NTdHJpa2UxNV92Ml9NYXRjaG1ha2luZ0NsaWVudDJTZXJ2ZXJQaW5nXCI7XG4gICAgRUNzZ29HQ01zZ1tFQ3Nnb0dDTXNnW1wia19FTXNnR0NDU3RyaWtlMTVfdjJfTWF0Y2htYWtpbmdHQzJDbGllbnRVcGRhdGVcIl0gPSA5MTA0XSA9IFwia19FTXNnR0NDU3RyaWtlMTVfdjJfTWF0Y2htYWtpbmdHQzJDbGllbnRVcGRhdGVcIjtcbiAgICBFQ3Nnb0dDTXNnW0VDc2dvR0NNc2dbXCJrX0VNc2dHQ0NTdHJpa2UxNV92Ml9NYXRjaG1ha2luZ1NlcnZlclJlc2VydmF0aW9uUmVzcG9uc2VcIl0gPSA5MTA2XSA9IFwia19FTXNnR0NDU3RyaWtlMTVfdjJfTWF0Y2htYWtpbmdTZXJ2ZXJSZXNlcnZhdGlvblJlc3BvbnNlXCI7XG4gICAgRUNzZ29HQ01zZ1tFQ3Nnb0dDTXNnW1wia19FTXNnR0NDU3RyaWtlMTVfdjJfTWF0Y2htYWtpbmdHQzJDbGllbnRSZXNlcnZlXCJdID0gOTEwN10gPSBcImtfRU1zZ0dDQ1N0cmlrZTE1X3YyX01hdGNobWFraW5nR0MyQ2xpZW50UmVzZXJ2ZVwiO1xuICAgIEVDc2dvR0NNc2dbRUNzZ29HQ01zZ1tcImtfRU1zZ0dDQ1N0cmlrZTE1X3YyX01hdGNobWFraW5nQ2xpZW50MkdDSGVsbG9cIl0gPSA5MTA5XSA9IFwia19FTXNnR0NDU3RyaWtlMTVfdjJfTWF0Y2htYWtpbmdDbGllbnQyR0NIZWxsb1wiO1xuICAgIEVDc2dvR0NNc2dbRUNzZ29HQ01zZ1tcImtfRU1zZ0dDQ1N0cmlrZTE1X3YyX01hdGNobWFraW5nR0MyQ2xpZW50SGVsbG9cIl0gPSA5MTEwXSA9IFwia19FTXNnR0NDU3RyaWtlMTVfdjJfTWF0Y2htYWtpbmdHQzJDbGllbnRIZWxsb1wiO1xuICAgIEVDc2dvR0NNc2dbRUNzZ29HQ01zZ1tcImtfRU1zZ0dDQ1N0cmlrZTE1X3YyX01hdGNobWFraW5nR0MyQ2xpZW50QWJhbmRvblwiXSA9IDkxMTJdID0gXCJrX0VNc2dHQ0NTdHJpa2UxNV92Ml9NYXRjaG1ha2luZ0dDMkNsaWVudEFiYW5kb25cIjtcbiAgICBFQ3Nnb0dDTXNnW0VDc2dvR0NNc2dbXCJrX0VNc2dHQ0NTdHJpa2UxNV92Ml9NYXRjaG1ha2luZ0dDT3BlcmF0aW9uYWxTdGF0c1wiXSA9IDkxMTVdID0gXCJrX0VNc2dHQ0NTdHJpa2UxNV92Ml9NYXRjaG1ha2luZ0dDT3BlcmF0aW9uYWxTdGF0c1wiO1xuICAgIEVDc2dvR0NNc2dbRUNzZ29HQ01zZ1tcImtfRU1zZ0dDQ1N0cmlrZTE1X3YyX01hdGNobWFraW5nT3BlcmF0b3IyR0NCbG9nVXBkYXRlXCJdID0gOTExN10gPSBcImtfRU1zZ0dDQ1N0cmlrZTE1X3YyX01hdGNobWFraW5nT3BlcmF0b3IyR0NCbG9nVXBkYXRlXCI7XG4gICAgRUNzZ29HQ01zZ1tFQ3Nnb0dDTXNnW1wia19FTXNnR0NDU3RyaWtlMTVfdjJfU2VydmVyTm90aWZpY2F0aW9uRm9yVXNlclBlbmFsdHlcIl0gPSA5MTE4XSA9IFwia19FTXNnR0NDU3RyaWtlMTVfdjJfU2VydmVyTm90aWZpY2F0aW9uRm9yVXNlclBlbmFsdHlcIjtcbiAgICBFQ3Nnb0dDTXNnW0VDc2dvR0NNc2dbXCJrX0VNc2dHQ0NTdHJpa2UxNV92Ml9DbGllbnRSZXBvcnRQbGF5ZXJcIl0gPSA5MTE5XSA9IFwia19FTXNnR0NDU3RyaWtlMTVfdjJfQ2xpZW50UmVwb3J0UGxheWVyXCI7XG4gICAgRUNzZ29HQ01zZ1tFQ3Nnb0dDTXNnW1wia19FTXNnR0NDU3RyaWtlMTVfdjJfQ2xpZW50UmVwb3J0U2VydmVyXCJdID0gOTEyMF0gPSBcImtfRU1zZ0dDQ1N0cmlrZTE1X3YyX0NsaWVudFJlcG9ydFNlcnZlclwiO1xuICAgIEVDc2dvR0NNc2dbRUNzZ29HQ01zZ1tcImtfRU1zZ0dDQ1N0cmlrZTE1X3YyX0NsaWVudENvbW1lbmRQbGF5ZXJcIl0gPSA5MTIxXSA9IFwia19FTXNnR0NDU3RyaWtlMTVfdjJfQ2xpZW50Q29tbWVuZFBsYXllclwiO1xuICAgIEVDc2dvR0NNc2dbRUNzZ29HQ01zZ1tcImtfRU1zZ0dDQ1N0cmlrZTE1X3YyX0NsaWVudFJlcG9ydFJlc3BvbnNlXCJdID0gOTEyMl0gPSBcImtfRU1zZ0dDQ1N0cmlrZTE1X3YyX0NsaWVudFJlcG9ydFJlc3BvbnNlXCI7XG4gICAgRUNzZ29HQ01zZ1tFQ3Nnb0dDTXNnW1wia19FTXNnR0NDU3RyaWtlMTVfdjJfQ2xpZW50Q29tbWVuZFBsYXllclF1ZXJ5XCJdID0gOTEyM10gPSBcImtfRU1zZ0dDQ1N0cmlrZTE1X3YyX0NsaWVudENvbW1lbmRQbGF5ZXJRdWVyeVwiO1xuICAgIEVDc2dvR0NNc2dbRUNzZ29HQ01zZ1tcImtfRU1zZ0dDQ1N0cmlrZTE1X3YyX0NsaWVudENvbW1lbmRQbGF5ZXJRdWVyeVJlc3BvbnNlXCJdID0gOTEyNF0gPSBcImtfRU1zZ0dDQ1N0cmlrZTE1X3YyX0NsaWVudENvbW1lbmRQbGF5ZXJRdWVyeVJlc3BvbnNlXCI7XG4gICAgRUNzZ29HQ01zZ1tFQ3Nnb0dDTXNnW1wia19FTXNnR0NDU3RyaWtlMTVfdjJfV2F0Y2hJbmZvVXNlcnNcIl0gPSA5MTI2XSA9IFwia19FTXNnR0NDU3RyaWtlMTVfdjJfV2F0Y2hJbmZvVXNlcnNcIjtcbiAgICBFQ3Nnb0dDTXNnW0VDc2dvR0NNc2dbXCJrX0VNc2dHQ0NTdHJpa2UxNV92Ml9DbGllbnRSZXF1ZXN0UGxheWVyc1Byb2ZpbGVcIl0gPSA5MTI3XSA9IFwia19FTXNnR0NDU3RyaWtlMTVfdjJfQ2xpZW50UmVxdWVzdFBsYXllcnNQcm9maWxlXCI7XG4gICAgRUNzZ29HQ01zZ1tFQ3Nnb0dDTXNnW1wia19FTXNnR0NDU3RyaWtlMTVfdjJfUGxheWVyc1Byb2ZpbGVcIl0gPSA5MTI4XSA9IFwia19FTXNnR0NDU3RyaWtlMTVfdjJfUGxheWVyc1Byb2ZpbGVcIjtcbiAgICBFQ3Nnb0dDTXNnW0VDc2dvR0NNc2dbXCJrX0VNc2dHQ0NTdHJpa2UxNV92Ml9QbGF5ZXJPdmVyd2F0Y2hDYXNlVXBkYXRlXCJdID0gOTEzMV0gPSBcImtfRU1zZ0dDQ1N0cmlrZTE1X3YyX1BsYXllck92ZXJ3YXRjaENhc2VVcGRhdGVcIjtcbiAgICBFQ3Nnb0dDTXNnW0VDc2dvR0NNc2dbXCJrX0VNc2dHQ0NTdHJpa2UxNV92Ml9QbGF5ZXJPdmVyd2F0Y2hDYXNlQXNzaWdubWVudFwiXSA9IDkxMzJdID0gXCJrX0VNc2dHQ0NTdHJpa2UxNV92Ml9QbGF5ZXJPdmVyd2F0Y2hDYXNlQXNzaWdubWVudFwiO1xuICAgIEVDc2dvR0NNc2dbRUNzZ29HQ01zZ1tcImtfRU1zZ0dDQ1N0cmlrZTE1X3YyX1BsYXllck92ZXJ3YXRjaENhc2VTdGF0dXNcIl0gPSA5MTMzXSA9IFwia19FTXNnR0NDU3RyaWtlMTVfdjJfUGxheWVyT3ZlcndhdGNoQ2FzZVN0YXR1c1wiO1xuICAgIEVDc2dvR0NNc2dbRUNzZ29HQ01zZ1tcImtfRU1zZ0dDQ1N0cmlrZTE1X3YyX0dDMkNsaWVudFRleHRNc2dcIl0gPSA5MTM0XSA9IFwia19FTXNnR0NDU3RyaWtlMTVfdjJfR0MyQ2xpZW50VGV4dE1zZ1wiO1xuICAgIEVDc2dvR0NNc2dbRUNzZ29HQ01zZ1tcImtfRU1zZ0dDQ1N0cmlrZTE1X3YyX0NsaWVudDJHQ1RleHRNc2dcIl0gPSA5MTM1XSA9IFwia19FTXNnR0NDU3RyaWtlMTVfdjJfQ2xpZW50MkdDVGV4dE1zZ1wiO1xuICAgIEVDc2dvR0NNc2dbRUNzZ29HQ01zZ1tcImtfRU1zZ0dDQ1N0cmlrZTE1X3YyX01hdGNoRW5kUnVuUmV3YXJkRHJvcHNcIl0gPSA5MTM2XSA9IFwia19FTXNnR0NDU3RyaWtlMTVfdjJfTWF0Y2hFbmRSdW5SZXdhcmREcm9wc1wiO1xuICAgIEVDc2dvR0NNc2dbRUNzZ29HQ01zZ1tcImtfRU1zZ0dDQ1N0cmlrZTE1X3YyX01hdGNoRW5kUmV3YXJkRHJvcHNOb3RpZmljYXRpb25cIl0gPSA5MTM3XSA9IFwia19FTXNnR0NDU3RyaWtlMTVfdjJfTWF0Y2hFbmRSZXdhcmREcm9wc05vdGlmaWNhdGlvblwiO1xuICAgIEVDc2dvR0NNc2dbRUNzZ29HQ01zZ1tcImtfRU1zZ0dDQ1N0cmlrZTE1X3YyX0NsaWVudFJlcXVlc3RXYXRjaEluZm9GcmllbmRzMlwiXSA9IDkxMzhdID0gXCJrX0VNc2dHQ0NTdHJpa2UxNV92Ml9DbGllbnRSZXF1ZXN0V2F0Y2hJbmZvRnJpZW5kczJcIjtcbiAgICBFQ3Nnb0dDTXNnW0VDc2dvR0NNc2dbXCJrX0VNc2dHQ0NTdHJpa2UxNV92Ml9NYXRjaExpc3RcIl0gPSA5MTM5XSA9IFwia19FTXNnR0NDU3RyaWtlMTVfdjJfTWF0Y2hMaXN0XCI7XG4gICAgRUNzZ29HQ01zZ1tFQ3Nnb0dDTXNnW1wia19FTXNnR0NDU3RyaWtlMTVfdjJfTWF0Y2hMaXN0UmVxdWVzdEN1cnJlbnRMaXZlR2FtZXNcIl0gPSA5MTQwXSA9IFwia19FTXNnR0NDU3RyaWtlMTVfdjJfTWF0Y2hMaXN0UmVxdWVzdEN1cnJlbnRMaXZlR2FtZXNcIjtcbiAgICBFQ3Nnb0dDTXNnW0VDc2dvR0NNc2dbXCJrX0VNc2dHQ0NTdHJpa2UxNV92Ml9NYXRjaExpc3RSZXF1ZXN0UmVjZW50VXNlckdhbWVzXCJdID0gOTE0MV0gPSBcImtfRU1zZ0dDQ1N0cmlrZTE1X3YyX01hdGNoTGlzdFJlcXVlc3RSZWNlbnRVc2VyR2FtZXNcIjtcbiAgICBFQ3Nnb0dDTXNnW0VDc2dvR0NNc2dbXCJrX0VNc2dHQ0NTdHJpa2UxNV92Ml9HQzJTZXJ2ZXJSZXNlcnZhdGlvblVwZGF0ZVwiXSA9IDkxNDJdID0gXCJrX0VNc2dHQ0NTdHJpa2UxNV92Ml9HQzJTZXJ2ZXJSZXNlcnZhdGlvblVwZGF0ZVwiO1xuICAgIEVDc2dvR0NNc2dbRUNzZ29HQ01zZ1tcImtfRU1zZ0dDQ1N0cmlrZTE1X3YyX0NsaWVudFZhclZhbHVlTm90aWZpY2F0aW9uSW5mb1wiXSA9IDkxNDRdID0gXCJrX0VNc2dHQ0NTdHJpa2UxNV92Ml9DbGllbnRWYXJWYWx1ZU5vdGlmaWNhdGlvbkluZm9cIjtcbiAgICBFQ3Nnb0dDTXNnW0VDc2dvR0NNc2dbXCJrX0VNc2dHQ0NTdHJpa2UxNV92Ml9NYXRjaExpc3RSZXF1ZXN0VG91cm5hbWVudEdhbWVzXCJdID0gOTE0Nl0gPSBcImtfRU1zZ0dDQ1N0cmlrZTE1X3YyX01hdGNoTGlzdFJlcXVlc3RUb3VybmFtZW50R2FtZXNcIjtcbiAgICBFQ3Nnb0dDTXNnW0VDc2dvR0NNc2dbXCJrX0VNc2dHQ0NTdHJpa2UxNV92Ml9NYXRjaExpc3RSZXF1ZXN0RnVsbEdhbWVJbmZvXCJdID0gOTE0N10gPSBcImtfRU1zZ0dDQ1N0cmlrZTE1X3YyX01hdGNoTGlzdFJlcXVlc3RGdWxsR2FtZUluZm9cIjtcbiAgICBFQ3Nnb0dDTXNnW0VDc2dvR0NNc2dbXCJrX0VNc2dHQ0NTdHJpa2UxNV92Ml9HaWZ0c0xlYWRlcmJvYXJkUmVxdWVzdFwiXSA9IDkxNDhdID0gXCJrX0VNc2dHQ0NTdHJpa2UxNV92Ml9HaWZ0c0xlYWRlcmJvYXJkUmVxdWVzdFwiO1xuICAgIEVDc2dvR0NNc2dbRUNzZ29HQ01zZ1tcImtfRU1zZ0dDQ1N0cmlrZTE1X3YyX0dpZnRzTGVhZGVyYm9hcmRSZXNwb25zZVwiXSA9IDkxNDldID0gXCJrX0VNc2dHQ0NTdHJpa2UxNV92Ml9HaWZ0c0xlYWRlcmJvYXJkUmVzcG9uc2VcIjtcbiAgICBFQ3Nnb0dDTXNnW0VDc2dvR0NNc2dbXCJrX0VNc2dHQ0NTdHJpa2UxNV92Ml9TZXJ2ZXJWYXJWYWx1ZU5vdGlmaWNhdGlvbkluZm9cIl0gPSA5MTUwXSA9IFwia19FTXNnR0NDU3RyaWtlMTVfdjJfU2VydmVyVmFyVmFsdWVOb3RpZmljYXRpb25JbmZvXCI7XG4gICAgRUNzZ29HQ01zZ1tFQ3Nnb0dDTXNnW1wia19FTXNnR0NDU3RyaWtlMTVfdjJfQ2xpZW50U3VibWl0U3VydmV5Vm90ZVwiXSA9IDkxNTJdID0gXCJrX0VNc2dHQ0NTdHJpa2UxNV92Ml9DbGllbnRTdWJtaXRTdXJ2ZXlWb3RlXCI7XG4gICAgRUNzZ29HQ01zZ1tFQ3Nnb0dDTXNnW1wia19FTXNnR0NDU3RyaWtlMTVfdjJfU2VydmVyMkdDQ2xpZW50VmFsaWRhdGVcIl0gPSA5MTUzXSA9IFwia19FTXNnR0NDU3RyaWtlMTVfdjJfU2VydmVyMkdDQ2xpZW50VmFsaWRhdGVcIjtcbiAgICBFQ3Nnb0dDTXNnW0VDc2dvR0NNc2dbXCJrX0VNc2dHQ0NTdHJpa2UxNV92Ml9NYXRjaExpc3RSZXF1ZXN0TGl2ZUdhbWVGb3JVc2VyXCJdID0gOTE1NF0gPSBcImtfRU1zZ0dDQ1N0cmlrZTE1X3YyX01hdGNoTGlzdFJlcXVlc3RMaXZlR2FtZUZvclVzZXJcIjtcbiAgICBFQ3Nnb0dDTXNnW0VDc2dvR0NNc2dbXCJrX0VNc2dHQ0NTdHJpa2UxNV92Ml9DbGllbnQyR0NFY29uUHJldmlld0RhdGFCbG9ja1JlcXVlc3RcIl0gPSA5MTU2XSA9IFwia19FTXNnR0NDU3RyaWtlMTVfdjJfQ2xpZW50MkdDRWNvblByZXZpZXdEYXRhQmxvY2tSZXF1ZXN0XCI7XG4gICAgRUNzZ29HQ01zZ1tFQ3Nnb0dDTXNnW1wia19FTXNnR0NDU3RyaWtlMTVfdjJfQ2xpZW50MkdDRWNvblByZXZpZXdEYXRhQmxvY2tSZXNwb25zZVwiXSA9IDkxNTddID0gXCJrX0VNc2dHQ0NTdHJpa2UxNV92Ml9DbGllbnQyR0NFY29uUHJldmlld0RhdGFCbG9ja1Jlc3BvbnNlXCI7XG4gICAgRUNzZ29HQ01zZ1tFQ3Nnb0dDTXNnW1wia19FTXNnR0NDU3RyaWtlMTVfdjJfQWNjb3VudFByaXZhY3lTZXR0aW5nc1wiXSA9IDkxNThdID0gXCJrX0VNc2dHQ0NTdHJpa2UxNV92Ml9BY2NvdW50UHJpdmFjeVNldHRpbmdzXCI7XG4gICAgRUNzZ29HQ01zZ1tFQ3Nnb0dDTXNnW1wia19FTXNnR0NDU3RyaWtlMTVfdjJfU2V0TXlBY3Rpdml0eUluZm9cIl0gPSA5MTU5XSA9IFwia19FTXNnR0NDU3RyaWtlMTVfdjJfU2V0TXlBY3Rpdml0eUluZm9cIjtcbiAgICBFQ3Nnb0dDTXNnW0VDc2dvR0NNc2dbXCJrX0VNc2dHQ0NTdHJpa2UxNV92Ml9NYXRjaExpc3RSZXF1ZXN0VG91cm5hbWVudFByZWRpY3Rpb25zXCJdID0gOTE2MF0gPSBcImtfRU1zZ0dDQ1N0cmlrZTE1X3YyX01hdGNoTGlzdFJlcXVlc3RUb3VybmFtZW50UHJlZGljdGlvbnNcIjtcbiAgICBFQ3Nnb0dDTXNnW0VDc2dvR0NNc2dbXCJrX0VNc2dHQ0NTdHJpa2UxNV92Ml9NYXRjaExpc3RVcGxvYWRUb3VybmFtZW50UHJlZGljdGlvbnNcIl0gPSA5MTYxXSA9IFwia19FTXNnR0NDU3RyaWtlMTVfdjJfTWF0Y2hMaXN0VXBsb2FkVG91cm5hbWVudFByZWRpY3Rpb25zXCI7XG4gICAgRUNzZ29HQ01zZ1tFQ3Nnb0dDTXNnW1wia19FTXNnR0NDU3RyaWtlMTVfdjJfRHJhZnRTdW1tYXJ5XCJdID0gOTE2Ml0gPSBcImtfRU1zZ0dDQ1N0cmlrZTE1X3YyX0RyYWZ0U3VtbWFyeVwiO1xuICAgIEVDc2dvR0NNc2dbRUNzZ29HQ01zZ1tcImtfRU1zZ0dDQ1N0cmlrZTE1X3YyX0NsaWVudFJlcXVlc3RKb2luRnJpZW5kRGF0YVwiXSA9IDkxNjNdID0gXCJrX0VNc2dHQ0NTdHJpa2UxNV92Ml9DbGllbnRSZXF1ZXN0Sm9pbkZyaWVuZERhdGFcIjtcbiAgICBFQ3Nnb0dDTXNnW0VDc2dvR0NNc2dbXCJrX0VNc2dHQ0NTdHJpa2UxNV92Ml9DbGllbnRSZXF1ZXN0Sm9pblNlcnZlckRhdGFcIl0gPSA5MTY0XSA9IFwia19FTXNnR0NDU3RyaWtlMTVfdjJfQ2xpZW50UmVxdWVzdEpvaW5TZXJ2ZXJEYXRhXCI7XG4gICAgRUNzZ29HQ01zZ1tFQ3Nnb0dDTXNnW1wia19FTXNnR0NDU3RyaWtlMTVfdjJfQ2xpZW50UmVxdWVzdE5ld01pc3Npb25cIl0gPSA5MTY1XSA9IFwia19FTXNnR0NDU3RyaWtlMTVfdjJfQ2xpZW50UmVxdWVzdE5ld01pc3Npb25cIjtcbiAgICBFQ3Nnb0dDTXNnW0VDc2dvR0NNc2dbXCJrX0VNc2dHQ0NTdHJpa2UxNV92Ml9HQzJDbGllbnRUb3VybmFtZW50SW5mb1wiXSA9IDkxNjddID0gXCJrX0VNc2dHQ0NTdHJpa2UxNV92Ml9HQzJDbGllbnRUb3VybmFtZW50SW5mb1wiO1xuICAgIEVDc2dvR0NNc2dbRUNzZ29HQ01zZ1tcImtfRU1zZ0dDX0dsb2JhbEdhbWVfU3Vic2NyaWJlXCJdID0gOTE2OF0gPSBcImtfRU1zZ0dDX0dsb2JhbEdhbWVfU3Vic2NyaWJlXCI7XG4gICAgRUNzZ29HQ01zZ1tFQ3Nnb0dDTXNnW1wia19FTXNnR0NfR2xvYmFsR2FtZV9VbnN1YnNjcmliZVwiXSA9IDkxNjldID0gXCJrX0VNc2dHQ19HbG9iYWxHYW1lX1Vuc3Vic2NyaWJlXCI7XG4gICAgRUNzZ29HQ01zZ1tFQ3Nnb0dDTXNnW1wia19FTXNnR0NfR2xvYmFsR2FtZV9QbGF5XCJdID0gOTE3MF0gPSBcImtfRU1zZ0dDX0dsb2JhbEdhbWVfUGxheVwiO1xuICAgIEVDc2dvR0NNc2dbRUNzZ29HQ01zZ1tcImtfRU1zZ0dDQ1N0cmlrZTE1X3YyX0Fja25vd2xlZGdlUGVuYWx0eVwiXSA9IDkxNzFdID0gXCJrX0VNc2dHQ0NTdHJpa2UxNV92Ml9BY2tub3dsZWRnZVBlbmFsdHlcIjtcbiAgICBFQ3Nnb0dDTXNnW0VDc2dvR0NNc2dbXCJrX0VNc2dHQ0NTdHJpa2UxNV92Ml9DbGllbnQyR0NSZXF1ZXN0UHJlc3RpZ2VDb2luXCJdID0gOTE3Ml0gPSBcImtfRU1zZ0dDQ1N0cmlrZTE1X3YyX0NsaWVudDJHQ1JlcXVlc3RQcmVzdGlnZUNvaW5cIjtcbiAgICBFQ3Nnb0dDTXNnW0VDc2dvR0NNc2dbXCJrX0VNc2dHQ0NTdHJpa2UxNV92Ml9HQzJDbGllbnRHbG9iYWxTdGF0c1wiXSA9IDkxNzNdID0gXCJrX0VNc2dHQ0NTdHJpa2UxNV92Ml9HQzJDbGllbnRHbG9iYWxTdGF0c1wiO1xuICAgIEVDc2dvR0NNc2dbRUNzZ29HQ01zZ1tcImtfRU1zZ0dDQ1N0cmlrZTE1X3YyX0NsaWVudDJHQ1N0cmVhbVVubG9ja1wiXSA9IDkxNzRdID0gXCJrX0VNc2dHQ0NTdHJpa2UxNV92Ml9DbGllbnQyR0NTdHJlYW1VbmxvY2tcIjtcbiAgICBFQ3Nnb0dDTXNnW0VDc2dvR0NNc2dbXCJrX0VNc2dHQ0NTdHJpa2UxNV92Ml9GYW50YXN5UmVxdWVzdENsaWVudERhdGFcIl0gPSA5MTc1XSA9IFwia19FTXNnR0NDU3RyaWtlMTVfdjJfRmFudGFzeVJlcXVlc3RDbGllbnREYXRhXCI7XG4gICAgRUNzZ29HQ01zZ1tFQ3Nnb0dDTXNnW1wia19FTXNnR0NDU3RyaWtlMTVfdjJfRmFudGFzeVVwZGF0ZUNsaWVudERhdGFcIl0gPSA5MTc2XSA9IFwia19FTXNnR0NDU3RyaWtlMTVfdjJfRmFudGFzeVVwZGF0ZUNsaWVudERhdGFcIjtcbiAgICBFQ3Nnb0dDTXNnW0VDc2dvR0NNc2dbXCJrX0VNc2dHQ0NTdHJpa2UxNV92Ml9HQ1RvQ2xpZW50U3RlYW1kYXRhZ3JhbVRpY2tldFwiXSA9IDkxNzddID0gXCJrX0VNc2dHQ0NTdHJpa2UxNV92Ml9HQ1RvQ2xpZW50U3RlYW1kYXRhZ3JhbVRpY2tldFwiO1xuICAgIEVDc2dvR0NNc2dbRUNzZ29HQ01zZ1tcImtfRU1zZ0dDQ1N0cmlrZTE1X3YyX0NsaWVudFRvR0NSZXF1ZXN0VGlja2V0XCJdID0gOTE3OF0gPSBcImtfRU1zZ0dDQ1N0cmlrZTE1X3YyX0NsaWVudFRvR0NSZXF1ZXN0VGlja2V0XCI7XG4gICAgRUNzZ29HQ01zZ1tFQ3Nnb0dDTXNnW1wia19FTXNnR0NDU3RyaWtlMTVfdjJfQ2xpZW50VG9HQ1JlcXVlc3RFbGV2YXRlXCJdID0gOTE3OV0gPSBcImtfRU1zZ0dDQ1N0cmlrZTE1X3YyX0NsaWVudFRvR0NSZXF1ZXN0RWxldmF0ZVwiO1xuICAgIEVDc2dvR0NNc2dbRUNzZ29HQ01zZ1tcImtfRU1zZ0dDQ1N0cmlrZTE1X3YyX0dsb2JhbENoYXRcIl0gPSA5MTgwXSA9IFwia19FTXNnR0NDU3RyaWtlMTVfdjJfR2xvYmFsQ2hhdFwiO1xuICAgIEVDc2dvR0NNc2dbRUNzZ29HQ01zZ1tcImtfRU1zZ0dDQ1N0cmlrZTE1X3YyX0dsb2JhbENoYXRfU3Vic2NyaWJlXCJdID0gOTE4MV0gPSBcImtfRU1zZ0dDQ1N0cmlrZTE1X3YyX0dsb2JhbENoYXRfU3Vic2NyaWJlXCI7XG4gICAgRUNzZ29HQ01zZ1tFQ3Nnb0dDTXNnW1wia19FTXNnR0NDU3RyaWtlMTVfdjJfR2xvYmFsQ2hhdF9VbnN1YnNjcmliZVwiXSA9IDkxODJdID0gXCJrX0VNc2dHQ0NTdHJpa2UxNV92Ml9HbG9iYWxDaGF0X1Vuc3Vic2NyaWJlXCI7XG4gICAgRUNzZ29HQ01zZ1tFQ3Nnb0dDTXNnW1wia19FTXNnR0NDU3RyaWtlMTVfdjJfQ2xpZW50QXV0aEtleUNvZGVcIl0gPSA5MTgzXSA9IFwia19FTXNnR0NDU3RyaWtlMTVfdjJfQ2xpZW50QXV0aEtleUNvZGVcIjtcbiAgICBFQ3Nnb0dDTXNnW0VDc2dvR0NNc2dbXCJrX0VNc2dHQ0NTdHJpa2UxNV92Ml9Hb3R2U3luY1BhY2tldFwiXSA9IDkxODRdID0gXCJrX0VNc2dHQ0NTdHJpa2UxNV92Ml9Hb3R2U3luY1BhY2tldFwiO1xuICAgIEVDc2dvR0NNc2dbRUNzZ29HQ01zZ1tcImtfRU1zZ0dDQ1N0cmlrZTE1X3YyX0NsaWVudFBsYXllckRlY2FsU2lnblwiXSA9IDkxODVdID0gXCJrX0VNc2dHQ0NTdHJpa2UxNV92Ml9DbGllbnRQbGF5ZXJEZWNhbFNpZ25cIjtcbiAgICBFQ3Nnb0dDTXNnW0VDc2dvR0NNc2dbXCJrX0VNc2dHQ0NTdHJpa2UxNV92Ml9DbGllbnRMb2dvbkZhdGFsRXJyb3JcIl0gPSA5MTg3XSA9IFwia19FTXNnR0NDU3RyaWtlMTVfdjJfQ2xpZW50TG9nb25GYXRhbEVycm9yXCI7XG4gICAgRUNzZ29HQ01zZ1tFQ3Nnb0dDTXNnW1wia19FTXNnR0NDU3RyaWtlMTVfdjJfQ2xpZW50UG9sbFN0YXRlXCJdID0gOTE4OF0gPSBcImtfRU1zZ0dDQ1N0cmlrZTE1X3YyX0NsaWVudFBvbGxTdGF0ZVwiO1xuICAgIEVDc2dvR0NNc2dbRUNzZ29HQ01zZ1tcImtfRU1zZ0dDQ1N0cmlrZTE1X3YyX1BhcnR5X1JlZ2lzdGVyXCJdID0gOTE4OV0gPSBcImtfRU1zZ0dDQ1N0cmlrZTE1X3YyX1BhcnR5X1JlZ2lzdGVyXCI7XG4gICAgRUNzZ29HQ01zZ1tFQ3Nnb0dDTXNnW1wia19FTXNnR0NDU3RyaWtlMTVfdjJfUGFydHlfVW5yZWdpc3RlclwiXSA9IDkxOTBdID0gXCJrX0VNc2dHQ0NTdHJpa2UxNV92Ml9QYXJ0eV9VbnJlZ2lzdGVyXCI7XG4gICAgRUNzZ29HQ01zZ1tFQ3Nnb0dDTXNnW1wia19FTXNnR0NDU3RyaWtlMTVfdjJfUGFydHlfU2VhcmNoXCJdID0gOTE5MV0gPSBcImtfRU1zZ0dDQ1N0cmlrZTE1X3YyX1BhcnR5X1NlYXJjaFwiO1xuICAgIEVDc2dvR0NNc2dbRUNzZ29HQ01zZ1tcImtfRU1zZ0dDQ1N0cmlrZTE1X3YyX1BhcnR5X0ludml0ZVwiXSA9IDkxOTJdID0gXCJrX0VNc2dHQ0NTdHJpa2UxNV92Ml9QYXJ0eV9JbnZpdGVcIjtcbiAgICBFQ3Nnb0dDTXNnW0VDc2dvR0NNc2dbXCJrX0VNc2dHQ0NTdHJpa2UxNV92Ml9BY2NvdW50X1JlcXVlc3RDb1BsYXlzXCJdID0gOTE5M10gPSBcImtfRU1zZ0dDQ1N0cmlrZTE1X3YyX0FjY291bnRfUmVxdWVzdENvUGxheXNcIjtcbiAgICBFQ3Nnb0dDTXNnW0VDc2dvR0NNc2dbXCJrX0VNc2dHQ0NTdHJpa2UxNV92Ml9DbGllbnRHQ1JhbmtVcGRhdGVcIl0gPSA5MTk0XSA9IFwia19FTXNnR0NDU3RyaWtlMTVfdjJfQ2xpZW50R0NSYW5rVXBkYXRlXCI7XG4gICAgRUNzZ29HQ01zZ1tFQ3Nnb0dDTXNnW1wia19FTXNnR0NDU3RyaWtlMTVfdjJfQ2xpZW50UmVxdWVzdE9mZmVyc1wiXSA9IDkxOTVdID0gXCJrX0VNc2dHQ0NTdHJpa2UxNV92Ml9DbGllbnRSZXF1ZXN0T2ZmZXJzXCI7XG4gICAgRUNzZ29HQ01zZ1tFQ3Nnb0dDTXNnW1wia19FTXNnR0NDU3RyaWtlMTVfdjJfQ2xpZW50QWNjb3VudEJhbGFuY2VcIl0gPSA5MTk2XSA9IFwia19FTXNnR0NDU3RyaWtlMTVfdjJfQ2xpZW50QWNjb3VudEJhbGFuY2VcIjtcbiAgICBFQ3Nnb0dDTXNnW0VDc2dvR0NNc2dbXCJrX0VNc2dHQ0NTdHJpa2UxNV92Ml9DbGllbnRQYXJ0eUpvaW5SZWxheVwiXSA9IDkxOTddID0gXCJrX0VNc2dHQ0NTdHJpa2UxNV92Ml9DbGllbnRQYXJ0eUpvaW5SZWxheVwiO1xuICAgIEVDc2dvR0NNc2dbRUNzZ29HQ01zZ1tcImtfRU1zZ0dDQ1N0cmlrZTE1X3YyX0NsaWVudFBhcnR5V2FybmluZ1wiXSA9IDkxOThdID0gXCJrX0VNc2dHQ0NTdHJpa2UxNV92Ml9DbGllbnRQYXJ0eVdhcm5pbmdcIjtcbiAgICBFQ3Nnb0dDTXNnW0VDc2dvR0NNc2dbXCJrX0VNc2dHQ0NTdHJpa2UxNV92Ml9TZXRFdmVudEZhdm9yaXRlXCJdID0gOTIwMF0gPSBcImtfRU1zZ0dDQ1N0cmlrZTE1X3YyX1NldEV2ZW50RmF2b3JpdGVcIjtcbiAgICBFQ3Nnb0dDTXNnW0VDc2dvR0NNc2dbXCJrX0VNc2dHQ0NTdHJpa2UxNV92Ml9HZXRFdmVudEZhdm9yaXRlc19SZXF1ZXN0XCJdID0gOTIwMV0gPSBcImtfRU1zZ0dDQ1N0cmlrZTE1X3YyX0dldEV2ZW50RmF2b3JpdGVzX1JlcXVlc3RcIjtcbiAgICBFQ3Nnb0dDTXNnW0VDc2dvR0NNc2dbXCJrX0VNc2dHQ0NTdHJpa2UxNV92Ml9DbGllbnRQZXJmUmVwb3J0XCJdID0gOTIwMl0gPSBcImtfRU1zZ0dDQ1N0cmlrZTE1X3YyX0NsaWVudFBlcmZSZXBvcnRcIjtcbiAgICBFQ3Nnb0dDTXNnW0VDc2dvR0NNc2dbXCJrX0VNc2dHQ0NTdHJpa2UxNV92Ml9HZXRFdmVudEZhdm9yaXRlc19SZXNwb25zZVwiXSA9IDkyMDNdID0gXCJrX0VNc2dHQ0NTdHJpa2UxNV92Ml9HZXRFdmVudEZhdm9yaXRlc19SZXNwb25zZVwiO1xuICAgIEVDc2dvR0NNc2dbRUNzZ29HQ01zZ1tcImtfRU1zZ0dDQ1N0cmlrZTE1X3YyX0NsaWVudFJlcXVlc3RTb3V2ZW5pclwiXSA9IDkyMDRdID0gXCJrX0VNc2dHQ0NTdHJpa2UxNV92Ml9DbGllbnRSZXF1ZXN0U291dmVuaXJcIjtcbiAgICBFQ3Nnb0dDTXNnW0VDc2dvR0NNc2dbXCJrX0VNc2dHQ0NTdHJpa2UxNV92Ml9DbGllbnRSZXBvcnRWYWxpZGF0aW9uXCJdID0gOTIwNV0gPSBcImtfRU1zZ0dDQ1N0cmlrZTE1X3YyX0NsaWVudFJlcG9ydFZhbGlkYXRpb25cIjtcbiAgICBFQ3Nnb0dDTXNnW0VDc2dvR0NNc2dbXCJrX0VNc2dHQ0NTdHJpa2UxNV92Ml9HQzJDbGllbnRSZWZ1c2VTZWN1cmVNb2RlXCJdID0gOTIwNl0gPSBcImtfRU1zZ0dDQ1N0cmlrZTE1X3YyX0dDMkNsaWVudFJlZnVzZVNlY3VyZU1vZGVcIjtcbiAgICBFQ3Nnb0dDTXNnW0VDc2dvR0NNc2dbXCJrX0VNc2dHQ0NTdHJpa2UxNV92Ml9HQzJDbGllbnRSZXF1ZXN0VmFsaWRhdGlvblwiXSA9IDkyMDddID0gXCJrX0VNc2dHQ0NTdHJpa2UxNV92Ml9HQzJDbGllbnRSZXF1ZXN0VmFsaWRhdGlvblwiO1xuICAgIEVDc2dvR0NNc2dbRUNzZ29HQ01zZ1tcImtfRU1zZ0dDQ1N0cmlrZTE1X3YyX0NsaWVudFJlZGVlbU1pc3Npb25SZXdhcmRcIl0gPSA5MjA5XSA9IFwia19FTXNnR0NDU3RyaWtlMTVfdjJfQ2xpZW50UmVkZWVtTWlzc2lvblJld2FyZFwiO1xuICAgIEVDc2dvR0NNc2dbRUNzZ29HQ01zZ1tcImtfRU1zZ0dDQ1N0cmlrZTE1X0NsaWVudERlZXBTdGF0c1wiXSA9IDkyMTBdID0gXCJrX0VNc2dHQ0NTdHJpa2UxNV9DbGllbnREZWVwU3RhdHNcIjtcbiAgICBFQ3Nnb0dDTXNnW0VDc2dvR0NNc2dbXCJrX0VNc2dHQ0NTdHJpa2UxNV9TdGFydEFncmVlbWVudFNlc3Npb25JbkdhbWVcIl0gPSA5MjExXSA9IFwia19FTXNnR0NDU3RyaWtlMTVfU3RhcnRBZ3JlZW1lbnRTZXNzaW9uSW5HYW1lXCI7XG4gICAgRUNzZ29HQ01zZ1tFQ3Nnb0dDTXNnW1wia19FTXNnR0NDU3RyaWtlMTVfdjJfR0MyQ2xpZW50SW5pdFN5c3RlbVwiXSA9IDkyMTJdID0gXCJrX0VNc2dHQ0NTdHJpa2UxNV92Ml9HQzJDbGllbnRJbml0U3lzdGVtXCI7XG4gICAgRUNzZ29HQ01zZ1tFQ3Nnb0dDTXNnW1wia19FTXNnR0NDU3RyaWtlMTVfdjJfR0MyQ2xpZW50SW5pdFN5c3RlbV9SZXNwb25zZVwiXSA9IDkyMTNdID0gXCJrX0VNc2dHQ0NTdHJpa2UxNV92Ml9HQzJDbGllbnRJbml0U3lzdGVtX1Jlc3BvbnNlXCI7XG4gICAgRUNzZ29HQ01zZ1tFQ3Nnb0dDTXNnW1wia19FTXNnR0NDU3RyaWtlMTVfdjJfUHJpdmF0ZVF1ZXVlc1wiXSA9IDkyMTRdID0gXCJrX0VNc2dHQ0NTdHJpa2UxNV92Ml9Qcml2YXRlUXVldWVzXCI7XG4gICAgRUNzZ29HQ01zZ1tFQ3Nnb0dDTXNnW1wia19FTXNnR0NDU3RyaWtlMTVfdjJfTWF0Y2hMaXN0VG91cm5hbWVudE9wZXJhdG9yTWdtdFwiXSA9IDkyMTVdID0gXCJrX0VNc2dHQ0NTdHJpa2UxNV92Ml9NYXRjaExpc3RUb3VybmFtZW50T3BlcmF0b3JNZ210XCI7XG59KShFQ3Nnb0dDTXNnID0gZXhwb3J0cy5FQ3Nnb0dDTXNnIHx8IChleHBvcnRzLkVDc2dvR0NNc2cgPSB7fSkpO1xudmFyIEVDc2dvU3RlYW1Vc2VyU3RhdDtcbihmdW5jdGlvbiAoRUNzZ29TdGVhbVVzZXJTdGF0KSB7XG4gICAgRUNzZ29TdGVhbVVzZXJTdGF0W0VDc2dvU3RlYW1Vc2VyU3RhdFtcImtfRUNzZ29TdGVhbVVzZXJTdGF0X1hwRWFybmVkR2FtZXNcIl0gPSAxXSA9IFwia19FQ3Nnb1N0ZWFtVXNlclN0YXRfWHBFYXJuZWRHYW1lc1wiO1xuICAgIEVDc2dvU3RlYW1Vc2VyU3RhdFtFQ3Nnb1N0ZWFtVXNlclN0YXRbXCJrX0VDc2dvU3RlYW1Vc2VyU3RhdF9NYXRjaFdpbnNDb21wZXRpdGl2ZVwiXSA9IDJdID0gXCJrX0VDc2dvU3RlYW1Vc2VyU3RhdF9NYXRjaFdpbnNDb21wZXRpdGl2ZVwiO1xuICAgIEVDc2dvU3RlYW1Vc2VyU3RhdFtFQ3Nnb1N0ZWFtVXNlclN0YXRbXCJrX0VDc2dvU3RlYW1Vc2VyU3RhdF9TdXJ2aXZlZERhbmdlclpvbmVcIl0gPSAzXSA9IFwia19FQ3Nnb1N0ZWFtVXNlclN0YXRfU3Vydml2ZWREYW5nZXJab25lXCI7XG59KShFQ3Nnb1N0ZWFtVXNlclN0YXQgPSBleHBvcnRzLkVDc2dvU3RlYW1Vc2VyU3RhdCB8fCAoZXhwb3J0cy5FQ3Nnb1N0ZWFtVXNlclN0YXQgPSB7fSkpO1xudmFyIEVDbGllbnRSZXBvcnRpbmdWZXJzaW9uO1xuKGZ1bmN0aW9uIChFQ2xpZW50UmVwb3J0aW5nVmVyc2lvbikge1xuICAgIEVDbGllbnRSZXBvcnRpbmdWZXJzaW9uW0VDbGllbnRSZXBvcnRpbmdWZXJzaW9uW1wia19FQ2xpZW50UmVwb3J0aW5nVmVyc2lvbl9PbGRWZXJzaW9uXCJdID0gMF0gPSBcImtfRUNsaWVudFJlcG9ydGluZ1ZlcnNpb25fT2xkVmVyc2lvblwiO1xuICAgIEVDbGllbnRSZXBvcnRpbmdWZXJzaW9uW0VDbGllbnRSZXBvcnRpbmdWZXJzaW9uW1wia19FQ2xpZW50UmVwb3J0aW5nVmVyc2lvbl9CZXRhVmVyc2lvblwiXSA9IDFdID0gXCJrX0VDbGllbnRSZXBvcnRpbmdWZXJzaW9uX0JldGFWZXJzaW9uXCI7XG4gICAgRUNsaWVudFJlcG9ydGluZ1ZlcnNpb25bRUNsaWVudFJlcG9ydGluZ1ZlcnNpb25bXCJrX0VDbGllbnRSZXBvcnRpbmdWZXJzaW9uX1N1cHBvcnRzVHJ1c3RlZE1vZGVcIl0gPSAyXSA9IFwia19FQ2xpZW50UmVwb3J0aW5nVmVyc2lvbl9TdXBwb3J0c1RydXN0ZWRNb2RlXCI7XG59KShFQ2xpZW50UmVwb3J0aW5nVmVyc2lvbiA9IGV4cG9ydHMuRUNsaWVudFJlcG9ydGluZ1ZlcnNpb24gfHwgKGV4cG9ydHMuRUNsaWVudFJlcG9ydGluZ1ZlcnNpb24gPSB7fSkpO1xudmFyIEVJbml0U3lzdGVtUmVzdWx0O1xuKGZ1bmN0aW9uIChFSW5pdFN5c3RlbVJlc3VsdCkge1xuICAgIEVJbml0U3lzdGVtUmVzdWx0W0VJbml0U3lzdGVtUmVzdWx0W1wia19FSW5pdFN5c3RlbVJlc3VsdF9JbnZhbGlkXCJdID0gMF0gPSBcImtfRUluaXRTeXN0ZW1SZXN1bHRfSW52YWxpZFwiO1xuICAgIEVJbml0U3lzdGVtUmVzdWx0W0VJbml0U3lzdGVtUmVzdWx0W1wia19FSW5pdFN5c3RlbVJlc3VsdF9TdWNjZXNzXCJdID0gMV0gPSBcImtfRUluaXRTeXN0ZW1SZXN1bHRfU3VjY2Vzc1wiO1xuICAgIEVJbml0U3lzdGVtUmVzdWx0W0VJbml0U3lzdGVtUmVzdWx0W1wia19FSW5pdFN5c3RlbVJlc3VsdF9Ob25lXCJdID0gMl0gPSBcImtfRUluaXRTeXN0ZW1SZXN1bHRfTm9uZVwiO1xuICAgIEVJbml0U3lzdGVtUmVzdWx0W0VJbml0U3lzdGVtUmVzdWx0W1wia19FSW5pdFN5c3RlbVJlc3VsdF9Ob3RGb3VuZFwiXSA9IDNdID0gXCJrX0VJbml0U3lzdGVtUmVzdWx0X05vdEZvdW5kXCI7XG4gICAgRUluaXRTeXN0ZW1SZXN1bHRbRUluaXRTeXN0ZW1SZXN1bHRbXCJrX0VJbml0U3lzdGVtUmVzdWx0X0V4aXN0aW5nXCJdID0gNF0gPSBcImtfRUluaXRTeXN0ZW1SZXN1bHRfRXhpc3RpbmdcIjtcbiAgICBFSW5pdFN5c3RlbVJlc3VsdFtFSW5pdFN5c3RlbVJlc3VsdFtcImtfRUluaXRTeXN0ZW1SZXN1bHRfRmFpbGVkT3BlblwiXSA9IDVdID0gXCJrX0VJbml0U3lzdGVtUmVzdWx0X0ZhaWxlZE9wZW5cIjtcbiAgICBFSW5pdFN5c3RlbVJlc3VsdFtFSW5pdFN5c3RlbVJlc3VsdFtcImtfRUluaXRTeXN0ZW1SZXN1bHRfTWlzbWF0Y2hcIl0gPSA2XSA9IFwia19FSW5pdFN5c3RlbVJlc3VsdF9NaXNtYXRjaFwiO1xuICAgIEVJbml0U3lzdGVtUmVzdWx0W0VJbml0U3lzdGVtUmVzdWx0W1wia19FSW5pdFN5c3RlbVJlc3VsdF9GYWlsZWRJbml0XCJdID0gN10gPSBcImtfRUluaXRTeXN0ZW1SZXN1bHRfRmFpbGVkSW5pdFwiO1xuICAgIEVJbml0U3lzdGVtUmVzdWx0W0VJbml0U3lzdGVtUmVzdWx0W1wia19FSW5pdFN5c3RlbVJlc3VsdF9NYXhcIl0gPSA4XSA9IFwia19FSW5pdFN5c3RlbVJlc3VsdF9NYXhcIjtcbn0pKEVJbml0U3lzdGVtUmVzdWx0ID0gZXhwb3J0cy5FSW5pdFN5c3RlbVJlc3VsdCB8fCAoZXhwb3J0cy5FSW5pdFN5c3RlbVJlc3VsdCA9IHt9KSk7XG5mdW5jdGlvbiBjcmVhdGVCYXNlR2FtZVNlcnZlclBpbmcoKSB7XG4gICAgcmV0dXJuIHsgcGluZzogMCwgaXA6IDAsIGluc3RhbmNlczogMCB9O1xufVxuZXhwb3J0cy5HYW1lU2VydmVyUGluZyA9IHtcbiAgICBlbmNvZGUobWVzc2FnZSwgd3JpdGVyID0gbWluaW1hbF8xLldyaXRlci5jcmVhdGUoKSkge1xuICAgICAgICBpZiAobWVzc2FnZS5waW5nICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDE2KS5pbnQzMihtZXNzYWdlLnBpbmcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLmlwICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDI0KS51aW50MzIobWVzc2FnZS5pcCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UuaW5zdGFuY2VzICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDQwKS51aW50MzIobWVzc2FnZS5pbnN0YW5jZXMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfSxcbiAgICBkZWNvZGUoaW5wdXQsIGxlbmd0aCkge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBpbnB1dCBpbnN0YW5jZW9mIG1pbmltYWxfMS5SZWFkZXIgPyBpbnB1dCA6IG5ldyBtaW5pbWFsXzEuUmVhZGVyKGlucHV0KTtcbiAgICAgICAgbGV0IGVuZCA9IGxlbmd0aCA9PT0gdW5kZWZpbmVkID8gcmVhZGVyLmxlbiA6IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlR2FtZVNlcnZlclBpbmcoKTtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhZyA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgIHN3aXRjaCAodGFnID4+PiAzKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnBpbmcgPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmlwID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuaW5zdGFuY2VzID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICByZWFkZXIuc2tpcFR5cGUodGFnICYgNyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH0sXG4gICAgZnJvbVBhcnRpYWwob2JqZWN0KSB7XG4gICAgICAgIHZhciBfYSwgX2IsIF9jO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUdhbWVTZXJ2ZXJQaW5nKCk7XG4gICAgICAgIG1lc3NhZ2UucGluZyA9IChfYSA9IG9iamVjdC5waW5nKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAwO1xuICAgICAgICBtZXNzYWdlLmlwID0gKF9iID0gb2JqZWN0LmlwKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAwO1xuICAgICAgICBtZXNzYWdlLmluc3RhbmNlcyA9IChfYyA9IG9iamVjdC5pbnN0YW5jZXMpICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IDA7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbn07XG5mdW5jdGlvbiBjcmVhdGVCYXNlRGF0YUNlbnRlclBpbmcoKSB7XG4gICAgcmV0dXJuIHsgZGF0YUNlbnRlcklkOiAwLCBwaW5nOiAwIH07XG59XG5leHBvcnRzLkRhdGFDZW50ZXJQaW5nID0ge1xuICAgIGVuY29kZShtZXNzYWdlLCB3cml0ZXIgPSBtaW5pbWFsXzEuV3JpdGVyLmNyZWF0ZSgpKSB7XG4gICAgICAgIGlmIChtZXNzYWdlLmRhdGFDZW50ZXJJZCAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigxMykuZml4ZWQzMihtZXNzYWdlLmRhdGFDZW50ZXJJZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UucGluZyAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigxNikuc2ludDMyKG1lc3NhZ2UucGluZyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9LFxuICAgIGRlY29kZShpbnB1dCwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IGlucHV0IGluc3RhbmNlb2YgbWluaW1hbF8xLlJlYWRlciA/IGlucHV0IDogbmV3IG1pbmltYWxfMS5SZWFkZXIoaW5wdXQpO1xuICAgICAgICBsZXQgZW5kID0gbGVuZ3RoID09PSB1bmRlZmluZWQgPyByZWFkZXIubGVuIDogcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VEYXRhQ2VudGVyUGluZygpO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZGF0YUNlbnRlcklkID0gcmVhZGVyLmZpeGVkMzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnBpbmcgPSByZWFkZXIuc2ludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJlYWRlci5za2lwVHlwZSh0YWcgJiA3KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfSxcbiAgICBmcm9tUGFydGlhbChvYmplY3QpIHtcbiAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VEYXRhQ2VudGVyUGluZygpO1xuICAgICAgICBtZXNzYWdlLmRhdGFDZW50ZXJJZCA9IChfYSA9IG9iamVjdC5kYXRhQ2VudGVySWQpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IDA7XG4gICAgICAgIG1lc3NhZ2UucGluZyA9IChfYiA9IG9iamVjdC5waW5nKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAwO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG59O1xuZnVuY3Rpb24gY3JlYXRlQmFzZURldGFpbGVkU2VhcmNoU3RhdGlzdGljKCkge1xuICAgIHJldHVybiB7IGdhbWVUeXBlOiAwLCBzZWFyY2hUaW1lQXZnOiAwLCBwbGF5ZXJzU2VhcmNoaW5nOiAwIH07XG59XG5leHBvcnRzLkRldGFpbGVkU2VhcmNoU3RhdGlzdGljID0ge1xuICAgIGVuY29kZShtZXNzYWdlLCB3cml0ZXIgPSBtaW5pbWFsXzEuV3JpdGVyLmNyZWF0ZSgpKSB7XG4gICAgICAgIGlmIChtZXNzYWdlLmdhbWVUeXBlICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDgpLnVpbnQzMihtZXNzYWdlLmdhbWVUeXBlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5zZWFyY2hUaW1lQXZnICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDE2KS51aW50MzIobWVzc2FnZS5zZWFyY2hUaW1lQXZnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5wbGF5ZXJzU2VhcmNoaW5nICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDMyKS51aW50MzIobWVzc2FnZS5wbGF5ZXJzU2VhcmNoaW5nKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH0sXG4gICAgZGVjb2RlKGlucHV0LCBsZW5ndGgpIHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gaW5wdXQgaW5zdGFuY2VvZiBtaW5pbWFsXzEuUmVhZGVyID8gaW5wdXQgOiBuZXcgbWluaW1hbF8xLlJlYWRlcihpbnB1dCk7XG4gICAgICAgIGxldCBlbmQgPSBsZW5ndGggPT09IHVuZGVmaW5lZCA/IHJlYWRlci5sZW4gOiByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZURldGFpbGVkU2VhcmNoU3RhdGlzdGljKCk7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBjb25zdCB0YWcgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKHRhZyA+Pj4gMykge1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5nYW1lVHlwZSA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnNlYXJjaFRpbWVBdmcgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5wbGF5ZXJzU2VhcmNoaW5nID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICByZWFkZXIuc2tpcFR5cGUodGFnICYgNyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH0sXG4gICAgZnJvbVBhcnRpYWwob2JqZWN0KSB7XG4gICAgICAgIHZhciBfYSwgX2IsIF9jO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZURldGFpbGVkU2VhcmNoU3RhdGlzdGljKCk7XG4gICAgICAgIG1lc3NhZ2UuZ2FtZVR5cGUgPSAoX2EgPSBvYmplY3QuZ2FtZVR5cGUpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IDA7XG4gICAgICAgIG1lc3NhZ2Uuc2VhcmNoVGltZUF2ZyA9IChfYiA9IG9iamVjdC5zZWFyY2hUaW1lQXZnKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAwO1xuICAgICAgICBtZXNzYWdlLnBsYXllcnNTZWFyY2hpbmcgPSAoX2MgPSBvYmplY3QucGxheWVyc1NlYXJjaGluZykgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogMDtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxufTtcbmZ1bmN0aW9uIGNyZWF0ZUJhc2VUb3VybmFtZW50UGxheWVyKCkge1xuICAgIHJldHVybiB7XG4gICAgICAgIGFjY291bnRJZDogMCxcbiAgICAgICAgcGxheWVyTmljazogXCJcIixcbiAgICAgICAgcGxheWVyTmFtZTogXCJcIixcbiAgICAgICAgcGxheWVyRG9iOiAwLFxuICAgICAgICBwbGF5ZXJGbGFnOiBcIlwiLFxuICAgICAgICBwbGF5ZXJMb2NhdGlvbjogXCJcIixcbiAgICAgICAgcGxheWVyRGVzYzogXCJcIlxuICAgIH07XG59XG5leHBvcnRzLlRvdXJuYW1lbnRQbGF5ZXIgPSB7XG4gICAgZW5jb2RlKG1lc3NhZ2UsIHdyaXRlciA9IG1pbmltYWxfMS5Xcml0ZXIuY3JlYXRlKCkpIHtcbiAgICAgICAgaWYgKG1lc3NhZ2UuYWNjb3VudElkICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDgpLnVpbnQzMihtZXNzYWdlLmFjY291bnRJZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UucGxheWVyTmljayAhPT0gXCJcIikge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigxOCkuc3RyaW5nKG1lc3NhZ2UucGxheWVyTmljayk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UucGxheWVyTmFtZSAhPT0gXCJcIikge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigyNikuc3RyaW5nKG1lc3NhZ2UucGxheWVyTmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UucGxheWVyRG9iICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDMyKS51aW50MzIobWVzc2FnZS5wbGF5ZXJEb2IpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLnBsYXllckZsYWcgIT09IFwiXCIpIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoNDIpLnN0cmluZyhtZXNzYWdlLnBsYXllckZsYWcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLnBsYXllckxvY2F0aW9uICE9PSBcIlwiKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDUwKS5zdHJpbmcobWVzc2FnZS5wbGF5ZXJMb2NhdGlvbik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UucGxheWVyRGVzYyAhPT0gXCJcIikge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig1OCkuc3RyaW5nKG1lc3NhZ2UucGxheWVyRGVzYyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9LFxuICAgIGRlY29kZShpbnB1dCwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IGlucHV0IGluc3RhbmNlb2YgbWluaW1hbF8xLlJlYWRlciA/IGlucHV0IDogbmV3IG1pbmltYWxfMS5SZWFkZXIoaW5wdXQpO1xuICAgICAgICBsZXQgZW5kID0gbGVuZ3RoID09PSB1bmRlZmluZWQgPyByZWFkZXIubGVuIDogcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VUb3VybmFtZW50UGxheWVyKCk7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBjb25zdCB0YWcgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKHRhZyA+Pj4gMykge1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5hY2NvdW50SWQgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5wbGF5ZXJOaWNrID0gcmVhZGVyLnN0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UucGxheWVyTmFtZSA9IHJlYWRlci5zdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnBsYXllckRvYiA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnBsYXllckZsYWcgPSByZWFkZXIuc3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5wbGF5ZXJMb2NhdGlvbiA9IHJlYWRlci5zdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA3OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnBsYXllckRlc2MgPSByZWFkZXIuc3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJlYWRlci5za2lwVHlwZSh0YWcgJiA3KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfSxcbiAgICBmcm9tUGFydGlhbChvYmplY3QpIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2MsIF9kLCBfZSwgX2YsIF9nO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZVRvdXJuYW1lbnRQbGF5ZXIoKTtcbiAgICAgICAgbWVzc2FnZS5hY2NvdW50SWQgPSAoX2EgPSBvYmplY3QuYWNjb3VudElkKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAwO1xuICAgICAgICBtZXNzYWdlLnBsYXllck5pY2sgPSAoX2IgPSBvYmplY3QucGxheWVyTmljaykgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogXCJcIjtcbiAgICAgICAgbWVzc2FnZS5wbGF5ZXJOYW1lID0gKF9jID0gb2JqZWN0LnBsYXllck5hbWUpICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IFwiXCI7XG4gICAgICAgIG1lc3NhZ2UucGxheWVyRG9iID0gKF9kID0gb2JqZWN0LnBsYXllckRvYikgIT09IG51bGwgJiYgX2QgIT09IHZvaWQgMCA/IF9kIDogMDtcbiAgICAgICAgbWVzc2FnZS5wbGF5ZXJGbGFnID0gKF9lID0gb2JqZWN0LnBsYXllckZsYWcpICE9PSBudWxsICYmIF9lICE9PSB2b2lkIDAgPyBfZSA6IFwiXCI7XG4gICAgICAgIG1lc3NhZ2UucGxheWVyTG9jYXRpb24gPSAoX2YgPSBvYmplY3QucGxheWVyTG9jYXRpb24pICE9PSBudWxsICYmIF9mICE9PSB2b2lkIDAgPyBfZiA6IFwiXCI7XG4gICAgICAgIG1lc3NhZ2UucGxheWVyRGVzYyA9IChfZyA9IG9iamVjdC5wbGF5ZXJEZXNjKSAhPT0gbnVsbCAmJiBfZyAhPT0gdm9pZCAwID8gX2cgOiBcIlwiO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG59O1xuZnVuY3Rpb24gY3JlYXRlQmFzZVRvdXJuYW1lbnRUZWFtKCkge1xuICAgIHJldHVybiB7IHRlYW1JZDogMCwgdGVhbVRhZzogXCJcIiwgdGVhbUZsYWc6IFwiXCIsIHRlYW1OYW1lOiBcIlwiLCBwbGF5ZXJzOiBbXSB9O1xufVxuZXhwb3J0cy5Ub3VybmFtZW50VGVhbSA9IHtcbiAgICBlbmNvZGUobWVzc2FnZSwgd3JpdGVyID0gbWluaW1hbF8xLldyaXRlci5jcmVhdGUoKSkge1xuICAgICAgICBpZiAobWVzc2FnZS50ZWFtSWQgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoOCkuaW50MzIobWVzc2FnZS50ZWFtSWQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLnRlYW1UYWcgIT09IFwiXCIpIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMTgpLnN0cmluZyhtZXNzYWdlLnRlYW1UYWcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLnRlYW1GbGFnICE9PSBcIlwiKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDI2KS5zdHJpbmcobWVzc2FnZS50ZWFtRmxhZyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UudGVhbU5hbWUgIT09IFwiXCIpIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMzQpLnN0cmluZyhtZXNzYWdlLnRlYW1OYW1lKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IHYgb2YgbWVzc2FnZS5wbGF5ZXJzKSB7XG4gICAgICAgICAgICBleHBvcnRzLlRvdXJuYW1lbnRQbGF5ZXIuZW5jb2RlKHYsIHdyaXRlci51aW50MzIoNDIpLmZvcmsoKSkubGRlbGltKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9LFxuICAgIGRlY29kZShpbnB1dCwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IGlucHV0IGluc3RhbmNlb2YgbWluaW1hbF8xLlJlYWRlciA/IGlucHV0IDogbmV3IG1pbmltYWxfMS5SZWFkZXIoaW5wdXQpO1xuICAgICAgICBsZXQgZW5kID0gbGVuZ3RoID09PSB1bmRlZmluZWQgPyByZWFkZXIubGVuIDogcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VUb3VybmFtZW50VGVhbSgpO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudGVhbUlkID0gcmVhZGVyLmludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS50ZWFtVGFnID0gcmVhZGVyLnN0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudGVhbUZsYWcgPSByZWFkZXIuc3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS50ZWFtTmFtZSA9IHJlYWRlci5zdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnBsYXllcnMucHVzaChleHBvcnRzLlRvdXJuYW1lbnRQbGF5ZXIuZGVjb2RlKHJlYWRlciwgcmVhZGVyLnVpbnQzMigpKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJlYWRlci5za2lwVHlwZSh0YWcgJiA3KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfSxcbiAgICBmcm9tUGFydGlhbChvYmplY3QpIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2MsIF9kLCBfZTtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VUb3VybmFtZW50VGVhbSgpO1xuICAgICAgICBtZXNzYWdlLnRlYW1JZCA9IChfYSA9IG9iamVjdC50ZWFtSWQpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IDA7XG4gICAgICAgIG1lc3NhZ2UudGVhbVRhZyA9IChfYiA9IG9iamVjdC50ZWFtVGFnKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBcIlwiO1xuICAgICAgICBtZXNzYWdlLnRlYW1GbGFnID0gKF9jID0gb2JqZWN0LnRlYW1GbGFnKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiBcIlwiO1xuICAgICAgICBtZXNzYWdlLnRlYW1OYW1lID0gKF9kID0gb2JqZWN0LnRlYW1OYW1lKSAhPT0gbnVsbCAmJiBfZCAhPT0gdm9pZCAwID8gX2QgOiBcIlwiO1xuICAgICAgICBtZXNzYWdlLnBsYXllcnMgPVxuICAgICAgICAgICAgKChfZSA9IG9iamVjdC5wbGF5ZXJzKSA9PT0gbnVsbCB8fCBfZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2UubWFwKGUgPT4gZXhwb3J0cy5Ub3VybmFtZW50UGxheWVyLmZyb21QYXJ0aWFsKGUpKSkgfHwgW107XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbn07XG5mdW5jdGlvbiBjcmVhdGVCYXNlVG91cm5hbWVudEV2ZW50KCkge1xuICAgIHJldHVybiB7XG4gICAgICAgIGV2ZW50SWQ6IDAsXG4gICAgICAgIGV2ZW50VGFnOiBcIlwiLFxuICAgICAgICBldmVudE5hbWU6IFwiXCIsXG4gICAgICAgIGV2ZW50VGltZVN0YXJ0OiAwLFxuICAgICAgICBldmVudFRpbWVFbmQ6IDAsXG4gICAgICAgIGV2ZW50UHVibGljOiAwLFxuICAgICAgICBldmVudFN0YWdlSWQ6IDAsXG4gICAgICAgIGV2ZW50U3RhZ2VOYW1lOiBcIlwiLFxuICAgICAgICBhY3RpdmVTZWN0aW9uSWQ6IDBcbiAgICB9O1xufVxuZXhwb3J0cy5Ub3VybmFtZW50RXZlbnQgPSB7XG4gICAgZW5jb2RlKG1lc3NhZ2UsIHdyaXRlciA9IG1pbmltYWxfMS5Xcml0ZXIuY3JlYXRlKCkpIHtcbiAgICAgICAgaWYgKG1lc3NhZ2UuZXZlbnRJZCAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig4KS5pbnQzMihtZXNzYWdlLmV2ZW50SWQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLmV2ZW50VGFnICE9PSBcIlwiKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDE4KS5zdHJpbmcobWVzc2FnZS5ldmVudFRhZyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UuZXZlbnROYW1lICE9PSBcIlwiKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDI2KS5zdHJpbmcobWVzc2FnZS5ldmVudE5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLmV2ZW50VGltZVN0YXJ0ICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDMyKS51aW50MzIobWVzc2FnZS5ldmVudFRpbWVTdGFydCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UuZXZlbnRUaW1lRW5kICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDQwKS51aW50MzIobWVzc2FnZS5ldmVudFRpbWVFbmQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLmV2ZW50UHVibGljICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDQ4KS5pbnQzMihtZXNzYWdlLmV2ZW50UHVibGljKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5ldmVudFN0YWdlSWQgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoNTYpLmludDMyKG1lc3NhZ2UuZXZlbnRTdGFnZUlkKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5ldmVudFN0YWdlTmFtZSAhPT0gXCJcIikge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig2Nikuc3RyaW5nKG1lc3NhZ2UuZXZlbnRTdGFnZU5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLmFjdGl2ZVNlY3Rpb25JZCAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig3MikudWludDMyKG1lc3NhZ2UuYWN0aXZlU2VjdGlvbklkKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH0sXG4gICAgZGVjb2RlKGlucHV0LCBsZW5ndGgpIHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gaW5wdXQgaW5zdGFuY2VvZiBtaW5pbWFsXzEuUmVhZGVyID8gaW5wdXQgOiBuZXcgbWluaW1hbF8xLlJlYWRlcihpbnB1dCk7XG4gICAgICAgIGxldCBlbmQgPSBsZW5ndGggPT09IHVuZGVmaW5lZCA/IHJlYWRlci5sZW4gOiByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZVRvdXJuYW1lbnRFdmVudCgpO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZXZlbnRJZCA9IHJlYWRlci5pbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZXZlbnRUYWcgPSByZWFkZXIuc3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5ldmVudE5hbWUgPSByZWFkZXIuc3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5ldmVudFRpbWVTdGFydCA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmV2ZW50VGltZUVuZCA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmV2ZW50UHVibGljID0gcmVhZGVyLmludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNzpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5ldmVudFN0YWdlSWQgPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA4OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmV2ZW50U3RhZ2VOYW1lID0gcmVhZGVyLnN0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDk6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuYWN0aXZlU2VjdGlvbklkID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICByZWFkZXIuc2tpcFR5cGUodGFnICYgNyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH0sXG4gICAgZnJvbVBhcnRpYWwob2JqZWN0KSB7XG4gICAgICAgIHZhciBfYSwgX2IsIF9jLCBfZCwgX2UsIF9mLCBfZywgX2gsIF9qO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZVRvdXJuYW1lbnRFdmVudCgpO1xuICAgICAgICBtZXNzYWdlLmV2ZW50SWQgPSAoX2EgPSBvYmplY3QuZXZlbnRJZCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMDtcbiAgICAgICAgbWVzc2FnZS5ldmVudFRhZyA9IChfYiA9IG9iamVjdC5ldmVudFRhZykgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogXCJcIjtcbiAgICAgICAgbWVzc2FnZS5ldmVudE5hbWUgPSAoX2MgPSBvYmplY3QuZXZlbnROYW1lKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiBcIlwiO1xuICAgICAgICBtZXNzYWdlLmV2ZW50VGltZVN0YXJ0ID0gKF9kID0gb2JqZWN0LmV2ZW50VGltZVN0YXJ0KSAhPT0gbnVsbCAmJiBfZCAhPT0gdm9pZCAwID8gX2QgOiAwO1xuICAgICAgICBtZXNzYWdlLmV2ZW50VGltZUVuZCA9IChfZSA9IG9iamVjdC5ldmVudFRpbWVFbmQpICE9PSBudWxsICYmIF9lICE9PSB2b2lkIDAgPyBfZSA6IDA7XG4gICAgICAgIG1lc3NhZ2UuZXZlbnRQdWJsaWMgPSAoX2YgPSBvYmplY3QuZXZlbnRQdWJsaWMpICE9PSBudWxsICYmIF9mICE9PSB2b2lkIDAgPyBfZiA6IDA7XG4gICAgICAgIG1lc3NhZ2UuZXZlbnRTdGFnZUlkID0gKF9nID0gb2JqZWN0LmV2ZW50U3RhZ2VJZCkgIT09IG51bGwgJiYgX2cgIT09IHZvaWQgMCA/IF9nIDogMDtcbiAgICAgICAgbWVzc2FnZS5ldmVudFN0YWdlTmFtZSA9IChfaCA9IG9iamVjdC5ldmVudFN0YWdlTmFtZSkgIT09IG51bGwgJiYgX2ggIT09IHZvaWQgMCA/IF9oIDogXCJcIjtcbiAgICAgICAgbWVzc2FnZS5hY3RpdmVTZWN0aW9uSWQgPSAoX2ogPSBvYmplY3QuYWN0aXZlU2VjdGlvbklkKSAhPT0gbnVsbCAmJiBfaiAhPT0gdm9pZCAwID8gX2ogOiAwO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG59O1xuZnVuY3Rpb24gY3JlYXRlQmFzZUdsb2JhbFN0YXRpc3RpY3MoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgcGxheWVyc09ubGluZTogMCxcbiAgICAgICAgc2VydmVyc09ubGluZTogMCxcbiAgICAgICAgcGxheWVyc1NlYXJjaGluZzogMCxcbiAgICAgICAgc2VydmVyc0F2YWlsYWJsZTogMCxcbiAgICAgICAgb25nb2luZ01hdGNoZXM6IDAsXG4gICAgICAgIHNlYXJjaFRpbWVBdmc6IDAsXG4gICAgICAgIHNlYXJjaFN0YXRpc3RpY3M6IFtdLFxuICAgICAgICBtYWluUG9zdFVybDogXCJcIixcbiAgICAgICAgcmVxdWlyZWRBcHBpZFZlcnNpb246IDAsXG4gICAgICAgIHByaWNlc2hlZXRWZXJzaW9uOiAwLFxuICAgICAgICB0d2l0Y2hTdHJlYW1zVmVyc2lvbjogMCxcbiAgICAgICAgYWN0aXZlVG91cm5hbWVudEV2ZW50aWQ6IDAsXG4gICAgICAgIGFjdGl2ZVN1cnZleUlkOiAwLFxuICAgICAgICBydGltZTMyQ3VyOiAwLFxuICAgICAgICBydGltZTMyRXZlbnRTdGFydDogMFxuICAgIH07XG59XG5leHBvcnRzLkdsb2JhbFN0YXRpc3RpY3MgPSB7XG4gICAgZW5jb2RlKG1lc3NhZ2UsIHdyaXRlciA9IG1pbmltYWxfMS5Xcml0ZXIuY3JlYXRlKCkpIHtcbiAgICAgICAgaWYgKG1lc3NhZ2UucGxheWVyc09ubGluZSAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig4KS51aW50MzIobWVzc2FnZS5wbGF5ZXJzT25saW5lKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5zZXJ2ZXJzT25saW5lICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDE2KS51aW50MzIobWVzc2FnZS5zZXJ2ZXJzT25saW5lKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5wbGF5ZXJzU2VhcmNoaW5nICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDI0KS51aW50MzIobWVzc2FnZS5wbGF5ZXJzU2VhcmNoaW5nKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5zZXJ2ZXJzQXZhaWxhYmxlICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDMyKS51aW50MzIobWVzc2FnZS5zZXJ2ZXJzQXZhaWxhYmxlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5vbmdvaW5nTWF0Y2hlcyAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig0MCkudWludDMyKG1lc3NhZ2Uub25nb2luZ01hdGNoZXMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLnNlYXJjaFRpbWVBdmcgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoNDgpLnVpbnQzMihtZXNzYWdlLnNlYXJjaFRpbWVBdmcpO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3QgdiBvZiBtZXNzYWdlLnNlYXJjaFN0YXRpc3RpY3MpIHtcbiAgICAgICAgICAgIGV4cG9ydHMuRGV0YWlsZWRTZWFyY2hTdGF0aXN0aWMuZW5jb2RlKHYsIHdyaXRlci51aW50MzIoNTgpLmZvcmsoKSkubGRlbGltKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UubWFpblBvc3RVcmwgIT09IFwiXCIpIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoNjYpLnN0cmluZyhtZXNzYWdlLm1haW5Qb3N0VXJsKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5yZXF1aXJlZEFwcGlkVmVyc2lvbiAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig3MikudWludDMyKG1lc3NhZ2UucmVxdWlyZWRBcHBpZFZlcnNpb24pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLnByaWNlc2hlZXRWZXJzaW9uICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDgwKS51aW50MzIobWVzc2FnZS5wcmljZXNoZWV0VmVyc2lvbik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UudHdpdGNoU3RyZWFtc1ZlcnNpb24gIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoODgpLnVpbnQzMihtZXNzYWdlLnR3aXRjaFN0cmVhbXNWZXJzaW9uKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5hY3RpdmVUb3VybmFtZW50RXZlbnRpZCAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig5NikudWludDMyKG1lc3NhZ2UuYWN0aXZlVG91cm5hbWVudEV2ZW50aWQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLmFjdGl2ZVN1cnZleUlkICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDEwNCkudWludDMyKG1lc3NhZ2UuYWN0aXZlU3VydmV5SWQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLnJ0aW1lMzJDdXIgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMTEyKS51aW50MzIobWVzc2FnZS5ydGltZTMyQ3VyKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5ydGltZTMyRXZlbnRTdGFydCAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigxMjApLnVpbnQzMihtZXNzYWdlLnJ0aW1lMzJFdmVudFN0YXJ0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH0sXG4gICAgZGVjb2RlKGlucHV0LCBsZW5ndGgpIHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gaW5wdXQgaW5zdGFuY2VvZiBtaW5pbWFsXzEuUmVhZGVyID8gaW5wdXQgOiBuZXcgbWluaW1hbF8xLlJlYWRlcihpbnB1dCk7XG4gICAgICAgIGxldCBlbmQgPSBsZW5ndGggPT09IHVuZGVmaW5lZCA/IHJlYWRlci5sZW4gOiByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUdsb2JhbFN0YXRpc3RpY3MoKTtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhZyA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgIHN3aXRjaCAodGFnID4+PiAzKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnBsYXllcnNPbmxpbmUgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5zZXJ2ZXJzT25saW5lID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UucGxheWVyc1NlYXJjaGluZyA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnNlcnZlcnNBdmFpbGFibGUgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5vbmdvaW5nTWF0Y2hlcyA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnNlYXJjaFRpbWVBdmcgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNzpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5zZWFyY2hTdGF0aXN0aWNzLnB1c2goZXhwb3J0cy5EZXRhaWxlZFNlYXJjaFN0YXRpc3RpYy5kZWNvZGUocmVhZGVyLCByZWFkZXIudWludDMyKCkpKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA4OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLm1haW5Qb3N0VXJsID0gcmVhZGVyLnN0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDk6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UucmVxdWlyZWRBcHBpZFZlcnNpb24gPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMTA6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UucHJpY2VzaGVldFZlcnNpb24gPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMTE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudHdpdGNoU3RyZWFtc1ZlcnNpb24gPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMTI6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuYWN0aXZlVG91cm5hbWVudEV2ZW50aWQgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMTM6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuYWN0aXZlU3VydmV5SWQgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMTQ6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UucnRpbWUzMkN1ciA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAxNTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5ydGltZTMyRXZlbnRTdGFydCA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmVhZGVyLnNraXBUeXBlKHRhZyAmIDcpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9LFxuICAgIGZyb21QYXJ0aWFsKG9iamVjdCkge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYywgX2QsIF9lLCBfZiwgX2csIF9oLCBfaiwgX2ssIF9sLCBfbSwgX28sIF9wLCBfcTtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VHbG9iYWxTdGF0aXN0aWNzKCk7XG4gICAgICAgIG1lc3NhZ2UucGxheWVyc09ubGluZSA9IChfYSA9IG9iamVjdC5wbGF5ZXJzT25saW5lKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAwO1xuICAgICAgICBtZXNzYWdlLnNlcnZlcnNPbmxpbmUgPSAoX2IgPSBvYmplY3Quc2VydmVyc09ubGluZSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogMDtcbiAgICAgICAgbWVzc2FnZS5wbGF5ZXJzU2VhcmNoaW5nID0gKF9jID0gb2JqZWN0LnBsYXllcnNTZWFyY2hpbmcpICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IDA7XG4gICAgICAgIG1lc3NhZ2Uuc2VydmVyc0F2YWlsYWJsZSA9IChfZCA9IG9iamVjdC5zZXJ2ZXJzQXZhaWxhYmxlKSAhPT0gbnVsbCAmJiBfZCAhPT0gdm9pZCAwID8gX2QgOiAwO1xuICAgICAgICBtZXNzYWdlLm9uZ29pbmdNYXRjaGVzID0gKF9lID0gb2JqZWN0Lm9uZ29pbmdNYXRjaGVzKSAhPT0gbnVsbCAmJiBfZSAhPT0gdm9pZCAwID8gX2UgOiAwO1xuICAgICAgICBtZXNzYWdlLnNlYXJjaFRpbWVBdmcgPSAoX2YgPSBvYmplY3Quc2VhcmNoVGltZUF2ZykgIT09IG51bGwgJiYgX2YgIT09IHZvaWQgMCA/IF9mIDogMDtcbiAgICAgICAgbWVzc2FnZS5zZWFyY2hTdGF0aXN0aWNzID1cbiAgICAgICAgICAgICgoX2cgPSBvYmplY3Quc2VhcmNoU3RhdGlzdGljcykgPT09IG51bGwgfHwgX2cgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9nLm1hcChlID0+IGV4cG9ydHMuRGV0YWlsZWRTZWFyY2hTdGF0aXN0aWMuZnJvbVBhcnRpYWwoZSkpKSB8fCBbXTtcbiAgICAgICAgbWVzc2FnZS5tYWluUG9zdFVybCA9IChfaCA9IG9iamVjdC5tYWluUG9zdFVybCkgIT09IG51bGwgJiYgX2ggIT09IHZvaWQgMCA/IF9oIDogXCJcIjtcbiAgICAgICAgbWVzc2FnZS5yZXF1aXJlZEFwcGlkVmVyc2lvbiA9IChfaiA9IG9iamVjdC5yZXF1aXJlZEFwcGlkVmVyc2lvbikgIT09IG51bGwgJiYgX2ogIT09IHZvaWQgMCA/IF9qIDogMDtcbiAgICAgICAgbWVzc2FnZS5wcmljZXNoZWV0VmVyc2lvbiA9IChfayA9IG9iamVjdC5wcmljZXNoZWV0VmVyc2lvbikgIT09IG51bGwgJiYgX2sgIT09IHZvaWQgMCA/IF9rIDogMDtcbiAgICAgICAgbWVzc2FnZS50d2l0Y2hTdHJlYW1zVmVyc2lvbiA9IChfbCA9IG9iamVjdC50d2l0Y2hTdHJlYW1zVmVyc2lvbikgIT09IG51bGwgJiYgX2wgIT09IHZvaWQgMCA/IF9sIDogMDtcbiAgICAgICAgbWVzc2FnZS5hY3RpdmVUb3VybmFtZW50RXZlbnRpZCA9IChfbSA9IG9iamVjdC5hY3RpdmVUb3VybmFtZW50RXZlbnRpZCkgIT09IG51bGwgJiYgX20gIT09IHZvaWQgMCA/IF9tIDogMDtcbiAgICAgICAgbWVzc2FnZS5hY3RpdmVTdXJ2ZXlJZCA9IChfbyA9IG9iamVjdC5hY3RpdmVTdXJ2ZXlJZCkgIT09IG51bGwgJiYgX28gIT09IHZvaWQgMCA/IF9vIDogMDtcbiAgICAgICAgbWVzc2FnZS5ydGltZTMyQ3VyID0gKF9wID0gb2JqZWN0LnJ0aW1lMzJDdXIpICE9PSBudWxsICYmIF9wICE9PSB2b2lkIDAgPyBfcCA6IDA7XG4gICAgICAgIG1lc3NhZ2UucnRpbWUzMkV2ZW50U3RhcnQgPSAoX3EgPSBvYmplY3QucnRpbWUzMkV2ZW50U3RhcnQpICE9PSBudWxsICYmIF9xICE9PSB2b2lkIDAgPyBfcSA6IDA7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbn07XG5mdW5jdGlvbiBjcmVhdGVCYXNlT3BlcmF0aW9uYWxTdGF0aXN0aWNEZXNjcmlwdGlvbigpIHtcbiAgICByZXR1cm4geyBuYW1lOiBcIlwiLCBpZGtleTogMCB9O1xufVxuZXhwb3J0cy5PcGVyYXRpb25hbFN0YXRpc3RpY0Rlc2NyaXB0aW9uID0ge1xuICAgIGVuY29kZShtZXNzYWdlLCB3cml0ZXIgPSBtaW5pbWFsXzEuV3JpdGVyLmNyZWF0ZSgpKSB7XG4gICAgICAgIGlmIChtZXNzYWdlLm5hbWUgIT09IFwiXCIpIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMTApLnN0cmluZyhtZXNzYWdlLm5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLmlka2V5ICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDE2KS51aW50MzIobWVzc2FnZS5pZGtleSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9LFxuICAgIGRlY29kZShpbnB1dCwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IGlucHV0IGluc3RhbmNlb2YgbWluaW1hbF8xLlJlYWRlciA/IGlucHV0IDogbmV3IG1pbmltYWxfMS5SZWFkZXIoaW5wdXQpO1xuICAgICAgICBsZXQgZW5kID0gbGVuZ3RoID09PSB1bmRlZmluZWQgPyByZWFkZXIubGVuIDogcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VPcGVyYXRpb25hbFN0YXRpc3RpY0Rlc2NyaXB0aW9uKCk7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBjb25zdCB0YWcgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKHRhZyA+Pj4gMykge1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5uYW1lID0gcmVhZGVyLnN0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuaWRrZXkgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJlYWRlci5za2lwVHlwZSh0YWcgJiA3KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfSxcbiAgICBmcm9tUGFydGlhbChvYmplY3QpIHtcbiAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VPcGVyYXRpb25hbFN0YXRpc3RpY0Rlc2NyaXB0aW9uKCk7XG4gICAgICAgIG1lc3NhZ2UubmFtZSA9IChfYSA9IG9iamVjdC5uYW1lKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBcIlwiO1xuICAgICAgICBtZXNzYWdlLmlka2V5ID0gKF9iID0gb2JqZWN0Lmlka2V5KSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAwO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG59O1xuZnVuY3Rpb24gY3JlYXRlQmFzZU9wZXJhdGlvbmFsU3RhdGlzdGljRWxlbWVudCgpIHtcbiAgICByZXR1cm4geyBpZGtleTogMCwgdmFsdWVzOiBbXSB9O1xufVxuZXhwb3J0cy5PcGVyYXRpb25hbFN0YXRpc3RpY0VsZW1lbnQgPSB7XG4gICAgZW5jb2RlKG1lc3NhZ2UsIHdyaXRlciA9IG1pbmltYWxfMS5Xcml0ZXIuY3JlYXRlKCkpIHtcbiAgICAgICAgaWYgKG1lc3NhZ2UuaWRrZXkgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoOCkudWludDMyKG1lc3NhZ2UuaWRrZXkpO1xuICAgICAgICB9XG4gICAgICAgIHdyaXRlci51aW50MzIoMTgpLmZvcmsoKTtcbiAgICAgICAgZm9yIChjb25zdCB2IG9mIG1lc3NhZ2UudmFsdWVzKSB7XG4gICAgICAgICAgICB3cml0ZXIuaW50MzIodik7XG4gICAgICAgIH1cbiAgICAgICAgd3JpdGVyLmxkZWxpbSgpO1xuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH0sXG4gICAgZGVjb2RlKGlucHV0LCBsZW5ndGgpIHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gaW5wdXQgaW5zdGFuY2VvZiBtaW5pbWFsXzEuUmVhZGVyID8gaW5wdXQgOiBuZXcgbWluaW1hbF8xLlJlYWRlcihpbnB1dCk7XG4gICAgICAgIGxldCBlbmQgPSBsZW5ndGggPT09IHVuZGVmaW5lZCA/IHJlYWRlci5sZW4gOiByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZU9wZXJhdGlvbmFsU3RhdGlzdGljRWxlbWVudCgpO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuaWRrZXkgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgaWYgKCh0YWcgJiA3KSA9PT0gMikge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZW5kMiA9IHJlYWRlci51aW50MzIoKSArIHJlYWRlci5wb3M7XG4gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZDIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnZhbHVlcy5wdXNoKHJlYWRlci5pbnQzMigpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudmFsdWVzLnB1c2gocmVhZGVyLmludDMyKCkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJlYWRlci5za2lwVHlwZSh0YWcgJiA3KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfSxcbiAgICBmcm9tUGFydGlhbChvYmplY3QpIHtcbiAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VPcGVyYXRpb25hbFN0YXRpc3RpY0VsZW1lbnQoKTtcbiAgICAgICAgbWVzc2FnZS5pZGtleSA9IChfYSA9IG9iamVjdC5pZGtleSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMDtcbiAgICAgICAgbWVzc2FnZS52YWx1ZXMgPSAoKF9iID0gb2JqZWN0LnZhbHVlcykgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLm1hcChlID0+IGUpKSB8fCBbXTtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxufTtcbmZ1bmN0aW9uIGNyZWF0ZUJhc2VPcGVyYXRpb25hbFN0YXRpc3RpY3NQYWNrZXQoKSB7XG4gICAgcmV0dXJuIHsgcGFja2V0aWQ6IDAsIG1zdGltZXN0YW1wOiAwLCB2YWx1ZXM6IFtdIH07XG59XG5leHBvcnRzLk9wZXJhdGlvbmFsU3RhdGlzdGljc1BhY2tldCA9IHtcbiAgICBlbmNvZGUobWVzc2FnZSwgd3JpdGVyID0gbWluaW1hbF8xLldyaXRlci5jcmVhdGUoKSkge1xuICAgICAgICBpZiAobWVzc2FnZS5wYWNrZXRpZCAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig4KS5pbnQzMihtZXNzYWdlLnBhY2tldGlkKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5tc3RpbWVzdGFtcCAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigxNikuaW50MzIobWVzc2FnZS5tc3RpbWVzdGFtcCk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCB2IG9mIG1lc3NhZ2UudmFsdWVzKSB7XG4gICAgICAgICAgICBleHBvcnRzLk9wZXJhdGlvbmFsU3RhdGlzdGljRWxlbWVudC5lbmNvZGUodiwgd3JpdGVyLnVpbnQzMigyNikuZm9yaygpKS5sZGVsaW0oKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH0sXG4gICAgZGVjb2RlKGlucHV0LCBsZW5ndGgpIHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gaW5wdXQgaW5zdGFuY2VvZiBtaW5pbWFsXzEuUmVhZGVyID8gaW5wdXQgOiBuZXcgbWluaW1hbF8xLlJlYWRlcihpbnB1dCk7XG4gICAgICAgIGxldCBlbmQgPSBsZW5ndGggPT09IHVuZGVmaW5lZCA/IHJlYWRlci5sZW4gOiByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZU9wZXJhdGlvbmFsU3RhdGlzdGljc1BhY2tldCgpO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UucGFja2V0aWQgPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLm1zdGltZXN0YW1wID0gcmVhZGVyLmludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS52YWx1ZXMucHVzaChleHBvcnRzLk9wZXJhdGlvbmFsU3RhdGlzdGljRWxlbWVudC5kZWNvZGUocmVhZGVyLCByZWFkZXIudWludDMyKCkpKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmVhZGVyLnNraXBUeXBlKHRhZyAmIDcpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9LFxuICAgIGZyb21QYXJ0aWFsKG9iamVjdCkge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYztcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VPcGVyYXRpb25hbFN0YXRpc3RpY3NQYWNrZXQoKTtcbiAgICAgICAgbWVzc2FnZS5wYWNrZXRpZCA9IChfYSA9IG9iamVjdC5wYWNrZXRpZCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMDtcbiAgICAgICAgbWVzc2FnZS5tc3RpbWVzdGFtcCA9IChfYiA9IG9iamVjdC5tc3RpbWVzdGFtcCkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogMDtcbiAgICAgICAgbWVzc2FnZS52YWx1ZXMgPVxuICAgICAgICAgICAgKChfYyA9IG9iamVjdC52YWx1ZXMpID09PSBudWxsIHx8IF9jID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYy5tYXAoZSA9PiBleHBvcnRzLk9wZXJhdGlvbmFsU3RhdGlzdGljRWxlbWVudC5mcm9tUGFydGlhbChlKSkpIHx8IFtdO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG59O1xuZnVuY3Rpb24gY3JlYXRlQmFzZVBsYXllclJhbmtpbmdJbmZvKCkge1xuICAgIHJldHVybiB7XG4gICAgICAgIGFjY291bnRJZDogMCxcbiAgICAgICAgcmFua0lkOiAwLFxuICAgICAgICB3aW5zOiAwLFxuICAgICAgICByYW5rQ2hhbmdlOiAwLFxuICAgICAgICByYW5rVHlwZUlkOiAwLFxuICAgICAgICB0dkNvbnRyb2w6IDBcbiAgICB9O1xufVxuZXhwb3J0cy5QbGF5ZXJSYW5raW5nSW5mbyA9IHtcbiAgICBlbmNvZGUobWVzc2FnZSwgd3JpdGVyID0gbWluaW1hbF8xLldyaXRlci5jcmVhdGUoKSkge1xuICAgICAgICBpZiAobWVzc2FnZS5hY2NvdW50SWQgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoOCkudWludDMyKG1lc3NhZ2UuYWNjb3VudElkKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5yYW5rSWQgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMTYpLnVpbnQzMihtZXNzYWdlLnJhbmtJZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2Uud2lucyAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigyNCkudWludDMyKG1lc3NhZ2Uud2lucyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UucmFua0NoYW5nZSAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigzNykuZmxvYXQobWVzc2FnZS5yYW5rQ2hhbmdlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5yYW5rVHlwZUlkICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDQ4KS51aW50MzIobWVzc2FnZS5yYW5rVHlwZUlkKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS50dkNvbnRyb2wgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoNTYpLnVpbnQzMihtZXNzYWdlLnR2Q29udHJvbCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9LFxuICAgIGRlY29kZShpbnB1dCwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IGlucHV0IGluc3RhbmNlb2YgbWluaW1hbF8xLlJlYWRlciA/IGlucHV0IDogbmV3IG1pbmltYWxfMS5SZWFkZXIoaW5wdXQpO1xuICAgICAgICBsZXQgZW5kID0gbGVuZ3RoID09PSB1bmRlZmluZWQgPyByZWFkZXIubGVuIDogcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VQbGF5ZXJSYW5raW5nSW5mbygpO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuYWNjb3VudElkID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UucmFua0lkID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Uud2lucyA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnJhbmtDaGFuZ2UgPSByZWFkZXIuZmxvYXQoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnJhbmtUeXBlSWQgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNzpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS50dkNvbnRyb2wgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJlYWRlci5za2lwVHlwZSh0YWcgJiA3KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfSxcbiAgICBmcm9tUGFydGlhbChvYmplY3QpIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2MsIF9kLCBfZSwgX2Y7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlUGxheWVyUmFua2luZ0luZm8oKTtcbiAgICAgICAgbWVzc2FnZS5hY2NvdW50SWQgPSAoX2EgPSBvYmplY3QuYWNjb3VudElkKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAwO1xuICAgICAgICBtZXNzYWdlLnJhbmtJZCA9IChfYiA9IG9iamVjdC5yYW5rSWQpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IDA7XG4gICAgICAgIG1lc3NhZ2Uud2lucyA9IChfYyA9IG9iamVjdC53aW5zKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiAwO1xuICAgICAgICBtZXNzYWdlLnJhbmtDaGFuZ2UgPSAoX2QgPSBvYmplY3QucmFua0NoYW5nZSkgIT09IG51bGwgJiYgX2QgIT09IHZvaWQgMCA/IF9kIDogMDtcbiAgICAgICAgbWVzc2FnZS5yYW5rVHlwZUlkID0gKF9lID0gb2JqZWN0LnJhbmtUeXBlSWQpICE9PSBudWxsICYmIF9lICE9PSB2b2lkIDAgPyBfZSA6IDA7XG4gICAgICAgIG1lc3NhZ2UudHZDb250cm9sID0gKF9mID0gb2JqZWN0LnR2Q29udHJvbCkgIT09IG51bGwgJiYgX2YgIT09IHZvaWQgMCA/IF9mIDogMDtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxufTtcbmZ1bmN0aW9uIGNyZWF0ZUJhc2VQbGF5ZXJDb21tZW5kYXRpb25JbmZvKCkge1xuICAgIHJldHVybiB7IGNtZEZyaWVuZGx5OiAwLCBjbWRUZWFjaGluZzogMCwgY21kTGVhZGVyOiAwIH07XG59XG5leHBvcnRzLlBsYXllckNvbW1lbmRhdGlvbkluZm8gPSB7XG4gICAgZW5jb2RlKG1lc3NhZ2UsIHdyaXRlciA9IG1pbmltYWxfMS5Xcml0ZXIuY3JlYXRlKCkpIHtcbiAgICAgICAgaWYgKG1lc3NhZ2UuY21kRnJpZW5kbHkgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoOCkudWludDMyKG1lc3NhZ2UuY21kRnJpZW5kbHkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLmNtZFRlYWNoaW5nICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDE2KS51aW50MzIobWVzc2FnZS5jbWRUZWFjaGluZyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UuY21kTGVhZGVyICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDMyKS51aW50MzIobWVzc2FnZS5jbWRMZWFkZXIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfSxcbiAgICBkZWNvZGUoaW5wdXQsIGxlbmd0aCkge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBpbnB1dCBpbnN0YW5jZW9mIG1pbmltYWxfMS5SZWFkZXIgPyBpbnB1dCA6IG5ldyBtaW5pbWFsXzEuUmVhZGVyKGlucHV0KTtcbiAgICAgICAgbGV0IGVuZCA9IGxlbmd0aCA9PT0gdW5kZWZpbmVkID8gcmVhZGVyLmxlbiA6IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlUGxheWVyQ29tbWVuZGF0aW9uSW5mbygpO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuY21kRnJpZW5kbHkgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5jbWRUZWFjaGluZyA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmNtZExlYWRlciA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmVhZGVyLnNraXBUeXBlKHRhZyAmIDcpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9LFxuICAgIGZyb21QYXJ0aWFsKG9iamVjdCkge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYztcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VQbGF5ZXJDb21tZW5kYXRpb25JbmZvKCk7XG4gICAgICAgIG1lc3NhZ2UuY21kRnJpZW5kbHkgPSAoX2EgPSBvYmplY3QuY21kRnJpZW5kbHkpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IDA7XG4gICAgICAgIG1lc3NhZ2UuY21kVGVhY2hpbmcgPSAoX2IgPSBvYmplY3QuY21kVGVhY2hpbmcpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IDA7XG4gICAgICAgIG1lc3NhZ2UuY21kTGVhZGVyID0gKF9jID0gb2JqZWN0LmNtZExlYWRlcikgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogMDtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxufTtcbmZ1bmN0aW9uIGNyZWF0ZUJhc2VQbGF5ZXJNZWRhbHNJbmZvKCkge1xuICAgIHJldHVybiB7IGRpc3BsYXlJdGVtc0RlZmlkeDogW10sIGZlYXR1cmVkRGlzcGxheUl0ZW1EZWZpZHg6IDAgfTtcbn1cbmV4cG9ydHMuUGxheWVyTWVkYWxzSW5mbyA9IHtcbiAgICBlbmNvZGUobWVzc2FnZSwgd3JpdGVyID0gbWluaW1hbF8xLldyaXRlci5jcmVhdGUoKSkge1xuICAgICAgICB3cml0ZXIudWludDMyKDU4KS5mb3JrKCk7XG4gICAgICAgIGZvciAoY29uc3QgdiBvZiBtZXNzYWdlLmRpc3BsYXlJdGVtc0RlZmlkeCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMih2KTtcbiAgICAgICAgfVxuICAgICAgICB3cml0ZXIubGRlbGltKCk7XG4gICAgICAgIGlmIChtZXNzYWdlLmZlYXR1cmVkRGlzcGxheUl0ZW1EZWZpZHggIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoNjQpLnVpbnQzMihtZXNzYWdlLmZlYXR1cmVkRGlzcGxheUl0ZW1EZWZpZHgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfSxcbiAgICBkZWNvZGUoaW5wdXQsIGxlbmd0aCkge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBpbnB1dCBpbnN0YW5jZW9mIG1pbmltYWxfMS5SZWFkZXIgPyBpbnB1dCA6IG5ldyBtaW5pbWFsXzEuUmVhZGVyKGlucHV0KTtcbiAgICAgICAgbGV0IGVuZCA9IGxlbmd0aCA9PT0gdW5kZWZpbmVkID8gcmVhZGVyLmxlbiA6IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlUGxheWVyTWVkYWxzSW5mbygpO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgICAgICAgICAgIGlmICgodGFnICYgNykgPT09IDIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuZDIgPSByZWFkZXIudWludDMyKCkgKyByZWFkZXIucG9zO1xuICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5kaXNwbGF5SXRlbXNEZWZpZHgucHVzaChyZWFkZXIudWludDMyKCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5kaXNwbGF5SXRlbXNEZWZpZHgucHVzaChyZWFkZXIudWludDMyKCkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgODpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5mZWF0dXJlZERpc3BsYXlJdGVtRGVmaWR4ID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICByZWFkZXIuc2tpcFR5cGUodGFnICYgNyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH0sXG4gICAgZnJvbVBhcnRpYWwob2JqZWN0KSB7XG4gICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlUGxheWVyTWVkYWxzSW5mbygpO1xuICAgICAgICBtZXNzYWdlLmRpc3BsYXlJdGVtc0RlZmlkeCA9ICgoX2EgPSBvYmplY3QuZGlzcGxheUl0ZW1zRGVmaWR4KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EubWFwKGUgPT4gZSkpIHx8IFtdO1xuICAgICAgICBtZXNzYWdlLmZlYXR1cmVkRGlzcGxheUl0ZW1EZWZpZHggPSAoX2IgPSBvYmplY3QuZmVhdHVyZWREaXNwbGF5SXRlbURlZmlkeCkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogMDtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxufTtcbmZ1bmN0aW9uIGNyZWF0ZUJhc2VBY2NvdW50QWN0aXZpdHkoKSB7XG4gICAgcmV0dXJuIHsgYWN0aXZpdHk6IDAsIG1vZGU6IDAsIG1hcDogMCwgbWF0Y2hpZDogTG9uZy5VWkVSTyB9O1xufVxuZXhwb3J0cy5BY2NvdW50QWN0aXZpdHkgPSB7XG4gICAgZW5jb2RlKG1lc3NhZ2UsIHdyaXRlciA9IG1pbmltYWxfMS5Xcml0ZXIuY3JlYXRlKCkpIHtcbiAgICAgICAgaWYgKG1lc3NhZ2UuYWN0aXZpdHkgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoOCkudWludDMyKG1lc3NhZ2UuYWN0aXZpdHkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLm1vZGUgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMTYpLnVpbnQzMihtZXNzYWdlLm1vZGUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLm1hcCAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigyNCkudWludDMyKG1lc3NhZ2UubWFwKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIW1lc3NhZ2UubWF0Y2hpZC5pc1plcm8oKSkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigzMikudWludDY0KG1lc3NhZ2UubWF0Y2hpZCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9LFxuICAgIGRlY29kZShpbnB1dCwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IGlucHV0IGluc3RhbmNlb2YgbWluaW1hbF8xLlJlYWRlciA/IGlucHV0IDogbmV3IG1pbmltYWxfMS5SZWFkZXIoaW5wdXQpO1xuICAgICAgICBsZXQgZW5kID0gbGVuZ3RoID09PSB1bmRlZmluZWQgPyByZWFkZXIubGVuIDogcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VBY2NvdW50QWN0aXZpdHkoKTtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhZyA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgIHN3aXRjaCAodGFnID4+PiAzKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmFjdGl2aXR5ID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UubW9kZSA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLm1hcCA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLm1hdGNoaWQgPSByZWFkZXIudWludDY0KCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJlYWRlci5za2lwVHlwZSh0YWcgJiA3KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfSxcbiAgICBmcm9tUGFydGlhbChvYmplY3QpIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2M7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQWNjb3VudEFjdGl2aXR5KCk7XG4gICAgICAgIG1lc3NhZ2UuYWN0aXZpdHkgPSAoX2EgPSBvYmplY3QuYWN0aXZpdHkpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IDA7XG4gICAgICAgIG1lc3NhZ2UubW9kZSA9IChfYiA9IG9iamVjdC5tb2RlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAwO1xuICAgICAgICBtZXNzYWdlLm1hcCA9IChfYyA9IG9iamVjdC5tYXApICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IDA7XG4gICAgICAgIG1lc3NhZ2UubWF0Y2hpZCA9XG4gICAgICAgICAgICBvYmplY3QubWF0Y2hpZCAhPT0gdW5kZWZpbmVkICYmIG9iamVjdC5tYXRjaGlkICE9PSBudWxsXG4gICAgICAgICAgICAgICAgPyBMb25nLmZyb21WYWx1ZShvYmplY3QubWF0Y2hpZClcbiAgICAgICAgICAgICAgICA6IExvbmcuVVpFUk87XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbn07XG5mdW5jdGlvbiBjcmVhdGVCYXNlVG91cm5hbWVudE1hdGNoU2V0dXAoKSB7XG4gICAgcmV0dXJuIHsgZXZlbnRJZDogMCwgdGVhbUlkQ3Q6IDAsIHRlYW1JZFQ6IDAsIGV2ZW50U3RhZ2VJZDogMCB9O1xufVxuZXhwb3J0cy5Ub3VybmFtZW50TWF0Y2hTZXR1cCA9IHtcbiAgICBlbmNvZGUobWVzc2FnZSwgd3JpdGVyID0gbWluaW1hbF8xLldyaXRlci5jcmVhdGUoKSkge1xuICAgICAgICBpZiAobWVzc2FnZS5ldmVudElkICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDgpLmludDMyKG1lc3NhZ2UuZXZlbnRJZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UudGVhbUlkQ3QgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMTYpLmludDMyKG1lc3NhZ2UudGVhbUlkQ3QpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLnRlYW1JZFQgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMjQpLmludDMyKG1lc3NhZ2UudGVhbUlkVCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UuZXZlbnRTdGFnZUlkICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDMyKS5pbnQzMihtZXNzYWdlLmV2ZW50U3RhZ2VJZCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9LFxuICAgIGRlY29kZShpbnB1dCwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IGlucHV0IGluc3RhbmNlb2YgbWluaW1hbF8xLlJlYWRlciA/IGlucHV0IDogbmV3IG1pbmltYWxfMS5SZWFkZXIoaW5wdXQpO1xuICAgICAgICBsZXQgZW5kID0gbGVuZ3RoID09PSB1bmRlZmluZWQgPyByZWFkZXIubGVuIDogcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VUb3VybmFtZW50TWF0Y2hTZXR1cCgpO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZXZlbnRJZCA9IHJlYWRlci5pbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudGVhbUlkQ3QgPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnRlYW1JZFQgPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmV2ZW50U3RhZ2VJZCA9IHJlYWRlci5pbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICByZWFkZXIuc2tpcFR5cGUodGFnICYgNyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH0sXG4gICAgZnJvbVBhcnRpYWwob2JqZWN0KSB7XG4gICAgICAgIHZhciBfYSwgX2IsIF9jLCBfZDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VUb3VybmFtZW50TWF0Y2hTZXR1cCgpO1xuICAgICAgICBtZXNzYWdlLmV2ZW50SWQgPSAoX2EgPSBvYmplY3QuZXZlbnRJZCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMDtcbiAgICAgICAgbWVzc2FnZS50ZWFtSWRDdCA9IChfYiA9IG9iamVjdC50ZWFtSWRDdCkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogMDtcbiAgICAgICAgbWVzc2FnZS50ZWFtSWRUID0gKF9jID0gb2JqZWN0LnRlYW1JZFQpICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IDA7XG4gICAgICAgIG1lc3NhZ2UuZXZlbnRTdGFnZUlkID0gKF9kID0gb2JqZWN0LmV2ZW50U3RhZ2VJZCkgIT09IG51bGwgJiYgX2QgIT09IHZvaWQgMCA/IF9kIDogMDtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxufTtcbmZ1bmN0aW9uIGNyZWF0ZUJhc2VTZXJ2ZXJIbHR2SW5mbygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICB0dlVkcFBvcnQ6IDAsXG4gICAgICAgIHR2V2F0Y2hLZXk6IExvbmcuVVpFUk8sXG4gICAgICAgIHR2U2xvdHM6IDAsXG4gICAgICAgIHR2Q2xpZW50czogMCxcbiAgICAgICAgdHZQcm94aWVzOiAwLFxuICAgICAgICB0dlRpbWU6IDAsXG4gICAgICAgIGdhbWVUeXBlOiAwLFxuICAgICAgICBnYW1lTWFwZ3JvdXA6IFwiXCIsXG4gICAgICAgIGdhbWVNYXA6IFwiXCIsXG4gICAgICAgIHR2TWFzdGVyU3RlYW1pZDogTG9uZy5VWkVSTyxcbiAgICAgICAgdHZMb2NhbFNsb3RzOiAwLFxuICAgICAgICB0dkxvY2FsQ2xpZW50czogMCxcbiAgICAgICAgdHZMb2NhbFByb3hpZXM6IDAsXG4gICAgICAgIHR2UmVsYXlTbG90czogMCxcbiAgICAgICAgdHZSZWxheUNsaWVudHM6IDAsXG4gICAgICAgIHR2UmVsYXlQcm94aWVzOiAwLFxuICAgICAgICB0dlJlbGF5QWRkcmVzczogMCxcbiAgICAgICAgdHZSZWxheVBvcnQ6IDAsXG4gICAgICAgIHR2UmVsYXlTdGVhbWlkOiBMb25nLlVaRVJPLFxuICAgICAgICBmbGFnczogMFxuICAgIH07XG59XG5leHBvcnRzLlNlcnZlckhsdHZJbmZvID0ge1xuICAgIGVuY29kZShtZXNzYWdlLCB3cml0ZXIgPSBtaW5pbWFsXzEuV3JpdGVyLmNyZWF0ZSgpKSB7XG4gICAgICAgIGlmIChtZXNzYWdlLnR2VWRwUG9ydCAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig4KS51aW50MzIobWVzc2FnZS50dlVkcFBvcnQpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghbWVzc2FnZS50dldhdGNoS2V5LmlzWmVybygpKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDE2KS51aW50NjQobWVzc2FnZS50dldhdGNoS2V5KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS50dlNsb3RzICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDI0KS51aW50MzIobWVzc2FnZS50dlNsb3RzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS50dkNsaWVudHMgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMzIpLnVpbnQzMihtZXNzYWdlLnR2Q2xpZW50cyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UudHZQcm94aWVzICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDQwKS51aW50MzIobWVzc2FnZS50dlByb3hpZXMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLnR2VGltZSAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig0OCkudWludDMyKG1lc3NhZ2UudHZUaW1lKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5nYW1lVHlwZSAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig2NCkudWludDMyKG1lc3NhZ2UuZ2FtZVR5cGUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLmdhbWVNYXBncm91cCAhPT0gXCJcIikge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig3NCkuc3RyaW5nKG1lc3NhZ2UuZ2FtZU1hcGdyb3VwKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5nYW1lTWFwICE9PSBcIlwiKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDgyKS5zdHJpbmcobWVzc2FnZS5nYW1lTWFwKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIW1lc3NhZ2UudHZNYXN0ZXJTdGVhbWlkLmlzWmVybygpKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDg4KS51aW50NjQobWVzc2FnZS50dk1hc3RlclN0ZWFtaWQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLnR2TG9jYWxTbG90cyAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig5NikudWludDMyKG1lc3NhZ2UudHZMb2NhbFNsb3RzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS50dkxvY2FsQ2xpZW50cyAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigxMDQpLnVpbnQzMihtZXNzYWdlLnR2TG9jYWxDbGllbnRzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS50dkxvY2FsUHJveGllcyAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigxMTIpLnVpbnQzMihtZXNzYWdlLnR2TG9jYWxQcm94aWVzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS50dlJlbGF5U2xvdHMgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMTIwKS51aW50MzIobWVzc2FnZS50dlJlbGF5U2xvdHMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLnR2UmVsYXlDbGllbnRzICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDEyOCkudWludDMyKG1lc3NhZ2UudHZSZWxheUNsaWVudHMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLnR2UmVsYXlQcm94aWVzICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDEzNikudWludDMyKG1lc3NhZ2UudHZSZWxheVByb3hpZXMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLnR2UmVsYXlBZGRyZXNzICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDE0NCkudWludDMyKG1lc3NhZ2UudHZSZWxheUFkZHJlc3MpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLnR2UmVsYXlQb3J0ICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDE1MikudWludDMyKG1lc3NhZ2UudHZSZWxheVBvcnQpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghbWVzc2FnZS50dlJlbGF5U3RlYW1pZC5pc1plcm8oKSkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigxNjApLnVpbnQ2NChtZXNzYWdlLnR2UmVsYXlTdGVhbWlkKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5mbGFncyAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigxNjgpLnVpbnQzMihtZXNzYWdlLmZsYWdzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH0sXG4gICAgZGVjb2RlKGlucHV0LCBsZW5ndGgpIHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gaW5wdXQgaW5zdGFuY2VvZiBtaW5pbWFsXzEuUmVhZGVyID8gaW5wdXQgOiBuZXcgbWluaW1hbF8xLlJlYWRlcihpbnB1dCk7XG4gICAgICAgIGxldCBlbmQgPSBsZW5ndGggPT09IHVuZGVmaW5lZCA/IHJlYWRlci5sZW4gOiByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZVNlcnZlckhsdHZJbmZvKCk7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBjb25zdCB0YWcgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKHRhZyA+Pj4gMykge1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS50dlVkcFBvcnQgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS50dldhdGNoS2V5ID0gcmVhZGVyLnVpbnQ2NCgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudHZTbG90cyA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnR2Q2xpZW50cyA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnR2UHJveGllcyA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnR2VGltZSA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA4OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmdhbWVUeXBlID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDk6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZ2FtZU1hcGdyb3VwID0gcmVhZGVyLnN0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDEwOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmdhbWVNYXAgPSByZWFkZXIuc3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMTE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudHZNYXN0ZXJTdGVhbWlkID0gcmVhZGVyLnVpbnQ2NCgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDEyOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnR2TG9jYWxTbG90cyA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAxMzpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS50dkxvY2FsQ2xpZW50cyA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAxNDpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS50dkxvY2FsUHJveGllcyA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAxNTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS50dlJlbGF5U2xvdHMgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMTY6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudHZSZWxheUNsaWVudHMgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMTc6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudHZSZWxheVByb3hpZXMgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMTg6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudHZSZWxheUFkZHJlc3MgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMTk6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudHZSZWxheVBvcnQgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMjA6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudHZSZWxheVN0ZWFtaWQgPSByZWFkZXIudWludDY0KCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMjE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZmxhZ3MgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJlYWRlci5za2lwVHlwZSh0YWcgJiA3KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfSxcbiAgICBmcm9tUGFydGlhbChvYmplY3QpIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2MsIF9kLCBfZSwgX2YsIF9nLCBfaCwgX2osIF9rLCBfbCwgX20sIF9vLCBfcCwgX3EsIF9yLCBfcztcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VTZXJ2ZXJIbHR2SW5mbygpO1xuICAgICAgICBtZXNzYWdlLnR2VWRwUG9ydCA9IChfYSA9IG9iamVjdC50dlVkcFBvcnQpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IDA7XG4gICAgICAgIG1lc3NhZ2UudHZXYXRjaEtleSA9XG4gICAgICAgICAgICBvYmplY3QudHZXYXRjaEtleSAhPT0gdW5kZWZpbmVkICYmIG9iamVjdC50dldhdGNoS2V5ICE9PSBudWxsXG4gICAgICAgICAgICAgICAgPyBMb25nLmZyb21WYWx1ZShvYmplY3QudHZXYXRjaEtleSlcbiAgICAgICAgICAgICAgICA6IExvbmcuVVpFUk87XG4gICAgICAgIG1lc3NhZ2UudHZTbG90cyA9IChfYiA9IG9iamVjdC50dlNsb3RzKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAwO1xuICAgICAgICBtZXNzYWdlLnR2Q2xpZW50cyA9IChfYyA9IG9iamVjdC50dkNsaWVudHMpICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IDA7XG4gICAgICAgIG1lc3NhZ2UudHZQcm94aWVzID0gKF9kID0gb2JqZWN0LnR2UHJveGllcykgIT09IG51bGwgJiYgX2QgIT09IHZvaWQgMCA/IF9kIDogMDtcbiAgICAgICAgbWVzc2FnZS50dlRpbWUgPSAoX2UgPSBvYmplY3QudHZUaW1lKSAhPT0gbnVsbCAmJiBfZSAhPT0gdm9pZCAwID8gX2UgOiAwO1xuICAgICAgICBtZXNzYWdlLmdhbWVUeXBlID0gKF9mID0gb2JqZWN0LmdhbWVUeXBlKSAhPT0gbnVsbCAmJiBfZiAhPT0gdm9pZCAwID8gX2YgOiAwO1xuICAgICAgICBtZXNzYWdlLmdhbWVNYXBncm91cCA9IChfZyA9IG9iamVjdC5nYW1lTWFwZ3JvdXApICE9PSBudWxsICYmIF9nICE9PSB2b2lkIDAgPyBfZyA6IFwiXCI7XG4gICAgICAgIG1lc3NhZ2UuZ2FtZU1hcCA9IChfaCA9IG9iamVjdC5nYW1lTWFwKSAhPT0gbnVsbCAmJiBfaCAhPT0gdm9pZCAwID8gX2ggOiBcIlwiO1xuICAgICAgICBtZXNzYWdlLnR2TWFzdGVyU3RlYW1pZCA9XG4gICAgICAgICAgICBvYmplY3QudHZNYXN0ZXJTdGVhbWlkICE9PSB1bmRlZmluZWQgJiYgb2JqZWN0LnR2TWFzdGVyU3RlYW1pZCAhPT0gbnVsbFxuICAgICAgICAgICAgICAgID8gTG9uZy5mcm9tVmFsdWUob2JqZWN0LnR2TWFzdGVyU3RlYW1pZClcbiAgICAgICAgICAgICAgICA6IExvbmcuVVpFUk87XG4gICAgICAgIG1lc3NhZ2UudHZMb2NhbFNsb3RzID0gKF9qID0gb2JqZWN0LnR2TG9jYWxTbG90cykgIT09IG51bGwgJiYgX2ogIT09IHZvaWQgMCA/IF9qIDogMDtcbiAgICAgICAgbWVzc2FnZS50dkxvY2FsQ2xpZW50cyA9IChfayA9IG9iamVjdC50dkxvY2FsQ2xpZW50cykgIT09IG51bGwgJiYgX2sgIT09IHZvaWQgMCA/IF9rIDogMDtcbiAgICAgICAgbWVzc2FnZS50dkxvY2FsUHJveGllcyA9IChfbCA9IG9iamVjdC50dkxvY2FsUHJveGllcykgIT09IG51bGwgJiYgX2wgIT09IHZvaWQgMCA/IF9sIDogMDtcbiAgICAgICAgbWVzc2FnZS50dlJlbGF5U2xvdHMgPSAoX20gPSBvYmplY3QudHZSZWxheVNsb3RzKSAhPT0gbnVsbCAmJiBfbSAhPT0gdm9pZCAwID8gX20gOiAwO1xuICAgICAgICBtZXNzYWdlLnR2UmVsYXlDbGllbnRzID0gKF9vID0gb2JqZWN0LnR2UmVsYXlDbGllbnRzKSAhPT0gbnVsbCAmJiBfbyAhPT0gdm9pZCAwID8gX28gOiAwO1xuICAgICAgICBtZXNzYWdlLnR2UmVsYXlQcm94aWVzID0gKF9wID0gb2JqZWN0LnR2UmVsYXlQcm94aWVzKSAhPT0gbnVsbCAmJiBfcCAhPT0gdm9pZCAwID8gX3AgOiAwO1xuICAgICAgICBtZXNzYWdlLnR2UmVsYXlBZGRyZXNzID0gKF9xID0gb2JqZWN0LnR2UmVsYXlBZGRyZXNzKSAhPT0gbnVsbCAmJiBfcSAhPT0gdm9pZCAwID8gX3EgOiAwO1xuICAgICAgICBtZXNzYWdlLnR2UmVsYXlQb3J0ID0gKF9yID0gb2JqZWN0LnR2UmVsYXlQb3J0KSAhPT0gbnVsbCAmJiBfciAhPT0gdm9pZCAwID8gX3IgOiAwO1xuICAgICAgICBtZXNzYWdlLnR2UmVsYXlTdGVhbWlkID1cbiAgICAgICAgICAgIG9iamVjdC50dlJlbGF5U3RlYW1pZCAhPT0gdW5kZWZpbmVkICYmIG9iamVjdC50dlJlbGF5U3RlYW1pZCAhPT0gbnVsbFxuICAgICAgICAgICAgICAgID8gTG9uZy5mcm9tVmFsdWUob2JqZWN0LnR2UmVsYXlTdGVhbWlkKVxuICAgICAgICAgICAgICAgIDogTG9uZy5VWkVSTztcbiAgICAgICAgbWVzc2FnZS5mbGFncyA9IChfcyA9IG9iamVjdC5mbGFncykgIT09IG51bGwgJiYgX3MgIT09IHZvaWQgMCA/IF9zIDogMDtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxufTtcbmZ1bmN0aW9uIGNyZWF0ZUJhc2VJcEFkZHJlc3NNYXNrKCkge1xuICAgIHJldHVybiB7IGE6IDAsIGI6IDAsIGM6IDAsIGQ6IDAsIGJpdHM6IDAsIHRva2VuOiAwIH07XG59XG5leHBvcnRzLklwQWRkcmVzc01hc2sgPSB7XG4gICAgZW5jb2RlKG1lc3NhZ2UsIHdyaXRlciA9IG1pbmltYWxfMS5Xcml0ZXIuY3JlYXRlKCkpIHtcbiAgICAgICAgaWYgKG1lc3NhZ2UuYSAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig4KS51aW50MzIobWVzc2FnZS5hKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5iICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDE2KS51aW50MzIobWVzc2FnZS5iKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5jICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDI0KS51aW50MzIobWVzc2FnZS5jKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5kICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDMyKS51aW50MzIobWVzc2FnZS5kKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5iaXRzICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDQwKS51aW50MzIobWVzc2FnZS5iaXRzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS50b2tlbiAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig0OCkudWludDMyKG1lc3NhZ2UudG9rZW4pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfSxcbiAgICBkZWNvZGUoaW5wdXQsIGxlbmd0aCkge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBpbnB1dCBpbnN0YW5jZW9mIG1pbmltYWxfMS5SZWFkZXIgPyBpbnB1dCA6IG5ldyBtaW5pbWFsXzEuUmVhZGVyKGlucHV0KTtcbiAgICAgICAgbGV0IGVuZCA9IGxlbmd0aCA9PT0gdW5kZWZpbmVkID8gcmVhZGVyLmxlbiA6IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlSXBBZGRyZXNzTWFzaygpO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuYSA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmIgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5jID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZCA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmJpdHMgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS50b2tlbiA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmVhZGVyLnNraXBUeXBlKHRhZyAmIDcpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9LFxuICAgIGZyb21QYXJ0aWFsKG9iamVjdCkge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYywgX2QsIF9lLCBfZjtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VJcEFkZHJlc3NNYXNrKCk7XG4gICAgICAgIG1lc3NhZ2UuYSA9IChfYSA9IG9iamVjdC5hKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAwO1xuICAgICAgICBtZXNzYWdlLmIgPSAoX2IgPSBvYmplY3QuYikgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogMDtcbiAgICAgICAgbWVzc2FnZS5jID0gKF9jID0gb2JqZWN0LmMpICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IDA7XG4gICAgICAgIG1lc3NhZ2UuZCA9IChfZCA9IG9iamVjdC5kKSAhPT0gbnVsbCAmJiBfZCAhPT0gdm9pZCAwID8gX2QgOiAwO1xuICAgICAgICBtZXNzYWdlLmJpdHMgPSAoX2UgPSBvYmplY3QuYml0cykgIT09IG51bGwgJiYgX2UgIT09IHZvaWQgMCA/IF9lIDogMDtcbiAgICAgICAgbWVzc2FnZS50b2tlbiA9IChfZiA9IG9iamVjdC50b2tlbikgIT09IG51bGwgJiYgX2YgIT09IHZvaWQgMCA/IF9mIDogMDtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxufTtcbmZ1bmN0aW9uIGNyZWF0ZUJhc2VDTXNnQ3Nnb1N0ZWFtVXNlclN0YXRDaGFuZ2UoKSB7XG4gICAgcmV0dXJuIHsgZWNzZ29zdGVhbXVzZXJzdGF0OiAwLCBkZWx0YTogMCwgYWJzb2x1dGU6IGZhbHNlIH07XG59XG5leHBvcnRzLkNNc2dDc2dvU3RlYW1Vc2VyU3RhdENoYW5nZSA9IHtcbiAgICBlbmNvZGUobWVzc2FnZSwgd3JpdGVyID0gbWluaW1hbF8xLldyaXRlci5jcmVhdGUoKSkge1xuICAgICAgICBpZiAobWVzc2FnZS5lY3Nnb3N0ZWFtdXNlcnN0YXQgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoOCkuaW50MzIobWVzc2FnZS5lY3Nnb3N0ZWFtdXNlcnN0YXQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLmRlbHRhICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDE2KS5pbnQzMihtZXNzYWdlLmRlbHRhKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5hYnNvbHV0ZSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigyNCkuYm9vbChtZXNzYWdlLmFic29sdXRlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH0sXG4gICAgZGVjb2RlKGlucHV0LCBsZW5ndGgpIHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gaW5wdXQgaW5zdGFuY2VvZiBtaW5pbWFsXzEuUmVhZGVyID8gaW5wdXQgOiBuZXcgbWluaW1hbF8xLlJlYWRlcihpbnB1dCk7XG4gICAgICAgIGxldCBlbmQgPSBsZW5ndGggPT09IHVuZGVmaW5lZCA/IHJlYWRlci5sZW4gOiByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNNc2dDc2dvU3RlYW1Vc2VyU3RhdENoYW5nZSgpO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZWNzZ29zdGVhbXVzZXJzdGF0ID0gcmVhZGVyLmludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5kZWx0YSA9IHJlYWRlci5pbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuYWJzb2x1dGUgPSByZWFkZXIuYm9vbCgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICByZWFkZXIuc2tpcFR5cGUodGFnICYgNyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH0sXG4gICAgZnJvbVBhcnRpYWwob2JqZWN0KSB7XG4gICAgICAgIHZhciBfYSwgX2IsIF9jO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNNc2dDc2dvU3RlYW1Vc2VyU3RhdENoYW5nZSgpO1xuICAgICAgICBtZXNzYWdlLmVjc2dvc3RlYW11c2Vyc3RhdCA9IChfYSA9IG9iamVjdC5lY3Nnb3N0ZWFtdXNlcnN0YXQpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IDA7XG4gICAgICAgIG1lc3NhZ2UuZGVsdGEgPSAoX2IgPSBvYmplY3QuZGVsdGEpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IDA7XG4gICAgICAgIG1lc3NhZ2UuYWJzb2x1dGUgPSAoX2MgPSBvYmplY3QuYWJzb2x1dGUpICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IGZhbHNlO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG59O1xuZnVuY3Rpb24gY3JlYXRlQmFzZVhwUHJvZ3Jlc3NEYXRhKCkge1xuICAgIHJldHVybiB7IHhwUG9pbnRzOiAwLCB4cENhdGVnb3J5OiAwIH07XG59XG5leHBvcnRzLlhwUHJvZ3Jlc3NEYXRhID0ge1xuICAgIGVuY29kZShtZXNzYWdlLCB3cml0ZXIgPSBtaW5pbWFsXzEuV3JpdGVyLmNyZWF0ZSgpKSB7XG4gICAgICAgIGlmIChtZXNzYWdlLnhwUG9pbnRzICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDgpLnVpbnQzMihtZXNzYWdlLnhwUG9pbnRzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS54cENhdGVnb3J5ICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDE2KS5pbnQzMihtZXNzYWdlLnhwQ2F0ZWdvcnkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfSxcbiAgICBkZWNvZGUoaW5wdXQsIGxlbmd0aCkge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBpbnB1dCBpbnN0YW5jZW9mIG1pbmltYWxfMS5SZWFkZXIgPyBpbnB1dCA6IG5ldyBtaW5pbWFsXzEuUmVhZGVyKGlucHV0KTtcbiAgICAgICAgbGV0IGVuZCA9IGxlbmd0aCA9PT0gdW5kZWZpbmVkID8gcmVhZGVyLmxlbiA6IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlWHBQcm9ncmVzc0RhdGEoKTtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhZyA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgIHN3aXRjaCAodGFnID4+PiAzKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnhwUG9pbnRzID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UueHBDYXRlZ29yeSA9IHJlYWRlci5pbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICByZWFkZXIuc2tpcFR5cGUodGFnICYgNyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH0sXG4gICAgZnJvbVBhcnRpYWwob2JqZWN0KSB7XG4gICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlWHBQcm9ncmVzc0RhdGEoKTtcbiAgICAgICAgbWVzc2FnZS54cFBvaW50cyA9IChfYSA9IG9iamVjdC54cFBvaW50cykgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMDtcbiAgICAgICAgbWVzc2FnZS54cENhdGVnb3J5ID0gKF9iID0gb2JqZWN0LnhwQ2F0ZWdvcnkpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IDA7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbn07XG5mdW5jdGlvbiBjcmVhdGVCYXNlTWF0Y2hFbmRJdGVtVXBkYXRlcygpIHtcbiAgICByZXR1cm4geyBpdGVtSWQ6IExvbmcuVVpFUk8sIGl0ZW1BdHRyRGVmaWR4OiAwLCBpdGVtQXR0ckRlbHRhVmFsdWU6IDAgfTtcbn1cbmV4cG9ydHMuTWF0Y2hFbmRJdGVtVXBkYXRlcyA9IHtcbiAgICBlbmNvZGUobWVzc2FnZSwgd3JpdGVyID0gbWluaW1hbF8xLldyaXRlci5jcmVhdGUoKSkge1xuICAgICAgICBpZiAoIW1lc3NhZ2UuaXRlbUlkLmlzWmVybygpKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDgpLnVpbnQ2NChtZXNzYWdlLml0ZW1JZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UuaXRlbUF0dHJEZWZpZHggIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMTYpLnVpbnQzMihtZXNzYWdlLml0ZW1BdHRyRGVmaWR4KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5pdGVtQXR0ckRlbHRhVmFsdWUgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMjQpLnVpbnQzMihtZXNzYWdlLml0ZW1BdHRyRGVsdGFWYWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9LFxuICAgIGRlY29kZShpbnB1dCwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IGlucHV0IGluc3RhbmNlb2YgbWluaW1hbF8xLlJlYWRlciA/IGlucHV0IDogbmV3IG1pbmltYWxfMS5SZWFkZXIoaW5wdXQpO1xuICAgICAgICBsZXQgZW5kID0gbGVuZ3RoID09PSB1bmRlZmluZWQgPyByZWFkZXIubGVuIDogcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VNYXRjaEVuZEl0ZW1VcGRhdGVzKCk7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBjb25zdCB0YWcgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKHRhZyA+Pj4gMykge1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5pdGVtSWQgPSByZWFkZXIudWludDY0KCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5pdGVtQXR0ckRlZmlkeCA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLml0ZW1BdHRyRGVsdGFWYWx1ZSA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmVhZGVyLnNraXBUeXBlKHRhZyAmIDcpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9LFxuICAgIGZyb21QYXJ0aWFsKG9iamVjdCkge1xuICAgICAgICB2YXIgX2EsIF9iO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZU1hdGNoRW5kSXRlbVVwZGF0ZXMoKTtcbiAgICAgICAgbWVzc2FnZS5pdGVtSWQgPVxuICAgICAgICAgICAgb2JqZWN0Lml0ZW1JZCAhPT0gdW5kZWZpbmVkICYmIG9iamVjdC5pdGVtSWQgIT09IG51bGxcbiAgICAgICAgICAgICAgICA/IExvbmcuZnJvbVZhbHVlKG9iamVjdC5pdGVtSWQpXG4gICAgICAgICAgICAgICAgOiBMb25nLlVaRVJPO1xuICAgICAgICBtZXNzYWdlLml0ZW1BdHRyRGVmaWR4ID0gKF9hID0gb2JqZWN0Lml0ZW1BdHRyRGVmaWR4KSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAwO1xuICAgICAgICBtZXNzYWdlLml0ZW1BdHRyRGVsdGFWYWx1ZSA9IChfYiA9IG9iamVjdC5pdGVtQXR0ckRlbHRhVmFsdWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IDA7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbn07XG5mdW5jdGlvbiBjcmVhdGVCYXNlU2NvcmVMZWFkZXJib2FyZERhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgcXVlc3RJZDogTG9uZy5VWkVSTyxcbiAgICAgICAgc2NvcmU6IDAsXG4gICAgICAgIGFjY291bnRlbnRyaWVzOiBbXSxcbiAgICAgICAgbWF0Y2hlbnRyaWVzOiBbXVxuICAgIH07XG59XG5leHBvcnRzLlNjb3JlTGVhZGVyYm9hcmREYXRhID0ge1xuICAgIGVuY29kZShtZXNzYWdlLCB3cml0ZXIgPSBtaW5pbWFsXzEuV3JpdGVyLmNyZWF0ZSgpKSB7XG4gICAgICAgIGlmICghbWVzc2FnZS5xdWVzdElkLmlzWmVybygpKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDgpLnVpbnQ2NChtZXNzYWdlLnF1ZXN0SWQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLnNjb3JlICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDE2KS51aW50MzIobWVzc2FnZS5zY29yZSk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCB2IG9mIG1lc3NhZ2UuYWNjb3VudGVudHJpZXMpIHtcbiAgICAgICAgICAgIGV4cG9ydHMuU2NvcmVMZWFkZXJib2FyZERhdGFfQWNjb3VudEVudHJpZXMuZW5jb2RlKHYsIHdyaXRlci51aW50MzIoMjYpLmZvcmsoKSkubGRlbGltKCk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCB2IG9mIG1lc3NhZ2UubWF0Y2hlbnRyaWVzKSB7XG4gICAgICAgICAgICBleHBvcnRzLlNjb3JlTGVhZGVyYm9hcmREYXRhX0VudHJ5LmVuY29kZSh2LCB3cml0ZXIudWludDMyKDQyKS5mb3JrKCkpLmxkZWxpbSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfSxcbiAgICBkZWNvZGUoaW5wdXQsIGxlbmd0aCkge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBpbnB1dCBpbnN0YW5jZW9mIG1pbmltYWxfMS5SZWFkZXIgPyBpbnB1dCA6IG5ldyBtaW5pbWFsXzEuUmVhZGVyKGlucHV0KTtcbiAgICAgICAgbGV0IGVuZCA9IGxlbmd0aCA9PT0gdW5kZWZpbmVkID8gcmVhZGVyLmxlbiA6IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlU2NvcmVMZWFkZXJib2FyZERhdGEoKTtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhZyA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgIHN3aXRjaCAodGFnID4+PiAzKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnF1ZXN0SWQgPSByZWFkZXIudWludDY0KCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5zY29yZSA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmFjY291bnRlbnRyaWVzLnB1c2goZXhwb3J0cy5TY29yZUxlYWRlcmJvYXJkRGF0YV9BY2NvdW50RW50cmllcy5kZWNvZGUocmVhZGVyLCByZWFkZXIudWludDMyKCkpKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLm1hdGNoZW50cmllcy5wdXNoKGV4cG9ydHMuU2NvcmVMZWFkZXJib2FyZERhdGFfRW50cnkuZGVjb2RlKHJlYWRlciwgcmVhZGVyLnVpbnQzMigpKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJlYWRlci5za2lwVHlwZSh0YWcgJiA3KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfSxcbiAgICBmcm9tUGFydGlhbChvYmplY3QpIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2M7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlU2NvcmVMZWFkZXJib2FyZERhdGEoKTtcbiAgICAgICAgbWVzc2FnZS5xdWVzdElkID1cbiAgICAgICAgICAgIG9iamVjdC5xdWVzdElkICE9PSB1bmRlZmluZWQgJiYgb2JqZWN0LnF1ZXN0SWQgIT09IG51bGxcbiAgICAgICAgICAgICAgICA/IExvbmcuZnJvbVZhbHVlKG9iamVjdC5xdWVzdElkKVxuICAgICAgICAgICAgICAgIDogTG9uZy5VWkVSTztcbiAgICAgICAgbWVzc2FnZS5zY29yZSA9IChfYSA9IG9iamVjdC5zY29yZSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMDtcbiAgICAgICAgbWVzc2FnZS5hY2NvdW50ZW50cmllcyA9XG4gICAgICAgICAgICAoKF9iID0gb2JqZWN0LmFjY291bnRlbnRyaWVzKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IubWFwKGUgPT4gZXhwb3J0cy5TY29yZUxlYWRlcmJvYXJkRGF0YV9BY2NvdW50RW50cmllcy5mcm9tUGFydGlhbChlKSkpIHx8IFtdO1xuICAgICAgICBtZXNzYWdlLm1hdGNoZW50cmllcyA9XG4gICAgICAgICAgICAoKF9jID0gb2JqZWN0Lm1hdGNoZW50cmllcykgPT09IG51bGwgfHwgX2MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jLm1hcChlID0+IGV4cG9ydHMuU2NvcmVMZWFkZXJib2FyZERhdGFfRW50cnkuZnJvbVBhcnRpYWwoZSkpKSB8fCBbXTtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxufTtcbmZ1bmN0aW9uIGNyZWF0ZUJhc2VTY29yZUxlYWRlcmJvYXJkRGF0YV9FbnRyeSgpIHtcbiAgICByZXR1cm4geyB0YWc6IDAsIHZhbDogMCB9O1xufVxuZXhwb3J0cy5TY29yZUxlYWRlcmJvYXJkRGF0YV9FbnRyeSA9IHtcbiAgICBlbmNvZGUobWVzc2FnZSwgd3JpdGVyID0gbWluaW1hbF8xLldyaXRlci5jcmVhdGUoKSkge1xuICAgICAgICBpZiAobWVzc2FnZS50YWcgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoOCkudWludDMyKG1lc3NhZ2UudGFnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS52YWwgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMTYpLnVpbnQzMihtZXNzYWdlLnZhbCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9LFxuICAgIGRlY29kZShpbnB1dCwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IGlucHV0IGluc3RhbmNlb2YgbWluaW1hbF8xLlJlYWRlciA/IGlucHV0IDogbmV3IG1pbmltYWxfMS5SZWFkZXIoaW5wdXQpO1xuICAgICAgICBsZXQgZW5kID0gbGVuZ3RoID09PSB1bmRlZmluZWQgPyByZWFkZXIubGVuIDogcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VTY29yZUxlYWRlcmJvYXJkRGF0YV9FbnRyeSgpO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudmFsID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICByZWFkZXIuc2tpcFR5cGUodGFnICYgNyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH0sXG4gICAgZnJvbVBhcnRpYWwob2JqZWN0KSB7XG4gICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlU2NvcmVMZWFkZXJib2FyZERhdGFfRW50cnkoKTtcbiAgICAgICAgbWVzc2FnZS50YWcgPSAoX2EgPSBvYmplY3QudGFnKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAwO1xuICAgICAgICBtZXNzYWdlLnZhbCA9IChfYiA9IG9iamVjdC52YWwpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IDA7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbn07XG5mdW5jdGlvbiBjcmVhdGVCYXNlU2NvcmVMZWFkZXJib2FyZERhdGFfQWNjb3VudEVudHJpZXMoKSB7XG4gICAgcmV0dXJuIHsgYWNjb3VudGlkOiAwLCBlbnRyaWVzOiBbXSB9O1xufVxuZXhwb3J0cy5TY29yZUxlYWRlcmJvYXJkRGF0YV9BY2NvdW50RW50cmllcyA9IHtcbiAgICBlbmNvZGUobWVzc2FnZSwgd3JpdGVyID0gbWluaW1hbF8xLldyaXRlci5jcmVhdGUoKSkge1xuICAgICAgICBpZiAobWVzc2FnZS5hY2NvdW50aWQgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoOCkudWludDMyKG1lc3NhZ2UuYWNjb3VudGlkKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IHYgb2YgbWVzc2FnZS5lbnRyaWVzKSB7XG4gICAgICAgICAgICBleHBvcnRzLlNjb3JlTGVhZGVyYm9hcmREYXRhX0VudHJ5LmVuY29kZSh2LCB3cml0ZXIudWludDMyKDE4KS5mb3JrKCkpLmxkZWxpbSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfSxcbiAgICBkZWNvZGUoaW5wdXQsIGxlbmd0aCkge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBpbnB1dCBpbnN0YW5jZW9mIG1pbmltYWxfMS5SZWFkZXIgPyBpbnB1dCA6IG5ldyBtaW5pbWFsXzEuUmVhZGVyKGlucHV0KTtcbiAgICAgICAgbGV0IGVuZCA9IGxlbmd0aCA9PT0gdW5kZWZpbmVkID8gcmVhZGVyLmxlbiA6IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlU2NvcmVMZWFkZXJib2FyZERhdGFfQWNjb3VudEVudHJpZXMoKTtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhZyA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgIHN3aXRjaCAodGFnID4+PiAzKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmFjY291bnRpZCA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmVudHJpZXMucHVzaChleHBvcnRzLlNjb3JlTGVhZGVyYm9hcmREYXRhX0VudHJ5LmRlY29kZShyZWFkZXIsIHJlYWRlci51aW50MzIoKSkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICByZWFkZXIuc2tpcFR5cGUodGFnICYgNyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH0sXG4gICAgZnJvbVBhcnRpYWwob2JqZWN0KSB7XG4gICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlU2NvcmVMZWFkZXJib2FyZERhdGFfQWNjb3VudEVudHJpZXMoKTtcbiAgICAgICAgbWVzc2FnZS5hY2NvdW50aWQgPSAoX2EgPSBvYmplY3QuYWNjb3VudGlkKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAwO1xuICAgICAgICBtZXNzYWdlLmVudHJpZXMgPVxuICAgICAgICAgICAgKChfYiA9IG9iamVjdC5lbnRyaWVzKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IubWFwKGUgPT4gZXhwb3J0cy5TY29yZUxlYWRlcmJvYXJkRGF0YV9FbnRyeS5mcm9tUGFydGlhbChlKSkpIHx8IFtdO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG59O1xuZnVuY3Rpb24gY3JlYXRlQmFzZVBsYXllclF1ZXN0RGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBxdWVzdGVyQWNjb3VudElkOiAwLFxuICAgICAgICBxdWVzdEl0ZW1EYXRhOiBbXSxcbiAgICAgICAgeHBQcm9ncmVzc0RhdGE6IFtdLFxuICAgICAgICB0aW1lUGxheWVkOiAwLFxuICAgICAgICBtbUdhbWVNb2RlOiAwLFxuICAgICAgICBpdGVtVXBkYXRlczogW10sXG4gICAgICAgIG9wZXJhdGlvblBvaW50c0VsaWdpYmxlOiBmYWxzZSxcbiAgICAgICAgdXNlcnN0YXRjaGFuZ2VzOiBbXVxuICAgIH07XG59XG5leHBvcnRzLlBsYXllclF1ZXN0RGF0YSA9IHtcbiAgICBlbmNvZGUobWVzc2FnZSwgd3JpdGVyID0gbWluaW1hbF8xLldyaXRlci5jcmVhdGUoKSkge1xuICAgICAgICBpZiAobWVzc2FnZS5xdWVzdGVyQWNjb3VudElkICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDgpLnVpbnQzMihtZXNzYWdlLnF1ZXN0ZXJBY2NvdW50SWQpO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3QgdiBvZiBtZXNzYWdlLnF1ZXN0SXRlbURhdGEpIHtcbiAgICAgICAgICAgIGV4cG9ydHMuUGxheWVyUXVlc3REYXRhX1F1ZXN0SXRlbURhdGEuZW5jb2RlKHYsIHdyaXRlci51aW50MzIoMTgpLmZvcmsoKSkubGRlbGltKCk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCB2IG9mIG1lc3NhZ2UueHBQcm9ncmVzc0RhdGEpIHtcbiAgICAgICAgICAgIGV4cG9ydHMuWHBQcm9ncmVzc0RhdGEuZW5jb2RlKHYsIHdyaXRlci51aW50MzIoMjYpLmZvcmsoKSkubGRlbGltKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UudGltZVBsYXllZCAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigzMikudWludDMyKG1lc3NhZ2UudGltZVBsYXllZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UubW1HYW1lTW9kZSAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig0MCkudWludDMyKG1lc3NhZ2UubW1HYW1lTW9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCB2IG9mIG1lc3NhZ2UuaXRlbVVwZGF0ZXMpIHtcbiAgICAgICAgICAgIGV4cG9ydHMuTWF0Y2hFbmRJdGVtVXBkYXRlcy5lbmNvZGUodiwgd3JpdGVyLnVpbnQzMig1MCkuZm9yaygpKS5sZGVsaW0oKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5vcGVyYXRpb25Qb2ludHNFbGlnaWJsZSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig1NikuYm9vbChtZXNzYWdlLm9wZXJhdGlvblBvaW50c0VsaWdpYmxlKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IHYgb2YgbWVzc2FnZS51c2Vyc3RhdGNoYW5nZXMpIHtcbiAgICAgICAgICAgIGV4cG9ydHMuQ01zZ0NzZ29TdGVhbVVzZXJTdGF0Q2hhbmdlLmVuY29kZSh2LCB3cml0ZXIudWludDMyKDY2KS5mb3JrKCkpLmxkZWxpbSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfSxcbiAgICBkZWNvZGUoaW5wdXQsIGxlbmd0aCkge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBpbnB1dCBpbnN0YW5jZW9mIG1pbmltYWxfMS5SZWFkZXIgPyBpbnB1dCA6IG5ldyBtaW5pbWFsXzEuUmVhZGVyKGlucHV0KTtcbiAgICAgICAgbGV0IGVuZCA9IGxlbmd0aCA9PT0gdW5kZWZpbmVkID8gcmVhZGVyLmxlbiA6IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlUGxheWVyUXVlc3REYXRhKCk7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBjb25zdCB0YWcgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKHRhZyA+Pj4gMykge1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5xdWVzdGVyQWNjb3VudElkID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UucXVlc3RJdGVtRGF0YS5wdXNoKGV4cG9ydHMuUGxheWVyUXVlc3REYXRhX1F1ZXN0SXRlbURhdGEuZGVjb2RlKHJlYWRlciwgcmVhZGVyLnVpbnQzMigpKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS54cFByb2dyZXNzRGF0YS5wdXNoKGV4cG9ydHMuWHBQcm9ncmVzc0RhdGEuZGVjb2RlKHJlYWRlciwgcmVhZGVyLnVpbnQzMigpKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS50aW1lUGxheWVkID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UubW1HYW1lTW9kZSA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLml0ZW1VcGRhdGVzLnB1c2goZXhwb3J0cy5NYXRjaEVuZEl0ZW1VcGRhdGVzLmRlY29kZShyZWFkZXIsIHJlYWRlci51aW50MzIoKSkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Uub3BlcmF0aW9uUG9pbnRzRWxpZ2libGUgPSByZWFkZXIuYm9vbCgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDg6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudXNlcnN0YXRjaGFuZ2VzLnB1c2goZXhwb3J0cy5DTXNnQ3Nnb1N0ZWFtVXNlclN0YXRDaGFuZ2UuZGVjb2RlKHJlYWRlciwgcmVhZGVyLnVpbnQzMigpKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJlYWRlci5za2lwVHlwZSh0YWcgJiA3KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfSxcbiAgICBmcm9tUGFydGlhbChvYmplY3QpIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2MsIF9kLCBfZSwgX2YsIF9nLCBfaDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VQbGF5ZXJRdWVzdERhdGEoKTtcbiAgICAgICAgbWVzc2FnZS5xdWVzdGVyQWNjb3VudElkID0gKF9hID0gb2JqZWN0LnF1ZXN0ZXJBY2NvdW50SWQpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IDA7XG4gICAgICAgIG1lc3NhZ2UucXVlc3RJdGVtRGF0YSA9XG4gICAgICAgICAgICAoKF9iID0gb2JqZWN0LnF1ZXN0SXRlbURhdGEpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5tYXAoZSA9PiBleHBvcnRzLlBsYXllclF1ZXN0RGF0YV9RdWVzdEl0ZW1EYXRhLmZyb21QYXJ0aWFsKGUpKSkgfHwgW107XG4gICAgICAgIG1lc3NhZ2UueHBQcm9ncmVzc0RhdGEgPVxuICAgICAgICAgICAgKChfYyA9IG9iamVjdC54cFByb2dyZXNzRGF0YSkgPT09IG51bGwgfHwgX2MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jLm1hcChlID0+IGV4cG9ydHMuWHBQcm9ncmVzc0RhdGEuZnJvbVBhcnRpYWwoZSkpKSB8fCBbXTtcbiAgICAgICAgbWVzc2FnZS50aW1lUGxheWVkID0gKF9kID0gb2JqZWN0LnRpbWVQbGF5ZWQpICE9PSBudWxsICYmIF9kICE9PSB2b2lkIDAgPyBfZCA6IDA7XG4gICAgICAgIG1lc3NhZ2UubW1HYW1lTW9kZSA9IChfZSA9IG9iamVjdC5tbUdhbWVNb2RlKSAhPT0gbnVsbCAmJiBfZSAhPT0gdm9pZCAwID8gX2UgOiAwO1xuICAgICAgICBtZXNzYWdlLml0ZW1VcGRhdGVzID1cbiAgICAgICAgICAgICgoX2YgPSBvYmplY3QuaXRlbVVwZGF0ZXMpID09PSBudWxsIHx8IF9mID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZi5tYXAoZSA9PiBleHBvcnRzLk1hdGNoRW5kSXRlbVVwZGF0ZXMuZnJvbVBhcnRpYWwoZSkpKSB8fCBbXTtcbiAgICAgICAgbWVzc2FnZS5vcGVyYXRpb25Qb2ludHNFbGlnaWJsZSA9IChfZyA9IG9iamVjdC5vcGVyYXRpb25Qb2ludHNFbGlnaWJsZSkgIT09IG51bGwgJiYgX2cgIT09IHZvaWQgMCA/IF9nIDogZmFsc2U7XG4gICAgICAgIG1lc3NhZ2UudXNlcnN0YXRjaGFuZ2VzID1cbiAgICAgICAgICAgICgoX2ggPSBvYmplY3QudXNlcnN0YXRjaGFuZ2VzKSA9PT0gbnVsbCB8fCBfaCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2gubWFwKGUgPT4gZXhwb3J0cy5DTXNnQ3Nnb1N0ZWFtVXNlclN0YXRDaGFuZ2UuZnJvbVBhcnRpYWwoZSkpKSB8fCBbXTtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxufTtcbmZ1bmN0aW9uIGNyZWF0ZUJhc2VQbGF5ZXJRdWVzdERhdGFfUXVlc3RJdGVtRGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBxdWVzdElkOiBMb25nLlVaRVJPLFxuICAgICAgICBxdWVzdE5vcm1hbFBvaW50c0Vhcm5lZDogMCxcbiAgICAgICAgcXVlc3RCb251c1BvaW50c0Vhcm5lZDogMFxuICAgIH07XG59XG5leHBvcnRzLlBsYXllclF1ZXN0RGF0YV9RdWVzdEl0ZW1EYXRhID0ge1xuICAgIGVuY29kZShtZXNzYWdlLCB3cml0ZXIgPSBtaW5pbWFsXzEuV3JpdGVyLmNyZWF0ZSgpKSB7XG4gICAgICAgIGlmICghbWVzc2FnZS5xdWVzdElkLmlzWmVybygpKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDgpLnVpbnQ2NChtZXNzYWdlLnF1ZXN0SWQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLnF1ZXN0Tm9ybWFsUG9pbnRzRWFybmVkICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDE2KS5pbnQzMihtZXNzYWdlLnF1ZXN0Tm9ybWFsUG9pbnRzRWFybmVkKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5xdWVzdEJvbnVzUG9pbnRzRWFybmVkICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDI0KS5pbnQzMihtZXNzYWdlLnF1ZXN0Qm9udXNQb2ludHNFYXJuZWQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfSxcbiAgICBkZWNvZGUoaW5wdXQsIGxlbmd0aCkge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBpbnB1dCBpbnN0YW5jZW9mIG1pbmltYWxfMS5SZWFkZXIgPyBpbnB1dCA6IG5ldyBtaW5pbWFsXzEuUmVhZGVyKGlucHV0KTtcbiAgICAgICAgbGV0IGVuZCA9IGxlbmd0aCA9PT0gdW5kZWZpbmVkID8gcmVhZGVyLmxlbiA6IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlUGxheWVyUXVlc3REYXRhX1F1ZXN0SXRlbURhdGEoKTtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhZyA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgIHN3aXRjaCAodGFnID4+PiAzKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnF1ZXN0SWQgPSByZWFkZXIudWludDY0KCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5xdWVzdE5vcm1hbFBvaW50c0Vhcm5lZCA9IHJlYWRlci5pbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UucXVlc3RCb251c1BvaW50c0Vhcm5lZCA9IHJlYWRlci5pbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICByZWFkZXIuc2tpcFR5cGUodGFnICYgNyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH0sXG4gICAgZnJvbVBhcnRpYWwob2JqZWN0KSB7XG4gICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlUGxheWVyUXVlc3REYXRhX1F1ZXN0SXRlbURhdGEoKTtcbiAgICAgICAgbWVzc2FnZS5xdWVzdElkID1cbiAgICAgICAgICAgIG9iamVjdC5xdWVzdElkICE9PSB1bmRlZmluZWQgJiYgb2JqZWN0LnF1ZXN0SWQgIT09IG51bGxcbiAgICAgICAgICAgICAgICA/IExvbmcuZnJvbVZhbHVlKG9iamVjdC5xdWVzdElkKVxuICAgICAgICAgICAgICAgIDogTG9uZy5VWkVSTztcbiAgICAgICAgbWVzc2FnZS5xdWVzdE5vcm1hbFBvaW50c0Vhcm5lZCA9IChfYSA9IG9iamVjdC5xdWVzdE5vcm1hbFBvaW50c0Vhcm5lZCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMDtcbiAgICAgICAgbWVzc2FnZS5xdWVzdEJvbnVzUG9pbnRzRWFybmVkID0gKF9iID0gb2JqZWN0LnF1ZXN0Qm9udXNQb2ludHNFYXJuZWQpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IDA7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbn07XG5mdW5jdGlvbiBjcmVhdGVCYXNlRGVlcFBsYXllclN0YXRzRW50cnkoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgYWNjb3VudGlkOiAwLFxuICAgICAgICBtYXRjaElkOiBMb25nLlVaRVJPLFxuICAgICAgICBtbUdhbWVNb2RlOiAwLFxuICAgICAgICBtYXBpZDogMCxcbiAgICAgICAgYlN0YXJ0aW5nQ3Q6IGZhbHNlLFxuICAgICAgICBtYXRjaE91dGNvbWU6IDAsXG4gICAgICAgIHJvdW5kc1dvbjogMCxcbiAgICAgICAgcm91bmRzTG9zdDogMCxcbiAgICAgICAgc3RhdFNjb3JlOiAwLFxuICAgICAgICBzdGF0RGVhdGhzOiAwLFxuICAgICAgICBzdGF0TXZwczogMCxcbiAgICAgICAgZW5lbXlLaWxsczogMCxcbiAgICAgICAgZW5lbXlIZWFkc2hvdHM6IDAsXG4gICAgICAgIGVuZW15MmtzOiAwLFxuICAgICAgICBlbmVteTNrczogMCxcbiAgICAgICAgZW5lbXk0a3M6IDAsXG4gICAgICAgIHRvdGFsRGFtYWdlOiAwLFxuICAgICAgICBlbmdhZ2VtZW50c0VudHJ5Q291bnQ6IDAsXG4gICAgICAgIGVuZ2FnZW1lbnRzRW50cnlXaW5zOiAwLFxuICAgICAgICBlbmdhZ2VtZW50czF2MUNvdW50OiAwLFxuICAgICAgICBlbmdhZ2VtZW50czF2MVdpbnM6IDAsXG4gICAgICAgIGVuZ2FnZW1lbnRzMXYyQ291bnQ6IDAsXG4gICAgICAgIGVuZ2FnZW1lbnRzMXYyV2luczogMCxcbiAgICAgICAgdXRpbGl0eUNvdW50OiAwLFxuICAgICAgICB1dGlsaXR5U3VjY2VzczogMCxcbiAgICAgICAgZmxhc2hDb3VudDogMCxcbiAgICAgICAgZmxhc2hTdWNjZXNzOiAwLFxuICAgICAgICBtYXRlczogW11cbiAgICB9O1xufVxuZXhwb3J0cy5EZWVwUGxheWVyU3RhdHNFbnRyeSA9IHtcbiAgICBlbmNvZGUobWVzc2FnZSwgd3JpdGVyID0gbWluaW1hbF8xLldyaXRlci5jcmVhdGUoKSkge1xuICAgICAgICBpZiAobWVzc2FnZS5hY2NvdW50aWQgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoOCkudWludDMyKG1lc3NhZ2UuYWNjb3VudGlkKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIW1lc3NhZ2UubWF0Y2hJZC5pc1plcm8oKSkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigxNikudWludDY0KG1lc3NhZ2UubWF0Y2hJZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UubW1HYW1lTW9kZSAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigyNCkudWludDMyKG1lc3NhZ2UubW1HYW1lTW9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UubWFwaWQgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMzIpLnVpbnQzMihtZXNzYWdlLm1hcGlkKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5iU3RhcnRpbmdDdCA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig0MCkuYm9vbChtZXNzYWdlLmJTdGFydGluZ0N0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5tYXRjaE91dGNvbWUgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoNDgpLnVpbnQzMihtZXNzYWdlLm1hdGNoT3V0Y29tZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2Uucm91bmRzV29uICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDU2KS51aW50MzIobWVzc2FnZS5yb3VuZHNXb24pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLnJvdW5kc0xvc3QgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoNjQpLnVpbnQzMihtZXNzYWdlLnJvdW5kc0xvc3QpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLnN0YXRTY29yZSAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig3MikudWludDMyKG1lc3NhZ2Uuc3RhdFNjb3JlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5zdGF0RGVhdGhzICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDk2KS51aW50MzIobWVzc2FnZS5zdGF0RGVhdGhzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5zdGF0TXZwcyAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigxMDQpLnVpbnQzMihtZXNzYWdlLnN0YXRNdnBzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5lbmVteUtpbGxzICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDExMikudWludDMyKG1lc3NhZ2UuZW5lbXlLaWxscyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UuZW5lbXlIZWFkc2hvdHMgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMTIwKS51aW50MzIobWVzc2FnZS5lbmVteUhlYWRzaG90cyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UuZW5lbXkya3MgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMTI4KS51aW50MzIobWVzc2FnZS5lbmVteTJrcyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UuZW5lbXkza3MgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMTM2KS51aW50MzIobWVzc2FnZS5lbmVteTNrcyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UuZW5lbXk0a3MgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMTQ0KS51aW50MzIobWVzc2FnZS5lbmVteTRrcyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UudG90YWxEYW1hZ2UgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMTUyKS51aW50MzIobWVzc2FnZS50b3RhbERhbWFnZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UuZW5nYWdlbWVudHNFbnRyeUNvdW50ICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDE4NCkudWludDMyKG1lc3NhZ2UuZW5nYWdlbWVudHNFbnRyeUNvdW50KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5lbmdhZ2VtZW50c0VudHJ5V2lucyAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigxOTIpLnVpbnQzMihtZXNzYWdlLmVuZ2FnZW1lbnRzRW50cnlXaW5zKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5lbmdhZ2VtZW50czF2MUNvdW50ICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDIwMCkudWludDMyKG1lc3NhZ2UuZW5nYWdlbWVudHMxdjFDb3VudCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UuZW5nYWdlbWVudHMxdjFXaW5zICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDIwOCkudWludDMyKG1lc3NhZ2UuZW5nYWdlbWVudHMxdjFXaW5zKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5lbmdhZ2VtZW50czF2MkNvdW50ICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDIxNikudWludDMyKG1lc3NhZ2UuZW5nYWdlbWVudHMxdjJDb3VudCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UuZW5nYWdlbWVudHMxdjJXaW5zICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDIyNCkudWludDMyKG1lc3NhZ2UuZW5nYWdlbWVudHMxdjJXaW5zKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS51dGlsaXR5Q291bnQgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMjMyKS51aW50MzIobWVzc2FnZS51dGlsaXR5Q291bnQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLnV0aWxpdHlTdWNjZXNzICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDI0MCkudWludDMyKG1lc3NhZ2UudXRpbGl0eVN1Y2Nlc3MpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLmZsYXNoQ291bnQgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMjU2KS51aW50MzIobWVzc2FnZS5mbGFzaENvdW50KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5mbGFzaFN1Y2Nlc3MgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMjY0KS51aW50MzIobWVzc2FnZS5mbGFzaFN1Y2Nlc3MpO1xuICAgICAgICB9XG4gICAgICAgIHdyaXRlci51aW50MzIoMjc0KS5mb3JrKCk7XG4gICAgICAgIGZvciAoY29uc3QgdiBvZiBtZXNzYWdlLm1hdGVzKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKHYpO1xuICAgICAgICB9XG4gICAgICAgIHdyaXRlci5sZGVsaW0oKTtcbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9LFxuICAgIGRlY29kZShpbnB1dCwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IGlucHV0IGluc3RhbmNlb2YgbWluaW1hbF8xLlJlYWRlciA/IGlucHV0IDogbmV3IG1pbmltYWxfMS5SZWFkZXIoaW5wdXQpO1xuICAgICAgICBsZXQgZW5kID0gbGVuZ3RoID09PSB1bmRlZmluZWQgPyByZWFkZXIubGVuIDogcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VEZWVwUGxheWVyU3RhdHNFbnRyeSgpO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuYWNjb3VudGlkID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UubWF0Y2hJZCA9IHJlYWRlci51aW50NjQoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLm1tR2FtZU1vZGUgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5tYXBpZCA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmJTdGFydGluZ0N0ID0gcmVhZGVyLmJvb2woKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLm1hdGNoT3V0Y29tZSA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA3OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnJvdW5kc1dvbiA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA4OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnJvdW5kc0xvc3QgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgOTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5zdGF0U2NvcmUgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMTI6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Uuc3RhdERlYXRocyA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAxMzpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5zdGF0TXZwcyA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAxNDpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5lbmVteUtpbGxzID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDE1OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmVuZW15SGVhZHNob3RzID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDE2OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmVuZW15MmtzID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDE3OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmVuZW15M2tzID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDE4OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmVuZW15NGtzID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDE5OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnRvdGFsRGFtYWdlID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDIzOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmVuZ2FnZW1lbnRzRW50cnlDb3VudCA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAyNDpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5lbmdhZ2VtZW50c0VudHJ5V2lucyA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAyNTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5lbmdhZ2VtZW50czF2MUNvdW50ID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDI2OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmVuZ2FnZW1lbnRzMXYxV2lucyA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAyNzpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5lbmdhZ2VtZW50czF2MkNvdW50ID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDI4OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmVuZ2FnZW1lbnRzMXYyV2lucyA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAyOTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS51dGlsaXR5Q291bnQgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMzA6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudXRpbGl0eVN1Y2Nlc3MgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMzI6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZmxhc2hDb3VudCA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAzMzpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5mbGFzaFN1Y2Nlc3MgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMzQ6XG4gICAgICAgICAgICAgICAgICAgIGlmICgodGFnICYgNykgPT09IDIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuZDIgPSByZWFkZXIudWludDMyKCkgKyByZWFkZXIucG9zO1xuICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5tYXRlcy5wdXNoKHJlYWRlci51aW50MzIoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLm1hdGVzLnB1c2gocmVhZGVyLnVpbnQzMigpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICByZWFkZXIuc2tpcFR5cGUodGFnICYgNyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH0sXG4gICAgZnJvbVBhcnRpYWwob2JqZWN0KSB7XG4gICAgICAgIHZhciBfYSwgX2IsIF9jLCBfZCwgX2UsIF9mLCBfZywgX2gsIF9qLCBfaywgX2wsIF9tLCBfbywgX3AsIF9xLCBfciwgX3MsIF90LCBfdSwgX3YsIF93LCBfeCwgX3ksIF96LCBfMCwgXzEsIF8yO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZURlZXBQbGF5ZXJTdGF0c0VudHJ5KCk7XG4gICAgICAgIG1lc3NhZ2UuYWNjb3VudGlkID0gKF9hID0gb2JqZWN0LmFjY291bnRpZCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMDtcbiAgICAgICAgbWVzc2FnZS5tYXRjaElkID1cbiAgICAgICAgICAgIG9iamVjdC5tYXRjaElkICE9PSB1bmRlZmluZWQgJiYgb2JqZWN0Lm1hdGNoSWQgIT09IG51bGxcbiAgICAgICAgICAgICAgICA/IExvbmcuZnJvbVZhbHVlKG9iamVjdC5tYXRjaElkKVxuICAgICAgICAgICAgICAgIDogTG9uZy5VWkVSTztcbiAgICAgICAgbWVzc2FnZS5tbUdhbWVNb2RlID0gKF9iID0gb2JqZWN0Lm1tR2FtZU1vZGUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IDA7XG4gICAgICAgIG1lc3NhZ2UubWFwaWQgPSAoX2MgPSBvYmplY3QubWFwaWQpICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IDA7XG4gICAgICAgIG1lc3NhZ2UuYlN0YXJ0aW5nQ3QgPSAoX2QgPSBvYmplY3QuYlN0YXJ0aW5nQ3QpICE9PSBudWxsICYmIF9kICE9PSB2b2lkIDAgPyBfZCA6IGZhbHNlO1xuICAgICAgICBtZXNzYWdlLm1hdGNoT3V0Y29tZSA9IChfZSA9IG9iamVjdC5tYXRjaE91dGNvbWUpICE9PSBudWxsICYmIF9lICE9PSB2b2lkIDAgPyBfZSA6IDA7XG4gICAgICAgIG1lc3NhZ2Uucm91bmRzV29uID0gKF9mID0gb2JqZWN0LnJvdW5kc1dvbikgIT09IG51bGwgJiYgX2YgIT09IHZvaWQgMCA/IF9mIDogMDtcbiAgICAgICAgbWVzc2FnZS5yb3VuZHNMb3N0ID0gKF9nID0gb2JqZWN0LnJvdW5kc0xvc3QpICE9PSBudWxsICYmIF9nICE9PSB2b2lkIDAgPyBfZyA6IDA7XG4gICAgICAgIG1lc3NhZ2Uuc3RhdFNjb3JlID0gKF9oID0gb2JqZWN0LnN0YXRTY29yZSkgIT09IG51bGwgJiYgX2ggIT09IHZvaWQgMCA/IF9oIDogMDtcbiAgICAgICAgbWVzc2FnZS5zdGF0RGVhdGhzID0gKF9qID0gb2JqZWN0LnN0YXREZWF0aHMpICE9PSBudWxsICYmIF9qICE9PSB2b2lkIDAgPyBfaiA6IDA7XG4gICAgICAgIG1lc3NhZ2Uuc3RhdE12cHMgPSAoX2sgPSBvYmplY3Quc3RhdE12cHMpICE9PSBudWxsICYmIF9rICE9PSB2b2lkIDAgPyBfayA6IDA7XG4gICAgICAgIG1lc3NhZ2UuZW5lbXlLaWxscyA9IChfbCA9IG9iamVjdC5lbmVteUtpbGxzKSAhPT0gbnVsbCAmJiBfbCAhPT0gdm9pZCAwID8gX2wgOiAwO1xuICAgICAgICBtZXNzYWdlLmVuZW15SGVhZHNob3RzID0gKF9tID0gb2JqZWN0LmVuZW15SGVhZHNob3RzKSAhPT0gbnVsbCAmJiBfbSAhPT0gdm9pZCAwID8gX20gOiAwO1xuICAgICAgICBtZXNzYWdlLmVuZW15MmtzID0gKF9vID0gb2JqZWN0LmVuZW15MmtzKSAhPT0gbnVsbCAmJiBfbyAhPT0gdm9pZCAwID8gX28gOiAwO1xuICAgICAgICBtZXNzYWdlLmVuZW15M2tzID0gKF9wID0gb2JqZWN0LmVuZW15M2tzKSAhPT0gbnVsbCAmJiBfcCAhPT0gdm9pZCAwID8gX3AgOiAwO1xuICAgICAgICBtZXNzYWdlLmVuZW15NGtzID0gKF9xID0gb2JqZWN0LmVuZW15NGtzKSAhPT0gbnVsbCAmJiBfcSAhPT0gdm9pZCAwID8gX3EgOiAwO1xuICAgICAgICBtZXNzYWdlLnRvdGFsRGFtYWdlID0gKF9yID0gb2JqZWN0LnRvdGFsRGFtYWdlKSAhPT0gbnVsbCAmJiBfciAhPT0gdm9pZCAwID8gX3IgOiAwO1xuICAgICAgICBtZXNzYWdlLmVuZ2FnZW1lbnRzRW50cnlDb3VudCA9IChfcyA9IG9iamVjdC5lbmdhZ2VtZW50c0VudHJ5Q291bnQpICE9PSBudWxsICYmIF9zICE9PSB2b2lkIDAgPyBfcyA6IDA7XG4gICAgICAgIG1lc3NhZ2UuZW5nYWdlbWVudHNFbnRyeVdpbnMgPSAoX3QgPSBvYmplY3QuZW5nYWdlbWVudHNFbnRyeVdpbnMpICE9PSBudWxsICYmIF90ICE9PSB2b2lkIDAgPyBfdCA6IDA7XG4gICAgICAgIG1lc3NhZ2UuZW5nYWdlbWVudHMxdjFDb3VudCA9IChfdSA9IG9iamVjdC5lbmdhZ2VtZW50czF2MUNvdW50KSAhPT0gbnVsbCAmJiBfdSAhPT0gdm9pZCAwID8gX3UgOiAwO1xuICAgICAgICBtZXNzYWdlLmVuZ2FnZW1lbnRzMXYxV2lucyA9IChfdiA9IG9iamVjdC5lbmdhZ2VtZW50czF2MVdpbnMpICE9PSBudWxsICYmIF92ICE9PSB2b2lkIDAgPyBfdiA6IDA7XG4gICAgICAgIG1lc3NhZ2UuZW5nYWdlbWVudHMxdjJDb3VudCA9IChfdyA9IG9iamVjdC5lbmdhZ2VtZW50czF2MkNvdW50KSAhPT0gbnVsbCAmJiBfdyAhPT0gdm9pZCAwID8gX3cgOiAwO1xuICAgICAgICBtZXNzYWdlLmVuZ2FnZW1lbnRzMXYyV2lucyA9IChfeCA9IG9iamVjdC5lbmdhZ2VtZW50czF2MldpbnMpICE9PSBudWxsICYmIF94ICE9PSB2b2lkIDAgPyBfeCA6IDA7XG4gICAgICAgIG1lc3NhZ2UudXRpbGl0eUNvdW50ID0gKF95ID0gb2JqZWN0LnV0aWxpdHlDb3VudCkgIT09IG51bGwgJiYgX3kgIT09IHZvaWQgMCA/IF95IDogMDtcbiAgICAgICAgbWVzc2FnZS51dGlsaXR5U3VjY2VzcyA9IChfeiA9IG9iamVjdC51dGlsaXR5U3VjY2VzcykgIT09IG51bGwgJiYgX3ogIT09IHZvaWQgMCA/IF96IDogMDtcbiAgICAgICAgbWVzc2FnZS5mbGFzaENvdW50ID0gKF8wID0gb2JqZWN0LmZsYXNoQ291bnQpICE9PSBudWxsICYmIF8wICE9PSB2b2lkIDAgPyBfMCA6IDA7XG4gICAgICAgIG1lc3NhZ2UuZmxhc2hTdWNjZXNzID0gKF8xID0gb2JqZWN0LmZsYXNoU3VjY2VzcykgIT09IG51bGwgJiYgXzEgIT09IHZvaWQgMCA/IF8xIDogMDtcbiAgICAgICAgbWVzc2FnZS5tYXRlcyA9ICgoXzIgPSBvYmplY3QubWF0ZXMpID09PSBudWxsIHx8IF8yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfMi5tYXAoZSA9PiBlKSkgfHwgW107XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbn07XG5mdW5jdGlvbiBjcmVhdGVCYXNlRGVlcFBsYXllck1hdGNoRXZlbnQoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgYWNjb3VudGlkOiAwLFxuICAgICAgICBtYXRjaElkOiBMb25nLlVaRVJPLFxuICAgICAgICBldmVudElkOiAwLFxuICAgICAgICBldmVudFR5cGU6IDAsXG4gICAgICAgIGJQbGF5aW5nQ3Q6IGZhbHNlLFxuICAgICAgICB1c2VyUG9zWDogMCxcbiAgICAgICAgdXNlclBvc1k6IDAsXG4gICAgICAgIHVzZXJQb3NaOiAwLFxuICAgICAgICB1c2VyRGVmaWR4OiAwLFxuICAgICAgICBvdGhlclBvc1g6IDAsXG4gICAgICAgIG90aGVyUG9zWTogMCxcbiAgICAgICAgb3RoZXJQb3NaOiAwLFxuICAgICAgICBvdGhlckRlZmlkeDogMCxcbiAgICAgICAgZXZlbnREYXRhOiAwXG4gICAgfTtcbn1cbmV4cG9ydHMuRGVlcFBsYXllck1hdGNoRXZlbnQgPSB7XG4gICAgZW5jb2RlKG1lc3NhZ2UsIHdyaXRlciA9IG1pbmltYWxfMS5Xcml0ZXIuY3JlYXRlKCkpIHtcbiAgICAgICAgaWYgKG1lc3NhZ2UuYWNjb3VudGlkICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDgpLnVpbnQzMihtZXNzYWdlLmFjY291bnRpZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFtZXNzYWdlLm1hdGNoSWQuaXNaZXJvKCkpIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMTYpLnVpbnQ2NChtZXNzYWdlLm1hdGNoSWQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLmV2ZW50SWQgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMjQpLnVpbnQzMihtZXNzYWdlLmV2ZW50SWQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLmV2ZW50VHlwZSAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigzMikudWludDMyKG1lc3NhZ2UuZXZlbnRUeXBlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5iUGxheWluZ0N0ID09PSB0cnVlKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDQwKS5ib29sKG1lc3NhZ2UuYlBsYXlpbmdDdCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UudXNlclBvc1ggIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoNDgpLmludDMyKG1lc3NhZ2UudXNlclBvc1gpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLnVzZXJQb3NZICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDU2KS5pbnQzMihtZXNzYWdlLnVzZXJQb3NZKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS51c2VyUG9zWiAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig5NikuaW50MzIobWVzc2FnZS51c2VyUG9zWik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UudXNlckRlZmlkeCAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig2NCkudWludDMyKG1lc3NhZ2UudXNlckRlZmlkeCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2Uub3RoZXJQb3NYICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDcyKS5pbnQzMihtZXNzYWdlLm90aGVyUG9zWCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2Uub3RoZXJQb3NZICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDgwKS5pbnQzMihtZXNzYWdlLm90aGVyUG9zWSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2Uub3RoZXJQb3NaICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDEwNCkuaW50MzIobWVzc2FnZS5vdGhlclBvc1opO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLm90aGVyRGVmaWR4ICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDg4KS51aW50MzIobWVzc2FnZS5vdGhlckRlZmlkeCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UuZXZlbnREYXRhICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDExMikuaW50MzIobWVzc2FnZS5ldmVudERhdGEpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfSxcbiAgICBkZWNvZGUoaW5wdXQsIGxlbmd0aCkge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBpbnB1dCBpbnN0YW5jZW9mIG1pbmltYWxfMS5SZWFkZXIgPyBpbnB1dCA6IG5ldyBtaW5pbWFsXzEuUmVhZGVyKGlucHV0KTtcbiAgICAgICAgbGV0IGVuZCA9IGxlbmd0aCA9PT0gdW5kZWZpbmVkID8gcmVhZGVyLmxlbiA6IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlRGVlcFBsYXllck1hdGNoRXZlbnQoKTtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhZyA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgIHN3aXRjaCAodGFnID4+PiAzKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmFjY291bnRpZCA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLm1hdGNoSWQgPSByZWFkZXIudWludDY0KCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5ldmVudElkID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZXZlbnRUeXBlID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuYlBsYXlpbmdDdCA9IHJlYWRlci5ib29sKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS51c2VyUG9zWCA9IHJlYWRlci5pbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudXNlclBvc1kgPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAxMjpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS51c2VyUG9zWiA9IHJlYWRlci5pbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDg6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudXNlckRlZmlkeCA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA5OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLm90aGVyUG9zWCA9IHJlYWRlci5pbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDEwOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLm90aGVyUG9zWSA9IHJlYWRlci5pbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDEzOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLm90aGVyUG9zWiA9IHJlYWRlci5pbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDExOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLm90aGVyRGVmaWR4ID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDE0OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmV2ZW50RGF0YSA9IHJlYWRlci5pbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICByZWFkZXIuc2tpcFR5cGUodGFnICYgNyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH0sXG4gICAgZnJvbVBhcnRpYWwob2JqZWN0KSB7XG4gICAgICAgIHZhciBfYSwgX2IsIF9jLCBfZCwgX2UsIF9mLCBfZywgX2gsIF9qLCBfaywgX2wsIF9tLCBfbztcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VEZWVwUGxheWVyTWF0Y2hFdmVudCgpO1xuICAgICAgICBtZXNzYWdlLmFjY291bnRpZCA9IChfYSA9IG9iamVjdC5hY2NvdW50aWQpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IDA7XG4gICAgICAgIG1lc3NhZ2UubWF0Y2hJZCA9XG4gICAgICAgICAgICBvYmplY3QubWF0Y2hJZCAhPT0gdW5kZWZpbmVkICYmIG9iamVjdC5tYXRjaElkICE9PSBudWxsXG4gICAgICAgICAgICAgICAgPyBMb25nLmZyb21WYWx1ZShvYmplY3QubWF0Y2hJZClcbiAgICAgICAgICAgICAgICA6IExvbmcuVVpFUk87XG4gICAgICAgIG1lc3NhZ2UuZXZlbnRJZCA9IChfYiA9IG9iamVjdC5ldmVudElkKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAwO1xuICAgICAgICBtZXNzYWdlLmV2ZW50VHlwZSA9IChfYyA9IG9iamVjdC5ldmVudFR5cGUpICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IDA7XG4gICAgICAgIG1lc3NhZ2UuYlBsYXlpbmdDdCA9IChfZCA9IG9iamVjdC5iUGxheWluZ0N0KSAhPT0gbnVsbCAmJiBfZCAhPT0gdm9pZCAwID8gX2QgOiBmYWxzZTtcbiAgICAgICAgbWVzc2FnZS51c2VyUG9zWCA9IChfZSA9IG9iamVjdC51c2VyUG9zWCkgIT09IG51bGwgJiYgX2UgIT09IHZvaWQgMCA/IF9lIDogMDtcbiAgICAgICAgbWVzc2FnZS51c2VyUG9zWSA9IChfZiA9IG9iamVjdC51c2VyUG9zWSkgIT09IG51bGwgJiYgX2YgIT09IHZvaWQgMCA/IF9mIDogMDtcbiAgICAgICAgbWVzc2FnZS51c2VyUG9zWiA9IChfZyA9IG9iamVjdC51c2VyUG9zWikgIT09IG51bGwgJiYgX2cgIT09IHZvaWQgMCA/IF9nIDogMDtcbiAgICAgICAgbWVzc2FnZS51c2VyRGVmaWR4ID0gKF9oID0gb2JqZWN0LnVzZXJEZWZpZHgpICE9PSBudWxsICYmIF9oICE9PSB2b2lkIDAgPyBfaCA6IDA7XG4gICAgICAgIG1lc3NhZ2Uub3RoZXJQb3NYID0gKF9qID0gb2JqZWN0Lm90aGVyUG9zWCkgIT09IG51bGwgJiYgX2ogIT09IHZvaWQgMCA/IF9qIDogMDtcbiAgICAgICAgbWVzc2FnZS5vdGhlclBvc1kgPSAoX2sgPSBvYmplY3Qub3RoZXJQb3NZKSAhPT0gbnVsbCAmJiBfayAhPT0gdm9pZCAwID8gX2sgOiAwO1xuICAgICAgICBtZXNzYWdlLm90aGVyUG9zWiA9IChfbCA9IG9iamVjdC5vdGhlclBvc1opICE9PSBudWxsICYmIF9sICE9PSB2b2lkIDAgPyBfbCA6IDA7XG4gICAgICAgIG1lc3NhZ2Uub3RoZXJEZWZpZHggPSAoX20gPSBvYmplY3Qub3RoZXJEZWZpZHgpICE9PSBudWxsICYmIF9tICE9PSB2b2lkIDAgPyBfbSA6IDA7XG4gICAgICAgIG1lc3NhZ2UuZXZlbnREYXRhID0gKF9vID0gb2JqZWN0LmV2ZW50RGF0YSkgIT09IG51bGwgJiYgX28gIT09IHZvaWQgMCA/IF9vIDogMDtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxufTtcbmZ1bmN0aW9uIGNyZWF0ZUJhc2VDTXNnR0NTZXJ2ZXJRdWVzdFVwZGF0ZURhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgcGxheWVyUXVlc3REYXRhOiBbXSxcbiAgICAgICAgYmluYXJ5RGF0YTogbmV3IFVpbnQ4QXJyYXkoKSxcbiAgICAgICAgbW1HYW1lTW9kZTogMCxcbiAgICAgICAgbWlzc2lvbmxic2RhdGE6IHVuZGVmaW5lZFxuICAgIH07XG59XG5leHBvcnRzLkNNc2dHQ1NlcnZlclF1ZXN0VXBkYXRlRGF0YSA9IHtcbiAgICBlbmNvZGUobWVzc2FnZSwgd3JpdGVyID0gbWluaW1hbF8xLldyaXRlci5jcmVhdGUoKSkge1xuICAgICAgICBmb3IgKGNvbnN0IHYgb2YgbWVzc2FnZS5wbGF5ZXJRdWVzdERhdGEpIHtcbiAgICAgICAgICAgIGV4cG9ydHMuUGxheWVyUXVlc3REYXRhLmVuY29kZSh2LCB3cml0ZXIudWludDMyKDEwKS5mb3JrKCkpLmxkZWxpbSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLmJpbmFyeURhdGEubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDE4KS5ieXRlcyhtZXNzYWdlLmJpbmFyeURhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLm1tR2FtZU1vZGUgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMjQpLnVpbnQzMihtZXNzYWdlLm1tR2FtZU1vZGUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLm1pc3Npb25sYnNkYXRhICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGV4cG9ydHMuU2NvcmVMZWFkZXJib2FyZERhdGEuZW5jb2RlKG1lc3NhZ2UubWlzc2lvbmxic2RhdGEsIHdyaXRlci51aW50MzIoMzQpLmZvcmsoKSkubGRlbGltKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9LFxuICAgIGRlY29kZShpbnB1dCwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IGlucHV0IGluc3RhbmNlb2YgbWluaW1hbF8xLlJlYWRlciA/IGlucHV0IDogbmV3IG1pbmltYWxfMS5SZWFkZXIoaW5wdXQpO1xuICAgICAgICBsZXQgZW5kID0gbGVuZ3RoID09PSB1bmRlZmluZWQgPyByZWFkZXIubGVuIDogcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDTXNnR0NTZXJ2ZXJRdWVzdFVwZGF0ZURhdGEoKTtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhZyA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgIHN3aXRjaCAodGFnID4+PiAzKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnBsYXllclF1ZXN0RGF0YS5wdXNoKGV4cG9ydHMuUGxheWVyUXVlc3REYXRhLmRlY29kZShyZWFkZXIsIHJlYWRlci51aW50MzIoKSkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuYmluYXJ5RGF0YSA9IHJlYWRlci5ieXRlcygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UubW1HYW1lTW9kZSA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLm1pc3Npb25sYnNkYXRhID0gZXhwb3J0cy5TY29yZUxlYWRlcmJvYXJkRGF0YS5kZWNvZGUocmVhZGVyLCByZWFkZXIudWludDMyKCkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICByZWFkZXIuc2tpcFR5cGUodGFnICYgNyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH0sXG4gICAgZnJvbVBhcnRpYWwob2JqZWN0KSB7XG4gICAgICAgIHZhciBfYSwgX2IsIF9jO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNNc2dHQ1NlcnZlclF1ZXN0VXBkYXRlRGF0YSgpO1xuICAgICAgICBtZXNzYWdlLnBsYXllclF1ZXN0RGF0YSA9XG4gICAgICAgICAgICAoKF9hID0gb2JqZWN0LnBsYXllclF1ZXN0RGF0YSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLm1hcChlID0+IGV4cG9ydHMuUGxheWVyUXVlc3REYXRhLmZyb21QYXJ0aWFsKGUpKSkgfHwgW107XG4gICAgICAgIG1lc3NhZ2UuYmluYXJ5RGF0YSA9IChfYiA9IG9iamVjdC5iaW5hcnlEYXRhKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBuZXcgVWludDhBcnJheSgpO1xuICAgICAgICBtZXNzYWdlLm1tR2FtZU1vZGUgPSAoX2MgPSBvYmplY3QubW1HYW1lTW9kZSkgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogMDtcbiAgICAgICAgbWVzc2FnZS5taXNzaW9ubGJzZGF0YSA9XG4gICAgICAgICAgICBvYmplY3QubWlzc2lvbmxic2RhdGEgIT09IHVuZGVmaW5lZCAmJiBvYmplY3QubWlzc2lvbmxic2RhdGEgIT09IG51bGxcbiAgICAgICAgICAgICAgICA/IGV4cG9ydHMuU2NvcmVMZWFkZXJib2FyZERhdGEuZnJvbVBhcnRpYWwob2JqZWN0Lm1pc3Npb25sYnNkYXRhKVxuICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG59O1xuZnVuY3Rpb24gY3JlYXRlQmFzZUNNc2dHQ0NTdHJpa2UxNVYyTWF0Y2htYWtpbmdHQ09wZXJhdGlvbmFsU3RhdHMoKSB7XG4gICAgcmV0dXJuIHsgcGFja2V0aWQ6IDAsIG5hbWVrZXlzOiBbXSwgcGFja2V0czogW10gfTtcbn1cbmV4cG9ydHMuQ01zZ0dDQ1N0cmlrZTE1VjJNYXRjaG1ha2luZ0dDT3BlcmF0aW9uYWxTdGF0cyA9IHtcbiAgICBlbmNvZGUobWVzc2FnZSwgd3JpdGVyID0gbWluaW1hbF8xLldyaXRlci5jcmVhdGUoKSkge1xuICAgICAgICBpZiAobWVzc2FnZS5wYWNrZXRpZCAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig4KS5pbnQzMihtZXNzYWdlLnBhY2tldGlkKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IHYgb2YgbWVzc2FnZS5uYW1la2V5cykge1xuICAgICAgICAgICAgZXhwb3J0cy5PcGVyYXRpb25hbFN0YXRpc3RpY0Rlc2NyaXB0aW9uLmVuY29kZSh2LCB3cml0ZXIudWludDMyKDE4KS5mb3JrKCkpLmxkZWxpbSgpO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3QgdiBvZiBtZXNzYWdlLnBhY2tldHMpIHtcbiAgICAgICAgICAgIGV4cG9ydHMuT3BlcmF0aW9uYWxTdGF0aXN0aWNzUGFja2V0LmVuY29kZSh2LCB3cml0ZXIudWludDMyKDI2KS5mb3JrKCkpLmxkZWxpbSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfSxcbiAgICBkZWNvZGUoaW5wdXQsIGxlbmd0aCkge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBpbnB1dCBpbnN0YW5jZW9mIG1pbmltYWxfMS5SZWFkZXIgPyBpbnB1dCA6IG5ldyBtaW5pbWFsXzEuUmVhZGVyKGlucHV0KTtcbiAgICAgICAgbGV0IGVuZCA9IGxlbmd0aCA9PT0gdW5kZWZpbmVkID8gcmVhZGVyLmxlbiA6IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ01zZ0dDQ1N0cmlrZTE1VjJNYXRjaG1ha2luZ0dDT3BlcmF0aW9uYWxTdGF0cygpO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UucGFja2V0aWQgPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLm5hbWVrZXlzLnB1c2goZXhwb3J0cy5PcGVyYXRpb25hbFN0YXRpc3RpY0Rlc2NyaXB0aW9uLmRlY29kZShyZWFkZXIsIHJlYWRlci51aW50MzIoKSkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UucGFja2V0cy5wdXNoKGV4cG9ydHMuT3BlcmF0aW9uYWxTdGF0aXN0aWNzUGFja2V0LmRlY29kZShyZWFkZXIsIHJlYWRlci51aW50MzIoKSkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICByZWFkZXIuc2tpcFR5cGUodGFnICYgNyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH0sXG4gICAgZnJvbVBhcnRpYWwob2JqZWN0KSB7XG4gICAgICAgIHZhciBfYSwgX2IsIF9jO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNNc2dHQ0NTdHJpa2UxNVYyTWF0Y2htYWtpbmdHQ09wZXJhdGlvbmFsU3RhdHMoKTtcbiAgICAgICAgbWVzc2FnZS5wYWNrZXRpZCA9IChfYSA9IG9iamVjdC5wYWNrZXRpZCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMDtcbiAgICAgICAgbWVzc2FnZS5uYW1la2V5cyA9XG4gICAgICAgICAgICAoKF9iID0gb2JqZWN0Lm5hbWVrZXlzKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IubWFwKGUgPT4gZXhwb3J0cy5PcGVyYXRpb25hbFN0YXRpc3RpY0Rlc2NyaXB0aW9uLmZyb21QYXJ0aWFsKGUpKSkgfHwgW107XG4gICAgICAgIG1lc3NhZ2UucGFja2V0cyA9XG4gICAgICAgICAgICAoKF9jID0gb2JqZWN0LnBhY2tldHMpID09PSBudWxsIHx8IF9jID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYy5tYXAoZSA9PiBleHBvcnRzLk9wZXJhdGlvbmFsU3RhdGlzdGljc1BhY2tldC5mcm9tUGFydGlhbChlKSkpIHx8XG4gICAgICAgICAgICAgICAgW107XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbn07XG5mdW5jdGlvbiBjcmVhdGVCYXNlQ01zZ0dDQ1N0cmlrZTE1VjJNYXRjaG1ha2luZ0dDMlNlcnZlckNvbmZpcm0oKSB7XG4gICAgcmV0dXJuIHsgdG9rZW46IDAsIHN0YW1wOiAwLCBleGNoYW5nZTogTG9uZy5VWkVSTyB9O1xufVxuZXhwb3J0cy5DTXNnR0NDU3RyaWtlMTVWMk1hdGNobWFraW5nR0MyU2VydmVyQ29uZmlybSA9IHtcbiAgICBlbmNvZGUobWVzc2FnZSwgd3JpdGVyID0gbWluaW1hbF8xLldyaXRlci5jcmVhdGUoKSkge1xuICAgICAgICBpZiAobWVzc2FnZS50b2tlbiAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig4KS51aW50MzIobWVzc2FnZS50b2tlbik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2Uuc3RhbXAgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMTYpLnVpbnQzMihtZXNzYWdlLnN0YW1wKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIW1lc3NhZ2UuZXhjaGFuZ2UuaXNaZXJvKCkpIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMjQpLnVpbnQ2NChtZXNzYWdlLmV4Y2hhbmdlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH0sXG4gICAgZGVjb2RlKGlucHV0LCBsZW5ndGgpIHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gaW5wdXQgaW5zdGFuY2VvZiBtaW5pbWFsXzEuUmVhZGVyID8gaW5wdXQgOiBuZXcgbWluaW1hbF8xLlJlYWRlcihpbnB1dCk7XG4gICAgICAgIGxldCBlbmQgPSBsZW5ndGggPT09IHVuZGVmaW5lZCA/IHJlYWRlci5sZW4gOiByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNNc2dHQ0NTdHJpa2UxNVYyTWF0Y2htYWtpbmdHQzJTZXJ2ZXJDb25maXJtKCk7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBjb25zdCB0YWcgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKHRhZyA+Pj4gMykge1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS50b2tlbiA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnN0YW1wID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZXhjaGFuZ2UgPSByZWFkZXIudWludDY0KCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJlYWRlci5za2lwVHlwZSh0YWcgJiA3KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfSxcbiAgICBmcm9tUGFydGlhbChvYmplY3QpIHtcbiAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDTXNnR0NDU3RyaWtlMTVWMk1hdGNobWFraW5nR0MyU2VydmVyQ29uZmlybSgpO1xuICAgICAgICBtZXNzYWdlLnRva2VuID0gKF9hID0gb2JqZWN0LnRva2VuKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAwO1xuICAgICAgICBtZXNzYWdlLnN0YW1wID0gKF9iID0gb2JqZWN0LnN0YW1wKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAwO1xuICAgICAgICBtZXNzYWdlLmV4Y2hhbmdlID1cbiAgICAgICAgICAgIG9iamVjdC5leGNoYW5nZSAhPT0gdW5kZWZpbmVkICYmIG9iamVjdC5leGNoYW5nZSAhPT0gbnVsbFxuICAgICAgICAgICAgICAgID8gTG9uZy5mcm9tVmFsdWUob2JqZWN0LmV4Y2hhbmdlKVxuICAgICAgICAgICAgICAgIDogTG9uZy5VWkVSTztcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxufTtcbmZ1bmN0aW9uIGNyZWF0ZUJhc2VDTXNnR0NDU3RyaWtlMTVWMkdDMlNlcnZlclJlc2VydmF0aW9uVXBkYXRlKCkge1xuICAgIHJldHVybiB7IHZpZXdlcnNFeHRlcm5hbFRvdGFsOiAwLCB2aWV3ZXJzRXh0ZXJuYWxTdGVhbTogMCB9O1xufVxuZXhwb3J0cy5DTXNnR0NDU3RyaWtlMTVWMkdDMlNlcnZlclJlc2VydmF0aW9uVXBkYXRlID0ge1xuICAgIGVuY29kZShtZXNzYWdlLCB3cml0ZXIgPSBtaW5pbWFsXzEuV3JpdGVyLmNyZWF0ZSgpKSB7XG4gICAgICAgIGlmIChtZXNzYWdlLnZpZXdlcnNFeHRlcm5hbFRvdGFsICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDgpLnVpbnQzMihtZXNzYWdlLnZpZXdlcnNFeHRlcm5hbFRvdGFsKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS52aWV3ZXJzRXh0ZXJuYWxTdGVhbSAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigxNikudWludDMyKG1lc3NhZ2Uudmlld2Vyc0V4dGVybmFsU3RlYW0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfSxcbiAgICBkZWNvZGUoaW5wdXQsIGxlbmd0aCkge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBpbnB1dCBpbnN0YW5jZW9mIG1pbmltYWxfMS5SZWFkZXIgPyBpbnB1dCA6IG5ldyBtaW5pbWFsXzEuUmVhZGVyKGlucHV0KTtcbiAgICAgICAgbGV0IGVuZCA9IGxlbmd0aCA9PT0gdW5kZWZpbmVkID8gcmVhZGVyLmxlbiA6IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ01zZ0dDQ1N0cmlrZTE1VjJHQzJTZXJ2ZXJSZXNlcnZhdGlvblVwZGF0ZSgpO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Uudmlld2Vyc0V4dGVybmFsVG90YWwgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS52aWV3ZXJzRXh0ZXJuYWxTdGVhbSA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmVhZGVyLnNraXBUeXBlKHRhZyAmIDcpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9LFxuICAgIGZyb21QYXJ0aWFsKG9iamVjdCkge1xuICAgICAgICB2YXIgX2EsIF9iO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNNc2dHQ0NTdHJpa2UxNVYyR0MyU2VydmVyUmVzZXJ2YXRpb25VcGRhdGUoKTtcbiAgICAgICAgbWVzc2FnZS52aWV3ZXJzRXh0ZXJuYWxUb3RhbCA9IChfYSA9IG9iamVjdC52aWV3ZXJzRXh0ZXJuYWxUb3RhbCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMDtcbiAgICAgICAgbWVzc2FnZS52aWV3ZXJzRXh0ZXJuYWxTdGVhbSA9IChfYiA9IG9iamVjdC52aWV3ZXJzRXh0ZXJuYWxTdGVhbSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogMDtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxufTtcbmZ1bmN0aW9uIGNyZWF0ZUJhc2VDTXNnR0NDU3RyaWtlMTVWMk1hdGNobWFraW5nU3RhcnQoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgYWNjb3VudElkczogW10sXG4gICAgICAgIGdhbWVUeXBlOiAwLFxuICAgICAgICB0aWNrZXREYXRhOiBcIlwiLFxuICAgICAgICBjbGllbnRWZXJzaW9uOiAwLFxuICAgICAgICB0b3VybmFtZW50TWF0Y2g6IHVuZGVmaW5lZCxcbiAgICAgICAgcHJpbWVPbmx5OiBmYWxzZSxcbiAgICAgICAgdHZDb250cm9sOiAwLFxuICAgICAgICBsb2JieUlkOiBMb25nLlVaRVJPXG4gICAgfTtcbn1cbmV4cG9ydHMuQ01zZ0dDQ1N0cmlrZTE1VjJNYXRjaG1ha2luZ1N0YXJ0ID0ge1xuICAgIGVuY29kZShtZXNzYWdlLCB3cml0ZXIgPSBtaW5pbWFsXzEuV3JpdGVyLmNyZWF0ZSgpKSB7XG4gICAgICAgIHdyaXRlci51aW50MzIoMTApLmZvcmsoKTtcbiAgICAgICAgZm9yIChjb25zdCB2IG9mIG1lc3NhZ2UuYWNjb3VudElkcykge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMih2KTtcbiAgICAgICAgfVxuICAgICAgICB3cml0ZXIubGRlbGltKCk7XG4gICAgICAgIGlmIChtZXNzYWdlLmdhbWVUeXBlICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDE2KS51aW50MzIobWVzc2FnZS5nYW1lVHlwZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UudGlja2V0RGF0YSAhPT0gXCJcIikge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigyNikuc3RyaW5nKG1lc3NhZ2UudGlja2V0RGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UuY2xpZW50VmVyc2lvbiAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigzMikudWludDMyKG1lc3NhZ2UuY2xpZW50VmVyc2lvbik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UudG91cm5hbWVudE1hdGNoICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGV4cG9ydHMuVG91cm5hbWVudE1hdGNoU2V0dXAuZW5jb2RlKG1lc3NhZ2UudG91cm5hbWVudE1hdGNoLCB3cml0ZXIudWludDMyKDQyKS5mb3JrKCkpLmxkZWxpbSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLnByaW1lT25seSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig0OCkuYm9vbChtZXNzYWdlLnByaW1lT25seSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UudHZDb250cm9sICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDU2KS51aW50MzIobWVzc2FnZS50dkNvbnRyb2wpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghbWVzc2FnZS5sb2JieUlkLmlzWmVybygpKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDY0KS51aW50NjQobWVzc2FnZS5sb2JieUlkKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH0sXG4gICAgZGVjb2RlKGlucHV0LCBsZW5ndGgpIHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gaW5wdXQgaW5zdGFuY2VvZiBtaW5pbWFsXzEuUmVhZGVyID8gaW5wdXQgOiBuZXcgbWluaW1hbF8xLlJlYWRlcihpbnB1dCk7XG4gICAgICAgIGxldCBlbmQgPSBsZW5ndGggPT09IHVuZGVmaW5lZCA/IHJlYWRlci5sZW4gOiByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNNc2dHQ0NTdHJpa2UxNVYyTWF0Y2htYWtpbmdTdGFydCgpO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIGlmICgodGFnICYgNykgPT09IDIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuZDIgPSByZWFkZXIudWludDMyKCkgKyByZWFkZXIucG9zO1xuICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5hY2NvdW50SWRzLnB1c2gocmVhZGVyLnVpbnQzMigpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuYWNjb3VudElkcy5wdXNoKHJlYWRlci51aW50MzIoKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmdhbWVUeXBlID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudGlja2V0RGF0YSA9IHJlYWRlci5zdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmNsaWVudFZlcnNpb24gPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS50b3VybmFtZW50TWF0Y2ggPSBleHBvcnRzLlRvdXJuYW1lbnRNYXRjaFNldHVwLmRlY29kZShyZWFkZXIsIHJlYWRlci51aW50MzIoKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5wcmltZU9ubHkgPSByZWFkZXIuYm9vbCgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudHZDb250cm9sID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDg6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UubG9iYnlJZCA9IHJlYWRlci51aW50NjQoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmVhZGVyLnNraXBUeXBlKHRhZyAmIDcpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9LFxuICAgIGZyb21QYXJ0aWFsKG9iamVjdCkge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYywgX2QsIF9lLCBfZjtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDTXNnR0NDU3RyaWtlMTVWMk1hdGNobWFraW5nU3RhcnQoKTtcbiAgICAgICAgbWVzc2FnZS5hY2NvdW50SWRzID0gKChfYSA9IG9iamVjdC5hY2NvdW50SWRzKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EubWFwKGUgPT4gZSkpIHx8IFtdO1xuICAgICAgICBtZXNzYWdlLmdhbWVUeXBlID0gKF9iID0gb2JqZWN0LmdhbWVUeXBlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAwO1xuICAgICAgICBtZXNzYWdlLnRpY2tldERhdGEgPSAoX2MgPSBvYmplY3QudGlja2V0RGF0YSkgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogXCJcIjtcbiAgICAgICAgbWVzc2FnZS5jbGllbnRWZXJzaW9uID0gKF9kID0gb2JqZWN0LmNsaWVudFZlcnNpb24pICE9PSBudWxsICYmIF9kICE9PSB2b2lkIDAgPyBfZCA6IDA7XG4gICAgICAgIG1lc3NhZ2UudG91cm5hbWVudE1hdGNoID1cbiAgICAgICAgICAgIG9iamVjdC50b3VybmFtZW50TWF0Y2ggIT09IHVuZGVmaW5lZCAmJiBvYmplY3QudG91cm5hbWVudE1hdGNoICE9PSBudWxsXG4gICAgICAgICAgICAgICAgPyBleHBvcnRzLlRvdXJuYW1lbnRNYXRjaFNldHVwLmZyb21QYXJ0aWFsKG9iamVjdC50b3VybmFtZW50TWF0Y2gpXG4gICAgICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICAgIG1lc3NhZ2UucHJpbWVPbmx5ID0gKF9lID0gb2JqZWN0LnByaW1lT25seSkgIT09IG51bGwgJiYgX2UgIT09IHZvaWQgMCA/IF9lIDogZmFsc2U7XG4gICAgICAgIG1lc3NhZ2UudHZDb250cm9sID0gKF9mID0gb2JqZWN0LnR2Q29udHJvbCkgIT09IG51bGwgJiYgX2YgIT09IHZvaWQgMCA/IF9mIDogMDtcbiAgICAgICAgbWVzc2FnZS5sb2JieUlkID1cbiAgICAgICAgICAgIG9iamVjdC5sb2JieUlkICE9PSB1bmRlZmluZWQgJiYgb2JqZWN0LmxvYmJ5SWQgIT09IG51bGxcbiAgICAgICAgICAgICAgICA/IExvbmcuZnJvbVZhbHVlKG9iamVjdC5sb2JieUlkKVxuICAgICAgICAgICAgICAgIDogTG9uZy5VWkVSTztcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxufTtcbmZ1bmN0aW9uIGNyZWF0ZUJhc2VDTXNnR0NDU3RyaWtlMTVWMk1hdGNobWFraW5nU3RvcCgpIHtcbiAgICByZXR1cm4geyBhYmFuZG9uOiAwIH07XG59XG5leHBvcnRzLkNNc2dHQ0NTdHJpa2UxNVYyTWF0Y2htYWtpbmdTdG9wID0ge1xuICAgIGVuY29kZShtZXNzYWdlLCB3cml0ZXIgPSBtaW5pbWFsXzEuV3JpdGVyLmNyZWF0ZSgpKSB7XG4gICAgICAgIGlmIChtZXNzYWdlLmFiYW5kb24gIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoOCkuaW50MzIobWVzc2FnZS5hYmFuZG9uKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH0sXG4gICAgZGVjb2RlKGlucHV0LCBsZW5ndGgpIHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gaW5wdXQgaW5zdGFuY2VvZiBtaW5pbWFsXzEuUmVhZGVyID8gaW5wdXQgOiBuZXcgbWluaW1hbF8xLlJlYWRlcihpbnB1dCk7XG4gICAgICAgIGxldCBlbmQgPSBsZW5ndGggPT09IHVuZGVmaW5lZCA/IHJlYWRlci5sZW4gOiByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNNc2dHQ0NTdHJpa2UxNVYyTWF0Y2htYWtpbmdTdG9wKCk7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBjb25zdCB0YWcgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKHRhZyA+Pj4gMykge1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5hYmFuZG9uID0gcmVhZGVyLmludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJlYWRlci5za2lwVHlwZSh0YWcgJiA3KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfSxcbiAgICBmcm9tUGFydGlhbChvYmplY3QpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNNc2dHQ0NTdHJpa2UxNVYyTWF0Y2htYWtpbmdTdG9wKCk7XG4gICAgICAgIG1lc3NhZ2UuYWJhbmRvbiA9IChfYSA9IG9iamVjdC5hYmFuZG9uKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAwO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG59O1xuZnVuY3Rpb24gY3JlYXRlQmFzZUNNc2dHQ0NTdHJpa2UxNVYyTWF0Y2htYWtpbmdDbGllbnQyU2VydmVyUGluZygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBnYW1lc2VydmVycGluZ3M6IFtdLFxuICAgICAgICBvZmZzZXRJbmRleDogMCxcbiAgICAgICAgZmluYWxCYXRjaDogMCxcbiAgICAgICAgZGF0YUNlbnRlclBpbmdzOiBbXSxcbiAgICAgICAgbWF4UGluZzogMCxcbiAgICAgICAgdGVzdFRva2VuOiAwXG4gICAgfTtcbn1cbmV4cG9ydHMuQ01zZ0dDQ1N0cmlrZTE1VjJNYXRjaG1ha2luZ0NsaWVudDJTZXJ2ZXJQaW5nID0ge1xuICAgIGVuY29kZShtZXNzYWdlLCB3cml0ZXIgPSBtaW5pbWFsXzEuV3JpdGVyLmNyZWF0ZSgpKSB7XG4gICAgICAgIGZvciAoY29uc3QgdiBvZiBtZXNzYWdlLmdhbWVzZXJ2ZXJwaW5ncykge1xuICAgICAgICAgICAgZXhwb3J0cy5HYW1lU2VydmVyUGluZy5lbmNvZGUodiwgd3JpdGVyLnVpbnQzMigxMCkuZm9yaygpKS5sZGVsaW0oKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5vZmZzZXRJbmRleCAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigxNikuaW50MzIobWVzc2FnZS5vZmZzZXRJbmRleCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UuZmluYWxCYXRjaCAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigyNCkuaW50MzIobWVzc2FnZS5maW5hbEJhdGNoKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IHYgb2YgbWVzc2FnZS5kYXRhQ2VudGVyUGluZ3MpIHtcbiAgICAgICAgICAgIGV4cG9ydHMuRGF0YUNlbnRlclBpbmcuZW5jb2RlKHYsIHdyaXRlci51aW50MzIoMzQpLmZvcmsoKSkubGRlbGltKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UubWF4UGluZyAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig0MCkudWludDMyKG1lc3NhZ2UubWF4UGluZyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UudGVzdFRva2VuICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDUzKS5maXhlZDMyKG1lc3NhZ2UudGVzdFRva2VuKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH0sXG4gICAgZGVjb2RlKGlucHV0LCBsZW5ndGgpIHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gaW5wdXQgaW5zdGFuY2VvZiBtaW5pbWFsXzEuUmVhZGVyID8gaW5wdXQgOiBuZXcgbWluaW1hbF8xLlJlYWRlcihpbnB1dCk7XG4gICAgICAgIGxldCBlbmQgPSBsZW5ndGggPT09IHVuZGVmaW5lZCA/IHJlYWRlci5sZW4gOiByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNNc2dHQ0NTdHJpa2UxNVYyTWF0Y2htYWtpbmdDbGllbnQyU2VydmVyUGluZygpO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZ2FtZXNlcnZlcnBpbmdzLnB1c2goZXhwb3J0cy5HYW1lU2VydmVyUGluZy5kZWNvZGUocmVhZGVyLCByZWFkZXIudWludDMyKCkpKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLm9mZnNldEluZGV4ID0gcmVhZGVyLmludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5maW5hbEJhdGNoID0gcmVhZGVyLmludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5kYXRhQ2VudGVyUGluZ3MucHVzaChleHBvcnRzLkRhdGFDZW50ZXJQaW5nLmRlY29kZShyZWFkZXIsIHJlYWRlci51aW50MzIoKSkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UubWF4UGluZyA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnRlc3RUb2tlbiA9IHJlYWRlci5maXhlZDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJlYWRlci5za2lwVHlwZSh0YWcgJiA3KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfSxcbiAgICBmcm9tUGFydGlhbChvYmplY3QpIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2MsIF9kLCBfZSwgX2Y7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ01zZ0dDQ1N0cmlrZTE1VjJNYXRjaG1ha2luZ0NsaWVudDJTZXJ2ZXJQaW5nKCk7XG4gICAgICAgIG1lc3NhZ2UuZ2FtZXNlcnZlcnBpbmdzID1cbiAgICAgICAgICAgICgoX2EgPSBvYmplY3QuZ2FtZXNlcnZlcnBpbmdzKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EubWFwKGUgPT4gZXhwb3J0cy5HYW1lU2VydmVyUGluZy5mcm9tUGFydGlhbChlKSkpIHx8IFtdO1xuICAgICAgICBtZXNzYWdlLm9mZnNldEluZGV4ID0gKF9iID0gb2JqZWN0Lm9mZnNldEluZGV4KSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAwO1xuICAgICAgICBtZXNzYWdlLmZpbmFsQmF0Y2ggPSAoX2MgPSBvYmplY3QuZmluYWxCYXRjaCkgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogMDtcbiAgICAgICAgbWVzc2FnZS5kYXRhQ2VudGVyUGluZ3MgPVxuICAgICAgICAgICAgKChfZCA9IG9iamVjdC5kYXRhQ2VudGVyUGluZ3MpID09PSBudWxsIHx8IF9kID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZC5tYXAoZSA9PiBleHBvcnRzLkRhdGFDZW50ZXJQaW5nLmZyb21QYXJ0aWFsKGUpKSkgfHwgW107XG4gICAgICAgIG1lc3NhZ2UubWF4UGluZyA9IChfZSA9IG9iamVjdC5tYXhQaW5nKSAhPT0gbnVsbCAmJiBfZSAhPT0gdm9pZCAwID8gX2UgOiAwO1xuICAgICAgICBtZXNzYWdlLnRlc3RUb2tlbiA9IChfZiA9IG9iamVjdC50ZXN0VG9rZW4pICE9PSBudWxsICYmIF9mICE9PSB2b2lkIDAgPyBfZiA6IDA7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbn07XG5mdW5jdGlvbiBjcmVhdGVCYXNlQ01zZ0dDQ1N0cmlrZTE1VjJNYXRjaG1ha2luZ0dDMkNsaWVudFVwZGF0ZSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBtYXRjaG1ha2luZzogMCxcbiAgICAgICAgd2FpdGluZ0FjY291bnRJZFNlc3Npb25zOiBbXSxcbiAgICAgICAgZXJyb3I6IFwiXCIsXG4gICAgICAgIG9uZ29pbmdtYXRjaEFjY291bnRJZFNlc3Npb25zOiBbXSxcbiAgICAgICAgZ2xvYmFsU3RhdHM6IHVuZGVmaW5lZCxcbiAgICAgICAgZmFpbHBpbmdBY2NvdW50SWRTZXNzaW9uczogW10sXG4gICAgICAgIHBlbmFsdHlBY2NvdW50SWRTZXNzaW9uczogW10sXG4gICAgICAgIGZhaWxyZWFkeUFjY291bnRJZFNlc3Npb25zOiBbXSxcbiAgICAgICAgdmFjYmFubmVkQWNjb3VudElkU2Vzc2lvbnM6IFtdLFxuICAgICAgICBzZXJ2ZXJJcGFkZHJlc3NNYXNrOiB1bmRlZmluZWQsXG4gICAgICAgIG5vdGVzOiBbXSxcbiAgICAgICAgcGVuYWx0eUFjY291bnRJZFNlc3Npb25zR3JlZW46IFtdLFxuICAgICAgICBpbnN1ZmZpY2llbnRsZXZlbFNlc3Npb25zOiBbXSxcbiAgICAgICAgdnNuY2hlY2tBY2NvdW50SWRTZXNzaW9uczogW10sXG4gICAgICAgIGxhdW5jaGVyTWlzbWF0Y2hTZXNzaW9uczogW10sXG4gICAgICAgIGluc2VjdXJlQWNjb3VudElkU2Vzc2lvbnM6IFtdXG4gICAgfTtcbn1cbmV4cG9ydHMuQ01zZ0dDQ1N0cmlrZTE1VjJNYXRjaG1ha2luZ0dDMkNsaWVudFVwZGF0ZSA9IHtcbiAgICBlbmNvZGUobWVzc2FnZSwgd3JpdGVyID0gbWluaW1hbF8xLldyaXRlci5jcmVhdGUoKSkge1xuICAgICAgICBpZiAobWVzc2FnZS5tYXRjaG1ha2luZyAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig4KS5pbnQzMihtZXNzYWdlLm1hdGNobWFraW5nKTtcbiAgICAgICAgfVxuICAgICAgICB3cml0ZXIudWludDMyKDE4KS5mb3JrKCk7XG4gICAgICAgIGZvciAoY29uc3QgdiBvZiBtZXNzYWdlLndhaXRpbmdBY2NvdW50SWRTZXNzaW9ucykge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMih2KTtcbiAgICAgICAgfVxuICAgICAgICB3cml0ZXIubGRlbGltKCk7XG4gICAgICAgIGlmIChtZXNzYWdlLmVycm9yICE9PSBcIlwiKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDI2KS5zdHJpbmcobWVzc2FnZS5lcnJvcik7XG4gICAgICAgIH1cbiAgICAgICAgd3JpdGVyLnVpbnQzMig1MCkuZm9yaygpO1xuICAgICAgICBmb3IgKGNvbnN0IHYgb2YgbWVzc2FnZS5vbmdvaW5nbWF0Y2hBY2NvdW50SWRTZXNzaW9ucykge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMih2KTtcbiAgICAgICAgfVxuICAgICAgICB3cml0ZXIubGRlbGltKCk7XG4gICAgICAgIGlmIChtZXNzYWdlLmdsb2JhbFN0YXRzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGV4cG9ydHMuR2xvYmFsU3RhdGlzdGljcy5lbmNvZGUobWVzc2FnZS5nbG9iYWxTdGF0cywgd3JpdGVyLnVpbnQzMig1OCkuZm9yaygpKS5sZGVsaW0oKTtcbiAgICAgICAgfVxuICAgICAgICB3cml0ZXIudWludDMyKDY2KS5mb3JrKCk7XG4gICAgICAgIGZvciAoY29uc3QgdiBvZiBtZXNzYWdlLmZhaWxwaW5nQWNjb3VudElkU2Vzc2lvbnMpIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIodik7XG4gICAgICAgIH1cbiAgICAgICAgd3JpdGVyLmxkZWxpbSgpO1xuICAgICAgICB3cml0ZXIudWludDMyKDc0KS5mb3JrKCk7XG4gICAgICAgIGZvciAoY29uc3QgdiBvZiBtZXNzYWdlLnBlbmFsdHlBY2NvdW50SWRTZXNzaW9ucykge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMih2KTtcbiAgICAgICAgfVxuICAgICAgICB3cml0ZXIubGRlbGltKCk7XG4gICAgICAgIHdyaXRlci51aW50MzIoODIpLmZvcmsoKTtcbiAgICAgICAgZm9yIChjb25zdCB2IG9mIG1lc3NhZ2UuZmFpbHJlYWR5QWNjb3VudElkU2Vzc2lvbnMpIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIodik7XG4gICAgICAgIH1cbiAgICAgICAgd3JpdGVyLmxkZWxpbSgpO1xuICAgICAgICB3cml0ZXIudWludDMyKDkwKS5mb3JrKCk7XG4gICAgICAgIGZvciAoY29uc3QgdiBvZiBtZXNzYWdlLnZhY2Jhbm5lZEFjY291bnRJZFNlc3Npb25zKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKHYpO1xuICAgICAgICB9XG4gICAgICAgIHdyaXRlci5sZGVsaW0oKTtcbiAgICAgICAgaWYgKG1lc3NhZ2Uuc2VydmVySXBhZGRyZXNzTWFzayAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBleHBvcnRzLklwQWRkcmVzc01hc2suZW5jb2RlKG1lc3NhZ2Uuc2VydmVySXBhZGRyZXNzTWFzaywgd3JpdGVyLnVpbnQzMig5OCkuZm9yaygpKS5sZGVsaW0oKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IHYgb2YgbWVzc2FnZS5ub3Rlcykge1xuICAgICAgICAgICAgZXhwb3J0cy5DTXNnR0NDU3RyaWtlMTVWMk1hdGNobWFraW5nR0MyQ2xpZW50VXBkYXRlX05vdGUuZW5jb2RlKHYsIHdyaXRlci51aW50MzIoMTA2KS5mb3JrKCkpLmxkZWxpbSgpO1xuICAgICAgICB9XG4gICAgICAgIHdyaXRlci51aW50MzIoMTE0KS5mb3JrKCk7XG4gICAgICAgIGZvciAoY29uc3QgdiBvZiBtZXNzYWdlLnBlbmFsdHlBY2NvdW50SWRTZXNzaW9uc0dyZWVuKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKHYpO1xuICAgICAgICB9XG4gICAgICAgIHdyaXRlci5sZGVsaW0oKTtcbiAgICAgICAgd3JpdGVyLnVpbnQzMigxMjIpLmZvcmsoKTtcbiAgICAgICAgZm9yIChjb25zdCB2IG9mIG1lc3NhZ2UuaW5zdWZmaWNpZW50bGV2ZWxTZXNzaW9ucykge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMih2KTtcbiAgICAgICAgfVxuICAgICAgICB3cml0ZXIubGRlbGltKCk7XG4gICAgICAgIHdyaXRlci51aW50MzIoMTMwKS5mb3JrKCk7XG4gICAgICAgIGZvciAoY29uc3QgdiBvZiBtZXNzYWdlLnZzbmNoZWNrQWNjb3VudElkU2Vzc2lvbnMpIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIodik7XG4gICAgICAgIH1cbiAgICAgICAgd3JpdGVyLmxkZWxpbSgpO1xuICAgICAgICB3cml0ZXIudWludDMyKDEzOCkuZm9yaygpO1xuICAgICAgICBmb3IgKGNvbnN0IHYgb2YgbWVzc2FnZS5sYXVuY2hlck1pc21hdGNoU2Vzc2lvbnMpIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIodik7XG4gICAgICAgIH1cbiAgICAgICAgd3JpdGVyLmxkZWxpbSgpO1xuICAgICAgICB3cml0ZXIudWludDMyKDE0NikuZm9yaygpO1xuICAgICAgICBmb3IgKGNvbnN0IHYgb2YgbWVzc2FnZS5pbnNlY3VyZUFjY291bnRJZFNlc3Npb25zKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKHYpO1xuICAgICAgICB9XG4gICAgICAgIHdyaXRlci5sZGVsaW0oKTtcbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9LFxuICAgIGRlY29kZShpbnB1dCwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IGlucHV0IGluc3RhbmNlb2YgbWluaW1hbF8xLlJlYWRlciA/IGlucHV0IDogbmV3IG1pbmltYWxfMS5SZWFkZXIoaW5wdXQpO1xuICAgICAgICBsZXQgZW5kID0gbGVuZ3RoID09PSB1bmRlZmluZWQgPyByZWFkZXIubGVuIDogcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDTXNnR0NDU3RyaWtlMTVWMk1hdGNobWFraW5nR0MyQ2xpZW50VXBkYXRlKCk7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBjb25zdCB0YWcgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKHRhZyA+Pj4gMykge1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5tYXRjaG1ha2luZyA9IHJlYWRlci5pbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIGlmICgodGFnICYgNykgPT09IDIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuZDIgPSByZWFkZXIudWludDMyKCkgKyByZWFkZXIucG9zO1xuICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS53YWl0aW5nQWNjb3VudElkU2Vzc2lvbnMucHVzaChyZWFkZXIudWludDMyKCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS53YWl0aW5nQWNjb3VudElkU2Vzc2lvbnMucHVzaChyZWFkZXIudWludDMyKCkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5lcnJvciA9IHJlYWRlci5zdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICBpZiAoKHRhZyAmIDcpID09PSAyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbmQyID0gcmVhZGVyLnVpbnQzMigpICsgcmVhZGVyLnBvcztcbiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kMikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Uub25nb2luZ21hdGNoQWNjb3VudElkU2Vzc2lvbnMucHVzaChyZWFkZXIudWludDMyKCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5vbmdvaW5nbWF0Y2hBY2NvdW50SWRTZXNzaW9ucy5wdXNoKHJlYWRlci51aW50MzIoKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA3OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmdsb2JhbFN0YXRzID0gZXhwb3J0cy5HbG9iYWxTdGF0aXN0aWNzLmRlY29kZShyZWFkZXIsIHJlYWRlci51aW50MzIoKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgODpcbiAgICAgICAgICAgICAgICAgICAgaWYgKCh0YWcgJiA3KSA9PT0gMikge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZW5kMiA9IHJlYWRlci51aW50MzIoKSArIHJlYWRlci5wb3M7XG4gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZDIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmZhaWxwaW5nQWNjb3VudElkU2Vzc2lvbnMucHVzaChyZWFkZXIudWludDMyKCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5mYWlscGluZ0FjY291bnRJZFNlc3Npb25zLnB1c2gocmVhZGVyLnVpbnQzMigpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDk6XG4gICAgICAgICAgICAgICAgICAgIGlmICgodGFnICYgNykgPT09IDIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuZDIgPSByZWFkZXIudWludDMyKCkgKyByZWFkZXIucG9zO1xuICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5wZW5hbHR5QWNjb3VudElkU2Vzc2lvbnMucHVzaChyZWFkZXIudWludDMyKCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5wZW5hbHR5QWNjb3VudElkU2Vzc2lvbnMucHVzaChyZWFkZXIudWludDMyKCkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMTA6XG4gICAgICAgICAgICAgICAgICAgIGlmICgodGFnICYgNykgPT09IDIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuZDIgPSByZWFkZXIudWludDMyKCkgKyByZWFkZXIucG9zO1xuICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5mYWlscmVhZHlBY2NvdW50SWRTZXNzaW9ucy5wdXNoKHJlYWRlci51aW50MzIoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmZhaWxyZWFkeUFjY291bnRJZFNlc3Npb25zLnB1c2gocmVhZGVyLnVpbnQzMigpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDExOlxuICAgICAgICAgICAgICAgICAgICBpZiAoKHRhZyAmIDcpID09PSAyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbmQyID0gcmVhZGVyLnVpbnQzMigpICsgcmVhZGVyLnBvcztcbiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kMikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudmFjYmFubmVkQWNjb3VudElkU2Vzc2lvbnMucHVzaChyZWFkZXIudWludDMyKCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS52YWNiYW5uZWRBY2NvdW50SWRTZXNzaW9ucy5wdXNoKHJlYWRlci51aW50MzIoKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAxMjpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5zZXJ2ZXJJcGFkZHJlc3NNYXNrID0gZXhwb3J0cy5JcEFkZHJlc3NNYXNrLmRlY29kZShyZWFkZXIsIHJlYWRlci51aW50MzIoKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMTM6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Uubm90ZXMucHVzaChleHBvcnRzLkNNc2dHQ0NTdHJpa2UxNVYyTWF0Y2htYWtpbmdHQzJDbGllbnRVcGRhdGVfTm90ZS5kZWNvZGUocmVhZGVyLCByZWFkZXIudWludDMyKCkpKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAxNDpcbiAgICAgICAgICAgICAgICAgICAgaWYgKCh0YWcgJiA3KSA9PT0gMikge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZW5kMiA9IHJlYWRlci51aW50MzIoKSArIHJlYWRlci5wb3M7XG4gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZDIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnBlbmFsdHlBY2NvdW50SWRTZXNzaW9uc0dyZWVuLnB1c2gocmVhZGVyLnVpbnQzMigpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UucGVuYWx0eUFjY291bnRJZFNlc3Npb25zR3JlZW4ucHVzaChyZWFkZXIudWludDMyKCkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMTU6XG4gICAgICAgICAgICAgICAgICAgIGlmICgodGFnICYgNykgPT09IDIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuZDIgPSByZWFkZXIudWludDMyKCkgKyByZWFkZXIucG9zO1xuICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5pbnN1ZmZpY2llbnRsZXZlbFNlc3Npb25zLnB1c2gocmVhZGVyLnVpbnQzMigpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuaW5zdWZmaWNpZW50bGV2ZWxTZXNzaW9ucy5wdXNoKHJlYWRlci51aW50MzIoKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAxNjpcbiAgICAgICAgICAgICAgICAgICAgaWYgKCh0YWcgJiA3KSA9PT0gMikge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZW5kMiA9IHJlYWRlci51aW50MzIoKSArIHJlYWRlci5wb3M7XG4gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZDIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnZzbmNoZWNrQWNjb3VudElkU2Vzc2lvbnMucHVzaChyZWFkZXIudWludDMyKCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS52c25jaGVja0FjY291bnRJZFNlc3Npb25zLnB1c2gocmVhZGVyLnVpbnQzMigpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDE3OlxuICAgICAgICAgICAgICAgICAgICBpZiAoKHRhZyAmIDcpID09PSAyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbmQyID0gcmVhZGVyLnVpbnQzMigpICsgcmVhZGVyLnBvcztcbiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kMikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UubGF1bmNoZXJNaXNtYXRjaFNlc3Npb25zLnB1c2gocmVhZGVyLnVpbnQzMigpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UubGF1bmNoZXJNaXNtYXRjaFNlc3Npb25zLnB1c2gocmVhZGVyLnVpbnQzMigpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDE4OlxuICAgICAgICAgICAgICAgICAgICBpZiAoKHRhZyAmIDcpID09PSAyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbmQyID0gcmVhZGVyLnVpbnQzMigpICsgcmVhZGVyLnBvcztcbiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kMikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuaW5zZWN1cmVBY2NvdW50SWRTZXNzaW9ucy5wdXNoKHJlYWRlci51aW50MzIoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmluc2VjdXJlQWNjb3VudElkU2Vzc2lvbnMucHVzaChyZWFkZXIudWludDMyKCkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJlYWRlci5za2lwVHlwZSh0YWcgJiA3KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfSxcbiAgICBmcm9tUGFydGlhbChvYmplY3QpIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2MsIF9kLCBfZSwgX2YsIF9nLCBfaCwgX2osIF9rLCBfbCwgX20sIF9vLCBfcDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDTXNnR0NDU3RyaWtlMTVWMk1hdGNobWFraW5nR0MyQ2xpZW50VXBkYXRlKCk7XG4gICAgICAgIG1lc3NhZ2UubWF0Y2htYWtpbmcgPSAoX2EgPSBvYmplY3QubWF0Y2htYWtpbmcpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IDA7XG4gICAgICAgIG1lc3NhZ2Uud2FpdGluZ0FjY291bnRJZFNlc3Npb25zID1cbiAgICAgICAgICAgICgoX2IgPSBvYmplY3Qud2FpdGluZ0FjY291bnRJZFNlc3Npb25zKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IubWFwKGUgPT4gZSkpIHx8IFtdO1xuICAgICAgICBtZXNzYWdlLmVycm9yID0gKF9jID0gb2JqZWN0LmVycm9yKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiBcIlwiO1xuICAgICAgICBtZXNzYWdlLm9uZ29pbmdtYXRjaEFjY291bnRJZFNlc3Npb25zID1cbiAgICAgICAgICAgICgoX2QgPSBvYmplY3Qub25nb2luZ21hdGNoQWNjb3VudElkU2Vzc2lvbnMpID09PSBudWxsIHx8IF9kID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZC5tYXAoZSA9PiBlKSkgfHwgW107XG4gICAgICAgIG1lc3NhZ2UuZ2xvYmFsU3RhdHMgPVxuICAgICAgICAgICAgb2JqZWN0Lmdsb2JhbFN0YXRzICE9PSB1bmRlZmluZWQgJiYgb2JqZWN0Lmdsb2JhbFN0YXRzICE9PSBudWxsXG4gICAgICAgICAgICAgICAgPyBleHBvcnRzLkdsb2JhbFN0YXRpc3RpY3MuZnJvbVBhcnRpYWwob2JqZWN0Lmdsb2JhbFN0YXRzKVxuICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgICBtZXNzYWdlLmZhaWxwaW5nQWNjb3VudElkU2Vzc2lvbnMgPVxuICAgICAgICAgICAgKChfZSA9IG9iamVjdC5mYWlscGluZ0FjY291bnRJZFNlc3Npb25zKSA9PT0gbnVsbCB8fCBfZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2UubWFwKGUgPT4gZSkpIHx8IFtdO1xuICAgICAgICBtZXNzYWdlLnBlbmFsdHlBY2NvdW50SWRTZXNzaW9ucyA9XG4gICAgICAgICAgICAoKF9mID0gb2JqZWN0LnBlbmFsdHlBY2NvdW50SWRTZXNzaW9ucykgPT09IG51bGwgfHwgX2YgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9mLm1hcChlID0+IGUpKSB8fCBbXTtcbiAgICAgICAgbWVzc2FnZS5mYWlscmVhZHlBY2NvdW50SWRTZXNzaW9ucyA9XG4gICAgICAgICAgICAoKF9nID0gb2JqZWN0LmZhaWxyZWFkeUFjY291bnRJZFNlc3Npb25zKSA9PT0gbnVsbCB8fCBfZyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2cubWFwKGUgPT4gZSkpIHx8IFtdO1xuICAgICAgICBtZXNzYWdlLnZhY2Jhbm5lZEFjY291bnRJZFNlc3Npb25zID1cbiAgICAgICAgICAgICgoX2ggPSBvYmplY3QudmFjYmFubmVkQWNjb3VudElkU2Vzc2lvbnMpID09PSBudWxsIHx8IF9oID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfaC5tYXAoZSA9PiBlKSkgfHwgW107XG4gICAgICAgIG1lc3NhZ2Uuc2VydmVySXBhZGRyZXNzTWFzayA9XG4gICAgICAgICAgICBvYmplY3Quc2VydmVySXBhZGRyZXNzTWFzayAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAgICAgb2JqZWN0LnNlcnZlcklwYWRkcmVzc01hc2sgIT09IG51bGxcbiAgICAgICAgICAgICAgICA/IGV4cG9ydHMuSXBBZGRyZXNzTWFzay5mcm9tUGFydGlhbChvYmplY3Quc2VydmVySXBhZGRyZXNzTWFzaylcbiAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgICAgbWVzc2FnZS5ub3RlcyA9XG4gICAgICAgICAgICAoKF9qID0gb2JqZWN0Lm5vdGVzKSA9PT0gbnVsbCB8fCBfaiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2oubWFwKGUgPT4gZXhwb3J0cy5DTXNnR0NDU3RyaWtlMTVWMk1hdGNobWFraW5nR0MyQ2xpZW50VXBkYXRlX05vdGUuZnJvbVBhcnRpYWwoZSkpKSB8fCBbXTtcbiAgICAgICAgbWVzc2FnZS5wZW5hbHR5QWNjb3VudElkU2Vzc2lvbnNHcmVlbiA9XG4gICAgICAgICAgICAoKF9rID0gb2JqZWN0LnBlbmFsdHlBY2NvdW50SWRTZXNzaW9uc0dyZWVuKSA9PT0gbnVsbCB8fCBfayA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2subWFwKGUgPT4gZSkpIHx8IFtdO1xuICAgICAgICBtZXNzYWdlLmluc3VmZmljaWVudGxldmVsU2Vzc2lvbnMgPVxuICAgICAgICAgICAgKChfbCA9IG9iamVjdC5pbnN1ZmZpY2llbnRsZXZlbFNlc3Npb25zKSA9PT0gbnVsbCB8fCBfbCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2wubWFwKGUgPT4gZSkpIHx8IFtdO1xuICAgICAgICBtZXNzYWdlLnZzbmNoZWNrQWNjb3VudElkU2Vzc2lvbnMgPVxuICAgICAgICAgICAgKChfbSA9IG9iamVjdC52c25jaGVja0FjY291bnRJZFNlc3Npb25zKSA9PT0gbnVsbCB8fCBfbSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX20ubWFwKGUgPT4gZSkpIHx8IFtdO1xuICAgICAgICBtZXNzYWdlLmxhdW5jaGVyTWlzbWF0Y2hTZXNzaW9ucyA9XG4gICAgICAgICAgICAoKF9vID0gb2JqZWN0LmxhdW5jaGVyTWlzbWF0Y2hTZXNzaW9ucykgPT09IG51bGwgfHwgX28gPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9vLm1hcChlID0+IGUpKSB8fCBbXTtcbiAgICAgICAgbWVzc2FnZS5pbnNlY3VyZUFjY291bnRJZFNlc3Npb25zID1cbiAgICAgICAgICAgICgoX3AgPSBvYmplY3QuaW5zZWN1cmVBY2NvdW50SWRTZXNzaW9ucykgPT09IG51bGwgfHwgX3AgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9wLm1hcChlID0+IGUpKSB8fCBbXTtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxufTtcbmZ1bmN0aW9uIGNyZWF0ZUJhc2VDTXNnR0NDU3RyaWtlMTVWMk1hdGNobWFraW5nR0MyQ2xpZW50VXBkYXRlX05vdGUoKSB7XG4gICAgcmV0dXJuIHsgdHlwZTogMCwgcmVnaW9uSWQ6IDAsIHJlZ2lvblI6IDAsIGRpc3RhbmNlOiAwIH07XG59XG5leHBvcnRzLkNNc2dHQ0NTdHJpa2UxNVYyTWF0Y2htYWtpbmdHQzJDbGllbnRVcGRhdGVfTm90ZSA9IHtcbiAgICBlbmNvZGUobWVzc2FnZSwgd3JpdGVyID0gbWluaW1hbF8xLldyaXRlci5jcmVhdGUoKSkge1xuICAgICAgICBpZiAobWVzc2FnZS50eXBlICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDgpLmludDMyKG1lc3NhZ2UudHlwZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UucmVnaW9uSWQgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMTYpLmludDMyKG1lc3NhZ2UucmVnaW9uSWQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLnJlZ2lvblIgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMjkpLmZsb2F0KG1lc3NhZ2UucmVnaW9uUik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UuZGlzdGFuY2UgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMzcpLmZsb2F0KG1lc3NhZ2UuZGlzdGFuY2UpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfSxcbiAgICBkZWNvZGUoaW5wdXQsIGxlbmd0aCkge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBpbnB1dCBpbnN0YW5jZW9mIG1pbmltYWxfMS5SZWFkZXIgPyBpbnB1dCA6IG5ldyBtaW5pbWFsXzEuUmVhZGVyKGlucHV0KTtcbiAgICAgICAgbGV0IGVuZCA9IGxlbmd0aCA9PT0gdW5kZWZpbmVkID8gcmVhZGVyLmxlbiA6IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ01zZ0dDQ1N0cmlrZTE1VjJNYXRjaG1ha2luZ0dDMkNsaWVudFVwZGF0ZV9Ob3RlKCk7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBjb25zdCB0YWcgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKHRhZyA+Pj4gMykge1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS50eXBlID0gcmVhZGVyLmludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5yZWdpb25JZCA9IHJlYWRlci5pbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UucmVnaW9uUiA9IHJlYWRlci5mbG9hdCgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZGlzdGFuY2UgPSByZWFkZXIuZmxvYXQoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmVhZGVyLnNraXBUeXBlKHRhZyAmIDcpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9LFxuICAgIGZyb21QYXJ0aWFsKG9iamVjdCkge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYywgX2Q7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ01zZ0dDQ1N0cmlrZTE1VjJNYXRjaG1ha2luZ0dDMkNsaWVudFVwZGF0ZV9Ob3RlKCk7XG4gICAgICAgIG1lc3NhZ2UudHlwZSA9IChfYSA9IG9iamVjdC50eXBlKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAwO1xuICAgICAgICBtZXNzYWdlLnJlZ2lvbklkID0gKF9iID0gb2JqZWN0LnJlZ2lvbklkKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAwO1xuICAgICAgICBtZXNzYWdlLnJlZ2lvblIgPSAoX2MgPSBvYmplY3QucmVnaW9uUikgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogMDtcbiAgICAgICAgbWVzc2FnZS5kaXN0YW5jZSA9IChfZCA9IG9iamVjdC5kaXN0YW5jZSkgIT09IG51bGwgJiYgX2QgIT09IHZvaWQgMCA/IF9kIDogMDtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxufTtcbmZ1bmN0aW9uIGNyZWF0ZUJhc2VDRGF0YUdDQ1N0cmlrZTE1VjJUb3VybmFtZW50TWF0Y2hEcmFmdCgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBldmVudElkOiAwLFxuICAgICAgICBldmVudFN0YWdlSWQ6IDAsXG4gICAgICAgIHRlYW1JZDA6IDAsXG4gICAgICAgIHRlYW1JZDE6IDAsXG4gICAgICAgIG1hcHNDb3VudDogMCxcbiAgICAgICAgbWFwc0N1cnJlbnQ6IDAsXG4gICAgICAgIHRlYW1JZFN0YXJ0OiAwLFxuICAgICAgICB0ZWFtSWRWZXRvMTogMCxcbiAgICAgICAgdGVhbUlkUGlja246IDAsXG4gICAgICAgIGRyYWZ0czogW11cbiAgICB9O1xufVxuZXhwb3J0cy5DRGF0YUdDQ1N0cmlrZTE1VjJUb3VybmFtZW50TWF0Y2hEcmFmdCA9IHtcbiAgICBlbmNvZGUobWVzc2FnZSwgd3JpdGVyID0gbWluaW1hbF8xLldyaXRlci5jcmVhdGUoKSkge1xuICAgICAgICBpZiAobWVzc2FnZS5ldmVudElkICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDgpLmludDMyKG1lc3NhZ2UuZXZlbnRJZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UuZXZlbnRTdGFnZUlkICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDE2KS5pbnQzMihtZXNzYWdlLmV2ZW50U3RhZ2VJZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UudGVhbUlkMCAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigyNCkuaW50MzIobWVzc2FnZS50ZWFtSWQwKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS50ZWFtSWQxICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDMyKS5pbnQzMihtZXNzYWdlLnRlYW1JZDEpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLm1hcHNDb3VudCAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig0MCkuaW50MzIobWVzc2FnZS5tYXBzQ291bnQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLm1hcHNDdXJyZW50ICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDQ4KS5pbnQzMihtZXNzYWdlLm1hcHNDdXJyZW50KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS50ZWFtSWRTdGFydCAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig1NikuaW50MzIobWVzc2FnZS50ZWFtSWRTdGFydCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UudGVhbUlkVmV0bzEgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoNjQpLmludDMyKG1lc3NhZ2UudGVhbUlkVmV0bzEpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLnRlYW1JZFBpY2tuICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDcyKS5pbnQzMihtZXNzYWdlLnRlYW1JZFBpY2tuKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IHYgb2YgbWVzc2FnZS5kcmFmdHMpIHtcbiAgICAgICAgICAgIGV4cG9ydHMuQ0RhdGFHQ0NTdHJpa2UxNVYyVG91cm5hbWVudE1hdGNoRHJhZnRfRW50cnkuZW5jb2RlKHYsIHdyaXRlci51aW50MzIoODIpLmZvcmsoKSkubGRlbGltKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9LFxuICAgIGRlY29kZShpbnB1dCwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IGlucHV0IGluc3RhbmNlb2YgbWluaW1hbF8xLlJlYWRlciA/IGlucHV0IDogbmV3IG1pbmltYWxfMS5SZWFkZXIoaW5wdXQpO1xuICAgICAgICBsZXQgZW5kID0gbGVuZ3RoID09PSB1bmRlZmluZWQgPyByZWFkZXIubGVuIDogcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDRGF0YUdDQ1N0cmlrZTE1VjJUb3VybmFtZW50TWF0Y2hEcmFmdCgpO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZXZlbnRJZCA9IHJlYWRlci5pbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZXZlbnRTdGFnZUlkID0gcmVhZGVyLmludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS50ZWFtSWQwID0gcmVhZGVyLmludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS50ZWFtSWQxID0gcmVhZGVyLmludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5tYXBzQ291bnQgPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLm1hcHNDdXJyZW50ID0gcmVhZGVyLmludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNzpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS50ZWFtSWRTdGFydCA9IHJlYWRlci5pbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDg6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudGVhbUlkVmV0bzEgPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA5OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnRlYW1JZFBpY2tuID0gcmVhZGVyLmludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMTA6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZHJhZnRzLnB1c2goZXhwb3J0cy5DRGF0YUdDQ1N0cmlrZTE1VjJUb3VybmFtZW50TWF0Y2hEcmFmdF9FbnRyeS5kZWNvZGUocmVhZGVyLCByZWFkZXIudWludDMyKCkpKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmVhZGVyLnNraXBUeXBlKHRhZyAmIDcpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9LFxuICAgIGZyb21QYXJ0aWFsKG9iamVjdCkge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYywgX2QsIF9lLCBfZiwgX2csIF9oLCBfaiwgX2s7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ0RhdGFHQ0NTdHJpa2UxNVYyVG91cm5hbWVudE1hdGNoRHJhZnQoKTtcbiAgICAgICAgbWVzc2FnZS5ldmVudElkID0gKF9hID0gb2JqZWN0LmV2ZW50SWQpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IDA7XG4gICAgICAgIG1lc3NhZ2UuZXZlbnRTdGFnZUlkID0gKF9iID0gb2JqZWN0LmV2ZW50U3RhZ2VJZCkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogMDtcbiAgICAgICAgbWVzc2FnZS50ZWFtSWQwID0gKF9jID0gb2JqZWN0LnRlYW1JZDApICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IDA7XG4gICAgICAgIG1lc3NhZ2UudGVhbUlkMSA9IChfZCA9IG9iamVjdC50ZWFtSWQxKSAhPT0gbnVsbCAmJiBfZCAhPT0gdm9pZCAwID8gX2QgOiAwO1xuICAgICAgICBtZXNzYWdlLm1hcHNDb3VudCA9IChfZSA9IG9iamVjdC5tYXBzQ291bnQpICE9PSBudWxsICYmIF9lICE9PSB2b2lkIDAgPyBfZSA6IDA7XG4gICAgICAgIG1lc3NhZ2UubWFwc0N1cnJlbnQgPSAoX2YgPSBvYmplY3QubWFwc0N1cnJlbnQpICE9PSBudWxsICYmIF9mICE9PSB2b2lkIDAgPyBfZiA6IDA7XG4gICAgICAgIG1lc3NhZ2UudGVhbUlkU3RhcnQgPSAoX2cgPSBvYmplY3QudGVhbUlkU3RhcnQpICE9PSBudWxsICYmIF9nICE9PSB2b2lkIDAgPyBfZyA6IDA7XG4gICAgICAgIG1lc3NhZ2UudGVhbUlkVmV0bzEgPSAoX2ggPSBvYmplY3QudGVhbUlkVmV0bzEpICE9PSBudWxsICYmIF9oICE9PSB2b2lkIDAgPyBfaCA6IDA7XG4gICAgICAgIG1lc3NhZ2UudGVhbUlkUGlja24gPSAoX2ogPSBvYmplY3QudGVhbUlkUGlja24pICE9PSBudWxsICYmIF9qICE9PSB2b2lkIDAgPyBfaiA6IDA7XG4gICAgICAgIG1lc3NhZ2UuZHJhZnRzID1cbiAgICAgICAgICAgICgoX2sgPSBvYmplY3QuZHJhZnRzKSA9PT0gbnVsbCB8fCBfayA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2subWFwKGUgPT4gZXhwb3J0cy5DRGF0YUdDQ1N0cmlrZTE1VjJUb3VybmFtZW50TWF0Y2hEcmFmdF9FbnRyeS5mcm9tUGFydGlhbChlKSkpIHx8IFtdO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG59O1xuZnVuY3Rpb24gY3JlYXRlQmFzZUNEYXRhR0NDU3RyaWtlMTVWMlRvdXJuYW1lbnRNYXRjaERyYWZ0X0VudHJ5KCkge1xuICAgIHJldHVybiB7IG1hcGlkOiAwLCB0ZWFtSWRDdDogMCB9O1xufVxuZXhwb3J0cy5DRGF0YUdDQ1N0cmlrZTE1VjJUb3VybmFtZW50TWF0Y2hEcmFmdF9FbnRyeSA9IHtcbiAgICBlbmNvZGUobWVzc2FnZSwgd3JpdGVyID0gbWluaW1hbF8xLldyaXRlci5jcmVhdGUoKSkge1xuICAgICAgICBpZiAobWVzc2FnZS5tYXBpZCAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig4KS5pbnQzMihtZXNzYWdlLm1hcGlkKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS50ZWFtSWRDdCAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigxNikuaW50MzIobWVzc2FnZS50ZWFtSWRDdCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9LFxuICAgIGRlY29kZShpbnB1dCwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IGlucHV0IGluc3RhbmNlb2YgbWluaW1hbF8xLlJlYWRlciA/IGlucHV0IDogbmV3IG1pbmltYWxfMS5SZWFkZXIoaW5wdXQpO1xuICAgICAgICBsZXQgZW5kID0gbGVuZ3RoID09PSB1bmRlZmluZWQgPyByZWFkZXIubGVuIDogcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDRGF0YUdDQ1N0cmlrZTE1VjJUb3VybmFtZW50TWF0Y2hEcmFmdF9FbnRyeSgpO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UubWFwaWQgPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnRlYW1JZEN0ID0gcmVhZGVyLmludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJlYWRlci5za2lwVHlwZSh0YWcgJiA3KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfSxcbiAgICBmcm9tUGFydGlhbChvYmplY3QpIHtcbiAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDRGF0YUdDQ1N0cmlrZTE1VjJUb3VybmFtZW50TWF0Y2hEcmFmdF9FbnRyeSgpO1xuICAgICAgICBtZXNzYWdlLm1hcGlkID0gKF9hID0gb2JqZWN0Lm1hcGlkKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAwO1xuICAgICAgICBtZXNzYWdlLnRlYW1JZEN0ID0gKF9iID0gb2JqZWN0LnRlYW1JZEN0KSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAwO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG59O1xuZnVuY3Rpb24gY3JlYXRlQmFzZUNQcmVNYXRjaEluZm9EYXRhKCkge1xuICAgIHJldHVybiB7IHByZWRpY3Rpb25zUGN0OiAwLCBkcmFmdDogdW5kZWZpbmVkLCBzdGF0czogW10sIHdpbnM6IFtdIH07XG59XG5leHBvcnRzLkNQcmVNYXRjaEluZm9EYXRhID0ge1xuICAgIGVuY29kZShtZXNzYWdlLCB3cml0ZXIgPSBtaW5pbWFsXzEuV3JpdGVyLmNyZWF0ZSgpKSB7XG4gICAgICAgIGlmIChtZXNzYWdlLnByZWRpY3Rpb25zUGN0ICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDgpLmludDMyKG1lc3NhZ2UucHJlZGljdGlvbnNQY3QpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLmRyYWZ0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGV4cG9ydHMuQ0RhdGFHQ0NTdHJpa2UxNVYyVG91cm5hbWVudE1hdGNoRHJhZnQuZW5jb2RlKG1lc3NhZ2UuZHJhZnQsIHdyaXRlci51aW50MzIoMzQpLmZvcmsoKSkubGRlbGltKCk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCB2IG9mIG1lc3NhZ2Uuc3RhdHMpIHtcbiAgICAgICAgICAgIGV4cG9ydHMuQ1ByZU1hdGNoSW5mb0RhdGFfVGVhbVN0YXRzLmVuY29kZSh2LCB3cml0ZXIudWludDMyKDQyKS5mb3JrKCkpLmxkZWxpbSgpO1xuICAgICAgICB9XG4gICAgICAgIHdyaXRlci51aW50MzIoNTApLmZvcmsoKTtcbiAgICAgICAgZm9yIChjb25zdCB2IG9mIG1lc3NhZ2Uud2lucykge1xuICAgICAgICAgICAgd3JpdGVyLmludDMyKHYpO1xuICAgICAgICB9XG4gICAgICAgIHdyaXRlci5sZGVsaW0oKTtcbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9LFxuICAgIGRlY29kZShpbnB1dCwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IGlucHV0IGluc3RhbmNlb2YgbWluaW1hbF8xLlJlYWRlciA/IGlucHV0IDogbmV3IG1pbmltYWxfMS5SZWFkZXIoaW5wdXQpO1xuICAgICAgICBsZXQgZW5kID0gbGVuZ3RoID09PSB1bmRlZmluZWQgPyByZWFkZXIubGVuIDogcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDUHJlTWF0Y2hJbmZvRGF0YSgpO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UucHJlZGljdGlvbnNQY3QgPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmRyYWZ0ID0gZXhwb3J0cy5DRGF0YUdDQ1N0cmlrZTE1VjJUb3VybmFtZW50TWF0Y2hEcmFmdC5kZWNvZGUocmVhZGVyLCByZWFkZXIudWludDMyKCkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Uuc3RhdHMucHVzaChleHBvcnRzLkNQcmVNYXRjaEluZm9EYXRhX1RlYW1TdGF0cy5kZWNvZGUocmVhZGVyLCByZWFkZXIudWludDMyKCkpKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICBpZiAoKHRhZyAmIDcpID09PSAyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbmQyID0gcmVhZGVyLnVpbnQzMigpICsgcmVhZGVyLnBvcztcbiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kMikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Uud2lucy5wdXNoKHJlYWRlci5pbnQzMigpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Uud2lucy5wdXNoKHJlYWRlci5pbnQzMigpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICByZWFkZXIuc2tpcFR5cGUodGFnICYgNyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH0sXG4gICAgZnJvbVBhcnRpYWwob2JqZWN0KSB7XG4gICAgICAgIHZhciBfYSwgX2IsIF9jO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNQcmVNYXRjaEluZm9EYXRhKCk7XG4gICAgICAgIG1lc3NhZ2UucHJlZGljdGlvbnNQY3QgPSAoX2EgPSBvYmplY3QucHJlZGljdGlvbnNQY3QpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IDA7XG4gICAgICAgIG1lc3NhZ2UuZHJhZnQgPVxuICAgICAgICAgICAgb2JqZWN0LmRyYWZ0ICE9PSB1bmRlZmluZWQgJiYgb2JqZWN0LmRyYWZ0ICE9PSBudWxsXG4gICAgICAgICAgICAgICAgPyBleHBvcnRzLkNEYXRhR0NDU3RyaWtlMTVWMlRvdXJuYW1lbnRNYXRjaERyYWZ0LmZyb21QYXJ0aWFsKG9iamVjdC5kcmFmdClcbiAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgICAgbWVzc2FnZS5zdGF0cyA9XG4gICAgICAgICAgICAoKF9iID0gb2JqZWN0LnN0YXRzKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IubWFwKGUgPT4gZXhwb3J0cy5DUHJlTWF0Y2hJbmZvRGF0YV9UZWFtU3RhdHMuZnJvbVBhcnRpYWwoZSkpKSB8fCBbXTtcbiAgICAgICAgbWVzc2FnZS53aW5zID0gKChfYyA9IG9iamVjdC53aW5zKSA9PT0gbnVsbCB8fCBfYyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2MubWFwKGUgPT4gZSkpIHx8IFtdO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG59O1xuZnVuY3Rpb24gY3JlYXRlQmFzZUNQcmVNYXRjaEluZm9EYXRhX1RlYW1TdGF0cygpIHtcbiAgICByZXR1cm4geyBtYXRjaEluZm9JZHh0eHQ6IDAsIG1hdGNoSW5mb1R4dDogXCJcIiwgbWF0Y2hJbmZvVGVhbXM6IFtdIH07XG59XG5leHBvcnRzLkNQcmVNYXRjaEluZm9EYXRhX1RlYW1TdGF0cyA9IHtcbiAgICBlbmNvZGUobWVzc2FnZSwgd3JpdGVyID0gbWluaW1hbF8xLldyaXRlci5jcmVhdGUoKSkge1xuICAgICAgICBpZiAobWVzc2FnZS5tYXRjaEluZm9JZHh0eHQgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoOCkuaW50MzIobWVzc2FnZS5tYXRjaEluZm9JZHh0eHQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLm1hdGNoSW5mb1R4dCAhPT0gXCJcIikge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigxOCkuc3RyaW5nKG1lc3NhZ2UubWF0Y2hJbmZvVHh0KTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IHYgb2YgbWVzc2FnZS5tYXRjaEluZm9UZWFtcykge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigyNikuc3RyaW5nKHYpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfSxcbiAgICBkZWNvZGUoaW5wdXQsIGxlbmd0aCkge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBpbnB1dCBpbnN0YW5jZW9mIG1pbmltYWxfMS5SZWFkZXIgPyBpbnB1dCA6IG5ldyBtaW5pbWFsXzEuUmVhZGVyKGlucHV0KTtcbiAgICAgICAgbGV0IGVuZCA9IGxlbmd0aCA9PT0gdW5kZWZpbmVkID8gcmVhZGVyLmxlbiA6IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ1ByZU1hdGNoSW5mb0RhdGFfVGVhbVN0YXRzKCk7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBjb25zdCB0YWcgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKHRhZyA+Pj4gMykge1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5tYXRjaEluZm9JZHh0eHQgPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLm1hdGNoSW5mb1R4dCA9IHJlYWRlci5zdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLm1hdGNoSW5mb1RlYW1zLnB1c2gocmVhZGVyLnN0cmluZygpKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmVhZGVyLnNraXBUeXBlKHRhZyAmIDcpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9LFxuICAgIGZyb21QYXJ0aWFsKG9iamVjdCkge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYztcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDUHJlTWF0Y2hJbmZvRGF0YV9UZWFtU3RhdHMoKTtcbiAgICAgICAgbWVzc2FnZS5tYXRjaEluZm9JZHh0eHQgPSAoX2EgPSBvYmplY3QubWF0Y2hJbmZvSWR4dHh0KSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAwO1xuICAgICAgICBtZXNzYWdlLm1hdGNoSW5mb1R4dCA9IChfYiA9IG9iamVjdC5tYXRjaEluZm9UeHQpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IFwiXCI7XG4gICAgICAgIG1lc3NhZ2UubWF0Y2hJbmZvVGVhbXMgPSAoKF9jID0gb2JqZWN0Lm1hdGNoSW5mb1RlYW1zKSA9PT0gbnVsbCB8fCBfYyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2MubWFwKGUgPT4gZSkpIHx8IFtdO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG59O1xuZnVuY3Rpb24gY3JlYXRlQmFzZUNNc2dHQ0NTdHJpa2UxNVYyTWF0Y2htYWtpbmdHQzJTZXJ2ZXJSZXNlcnZlKCkge1xuICAgIHJldHVybiB7XG4gICAgICAgIGFjY291bnRJZHM6IFtdLFxuICAgICAgICBnYW1lVHlwZTogMCxcbiAgICAgICAgbWF0Y2hJZDogTG9uZy5VWkVSTyxcbiAgICAgICAgc2VydmVyVmVyc2lvbjogMCxcbiAgICAgICAgZmxhZ3M6IDAsXG4gICAgICAgIHJhbmtpbmdzOiBbXSxcbiAgICAgICAgZW5jcnlwdGlvbktleTogTG9uZy5VWkVSTyxcbiAgICAgICAgZW5jcnlwdGlvbktleVB1YjogTG9uZy5VWkVSTyxcbiAgICAgICAgcGFydHlJZHM6IFtdLFxuICAgICAgICB3aGl0ZWxpc3Q6IFtdLFxuICAgICAgICB0dk1hc3RlclN0ZWFtaWQ6IExvbmcuVVpFUk8sXG4gICAgICAgIHRvdXJuYW1lbnRFdmVudDogdW5kZWZpbmVkLFxuICAgICAgICB0b3VybmFtZW50VGVhbXM6IFtdLFxuICAgICAgICB0b3VybmFtZW50Q2FzdGVyc0FjY291bnRJZHM6IFtdLFxuICAgICAgICB0dlJlbGF5U3RlYW1pZDogTG9uZy5VWkVSTyxcbiAgICAgICAgcHJlTWF0Y2hEYXRhOiB1bmRlZmluZWQsXG4gICAgICAgIHJ0aW1lMzJFdmVudFN0YXJ0OiAwLFxuICAgICAgICB0dkNvbnRyb2w6IDBcbiAgICB9O1xufVxuZXhwb3J0cy5DTXNnR0NDU3RyaWtlMTVWMk1hdGNobWFraW5nR0MyU2VydmVyUmVzZXJ2ZSA9IHtcbiAgICBlbmNvZGUobWVzc2FnZSwgd3JpdGVyID0gbWluaW1hbF8xLldyaXRlci5jcmVhdGUoKSkge1xuICAgICAgICB3cml0ZXIudWludDMyKDEwKS5mb3JrKCk7XG4gICAgICAgIGZvciAoY29uc3QgdiBvZiBtZXNzYWdlLmFjY291bnRJZHMpIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIodik7XG4gICAgICAgIH1cbiAgICAgICAgd3JpdGVyLmxkZWxpbSgpO1xuICAgICAgICBpZiAobWVzc2FnZS5nYW1lVHlwZSAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigxNikudWludDMyKG1lc3NhZ2UuZ2FtZVR5cGUpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghbWVzc2FnZS5tYXRjaElkLmlzWmVybygpKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDI0KS51aW50NjQobWVzc2FnZS5tYXRjaElkKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5zZXJ2ZXJWZXJzaW9uICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDMyKS51aW50MzIobWVzc2FnZS5zZXJ2ZXJWZXJzaW9uKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5mbGFncyAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigxNDQpLnVpbnQzMihtZXNzYWdlLmZsYWdzKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IHYgb2YgbWVzc2FnZS5yYW5raW5ncykge1xuICAgICAgICAgICAgZXhwb3J0cy5QbGF5ZXJSYW5raW5nSW5mby5lbmNvZGUodiwgd3JpdGVyLnVpbnQzMig0MikuZm9yaygpKS5sZGVsaW0oKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIW1lc3NhZ2UuZW5jcnlwdGlvbktleS5pc1plcm8oKSkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig0OCkudWludDY0KG1lc3NhZ2UuZW5jcnlwdGlvbktleSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFtZXNzYWdlLmVuY3J5cHRpb25LZXlQdWIuaXNaZXJvKCkpIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoNTYpLnVpbnQ2NChtZXNzYWdlLmVuY3J5cHRpb25LZXlQdWIpO1xuICAgICAgICB9XG4gICAgICAgIHdyaXRlci51aW50MzIoNjYpLmZvcmsoKTtcbiAgICAgICAgZm9yIChjb25zdCB2IG9mIG1lc3NhZ2UucGFydHlJZHMpIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIodik7XG4gICAgICAgIH1cbiAgICAgICAgd3JpdGVyLmxkZWxpbSgpO1xuICAgICAgICBmb3IgKGNvbnN0IHYgb2YgbWVzc2FnZS53aGl0ZWxpc3QpIHtcbiAgICAgICAgICAgIGV4cG9ydHMuSXBBZGRyZXNzTWFzay5lbmNvZGUodiwgd3JpdGVyLnVpbnQzMig3NCkuZm9yaygpKS5sZGVsaW0oKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIW1lc3NhZ2UudHZNYXN0ZXJTdGVhbWlkLmlzWmVybygpKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDgwKS51aW50NjQobWVzc2FnZS50dk1hc3RlclN0ZWFtaWQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLnRvdXJuYW1lbnRFdmVudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBleHBvcnRzLlRvdXJuYW1lbnRFdmVudC5lbmNvZGUobWVzc2FnZS50b3VybmFtZW50RXZlbnQsIHdyaXRlci51aW50MzIoOTApLmZvcmsoKSkubGRlbGltKCk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCB2IG9mIG1lc3NhZ2UudG91cm5hbWVudFRlYW1zKSB7XG4gICAgICAgICAgICBleHBvcnRzLlRvdXJuYW1lbnRUZWFtLmVuY29kZSh2LCB3cml0ZXIudWludDMyKDk4KS5mb3JrKCkpLmxkZWxpbSgpO1xuICAgICAgICB9XG4gICAgICAgIHdyaXRlci51aW50MzIoMTA2KS5mb3JrKCk7XG4gICAgICAgIGZvciAoY29uc3QgdiBvZiBtZXNzYWdlLnRvdXJuYW1lbnRDYXN0ZXJzQWNjb3VudElkcykge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMih2KTtcbiAgICAgICAgfVxuICAgICAgICB3cml0ZXIubGRlbGltKCk7XG4gICAgICAgIGlmICghbWVzc2FnZS50dlJlbGF5U3RlYW1pZC5pc1plcm8oKSkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigxMTIpLnVpbnQ2NChtZXNzYWdlLnR2UmVsYXlTdGVhbWlkKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5wcmVNYXRjaERhdGEgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgZXhwb3J0cy5DUHJlTWF0Y2hJbmZvRGF0YS5lbmNvZGUobWVzc2FnZS5wcmVNYXRjaERhdGEsIHdyaXRlci51aW50MzIoMTIyKS5mb3JrKCkpLmxkZWxpbSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLnJ0aW1lMzJFdmVudFN0YXJ0ICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDEyOCkudWludDMyKG1lc3NhZ2UucnRpbWUzMkV2ZW50U3RhcnQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLnR2Q29udHJvbCAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigxMzYpLnVpbnQzMihtZXNzYWdlLnR2Q29udHJvbCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9LFxuICAgIGRlY29kZShpbnB1dCwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IGlucHV0IGluc3RhbmNlb2YgbWluaW1hbF8xLlJlYWRlciA/IGlucHV0IDogbmV3IG1pbmltYWxfMS5SZWFkZXIoaW5wdXQpO1xuICAgICAgICBsZXQgZW5kID0gbGVuZ3RoID09PSB1bmRlZmluZWQgPyByZWFkZXIubGVuIDogcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDTXNnR0NDU3RyaWtlMTVWMk1hdGNobWFraW5nR0MyU2VydmVyUmVzZXJ2ZSgpO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIGlmICgodGFnICYgNykgPT09IDIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuZDIgPSByZWFkZXIudWludDMyKCkgKyByZWFkZXIucG9zO1xuICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5hY2NvdW50SWRzLnB1c2gocmVhZGVyLnVpbnQzMigpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuYWNjb3VudElkcy5wdXNoKHJlYWRlci51aW50MzIoKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmdhbWVUeXBlID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UubWF0Y2hJZCA9IHJlYWRlci51aW50NjQoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnNlcnZlclZlcnNpb24gPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMTg6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZmxhZ3MgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5yYW5raW5ncy5wdXNoKGV4cG9ydHMuUGxheWVyUmFua2luZ0luZm8uZGVjb2RlKHJlYWRlciwgcmVhZGVyLnVpbnQzMigpKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5lbmNyeXB0aW9uS2V5ID0gcmVhZGVyLnVpbnQ2NCgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZW5jcnlwdGlvbktleVB1YiA9IHJlYWRlci51aW50NjQoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA4OlxuICAgICAgICAgICAgICAgICAgICBpZiAoKHRhZyAmIDcpID09PSAyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbmQyID0gcmVhZGVyLnVpbnQzMigpICsgcmVhZGVyLnBvcztcbiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kMikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UucGFydHlJZHMucHVzaChyZWFkZXIudWludDMyKCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5wYXJ0eUlkcy5wdXNoKHJlYWRlci51aW50MzIoKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA5OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLndoaXRlbGlzdC5wdXNoKGV4cG9ydHMuSXBBZGRyZXNzTWFzay5kZWNvZGUocmVhZGVyLCByZWFkZXIudWludDMyKCkpKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAxMDpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS50dk1hc3RlclN0ZWFtaWQgPSByZWFkZXIudWludDY0KCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMTE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudG91cm5hbWVudEV2ZW50ID0gZXhwb3J0cy5Ub3VybmFtZW50RXZlbnQuZGVjb2RlKHJlYWRlciwgcmVhZGVyLnVpbnQzMigpKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAxMjpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS50b3VybmFtZW50VGVhbXMucHVzaChleHBvcnRzLlRvdXJuYW1lbnRUZWFtLmRlY29kZShyZWFkZXIsIHJlYWRlci51aW50MzIoKSkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDEzOlxuICAgICAgICAgICAgICAgICAgICBpZiAoKHRhZyAmIDcpID09PSAyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbmQyID0gcmVhZGVyLnVpbnQzMigpICsgcmVhZGVyLnBvcztcbiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kMikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudG91cm5hbWVudENhc3RlcnNBY2NvdW50SWRzLnB1c2gocmVhZGVyLnVpbnQzMigpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudG91cm5hbWVudENhc3RlcnNBY2NvdW50SWRzLnB1c2gocmVhZGVyLnVpbnQzMigpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDE0OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnR2UmVsYXlTdGVhbWlkID0gcmVhZGVyLnVpbnQ2NCgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDE1OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnByZU1hdGNoRGF0YSA9IGV4cG9ydHMuQ1ByZU1hdGNoSW5mb0RhdGEuZGVjb2RlKHJlYWRlciwgcmVhZGVyLnVpbnQzMigpKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAxNjpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5ydGltZTMyRXZlbnRTdGFydCA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAxNzpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS50dkNvbnRyb2wgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJlYWRlci5za2lwVHlwZSh0YWcgJiA3KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfSxcbiAgICBmcm9tUGFydGlhbChvYmplY3QpIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2MsIF9kLCBfZSwgX2YsIF9nLCBfaCwgX2osIF9rLCBfbDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDTXNnR0NDU3RyaWtlMTVWMk1hdGNobWFraW5nR0MyU2VydmVyUmVzZXJ2ZSgpO1xuICAgICAgICBtZXNzYWdlLmFjY291bnRJZHMgPSAoKF9hID0gb2JqZWN0LmFjY291bnRJZHMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5tYXAoZSA9PiBlKSkgfHwgW107XG4gICAgICAgIG1lc3NhZ2UuZ2FtZVR5cGUgPSAoX2IgPSBvYmplY3QuZ2FtZVR5cGUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IDA7XG4gICAgICAgIG1lc3NhZ2UubWF0Y2hJZCA9XG4gICAgICAgICAgICBvYmplY3QubWF0Y2hJZCAhPT0gdW5kZWZpbmVkICYmIG9iamVjdC5tYXRjaElkICE9PSBudWxsXG4gICAgICAgICAgICAgICAgPyBMb25nLmZyb21WYWx1ZShvYmplY3QubWF0Y2hJZClcbiAgICAgICAgICAgICAgICA6IExvbmcuVVpFUk87XG4gICAgICAgIG1lc3NhZ2Uuc2VydmVyVmVyc2lvbiA9IChfYyA9IG9iamVjdC5zZXJ2ZXJWZXJzaW9uKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiAwO1xuICAgICAgICBtZXNzYWdlLmZsYWdzID0gKF9kID0gb2JqZWN0LmZsYWdzKSAhPT0gbnVsbCAmJiBfZCAhPT0gdm9pZCAwID8gX2QgOiAwO1xuICAgICAgICBtZXNzYWdlLnJhbmtpbmdzID1cbiAgICAgICAgICAgICgoX2UgPSBvYmplY3QucmFua2luZ3MpID09PSBudWxsIHx8IF9lID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZS5tYXAoZSA9PiBleHBvcnRzLlBsYXllclJhbmtpbmdJbmZvLmZyb21QYXJ0aWFsKGUpKSkgfHwgW107XG4gICAgICAgIG1lc3NhZ2UuZW5jcnlwdGlvbktleSA9XG4gICAgICAgICAgICBvYmplY3QuZW5jcnlwdGlvbktleSAhPT0gdW5kZWZpbmVkICYmIG9iamVjdC5lbmNyeXB0aW9uS2V5ICE9PSBudWxsXG4gICAgICAgICAgICAgICAgPyBMb25nLmZyb21WYWx1ZShvYmplY3QuZW5jcnlwdGlvbktleSlcbiAgICAgICAgICAgICAgICA6IExvbmcuVVpFUk87XG4gICAgICAgIG1lc3NhZ2UuZW5jcnlwdGlvbktleVB1YiA9XG4gICAgICAgICAgICBvYmplY3QuZW5jcnlwdGlvbktleVB1YiAhPT0gdW5kZWZpbmVkICYmIG9iamVjdC5lbmNyeXB0aW9uS2V5UHViICE9PSBudWxsXG4gICAgICAgICAgICAgICAgPyBMb25nLmZyb21WYWx1ZShvYmplY3QuZW5jcnlwdGlvbktleVB1YilcbiAgICAgICAgICAgICAgICA6IExvbmcuVVpFUk87XG4gICAgICAgIG1lc3NhZ2UucGFydHlJZHMgPSAoKF9mID0gb2JqZWN0LnBhcnR5SWRzKSA9PT0gbnVsbCB8fCBfZiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2YubWFwKGUgPT4gZSkpIHx8IFtdO1xuICAgICAgICBtZXNzYWdlLndoaXRlbGlzdCA9XG4gICAgICAgICAgICAoKF9nID0gb2JqZWN0LndoaXRlbGlzdCkgPT09IG51bGwgfHwgX2cgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9nLm1hcChlID0+IGV4cG9ydHMuSXBBZGRyZXNzTWFzay5mcm9tUGFydGlhbChlKSkpIHx8IFtdO1xuICAgICAgICBtZXNzYWdlLnR2TWFzdGVyU3RlYW1pZCA9XG4gICAgICAgICAgICBvYmplY3QudHZNYXN0ZXJTdGVhbWlkICE9PSB1bmRlZmluZWQgJiYgb2JqZWN0LnR2TWFzdGVyU3RlYW1pZCAhPT0gbnVsbFxuICAgICAgICAgICAgICAgID8gTG9uZy5mcm9tVmFsdWUob2JqZWN0LnR2TWFzdGVyU3RlYW1pZClcbiAgICAgICAgICAgICAgICA6IExvbmcuVVpFUk87XG4gICAgICAgIG1lc3NhZ2UudG91cm5hbWVudEV2ZW50ID1cbiAgICAgICAgICAgIG9iamVjdC50b3VybmFtZW50RXZlbnQgIT09IHVuZGVmaW5lZCAmJiBvYmplY3QudG91cm5hbWVudEV2ZW50ICE9PSBudWxsXG4gICAgICAgICAgICAgICAgPyBleHBvcnRzLlRvdXJuYW1lbnRFdmVudC5mcm9tUGFydGlhbChvYmplY3QudG91cm5hbWVudEV2ZW50KVxuICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgICBtZXNzYWdlLnRvdXJuYW1lbnRUZWFtcyA9XG4gICAgICAgICAgICAoKF9oID0gb2JqZWN0LnRvdXJuYW1lbnRUZWFtcykgPT09IG51bGwgfHwgX2ggPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9oLm1hcChlID0+IGV4cG9ydHMuVG91cm5hbWVudFRlYW0uZnJvbVBhcnRpYWwoZSkpKSB8fCBbXTtcbiAgICAgICAgbWVzc2FnZS50b3VybmFtZW50Q2FzdGVyc0FjY291bnRJZHMgPVxuICAgICAgICAgICAgKChfaiA9IG9iamVjdC50b3VybmFtZW50Q2FzdGVyc0FjY291bnRJZHMpID09PSBudWxsIHx8IF9qID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfai5tYXAoZSA9PiBlKSkgfHwgW107XG4gICAgICAgIG1lc3NhZ2UudHZSZWxheVN0ZWFtaWQgPVxuICAgICAgICAgICAgb2JqZWN0LnR2UmVsYXlTdGVhbWlkICE9PSB1bmRlZmluZWQgJiYgb2JqZWN0LnR2UmVsYXlTdGVhbWlkICE9PSBudWxsXG4gICAgICAgICAgICAgICAgPyBMb25nLmZyb21WYWx1ZShvYmplY3QudHZSZWxheVN0ZWFtaWQpXG4gICAgICAgICAgICAgICAgOiBMb25nLlVaRVJPO1xuICAgICAgICBtZXNzYWdlLnByZU1hdGNoRGF0YSA9XG4gICAgICAgICAgICBvYmplY3QucHJlTWF0Y2hEYXRhICE9PSB1bmRlZmluZWQgJiYgb2JqZWN0LnByZU1hdGNoRGF0YSAhPT0gbnVsbFxuICAgICAgICAgICAgICAgID8gZXhwb3J0cy5DUHJlTWF0Y2hJbmZvRGF0YS5mcm9tUGFydGlhbChvYmplY3QucHJlTWF0Y2hEYXRhKVxuICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgICBtZXNzYWdlLnJ0aW1lMzJFdmVudFN0YXJ0ID0gKF9rID0gb2JqZWN0LnJ0aW1lMzJFdmVudFN0YXJ0KSAhPT0gbnVsbCAmJiBfayAhPT0gdm9pZCAwID8gX2sgOiAwO1xuICAgICAgICBtZXNzYWdlLnR2Q29udHJvbCA9IChfbCA9IG9iamVjdC50dkNvbnRyb2wpICE9PSBudWxsICYmIF9sICE9PSB2b2lkIDAgPyBfbCA6IDA7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbn07XG5mdW5jdGlvbiBjcmVhdGVCYXNlQ01zZ0dDQ1N0cmlrZTE1VjJNYXRjaG1ha2luZ1NlcnZlclJlc2VydmF0aW9uUmVzcG9uc2UoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgcmVzZXJ2YXRpb25pZDogTG9uZy5VWkVSTyxcbiAgICAgICAgcmVzZXJ2YXRpb246IHVuZGVmaW5lZCxcbiAgICAgICAgbWFwOiBcIlwiLFxuICAgICAgICBnY1Jlc2VydmF0aW9uU2VudDogTG9uZy5VWkVSTyxcbiAgICAgICAgc2VydmVyVmVyc2lvbjogMCxcbiAgICAgICAgdHZJbmZvOiB1bmRlZmluZWQsXG4gICAgICAgIHJld2FyZFBsYXllckFjY291bnRzOiBbXSxcbiAgICAgICAgaWRsZVBsYXllckFjY291bnRzOiBbXSxcbiAgICAgICAgcmV3YXJkSXRlbUF0dHJEZWZJZHg6IDAsXG4gICAgICAgIHJld2FyZEl0ZW1BdHRyVmFsdWU6IDAsXG4gICAgICAgIHJld2FyZEl0ZW1BdHRyUmV3YXJkSWR4OiAwLFxuICAgICAgICByZXdhcmREcm9wTGlzdDogMCxcbiAgICAgICAgdG91cm5hbWVudFRhZzogXCJcIixcbiAgICAgICAgbGVnYWN5U3RlYW1kYXRhZ3JhbVBvcnQ6IDAsXG4gICAgICAgIHN0ZWFtZGF0YWdyYW1Sb3V0aW5nOiAwLFxuICAgICAgICB0ZXN0VG9rZW46IDAsXG4gICAgICAgIGZsYWdzOiAwXG4gICAgfTtcbn1cbmV4cG9ydHMuQ01zZ0dDQ1N0cmlrZTE1VjJNYXRjaG1ha2luZ1NlcnZlclJlc2VydmF0aW9uUmVzcG9uc2UgPSB7XG4gICAgZW5jb2RlKG1lc3NhZ2UsIHdyaXRlciA9IG1pbmltYWxfMS5Xcml0ZXIuY3JlYXRlKCkpIHtcbiAgICAgICAgaWYgKCFtZXNzYWdlLnJlc2VydmF0aW9uaWQuaXNaZXJvKCkpIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoOCkudWludDY0KG1lc3NhZ2UucmVzZXJ2YXRpb25pZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UucmVzZXJ2YXRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgZXhwb3J0cy5DTXNnR0NDU3RyaWtlMTVWMk1hdGNobWFraW5nR0MyU2VydmVyUmVzZXJ2ZS5lbmNvZGUobWVzc2FnZS5yZXNlcnZhdGlvbiwgd3JpdGVyLnVpbnQzMigxOCkuZm9yaygpKS5sZGVsaW0oKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5tYXAgIT09IFwiXCIpIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMjYpLnN0cmluZyhtZXNzYWdlLm1hcCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFtZXNzYWdlLmdjUmVzZXJ2YXRpb25TZW50LmlzWmVybygpKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDMyKS51aW50NjQobWVzc2FnZS5nY1Jlc2VydmF0aW9uU2VudCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2Uuc2VydmVyVmVyc2lvbiAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig0MCkudWludDMyKG1lc3NhZ2Uuc2VydmVyVmVyc2lvbik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UudHZJbmZvICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGV4cG9ydHMuU2VydmVySGx0dkluZm8uZW5jb2RlKG1lc3NhZ2UudHZJbmZvLCB3cml0ZXIudWludDMyKDUwKS5mb3JrKCkpLmxkZWxpbSgpO1xuICAgICAgICB9XG4gICAgICAgIHdyaXRlci51aW50MzIoNTgpLmZvcmsoKTtcbiAgICAgICAgZm9yIChjb25zdCB2IG9mIG1lc3NhZ2UucmV3YXJkUGxheWVyQWNjb3VudHMpIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIodik7XG4gICAgICAgIH1cbiAgICAgICAgd3JpdGVyLmxkZWxpbSgpO1xuICAgICAgICB3cml0ZXIudWludDMyKDY2KS5mb3JrKCk7XG4gICAgICAgIGZvciAoY29uc3QgdiBvZiBtZXNzYWdlLmlkbGVQbGF5ZXJBY2NvdW50cykge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMih2KTtcbiAgICAgICAgfVxuICAgICAgICB3cml0ZXIubGRlbGltKCk7XG4gICAgICAgIGlmIChtZXNzYWdlLnJld2FyZEl0ZW1BdHRyRGVmSWR4ICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDcyKS51aW50MzIobWVzc2FnZS5yZXdhcmRJdGVtQXR0ckRlZklkeCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UucmV3YXJkSXRlbUF0dHJWYWx1ZSAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig4MCkudWludDMyKG1lc3NhZ2UucmV3YXJkSXRlbUF0dHJWYWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UucmV3YXJkSXRlbUF0dHJSZXdhcmRJZHggIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoODgpLnVpbnQzMihtZXNzYWdlLnJld2FyZEl0ZW1BdHRyUmV3YXJkSWR4KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5yZXdhcmREcm9wTGlzdCAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig5NikudWludDMyKG1lc3NhZ2UucmV3YXJkRHJvcExpc3QpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLnRvdXJuYW1lbnRUYWcgIT09IFwiXCIpIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMTA2KS5zdHJpbmcobWVzc2FnZS50b3VybmFtZW50VGFnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5sZWdhY3lTdGVhbWRhdGFncmFtUG9ydCAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigxMTIpLnVpbnQzMihtZXNzYWdlLmxlZ2FjeVN0ZWFtZGF0YWdyYW1Qb3J0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5zdGVhbWRhdGFncmFtUm91dGluZyAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigxMzYpLnVpbnQzMihtZXNzYWdlLnN0ZWFtZGF0YWdyYW1Sb3V0aW5nKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS50ZXN0VG9rZW4gIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMTI1KS5maXhlZDMyKG1lc3NhZ2UudGVzdFRva2VuKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5mbGFncyAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigxMjgpLnVpbnQzMihtZXNzYWdlLmZsYWdzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH0sXG4gICAgZGVjb2RlKGlucHV0LCBsZW5ndGgpIHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gaW5wdXQgaW5zdGFuY2VvZiBtaW5pbWFsXzEuUmVhZGVyID8gaW5wdXQgOiBuZXcgbWluaW1hbF8xLlJlYWRlcihpbnB1dCk7XG4gICAgICAgIGxldCBlbmQgPSBsZW5ndGggPT09IHVuZGVmaW5lZCA/IHJlYWRlci5sZW4gOiByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNNc2dHQ0NTdHJpa2UxNVYyTWF0Y2htYWtpbmdTZXJ2ZXJSZXNlcnZhdGlvblJlc3BvbnNlKCk7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBjb25zdCB0YWcgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKHRhZyA+Pj4gMykge1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5yZXNlcnZhdGlvbmlkID0gcmVhZGVyLnVpbnQ2NCgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UucmVzZXJ2YXRpb24gPVxuICAgICAgICAgICAgICAgICAgICAgICAgZXhwb3J0cy5DTXNnR0NDU3RyaWtlMTVWMk1hdGNobWFraW5nR0MyU2VydmVyUmVzZXJ2ZS5kZWNvZGUocmVhZGVyLCByZWFkZXIudWludDMyKCkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UubWFwID0gcmVhZGVyLnN0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZ2NSZXNlcnZhdGlvblNlbnQgPSByZWFkZXIudWludDY0KCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5zZXJ2ZXJWZXJzaW9uID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudHZJbmZvID0gZXhwb3J0cy5TZXJ2ZXJIbHR2SW5mby5kZWNvZGUocmVhZGVyLCByZWFkZXIudWludDMyKCkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgICAgICAgICAgIGlmICgodGFnICYgNykgPT09IDIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuZDIgPSByZWFkZXIudWludDMyKCkgKyByZWFkZXIucG9zO1xuICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5yZXdhcmRQbGF5ZXJBY2NvdW50cy5wdXNoKHJlYWRlci51aW50MzIoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnJld2FyZFBsYXllckFjY291bnRzLnB1c2gocmVhZGVyLnVpbnQzMigpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDg6XG4gICAgICAgICAgICAgICAgICAgIGlmICgodGFnICYgNykgPT09IDIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuZDIgPSByZWFkZXIudWludDMyKCkgKyByZWFkZXIucG9zO1xuICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5pZGxlUGxheWVyQWNjb3VudHMucHVzaChyZWFkZXIudWludDMyKCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5pZGxlUGxheWVyQWNjb3VudHMucHVzaChyZWFkZXIudWludDMyKCkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgOTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5yZXdhcmRJdGVtQXR0ckRlZklkeCA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAxMDpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5yZXdhcmRJdGVtQXR0clZhbHVlID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDExOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnJld2FyZEl0ZW1BdHRyUmV3YXJkSWR4ID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDEyOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnJld2FyZERyb3BMaXN0ID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDEzOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnRvdXJuYW1lbnRUYWcgPSByZWFkZXIuc3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMTQ6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UubGVnYWN5U3RlYW1kYXRhZ3JhbVBvcnQgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMTc6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Uuc3RlYW1kYXRhZ3JhbVJvdXRpbmcgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMTU6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudGVzdFRva2VuID0gcmVhZGVyLmZpeGVkMzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAxNjpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5mbGFncyA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmVhZGVyLnNraXBUeXBlKHRhZyAmIDcpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9LFxuICAgIGZyb21QYXJ0aWFsKG9iamVjdCkge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYywgX2QsIF9lLCBfZiwgX2csIF9oLCBfaiwgX2ssIF9sLCBfbSwgX287XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ01zZ0dDQ1N0cmlrZTE1VjJNYXRjaG1ha2luZ1NlcnZlclJlc2VydmF0aW9uUmVzcG9uc2UoKTtcbiAgICAgICAgbWVzc2FnZS5yZXNlcnZhdGlvbmlkID1cbiAgICAgICAgICAgIG9iamVjdC5yZXNlcnZhdGlvbmlkICE9PSB1bmRlZmluZWQgJiYgb2JqZWN0LnJlc2VydmF0aW9uaWQgIT09IG51bGxcbiAgICAgICAgICAgICAgICA/IExvbmcuZnJvbVZhbHVlKG9iamVjdC5yZXNlcnZhdGlvbmlkKVxuICAgICAgICAgICAgICAgIDogTG9uZy5VWkVSTztcbiAgICAgICAgbWVzc2FnZS5yZXNlcnZhdGlvbiA9XG4gICAgICAgICAgICBvYmplY3QucmVzZXJ2YXRpb24gIT09IHVuZGVmaW5lZCAmJiBvYmplY3QucmVzZXJ2YXRpb24gIT09IG51bGxcbiAgICAgICAgICAgICAgICA/IGV4cG9ydHMuQ01zZ0dDQ1N0cmlrZTE1VjJNYXRjaG1ha2luZ0dDMlNlcnZlclJlc2VydmUuZnJvbVBhcnRpYWwob2JqZWN0LnJlc2VydmF0aW9uKVxuICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgICBtZXNzYWdlLm1hcCA9IChfYSA9IG9iamVjdC5tYXApICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IFwiXCI7XG4gICAgICAgIG1lc3NhZ2UuZ2NSZXNlcnZhdGlvblNlbnQgPVxuICAgICAgICAgICAgb2JqZWN0LmdjUmVzZXJ2YXRpb25TZW50ICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICAgICBvYmplY3QuZ2NSZXNlcnZhdGlvblNlbnQgIT09IG51bGxcbiAgICAgICAgICAgICAgICA/IExvbmcuZnJvbVZhbHVlKG9iamVjdC5nY1Jlc2VydmF0aW9uU2VudClcbiAgICAgICAgICAgICAgICA6IExvbmcuVVpFUk87XG4gICAgICAgIG1lc3NhZ2Uuc2VydmVyVmVyc2lvbiA9IChfYiA9IG9iamVjdC5zZXJ2ZXJWZXJzaW9uKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAwO1xuICAgICAgICBtZXNzYWdlLnR2SW5mbyA9XG4gICAgICAgICAgICBvYmplY3QudHZJbmZvICE9PSB1bmRlZmluZWQgJiYgb2JqZWN0LnR2SW5mbyAhPT0gbnVsbFxuICAgICAgICAgICAgICAgID8gZXhwb3J0cy5TZXJ2ZXJIbHR2SW5mby5mcm9tUGFydGlhbChvYmplY3QudHZJbmZvKVxuICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgICBtZXNzYWdlLnJld2FyZFBsYXllckFjY291bnRzID1cbiAgICAgICAgICAgICgoX2MgPSBvYmplY3QucmV3YXJkUGxheWVyQWNjb3VudHMpID09PSBudWxsIHx8IF9jID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYy5tYXAoZSA9PiBlKSkgfHwgW107XG4gICAgICAgIG1lc3NhZ2UuaWRsZVBsYXllckFjY291bnRzID0gKChfZCA9IG9iamVjdC5pZGxlUGxheWVyQWNjb3VudHMpID09PSBudWxsIHx8IF9kID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZC5tYXAoZSA9PiBlKSkgfHwgW107XG4gICAgICAgIG1lc3NhZ2UucmV3YXJkSXRlbUF0dHJEZWZJZHggPSAoX2UgPSBvYmplY3QucmV3YXJkSXRlbUF0dHJEZWZJZHgpICE9PSBudWxsICYmIF9lICE9PSB2b2lkIDAgPyBfZSA6IDA7XG4gICAgICAgIG1lc3NhZ2UucmV3YXJkSXRlbUF0dHJWYWx1ZSA9IChfZiA9IG9iamVjdC5yZXdhcmRJdGVtQXR0clZhbHVlKSAhPT0gbnVsbCAmJiBfZiAhPT0gdm9pZCAwID8gX2YgOiAwO1xuICAgICAgICBtZXNzYWdlLnJld2FyZEl0ZW1BdHRyUmV3YXJkSWR4ID0gKF9nID0gb2JqZWN0LnJld2FyZEl0ZW1BdHRyUmV3YXJkSWR4KSAhPT0gbnVsbCAmJiBfZyAhPT0gdm9pZCAwID8gX2cgOiAwO1xuICAgICAgICBtZXNzYWdlLnJld2FyZERyb3BMaXN0ID0gKF9oID0gb2JqZWN0LnJld2FyZERyb3BMaXN0KSAhPT0gbnVsbCAmJiBfaCAhPT0gdm9pZCAwID8gX2ggOiAwO1xuICAgICAgICBtZXNzYWdlLnRvdXJuYW1lbnRUYWcgPSAoX2ogPSBvYmplY3QudG91cm5hbWVudFRhZykgIT09IG51bGwgJiYgX2ogIT09IHZvaWQgMCA/IF9qIDogXCJcIjtcbiAgICAgICAgbWVzc2FnZS5sZWdhY3lTdGVhbWRhdGFncmFtUG9ydCA9IChfayA9IG9iamVjdC5sZWdhY3lTdGVhbWRhdGFncmFtUG9ydCkgIT09IG51bGwgJiYgX2sgIT09IHZvaWQgMCA/IF9rIDogMDtcbiAgICAgICAgbWVzc2FnZS5zdGVhbWRhdGFncmFtUm91dGluZyA9IChfbCA9IG9iamVjdC5zdGVhbWRhdGFncmFtUm91dGluZykgIT09IG51bGwgJiYgX2wgIT09IHZvaWQgMCA/IF9sIDogMDtcbiAgICAgICAgbWVzc2FnZS50ZXN0VG9rZW4gPSAoX20gPSBvYmplY3QudGVzdFRva2VuKSAhPT0gbnVsbCAmJiBfbSAhPT0gdm9pZCAwID8gX20gOiAwO1xuICAgICAgICBtZXNzYWdlLmZsYWdzID0gKF9vID0gb2JqZWN0LmZsYWdzKSAhPT0gbnVsbCAmJiBfbyAhPT0gdm9pZCAwID8gX28gOiAwO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG59O1xuZnVuY3Rpb24gY3JlYXRlQmFzZUNNc2dHQ0NTdHJpa2UxNVYyTWF0Y2htYWtpbmdHQzJDbGllbnRSZXNlcnZlKCkge1xuICAgIHJldHVybiB7XG4gICAgICAgIHNlcnZlcmlkOiBMb25nLlVaRVJPLFxuICAgICAgICBkaXJlY3RVZHBJcDogMCxcbiAgICAgICAgZGlyZWN0VWRwUG9ydDogMCxcbiAgICAgICAgcmVzZXJ2YXRpb25pZDogTG9uZy5VWkVSTyxcbiAgICAgICAgcmVzZXJ2YXRpb246IHVuZGVmaW5lZCxcbiAgICAgICAgbWFwOiBcIlwiLFxuICAgICAgICBzZXJ2ZXJBZGRyZXNzOiBcIlwiXG4gICAgfTtcbn1cbmV4cG9ydHMuQ01zZ0dDQ1N0cmlrZTE1VjJNYXRjaG1ha2luZ0dDMkNsaWVudFJlc2VydmUgPSB7XG4gICAgZW5jb2RlKG1lc3NhZ2UsIHdyaXRlciA9IG1pbmltYWxfMS5Xcml0ZXIuY3JlYXRlKCkpIHtcbiAgICAgICAgaWYgKCFtZXNzYWdlLnNlcnZlcmlkLmlzWmVybygpKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDgpLnVpbnQ2NChtZXNzYWdlLnNlcnZlcmlkKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5kaXJlY3RVZHBJcCAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigxNikudWludDMyKG1lc3NhZ2UuZGlyZWN0VWRwSXApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLmRpcmVjdFVkcFBvcnQgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMjQpLnVpbnQzMihtZXNzYWdlLmRpcmVjdFVkcFBvcnQpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghbWVzc2FnZS5yZXNlcnZhdGlvbmlkLmlzWmVybygpKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDMyKS51aW50NjQobWVzc2FnZS5yZXNlcnZhdGlvbmlkKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5yZXNlcnZhdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBleHBvcnRzLkNNc2dHQ0NTdHJpa2UxNVYyTWF0Y2htYWtpbmdHQzJTZXJ2ZXJSZXNlcnZlLmVuY29kZShtZXNzYWdlLnJlc2VydmF0aW9uLCB3cml0ZXIudWludDMyKDQyKS5mb3JrKCkpLmxkZWxpbSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLm1hcCAhPT0gXCJcIikge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig1MCkuc3RyaW5nKG1lc3NhZ2UubWFwKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5zZXJ2ZXJBZGRyZXNzICE9PSBcIlwiKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDU4KS5zdHJpbmcobWVzc2FnZS5zZXJ2ZXJBZGRyZXNzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH0sXG4gICAgZGVjb2RlKGlucHV0LCBsZW5ndGgpIHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gaW5wdXQgaW5zdGFuY2VvZiBtaW5pbWFsXzEuUmVhZGVyID8gaW5wdXQgOiBuZXcgbWluaW1hbF8xLlJlYWRlcihpbnB1dCk7XG4gICAgICAgIGxldCBlbmQgPSBsZW5ndGggPT09IHVuZGVmaW5lZCA/IHJlYWRlci5sZW4gOiByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNNc2dHQ0NTdHJpa2UxNVYyTWF0Y2htYWtpbmdHQzJDbGllbnRSZXNlcnZlKCk7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBjb25zdCB0YWcgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKHRhZyA+Pj4gMykge1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5zZXJ2ZXJpZCA9IHJlYWRlci51aW50NjQoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmRpcmVjdFVkcElwID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZGlyZWN0VWRwUG9ydCA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnJlc2VydmF0aW9uaWQgPSByZWFkZXIudWludDY0KCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5yZXNlcnZhdGlvbiA9XG4gICAgICAgICAgICAgICAgICAgICAgICBleHBvcnRzLkNNc2dHQ0NTdHJpa2UxNVYyTWF0Y2htYWtpbmdHQzJTZXJ2ZXJSZXNlcnZlLmRlY29kZShyZWFkZXIsIHJlYWRlci51aW50MzIoKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5tYXAgPSByZWFkZXIuc3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNzpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5zZXJ2ZXJBZGRyZXNzID0gcmVhZGVyLnN0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICByZWFkZXIuc2tpcFR5cGUodGFnICYgNyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH0sXG4gICAgZnJvbVBhcnRpYWwob2JqZWN0KSB7XG4gICAgICAgIHZhciBfYSwgX2IsIF9jLCBfZDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDTXNnR0NDU3RyaWtlMTVWMk1hdGNobWFraW5nR0MyQ2xpZW50UmVzZXJ2ZSgpO1xuICAgICAgICBtZXNzYWdlLnNlcnZlcmlkID1cbiAgICAgICAgICAgIG9iamVjdC5zZXJ2ZXJpZCAhPT0gdW5kZWZpbmVkICYmIG9iamVjdC5zZXJ2ZXJpZCAhPT0gbnVsbFxuICAgICAgICAgICAgICAgID8gTG9uZy5mcm9tVmFsdWUob2JqZWN0LnNlcnZlcmlkKVxuICAgICAgICAgICAgICAgIDogTG9uZy5VWkVSTztcbiAgICAgICAgbWVzc2FnZS5kaXJlY3RVZHBJcCA9IChfYSA9IG9iamVjdC5kaXJlY3RVZHBJcCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMDtcbiAgICAgICAgbWVzc2FnZS5kaXJlY3RVZHBQb3J0ID0gKF9iID0gb2JqZWN0LmRpcmVjdFVkcFBvcnQpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IDA7XG4gICAgICAgIG1lc3NhZ2UucmVzZXJ2YXRpb25pZCA9XG4gICAgICAgICAgICBvYmplY3QucmVzZXJ2YXRpb25pZCAhPT0gdW5kZWZpbmVkICYmIG9iamVjdC5yZXNlcnZhdGlvbmlkICE9PSBudWxsXG4gICAgICAgICAgICAgICAgPyBMb25nLmZyb21WYWx1ZShvYmplY3QucmVzZXJ2YXRpb25pZClcbiAgICAgICAgICAgICAgICA6IExvbmcuVVpFUk87XG4gICAgICAgIG1lc3NhZ2UucmVzZXJ2YXRpb24gPVxuICAgICAgICAgICAgb2JqZWN0LnJlc2VydmF0aW9uICE9PSB1bmRlZmluZWQgJiYgb2JqZWN0LnJlc2VydmF0aW9uICE9PSBudWxsXG4gICAgICAgICAgICAgICAgPyBleHBvcnRzLkNNc2dHQ0NTdHJpa2UxNVYyTWF0Y2htYWtpbmdHQzJTZXJ2ZXJSZXNlcnZlLmZyb21QYXJ0aWFsKG9iamVjdC5yZXNlcnZhdGlvbilcbiAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgICAgbWVzc2FnZS5tYXAgPSAoX2MgPSBvYmplY3QubWFwKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiBcIlwiO1xuICAgICAgICBtZXNzYWdlLnNlcnZlckFkZHJlc3MgPSAoX2QgPSBvYmplY3Quc2VydmVyQWRkcmVzcykgIT09IG51bGwgJiYgX2QgIT09IHZvaWQgMCA/IF9kIDogXCJcIjtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxufTtcbmZ1bmN0aW9uIGNyZWF0ZUJhc2VDTXNnR0NDU3RyaWtlMTVWMk1hdGNobWFraW5nU2VydmVyUm91bmRTdGF0cygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICByZXNlcnZhdGlvbmlkOiBMb25nLlVaRVJPLFxuICAgICAgICByZXNlcnZhdGlvbjogdW5kZWZpbmVkLFxuICAgICAgICBtYXA6IFwiXCIsXG4gICAgICAgIHJvdW5kOiAwLFxuICAgICAgICBraWxsczogW10sXG4gICAgICAgIGFzc2lzdHM6IFtdLFxuICAgICAgICBkZWF0aHM6IFtdLFxuICAgICAgICBzY29yZXM6IFtdLFxuICAgICAgICBwaW5nczogW10sXG4gICAgICAgIHJvdW5kUmVzdWx0OiAwLFxuICAgICAgICBtYXRjaFJlc3VsdDogMCxcbiAgICAgICAgdGVhbVNjb3JlczogW10sXG4gICAgICAgIGNvbmZpcm06IHVuZGVmaW5lZCxcbiAgICAgICAgcmVzZXJ2YXRpb25TdGFnZTogMCxcbiAgICAgICAgbWF0Y2hEdXJhdGlvbjogMCxcbiAgICAgICAgZW5lbXlLaWxsczogW10sXG4gICAgICAgIGVuZW15SGVhZHNob3RzOiBbXSxcbiAgICAgICAgZW5lbXkza3M6IFtdLFxuICAgICAgICBlbmVteTRrczogW10sXG4gICAgICAgIGVuZW15NWtzOiBbXSxcbiAgICAgICAgbXZwczogW10sXG4gICAgICAgIHNwZWN0YXRvcnNDb3VudDogMCxcbiAgICAgICAgc3BlY3RhdG9yc0NvdW50VHY6IDAsXG4gICAgICAgIHNwZWN0YXRvcnNDb3VudExuazogMCxcbiAgICAgICAgZW5lbXlLaWxsc0FnZzogW10sXG4gICAgICAgIGRyb3BJbmZvOiB1bmRlZmluZWQsXG4gICAgICAgIGJTd2l0Y2hlZFRlYW1zOiBmYWxzZSxcbiAgICAgICAgZW5lbXkya3M6IFtdLFxuICAgICAgICBwbGF5ZXJTcGF3bmVkOiBbXSxcbiAgICAgICAgdGVhbVNwYXduQ291bnQ6IFtdLFxuICAgICAgICBtYXhSb3VuZHM6IDBcbiAgICB9O1xufVxuZXhwb3J0cy5DTXNnR0NDU3RyaWtlMTVWMk1hdGNobWFraW5nU2VydmVyUm91bmRTdGF0cyA9IHtcbiAgICBlbmNvZGUobWVzc2FnZSwgd3JpdGVyID0gbWluaW1hbF8xLldyaXRlci5jcmVhdGUoKSkge1xuICAgICAgICBpZiAoIW1lc3NhZ2UucmVzZXJ2YXRpb25pZC5pc1plcm8oKSkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig4KS51aW50NjQobWVzc2FnZS5yZXNlcnZhdGlvbmlkKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5yZXNlcnZhdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBleHBvcnRzLkNNc2dHQ0NTdHJpa2UxNVYyTWF0Y2htYWtpbmdHQzJTZXJ2ZXJSZXNlcnZlLmVuY29kZShtZXNzYWdlLnJlc2VydmF0aW9uLCB3cml0ZXIudWludDMyKDE4KS5mb3JrKCkpLmxkZWxpbSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLm1hcCAhPT0gXCJcIikge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigyNikuc3RyaW5nKG1lc3NhZ2UubWFwKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5yb3VuZCAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigzMikuaW50MzIobWVzc2FnZS5yb3VuZCk7XG4gICAgICAgIH1cbiAgICAgICAgd3JpdGVyLnVpbnQzMig0MikuZm9yaygpO1xuICAgICAgICBmb3IgKGNvbnN0IHYgb2YgbWVzc2FnZS5raWxscykge1xuICAgICAgICAgICAgd3JpdGVyLmludDMyKHYpO1xuICAgICAgICB9XG4gICAgICAgIHdyaXRlci5sZGVsaW0oKTtcbiAgICAgICAgd3JpdGVyLnVpbnQzMig1MCkuZm9yaygpO1xuICAgICAgICBmb3IgKGNvbnN0IHYgb2YgbWVzc2FnZS5hc3Npc3RzKSB7XG4gICAgICAgICAgICB3cml0ZXIuaW50MzIodik7XG4gICAgICAgIH1cbiAgICAgICAgd3JpdGVyLmxkZWxpbSgpO1xuICAgICAgICB3cml0ZXIudWludDMyKDU4KS5mb3JrKCk7XG4gICAgICAgIGZvciAoY29uc3QgdiBvZiBtZXNzYWdlLmRlYXRocykge1xuICAgICAgICAgICAgd3JpdGVyLmludDMyKHYpO1xuICAgICAgICB9XG4gICAgICAgIHdyaXRlci5sZGVsaW0oKTtcbiAgICAgICAgd3JpdGVyLnVpbnQzMig2NikuZm9yaygpO1xuICAgICAgICBmb3IgKGNvbnN0IHYgb2YgbWVzc2FnZS5zY29yZXMpIHtcbiAgICAgICAgICAgIHdyaXRlci5pbnQzMih2KTtcbiAgICAgICAgfVxuICAgICAgICB3cml0ZXIubGRlbGltKCk7XG4gICAgICAgIHdyaXRlci51aW50MzIoNzQpLmZvcmsoKTtcbiAgICAgICAgZm9yIChjb25zdCB2IG9mIG1lc3NhZ2UucGluZ3MpIHtcbiAgICAgICAgICAgIHdyaXRlci5pbnQzMih2KTtcbiAgICAgICAgfVxuICAgICAgICB3cml0ZXIubGRlbGltKCk7XG4gICAgICAgIGlmIChtZXNzYWdlLnJvdW5kUmVzdWx0ICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDgwKS5pbnQzMihtZXNzYWdlLnJvdW5kUmVzdWx0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5tYXRjaFJlc3VsdCAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig4OCkuaW50MzIobWVzc2FnZS5tYXRjaFJlc3VsdCk7XG4gICAgICAgIH1cbiAgICAgICAgd3JpdGVyLnVpbnQzMig5OCkuZm9yaygpO1xuICAgICAgICBmb3IgKGNvbnN0IHYgb2YgbWVzc2FnZS50ZWFtU2NvcmVzKSB7XG4gICAgICAgICAgICB3cml0ZXIuaW50MzIodik7XG4gICAgICAgIH1cbiAgICAgICAgd3JpdGVyLmxkZWxpbSgpO1xuICAgICAgICBpZiAobWVzc2FnZS5jb25maXJtICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGV4cG9ydHMuQ01zZ0dDQ1N0cmlrZTE1VjJNYXRjaG1ha2luZ0dDMlNlcnZlckNvbmZpcm0uZW5jb2RlKG1lc3NhZ2UuY29uZmlybSwgd3JpdGVyLnVpbnQzMigxMDYpLmZvcmsoKSkubGRlbGltKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UucmVzZXJ2YXRpb25TdGFnZSAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigxMTIpLmludDMyKG1lc3NhZ2UucmVzZXJ2YXRpb25TdGFnZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UubWF0Y2hEdXJhdGlvbiAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigxMjApLmludDMyKG1lc3NhZ2UubWF0Y2hEdXJhdGlvbik7XG4gICAgICAgIH1cbiAgICAgICAgd3JpdGVyLnVpbnQzMigxMzApLmZvcmsoKTtcbiAgICAgICAgZm9yIChjb25zdCB2IG9mIG1lc3NhZ2UuZW5lbXlLaWxscykge1xuICAgICAgICAgICAgd3JpdGVyLmludDMyKHYpO1xuICAgICAgICB9XG4gICAgICAgIHdyaXRlci5sZGVsaW0oKTtcbiAgICAgICAgd3JpdGVyLnVpbnQzMigxMzgpLmZvcmsoKTtcbiAgICAgICAgZm9yIChjb25zdCB2IG9mIG1lc3NhZ2UuZW5lbXlIZWFkc2hvdHMpIHtcbiAgICAgICAgICAgIHdyaXRlci5pbnQzMih2KTtcbiAgICAgICAgfVxuICAgICAgICB3cml0ZXIubGRlbGltKCk7XG4gICAgICAgIHdyaXRlci51aW50MzIoMTQ2KS5mb3JrKCk7XG4gICAgICAgIGZvciAoY29uc3QgdiBvZiBtZXNzYWdlLmVuZW15M2tzKSB7XG4gICAgICAgICAgICB3cml0ZXIuaW50MzIodik7XG4gICAgICAgIH1cbiAgICAgICAgd3JpdGVyLmxkZWxpbSgpO1xuICAgICAgICB3cml0ZXIudWludDMyKDE1NCkuZm9yaygpO1xuICAgICAgICBmb3IgKGNvbnN0IHYgb2YgbWVzc2FnZS5lbmVteTRrcykge1xuICAgICAgICAgICAgd3JpdGVyLmludDMyKHYpO1xuICAgICAgICB9XG4gICAgICAgIHdyaXRlci5sZGVsaW0oKTtcbiAgICAgICAgd3JpdGVyLnVpbnQzMigxNjIpLmZvcmsoKTtcbiAgICAgICAgZm9yIChjb25zdCB2IG9mIG1lc3NhZ2UuZW5lbXk1a3MpIHtcbiAgICAgICAgICAgIHdyaXRlci5pbnQzMih2KTtcbiAgICAgICAgfVxuICAgICAgICB3cml0ZXIubGRlbGltKCk7XG4gICAgICAgIHdyaXRlci51aW50MzIoMTcwKS5mb3JrKCk7XG4gICAgICAgIGZvciAoY29uc3QgdiBvZiBtZXNzYWdlLm12cHMpIHtcbiAgICAgICAgICAgIHdyaXRlci5pbnQzMih2KTtcbiAgICAgICAgfVxuICAgICAgICB3cml0ZXIubGRlbGltKCk7XG4gICAgICAgIGlmIChtZXNzYWdlLnNwZWN0YXRvcnNDb3VudCAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigxNzYpLnVpbnQzMihtZXNzYWdlLnNwZWN0YXRvcnNDb3VudCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2Uuc3BlY3RhdG9yc0NvdW50VHYgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMTg0KS51aW50MzIobWVzc2FnZS5zcGVjdGF0b3JzQ291bnRUdik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2Uuc3BlY3RhdG9yc0NvdW50TG5rICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDE5MikudWludDMyKG1lc3NhZ2Uuc3BlY3RhdG9yc0NvdW50TG5rKTtcbiAgICAgICAgfVxuICAgICAgICB3cml0ZXIudWludDMyKDIwMikuZm9yaygpO1xuICAgICAgICBmb3IgKGNvbnN0IHYgb2YgbWVzc2FnZS5lbmVteUtpbGxzQWdnKSB7XG4gICAgICAgICAgICB3cml0ZXIuaW50MzIodik7XG4gICAgICAgIH1cbiAgICAgICAgd3JpdGVyLmxkZWxpbSgpO1xuICAgICAgICBpZiAobWVzc2FnZS5kcm9wSW5mbyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBleHBvcnRzLkNNc2dHQ0NTdHJpa2UxNVYyTWF0Y2htYWtpbmdTZXJ2ZXJSb3VuZFN0YXRzX0Ryb3BJbmZvLmVuY29kZShtZXNzYWdlLmRyb3BJbmZvLCB3cml0ZXIudWludDMyKDIxMCkuZm9yaygpKS5sZGVsaW0oKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5iU3dpdGNoZWRUZWFtcyA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigyMTYpLmJvb2wobWVzc2FnZS5iU3dpdGNoZWRUZWFtcyk7XG4gICAgICAgIH1cbiAgICAgICAgd3JpdGVyLnVpbnQzMigyMjYpLmZvcmsoKTtcbiAgICAgICAgZm9yIChjb25zdCB2IG9mIG1lc3NhZ2UuZW5lbXkya3MpIHtcbiAgICAgICAgICAgIHdyaXRlci5pbnQzMih2KTtcbiAgICAgICAgfVxuICAgICAgICB3cml0ZXIubGRlbGltKCk7XG4gICAgICAgIHdyaXRlci51aW50MzIoMjM0KS5mb3JrKCk7XG4gICAgICAgIGZvciAoY29uc3QgdiBvZiBtZXNzYWdlLnBsYXllclNwYXduZWQpIHtcbiAgICAgICAgICAgIHdyaXRlci5pbnQzMih2KTtcbiAgICAgICAgfVxuICAgICAgICB3cml0ZXIubGRlbGltKCk7XG4gICAgICAgIHdyaXRlci51aW50MzIoMjQyKS5mb3JrKCk7XG4gICAgICAgIGZvciAoY29uc3QgdiBvZiBtZXNzYWdlLnRlYW1TcGF3bkNvdW50KSB7XG4gICAgICAgICAgICB3cml0ZXIuaW50MzIodik7XG4gICAgICAgIH1cbiAgICAgICAgd3JpdGVyLmxkZWxpbSgpO1xuICAgICAgICBpZiAobWVzc2FnZS5tYXhSb3VuZHMgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMjQ4KS51aW50MzIobWVzc2FnZS5tYXhSb3VuZHMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfSxcbiAgICBkZWNvZGUoaW5wdXQsIGxlbmd0aCkge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBpbnB1dCBpbnN0YW5jZW9mIG1pbmltYWxfMS5SZWFkZXIgPyBpbnB1dCA6IG5ldyBtaW5pbWFsXzEuUmVhZGVyKGlucHV0KTtcbiAgICAgICAgbGV0IGVuZCA9IGxlbmd0aCA9PT0gdW5kZWZpbmVkID8gcmVhZGVyLmxlbiA6IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ01zZ0dDQ1N0cmlrZTE1VjJNYXRjaG1ha2luZ1NlcnZlclJvdW5kU3RhdHMoKTtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhZyA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgIHN3aXRjaCAodGFnID4+PiAzKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnJlc2VydmF0aW9uaWQgPSByZWFkZXIudWludDY0KCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5yZXNlcnZhdGlvbiA9XG4gICAgICAgICAgICAgICAgICAgICAgICBleHBvcnRzLkNNc2dHQ0NTdHJpa2UxNVYyTWF0Y2htYWtpbmdHQzJTZXJ2ZXJSZXNlcnZlLmRlY29kZShyZWFkZXIsIHJlYWRlci51aW50MzIoKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5tYXAgPSByZWFkZXIuc3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5yb3VuZCA9IHJlYWRlci5pbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgICAgIGlmICgodGFnICYgNykgPT09IDIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuZDIgPSByZWFkZXIudWludDMyKCkgKyByZWFkZXIucG9zO1xuICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5raWxscy5wdXNoKHJlYWRlci5pbnQzMigpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Uua2lsbHMucHVzaChyZWFkZXIuaW50MzIoKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICBpZiAoKHRhZyAmIDcpID09PSAyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbmQyID0gcmVhZGVyLnVpbnQzMigpICsgcmVhZGVyLnBvcztcbiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kMikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuYXNzaXN0cy5wdXNoKHJlYWRlci5pbnQzMigpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuYXNzaXN0cy5wdXNoKHJlYWRlci5pbnQzMigpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgICAgICAgICAgIGlmICgodGFnICYgNykgPT09IDIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuZDIgPSByZWFkZXIudWludDMyKCkgKyByZWFkZXIucG9zO1xuICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5kZWF0aHMucHVzaChyZWFkZXIuaW50MzIoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmRlYXRocy5wdXNoKHJlYWRlci5pbnQzMigpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDg6XG4gICAgICAgICAgICAgICAgICAgIGlmICgodGFnICYgNykgPT09IDIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuZDIgPSByZWFkZXIudWludDMyKCkgKyByZWFkZXIucG9zO1xuICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5zY29yZXMucHVzaChyZWFkZXIuaW50MzIoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnNjb3Jlcy5wdXNoKHJlYWRlci5pbnQzMigpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDk6XG4gICAgICAgICAgICAgICAgICAgIGlmICgodGFnICYgNykgPT09IDIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuZDIgPSByZWFkZXIudWludDMyKCkgKyByZWFkZXIucG9zO1xuICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5waW5ncy5wdXNoKHJlYWRlci5pbnQzMigpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UucGluZ3MucHVzaChyZWFkZXIuaW50MzIoKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAxMDpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5yb3VuZFJlc3VsdCA9IHJlYWRlci5pbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDExOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLm1hdGNoUmVzdWx0ID0gcmVhZGVyLmludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMTI6XG4gICAgICAgICAgICAgICAgICAgIGlmICgodGFnICYgNykgPT09IDIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuZDIgPSByZWFkZXIudWludDMyKCkgKyByZWFkZXIucG9zO1xuICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS50ZWFtU2NvcmVzLnB1c2gocmVhZGVyLmludDMyKCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS50ZWFtU2NvcmVzLnB1c2gocmVhZGVyLmludDMyKCkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMTM6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuY29uZmlybSA9IGV4cG9ydHMuQ01zZ0dDQ1N0cmlrZTE1VjJNYXRjaG1ha2luZ0dDMlNlcnZlckNvbmZpcm0uZGVjb2RlKHJlYWRlciwgcmVhZGVyLnVpbnQzMigpKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAxNDpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5yZXNlcnZhdGlvblN0YWdlID0gcmVhZGVyLmludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMTU6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UubWF0Y2hEdXJhdGlvbiA9IHJlYWRlci5pbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDE2OlxuICAgICAgICAgICAgICAgICAgICBpZiAoKHRhZyAmIDcpID09PSAyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbmQyID0gcmVhZGVyLnVpbnQzMigpICsgcmVhZGVyLnBvcztcbiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kMikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZW5lbXlLaWxscy5wdXNoKHJlYWRlci5pbnQzMigpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZW5lbXlLaWxscy5wdXNoKHJlYWRlci5pbnQzMigpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDE3OlxuICAgICAgICAgICAgICAgICAgICBpZiAoKHRhZyAmIDcpID09PSAyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbmQyID0gcmVhZGVyLnVpbnQzMigpICsgcmVhZGVyLnBvcztcbiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kMikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZW5lbXlIZWFkc2hvdHMucHVzaChyZWFkZXIuaW50MzIoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmVuZW15SGVhZHNob3RzLnB1c2gocmVhZGVyLmludDMyKCkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMTg6XG4gICAgICAgICAgICAgICAgICAgIGlmICgodGFnICYgNykgPT09IDIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuZDIgPSByZWFkZXIudWludDMyKCkgKyByZWFkZXIucG9zO1xuICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5lbmVteTNrcy5wdXNoKHJlYWRlci5pbnQzMigpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZW5lbXkza3MucHVzaChyZWFkZXIuaW50MzIoKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAxOTpcbiAgICAgICAgICAgICAgICAgICAgaWYgKCh0YWcgJiA3KSA9PT0gMikge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZW5kMiA9IHJlYWRlci51aW50MzIoKSArIHJlYWRlci5wb3M7XG4gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZDIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmVuZW15NGtzLnB1c2gocmVhZGVyLmludDMyKCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5lbmVteTRrcy5wdXNoKHJlYWRlci5pbnQzMigpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDIwOlxuICAgICAgICAgICAgICAgICAgICBpZiAoKHRhZyAmIDcpID09PSAyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbmQyID0gcmVhZGVyLnVpbnQzMigpICsgcmVhZGVyLnBvcztcbiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kMikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZW5lbXk1a3MucHVzaChyZWFkZXIuaW50MzIoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmVuZW15NWtzLnB1c2gocmVhZGVyLmludDMyKCkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMjE6XG4gICAgICAgICAgICAgICAgICAgIGlmICgodGFnICYgNykgPT09IDIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuZDIgPSByZWFkZXIudWludDMyKCkgKyByZWFkZXIucG9zO1xuICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5tdnBzLnB1c2gocmVhZGVyLmludDMyKCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5tdnBzLnB1c2gocmVhZGVyLmludDMyKCkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMjI6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Uuc3BlY3RhdG9yc0NvdW50ID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDIzOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnNwZWN0YXRvcnNDb3VudFR2ID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDI0OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnNwZWN0YXRvcnNDb3VudExuayA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAyNTpcbiAgICAgICAgICAgICAgICAgICAgaWYgKCh0YWcgJiA3KSA9PT0gMikge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZW5kMiA9IHJlYWRlci51aW50MzIoKSArIHJlYWRlci5wb3M7XG4gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZDIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmVuZW15S2lsbHNBZ2cucHVzaChyZWFkZXIuaW50MzIoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmVuZW15S2lsbHNBZ2cucHVzaChyZWFkZXIuaW50MzIoKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAyNjpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5kcm9wSW5mbyA9XG4gICAgICAgICAgICAgICAgICAgICAgICBleHBvcnRzLkNNc2dHQ0NTdHJpa2UxNVYyTWF0Y2htYWtpbmdTZXJ2ZXJSb3VuZFN0YXRzX0Ryb3BJbmZvLmRlY29kZShyZWFkZXIsIHJlYWRlci51aW50MzIoKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMjc6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuYlN3aXRjaGVkVGVhbXMgPSByZWFkZXIuYm9vbCgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDI4OlxuICAgICAgICAgICAgICAgICAgICBpZiAoKHRhZyAmIDcpID09PSAyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbmQyID0gcmVhZGVyLnVpbnQzMigpICsgcmVhZGVyLnBvcztcbiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kMikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZW5lbXkya3MucHVzaChyZWFkZXIuaW50MzIoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmVuZW15MmtzLnB1c2gocmVhZGVyLmludDMyKCkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMjk6XG4gICAgICAgICAgICAgICAgICAgIGlmICgodGFnICYgNykgPT09IDIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuZDIgPSByZWFkZXIudWludDMyKCkgKyByZWFkZXIucG9zO1xuICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5wbGF5ZXJTcGF3bmVkLnB1c2gocmVhZGVyLmludDMyKCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5wbGF5ZXJTcGF3bmVkLnB1c2gocmVhZGVyLmludDMyKCkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMzA6XG4gICAgICAgICAgICAgICAgICAgIGlmICgodGFnICYgNykgPT09IDIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuZDIgPSByZWFkZXIudWludDMyKCkgKyByZWFkZXIucG9zO1xuICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS50ZWFtU3Bhd25Db3VudC5wdXNoKHJlYWRlci5pbnQzMigpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudGVhbVNwYXduQ291bnQucHVzaChyZWFkZXIuaW50MzIoKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAzMTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5tYXhSb3VuZHMgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJlYWRlci5za2lwVHlwZSh0YWcgJiA3KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfSxcbiAgICBmcm9tUGFydGlhbChvYmplY3QpIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2MsIF9kLCBfZSwgX2YsIF9nLCBfaCwgX2osIF9rLCBfbCwgX20sIF9vLCBfcCwgX3EsIF9yLCBfcywgX3QsIF91LCBfdiwgX3csIF94LCBfeSwgX3osIF8wLCBfMSwgXzI7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ01zZ0dDQ1N0cmlrZTE1VjJNYXRjaG1ha2luZ1NlcnZlclJvdW5kU3RhdHMoKTtcbiAgICAgICAgbWVzc2FnZS5yZXNlcnZhdGlvbmlkID1cbiAgICAgICAgICAgIG9iamVjdC5yZXNlcnZhdGlvbmlkICE9PSB1bmRlZmluZWQgJiYgb2JqZWN0LnJlc2VydmF0aW9uaWQgIT09IG51bGxcbiAgICAgICAgICAgICAgICA/IExvbmcuZnJvbVZhbHVlKG9iamVjdC5yZXNlcnZhdGlvbmlkKVxuICAgICAgICAgICAgICAgIDogTG9uZy5VWkVSTztcbiAgICAgICAgbWVzc2FnZS5yZXNlcnZhdGlvbiA9XG4gICAgICAgICAgICBvYmplY3QucmVzZXJ2YXRpb24gIT09IHVuZGVmaW5lZCAmJiBvYmplY3QucmVzZXJ2YXRpb24gIT09IG51bGxcbiAgICAgICAgICAgICAgICA/IGV4cG9ydHMuQ01zZ0dDQ1N0cmlrZTE1VjJNYXRjaG1ha2luZ0dDMlNlcnZlclJlc2VydmUuZnJvbVBhcnRpYWwob2JqZWN0LnJlc2VydmF0aW9uKVxuICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgICBtZXNzYWdlLm1hcCA9IChfYSA9IG9iamVjdC5tYXApICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IFwiXCI7XG4gICAgICAgIG1lc3NhZ2Uucm91bmQgPSAoX2IgPSBvYmplY3Qucm91bmQpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IDA7XG4gICAgICAgIG1lc3NhZ2Uua2lsbHMgPSAoKF9jID0gb2JqZWN0LmtpbGxzKSA9PT0gbnVsbCB8fCBfYyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2MubWFwKGUgPT4gZSkpIHx8IFtdO1xuICAgICAgICBtZXNzYWdlLmFzc2lzdHMgPSAoKF9kID0gb2JqZWN0LmFzc2lzdHMpID09PSBudWxsIHx8IF9kID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZC5tYXAoZSA9PiBlKSkgfHwgW107XG4gICAgICAgIG1lc3NhZ2UuZGVhdGhzID0gKChfZSA9IG9iamVjdC5kZWF0aHMpID09PSBudWxsIHx8IF9lID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZS5tYXAoZSA9PiBlKSkgfHwgW107XG4gICAgICAgIG1lc3NhZ2Uuc2NvcmVzID0gKChfZiA9IG9iamVjdC5zY29yZXMpID09PSBudWxsIHx8IF9mID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZi5tYXAoZSA9PiBlKSkgfHwgW107XG4gICAgICAgIG1lc3NhZ2UucGluZ3MgPSAoKF9nID0gb2JqZWN0LnBpbmdzKSA9PT0gbnVsbCB8fCBfZyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2cubWFwKGUgPT4gZSkpIHx8IFtdO1xuICAgICAgICBtZXNzYWdlLnJvdW5kUmVzdWx0ID0gKF9oID0gb2JqZWN0LnJvdW5kUmVzdWx0KSAhPT0gbnVsbCAmJiBfaCAhPT0gdm9pZCAwID8gX2ggOiAwO1xuICAgICAgICBtZXNzYWdlLm1hdGNoUmVzdWx0ID0gKF9qID0gb2JqZWN0Lm1hdGNoUmVzdWx0KSAhPT0gbnVsbCAmJiBfaiAhPT0gdm9pZCAwID8gX2ogOiAwO1xuICAgICAgICBtZXNzYWdlLnRlYW1TY29yZXMgPSAoKF9rID0gb2JqZWN0LnRlYW1TY29yZXMpID09PSBudWxsIHx8IF9rID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfay5tYXAoZSA9PiBlKSkgfHwgW107XG4gICAgICAgIG1lc3NhZ2UuY29uZmlybSA9XG4gICAgICAgICAgICBvYmplY3QuY29uZmlybSAhPT0gdW5kZWZpbmVkICYmIG9iamVjdC5jb25maXJtICE9PSBudWxsXG4gICAgICAgICAgICAgICAgPyBleHBvcnRzLkNNc2dHQ0NTdHJpa2UxNVYyTWF0Y2htYWtpbmdHQzJTZXJ2ZXJDb25maXJtLmZyb21QYXJ0aWFsKG9iamVjdC5jb25maXJtKVxuICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgICBtZXNzYWdlLnJlc2VydmF0aW9uU3RhZ2UgPSAoX2wgPSBvYmplY3QucmVzZXJ2YXRpb25TdGFnZSkgIT09IG51bGwgJiYgX2wgIT09IHZvaWQgMCA/IF9sIDogMDtcbiAgICAgICAgbWVzc2FnZS5tYXRjaER1cmF0aW9uID0gKF9tID0gb2JqZWN0Lm1hdGNoRHVyYXRpb24pICE9PSBudWxsICYmIF9tICE9PSB2b2lkIDAgPyBfbSA6IDA7XG4gICAgICAgIG1lc3NhZ2UuZW5lbXlLaWxscyA9ICgoX28gPSBvYmplY3QuZW5lbXlLaWxscykgPT09IG51bGwgfHwgX28gPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9vLm1hcChlID0+IGUpKSB8fCBbXTtcbiAgICAgICAgbWVzc2FnZS5lbmVteUhlYWRzaG90cyA9ICgoX3AgPSBvYmplY3QuZW5lbXlIZWFkc2hvdHMpID09PSBudWxsIHx8IF9wID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfcC5tYXAoZSA9PiBlKSkgfHwgW107XG4gICAgICAgIG1lc3NhZ2UuZW5lbXkza3MgPSAoKF9xID0gb2JqZWN0LmVuZW15M2tzKSA9PT0gbnVsbCB8fCBfcSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3EubWFwKGUgPT4gZSkpIHx8IFtdO1xuICAgICAgICBtZXNzYWdlLmVuZW15NGtzID0gKChfciA9IG9iamVjdC5lbmVteTRrcykgPT09IG51bGwgfHwgX3IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9yLm1hcChlID0+IGUpKSB8fCBbXTtcbiAgICAgICAgbWVzc2FnZS5lbmVteTVrcyA9ICgoX3MgPSBvYmplY3QuZW5lbXk1a3MpID09PSBudWxsIHx8IF9zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfcy5tYXAoZSA9PiBlKSkgfHwgW107XG4gICAgICAgIG1lc3NhZ2UubXZwcyA9ICgoX3QgPSBvYmplY3QubXZwcykgPT09IG51bGwgfHwgX3QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF90Lm1hcChlID0+IGUpKSB8fCBbXTtcbiAgICAgICAgbWVzc2FnZS5zcGVjdGF0b3JzQ291bnQgPSAoX3UgPSBvYmplY3Quc3BlY3RhdG9yc0NvdW50KSAhPT0gbnVsbCAmJiBfdSAhPT0gdm9pZCAwID8gX3UgOiAwO1xuICAgICAgICBtZXNzYWdlLnNwZWN0YXRvcnNDb3VudFR2ID0gKF92ID0gb2JqZWN0LnNwZWN0YXRvcnNDb3VudFR2KSAhPT0gbnVsbCAmJiBfdiAhPT0gdm9pZCAwID8gX3YgOiAwO1xuICAgICAgICBtZXNzYWdlLnNwZWN0YXRvcnNDb3VudExuayA9IChfdyA9IG9iamVjdC5zcGVjdGF0b3JzQ291bnRMbmspICE9PSBudWxsICYmIF93ICE9PSB2b2lkIDAgPyBfdyA6IDA7XG4gICAgICAgIG1lc3NhZ2UuZW5lbXlLaWxsc0FnZyA9ICgoX3ggPSBvYmplY3QuZW5lbXlLaWxsc0FnZykgPT09IG51bGwgfHwgX3ggPT09IHZvaWQgMCA/IHZvaWQgMCA6IF94Lm1hcChlID0+IGUpKSB8fCBbXTtcbiAgICAgICAgbWVzc2FnZS5kcm9wSW5mbyA9XG4gICAgICAgICAgICBvYmplY3QuZHJvcEluZm8gIT09IHVuZGVmaW5lZCAmJiBvYmplY3QuZHJvcEluZm8gIT09IG51bGxcbiAgICAgICAgICAgICAgICA/IGV4cG9ydHMuQ01zZ0dDQ1N0cmlrZTE1VjJNYXRjaG1ha2luZ1NlcnZlclJvdW5kU3RhdHNfRHJvcEluZm8uZnJvbVBhcnRpYWwob2JqZWN0LmRyb3BJbmZvKVxuICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgICBtZXNzYWdlLmJTd2l0Y2hlZFRlYW1zID0gKF95ID0gb2JqZWN0LmJTd2l0Y2hlZFRlYW1zKSAhPT0gbnVsbCAmJiBfeSAhPT0gdm9pZCAwID8gX3kgOiBmYWxzZTtcbiAgICAgICAgbWVzc2FnZS5lbmVteTJrcyA9ICgoX3ogPSBvYmplY3QuZW5lbXkya3MpID09PSBudWxsIHx8IF96ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfei5tYXAoZSA9PiBlKSkgfHwgW107XG4gICAgICAgIG1lc3NhZ2UucGxheWVyU3Bhd25lZCA9ICgoXzAgPSBvYmplY3QucGxheWVyU3Bhd25lZCkgPT09IG51bGwgfHwgXzAgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF8wLm1hcChlID0+IGUpKSB8fCBbXTtcbiAgICAgICAgbWVzc2FnZS50ZWFtU3Bhd25Db3VudCA9ICgoXzEgPSBvYmplY3QudGVhbVNwYXduQ291bnQpID09PSBudWxsIHx8IF8xID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfMS5tYXAoZSA9PiBlKSkgfHwgW107XG4gICAgICAgIG1lc3NhZ2UubWF4Um91bmRzID0gKF8yID0gb2JqZWN0Lm1heFJvdW5kcykgIT09IG51bGwgJiYgXzIgIT09IHZvaWQgMCA/IF8yIDogMDtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxufTtcbmZ1bmN0aW9uIGNyZWF0ZUJhc2VDTXNnR0NDU3RyaWtlMTVWMk1hdGNobWFraW5nU2VydmVyUm91bmRTdGF0c19Ecm9wSW5mbygpIHtcbiAgICByZXR1cm4geyBhY2NvdW50TXZwOiAwIH07XG59XG5leHBvcnRzLkNNc2dHQ0NTdHJpa2UxNVYyTWF0Y2htYWtpbmdTZXJ2ZXJSb3VuZFN0YXRzX0Ryb3BJbmZvID0ge1xuICAgIGVuY29kZShtZXNzYWdlLCB3cml0ZXIgPSBtaW5pbWFsXzEuV3JpdGVyLmNyZWF0ZSgpKSB7XG4gICAgICAgIGlmIChtZXNzYWdlLmFjY291bnRNdnAgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoOCkudWludDMyKG1lc3NhZ2UuYWNjb3VudE12cCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9LFxuICAgIGRlY29kZShpbnB1dCwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IGlucHV0IGluc3RhbmNlb2YgbWluaW1hbF8xLlJlYWRlciA/IGlucHV0IDogbmV3IG1pbmltYWxfMS5SZWFkZXIoaW5wdXQpO1xuICAgICAgICBsZXQgZW5kID0gbGVuZ3RoID09PSB1bmRlZmluZWQgPyByZWFkZXIubGVuIDogcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDTXNnR0NDU3RyaWtlMTVWMk1hdGNobWFraW5nU2VydmVyUm91bmRTdGF0c19Ecm9wSW5mbygpO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuYWNjb3VudE12cCA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmVhZGVyLnNraXBUeXBlKHRhZyAmIDcpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9LFxuICAgIGZyb21QYXJ0aWFsKG9iamVjdCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ01zZ0dDQ1N0cmlrZTE1VjJNYXRjaG1ha2luZ1NlcnZlclJvdW5kU3RhdHNfRHJvcEluZm8oKTtcbiAgICAgICAgbWVzc2FnZS5hY2NvdW50TXZwID0gKF9hID0gb2JqZWN0LmFjY291bnRNdnApICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IDA7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbn07XG5mdW5jdGlvbiBjcmVhdGVCYXNlQ01zZ0dDQ1N0cmlrZTE1VjJNYXRjaG1ha2luZ0NsaWVudDJHQ0hlbGxvKCkge1xuICAgIHJldHVybiB7fTtcbn1cbmV4cG9ydHMuQ01zZ0dDQ1N0cmlrZTE1VjJNYXRjaG1ha2luZ0NsaWVudDJHQ0hlbGxvID0ge1xuICAgIGVuY29kZShfLCB3cml0ZXIgPSBtaW5pbWFsXzEuV3JpdGVyLmNyZWF0ZSgpKSB7XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfSxcbiAgICBkZWNvZGUoaW5wdXQsIGxlbmd0aCkge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBpbnB1dCBpbnN0YW5jZW9mIG1pbmltYWxfMS5SZWFkZXIgPyBpbnB1dCA6IG5ldyBtaW5pbWFsXzEuUmVhZGVyKGlucHV0KTtcbiAgICAgICAgbGV0IGVuZCA9IGxlbmd0aCA9PT0gdW5kZWZpbmVkID8gcmVhZGVyLmxlbiA6IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ01zZ0dDQ1N0cmlrZTE1VjJNYXRjaG1ha2luZ0NsaWVudDJHQ0hlbGxvKCk7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBjb25zdCB0YWcgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKHRhZyA+Pj4gMykge1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJlYWRlci5za2lwVHlwZSh0YWcgJiA3KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfSxcbiAgICBmcm9tUGFydGlhbChfKSB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ01zZ0dDQ1N0cmlrZTE1VjJNYXRjaG1ha2luZ0NsaWVudDJHQ0hlbGxvKCk7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbn07XG5mdW5jdGlvbiBjcmVhdGVCYXNlQ01zZ0dDQ1N0cmlrZTE1VjJNYXRjaG1ha2luZ0dDMkNsaWVudEhlbGxvKCkge1xuICAgIHJldHVybiB7XG4gICAgICAgIGFjY291bnRJZDogMCxcbiAgICAgICAgb25nb2luZ21hdGNoOiB1bmRlZmluZWQsXG4gICAgICAgIGdsb2JhbFN0YXRzOiB1bmRlZmluZWQsXG4gICAgICAgIHBlbmFsdHlTZWNvbmRzOiAwLFxuICAgICAgICBwZW5hbHR5UmVhc29uOiAwLFxuICAgICAgICB2YWNCYW5uZWQ6IDAsXG4gICAgICAgIHJhbmtpbmc6IHVuZGVmaW5lZCxcbiAgICAgICAgY29tbWVuZGF0aW9uOiB1bmRlZmluZWQsXG4gICAgICAgIG1lZGFsczogdW5kZWZpbmVkLFxuICAgICAgICBteUN1cnJlbnRFdmVudDogdW5kZWZpbmVkLFxuICAgICAgICBteUN1cnJlbnRFdmVudFRlYW1zOiBbXSxcbiAgICAgICAgbXlDdXJyZW50VGVhbTogdW5kZWZpbmVkLFxuICAgICAgICBteUN1cnJlbnRFdmVudFN0YWdlczogW10sXG4gICAgICAgIHN1cnZleVZvdGU6IDAsXG4gICAgICAgIGFjdGl2aXR5OiB1bmRlZmluZWQsXG4gICAgICAgIHBsYXllckxldmVsOiAwLFxuICAgICAgICBwbGF5ZXJDdXJYcDogMCxcbiAgICAgICAgcGxheWVyWHBCb251c0ZsYWdzOiAwLFxuICAgICAgICByYW5raW5nczogW11cbiAgICB9O1xufVxuZXhwb3J0cy5DTXNnR0NDU3RyaWtlMTVWMk1hdGNobWFraW5nR0MyQ2xpZW50SGVsbG8gPSB7XG4gICAgZW5jb2RlKG1lc3NhZ2UsIHdyaXRlciA9IG1pbmltYWxfMS5Xcml0ZXIuY3JlYXRlKCkpIHtcbiAgICAgICAgaWYgKG1lc3NhZ2UuYWNjb3VudElkICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDgpLnVpbnQzMihtZXNzYWdlLmFjY291bnRJZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2Uub25nb2luZ21hdGNoICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGV4cG9ydHMuQ01zZ0dDQ1N0cmlrZTE1VjJNYXRjaG1ha2luZ0dDMkNsaWVudFJlc2VydmUuZW5jb2RlKG1lc3NhZ2Uub25nb2luZ21hdGNoLCB3cml0ZXIudWludDMyKDE4KS5mb3JrKCkpLmxkZWxpbSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLmdsb2JhbFN0YXRzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGV4cG9ydHMuR2xvYmFsU3RhdGlzdGljcy5lbmNvZGUobWVzc2FnZS5nbG9iYWxTdGF0cywgd3JpdGVyLnVpbnQzMigyNikuZm9yaygpKS5sZGVsaW0oKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5wZW5hbHR5U2Vjb25kcyAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigzMikudWludDMyKG1lc3NhZ2UucGVuYWx0eVNlY29uZHMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLnBlbmFsdHlSZWFzb24gIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoNDApLnVpbnQzMihtZXNzYWdlLnBlbmFsdHlSZWFzb24pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLnZhY0Jhbm5lZCAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig0OCkuaW50MzIobWVzc2FnZS52YWNCYW5uZWQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLnJhbmtpbmcgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgZXhwb3J0cy5QbGF5ZXJSYW5raW5nSW5mby5lbmNvZGUobWVzc2FnZS5yYW5raW5nLCB3cml0ZXIudWludDMyKDU4KS5mb3JrKCkpLmxkZWxpbSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLmNvbW1lbmRhdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBleHBvcnRzLlBsYXllckNvbW1lbmRhdGlvbkluZm8uZW5jb2RlKG1lc3NhZ2UuY29tbWVuZGF0aW9uLCB3cml0ZXIudWludDMyKDY2KS5mb3JrKCkpLmxkZWxpbSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLm1lZGFscyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBleHBvcnRzLlBsYXllck1lZGFsc0luZm8uZW5jb2RlKG1lc3NhZ2UubWVkYWxzLCB3cml0ZXIudWludDMyKDc0KS5mb3JrKCkpLmxkZWxpbSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLm15Q3VycmVudEV2ZW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGV4cG9ydHMuVG91cm5hbWVudEV2ZW50LmVuY29kZShtZXNzYWdlLm15Q3VycmVudEV2ZW50LCB3cml0ZXIudWludDMyKDgyKS5mb3JrKCkpLmxkZWxpbSgpO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3QgdiBvZiBtZXNzYWdlLm15Q3VycmVudEV2ZW50VGVhbXMpIHtcbiAgICAgICAgICAgIGV4cG9ydHMuVG91cm5hbWVudFRlYW0uZW5jb2RlKHYsIHdyaXRlci51aW50MzIoOTApLmZvcmsoKSkubGRlbGltKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UubXlDdXJyZW50VGVhbSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBleHBvcnRzLlRvdXJuYW1lbnRUZWFtLmVuY29kZShtZXNzYWdlLm15Q3VycmVudFRlYW0sIHdyaXRlci51aW50MzIoOTgpLmZvcmsoKSkubGRlbGltKCk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCB2IG9mIG1lc3NhZ2UubXlDdXJyZW50RXZlbnRTdGFnZXMpIHtcbiAgICAgICAgICAgIGV4cG9ydHMuVG91cm5hbWVudEV2ZW50LmVuY29kZSh2LCB3cml0ZXIudWludDMyKDEwNikuZm9yaygpKS5sZGVsaW0oKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5zdXJ2ZXlWb3RlICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDExMikudWludDMyKG1lc3NhZ2Uuc3VydmV5Vm90ZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UuYWN0aXZpdHkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgZXhwb3J0cy5BY2NvdW50QWN0aXZpdHkuZW5jb2RlKG1lc3NhZ2UuYWN0aXZpdHksIHdyaXRlci51aW50MzIoMTIyKS5mb3JrKCkpLmxkZWxpbSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLnBsYXllckxldmVsICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDEzNikuaW50MzIobWVzc2FnZS5wbGF5ZXJMZXZlbCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UucGxheWVyQ3VyWHAgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMTQ0KS5pbnQzMihtZXNzYWdlLnBsYXllckN1clhwKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5wbGF5ZXJYcEJvbnVzRmxhZ3MgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMTUyKS5pbnQzMihtZXNzYWdlLnBsYXllclhwQm9udXNGbGFncyk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCB2IG9mIG1lc3NhZ2UucmFua2luZ3MpIHtcbiAgICAgICAgICAgIGV4cG9ydHMuUGxheWVyUmFua2luZ0luZm8uZW5jb2RlKHYsIHdyaXRlci51aW50MzIoMTYyKS5mb3JrKCkpLmxkZWxpbSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfSxcbiAgICBkZWNvZGUoaW5wdXQsIGxlbmd0aCkge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBpbnB1dCBpbnN0YW5jZW9mIG1pbmltYWxfMS5SZWFkZXIgPyBpbnB1dCA6IG5ldyBtaW5pbWFsXzEuUmVhZGVyKGlucHV0KTtcbiAgICAgICAgbGV0IGVuZCA9IGxlbmd0aCA9PT0gdW5kZWZpbmVkID8gcmVhZGVyLmxlbiA6IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ01zZ0dDQ1N0cmlrZTE1VjJNYXRjaG1ha2luZ0dDMkNsaWVudEhlbGxvKCk7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBjb25zdCB0YWcgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKHRhZyA+Pj4gMykge1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5hY2NvdW50SWQgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5vbmdvaW5nbWF0Y2ggPVxuICAgICAgICAgICAgICAgICAgICAgICAgZXhwb3J0cy5DTXNnR0NDU3RyaWtlMTVWMk1hdGNobWFraW5nR0MyQ2xpZW50UmVzZXJ2ZS5kZWNvZGUocmVhZGVyLCByZWFkZXIudWludDMyKCkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZ2xvYmFsU3RhdHMgPSBleHBvcnRzLkdsb2JhbFN0YXRpc3RpY3MuZGVjb2RlKHJlYWRlciwgcmVhZGVyLnVpbnQzMigpKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnBlbmFsdHlTZWNvbmRzID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UucGVuYWx0eVJlYXNvbiA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnZhY0Jhbm5lZCA9IHJlYWRlci5pbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UucmFua2luZyA9IGV4cG9ydHMuUGxheWVyUmFua2luZ0luZm8uZGVjb2RlKHJlYWRlciwgcmVhZGVyLnVpbnQzMigpKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA4OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmNvbW1lbmRhdGlvbiA9IGV4cG9ydHMuUGxheWVyQ29tbWVuZGF0aW9uSW5mby5kZWNvZGUocmVhZGVyLCByZWFkZXIudWludDMyKCkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDk6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UubWVkYWxzID0gZXhwb3J0cy5QbGF5ZXJNZWRhbHNJbmZvLmRlY29kZShyZWFkZXIsIHJlYWRlci51aW50MzIoKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMTA6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UubXlDdXJyZW50RXZlbnQgPSBleHBvcnRzLlRvdXJuYW1lbnRFdmVudC5kZWNvZGUocmVhZGVyLCByZWFkZXIudWludDMyKCkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDExOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLm15Q3VycmVudEV2ZW50VGVhbXMucHVzaChleHBvcnRzLlRvdXJuYW1lbnRUZWFtLmRlY29kZShyZWFkZXIsIHJlYWRlci51aW50MzIoKSkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDEyOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLm15Q3VycmVudFRlYW0gPSBleHBvcnRzLlRvdXJuYW1lbnRUZWFtLmRlY29kZShyZWFkZXIsIHJlYWRlci51aW50MzIoKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMTM6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UubXlDdXJyZW50RXZlbnRTdGFnZXMucHVzaChleHBvcnRzLlRvdXJuYW1lbnRFdmVudC5kZWNvZGUocmVhZGVyLCByZWFkZXIudWludDMyKCkpKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAxNDpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5zdXJ2ZXlWb3RlID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDE1OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmFjdGl2aXR5ID0gZXhwb3J0cy5BY2NvdW50QWN0aXZpdHkuZGVjb2RlKHJlYWRlciwgcmVhZGVyLnVpbnQzMigpKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAxNzpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5wbGF5ZXJMZXZlbCA9IHJlYWRlci5pbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDE4OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnBsYXllckN1clhwID0gcmVhZGVyLmludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMTk6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UucGxheWVyWHBCb251c0ZsYWdzID0gcmVhZGVyLmludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMjA6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UucmFua2luZ3MucHVzaChleHBvcnRzLlBsYXllclJhbmtpbmdJbmZvLmRlY29kZShyZWFkZXIsIHJlYWRlci51aW50MzIoKSkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICByZWFkZXIuc2tpcFR5cGUodGFnICYgNyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH0sXG4gICAgZnJvbVBhcnRpYWwob2JqZWN0KSB7XG4gICAgICAgIHZhciBfYSwgX2IsIF9jLCBfZCwgX2UsIF9mLCBfZywgX2gsIF9qLCBfaywgX2w7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ01zZ0dDQ1N0cmlrZTE1VjJNYXRjaG1ha2luZ0dDMkNsaWVudEhlbGxvKCk7XG4gICAgICAgIG1lc3NhZ2UuYWNjb3VudElkID0gKF9hID0gb2JqZWN0LmFjY291bnRJZCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMDtcbiAgICAgICAgbWVzc2FnZS5vbmdvaW5nbWF0Y2ggPVxuICAgICAgICAgICAgb2JqZWN0Lm9uZ29pbmdtYXRjaCAhPT0gdW5kZWZpbmVkICYmIG9iamVjdC5vbmdvaW5nbWF0Y2ggIT09IG51bGxcbiAgICAgICAgICAgICAgICA/IGV4cG9ydHMuQ01zZ0dDQ1N0cmlrZTE1VjJNYXRjaG1ha2luZ0dDMkNsaWVudFJlc2VydmUuZnJvbVBhcnRpYWwob2JqZWN0Lm9uZ29pbmdtYXRjaClcbiAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgICAgbWVzc2FnZS5nbG9iYWxTdGF0cyA9XG4gICAgICAgICAgICBvYmplY3QuZ2xvYmFsU3RhdHMgIT09IHVuZGVmaW5lZCAmJiBvYmplY3QuZ2xvYmFsU3RhdHMgIT09IG51bGxcbiAgICAgICAgICAgICAgICA/IGV4cG9ydHMuR2xvYmFsU3RhdGlzdGljcy5mcm9tUGFydGlhbChvYmplY3QuZ2xvYmFsU3RhdHMpXG4gICAgICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICAgIG1lc3NhZ2UucGVuYWx0eVNlY29uZHMgPSAoX2IgPSBvYmplY3QucGVuYWx0eVNlY29uZHMpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IDA7XG4gICAgICAgIG1lc3NhZ2UucGVuYWx0eVJlYXNvbiA9IChfYyA9IG9iamVjdC5wZW5hbHR5UmVhc29uKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiAwO1xuICAgICAgICBtZXNzYWdlLnZhY0Jhbm5lZCA9IChfZCA9IG9iamVjdC52YWNCYW5uZWQpICE9PSBudWxsICYmIF9kICE9PSB2b2lkIDAgPyBfZCA6IDA7XG4gICAgICAgIG1lc3NhZ2UucmFua2luZyA9XG4gICAgICAgICAgICBvYmplY3QucmFua2luZyAhPT0gdW5kZWZpbmVkICYmIG9iamVjdC5yYW5raW5nICE9PSBudWxsXG4gICAgICAgICAgICAgICAgPyBleHBvcnRzLlBsYXllclJhbmtpbmdJbmZvLmZyb21QYXJ0aWFsKG9iamVjdC5yYW5raW5nKVxuICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgICBtZXNzYWdlLmNvbW1lbmRhdGlvbiA9XG4gICAgICAgICAgICBvYmplY3QuY29tbWVuZGF0aW9uICE9PSB1bmRlZmluZWQgJiYgb2JqZWN0LmNvbW1lbmRhdGlvbiAhPT0gbnVsbFxuICAgICAgICAgICAgICAgID8gZXhwb3J0cy5QbGF5ZXJDb21tZW5kYXRpb25JbmZvLmZyb21QYXJ0aWFsKG9iamVjdC5jb21tZW5kYXRpb24pXG4gICAgICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICAgIG1lc3NhZ2UubWVkYWxzID1cbiAgICAgICAgICAgIG9iamVjdC5tZWRhbHMgIT09IHVuZGVmaW5lZCAmJiBvYmplY3QubWVkYWxzICE9PSBudWxsXG4gICAgICAgICAgICAgICAgPyBleHBvcnRzLlBsYXllck1lZGFsc0luZm8uZnJvbVBhcnRpYWwob2JqZWN0Lm1lZGFscylcbiAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgICAgbWVzc2FnZS5teUN1cnJlbnRFdmVudCA9XG4gICAgICAgICAgICBvYmplY3QubXlDdXJyZW50RXZlbnQgIT09IHVuZGVmaW5lZCAmJiBvYmplY3QubXlDdXJyZW50RXZlbnQgIT09IG51bGxcbiAgICAgICAgICAgICAgICA/IGV4cG9ydHMuVG91cm5hbWVudEV2ZW50LmZyb21QYXJ0aWFsKG9iamVjdC5teUN1cnJlbnRFdmVudClcbiAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgICAgbWVzc2FnZS5teUN1cnJlbnRFdmVudFRlYW1zID1cbiAgICAgICAgICAgICgoX2UgPSBvYmplY3QubXlDdXJyZW50RXZlbnRUZWFtcykgPT09IG51bGwgfHwgX2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9lLm1hcChlID0+IGV4cG9ydHMuVG91cm5hbWVudFRlYW0uZnJvbVBhcnRpYWwoZSkpKSB8fCBbXTtcbiAgICAgICAgbWVzc2FnZS5teUN1cnJlbnRUZWFtID1cbiAgICAgICAgICAgIG9iamVjdC5teUN1cnJlbnRUZWFtICE9PSB1bmRlZmluZWQgJiYgb2JqZWN0Lm15Q3VycmVudFRlYW0gIT09IG51bGxcbiAgICAgICAgICAgICAgICA/IGV4cG9ydHMuVG91cm5hbWVudFRlYW0uZnJvbVBhcnRpYWwob2JqZWN0Lm15Q3VycmVudFRlYW0pXG4gICAgICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICAgIG1lc3NhZ2UubXlDdXJyZW50RXZlbnRTdGFnZXMgPVxuICAgICAgICAgICAgKChfZiA9IG9iamVjdC5teUN1cnJlbnRFdmVudFN0YWdlcykgPT09IG51bGwgfHwgX2YgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9mLm1hcChlID0+IGV4cG9ydHMuVG91cm5hbWVudEV2ZW50LmZyb21QYXJ0aWFsKGUpKSkgfHxcbiAgICAgICAgICAgICAgICBbXTtcbiAgICAgICAgbWVzc2FnZS5zdXJ2ZXlWb3RlID0gKF9nID0gb2JqZWN0LnN1cnZleVZvdGUpICE9PSBudWxsICYmIF9nICE9PSB2b2lkIDAgPyBfZyA6IDA7XG4gICAgICAgIG1lc3NhZ2UuYWN0aXZpdHkgPVxuICAgICAgICAgICAgb2JqZWN0LmFjdGl2aXR5ICE9PSB1bmRlZmluZWQgJiYgb2JqZWN0LmFjdGl2aXR5ICE9PSBudWxsXG4gICAgICAgICAgICAgICAgPyBleHBvcnRzLkFjY291bnRBY3Rpdml0eS5mcm9tUGFydGlhbChvYmplY3QuYWN0aXZpdHkpXG4gICAgICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICAgIG1lc3NhZ2UucGxheWVyTGV2ZWwgPSAoX2ggPSBvYmplY3QucGxheWVyTGV2ZWwpICE9PSBudWxsICYmIF9oICE9PSB2b2lkIDAgPyBfaCA6IDA7XG4gICAgICAgIG1lc3NhZ2UucGxheWVyQ3VyWHAgPSAoX2ogPSBvYmplY3QucGxheWVyQ3VyWHApICE9PSBudWxsICYmIF9qICE9PSB2b2lkIDAgPyBfaiA6IDA7XG4gICAgICAgIG1lc3NhZ2UucGxheWVyWHBCb251c0ZsYWdzID0gKF9rID0gb2JqZWN0LnBsYXllclhwQm9udXNGbGFncykgIT09IG51bGwgJiYgX2sgIT09IHZvaWQgMCA/IF9rIDogMDtcbiAgICAgICAgbWVzc2FnZS5yYW5raW5ncyA9XG4gICAgICAgICAgICAoKF9sID0gb2JqZWN0LnJhbmtpbmdzKSA9PT0gbnVsbCB8fCBfbCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2wubWFwKGUgPT4gZXhwb3J0cy5QbGF5ZXJSYW5raW5nSW5mby5mcm9tUGFydGlhbChlKSkpIHx8IFtdO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG59O1xuZnVuY3Rpb24gY3JlYXRlQmFzZUNNc2dHQ0NTdHJpa2UxNVYyQWNjb3VudFByaXZhY3lTZXR0aW5ncygpIHtcbiAgICByZXR1cm4geyBzZXR0aW5nczogW10gfTtcbn1cbmV4cG9ydHMuQ01zZ0dDQ1N0cmlrZTE1VjJBY2NvdW50UHJpdmFjeVNldHRpbmdzID0ge1xuICAgIGVuY29kZShtZXNzYWdlLCB3cml0ZXIgPSBtaW5pbWFsXzEuV3JpdGVyLmNyZWF0ZSgpKSB7XG4gICAgICAgIGZvciAoY29uc3QgdiBvZiBtZXNzYWdlLnNldHRpbmdzKSB7XG4gICAgICAgICAgICBleHBvcnRzLkNNc2dHQ0NTdHJpa2UxNVYyQWNjb3VudFByaXZhY3lTZXR0aW5nc19TZXR0aW5nLmVuY29kZSh2LCB3cml0ZXIudWludDMyKDEwKS5mb3JrKCkpLmxkZWxpbSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfSxcbiAgICBkZWNvZGUoaW5wdXQsIGxlbmd0aCkge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBpbnB1dCBpbnN0YW5jZW9mIG1pbmltYWxfMS5SZWFkZXIgPyBpbnB1dCA6IG5ldyBtaW5pbWFsXzEuUmVhZGVyKGlucHV0KTtcbiAgICAgICAgbGV0IGVuZCA9IGxlbmd0aCA9PT0gdW5kZWZpbmVkID8gcmVhZGVyLmxlbiA6IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ01zZ0dDQ1N0cmlrZTE1VjJBY2NvdW50UHJpdmFjeVNldHRpbmdzKCk7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBjb25zdCB0YWcgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKHRhZyA+Pj4gMykge1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5zZXR0aW5ncy5wdXNoKGV4cG9ydHMuQ01zZ0dDQ1N0cmlrZTE1VjJBY2NvdW50UHJpdmFjeVNldHRpbmdzX1NldHRpbmcuZGVjb2RlKHJlYWRlciwgcmVhZGVyLnVpbnQzMigpKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJlYWRlci5za2lwVHlwZSh0YWcgJiA3KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfSxcbiAgICBmcm9tUGFydGlhbChvYmplY3QpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNNc2dHQ0NTdHJpa2UxNVYyQWNjb3VudFByaXZhY3lTZXR0aW5ncygpO1xuICAgICAgICBtZXNzYWdlLnNldHRpbmdzID1cbiAgICAgICAgICAgICgoX2EgPSBvYmplY3Quc2V0dGluZ3MpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5tYXAoZSA9PiBleHBvcnRzLkNNc2dHQ0NTdHJpa2UxNVYyQWNjb3VudFByaXZhY3lTZXR0aW5nc19TZXR0aW5nLmZyb21QYXJ0aWFsKGUpKSkgfHwgW107XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbn07XG5mdW5jdGlvbiBjcmVhdGVCYXNlQ01zZ0dDQ1N0cmlrZTE1VjJBY2NvdW50UHJpdmFjeVNldHRpbmdzX1NldHRpbmcoKSB7XG4gICAgcmV0dXJuIHsgc2V0dGluZ1R5cGU6IDAsIHNldHRpbmdWYWx1ZTogMCB9O1xufVxuZXhwb3J0cy5DTXNnR0NDU3RyaWtlMTVWMkFjY291bnRQcml2YWN5U2V0dGluZ3NfU2V0dGluZyA9IHtcbiAgICBlbmNvZGUobWVzc2FnZSwgd3JpdGVyID0gbWluaW1hbF8xLldyaXRlci5jcmVhdGUoKSkge1xuICAgICAgICBpZiAobWVzc2FnZS5zZXR0aW5nVHlwZSAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig4KS51aW50MzIobWVzc2FnZS5zZXR0aW5nVHlwZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2Uuc2V0dGluZ1ZhbHVlICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDE2KS51aW50MzIobWVzc2FnZS5zZXR0aW5nVmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfSxcbiAgICBkZWNvZGUoaW5wdXQsIGxlbmd0aCkge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBpbnB1dCBpbnN0YW5jZW9mIG1pbmltYWxfMS5SZWFkZXIgPyBpbnB1dCA6IG5ldyBtaW5pbWFsXzEuUmVhZGVyKGlucHV0KTtcbiAgICAgICAgbGV0IGVuZCA9IGxlbmd0aCA9PT0gdW5kZWZpbmVkID8gcmVhZGVyLmxlbiA6IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ01zZ0dDQ1N0cmlrZTE1VjJBY2NvdW50UHJpdmFjeVNldHRpbmdzX1NldHRpbmcoKTtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhZyA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgIHN3aXRjaCAodGFnID4+PiAzKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnNldHRpbmdUeXBlID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Uuc2V0dGluZ1ZhbHVlID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICByZWFkZXIuc2tpcFR5cGUodGFnICYgNyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH0sXG4gICAgZnJvbVBhcnRpYWwob2JqZWN0KSB7XG4gICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ01zZ0dDQ1N0cmlrZTE1VjJBY2NvdW50UHJpdmFjeVNldHRpbmdzX1NldHRpbmcoKTtcbiAgICAgICAgbWVzc2FnZS5zZXR0aW5nVHlwZSA9IChfYSA9IG9iamVjdC5zZXR0aW5nVHlwZSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMDtcbiAgICAgICAgbWVzc2FnZS5zZXR0aW5nVmFsdWUgPSAoX2IgPSBvYmplY3Quc2V0dGluZ1ZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAwO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG59O1xuZnVuY3Rpb24gY3JlYXRlQmFzZUNNc2dHQ0NTdHJpa2UxNVYyTWF0Y2htYWtpbmdHQzJDbGllbnRBYmFuZG9uKCkge1xuICAgIHJldHVybiB7XG4gICAgICAgIGFjY291bnRJZDogMCxcbiAgICAgICAgYWJhbmRvbmVkTWF0Y2g6IHVuZGVmaW5lZCxcbiAgICAgICAgcGVuYWx0eVNlY29uZHM6IDAsXG4gICAgICAgIHBlbmFsdHlSZWFzb246IDBcbiAgICB9O1xufVxuZXhwb3J0cy5DTXNnR0NDU3RyaWtlMTVWMk1hdGNobWFraW5nR0MyQ2xpZW50QWJhbmRvbiA9IHtcbiAgICBlbmNvZGUobWVzc2FnZSwgd3JpdGVyID0gbWluaW1hbF8xLldyaXRlci5jcmVhdGUoKSkge1xuICAgICAgICBpZiAobWVzc2FnZS5hY2NvdW50SWQgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoOCkudWludDMyKG1lc3NhZ2UuYWNjb3VudElkKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5hYmFuZG9uZWRNYXRjaCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBleHBvcnRzLkNNc2dHQ0NTdHJpa2UxNVYyTWF0Y2htYWtpbmdHQzJDbGllbnRSZXNlcnZlLmVuY29kZShtZXNzYWdlLmFiYW5kb25lZE1hdGNoLCB3cml0ZXIudWludDMyKDE4KS5mb3JrKCkpLmxkZWxpbSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLnBlbmFsdHlTZWNvbmRzICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDI0KS51aW50MzIobWVzc2FnZS5wZW5hbHR5U2Vjb25kcyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UucGVuYWx0eVJlYXNvbiAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigzMikudWludDMyKG1lc3NhZ2UucGVuYWx0eVJlYXNvbik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9LFxuICAgIGRlY29kZShpbnB1dCwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IGlucHV0IGluc3RhbmNlb2YgbWluaW1hbF8xLlJlYWRlciA/IGlucHV0IDogbmV3IG1pbmltYWxfMS5SZWFkZXIoaW5wdXQpO1xuICAgICAgICBsZXQgZW5kID0gbGVuZ3RoID09PSB1bmRlZmluZWQgPyByZWFkZXIubGVuIDogcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDTXNnR0NDU3RyaWtlMTVWMk1hdGNobWFraW5nR0MyQ2xpZW50QWJhbmRvbigpO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuYWNjb3VudElkID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuYWJhbmRvbmVkTWF0Y2ggPVxuICAgICAgICAgICAgICAgICAgICAgICAgZXhwb3J0cy5DTXNnR0NDU3RyaWtlMTVWMk1hdGNobWFraW5nR0MyQ2xpZW50UmVzZXJ2ZS5kZWNvZGUocmVhZGVyLCByZWFkZXIudWludDMyKCkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UucGVuYWx0eVNlY29uZHMgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5wZW5hbHR5UmVhc29uID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICByZWFkZXIuc2tpcFR5cGUodGFnICYgNyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH0sXG4gICAgZnJvbVBhcnRpYWwob2JqZWN0KSB7XG4gICAgICAgIHZhciBfYSwgX2IsIF9jO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNNc2dHQ0NTdHJpa2UxNVYyTWF0Y2htYWtpbmdHQzJDbGllbnRBYmFuZG9uKCk7XG4gICAgICAgIG1lc3NhZ2UuYWNjb3VudElkID0gKF9hID0gb2JqZWN0LmFjY291bnRJZCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMDtcbiAgICAgICAgbWVzc2FnZS5hYmFuZG9uZWRNYXRjaCA9XG4gICAgICAgICAgICBvYmplY3QuYWJhbmRvbmVkTWF0Y2ggIT09IHVuZGVmaW5lZCAmJiBvYmplY3QuYWJhbmRvbmVkTWF0Y2ggIT09IG51bGxcbiAgICAgICAgICAgICAgICA/IGV4cG9ydHMuQ01zZ0dDQ1N0cmlrZTE1VjJNYXRjaG1ha2luZ0dDMkNsaWVudFJlc2VydmUuZnJvbVBhcnRpYWwob2JqZWN0LmFiYW5kb25lZE1hdGNoKVxuICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgICBtZXNzYWdlLnBlbmFsdHlTZWNvbmRzID0gKF9iID0gb2JqZWN0LnBlbmFsdHlTZWNvbmRzKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAwO1xuICAgICAgICBtZXNzYWdlLnBlbmFsdHlSZWFzb24gPSAoX2MgPSBvYmplY3QucGVuYWx0eVJlYXNvbikgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogMDtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxufTtcbmZ1bmN0aW9uIGNyZWF0ZUJhc2VDTXNnR0NDU3RyaWtlMTVWMkNsaWVudEdDUmFua1VwZGF0ZSgpIHtcbiAgICByZXR1cm4geyByYW5raW5nczogW10gfTtcbn1cbmV4cG9ydHMuQ01zZ0dDQ1N0cmlrZTE1VjJDbGllbnRHQ1JhbmtVcGRhdGUgPSB7XG4gICAgZW5jb2RlKG1lc3NhZ2UsIHdyaXRlciA9IG1pbmltYWxfMS5Xcml0ZXIuY3JlYXRlKCkpIHtcbiAgICAgICAgZm9yIChjb25zdCB2IG9mIG1lc3NhZ2UucmFua2luZ3MpIHtcbiAgICAgICAgICAgIGV4cG9ydHMuUGxheWVyUmFua2luZ0luZm8uZW5jb2RlKHYsIHdyaXRlci51aW50MzIoMTApLmZvcmsoKSkubGRlbGltKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9LFxuICAgIGRlY29kZShpbnB1dCwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IGlucHV0IGluc3RhbmNlb2YgbWluaW1hbF8xLlJlYWRlciA/IGlucHV0IDogbmV3IG1pbmltYWxfMS5SZWFkZXIoaW5wdXQpO1xuICAgICAgICBsZXQgZW5kID0gbGVuZ3RoID09PSB1bmRlZmluZWQgPyByZWFkZXIubGVuIDogcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDTXNnR0NDU3RyaWtlMTVWMkNsaWVudEdDUmFua1VwZGF0ZSgpO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UucmFua2luZ3MucHVzaChleHBvcnRzLlBsYXllclJhbmtpbmdJbmZvLmRlY29kZShyZWFkZXIsIHJlYWRlci51aW50MzIoKSkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICByZWFkZXIuc2tpcFR5cGUodGFnICYgNyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH0sXG4gICAgZnJvbVBhcnRpYWwob2JqZWN0KSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDTXNnR0NDU3RyaWtlMTVWMkNsaWVudEdDUmFua1VwZGF0ZSgpO1xuICAgICAgICBtZXNzYWdlLnJhbmtpbmdzID1cbiAgICAgICAgICAgICgoX2EgPSBvYmplY3QucmFua2luZ3MpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5tYXAoZSA9PiBleHBvcnRzLlBsYXllclJhbmtpbmdJbmZvLmZyb21QYXJ0aWFsKGUpKSkgfHwgW107XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbn07XG5mdW5jdGlvbiBjcmVhdGVCYXNlQ01zZ0dDQ1N0cmlrZTE1VjJNYXRjaG1ha2luZ09wZXJhdG9yMkdDQmxvZ1VwZGF0ZSgpIHtcbiAgICByZXR1cm4geyBtYWluUG9zdFVybDogXCJcIiB9O1xufVxuZXhwb3J0cy5DTXNnR0NDU3RyaWtlMTVWMk1hdGNobWFraW5nT3BlcmF0b3IyR0NCbG9nVXBkYXRlID0ge1xuICAgIGVuY29kZShtZXNzYWdlLCB3cml0ZXIgPSBtaW5pbWFsXzEuV3JpdGVyLmNyZWF0ZSgpKSB7XG4gICAgICAgIGlmIChtZXNzYWdlLm1haW5Qb3N0VXJsICE9PSBcIlwiKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDEwKS5zdHJpbmcobWVzc2FnZS5tYWluUG9zdFVybCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9LFxuICAgIGRlY29kZShpbnB1dCwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IGlucHV0IGluc3RhbmNlb2YgbWluaW1hbF8xLlJlYWRlciA/IGlucHV0IDogbmV3IG1pbmltYWxfMS5SZWFkZXIoaW5wdXQpO1xuICAgICAgICBsZXQgZW5kID0gbGVuZ3RoID09PSB1bmRlZmluZWQgPyByZWFkZXIubGVuIDogcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDTXNnR0NDU3RyaWtlMTVWMk1hdGNobWFraW5nT3BlcmF0b3IyR0NCbG9nVXBkYXRlKCk7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBjb25zdCB0YWcgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKHRhZyA+Pj4gMykge1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5tYWluUG9zdFVybCA9IHJlYWRlci5zdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmVhZGVyLnNraXBUeXBlKHRhZyAmIDcpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9LFxuICAgIGZyb21QYXJ0aWFsKG9iamVjdCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ01zZ0dDQ1N0cmlrZTE1VjJNYXRjaG1ha2luZ09wZXJhdG9yMkdDQmxvZ1VwZGF0ZSgpO1xuICAgICAgICBtZXNzYWdlLm1haW5Qb3N0VXJsID0gKF9hID0gb2JqZWN0Lm1haW5Qb3N0VXJsKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBcIlwiO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG59O1xuZnVuY3Rpb24gY3JlYXRlQmFzZUNNc2dHQ0NTdHJpa2UxNVYyU2VydmVyTm90aWZpY2F0aW9uRm9yVXNlclBlbmFsdHkoKSB7XG4gICAgcmV0dXJuIHsgYWNjb3VudElkOiAwLCByZWFzb246IDAsIHNlY29uZHM6IDAsIGNvbW11bmljYXRpb25Db29sZG93bjogZmFsc2UgfTtcbn1cbmV4cG9ydHMuQ01zZ0dDQ1N0cmlrZTE1VjJTZXJ2ZXJOb3RpZmljYXRpb25Gb3JVc2VyUGVuYWx0eSA9IHtcbiAgICBlbmNvZGUobWVzc2FnZSwgd3JpdGVyID0gbWluaW1hbF8xLldyaXRlci5jcmVhdGUoKSkge1xuICAgICAgICBpZiAobWVzc2FnZS5hY2NvdW50SWQgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoOCkudWludDMyKG1lc3NhZ2UuYWNjb3VudElkKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5yZWFzb24gIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMTYpLnVpbnQzMihtZXNzYWdlLnJlYXNvbik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2Uuc2Vjb25kcyAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigyNCkudWludDMyKG1lc3NhZ2Uuc2Vjb25kcyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UuY29tbXVuaWNhdGlvbkNvb2xkb3duID09PSB0cnVlKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDMyKS5ib29sKG1lc3NhZ2UuY29tbXVuaWNhdGlvbkNvb2xkb3duKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH0sXG4gICAgZGVjb2RlKGlucHV0LCBsZW5ndGgpIHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gaW5wdXQgaW5zdGFuY2VvZiBtaW5pbWFsXzEuUmVhZGVyID8gaW5wdXQgOiBuZXcgbWluaW1hbF8xLlJlYWRlcihpbnB1dCk7XG4gICAgICAgIGxldCBlbmQgPSBsZW5ndGggPT09IHVuZGVmaW5lZCA/IHJlYWRlci5sZW4gOiByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNNc2dHQ0NTdHJpa2UxNVYyU2VydmVyTm90aWZpY2F0aW9uRm9yVXNlclBlbmFsdHkoKTtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhZyA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgIHN3aXRjaCAodGFnID4+PiAzKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmFjY291bnRJZCA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnJlYXNvbiA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnNlY29uZHMgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5jb21tdW5pY2F0aW9uQ29vbGRvd24gPSByZWFkZXIuYm9vbCgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICByZWFkZXIuc2tpcFR5cGUodGFnICYgNyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH0sXG4gICAgZnJvbVBhcnRpYWwob2JqZWN0KSB7XG4gICAgICAgIHZhciBfYSwgX2IsIF9jLCBfZDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDTXNnR0NDU3RyaWtlMTVWMlNlcnZlck5vdGlmaWNhdGlvbkZvclVzZXJQZW5hbHR5KCk7XG4gICAgICAgIG1lc3NhZ2UuYWNjb3VudElkID0gKF9hID0gb2JqZWN0LmFjY291bnRJZCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMDtcbiAgICAgICAgbWVzc2FnZS5yZWFzb24gPSAoX2IgPSBvYmplY3QucmVhc29uKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAwO1xuICAgICAgICBtZXNzYWdlLnNlY29uZHMgPSAoX2MgPSBvYmplY3Quc2Vjb25kcykgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogMDtcbiAgICAgICAgbWVzc2FnZS5jb21tdW5pY2F0aW9uQ29vbGRvd24gPSAoX2QgPSBvYmplY3QuY29tbXVuaWNhdGlvbkNvb2xkb3duKSAhPT0gbnVsbCAmJiBfZCAhPT0gdm9pZCAwID8gX2QgOiBmYWxzZTtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxufTtcbmZ1bmN0aW9uIGNyZWF0ZUJhc2VDTXNnR0NDU3RyaWtlMTVWMkNsaWVudFJlcG9ydFBsYXllcigpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBhY2NvdW50SWQ6IDAsXG4gICAgICAgIHJwdEFpbWJvdDogMCxcbiAgICAgICAgcnB0V2FsbGhhY2s6IDAsXG4gICAgICAgIHJwdFNwZWVkaGFjazogMCxcbiAgICAgICAgcnB0VGVhbWhhcm06IDAsXG4gICAgICAgIHJwdFRleHRhYnVzZTogMCxcbiAgICAgICAgcnB0Vm9pY2VhYnVzZTogMCxcbiAgICAgICAgbWF0Y2hJZDogTG9uZy5VWkVSTyxcbiAgICAgICAgcmVwb3J0RnJvbURlbW86IGZhbHNlXG4gICAgfTtcbn1cbmV4cG9ydHMuQ01zZ0dDQ1N0cmlrZTE1VjJDbGllbnRSZXBvcnRQbGF5ZXIgPSB7XG4gICAgZW5jb2RlKG1lc3NhZ2UsIHdyaXRlciA9IG1pbmltYWxfMS5Xcml0ZXIuY3JlYXRlKCkpIHtcbiAgICAgICAgaWYgKG1lc3NhZ2UuYWNjb3VudElkICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDgpLnVpbnQzMihtZXNzYWdlLmFjY291bnRJZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UucnB0QWltYm90ICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDE2KS51aW50MzIobWVzc2FnZS5ycHRBaW1ib3QpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLnJwdFdhbGxoYWNrICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDI0KS51aW50MzIobWVzc2FnZS5ycHRXYWxsaGFjayk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UucnB0U3BlZWRoYWNrICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDMyKS51aW50MzIobWVzc2FnZS5ycHRTcGVlZGhhY2spO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLnJwdFRlYW1oYXJtICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDQwKS51aW50MzIobWVzc2FnZS5ycHRUZWFtaGFybSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UucnB0VGV4dGFidXNlICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDQ4KS51aW50MzIobWVzc2FnZS5ycHRUZXh0YWJ1c2UpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLnJwdFZvaWNlYWJ1c2UgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoNTYpLnVpbnQzMihtZXNzYWdlLnJwdFZvaWNlYWJ1c2UpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghbWVzc2FnZS5tYXRjaElkLmlzWmVybygpKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDY0KS51aW50NjQobWVzc2FnZS5tYXRjaElkKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5yZXBvcnRGcm9tRGVtbyA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig3MikuYm9vbChtZXNzYWdlLnJlcG9ydEZyb21EZW1vKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH0sXG4gICAgZGVjb2RlKGlucHV0LCBsZW5ndGgpIHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gaW5wdXQgaW5zdGFuY2VvZiBtaW5pbWFsXzEuUmVhZGVyID8gaW5wdXQgOiBuZXcgbWluaW1hbF8xLlJlYWRlcihpbnB1dCk7XG4gICAgICAgIGxldCBlbmQgPSBsZW5ndGggPT09IHVuZGVmaW5lZCA/IHJlYWRlci5sZW4gOiByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNNc2dHQ0NTdHJpa2UxNVYyQ2xpZW50UmVwb3J0UGxheWVyKCk7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBjb25zdCB0YWcgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKHRhZyA+Pj4gMykge1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5hY2NvdW50SWQgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5ycHRBaW1ib3QgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5ycHRXYWxsaGFjayA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnJwdFNwZWVkaGFjayA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnJwdFRlYW1oYXJtID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UucnB0VGV4dGFidXNlID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UucnB0Vm9pY2VhYnVzZSA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA4OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLm1hdGNoSWQgPSByZWFkZXIudWludDY0KCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgOTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5yZXBvcnRGcm9tRGVtbyA9IHJlYWRlci5ib29sKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJlYWRlci5za2lwVHlwZSh0YWcgJiA3KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfSxcbiAgICBmcm9tUGFydGlhbChvYmplY3QpIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2MsIF9kLCBfZSwgX2YsIF9nLCBfaDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDTXNnR0NDU3RyaWtlMTVWMkNsaWVudFJlcG9ydFBsYXllcigpO1xuICAgICAgICBtZXNzYWdlLmFjY291bnRJZCA9IChfYSA9IG9iamVjdC5hY2NvdW50SWQpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IDA7XG4gICAgICAgIG1lc3NhZ2UucnB0QWltYm90ID0gKF9iID0gb2JqZWN0LnJwdEFpbWJvdCkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogMDtcbiAgICAgICAgbWVzc2FnZS5ycHRXYWxsaGFjayA9IChfYyA9IG9iamVjdC5ycHRXYWxsaGFjaykgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogMDtcbiAgICAgICAgbWVzc2FnZS5ycHRTcGVlZGhhY2sgPSAoX2QgPSBvYmplY3QucnB0U3BlZWRoYWNrKSAhPT0gbnVsbCAmJiBfZCAhPT0gdm9pZCAwID8gX2QgOiAwO1xuICAgICAgICBtZXNzYWdlLnJwdFRlYW1oYXJtID0gKF9lID0gb2JqZWN0LnJwdFRlYW1oYXJtKSAhPT0gbnVsbCAmJiBfZSAhPT0gdm9pZCAwID8gX2UgOiAwO1xuICAgICAgICBtZXNzYWdlLnJwdFRleHRhYnVzZSA9IChfZiA9IG9iamVjdC5ycHRUZXh0YWJ1c2UpICE9PSBudWxsICYmIF9mICE9PSB2b2lkIDAgPyBfZiA6IDA7XG4gICAgICAgIG1lc3NhZ2UucnB0Vm9pY2VhYnVzZSA9IChfZyA9IG9iamVjdC5ycHRWb2ljZWFidXNlKSAhPT0gbnVsbCAmJiBfZyAhPT0gdm9pZCAwID8gX2cgOiAwO1xuICAgICAgICBtZXNzYWdlLm1hdGNoSWQgPVxuICAgICAgICAgICAgb2JqZWN0Lm1hdGNoSWQgIT09IHVuZGVmaW5lZCAmJiBvYmplY3QubWF0Y2hJZCAhPT0gbnVsbFxuICAgICAgICAgICAgICAgID8gTG9uZy5mcm9tVmFsdWUob2JqZWN0Lm1hdGNoSWQpXG4gICAgICAgICAgICAgICAgOiBMb25nLlVaRVJPO1xuICAgICAgICBtZXNzYWdlLnJlcG9ydEZyb21EZW1vID0gKF9oID0gb2JqZWN0LnJlcG9ydEZyb21EZW1vKSAhPT0gbnVsbCAmJiBfaCAhPT0gdm9pZCAwID8gX2ggOiBmYWxzZTtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxufTtcbmZ1bmN0aW9uIGNyZWF0ZUJhc2VDTXNnR0NDU3RyaWtlMTVWMkNsaWVudENvbW1lbmRQbGF5ZXIoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgYWNjb3VudElkOiAwLFxuICAgICAgICBtYXRjaElkOiBMb25nLlVaRVJPLFxuICAgICAgICBjb21tZW5kYXRpb246IHVuZGVmaW5lZCxcbiAgICAgICAgdG9rZW5zOiAwXG4gICAgfTtcbn1cbmV4cG9ydHMuQ01zZ0dDQ1N0cmlrZTE1VjJDbGllbnRDb21tZW5kUGxheWVyID0ge1xuICAgIGVuY29kZShtZXNzYWdlLCB3cml0ZXIgPSBtaW5pbWFsXzEuV3JpdGVyLmNyZWF0ZSgpKSB7XG4gICAgICAgIGlmIChtZXNzYWdlLmFjY291bnRJZCAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig4KS51aW50MzIobWVzc2FnZS5hY2NvdW50SWQpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghbWVzc2FnZS5tYXRjaElkLmlzWmVybygpKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDY0KS51aW50NjQobWVzc2FnZS5tYXRjaElkKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5jb21tZW5kYXRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgZXhwb3J0cy5QbGF5ZXJDb21tZW5kYXRpb25JbmZvLmVuY29kZShtZXNzYWdlLmNvbW1lbmRhdGlvbiwgd3JpdGVyLnVpbnQzMig3NCkuZm9yaygpKS5sZGVsaW0oKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS50b2tlbnMgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoODApLnVpbnQzMihtZXNzYWdlLnRva2Vucyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9LFxuICAgIGRlY29kZShpbnB1dCwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IGlucHV0IGluc3RhbmNlb2YgbWluaW1hbF8xLlJlYWRlciA/IGlucHV0IDogbmV3IG1pbmltYWxfMS5SZWFkZXIoaW5wdXQpO1xuICAgICAgICBsZXQgZW5kID0gbGVuZ3RoID09PSB1bmRlZmluZWQgPyByZWFkZXIubGVuIDogcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDTXNnR0NDU3RyaWtlMTVWMkNsaWVudENvbW1lbmRQbGF5ZXIoKTtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhZyA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgIHN3aXRjaCAodGFnID4+PiAzKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmFjY291bnRJZCA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA4OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLm1hdGNoSWQgPSByZWFkZXIudWludDY0KCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgOTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5jb21tZW5kYXRpb24gPSBleHBvcnRzLlBsYXllckNvbW1lbmRhdGlvbkluZm8uZGVjb2RlKHJlYWRlciwgcmVhZGVyLnVpbnQzMigpKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAxMDpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS50b2tlbnMgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJlYWRlci5za2lwVHlwZSh0YWcgJiA3KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfSxcbiAgICBmcm9tUGFydGlhbChvYmplY3QpIHtcbiAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDTXNnR0NDU3RyaWtlMTVWMkNsaWVudENvbW1lbmRQbGF5ZXIoKTtcbiAgICAgICAgbWVzc2FnZS5hY2NvdW50SWQgPSAoX2EgPSBvYmplY3QuYWNjb3VudElkKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAwO1xuICAgICAgICBtZXNzYWdlLm1hdGNoSWQgPVxuICAgICAgICAgICAgb2JqZWN0Lm1hdGNoSWQgIT09IHVuZGVmaW5lZCAmJiBvYmplY3QubWF0Y2hJZCAhPT0gbnVsbFxuICAgICAgICAgICAgICAgID8gTG9uZy5mcm9tVmFsdWUob2JqZWN0Lm1hdGNoSWQpXG4gICAgICAgICAgICAgICAgOiBMb25nLlVaRVJPO1xuICAgICAgICBtZXNzYWdlLmNvbW1lbmRhdGlvbiA9XG4gICAgICAgICAgICBvYmplY3QuY29tbWVuZGF0aW9uICE9PSB1bmRlZmluZWQgJiYgb2JqZWN0LmNvbW1lbmRhdGlvbiAhPT0gbnVsbFxuICAgICAgICAgICAgICAgID8gZXhwb3J0cy5QbGF5ZXJDb21tZW5kYXRpb25JbmZvLmZyb21QYXJ0aWFsKG9iamVjdC5jb21tZW5kYXRpb24pXG4gICAgICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICAgIG1lc3NhZ2UudG9rZW5zID0gKF9iID0gb2JqZWN0LnRva2VucykgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogMDtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxufTtcbmZ1bmN0aW9uIGNyZWF0ZUJhc2VDTXNnR0NDU3RyaWtlMTVWMkNsaWVudFJlcG9ydFNlcnZlcigpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBycHRQb29ycGVyZjogMCxcbiAgICAgICAgcnB0QWJ1c2l2ZW1vZGVsczogMCxcbiAgICAgICAgcnB0QmFkbW90ZDogMCxcbiAgICAgICAgcnB0TGlzdGluZ2FidXNlOiAwLFxuICAgICAgICBycHRJbnZlbnRvcnlhYnVzZTogMCxcbiAgICAgICAgbWF0Y2hJZDogTG9uZy5VWkVST1xuICAgIH07XG59XG5leHBvcnRzLkNNc2dHQ0NTdHJpa2UxNVYyQ2xpZW50UmVwb3J0U2VydmVyID0ge1xuICAgIGVuY29kZShtZXNzYWdlLCB3cml0ZXIgPSBtaW5pbWFsXzEuV3JpdGVyLmNyZWF0ZSgpKSB7XG4gICAgICAgIGlmIChtZXNzYWdlLnJwdFBvb3JwZXJmICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDgpLnVpbnQzMihtZXNzYWdlLnJwdFBvb3JwZXJmKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5ycHRBYnVzaXZlbW9kZWxzICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDE2KS51aW50MzIobWVzc2FnZS5ycHRBYnVzaXZlbW9kZWxzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5ycHRCYWRtb3RkICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDI0KS51aW50MzIobWVzc2FnZS5ycHRCYWRtb3RkKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5ycHRMaXN0aW5nYWJ1c2UgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMzIpLnVpbnQzMihtZXNzYWdlLnJwdExpc3RpbmdhYnVzZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UucnB0SW52ZW50b3J5YWJ1c2UgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoNDApLnVpbnQzMihtZXNzYWdlLnJwdEludmVudG9yeWFidXNlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIW1lc3NhZ2UubWF0Y2hJZC5pc1plcm8oKSkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig2NCkudWludDY0KG1lc3NhZ2UubWF0Y2hJZCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9LFxuICAgIGRlY29kZShpbnB1dCwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IGlucHV0IGluc3RhbmNlb2YgbWluaW1hbF8xLlJlYWRlciA/IGlucHV0IDogbmV3IG1pbmltYWxfMS5SZWFkZXIoaW5wdXQpO1xuICAgICAgICBsZXQgZW5kID0gbGVuZ3RoID09PSB1bmRlZmluZWQgPyByZWFkZXIubGVuIDogcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDTXNnR0NDU3RyaWtlMTVWMkNsaWVudFJlcG9ydFNlcnZlcigpO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UucnB0UG9vcnBlcmYgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5ycHRBYnVzaXZlbW9kZWxzID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UucnB0QmFkbW90ZCA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnJwdExpc3RpbmdhYnVzZSA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnJwdEludmVudG9yeWFidXNlID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDg6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UubWF0Y2hJZCA9IHJlYWRlci51aW50NjQoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmVhZGVyLnNraXBUeXBlKHRhZyAmIDcpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9LFxuICAgIGZyb21QYXJ0aWFsKG9iamVjdCkge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYywgX2QsIF9lO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNNc2dHQ0NTdHJpa2UxNVYyQ2xpZW50UmVwb3J0U2VydmVyKCk7XG4gICAgICAgIG1lc3NhZ2UucnB0UG9vcnBlcmYgPSAoX2EgPSBvYmplY3QucnB0UG9vcnBlcmYpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IDA7XG4gICAgICAgIG1lc3NhZ2UucnB0QWJ1c2l2ZW1vZGVscyA9IChfYiA9IG9iamVjdC5ycHRBYnVzaXZlbW9kZWxzKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAwO1xuICAgICAgICBtZXNzYWdlLnJwdEJhZG1vdGQgPSAoX2MgPSBvYmplY3QucnB0QmFkbW90ZCkgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogMDtcbiAgICAgICAgbWVzc2FnZS5ycHRMaXN0aW5nYWJ1c2UgPSAoX2QgPSBvYmplY3QucnB0TGlzdGluZ2FidXNlKSAhPT0gbnVsbCAmJiBfZCAhPT0gdm9pZCAwID8gX2QgOiAwO1xuICAgICAgICBtZXNzYWdlLnJwdEludmVudG9yeWFidXNlID0gKF9lID0gb2JqZWN0LnJwdEludmVudG9yeWFidXNlKSAhPT0gbnVsbCAmJiBfZSAhPT0gdm9pZCAwID8gX2UgOiAwO1xuICAgICAgICBtZXNzYWdlLm1hdGNoSWQgPVxuICAgICAgICAgICAgb2JqZWN0Lm1hdGNoSWQgIT09IHVuZGVmaW5lZCAmJiBvYmplY3QubWF0Y2hJZCAhPT0gbnVsbFxuICAgICAgICAgICAgICAgID8gTG9uZy5mcm9tVmFsdWUob2JqZWN0Lm1hdGNoSWQpXG4gICAgICAgICAgICAgICAgOiBMb25nLlVaRVJPO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG59O1xuZnVuY3Rpb24gY3JlYXRlQmFzZUNNc2dHQ0NTdHJpa2UxNVYyQ2xpZW50UmVwb3J0UmVzcG9uc2UoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgY29uZmlybWF0aW9uSWQ6IExvbmcuVVpFUk8sXG4gICAgICAgIGFjY291bnRJZDogMCxcbiAgICAgICAgc2VydmVySXA6IDAsXG4gICAgICAgIHJlc3BvbnNlVHlwZTogMCxcbiAgICAgICAgcmVzcG9uc2VSZXN1bHQ6IDAsXG4gICAgICAgIHRva2VuczogMFxuICAgIH07XG59XG5leHBvcnRzLkNNc2dHQ0NTdHJpa2UxNVYyQ2xpZW50UmVwb3J0UmVzcG9uc2UgPSB7XG4gICAgZW5jb2RlKG1lc3NhZ2UsIHdyaXRlciA9IG1pbmltYWxfMS5Xcml0ZXIuY3JlYXRlKCkpIHtcbiAgICAgICAgaWYgKCFtZXNzYWdlLmNvbmZpcm1hdGlvbklkLmlzWmVybygpKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDgpLnVpbnQ2NChtZXNzYWdlLmNvbmZpcm1hdGlvbklkKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5hY2NvdW50SWQgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMTYpLnVpbnQzMihtZXNzYWdlLmFjY291bnRJZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2Uuc2VydmVySXAgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMjQpLnVpbnQzMihtZXNzYWdlLnNlcnZlcklwKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5yZXNwb25zZVR5cGUgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMzIpLnVpbnQzMihtZXNzYWdlLnJlc3BvbnNlVHlwZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UucmVzcG9uc2VSZXN1bHQgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoNDApLnVpbnQzMihtZXNzYWdlLnJlc3BvbnNlUmVzdWx0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS50b2tlbnMgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoNDgpLnVpbnQzMihtZXNzYWdlLnRva2Vucyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9LFxuICAgIGRlY29kZShpbnB1dCwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IGlucHV0IGluc3RhbmNlb2YgbWluaW1hbF8xLlJlYWRlciA/IGlucHV0IDogbmV3IG1pbmltYWxfMS5SZWFkZXIoaW5wdXQpO1xuICAgICAgICBsZXQgZW5kID0gbGVuZ3RoID09PSB1bmRlZmluZWQgPyByZWFkZXIubGVuIDogcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDTXNnR0NDU3RyaWtlMTVWMkNsaWVudFJlcG9ydFJlc3BvbnNlKCk7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBjb25zdCB0YWcgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKHRhZyA+Pj4gMykge1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5jb25maXJtYXRpb25JZCA9IHJlYWRlci51aW50NjQoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmFjY291bnRJZCA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnNlcnZlcklwID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UucmVzcG9uc2VUeXBlID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UucmVzcG9uc2VSZXN1bHQgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS50b2tlbnMgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJlYWRlci5za2lwVHlwZSh0YWcgJiA3KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfSxcbiAgICBmcm9tUGFydGlhbChvYmplY3QpIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2MsIF9kLCBfZTtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDTXNnR0NDU3RyaWtlMTVWMkNsaWVudFJlcG9ydFJlc3BvbnNlKCk7XG4gICAgICAgIG1lc3NhZ2UuY29uZmlybWF0aW9uSWQgPVxuICAgICAgICAgICAgb2JqZWN0LmNvbmZpcm1hdGlvbklkICE9PSB1bmRlZmluZWQgJiYgb2JqZWN0LmNvbmZpcm1hdGlvbklkICE9PSBudWxsXG4gICAgICAgICAgICAgICAgPyBMb25nLmZyb21WYWx1ZShvYmplY3QuY29uZmlybWF0aW9uSWQpXG4gICAgICAgICAgICAgICAgOiBMb25nLlVaRVJPO1xuICAgICAgICBtZXNzYWdlLmFjY291bnRJZCA9IChfYSA9IG9iamVjdC5hY2NvdW50SWQpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IDA7XG4gICAgICAgIG1lc3NhZ2Uuc2VydmVySXAgPSAoX2IgPSBvYmplY3Quc2VydmVySXApICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IDA7XG4gICAgICAgIG1lc3NhZ2UucmVzcG9uc2VUeXBlID0gKF9jID0gb2JqZWN0LnJlc3BvbnNlVHlwZSkgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogMDtcbiAgICAgICAgbWVzc2FnZS5yZXNwb25zZVJlc3VsdCA9IChfZCA9IG9iamVjdC5yZXNwb25zZVJlc3VsdCkgIT09IG51bGwgJiYgX2QgIT09IHZvaWQgMCA/IF9kIDogMDtcbiAgICAgICAgbWVzc2FnZS50b2tlbnMgPSAoX2UgPSBvYmplY3QudG9rZW5zKSAhPT0gbnVsbCAmJiBfZSAhPT0gdm9pZCAwID8gX2UgOiAwO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG59O1xuZnVuY3Rpb24gY3JlYXRlQmFzZUNNc2dHQ0NTdHJpa2UxNVYyQ2xpZW50UmVxdWVzdFdhdGNoSW5mb0ZyaWVuZHMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgcmVxdWVzdElkOiAwLFxuICAgICAgICBhY2NvdW50SWRzOiBbXSxcbiAgICAgICAgc2VydmVyaWQ6IExvbmcuVVpFUk8sXG4gICAgICAgIG1hdGNoaWQ6IExvbmcuVVpFUk8sXG4gICAgICAgIGNsaWVudExhdW5jaGVyOiAwLFxuICAgICAgICBkYXRhQ2VudGVyUGluZ3M6IFtdXG4gICAgfTtcbn1cbmV4cG9ydHMuQ01zZ0dDQ1N0cmlrZTE1VjJDbGllbnRSZXF1ZXN0V2F0Y2hJbmZvRnJpZW5kcyA9IHtcbiAgICBlbmNvZGUobWVzc2FnZSwgd3JpdGVyID0gbWluaW1hbF8xLldyaXRlci5jcmVhdGUoKSkge1xuICAgICAgICBpZiAobWVzc2FnZS5yZXF1ZXN0SWQgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoOCkudWludDMyKG1lc3NhZ2UucmVxdWVzdElkKTtcbiAgICAgICAgfVxuICAgICAgICB3cml0ZXIudWludDMyKDE4KS5mb3JrKCk7XG4gICAgICAgIGZvciAoY29uc3QgdiBvZiBtZXNzYWdlLmFjY291bnRJZHMpIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIodik7XG4gICAgICAgIH1cbiAgICAgICAgd3JpdGVyLmxkZWxpbSgpO1xuICAgICAgICBpZiAoIW1lc3NhZ2Uuc2VydmVyaWQuaXNaZXJvKCkpIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMjQpLnVpbnQ2NChtZXNzYWdlLnNlcnZlcmlkKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIW1lc3NhZ2UubWF0Y2hpZC5pc1plcm8oKSkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigzMikudWludDY0KG1lc3NhZ2UubWF0Y2hpZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UuY2xpZW50TGF1bmNoZXIgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoNDApLnVpbnQzMihtZXNzYWdlLmNsaWVudExhdW5jaGVyKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IHYgb2YgbWVzc2FnZS5kYXRhQ2VudGVyUGluZ3MpIHtcbiAgICAgICAgICAgIGV4cG9ydHMuRGF0YUNlbnRlclBpbmcuZW5jb2RlKHYsIHdyaXRlci51aW50MzIoNTApLmZvcmsoKSkubGRlbGltKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9LFxuICAgIGRlY29kZShpbnB1dCwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IGlucHV0IGluc3RhbmNlb2YgbWluaW1hbF8xLlJlYWRlciA/IGlucHV0IDogbmV3IG1pbmltYWxfMS5SZWFkZXIoaW5wdXQpO1xuICAgICAgICBsZXQgZW5kID0gbGVuZ3RoID09PSB1bmRlZmluZWQgPyByZWFkZXIubGVuIDogcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDTXNnR0NDU3RyaWtlMTVWMkNsaWVudFJlcXVlc3RXYXRjaEluZm9GcmllbmRzKCk7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBjb25zdCB0YWcgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKHRhZyA+Pj4gMykge1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5yZXF1ZXN0SWQgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgaWYgKCh0YWcgJiA3KSA9PT0gMikge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZW5kMiA9IHJlYWRlci51aW50MzIoKSArIHJlYWRlci5wb3M7XG4gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZDIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmFjY291bnRJZHMucHVzaChyZWFkZXIudWludDMyKCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5hY2NvdW50SWRzLnB1c2gocmVhZGVyLnVpbnQzMigpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Uuc2VydmVyaWQgPSByZWFkZXIudWludDY0KCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5tYXRjaGlkID0gcmVhZGVyLnVpbnQ2NCgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuY2xpZW50TGF1bmNoZXIgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5kYXRhQ2VudGVyUGluZ3MucHVzaChleHBvcnRzLkRhdGFDZW50ZXJQaW5nLmRlY29kZShyZWFkZXIsIHJlYWRlci51aW50MzIoKSkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICByZWFkZXIuc2tpcFR5cGUodGFnICYgNyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH0sXG4gICAgZnJvbVBhcnRpYWwob2JqZWN0KSB7XG4gICAgICAgIHZhciBfYSwgX2IsIF9jLCBfZDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDTXNnR0NDU3RyaWtlMTVWMkNsaWVudFJlcXVlc3RXYXRjaEluZm9GcmllbmRzKCk7XG4gICAgICAgIG1lc3NhZ2UucmVxdWVzdElkID0gKF9hID0gb2JqZWN0LnJlcXVlc3RJZCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMDtcbiAgICAgICAgbWVzc2FnZS5hY2NvdW50SWRzID0gKChfYiA9IG9iamVjdC5hY2NvdW50SWRzKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IubWFwKGUgPT4gZSkpIHx8IFtdO1xuICAgICAgICBtZXNzYWdlLnNlcnZlcmlkID1cbiAgICAgICAgICAgIG9iamVjdC5zZXJ2ZXJpZCAhPT0gdW5kZWZpbmVkICYmIG9iamVjdC5zZXJ2ZXJpZCAhPT0gbnVsbFxuICAgICAgICAgICAgICAgID8gTG9uZy5mcm9tVmFsdWUob2JqZWN0LnNlcnZlcmlkKVxuICAgICAgICAgICAgICAgIDogTG9uZy5VWkVSTztcbiAgICAgICAgbWVzc2FnZS5tYXRjaGlkID1cbiAgICAgICAgICAgIG9iamVjdC5tYXRjaGlkICE9PSB1bmRlZmluZWQgJiYgb2JqZWN0Lm1hdGNoaWQgIT09IG51bGxcbiAgICAgICAgICAgICAgICA/IExvbmcuZnJvbVZhbHVlKG9iamVjdC5tYXRjaGlkKVxuICAgICAgICAgICAgICAgIDogTG9uZy5VWkVSTztcbiAgICAgICAgbWVzc2FnZS5jbGllbnRMYXVuY2hlciA9IChfYyA9IG9iamVjdC5jbGllbnRMYXVuY2hlcikgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogMDtcbiAgICAgICAgbWVzc2FnZS5kYXRhQ2VudGVyUGluZ3MgPVxuICAgICAgICAgICAgKChfZCA9IG9iamVjdC5kYXRhQ2VudGVyUGluZ3MpID09PSBudWxsIHx8IF9kID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZC5tYXAoZSA9PiBleHBvcnRzLkRhdGFDZW50ZXJQaW5nLmZyb21QYXJ0aWFsKGUpKSkgfHwgW107XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbn07XG5mdW5jdGlvbiBjcmVhdGVCYXNlV2F0Y2hhYmxlTWF0Y2hJbmZvKCkge1xuICAgIHJldHVybiB7XG4gICAgICAgIHNlcnZlcklwOiAwLFxuICAgICAgICB0dlBvcnQ6IDAsXG4gICAgICAgIHR2U3BlY3RhdG9yczogMCxcbiAgICAgICAgdHZUaW1lOiAwLFxuICAgICAgICB0dldhdGNoUGFzc3dvcmQ6IG5ldyBVaW50OEFycmF5KCksXG4gICAgICAgIGNsRGVjcnlwdGRhdGFLZXk6IExvbmcuVVpFUk8sXG4gICAgICAgIGNsRGVjcnlwdGRhdGFLZXlQdWI6IExvbmcuVVpFUk8sXG4gICAgICAgIGdhbWVUeXBlOiAwLFxuICAgICAgICBnYW1lTWFwZ3JvdXA6IFwiXCIsXG4gICAgICAgIGdhbWVNYXA6IFwiXCIsXG4gICAgICAgIHNlcnZlcklkOiBMb25nLlVaRVJPLFxuICAgICAgICBtYXRjaElkOiBMb25nLlVaRVJPLFxuICAgICAgICByZXNlcnZhdGlvbklkOiBMb25nLlVaRVJPXG4gICAgfTtcbn1cbmV4cG9ydHMuV2F0Y2hhYmxlTWF0Y2hJbmZvID0ge1xuICAgIGVuY29kZShtZXNzYWdlLCB3cml0ZXIgPSBtaW5pbWFsXzEuV3JpdGVyLmNyZWF0ZSgpKSB7XG4gICAgICAgIGlmIChtZXNzYWdlLnNlcnZlcklwICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDgpLnVpbnQzMihtZXNzYWdlLnNlcnZlcklwKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS50dlBvcnQgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMTYpLnVpbnQzMihtZXNzYWdlLnR2UG9ydCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UudHZTcGVjdGF0b3JzICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDI0KS51aW50MzIobWVzc2FnZS50dlNwZWN0YXRvcnMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLnR2VGltZSAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigzMikudWludDMyKG1lc3NhZ2UudHZUaW1lKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS50dldhdGNoUGFzc3dvcmQubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDQyKS5ieXRlcyhtZXNzYWdlLnR2V2F0Y2hQYXNzd29yZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFtZXNzYWdlLmNsRGVjcnlwdGRhdGFLZXkuaXNaZXJvKCkpIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoNDgpLnVpbnQ2NChtZXNzYWdlLmNsRGVjcnlwdGRhdGFLZXkpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghbWVzc2FnZS5jbERlY3J5cHRkYXRhS2V5UHViLmlzWmVybygpKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDU2KS51aW50NjQobWVzc2FnZS5jbERlY3J5cHRkYXRhS2V5UHViKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5nYW1lVHlwZSAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig2NCkudWludDMyKG1lc3NhZ2UuZ2FtZVR5cGUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLmdhbWVNYXBncm91cCAhPT0gXCJcIikge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig3NCkuc3RyaW5nKG1lc3NhZ2UuZ2FtZU1hcGdyb3VwKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5nYW1lTWFwICE9PSBcIlwiKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDgyKS5zdHJpbmcobWVzc2FnZS5nYW1lTWFwKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIW1lc3NhZ2Uuc2VydmVySWQuaXNaZXJvKCkpIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoODgpLnVpbnQ2NChtZXNzYWdlLnNlcnZlcklkKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIW1lc3NhZ2UubWF0Y2hJZC5pc1plcm8oKSkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig5NikudWludDY0KG1lc3NhZ2UubWF0Y2hJZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFtZXNzYWdlLnJlc2VydmF0aW9uSWQuaXNaZXJvKCkpIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMTA0KS51aW50NjQobWVzc2FnZS5yZXNlcnZhdGlvbklkKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH0sXG4gICAgZGVjb2RlKGlucHV0LCBsZW5ndGgpIHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gaW5wdXQgaW5zdGFuY2VvZiBtaW5pbWFsXzEuUmVhZGVyID8gaW5wdXQgOiBuZXcgbWluaW1hbF8xLlJlYWRlcihpbnB1dCk7XG4gICAgICAgIGxldCBlbmQgPSBsZW5ndGggPT09IHVuZGVmaW5lZCA/IHJlYWRlci5sZW4gOiByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZVdhdGNoYWJsZU1hdGNoSW5mbygpO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Uuc2VydmVySXAgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS50dlBvcnQgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS50dlNwZWN0YXRvcnMgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS50dlRpbWUgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS50dldhdGNoUGFzc3dvcmQgPSByZWFkZXIuYnl0ZXMoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmNsRGVjcnlwdGRhdGFLZXkgPSByZWFkZXIudWludDY0KCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNzpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5jbERlY3J5cHRkYXRhS2V5UHViID0gcmVhZGVyLnVpbnQ2NCgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDg6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZ2FtZVR5cGUgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgOTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5nYW1lTWFwZ3JvdXAgPSByZWFkZXIuc3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMTA6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZ2FtZU1hcCA9IHJlYWRlci5zdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAxMTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5zZXJ2ZXJJZCA9IHJlYWRlci51aW50NjQoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAxMjpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5tYXRjaElkID0gcmVhZGVyLnVpbnQ2NCgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDEzOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnJlc2VydmF0aW9uSWQgPSByZWFkZXIudWludDY0KCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJlYWRlci5za2lwVHlwZSh0YWcgJiA3KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfSxcbiAgICBmcm9tUGFydGlhbChvYmplY3QpIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2MsIF9kLCBfZSwgX2YsIF9nLCBfaDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VXYXRjaGFibGVNYXRjaEluZm8oKTtcbiAgICAgICAgbWVzc2FnZS5zZXJ2ZXJJcCA9IChfYSA9IG9iamVjdC5zZXJ2ZXJJcCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMDtcbiAgICAgICAgbWVzc2FnZS50dlBvcnQgPSAoX2IgPSBvYmplY3QudHZQb3J0KSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAwO1xuICAgICAgICBtZXNzYWdlLnR2U3BlY3RhdG9ycyA9IChfYyA9IG9iamVjdC50dlNwZWN0YXRvcnMpICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IDA7XG4gICAgICAgIG1lc3NhZ2UudHZUaW1lID0gKF9kID0gb2JqZWN0LnR2VGltZSkgIT09IG51bGwgJiYgX2QgIT09IHZvaWQgMCA/IF9kIDogMDtcbiAgICAgICAgbWVzc2FnZS50dldhdGNoUGFzc3dvcmQgPSAoX2UgPSBvYmplY3QudHZXYXRjaFBhc3N3b3JkKSAhPT0gbnVsbCAmJiBfZSAhPT0gdm9pZCAwID8gX2UgOiBuZXcgVWludDhBcnJheSgpO1xuICAgICAgICBtZXNzYWdlLmNsRGVjcnlwdGRhdGFLZXkgPVxuICAgICAgICAgICAgb2JqZWN0LmNsRGVjcnlwdGRhdGFLZXkgIT09IHVuZGVmaW5lZCAmJiBvYmplY3QuY2xEZWNyeXB0ZGF0YUtleSAhPT0gbnVsbFxuICAgICAgICAgICAgICAgID8gTG9uZy5mcm9tVmFsdWUob2JqZWN0LmNsRGVjcnlwdGRhdGFLZXkpXG4gICAgICAgICAgICAgICAgOiBMb25nLlVaRVJPO1xuICAgICAgICBtZXNzYWdlLmNsRGVjcnlwdGRhdGFLZXlQdWIgPVxuICAgICAgICAgICAgb2JqZWN0LmNsRGVjcnlwdGRhdGFLZXlQdWIgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgICAgIG9iamVjdC5jbERlY3J5cHRkYXRhS2V5UHViICE9PSBudWxsXG4gICAgICAgICAgICAgICAgPyBMb25nLmZyb21WYWx1ZShvYmplY3QuY2xEZWNyeXB0ZGF0YUtleVB1YilcbiAgICAgICAgICAgICAgICA6IExvbmcuVVpFUk87XG4gICAgICAgIG1lc3NhZ2UuZ2FtZVR5cGUgPSAoX2YgPSBvYmplY3QuZ2FtZVR5cGUpICE9PSBudWxsICYmIF9mICE9PSB2b2lkIDAgPyBfZiA6IDA7XG4gICAgICAgIG1lc3NhZ2UuZ2FtZU1hcGdyb3VwID0gKF9nID0gb2JqZWN0LmdhbWVNYXBncm91cCkgIT09IG51bGwgJiYgX2cgIT09IHZvaWQgMCA/IF9nIDogXCJcIjtcbiAgICAgICAgbWVzc2FnZS5nYW1lTWFwID0gKF9oID0gb2JqZWN0LmdhbWVNYXApICE9PSBudWxsICYmIF9oICE9PSB2b2lkIDAgPyBfaCA6IFwiXCI7XG4gICAgICAgIG1lc3NhZ2Uuc2VydmVySWQgPVxuICAgICAgICAgICAgb2JqZWN0LnNlcnZlcklkICE9PSB1bmRlZmluZWQgJiYgb2JqZWN0LnNlcnZlcklkICE9PSBudWxsXG4gICAgICAgICAgICAgICAgPyBMb25nLmZyb21WYWx1ZShvYmplY3Quc2VydmVySWQpXG4gICAgICAgICAgICAgICAgOiBMb25nLlVaRVJPO1xuICAgICAgICBtZXNzYWdlLm1hdGNoSWQgPVxuICAgICAgICAgICAgb2JqZWN0Lm1hdGNoSWQgIT09IHVuZGVmaW5lZCAmJiBvYmplY3QubWF0Y2hJZCAhPT0gbnVsbFxuICAgICAgICAgICAgICAgID8gTG9uZy5mcm9tVmFsdWUob2JqZWN0Lm1hdGNoSWQpXG4gICAgICAgICAgICAgICAgOiBMb25nLlVaRVJPO1xuICAgICAgICBtZXNzYWdlLnJlc2VydmF0aW9uSWQgPVxuICAgICAgICAgICAgb2JqZWN0LnJlc2VydmF0aW9uSWQgIT09IHVuZGVmaW5lZCAmJiBvYmplY3QucmVzZXJ2YXRpb25JZCAhPT0gbnVsbFxuICAgICAgICAgICAgICAgID8gTG9uZy5mcm9tVmFsdWUob2JqZWN0LnJlc2VydmF0aW9uSWQpXG4gICAgICAgICAgICAgICAgOiBMb25nLlVaRVJPO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG59O1xuZnVuY3Rpb24gY3JlYXRlQmFzZUNNc2dHQ0NTdHJpa2UxNVYyQ2xpZW50UmVxdWVzdEpvaW5GcmllbmREYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICAgIHZlcnNpb246IDAsXG4gICAgICAgIGFjY291bnRJZDogMCxcbiAgICAgICAgam9pblRva2VuOiAwLFxuICAgICAgICBqb2luSXBwOiAwLFxuICAgICAgICByZXM6IHVuZGVmaW5lZCxcbiAgICAgICAgZXJyb3Jtc2c6IFwiXCJcbiAgICB9O1xufVxuZXhwb3J0cy5DTXNnR0NDU3RyaWtlMTVWMkNsaWVudFJlcXVlc3RKb2luRnJpZW5kRGF0YSA9IHtcbiAgICBlbmNvZGUobWVzc2FnZSwgd3JpdGVyID0gbWluaW1hbF8xLldyaXRlci5jcmVhdGUoKSkge1xuICAgICAgICBpZiAobWVzc2FnZS52ZXJzaW9uICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDgpLnVpbnQzMihtZXNzYWdlLnZlcnNpb24pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLmFjY291bnRJZCAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigxNikudWludDMyKG1lc3NhZ2UuYWNjb3VudElkKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5qb2luVG9rZW4gIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMjQpLnVpbnQzMihtZXNzYWdlLmpvaW5Ub2tlbik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2Uuam9pbklwcCAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigzMikudWludDMyKG1lc3NhZ2Uuam9pbklwcCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UucmVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGV4cG9ydHMuQ01zZ0dDQ1N0cmlrZTE1VjJNYXRjaG1ha2luZ0dDMkNsaWVudFJlc2VydmUuZW5jb2RlKG1lc3NhZ2UucmVzLCB3cml0ZXIudWludDMyKDQyKS5mb3JrKCkpLmxkZWxpbSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLmVycm9ybXNnICE9PSBcIlwiKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDUwKS5zdHJpbmcobWVzc2FnZS5lcnJvcm1zZyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9LFxuICAgIGRlY29kZShpbnB1dCwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IGlucHV0IGluc3RhbmNlb2YgbWluaW1hbF8xLlJlYWRlciA/IGlucHV0IDogbmV3IG1pbmltYWxfMS5SZWFkZXIoaW5wdXQpO1xuICAgICAgICBsZXQgZW5kID0gbGVuZ3RoID09PSB1bmRlZmluZWQgPyByZWFkZXIubGVuIDogcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDTXNnR0NDU3RyaWtlMTVWMkNsaWVudFJlcXVlc3RKb2luRnJpZW5kRGF0YSgpO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudmVyc2lvbiA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmFjY291bnRJZCA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmpvaW5Ub2tlbiA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmpvaW5JcHAgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5yZXMgPSBleHBvcnRzLkNNc2dHQ0NTdHJpa2UxNVYyTWF0Y2htYWtpbmdHQzJDbGllbnRSZXNlcnZlLmRlY29kZShyZWFkZXIsIHJlYWRlci51aW50MzIoKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5lcnJvcm1zZyA9IHJlYWRlci5zdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmVhZGVyLnNraXBUeXBlKHRhZyAmIDcpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9LFxuICAgIGZyb21QYXJ0aWFsKG9iamVjdCkge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYywgX2QsIF9lO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNNc2dHQ0NTdHJpa2UxNVYyQ2xpZW50UmVxdWVzdEpvaW5GcmllbmREYXRhKCk7XG4gICAgICAgIG1lc3NhZ2UudmVyc2lvbiA9IChfYSA9IG9iamVjdC52ZXJzaW9uKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAwO1xuICAgICAgICBtZXNzYWdlLmFjY291bnRJZCA9IChfYiA9IG9iamVjdC5hY2NvdW50SWQpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IDA7XG4gICAgICAgIG1lc3NhZ2Uuam9pblRva2VuID0gKF9jID0gb2JqZWN0LmpvaW5Ub2tlbikgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogMDtcbiAgICAgICAgbWVzc2FnZS5qb2luSXBwID0gKF9kID0gb2JqZWN0LmpvaW5JcHApICE9PSBudWxsICYmIF9kICE9PSB2b2lkIDAgPyBfZCA6IDA7XG4gICAgICAgIG1lc3NhZ2UucmVzID1cbiAgICAgICAgICAgIG9iamVjdC5yZXMgIT09IHVuZGVmaW5lZCAmJiBvYmplY3QucmVzICE9PSBudWxsXG4gICAgICAgICAgICAgICAgPyBleHBvcnRzLkNNc2dHQ0NTdHJpa2UxNVYyTWF0Y2htYWtpbmdHQzJDbGllbnRSZXNlcnZlLmZyb21QYXJ0aWFsKG9iamVjdC5yZXMpXG4gICAgICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICAgIG1lc3NhZ2UuZXJyb3Jtc2cgPSAoX2UgPSBvYmplY3QuZXJyb3Jtc2cpICE9PSBudWxsICYmIF9lICE9PSB2b2lkIDAgPyBfZSA6IFwiXCI7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbn07XG5mdW5jdGlvbiBjcmVhdGVCYXNlQ01zZ0dDQ1N0cmlrZTE1VjJDbGllbnRSZXF1ZXN0Sm9pblNlcnZlckRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgdmVyc2lvbjogMCxcbiAgICAgICAgYWNjb3VudElkOiAwLFxuICAgICAgICBzZXJ2ZXJpZDogTG9uZy5VWkVSTyxcbiAgICAgICAgc2VydmVySXA6IDAsXG4gICAgICAgIHNlcnZlclBvcnQ6IDAsXG4gICAgICAgIHJlczogdW5kZWZpbmVkLFxuICAgICAgICBlcnJvcm1zZzogXCJcIlxuICAgIH07XG59XG5leHBvcnRzLkNNc2dHQ0NTdHJpa2UxNVYyQ2xpZW50UmVxdWVzdEpvaW5TZXJ2ZXJEYXRhID0ge1xuICAgIGVuY29kZShtZXNzYWdlLCB3cml0ZXIgPSBtaW5pbWFsXzEuV3JpdGVyLmNyZWF0ZSgpKSB7XG4gICAgICAgIGlmIChtZXNzYWdlLnZlcnNpb24gIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoOCkudWludDMyKG1lc3NhZ2UudmVyc2lvbik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UuYWNjb3VudElkICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDE2KS51aW50MzIobWVzc2FnZS5hY2NvdW50SWQpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghbWVzc2FnZS5zZXJ2ZXJpZC5pc1plcm8oKSkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigyNCkudWludDY0KG1lc3NhZ2Uuc2VydmVyaWQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLnNlcnZlcklwICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDMyKS51aW50MzIobWVzc2FnZS5zZXJ2ZXJJcCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2Uuc2VydmVyUG9ydCAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig0MCkudWludDMyKG1lc3NhZ2Uuc2VydmVyUG9ydCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UucmVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGV4cG9ydHMuQ01zZ0dDQ1N0cmlrZTE1VjJNYXRjaG1ha2luZ0dDMkNsaWVudFJlc2VydmUuZW5jb2RlKG1lc3NhZ2UucmVzLCB3cml0ZXIudWludDMyKDUwKS5mb3JrKCkpLmxkZWxpbSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLmVycm9ybXNnICE9PSBcIlwiKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDU4KS5zdHJpbmcobWVzc2FnZS5lcnJvcm1zZyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9LFxuICAgIGRlY29kZShpbnB1dCwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IGlucHV0IGluc3RhbmNlb2YgbWluaW1hbF8xLlJlYWRlciA/IGlucHV0IDogbmV3IG1pbmltYWxfMS5SZWFkZXIoaW5wdXQpO1xuICAgICAgICBsZXQgZW5kID0gbGVuZ3RoID09PSB1bmRlZmluZWQgPyByZWFkZXIubGVuIDogcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDTXNnR0NDU3RyaWtlMTVWMkNsaWVudFJlcXVlc3RKb2luU2VydmVyRGF0YSgpO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudmVyc2lvbiA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmFjY291bnRJZCA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnNlcnZlcmlkID0gcmVhZGVyLnVpbnQ2NCgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Uuc2VydmVySXAgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5zZXJ2ZXJQb3J0ID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UucmVzID0gZXhwb3J0cy5DTXNnR0NDU3RyaWtlMTVWMk1hdGNobWFraW5nR0MyQ2xpZW50UmVzZXJ2ZS5kZWNvZGUocmVhZGVyLCByZWFkZXIudWludDMyKCkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZXJyb3Jtc2cgPSByZWFkZXIuc3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJlYWRlci5za2lwVHlwZSh0YWcgJiA3KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfSxcbiAgICBmcm9tUGFydGlhbChvYmplY3QpIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2MsIF9kLCBfZTtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDTXNnR0NDU3RyaWtlMTVWMkNsaWVudFJlcXVlc3RKb2luU2VydmVyRGF0YSgpO1xuICAgICAgICBtZXNzYWdlLnZlcnNpb24gPSAoX2EgPSBvYmplY3QudmVyc2lvbikgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMDtcbiAgICAgICAgbWVzc2FnZS5hY2NvdW50SWQgPSAoX2IgPSBvYmplY3QuYWNjb3VudElkKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAwO1xuICAgICAgICBtZXNzYWdlLnNlcnZlcmlkID1cbiAgICAgICAgICAgIG9iamVjdC5zZXJ2ZXJpZCAhPT0gdW5kZWZpbmVkICYmIG9iamVjdC5zZXJ2ZXJpZCAhPT0gbnVsbFxuICAgICAgICAgICAgICAgID8gTG9uZy5mcm9tVmFsdWUob2JqZWN0LnNlcnZlcmlkKVxuICAgICAgICAgICAgICAgIDogTG9uZy5VWkVSTztcbiAgICAgICAgbWVzc2FnZS5zZXJ2ZXJJcCA9IChfYyA9IG9iamVjdC5zZXJ2ZXJJcCkgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogMDtcbiAgICAgICAgbWVzc2FnZS5zZXJ2ZXJQb3J0ID0gKF9kID0gb2JqZWN0LnNlcnZlclBvcnQpICE9PSBudWxsICYmIF9kICE9PSB2b2lkIDAgPyBfZCA6IDA7XG4gICAgICAgIG1lc3NhZ2UucmVzID1cbiAgICAgICAgICAgIG9iamVjdC5yZXMgIT09IHVuZGVmaW5lZCAmJiBvYmplY3QucmVzICE9PSBudWxsXG4gICAgICAgICAgICAgICAgPyBleHBvcnRzLkNNc2dHQ0NTdHJpa2UxNVYyTWF0Y2htYWtpbmdHQzJDbGllbnRSZXNlcnZlLmZyb21QYXJ0aWFsKG9iamVjdC5yZXMpXG4gICAgICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICAgIG1lc3NhZ2UuZXJyb3Jtc2cgPSAoX2UgPSBvYmplY3QuZXJyb3Jtc2cpICE9PSBudWxsICYmIF9lICE9PSB2b2lkIDAgPyBfZSA6IFwiXCI7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbn07XG5mdW5jdGlvbiBjcmVhdGVCYXNlQ01zZ0dDQ3N0cmlrZTE1VjJDbGllbnRSZXF1ZXN0TmV3TWlzc2lvbigpIHtcbiAgICByZXR1cm4geyBtaXNzaW9uSWQ6IDAsIGNhbXBhaWduSWQ6IDAgfTtcbn1cbmV4cG9ydHMuQ01zZ0dDQ3N0cmlrZTE1VjJDbGllbnRSZXF1ZXN0TmV3TWlzc2lvbiA9IHtcbiAgICBlbmNvZGUobWVzc2FnZSwgd3JpdGVyID0gbWluaW1hbF8xLldyaXRlci5jcmVhdGUoKSkge1xuICAgICAgICBpZiAobWVzc2FnZS5taXNzaW9uSWQgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMTYpLnVpbnQzMihtZXNzYWdlLm1pc3Npb25JZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UuY2FtcGFpZ25JZCAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigyNCkudWludDMyKG1lc3NhZ2UuY2FtcGFpZ25JZCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9LFxuICAgIGRlY29kZShpbnB1dCwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IGlucHV0IGluc3RhbmNlb2YgbWluaW1hbF8xLlJlYWRlciA/IGlucHV0IDogbmV3IG1pbmltYWxfMS5SZWFkZXIoaW5wdXQpO1xuICAgICAgICBsZXQgZW5kID0gbGVuZ3RoID09PSB1bmRlZmluZWQgPyByZWFkZXIubGVuIDogcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDTXNnR0NDc3RyaWtlMTVWMkNsaWVudFJlcXVlc3ROZXdNaXNzaW9uKCk7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBjb25zdCB0YWcgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKHRhZyA+Pj4gMykge1xuICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5taXNzaW9uSWQgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5jYW1wYWlnbklkID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICByZWFkZXIuc2tpcFR5cGUodGFnICYgNyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH0sXG4gICAgZnJvbVBhcnRpYWwob2JqZWN0KSB7XG4gICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ01zZ0dDQ3N0cmlrZTE1VjJDbGllbnRSZXF1ZXN0TmV3TWlzc2lvbigpO1xuICAgICAgICBtZXNzYWdlLm1pc3Npb25JZCA9IChfYSA9IG9iamVjdC5taXNzaW9uSWQpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IDA7XG4gICAgICAgIG1lc3NhZ2UuY2FtcGFpZ25JZCA9IChfYiA9IG9iamVjdC5jYW1wYWlnbklkKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAwO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG59O1xuZnVuY3Rpb24gY3JlYXRlQmFzZUNNc2dHQ0NzdHJpa2UxNVYyQ2xpZW50UmVkZWVtTWlzc2lvblJld2FyZCgpIHtcbiAgICByZXR1cm4geyBjYW1wYWlnbklkOiAwLCByZWRlZW1JZDogMCwgcmVkZWVtYWJsZUJhbGFuY2U6IDAsIGV4cGVjdGVkQ29zdDogMCB9O1xufVxuZXhwb3J0cy5DTXNnR0NDc3RyaWtlMTVWMkNsaWVudFJlZGVlbU1pc3Npb25SZXdhcmQgPSB7XG4gICAgZW5jb2RlKG1lc3NhZ2UsIHdyaXRlciA9IG1pbmltYWxfMS5Xcml0ZXIuY3JlYXRlKCkpIHtcbiAgICAgICAgaWYgKG1lc3NhZ2UuY2FtcGFpZ25JZCAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig4KS51aW50MzIobWVzc2FnZS5jYW1wYWlnbklkKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5yZWRlZW1JZCAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigxNikudWludDMyKG1lc3NhZ2UucmVkZWVtSWQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLnJlZGVlbWFibGVCYWxhbmNlICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDI0KS51aW50MzIobWVzc2FnZS5yZWRlZW1hYmxlQmFsYW5jZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UuZXhwZWN0ZWRDb3N0ICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDMyKS51aW50MzIobWVzc2FnZS5leHBlY3RlZENvc3QpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfSxcbiAgICBkZWNvZGUoaW5wdXQsIGxlbmd0aCkge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBpbnB1dCBpbnN0YW5jZW9mIG1pbmltYWxfMS5SZWFkZXIgPyBpbnB1dCA6IG5ldyBtaW5pbWFsXzEuUmVhZGVyKGlucHV0KTtcbiAgICAgICAgbGV0IGVuZCA9IGxlbmd0aCA9PT0gdW5kZWZpbmVkID8gcmVhZGVyLmxlbiA6IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ01zZ0dDQ3N0cmlrZTE1VjJDbGllbnRSZWRlZW1NaXNzaW9uUmV3YXJkKCk7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBjb25zdCB0YWcgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKHRhZyA+Pj4gMykge1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5jYW1wYWlnbklkID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UucmVkZWVtSWQgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5yZWRlZW1hYmxlQmFsYW5jZSA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmV4cGVjdGVkQ29zdCA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmVhZGVyLnNraXBUeXBlKHRhZyAmIDcpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9LFxuICAgIGZyb21QYXJ0aWFsKG9iamVjdCkge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYywgX2Q7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ01zZ0dDQ3N0cmlrZTE1VjJDbGllbnRSZWRlZW1NaXNzaW9uUmV3YXJkKCk7XG4gICAgICAgIG1lc3NhZ2UuY2FtcGFpZ25JZCA9IChfYSA9IG9iamVjdC5jYW1wYWlnbklkKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAwO1xuICAgICAgICBtZXNzYWdlLnJlZGVlbUlkID0gKF9iID0gb2JqZWN0LnJlZGVlbUlkKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAwO1xuICAgICAgICBtZXNzYWdlLnJlZGVlbWFibGVCYWxhbmNlID0gKF9jID0gb2JqZWN0LnJlZGVlbWFibGVCYWxhbmNlKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiAwO1xuICAgICAgICBtZXNzYWdlLmV4cGVjdGVkQ29zdCA9IChfZCA9IG9iamVjdC5leHBlY3RlZENvc3QpICE9PSBudWxsICYmIF9kICE9PSB2b2lkIDAgPyBfZCA6IDA7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbn07XG5mdW5jdGlvbiBjcmVhdGVCYXNlQ01zZ0dDQ3N0cmlrZTE1VjJHQzJTZXJ2ZXJOb3RpZnlYUFJld2FyZGVkKCkge1xuICAgIHJldHVybiB7XG4gICAgICAgIHhwUHJvZ3Jlc3NEYXRhOiBbXSxcbiAgICAgICAgYWNjb3VudElkOiAwLFxuICAgICAgICBjdXJyZW50WHA6IDAsXG4gICAgICAgIGN1cnJlbnRMZXZlbDogMCxcbiAgICAgICAgdXBncmFkZWREZWZpZHg6IDAsXG4gICAgICAgIG9wZXJhdGlvblBvaW50c0F3YXJkZWQ6IDBcbiAgICB9O1xufVxuZXhwb3J0cy5DTXNnR0NDc3RyaWtlMTVWMkdDMlNlcnZlck5vdGlmeVhQUmV3YXJkZWQgPSB7XG4gICAgZW5jb2RlKG1lc3NhZ2UsIHdyaXRlciA9IG1pbmltYWxfMS5Xcml0ZXIuY3JlYXRlKCkpIHtcbiAgICAgICAgZm9yIChjb25zdCB2IG9mIG1lc3NhZ2UueHBQcm9ncmVzc0RhdGEpIHtcbiAgICAgICAgICAgIGV4cG9ydHMuWHBQcm9ncmVzc0RhdGEuZW5jb2RlKHYsIHdyaXRlci51aW50MzIoMTApLmZvcmsoKSkubGRlbGltKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UuYWNjb3VudElkICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDE2KS51aW50MzIobWVzc2FnZS5hY2NvdW50SWQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLmN1cnJlbnRYcCAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigyNCkudWludDMyKG1lc3NhZ2UuY3VycmVudFhwKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5jdXJyZW50TGV2ZWwgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMzIpLnVpbnQzMihtZXNzYWdlLmN1cnJlbnRMZXZlbCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UudXBncmFkZWREZWZpZHggIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoNDApLnVpbnQzMihtZXNzYWdlLnVwZ3JhZGVkRGVmaWR4KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5vcGVyYXRpb25Qb2ludHNBd2FyZGVkICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDQ4KS51aW50MzIobWVzc2FnZS5vcGVyYXRpb25Qb2ludHNBd2FyZGVkKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH0sXG4gICAgZGVjb2RlKGlucHV0LCBsZW5ndGgpIHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gaW5wdXQgaW5zdGFuY2VvZiBtaW5pbWFsXzEuUmVhZGVyID8gaW5wdXQgOiBuZXcgbWluaW1hbF8xLlJlYWRlcihpbnB1dCk7XG4gICAgICAgIGxldCBlbmQgPSBsZW5ndGggPT09IHVuZGVmaW5lZCA/IHJlYWRlci5sZW4gOiByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNNc2dHQ0NzdHJpa2UxNVYyR0MyU2VydmVyTm90aWZ5WFBSZXdhcmRlZCgpO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UueHBQcm9ncmVzc0RhdGEucHVzaChleHBvcnRzLlhwUHJvZ3Jlc3NEYXRhLmRlY29kZShyZWFkZXIsIHJlYWRlci51aW50MzIoKSkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuYWNjb3VudElkID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuY3VycmVudFhwID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuY3VycmVudExldmVsID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudXBncmFkZWREZWZpZHggPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5vcGVyYXRpb25Qb2ludHNBd2FyZGVkID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICByZWFkZXIuc2tpcFR5cGUodGFnICYgNyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH0sXG4gICAgZnJvbVBhcnRpYWwob2JqZWN0KSB7XG4gICAgICAgIHZhciBfYSwgX2IsIF9jLCBfZCwgX2UsIF9mO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNNc2dHQ0NzdHJpa2UxNVYyR0MyU2VydmVyTm90aWZ5WFBSZXdhcmRlZCgpO1xuICAgICAgICBtZXNzYWdlLnhwUHJvZ3Jlc3NEYXRhID1cbiAgICAgICAgICAgICgoX2EgPSBvYmplY3QueHBQcm9ncmVzc0RhdGEpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5tYXAoZSA9PiBleHBvcnRzLlhwUHJvZ3Jlc3NEYXRhLmZyb21QYXJ0aWFsKGUpKSkgfHwgW107XG4gICAgICAgIG1lc3NhZ2UuYWNjb3VudElkID0gKF9iID0gb2JqZWN0LmFjY291bnRJZCkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogMDtcbiAgICAgICAgbWVzc2FnZS5jdXJyZW50WHAgPSAoX2MgPSBvYmplY3QuY3VycmVudFhwKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiAwO1xuICAgICAgICBtZXNzYWdlLmN1cnJlbnRMZXZlbCA9IChfZCA9IG9iamVjdC5jdXJyZW50TGV2ZWwpICE9PSBudWxsICYmIF9kICE9PSB2b2lkIDAgPyBfZCA6IDA7XG4gICAgICAgIG1lc3NhZ2UudXBncmFkZWREZWZpZHggPSAoX2UgPSBvYmplY3QudXBncmFkZWREZWZpZHgpICE9PSBudWxsICYmIF9lICE9PSB2b2lkIDAgPyBfZSA6IDA7XG4gICAgICAgIG1lc3NhZ2Uub3BlcmF0aW9uUG9pbnRzQXdhcmRlZCA9IChfZiA9IG9iamVjdC5vcGVyYXRpb25Qb2ludHNBd2FyZGVkKSAhPT0gbnVsbCAmJiBfZiAhPT0gdm9pZCAwID8gX2YgOiAwO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG59O1xuZnVuY3Rpb24gY3JlYXRlQmFzZUNNc2dHQ0NTdHJpa2UxNUNsaWVudERlZXBTdGF0cygpIHtcbiAgICByZXR1cm4geyBhY2NvdW50SWQ6IDAsIHJhbmdlOiB1bmRlZmluZWQsIG1hdGNoZXM6IFtdIH07XG59XG5leHBvcnRzLkNNc2dHQ0NTdHJpa2UxNUNsaWVudERlZXBTdGF0cyA9IHtcbiAgICBlbmNvZGUobWVzc2FnZSwgd3JpdGVyID0gbWluaW1hbF8xLldyaXRlci5jcmVhdGUoKSkge1xuICAgICAgICBpZiAobWVzc2FnZS5hY2NvdW50SWQgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoOCkudWludDMyKG1lc3NhZ2UuYWNjb3VudElkKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5yYW5nZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBleHBvcnRzLkNNc2dHQ0NTdHJpa2UxNUNsaWVudERlZXBTdGF0c19EZWVwU3RhdHNSYW5nZS5lbmNvZGUobWVzc2FnZS5yYW5nZSwgd3JpdGVyLnVpbnQzMigxOCkuZm9yaygpKS5sZGVsaW0oKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IHYgb2YgbWVzc2FnZS5tYXRjaGVzKSB7XG4gICAgICAgICAgICBleHBvcnRzLkNNc2dHQ0NTdHJpa2UxNUNsaWVudERlZXBTdGF0c19EZWVwU3RhdHNNYXRjaC5lbmNvZGUodiwgd3JpdGVyLnVpbnQzMigyNikuZm9yaygpKS5sZGVsaW0oKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH0sXG4gICAgZGVjb2RlKGlucHV0LCBsZW5ndGgpIHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gaW5wdXQgaW5zdGFuY2VvZiBtaW5pbWFsXzEuUmVhZGVyID8gaW5wdXQgOiBuZXcgbWluaW1hbF8xLlJlYWRlcihpbnB1dCk7XG4gICAgICAgIGxldCBlbmQgPSBsZW5ndGggPT09IHVuZGVmaW5lZCA/IHJlYWRlci5sZW4gOiByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNNc2dHQ0NTdHJpa2UxNUNsaWVudERlZXBTdGF0cygpO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuYWNjb3VudElkID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UucmFuZ2UgPSBleHBvcnRzLkNNc2dHQ0NTdHJpa2UxNUNsaWVudERlZXBTdGF0c19EZWVwU3RhdHNSYW5nZS5kZWNvZGUocmVhZGVyLCByZWFkZXIudWludDMyKCkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UubWF0Y2hlcy5wdXNoKGV4cG9ydHMuQ01zZ0dDQ1N0cmlrZTE1Q2xpZW50RGVlcFN0YXRzX0RlZXBTdGF0c01hdGNoLmRlY29kZShyZWFkZXIsIHJlYWRlci51aW50MzIoKSkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICByZWFkZXIuc2tpcFR5cGUodGFnICYgNyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH0sXG4gICAgZnJvbVBhcnRpYWwob2JqZWN0KSB7XG4gICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ01zZ0dDQ1N0cmlrZTE1Q2xpZW50RGVlcFN0YXRzKCk7XG4gICAgICAgIG1lc3NhZ2UuYWNjb3VudElkID0gKF9hID0gb2JqZWN0LmFjY291bnRJZCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMDtcbiAgICAgICAgbWVzc2FnZS5yYW5nZSA9XG4gICAgICAgICAgICBvYmplY3QucmFuZ2UgIT09IHVuZGVmaW5lZCAmJiBvYmplY3QucmFuZ2UgIT09IG51bGxcbiAgICAgICAgICAgICAgICA/IGV4cG9ydHMuQ01zZ0dDQ1N0cmlrZTE1Q2xpZW50RGVlcFN0YXRzX0RlZXBTdGF0c1JhbmdlLmZyb21QYXJ0aWFsKG9iamVjdC5yYW5nZSlcbiAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgICAgbWVzc2FnZS5tYXRjaGVzID1cbiAgICAgICAgICAgICgoX2IgPSBvYmplY3QubWF0Y2hlcykgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLm1hcChlID0+IGV4cG9ydHMuQ01zZ0dDQ1N0cmlrZTE1Q2xpZW50RGVlcFN0YXRzX0RlZXBTdGF0c01hdGNoLmZyb21QYXJ0aWFsKGUpKSkgfHwgW107XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbn07XG5mdW5jdGlvbiBjcmVhdGVCYXNlQ01zZ0dDQ1N0cmlrZTE1Q2xpZW50RGVlcFN0YXRzX0RlZXBTdGF0c1JhbmdlKCkge1xuICAgIHJldHVybiB7IGJlZ2luOiAwLCBlbmQ6IDAsIGZyb3plbjogZmFsc2UgfTtcbn1cbmV4cG9ydHMuQ01zZ0dDQ1N0cmlrZTE1Q2xpZW50RGVlcFN0YXRzX0RlZXBTdGF0c1JhbmdlID0ge1xuICAgIGVuY29kZShtZXNzYWdlLCB3cml0ZXIgPSBtaW5pbWFsXzEuV3JpdGVyLmNyZWF0ZSgpKSB7XG4gICAgICAgIGlmIChtZXNzYWdlLmJlZ2luICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDgpLnVpbnQzMihtZXNzYWdlLmJlZ2luKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5lbmQgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMTYpLnVpbnQzMihtZXNzYWdlLmVuZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UuZnJvemVuID09PSB0cnVlKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDI0KS5ib29sKG1lc3NhZ2UuZnJvemVuKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH0sXG4gICAgZGVjb2RlKGlucHV0LCBsZW5ndGgpIHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gaW5wdXQgaW5zdGFuY2VvZiBtaW5pbWFsXzEuUmVhZGVyID8gaW5wdXQgOiBuZXcgbWluaW1hbF8xLlJlYWRlcihpbnB1dCk7XG4gICAgICAgIGxldCBlbmQgPSBsZW5ndGggPT09IHVuZGVmaW5lZCA/IHJlYWRlci5sZW4gOiByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNNc2dHQ0NTdHJpa2UxNUNsaWVudERlZXBTdGF0c19EZWVwU3RhdHNSYW5nZSgpO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuYmVnaW4gPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5lbmQgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5mcm96ZW4gPSByZWFkZXIuYm9vbCgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICByZWFkZXIuc2tpcFR5cGUodGFnICYgNyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH0sXG4gICAgZnJvbVBhcnRpYWwob2JqZWN0KSB7XG4gICAgICAgIHZhciBfYSwgX2IsIF9jO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNNc2dHQ0NTdHJpa2UxNUNsaWVudERlZXBTdGF0c19EZWVwU3RhdHNSYW5nZSgpO1xuICAgICAgICBtZXNzYWdlLmJlZ2luID0gKF9hID0gb2JqZWN0LmJlZ2luKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAwO1xuICAgICAgICBtZXNzYWdlLmVuZCA9IChfYiA9IG9iamVjdC5lbmQpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IDA7XG4gICAgICAgIG1lc3NhZ2UuZnJvemVuID0gKF9jID0gb2JqZWN0LmZyb3plbikgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogZmFsc2U7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbn07XG5mdW5jdGlvbiBjcmVhdGVCYXNlQ01zZ0dDQ1N0cmlrZTE1Q2xpZW50RGVlcFN0YXRzX0RlZXBTdGF0c01hdGNoKCkge1xuICAgIHJldHVybiB7IHBsYXllcjogdW5kZWZpbmVkLCBldmVudHM6IFtdIH07XG59XG5leHBvcnRzLkNNc2dHQ0NTdHJpa2UxNUNsaWVudERlZXBTdGF0c19EZWVwU3RhdHNNYXRjaCA9IHtcbiAgICBlbmNvZGUobWVzc2FnZSwgd3JpdGVyID0gbWluaW1hbF8xLldyaXRlci5jcmVhdGUoKSkge1xuICAgICAgICBpZiAobWVzc2FnZS5wbGF5ZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgZXhwb3J0cy5EZWVwUGxheWVyU3RhdHNFbnRyeS5lbmNvZGUobWVzc2FnZS5wbGF5ZXIsIHdyaXRlci51aW50MzIoMTApLmZvcmsoKSkubGRlbGltKCk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCB2IG9mIG1lc3NhZ2UuZXZlbnRzKSB7XG4gICAgICAgICAgICBleHBvcnRzLkRlZXBQbGF5ZXJNYXRjaEV2ZW50LmVuY29kZSh2LCB3cml0ZXIudWludDMyKDE4KS5mb3JrKCkpLmxkZWxpbSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfSxcbiAgICBkZWNvZGUoaW5wdXQsIGxlbmd0aCkge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBpbnB1dCBpbnN0YW5jZW9mIG1pbmltYWxfMS5SZWFkZXIgPyBpbnB1dCA6IG5ldyBtaW5pbWFsXzEuUmVhZGVyKGlucHV0KTtcbiAgICAgICAgbGV0IGVuZCA9IGxlbmd0aCA9PT0gdW5kZWZpbmVkID8gcmVhZGVyLmxlbiA6IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ01zZ0dDQ1N0cmlrZTE1Q2xpZW50RGVlcFN0YXRzX0RlZXBTdGF0c01hdGNoKCk7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBjb25zdCB0YWcgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKHRhZyA+Pj4gMykge1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5wbGF5ZXIgPSBleHBvcnRzLkRlZXBQbGF5ZXJTdGF0c0VudHJ5LmRlY29kZShyZWFkZXIsIHJlYWRlci51aW50MzIoKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5ldmVudHMucHVzaChleHBvcnRzLkRlZXBQbGF5ZXJNYXRjaEV2ZW50LmRlY29kZShyZWFkZXIsIHJlYWRlci51aW50MzIoKSkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICByZWFkZXIuc2tpcFR5cGUodGFnICYgNyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH0sXG4gICAgZnJvbVBhcnRpYWwob2JqZWN0KSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDTXNnR0NDU3RyaWtlMTVDbGllbnREZWVwU3RhdHNfRGVlcFN0YXRzTWF0Y2goKTtcbiAgICAgICAgbWVzc2FnZS5wbGF5ZXIgPVxuICAgICAgICAgICAgb2JqZWN0LnBsYXllciAhPT0gdW5kZWZpbmVkICYmIG9iamVjdC5wbGF5ZXIgIT09IG51bGxcbiAgICAgICAgICAgICAgICA/IGV4cG9ydHMuRGVlcFBsYXllclN0YXRzRW50cnkuZnJvbVBhcnRpYWwob2JqZWN0LnBsYXllcilcbiAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgICAgbWVzc2FnZS5ldmVudHMgPVxuICAgICAgICAgICAgKChfYSA9IG9iamVjdC5ldmVudHMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5tYXAoZSA9PiBleHBvcnRzLkRlZXBQbGF5ZXJNYXRjaEV2ZW50LmZyb21QYXJ0aWFsKGUpKSkgfHwgW107XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbn07XG5mdW5jdGlvbiBjcmVhdGVCYXNlQ01zZ0dDQ1N0cmlrZTE1VjJXYXRjaEluZm9Vc2VycygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICByZXF1ZXN0SWQ6IDAsXG4gICAgICAgIGFjY291bnRJZHM6IFtdLFxuICAgICAgICB3YXRjaGFibGVNYXRjaEluZm9zOiBbXSxcbiAgICAgICAgZXh0ZW5kZWRUaW1lb3V0OiAwXG4gICAgfTtcbn1cbmV4cG9ydHMuQ01zZ0dDQ1N0cmlrZTE1VjJXYXRjaEluZm9Vc2VycyA9IHtcbiAgICBlbmNvZGUobWVzc2FnZSwgd3JpdGVyID0gbWluaW1hbF8xLldyaXRlci5jcmVhdGUoKSkge1xuICAgICAgICBpZiAobWVzc2FnZS5yZXF1ZXN0SWQgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoOCkudWludDMyKG1lc3NhZ2UucmVxdWVzdElkKTtcbiAgICAgICAgfVxuICAgICAgICB3cml0ZXIudWludDMyKDE4KS5mb3JrKCk7XG4gICAgICAgIGZvciAoY29uc3QgdiBvZiBtZXNzYWdlLmFjY291bnRJZHMpIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIodik7XG4gICAgICAgIH1cbiAgICAgICAgd3JpdGVyLmxkZWxpbSgpO1xuICAgICAgICBmb3IgKGNvbnN0IHYgb2YgbWVzc2FnZS53YXRjaGFibGVNYXRjaEluZm9zKSB7XG4gICAgICAgICAgICBleHBvcnRzLldhdGNoYWJsZU1hdGNoSW5mby5lbmNvZGUodiwgd3JpdGVyLnVpbnQzMigyNikuZm9yaygpKS5sZGVsaW0oKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5leHRlbmRlZFRpbWVvdXQgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoNDApLnVpbnQzMihtZXNzYWdlLmV4dGVuZGVkVGltZW91dCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9LFxuICAgIGRlY29kZShpbnB1dCwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IGlucHV0IGluc3RhbmNlb2YgbWluaW1hbF8xLlJlYWRlciA/IGlucHV0IDogbmV3IG1pbmltYWxfMS5SZWFkZXIoaW5wdXQpO1xuICAgICAgICBsZXQgZW5kID0gbGVuZ3RoID09PSB1bmRlZmluZWQgPyByZWFkZXIubGVuIDogcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDTXNnR0NDU3RyaWtlMTVWMldhdGNoSW5mb1VzZXJzKCk7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBjb25zdCB0YWcgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKHRhZyA+Pj4gMykge1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5yZXF1ZXN0SWQgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgaWYgKCh0YWcgJiA3KSA9PT0gMikge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZW5kMiA9IHJlYWRlci51aW50MzIoKSArIHJlYWRlci5wb3M7XG4gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZDIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmFjY291bnRJZHMucHVzaChyZWFkZXIudWludDMyKCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5hY2NvdW50SWRzLnB1c2gocmVhZGVyLnVpbnQzMigpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Uud2F0Y2hhYmxlTWF0Y2hJbmZvcy5wdXNoKGV4cG9ydHMuV2F0Y2hhYmxlTWF0Y2hJbmZvLmRlY29kZShyZWFkZXIsIHJlYWRlci51aW50MzIoKSkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZXh0ZW5kZWRUaW1lb3V0ID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICByZWFkZXIuc2tpcFR5cGUodGFnICYgNyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH0sXG4gICAgZnJvbVBhcnRpYWwob2JqZWN0KSB7XG4gICAgICAgIHZhciBfYSwgX2IsIF9jLCBfZDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDTXNnR0NDU3RyaWtlMTVWMldhdGNoSW5mb1VzZXJzKCk7XG4gICAgICAgIG1lc3NhZ2UucmVxdWVzdElkID0gKF9hID0gb2JqZWN0LnJlcXVlc3RJZCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMDtcbiAgICAgICAgbWVzc2FnZS5hY2NvdW50SWRzID0gKChfYiA9IG9iamVjdC5hY2NvdW50SWRzKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IubWFwKGUgPT4gZSkpIHx8IFtdO1xuICAgICAgICBtZXNzYWdlLndhdGNoYWJsZU1hdGNoSW5mb3MgPVxuICAgICAgICAgICAgKChfYyA9IG9iamVjdC53YXRjaGFibGVNYXRjaEluZm9zKSA9PT0gbnVsbCB8fCBfYyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2MubWFwKGUgPT4gZXhwb3J0cy5XYXRjaGFibGVNYXRjaEluZm8uZnJvbVBhcnRpYWwoZSkpKSB8fFxuICAgICAgICAgICAgICAgIFtdO1xuICAgICAgICBtZXNzYWdlLmV4dGVuZGVkVGltZW91dCA9IChfZCA9IG9iamVjdC5leHRlbmRlZFRpbWVvdXQpICE9PSBudWxsICYmIF9kICE9PSB2b2lkIDAgPyBfZCA6IDA7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbn07XG5mdW5jdGlvbiBjcmVhdGVCYXNlQ01zZ0dDQ1N0cmlrZTE1VjJDbGllbnRSZXF1ZXN0UGxheWVyc1Byb2ZpbGUoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgcmVxdWVzdElkRGVwcmVjYXRlZDogMCxcbiAgICAgICAgYWNjb3VudElkc0RlcHJlY2F0ZWQ6IFtdLFxuICAgICAgICBhY2NvdW50SWQ6IDAsXG4gICAgICAgIHJlcXVlc3RMZXZlbDogMFxuICAgIH07XG59XG5leHBvcnRzLkNNc2dHQ0NTdHJpa2UxNVYyQ2xpZW50UmVxdWVzdFBsYXllcnNQcm9maWxlID0ge1xuICAgIGVuY29kZShtZXNzYWdlLCB3cml0ZXIgPSBtaW5pbWFsXzEuV3JpdGVyLmNyZWF0ZSgpKSB7XG4gICAgICAgIGlmIChtZXNzYWdlLnJlcXVlc3RJZERlcHJlY2F0ZWQgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoOCkudWludDMyKG1lc3NhZ2UucmVxdWVzdElkRGVwcmVjYXRlZCk7XG4gICAgICAgIH1cbiAgICAgICAgd3JpdGVyLnVpbnQzMigxOCkuZm9yaygpO1xuICAgICAgICBmb3IgKGNvbnN0IHYgb2YgbWVzc2FnZS5hY2NvdW50SWRzRGVwcmVjYXRlZCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMih2KTtcbiAgICAgICAgfVxuICAgICAgICB3cml0ZXIubGRlbGltKCk7XG4gICAgICAgIGlmIChtZXNzYWdlLmFjY291bnRJZCAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigyNCkudWludDMyKG1lc3NhZ2UuYWNjb3VudElkKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5yZXF1ZXN0TGV2ZWwgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMzIpLnVpbnQzMihtZXNzYWdlLnJlcXVlc3RMZXZlbCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9LFxuICAgIGRlY29kZShpbnB1dCwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IGlucHV0IGluc3RhbmNlb2YgbWluaW1hbF8xLlJlYWRlciA/IGlucHV0IDogbmV3IG1pbmltYWxfMS5SZWFkZXIoaW5wdXQpO1xuICAgICAgICBsZXQgZW5kID0gbGVuZ3RoID09PSB1bmRlZmluZWQgPyByZWFkZXIubGVuIDogcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDTXNnR0NDU3RyaWtlMTVWMkNsaWVudFJlcXVlc3RQbGF5ZXJzUHJvZmlsZSgpO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UucmVxdWVzdElkRGVwcmVjYXRlZCA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICBpZiAoKHRhZyAmIDcpID09PSAyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbmQyID0gcmVhZGVyLnVpbnQzMigpICsgcmVhZGVyLnBvcztcbiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kMikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuYWNjb3VudElkc0RlcHJlY2F0ZWQucHVzaChyZWFkZXIudWludDMyKCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5hY2NvdW50SWRzRGVwcmVjYXRlZC5wdXNoKHJlYWRlci51aW50MzIoKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmFjY291bnRJZCA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnJlcXVlc3RMZXZlbCA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmVhZGVyLnNraXBUeXBlKHRhZyAmIDcpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9LFxuICAgIGZyb21QYXJ0aWFsKG9iamVjdCkge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYywgX2Q7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ01zZ0dDQ1N0cmlrZTE1VjJDbGllbnRSZXF1ZXN0UGxheWVyc1Byb2ZpbGUoKTtcbiAgICAgICAgbWVzc2FnZS5yZXF1ZXN0SWREZXByZWNhdGVkID0gKF9hID0gb2JqZWN0LnJlcXVlc3RJZERlcHJlY2F0ZWQpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IDA7XG4gICAgICAgIG1lc3NhZ2UuYWNjb3VudElkc0RlcHJlY2F0ZWQgPVxuICAgICAgICAgICAgKChfYiA9IG9iamVjdC5hY2NvdW50SWRzRGVwcmVjYXRlZCkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLm1hcChlID0+IGUpKSB8fCBbXTtcbiAgICAgICAgbWVzc2FnZS5hY2NvdW50SWQgPSAoX2MgPSBvYmplY3QuYWNjb3VudElkKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiAwO1xuICAgICAgICBtZXNzYWdlLnJlcXVlc3RMZXZlbCA9IChfZCA9IG9iamVjdC5yZXF1ZXN0TGV2ZWwpICE9PSBudWxsICYmIF9kICE9PSB2b2lkIDAgPyBfZCA6IDA7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbn07XG5mdW5jdGlvbiBjcmVhdGVCYXNlQ01zZ0dDQ1N0cmlrZTE1VjJQbGF5ZXJzUHJvZmlsZSgpIHtcbiAgICByZXR1cm4geyByZXF1ZXN0SWQ6IDAsIGFjY291bnRQcm9maWxlczogW10gfTtcbn1cbmV4cG9ydHMuQ01zZ0dDQ1N0cmlrZTE1VjJQbGF5ZXJzUHJvZmlsZSA9IHtcbiAgICBlbmNvZGUobWVzc2FnZSwgd3JpdGVyID0gbWluaW1hbF8xLldyaXRlci5jcmVhdGUoKSkge1xuICAgICAgICBpZiAobWVzc2FnZS5yZXF1ZXN0SWQgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoOCkudWludDMyKG1lc3NhZ2UucmVxdWVzdElkKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IHYgb2YgbWVzc2FnZS5hY2NvdW50UHJvZmlsZXMpIHtcbiAgICAgICAgICAgIGV4cG9ydHMuQ01zZ0dDQ1N0cmlrZTE1VjJNYXRjaG1ha2luZ0dDMkNsaWVudEhlbGxvLmVuY29kZSh2LCB3cml0ZXIudWludDMyKDE4KS5mb3JrKCkpLmxkZWxpbSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfSxcbiAgICBkZWNvZGUoaW5wdXQsIGxlbmd0aCkge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBpbnB1dCBpbnN0YW5jZW9mIG1pbmltYWxfMS5SZWFkZXIgPyBpbnB1dCA6IG5ldyBtaW5pbWFsXzEuUmVhZGVyKGlucHV0KTtcbiAgICAgICAgbGV0IGVuZCA9IGxlbmd0aCA9PT0gdW5kZWZpbmVkID8gcmVhZGVyLmxlbiA6IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ01zZ0dDQ1N0cmlrZTE1VjJQbGF5ZXJzUHJvZmlsZSgpO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UucmVxdWVzdElkID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuYWNjb3VudFByb2ZpbGVzLnB1c2goZXhwb3J0cy5DTXNnR0NDU3RyaWtlMTVWMk1hdGNobWFraW5nR0MyQ2xpZW50SGVsbG8uZGVjb2RlKHJlYWRlciwgcmVhZGVyLnVpbnQzMigpKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJlYWRlci5za2lwVHlwZSh0YWcgJiA3KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfSxcbiAgICBmcm9tUGFydGlhbChvYmplY3QpIHtcbiAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDTXNnR0NDU3RyaWtlMTVWMlBsYXllcnNQcm9maWxlKCk7XG4gICAgICAgIG1lc3NhZ2UucmVxdWVzdElkID0gKF9hID0gb2JqZWN0LnJlcXVlc3RJZCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMDtcbiAgICAgICAgbWVzc2FnZS5hY2NvdW50UHJvZmlsZXMgPVxuICAgICAgICAgICAgKChfYiA9IG9iamVjdC5hY2NvdW50UHJvZmlsZXMpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5tYXAoZSA9PiBleHBvcnRzLkNNc2dHQ0NTdHJpa2UxNVYyTWF0Y2htYWtpbmdHQzJDbGllbnRIZWxsby5mcm9tUGFydGlhbChlKSkpIHx8IFtdO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG59O1xuZnVuY3Rpb24gY3JlYXRlQmFzZUNNc2dHQ0NTdHJpa2UxNVYyUGxheWVyT3ZlcndhdGNoQ2FzZVVwZGF0ZSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBjYXNlaWQ6IExvbmcuVVpFUk8sXG4gICAgICAgIHN1c3BlY3RpZDogMCxcbiAgICAgICAgZnJhY3Rpb25pZDogMCxcbiAgICAgICAgcnB0QWltYm90OiAwLFxuICAgICAgICBycHRXYWxsaGFjazogMCxcbiAgICAgICAgcnB0U3BlZWRoYWNrOiAwLFxuICAgICAgICBycHRUZWFtaGFybTogMCxcbiAgICAgICAgcmVhc29uOiAwXG4gICAgfTtcbn1cbmV4cG9ydHMuQ01zZ0dDQ1N0cmlrZTE1VjJQbGF5ZXJPdmVyd2F0Y2hDYXNlVXBkYXRlID0ge1xuICAgIGVuY29kZShtZXNzYWdlLCB3cml0ZXIgPSBtaW5pbWFsXzEuV3JpdGVyLmNyZWF0ZSgpKSB7XG4gICAgICAgIGlmICghbWVzc2FnZS5jYXNlaWQuaXNaZXJvKCkpIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoOCkudWludDY0KG1lc3NhZ2UuY2FzZWlkKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5zdXNwZWN0aWQgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMjQpLnVpbnQzMihtZXNzYWdlLnN1c3BlY3RpZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UuZnJhY3Rpb25pZCAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigzMikudWludDMyKG1lc3NhZ2UuZnJhY3Rpb25pZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UucnB0QWltYm90ICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDQwKS51aW50MzIobWVzc2FnZS5ycHRBaW1ib3QpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLnJwdFdhbGxoYWNrICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDQ4KS51aW50MzIobWVzc2FnZS5ycHRXYWxsaGFjayk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UucnB0U3BlZWRoYWNrICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDU2KS51aW50MzIobWVzc2FnZS5ycHRTcGVlZGhhY2spO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLnJwdFRlYW1oYXJtICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDY0KS51aW50MzIobWVzc2FnZS5ycHRUZWFtaGFybSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UucmVhc29uICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDcyKS51aW50MzIobWVzc2FnZS5yZWFzb24pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfSxcbiAgICBkZWNvZGUoaW5wdXQsIGxlbmd0aCkge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBpbnB1dCBpbnN0YW5jZW9mIG1pbmltYWxfMS5SZWFkZXIgPyBpbnB1dCA6IG5ldyBtaW5pbWFsXzEuUmVhZGVyKGlucHV0KTtcbiAgICAgICAgbGV0IGVuZCA9IGxlbmd0aCA9PT0gdW5kZWZpbmVkID8gcmVhZGVyLmxlbiA6IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ01zZ0dDQ1N0cmlrZTE1VjJQbGF5ZXJPdmVyd2F0Y2hDYXNlVXBkYXRlKCk7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBjb25zdCB0YWcgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKHRhZyA+Pj4gMykge1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5jYXNlaWQgPSByZWFkZXIudWludDY0KCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5zdXNwZWN0aWQgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5mcmFjdGlvbmlkID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UucnB0QWltYm90ID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UucnB0V2FsbGhhY2sgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNzpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5ycHRTcGVlZGhhY2sgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgODpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5ycHRUZWFtaGFybSA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA5OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnJlYXNvbiA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmVhZGVyLnNraXBUeXBlKHRhZyAmIDcpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9LFxuICAgIGZyb21QYXJ0aWFsKG9iamVjdCkge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYywgX2QsIF9lLCBfZiwgX2c7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ01zZ0dDQ1N0cmlrZTE1VjJQbGF5ZXJPdmVyd2F0Y2hDYXNlVXBkYXRlKCk7XG4gICAgICAgIG1lc3NhZ2UuY2FzZWlkID1cbiAgICAgICAgICAgIG9iamVjdC5jYXNlaWQgIT09IHVuZGVmaW5lZCAmJiBvYmplY3QuY2FzZWlkICE9PSBudWxsXG4gICAgICAgICAgICAgICAgPyBMb25nLmZyb21WYWx1ZShvYmplY3QuY2FzZWlkKVxuICAgICAgICAgICAgICAgIDogTG9uZy5VWkVSTztcbiAgICAgICAgbWVzc2FnZS5zdXNwZWN0aWQgPSAoX2EgPSBvYmplY3Quc3VzcGVjdGlkKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAwO1xuICAgICAgICBtZXNzYWdlLmZyYWN0aW9uaWQgPSAoX2IgPSBvYmplY3QuZnJhY3Rpb25pZCkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogMDtcbiAgICAgICAgbWVzc2FnZS5ycHRBaW1ib3QgPSAoX2MgPSBvYmplY3QucnB0QWltYm90KSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiAwO1xuICAgICAgICBtZXNzYWdlLnJwdFdhbGxoYWNrID0gKF9kID0gb2JqZWN0LnJwdFdhbGxoYWNrKSAhPT0gbnVsbCAmJiBfZCAhPT0gdm9pZCAwID8gX2QgOiAwO1xuICAgICAgICBtZXNzYWdlLnJwdFNwZWVkaGFjayA9IChfZSA9IG9iamVjdC5ycHRTcGVlZGhhY2spICE9PSBudWxsICYmIF9lICE9PSB2b2lkIDAgPyBfZSA6IDA7XG4gICAgICAgIG1lc3NhZ2UucnB0VGVhbWhhcm0gPSAoX2YgPSBvYmplY3QucnB0VGVhbWhhcm0pICE9PSBudWxsICYmIF9mICE9PSB2b2lkIDAgPyBfZiA6IDA7XG4gICAgICAgIG1lc3NhZ2UucmVhc29uID0gKF9nID0gb2JqZWN0LnJlYXNvbikgIT09IG51bGwgJiYgX2cgIT09IHZvaWQgMCA/IF9nIDogMDtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxufTtcbmZ1bmN0aW9uIGNyZWF0ZUJhc2VDTXNnR0NDU3RyaWtlMTVWMlBsYXllck92ZXJ3YXRjaENhc2VBc3NpZ25tZW50KCkge1xuICAgIHJldHVybiB7XG4gICAgICAgIGNhc2VpZDogTG9uZy5VWkVSTyxcbiAgICAgICAgY2FzZXVybDogXCJcIixcbiAgICAgICAgdmVyZGljdDogMCxcbiAgICAgICAgdGltZXN0YW1wOiAwLFxuICAgICAgICB0aHJvdHRsZXNlY29uZHM6IDAsXG4gICAgICAgIHN1c3BlY3RpZDogMCxcbiAgICAgICAgZnJhY3Rpb25pZDogMCxcbiAgICAgICAgbnVtcm91bmRzOiAwLFxuICAgICAgICBmcmFjdGlvbnJvdW5kczogMCxcbiAgICAgICAgc3RyZWFrY29udmljdGlvbnM6IDAsXG4gICAgICAgIHJlYXNvbjogMFxuICAgIH07XG59XG5leHBvcnRzLkNNc2dHQ0NTdHJpa2UxNVYyUGxheWVyT3ZlcndhdGNoQ2FzZUFzc2lnbm1lbnQgPSB7XG4gICAgZW5jb2RlKG1lc3NhZ2UsIHdyaXRlciA9IG1pbmltYWxfMS5Xcml0ZXIuY3JlYXRlKCkpIHtcbiAgICAgICAgaWYgKCFtZXNzYWdlLmNhc2VpZC5pc1plcm8oKSkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig4KS51aW50NjQobWVzc2FnZS5jYXNlaWQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLmNhc2V1cmwgIT09IFwiXCIpIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMTgpLnN0cmluZyhtZXNzYWdlLmNhc2V1cmwpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLnZlcmRpY3QgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMjQpLnVpbnQzMihtZXNzYWdlLnZlcmRpY3QpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLnRpbWVzdGFtcCAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigzMikudWludDMyKG1lc3NhZ2UudGltZXN0YW1wKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS50aHJvdHRsZXNlY29uZHMgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoNDApLnVpbnQzMihtZXNzYWdlLnRocm90dGxlc2Vjb25kcyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2Uuc3VzcGVjdGlkICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDQ4KS51aW50MzIobWVzc2FnZS5zdXNwZWN0aWQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLmZyYWN0aW9uaWQgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoNTYpLnVpbnQzMihtZXNzYWdlLmZyYWN0aW9uaWQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLm51bXJvdW5kcyAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig2NCkudWludDMyKG1lc3NhZ2UubnVtcm91bmRzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5mcmFjdGlvbnJvdW5kcyAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig3MikudWludDMyKG1lc3NhZ2UuZnJhY3Rpb25yb3VuZHMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLnN0cmVha2NvbnZpY3Rpb25zICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDgwKS5pbnQzMihtZXNzYWdlLnN0cmVha2NvbnZpY3Rpb25zKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5yZWFzb24gIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoODgpLnVpbnQzMihtZXNzYWdlLnJlYXNvbik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9LFxuICAgIGRlY29kZShpbnB1dCwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IGlucHV0IGluc3RhbmNlb2YgbWluaW1hbF8xLlJlYWRlciA/IGlucHV0IDogbmV3IG1pbmltYWxfMS5SZWFkZXIoaW5wdXQpO1xuICAgICAgICBsZXQgZW5kID0gbGVuZ3RoID09PSB1bmRlZmluZWQgPyByZWFkZXIubGVuIDogcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDTXNnR0NDU3RyaWtlMTVWMlBsYXllck92ZXJ3YXRjaENhc2VBc3NpZ25tZW50KCk7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBjb25zdCB0YWcgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKHRhZyA+Pj4gMykge1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5jYXNlaWQgPSByZWFkZXIudWludDY0KCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5jYXNldXJsID0gcmVhZGVyLnN0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudmVyZGljdCA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnRpbWVzdGFtcCA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnRocm90dGxlc2Vjb25kcyA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnN1c3BlY3RpZCA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA3OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmZyYWN0aW9uaWQgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgODpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5udW1yb3VuZHMgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgOTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5mcmFjdGlvbnJvdW5kcyA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAxMDpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5zdHJlYWtjb252aWN0aW9ucyA9IHJlYWRlci5pbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDExOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnJlYXNvbiA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmVhZGVyLnNraXBUeXBlKHRhZyAmIDcpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9LFxuICAgIGZyb21QYXJ0aWFsKG9iamVjdCkge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYywgX2QsIF9lLCBfZiwgX2csIF9oLCBfaiwgX2s7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ01zZ0dDQ1N0cmlrZTE1VjJQbGF5ZXJPdmVyd2F0Y2hDYXNlQXNzaWdubWVudCgpO1xuICAgICAgICBtZXNzYWdlLmNhc2VpZCA9XG4gICAgICAgICAgICBvYmplY3QuY2FzZWlkICE9PSB1bmRlZmluZWQgJiYgb2JqZWN0LmNhc2VpZCAhPT0gbnVsbFxuICAgICAgICAgICAgICAgID8gTG9uZy5mcm9tVmFsdWUob2JqZWN0LmNhc2VpZClcbiAgICAgICAgICAgICAgICA6IExvbmcuVVpFUk87XG4gICAgICAgIG1lc3NhZ2UuY2FzZXVybCA9IChfYSA9IG9iamVjdC5jYXNldXJsKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBcIlwiO1xuICAgICAgICBtZXNzYWdlLnZlcmRpY3QgPSAoX2IgPSBvYmplY3QudmVyZGljdCkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogMDtcbiAgICAgICAgbWVzc2FnZS50aW1lc3RhbXAgPSAoX2MgPSBvYmplY3QudGltZXN0YW1wKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiAwO1xuICAgICAgICBtZXNzYWdlLnRocm90dGxlc2Vjb25kcyA9IChfZCA9IG9iamVjdC50aHJvdHRsZXNlY29uZHMpICE9PSBudWxsICYmIF9kICE9PSB2b2lkIDAgPyBfZCA6IDA7XG4gICAgICAgIG1lc3NhZ2Uuc3VzcGVjdGlkID0gKF9lID0gb2JqZWN0LnN1c3BlY3RpZCkgIT09IG51bGwgJiYgX2UgIT09IHZvaWQgMCA/IF9lIDogMDtcbiAgICAgICAgbWVzc2FnZS5mcmFjdGlvbmlkID0gKF9mID0gb2JqZWN0LmZyYWN0aW9uaWQpICE9PSBudWxsICYmIF9mICE9PSB2b2lkIDAgPyBfZiA6IDA7XG4gICAgICAgIG1lc3NhZ2UubnVtcm91bmRzID0gKF9nID0gb2JqZWN0Lm51bXJvdW5kcykgIT09IG51bGwgJiYgX2cgIT09IHZvaWQgMCA/IF9nIDogMDtcbiAgICAgICAgbWVzc2FnZS5mcmFjdGlvbnJvdW5kcyA9IChfaCA9IG9iamVjdC5mcmFjdGlvbnJvdW5kcykgIT09IG51bGwgJiYgX2ggIT09IHZvaWQgMCA/IF9oIDogMDtcbiAgICAgICAgbWVzc2FnZS5zdHJlYWtjb252aWN0aW9ucyA9IChfaiA9IG9iamVjdC5zdHJlYWtjb252aWN0aW9ucykgIT09IG51bGwgJiYgX2ogIT09IHZvaWQgMCA/IF9qIDogMDtcbiAgICAgICAgbWVzc2FnZS5yZWFzb24gPSAoX2sgPSBvYmplY3QucmVhc29uKSAhPT0gbnVsbCAmJiBfayAhPT0gdm9pZCAwID8gX2sgOiAwO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG59O1xuZnVuY3Rpb24gY3JlYXRlQmFzZUNNc2dHQ0NTdHJpa2UxNVYyUGxheWVyT3ZlcndhdGNoQ2FzZVN0YXR1cygpIHtcbiAgICByZXR1cm4geyBjYXNlaWQ6IExvbmcuVVpFUk8sIHN0YXR1c2lkOiAwIH07XG59XG5leHBvcnRzLkNNc2dHQ0NTdHJpa2UxNVYyUGxheWVyT3ZlcndhdGNoQ2FzZVN0YXR1cyA9IHtcbiAgICBlbmNvZGUobWVzc2FnZSwgd3JpdGVyID0gbWluaW1hbF8xLldyaXRlci5jcmVhdGUoKSkge1xuICAgICAgICBpZiAoIW1lc3NhZ2UuY2FzZWlkLmlzWmVybygpKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDgpLnVpbnQ2NChtZXNzYWdlLmNhc2VpZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2Uuc3RhdHVzaWQgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMTYpLnVpbnQzMihtZXNzYWdlLnN0YXR1c2lkKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH0sXG4gICAgZGVjb2RlKGlucHV0LCBsZW5ndGgpIHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gaW5wdXQgaW5zdGFuY2VvZiBtaW5pbWFsXzEuUmVhZGVyID8gaW5wdXQgOiBuZXcgbWluaW1hbF8xLlJlYWRlcihpbnB1dCk7XG4gICAgICAgIGxldCBlbmQgPSBsZW5ndGggPT09IHVuZGVmaW5lZCA/IHJlYWRlci5sZW4gOiByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNNc2dHQ0NTdHJpa2UxNVYyUGxheWVyT3ZlcndhdGNoQ2FzZVN0YXR1cygpO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuY2FzZWlkID0gcmVhZGVyLnVpbnQ2NCgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Uuc3RhdHVzaWQgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJlYWRlci5za2lwVHlwZSh0YWcgJiA3KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfSxcbiAgICBmcm9tUGFydGlhbChvYmplY3QpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNNc2dHQ0NTdHJpa2UxNVYyUGxheWVyT3ZlcndhdGNoQ2FzZVN0YXR1cygpO1xuICAgICAgICBtZXNzYWdlLmNhc2VpZCA9XG4gICAgICAgICAgICBvYmplY3QuY2FzZWlkICE9PSB1bmRlZmluZWQgJiYgb2JqZWN0LmNhc2VpZCAhPT0gbnVsbFxuICAgICAgICAgICAgICAgID8gTG9uZy5mcm9tVmFsdWUob2JqZWN0LmNhc2VpZClcbiAgICAgICAgICAgICAgICA6IExvbmcuVVpFUk87XG4gICAgICAgIG1lc3NhZ2Uuc3RhdHVzaWQgPSAoX2EgPSBvYmplY3Quc3RhdHVzaWQpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IDA7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbn07XG5mdW5jdGlvbiBjcmVhdGVCYXNlQ0NsaWVudEhlYWRlck92ZXJ3YXRjaEV2aWRlbmNlKCkge1xuICAgIHJldHVybiB7IGFjY291bnRpZDogMCwgY2FzZWlkOiBMb25nLlVaRVJPIH07XG59XG5leHBvcnRzLkNDbGllbnRIZWFkZXJPdmVyd2F0Y2hFdmlkZW5jZSA9IHtcbiAgICBlbmNvZGUobWVzc2FnZSwgd3JpdGVyID0gbWluaW1hbF8xLldyaXRlci5jcmVhdGUoKSkge1xuICAgICAgICBpZiAobWVzc2FnZS5hY2NvdW50aWQgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoOCkudWludDMyKG1lc3NhZ2UuYWNjb3VudGlkKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIW1lc3NhZ2UuY2FzZWlkLmlzWmVybygpKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDE2KS51aW50NjQobWVzc2FnZS5jYXNlaWQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfSxcbiAgICBkZWNvZGUoaW5wdXQsIGxlbmd0aCkge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBpbnB1dCBpbnN0YW5jZW9mIG1pbmltYWxfMS5SZWFkZXIgPyBpbnB1dCA6IG5ldyBtaW5pbWFsXzEuUmVhZGVyKGlucHV0KTtcbiAgICAgICAgbGV0IGVuZCA9IGxlbmd0aCA9PT0gdW5kZWZpbmVkID8gcmVhZGVyLmxlbiA6IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ0NsaWVudEhlYWRlck92ZXJ3YXRjaEV2aWRlbmNlKCk7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBjb25zdCB0YWcgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKHRhZyA+Pj4gMykge1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5hY2NvdW50aWQgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5jYXNlaWQgPSByZWFkZXIudWludDY0KCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJlYWRlci5za2lwVHlwZSh0YWcgJiA3KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfSxcbiAgICBmcm9tUGFydGlhbChvYmplY3QpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNDbGllbnRIZWFkZXJPdmVyd2F0Y2hFdmlkZW5jZSgpO1xuICAgICAgICBtZXNzYWdlLmFjY291bnRpZCA9IChfYSA9IG9iamVjdC5hY2NvdW50aWQpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IDA7XG4gICAgICAgIG1lc3NhZ2UuY2FzZWlkID1cbiAgICAgICAgICAgIG9iamVjdC5jYXNlaWQgIT09IHVuZGVmaW5lZCAmJiBvYmplY3QuY2FzZWlkICE9PSBudWxsXG4gICAgICAgICAgICAgICAgPyBMb25nLmZyb21WYWx1ZShvYmplY3QuY2FzZWlkKVxuICAgICAgICAgICAgICAgIDogTG9uZy5VWkVSTztcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxufTtcbmZ1bmN0aW9uIGNyZWF0ZUJhc2VDTXNnR0NDU3RyaWtlMTVWMkdDMkNsaWVudFRleHRNc2coKSB7XG4gICAgcmV0dXJuIHsgaWQ6IDAsIHR5cGU6IDAsIHBheWxvYWQ6IG5ldyBVaW50OEFycmF5KCkgfTtcbn1cbmV4cG9ydHMuQ01zZ0dDQ1N0cmlrZTE1VjJHQzJDbGllbnRUZXh0TXNnID0ge1xuICAgIGVuY29kZShtZXNzYWdlLCB3cml0ZXIgPSBtaW5pbWFsXzEuV3JpdGVyLmNyZWF0ZSgpKSB7XG4gICAgICAgIGlmIChtZXNzYWdlLmlkICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDgpLnVpbnQzMihtZXNzYWdlLmlkKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS50eXBlICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDE2KS51aW50MzIobWVzc2FnZS50eXBlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5wYXlsb2FkLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigyNikuYnl0ZXMobWVzc2FnZS5wYXlsb2FkKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH0sXG4gICAgZGVjb2RlKGlucHV0LCBsZW5ndGgpIHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gaW5wdXQgaW5zdGFuY2VvZiBtaW5pbWFsXzEuUmVhZGVyID8gaW5wdXQgOiBuZXcgbWluaW1hbF8xLlJlYWRlcihpbnB1dCk7XG4gICAgICAgIGxldCBlbmQgPSBsZW5ndGggPT09IHVuZGVmaW5lZCA/IHJlYWRlci5sZW4gOiByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNNc2dHQ0NTdHJpa2UxNVYyR0MyQ2xpZW50VGV4dE1zZygpO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuaWQgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS50eXBlID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UucGF5bG9hZCA9IHJlYWRlci5ieXRlcygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICByZWFkZXIuc2tpcFR5cGUodGFnICYgNyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH0sXG4gICAgZnJvbVBhcnRpYWwob2JqZWN0KSB7XG4gICAgICAgIHZhciBfYSwgX2IsIF9jO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNNc2dHQ0NTdHJpa2UxNVYyR0MyQ2xpZW50VGV4dE1zZygpO1xuICAgICAgICBtZXNzYWdlLmlkID0gKF9hID0gb2JqZWN0LmlkKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAwO1xuICAgICAgICBtZXNzYWdlLnR5cGUgPSAoX2IgPSBvYmplY3QudHlwZSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogMDtcbiAgICAgICAgbWVzc2FnZS5wYXlsb2FkID0gKF9jID0gb2JqZWN0LnBheWxvYWQpICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IG5ldyBVaW50OEFycmF5KCk7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbn07XG5mdW5jdGlvbiBjcmVhdGVCYXNlQ01zZ0dDQ1N0cmlrZTE1VjJDbGllbnQyR0NUZXh0TXNnKCkge1xuICAgIHJldHVybiB7IGlkOiAwLCBhcmdzOiBbXSB9O1xufVxuZXhwb3J0cy5DTXNnR0NDU3RyaWtlMTVWMkNsaWVudDJHQ1RleHRNc2cgPSB7XG4gICAgZW5jb2RlKG1lc3NhZ2UsIHdyaXRlciA9IG1pbmltYWxfMS5Xcml0ZXIuY3JlYXRlKCkpIHtcbiAgICAgICAgaWYgKG1lc3NhZ2UuaWQgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoOCkudWludDMyKG1lc3NhZ2UuaWQpO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3QgdiBvZiBtZXNzYWdlLmFyZ3MpIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMTgpLmJ5dGVzKHYpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfSxcbiAgICBkZWNvZGUoaW5wdXQsIGxlbmd0aCkge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBpbnB1dCBpbnN0YW5jZW9mIG1pbmltYWxfMS5SZWFkZXIgPyBpbnB1dCA6IG5ldyBtaW5pbWFsXzEuUmVhZGVyKGlucHV0KTtcbiAgICAgICAgbGV0IGVuZCA9IGxlbmd0aCA9PT0gdW5kZWZpbmVkID8gcmVhZGVyLmxlbiA6IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ01zZ0dDQ1N0cmlrZTE1VjJDbGllbnQyR0NUZXh0TXNnKCk7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBjb25zdCB0YWcgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKHRhZyA+Pj4gMykge1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5pZCA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmFyZ3MucHVzaChyZWFkZXIuYnl0ZXMoKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJlYWRlci5za2lwVHlwZSh0YWcgJiA3KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfSxcbiAgICBmcm9tUGFydGlhbChvYmplY3QpIHtcbiAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDTXNnR0NDU3RyaWtlMTVWMkNsaWVudDJHQ1RleHRNc2coKTtcbiAgICAgICAgbWVzc2FnZS5pZCA9IChfYSA9IG9iamVjdC5pZCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMDtcbiAgICAgICAgbWVzc2FnZS5hcmdzID0gKChfYiA9IG9iamVjdC5hcmdzKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IubWFwKGUgPT4gZSkpIHx8IFtdO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG59O1xuZnVuY3Rpb24gY3JlYXRlQmFzZUNNc2dHQ0NTdHJpa2UxNVYyTWF0Y2hFbmRSdW5SZXdhcmREcm9wcygpIHtcbiAgICByZXR1cm4geyBzZXJ2ZXJpbmZvOiB1bmRlZmluZWQsIG1hdGNoRW5kUXVlc3REYXRhOiB1bmRlZmluZWQgfTtcbn1cbmV4cG9ydHMuQ01zZ0dDQ1N0cmlrZTE1VjJNYXRjaEVuZFJ1blJld2FyZERyb3BzID0ge1xuICAgIGVuY29kZShtZXNzYWdlLCB3cml0ZXIgPSBtaW5pbWFsXzEuV3JpdGVyLmNyZWF0ZSgpKSB7XG4gICAgICAgIGlmIChtZXNzYWdlLnNlcnZlcmluZm8gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgZXhwb3J0cy5DTXNnR0NDU3RyaWtlMTVWMk1hdGNobWFraW5nU2VydmVyUmVzZXJ2YXRpb25SZXNwb25zZS5lbmNvZGUobWVzc2FnZS5zZXJ2ZXJpbmZvLCB3cml0ZXIudWludDMyKDI2KS5mb3JrKCkpLmxkZWxpbSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLm1hdGNoRW5kUXVlc3REYXRhICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGV4cG9ydHMuQ01zZ0dDU2VydmVyUXVlc3RVcGRhdGVEYXRhLmVuY29kZShtZXNzYWdlLm1hdGNoRW5kUXVlc3REYXRhLCB3cml0ZXIudWludDMyKDM0KS5mb3JrKCkpLmxkZWxpbSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfSxcbiAgICBkZWNvZGUoaW5wdXQsIGxlbmd0aCkge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBpbnB1dCBpbnN0YW5jZW9mIG1pbmltYWxfMS5SZWFkZXIgPyBpbnB1dCA6IG5ldyBtaW5pbWFsXzEuUmVhZGVyKGlucHV0KTtcbiAgICAgICAgbGV0IGVuZCA9IGxlbmd0aCA9PT0gdW5kZWZpbmVkID8gcmVhZGVyLmxlbiA6IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ01zZ0dDQ1N0cmlrZTE1VjJNYXRjaEVuZFJ1blJld2FyZERyb3BzKCk7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBjb25zdCB0YWcgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKHRhZyA+Pj4gMykge1xuICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5zZXJ2ZXJpbmZvID1cbiAgICAgICAgICAgICAgICAgICAgICAgIGV4cG9ydHMuQ01zZ0dDQ1N0cmlrZTE1VjJNYXRjaG1ha2luZ1NlcnZlclJlc2VydmF0aW9uUmVzcG9uc2UuZGVjb2RlKHJlYWRlciwgcmVhZGVyLnVpbnQzMigpKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLm1hdGNoRW5kUXVlc3REYXRhID0gZXhwb3J0cy5DTXNnR0NTZXJ2ZXJRdWVzdFVwZGF0ZURhdGEuZGVjb2RlKHJlYWRlciwgcmVhZGVyLnVpbnQzMigpKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmVhZGVyLnNraXBUeXBlKHRhZyAmIDcpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9LFxuICAgIGZyb21QYXJ0aWFsKG9iamVjdCkge1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNNc2dHQ0NTdHJpa2UxNVYyTWF0Y2hFbmRSdW5SZXdhcmREcm9wcygpO1xuICAgICAgICBtZXNzYWdlLnNlcnZlcmluZm8gPVxuICAgICAgICAgICAgb2JqZWN0LnNlcnZlcmluZm8gIT09IHVuZGVmaW5lZCAmJiBvYmplY3Quc2VydmVyaW5mbyAhPT0gbnVsbFxuICAgICAgICAgICAgICAgID8gZXhwb3J0cy5DTXNnR0NDU3RyaWtlMTVWMk1hdGNobWFraW5nU2VydmVyUmVzZXJ2YXRpb25SZXNwb25zZS5mcm9tUGFydGlhbChvYmplY3Quc2VydmVyaW5mbylcbiAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgICAgbWVzc2FnZS5tYXRjaEVuZFF1ZXN0RGF0YSA9XG4gICAgICAgICAgICBvYmplY3QubWF0Y2hFbmRRdWVzdERhdGEgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgICAgIG9iamVjdC5tYXRjaEVuZFF1ZXN0RGF0YSAhPT0gbnVsbFxuICAgICAgICAgICAgICAgID8gZXhwb3J0cy5DTXNnR0NTZXJ2ZXJRdWVzdFVwZGF0ZURhdGEuZnJvbVBhcnRpYWwob2JqZWN0Lm1hdGNoRW5kUXVlc3REYXRhKVxuICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG59O1xuZnVuY3Rpb24gY3JlYXRlQmFzZUNFY29uSXRlbVByZXZpZXdEYXRhQmxvY2soKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgYWNjb3VudGlkOiAwLFxuICAgICAgICBpdGVtaWQ6IExvbmcuVVpFUk8sXG4gICAgICAgIGRlZmluZGV4OiAwLFxuICAgICAgICBwYWludGluZGV4OiAwLFxuICAgICAgICByYXJpdHk6IDAsXG4gICAgICAgIHF1YWxpdHk6IDAsXG4gICAgICAgIHBhaW50d2VhcjogMCxcbiAgICAgICAgcGFpbnRzZWVkOiAwLFxuICAgICAgICBraWxsZWF0ZXJzY29yZXR5cGU6IDAsXG4gICAgICAgIGtpbGxlYXRlcnZhbHVlOiAwLFxuICAgICAgICBjdXN0b21uYW1lOiBcIlwiLFxuICAgICAgICBzdGlja2VyczogW10sXG4gICAgICAgIGludmVudG9yeTogMCxcbiAgICAgICAgb3JpZ2luOiAwLFxuICAgICAgICBxdWVzdGlkOiAwLFxuICAgICAgICBkcm9wcmVhc29uOiAwLFxuICAgICAgICBtdXNpY2luZGV4OiAwLFxuICAgICAgICBlbnRpbmRleDogMFxuICAgIH07XG59XG5leHBvcnRzLkNFY29uSXRlbVByZXZpZXdEYXRhQmxvY2sgPSB7XG4gICAgZW5jb2RlKG1lc3NhZ2UsIHdyaXRlciA9IG1pbmltYWxfMS5Xcml0ZXIuY3JlYXRlKCkpIHtcbiAgICAgICAgaWYgKG1lc3NhZ2UuYWNjb3VudGlkICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDgpLnVpbnQzMihtZXNzYWdlLmFjY291bnRpZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFtZXNzYWdlLml0ZW1pZC5pc1plcm8oKSkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigxNikudWludDY0KG1lc3NhZ2UuaXRlbWlkKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5kZWZpbmRleCAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigyNCkudWludDMyKG1lc3NhZ2UuZGVmaW5kZXgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLnBhaW50aW5kZXggIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMzIpLnVpbnQzMihtZXNzYWdlLnBhaW50aW5kZXgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLnJhcml0eSAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig0MCkudWludDMyKG1lc3NhZ2UucmFyaXR5KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5xdWFsaXR5ICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDQ4KS51aW50MzIobWVzc2FnZS5xdWFsaXR5KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5wYWludHdlYXIgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoNTYpLnVpbnQzMihtZXNzYWdlLnBhaW50d2Vhcik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UucGFpbnRzZWVkICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDY0KS51aW50MzIobWVzc2FnZS5wYWludHNlZWQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLmtpbGxlYXRlcnNjb3JldHlwZSAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig3MikudWludDMyKG1lc3NhZ2Uua2lsbGVhdGVyc2NvcmV0eXBlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5raWxsZWF0ZXJ2YWx1ZSAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig4MCkudWludDMyKG1lc3NhZ2Uua2lsbGVhdGVydmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLmN1c3RvbW5hbWUgIT09IFwiXCIpIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoOTApLnN0cmluZyhtZXNzYWdlLmN1c3RvbW5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3QgdiBvZiBtZXNzYWdlLnN0aWNrZXJzKSB7XG4gICAgICAgICAgICBleHBvcnRzLkNFY29uSXRlbVByZXZpZXdEYXRhQmxvY2tfU3RpY2tlci5lbmNvZGUodiwgd3JpdGVyLnVpbnQzMig5OCkuZm9yaygpKS5sZGVsaW0oKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5pbnZlbnRvcnkgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMTA0KS51aW50MzIobWVzc2FnZS5pbnZlbnRvcnkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLm9yaWdpbiAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigxMTIpLnVpbnQzMihtZXNzYWdlLm9yaWdpbik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UucXVlc3RpZCAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigxMjApLnVpbnQzMihtZXNzYWdlLnF1ZXN0aWQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLmRyb3ByZWFzb24gIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMTI4KS51aW50MzIobWVzc2FnZS5kcm9wcmVhc29uKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5tdXNpY2luZGV4ICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDEzNikudWludDMyKG1lc3NhZ2UubXVzaWNpbmRleCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UuZW50aW5kZXggIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMTQ0KS5pbnQzMihtZXNzYWdlLmVudGluZGV4KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH0sXG4gICAgZGVjb2RlKGlucHV0LCBsZW5ndGgpIHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gaW5wdXQgaW5zdGFuY2VvZiBtaW5pbWFsXzEuUmVhZGVyID8gaW5wdXQgOiBuZXcgbWluaW1hbF8xLlJlYWRlcihpbnB1dCk7XG4gICAgICAgIGxldCBlbmQgPSBsZW5ndGggPT09IHVuZGVmaW5lZCA/IHJlYWRlci5sZW4gOiByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNFY29uSXRlbVByZXZpZXdEYXRhQmxvY2soKTtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhZyA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgIHN3aXRjaCAodGFnID4+PiAzKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmFjY291bnRpZCA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLml0ZW1pZCA9IHJlYWRlci51aW50NjQoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmRlZmluZGV4ID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UucGFpbnRpbmRleCA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnJhcml0eSA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnF1YWxpdHkgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNzpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5wYWludHdlYXIgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgODpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5wYWludHNlZWQgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgOTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5raWxsZWF0ZXJzY29yZXR5cGUgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMTA6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Uua2lsbGVhdGVydmFsdWUgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMTE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuY3VzdG9tbmFtZSA9IHJlYWRlci5zdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAxMjpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5zdGlja2Vycy5wdXNoKGV4cG9ydHMuQ0Vjb25JdGVtUHJldmlld0RhdGFCbG9ja19TdGlja2VyLmRlY29kZShyZWFkZXIsIHJlYWRlci51aW50MzIoKSkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDEzOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmludmVudG9yeSA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAxNDpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5vcmlnaW4gPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMTU6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UucXVlc3RpZCA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAxNjpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5kcm9wcmVhc29uID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDE3OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLm11c2ljaW5kZXggPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMTg6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZW50aW5kZXggPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmVhZGVyLnNraXBUeXBlKHRhZyAmIDcpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9LFxuICAgIGZyb21QYXJ0aWFsKG9iamVjdCkge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYywgX2QsIF9lLCBfZiwgX2csIF9oLCBfaiwgX2ssIF9sLCBfbSwgX28sIF9wLCBfcSwgX3IsIF9zO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNFY29uSXRlbVByZXZpZXdEYXRhQmxvY2soKTtcbiAgICAgICAgbWVzc2FnZS5hY2NvdW50aWQgPSAoX2EgPSBvYmplY3QuYWNjb3VudGlkKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAwO1xuICAgICAgICBtZXNzYWdlLml0ZW1pZCA9XG4gICAgICAgICAgICBvYmplY3QuaXRlbWlkICE9PSB1bmRlZmluZWQgJiYgb2JqZWN0Lml0ZW1pZCAhPT0gbnVsbFxuICAgICAgICAgICAgICAgID8gTG9uZy5mcm9tVmFsdWUob2JqZWN0Lml0ZW1pZClcbiAgICAgICAgICAgICAgICA6IExvbmcuVVpFUk87XG4gICAgICAgIG1lc3NhZ2UuZGVmaW5kZXggPSAoX2IgPSBvYmplY3QuZGVmaW5kZXgpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IDA7XG4gICAgICAgIG1lc3NhZ2UucGFpbnRpbmRleCA9IChfYyA9IG9iamVjdC5wYWludGluZGV4KSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiAwO1xuICAgICAgICBtZXNzYWdlLnJhcml0eSA9IChfZCA9IG9iamVjdC5yYXJpdHkpICE9PSBudWxsICYmIF9kICE9PSB2b2lkIDAgPyBfZCA6IDA7XG4gICAgICAgIG1lc3NhZ2UucXVhbGl0eSA9IChfZSA9IG9iamVjdC5xdWFsaXR5KSAhPT0gbnVsbCAmJiBfZSAhPT0gdm9pZCAwID8gX2UgOiAwO1xuICAgICAgICBtZXNzYWdlLnBhaW50d2VhciA9IChfZiA9IG9iamVjdC5wYWludHdlYXIpICE9PSBudWxsICYmIF9mICE9PSB2b2lkIDAgPyBfZiA6IDA7XG4gICAgICAgIG1lc3NhZ2UucGFpbnRzZWVkID0gKF9nID0gb2JqZWN0LnBhaW50c2VlZCkgIT09IG51bGwgJiYgX2cgIT09IHZvaWQgMCA/IF9nIDogMDtcbiAgICAgICAgbWVzc2FnZS5raWxsZWF0ZXJzY29yZXR5cGUgPSAoX2ggPSBvYmplY3Qua2lsbGVhdGVyc2NvcmV0eXBlKSAhPT0gbnVsbCAmJiBfaCAhPT0gdm9pZCAwID8gX2ggOiAwO1xuICAgICAgICBtZXNzYWdlLmtpbGxlYXRlcnZhbHVlID0gKF9qID0gb2JqZWN0LmtpbGxlYXRlcnZhbHVlKSAhPT0gbnVsbCAmJiBfaiAhPT0gdm9pZCAwID8gX2ogOiAwO1xuICAgICAgICBtZXNzYWdlLmN1c3RvbW5hbWUgPSAoX2sgPSBvYmplY3QuY3VzdG9tbmFtZSkgIT09IG51bGwgJiYgX2sgIT09IHZvaWQgMCA/IF9rIDogXCJcIjtcbiAgICAgICAgbWVzc2FnZS5zdGlja2VycyA9XG4gICAgICAgICAgICAoKF9sID0gb2JqZWN0LnN0aWNrZXJzKSA9PT0gbnVsbCB8fCBfbCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2wubWFwKGUgPT4gZXhwb3J0cy5DRWNvbkl0ZW1QcmV2aWV3RGF0YUJsb2NrX1N0aWNrZXIuZnJvbVBhcnRpYWwoZSkpKSB8fCBbXTtcbiAgICAgICAgbWVzc2FnZS5pbnZlbnRvcnkgPSAoX20gPSBvYmplY3QuaW52ZW50b3J5KSAhPT0gbnVsbCAmJiBfbSAhPT0gdm9pZCAwID8gX20gOiAwO1xuICAgICAgICBtZXNzYWdlLm9yaWdpbiA9IChfbyA9IG9iamVjdC5vcmlnaW4pICE9PSBudWxsICYmIF9vICE9PSB2b2lkIDAgPyBfbyA6IDA7XG4gICAgICAgIG1lc3NhZ2UucXVlc3RpZCA9IChfcCA9IG9iamVjdC5xdWVzdGlkKSAhPT0gbnVsbCAmJiBfcCAhPT0gdm9pZCAwID8gX3AgOiAwO1xuICAgICAgICBtZXNzYWdlLmRyb3ByZWFzb24gPSAoX3EgPSBvYmplY3QuZHJvcHJlYXNvbikgIT09IG51bGwgJiYgX3EgIT09IHZvaWQgMCA/IF9xIDogMDtcbiAgICAgICAgbWVzc2FnZS5tdXNpY2luZGV4ID0gKF9yID0gb2JqZWN0Lm11c2ljaW5kZXgpICE9PSBudWxsICYmIF9yICE9PSB2b2lkIDAgPyBfciA6IDA7XG4gICAgICAgIG1lc3NhZ2UuZW50aW5kZXggPSAoX3MgPSBvYmplY3QuZW50aW5kZXgpICE9PSBudWxsICYmIF9zICE9PSB2b2lkIDAgPyBfcyA6IDA7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbn07XG5mdW5jdGlvbiBjcmVhdGVCYXNlQ0Vjb25JdGVtUHJldmlld0RhdGFCbG9ja19TdGlja2VyKCkge1xuICAgIHJldHVybiB7IHNsb3Q6IDAsIHN0aWNrZXJJZDogMCwgd2VhcjogMCwgc2NhbGU6IDAsIHJvdGF0aW9uOiAwLCB0aW50SWQ6IDAgfTtcbn1cbmV4cG9ydHMuQ0Vjb25JdGVtUHJldmlld0RhdGFCbG9ja19TdGlja2VyID0ge1xuICAgIGVuY29kZShtZXNzYWdlLCB3cml0ZXIgPSBtaW5pbWFsXzEuV3JpdGVyLmNyZWF0ZSgpKSB7XG4gICAgICAgIGlmIChtZXNzYWdlLnNsb3QgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoOCkudWludDMyKG1lc3NhZ2Uuc2xvdCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2Uuc3RpY2tlcklkICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDE2KS51aW50MzIobWVzc2FnZS5zdGlja2VySWQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLndlYXIgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMjkpLmZsb2F0KG1lc3NhZ2Uud2Vhcik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2Uuc2NhbGUgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMzcpLmZsb2F0KG1lc3NhZ2Uuc2NhbGUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLnJvdGF0aW9uICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDQ1KS5mbG9hdChtZXNzYWdlLnJvdGF0aW9uKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS50aW50SWQgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoNDgpLnVpbnQzMihtZXNzYWdlLnRpbnRJZCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9LFxuICAgIGRlY29kZShpbnB1dCwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IGlucHV0IGluc3RhbmNlb2YgbWluaW1hbF8xLlJlYWRlciA/IGlucHV0IDogbmV3IG1pbmltYWxfMS5SZWFkZXIoaW5wdXQpO1xuICAgICAgICBsZXQgZW5kID0gbGVuZ3RoID09PSB1bmRlZmluZWQgPyByZWFkZXIubGVuIDogcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDRWNvbkl0ZW1QcmV2aWV3RGF0YUJsb2NrX1N0aWNrZXIoKTtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhZyA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgIHN3aXRjaCAodGFnID4+PiAzKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnNsb3QgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5zdGlja2VySWQgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS53ZWFyID0gcmVhZGVyLmZsb2F0KCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5zY2FsZSA9IHJlYWRlci5mbG9hdCgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Uucm90YXRpb24gPSByZWFkZXIuZmxvYXQoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnRpbnRJZCA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmVhZGVyLnNraXBUeXBlKHRhZyAmIDcpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9LFxuICAgIGZyb21QYXJ0aWFsKG9iamVjdCkge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYywgX2QsIF9lLCBfZjtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDRWNvbkl0ZW1QcmV2aWV3RGF0YUJsb2NrX1N0aWNrZXIoKTtcbiAgICAgICAgbWVzc2FnZS5zbG90ID0gKF9hID0gb2JqZWN0LnNsb3QpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IDA7XG4gICAgICAgIG1lc3NhZ2Uuc3RpY2tlcklkID0gKF9iID0gb2JqZWN0LnN0aWNrZXJJZCkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogMDtcbiAgICAgICAgbWVzc2FnZS53ZWFyID0gKF9jID0gb2JqZWN0LndlYXIpICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IDA7XG4gICAgICAgIG1lc3NhZ2Uuc2NhbGUgPSAoX2QgPSBvYmplY3Quc2NhbGUpICE9PSBudWxsICYmIF9kICE9PSB2b2lkIDAgPyBfZCA6IDA7XG4gICAgICAgIG1lc3NhZ2Uucm90YXRpb24gPSAoX2UgPSBvYmplY3Qucm90YXRpb24pICE9PSBudWxsICYmIF9lICE9PSB2b2lkIDAgPyBfZSA6IDA7XG4gICAgICAgIG1lc3NhZ2UudGludElkID0gKF9mID0gb2JqZWN0LnRpbnRJZCkgIT09IG51bGwgJiYgX2YgIT09IHZvaWQgMCA/IF9mIDogMDtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxufTtcbmZ1bmN0aW9uIGNyZWF0ZUJhc2VDTXNnR0NDU3RyaWtlMTVWMk1hdGNoRW5kUmV3YXJkRHJvcHNOb3RpZmljYXRpb24oKSB7XG4gICAgcmV0dXJuIHsgaXRlbWluZm86IHVuZGVmaW5lZCB9O1xufVxuZXhwb3J0cy5DTXNnR0NDU3RyaWtlMTVWMk1hdGNoRW5kUmV3YXJkRHJvcHNOb3RpZmljYXRpb24gPSB7XG4gICAgZW5jb2RlKG1lc3NhZ2UsIHdyaXRlciA9IG1pbmltYWxfMS5Xcml0ZXIuY3JlYXRlKCkpIHtcbiAgICAgICAgaWYgKG1lc3NhZ2UuaXRlbWluZm8gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgZXhwb3J0cy5DRWNvbkl0ZW1QcmV2aWV3RGF0YUJsb2NrLmVuY29kZShtZXNzYWdlLml0ZW1pbmZvLCB3cml0ZXIudWludDMyKDUwKS5mb3JrKCkpLmxkZWxpbSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfSxcbiAgICBkZWNvZGUoaW5wdXQsIGxlbmd0aCkge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBpbnB1dCBpbnN0YW5jZW9mIG1pbmltYWxfMS5SZWFkZXIgPyBpbnB1dCA6IG5ldyBtaW5pbWFsXzEuUmVhZGVyKGlucHV0KTtcbiAgICAgICAgbGV0IGVuZCA9IGxlbmd0aCA9PT0gdW5kZWZpbmVkID8gcmVhZGVyLmxlbiA6IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ01zZ0dDQ1N0cmlrZTE1VjJNYXRjaEVuZFJld2FyZERyb3BzTm90aWZpY2F0aW9uKCk7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBjb25zdCB0YWcgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKHRhZyA+Pj4gMykge1xuICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5pdGVtaW5mbyA9IGV4cG9ydHMuQ0Vjb25JdGVtUHJldmlld0RhdGFCbG9jay5kZWNvZGUocmVhZGVyLCByZWFkZXIudWludDMyKCkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICByZWFkZXIuc2tpcFR5cGUodGFnICYgNyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH0sXG4gICAgZnJvbVBhcnRpYWwob2JqZWN0KSB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ01zZ0dDQ1N0cmlrZTE1VjJNYXRjaEVuZFJld2FyZERyb3BzTm90aWZpY2F0aW9uKCk7XG4gICAgICAgIG1lc3NhZ2UuaXRlbWluZm8gPVxuICAgICAgICAgICAgb2JqZWN0Lml0ZW1pbmZvICE9PSB1bmRlZmluZWQgJiYgb2JqZWN0Lml0ZW1pbmZvICE9PSBudWxsXG4gICAgICAgICAgICAgICAgPyBleHBvcnRzLkNFY29uSXRlbVByZXZpZXdEYXRhQmxvY2suZnJvbVBhcnRpYWwob2JqZWN0Lml0ZW1pbmZvKVxuICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG59O1xuZnVuY3Rpb24gY3JlYXRlQmFzZUNNc2dJdGVtQWNrbm93bGVkZ2VkKCkge1xuICAgIHJldHVybiB7IGl0ZW1pbmZvOiB1bmRlZmluZWQgfTtcbn1cbmV4cG9ydHMuQ01zZ0l0ZW1BY2tub3dsZWRnZWQgPSB7XG4gICAgZW5jb2RlKG1lc3NhZ2UsIHdyaXRlciA9IG1pbmltYWxfMS5Xcml0ZXIuY3JlYXRlKCkpIHtcbiAgICAgICAgaWYgKG1lc3NhZ2UuaXRlbWluZm8gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgZXhwb3J0cy5DRWNvbkl0ZW1QcmV2aWV3RGF0YUJsb2NrLmVuY29kZShtZXNzYWdlLml0ZW1pbmZvLCB3cml0ZXIudWludDMyKDEwKS5mb3JrKCkpLmxkZWxpbSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfSxcbiAgICBkZWNvZGUoaW5wdXQsIGxlbmd0aCkge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBpbnB1dCBpbnN0YW5jZW9mIG1pbmltYWxfMS5SZWFkZXIgPyBpbnB1dCA6IG5ldyBtaW5pbWFsXzEuUmVhZGVyKGlucHV0KTtcbiAgICAgICAgbGV0IGVuZCA9IGxlbmd0aCA9PT0gdW5kZWZpbmVkID8gcmVhZGVyLmxlbiA6IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ01zZ0l0ZW1BY2tub3dsZWRnZWQoKTtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhZyA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgIHN3aXRjaCAodGFnID4+PiAzKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLml0ZW1pbmZvID0gZXhwb3J0cy5DRWNvbkl0ZW1QcmV2aWV3RGF0YUJsb2NrLmRlY29kZShyZWFkZXIsIHJlYWRlci51aW50MzIoKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJlYWRlci5za2lwVHlwZSh0YWcgJiA3KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfSxcbiAgICBmcm9tUGFydGlhbChvYmplY3QpIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDTXNnSXRlbUFja25vd2xlZGdlZCgpO1xuICAgICAgICBtZXNzYWdlLml0ZW1pbmZvID1cbiAgICAgICAgICAgIG9iamVjdC5pdGVtaW5mbyAhPT0gdW5kZWZpbmVkICYmIG9iamVjdC5pdGVtaW5mbyAhPT0gbnVsbFxuICAgICAgICAgICAgICAgID8gZXhwb3J0cy5DRWNvbkl0ZW1QcmV2aWV3RGF0YUJsb2NrLmZyb21QYXJ0aWFsKG9iamVjdC5pdGVtaW5mbylcbiAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxufTtcbmZ1bmN0aW9uIGNyZWF0ZUJhc2VDTXNnR0NDU3RyaWtlMTVWMkNsaWVudDJHQ0Vjb25QcmV2aWV3RGF0YUJsb2NrUmVxdWVzdCgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBwYXJhbVM6IExvbmcuVVpFUk8sXG4gICAgICAgIHBhcmFtQTogTG9uZy5VWkVSTyxcbiAgICAgICAgcGFyYW1EOiBMb25nLlVaRVJPLFxuICAgICAgICBwYXJhbU06IExvbmcuVVpFUk9cbiAgICB9O1xufVxuZXhwb3J0cy5DTXNnR0NDU3RyaWtlMTVWMkNsaWVudDJHQ0Vjb25QcmV2aWV3RGF0YUJsb2NrUmVxdWVzdCA9IHtcbiAgICBlbmNvZGUobWVzc2FnZSwgd3JpdGVyID0gbWluaW1hbF8xLldyaXRlci5jcmVhdGUoKSkge1xuICAgICAgICBpZiAoIW1lc3NhZ2UucGFyYW1TLmlzWmVybygpKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDgpLnVpbnQ2NChtZXNzYWdlLnBhcmFtUyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFtZXNzYWdlLnBhcmFtQS5pc1plcm8oKSkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigxNikudWludDY0KG1lc3NhZ2UucGFyYW1BKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIW1lc3NhZ2UucGFyYW1ELmlzWmVybygpKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDI0KS51aW50NjQobWVzc2FnZS5wYXJhbUQpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghbWVzc2FnZS5wYXJhbU0uaXNaZXJvKCkpIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMzIpLnVpbnQ2NChtZXNzYWdlLnBhcmFtTSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9LFxuICAgIGRlY29kZShpbnB1dCwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IGlucHV0IGluc3RhbmNlb2YgbWluaW1hbF8xLlJlYWRlciA/IGlucHV0IDogbmV3IG1pbmltYWxfMS5SZWFkZXIoaW5wdXQpO1xuICAgICAgICBsZXQgZW5kID0gbGVuZ3RoID09PSB1bmRlZmluZWQgPyByZWFkZXIubGVuIDogcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDTXNnR0NDU3RyaWtlMTVWMkNsaWVudDJHQ0Vjb25QcmV2aWV3RGF0YUJsb2NrUmVxdWVzdCgpO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UucGFyYW1TID0gcmVhZGVyLnVpbnQ2NCgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UucGFyYW1BID0gcmVhZGVyLnVpbnQ2NCgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UucGFyYW1EID0gcmVhZGVyLnVpbnQ2NCgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UucGFyYW1NID0gcmVhZGVyLnVpbnQ2NCgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICByZWFkZXIuc2tpcFR5cGUodGFnICYgNyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH0sXG4gICAgZnJvbVBhcnRpYWwob2JqZWN0KSB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ01zZ0dDQ1N0cmlrZTE1VjJDbGllbnQyR0NFY29uUHJldmlld0RhdGFCbG9ja1JlcXVlc3QoKTtcbiAgICAgICAgbWVzc2FnZS5wYXJhbVMgPVxuICAgICAgICAgICAgb2JqZWN0LnBhcmFtUyAhPT0gdW5kZWZpbmVkICYmIG9iamVjdC5wYXJhbVMgIT09IG51bGxcbiAgICAgICAgICAgICAgICA/IExvbmcuZnJvbVZhbHVlKG9iamVjdC5wYXJhbVMpXG4gICAgICAgICAgICAgICAgOiBMb25nLlVaRVJPO1xuICAgICAgICBtZXNzYWdlLnBhcmFtQSA9XG4gICAgICAgICAgICBvYmplY3QucGFyYW1BICE9PSB1bmRlZmluZWQgJiYgb2JqZWN0LnBhcmFtQSAhPT0gbnVsbFxuICAgICAgICAgICAgICAgID8gTG9uZy5mcm9tVmFsdWUob2JqZWN0LnBhcmFtQSlcbiAgICAgICAgICAgICAgICA6IExvbmcuVVpFUk87XG4gICAgICAgIG1lc3NhZ2UucGFyYW1EID1cbiAgICAgICAgICAgIG9iamVjdC5wYXJhbUQgIT09IHVuZGVmaW5lZCAmJiBvYmplY3QucGFyYW1EICE9PSBudWxsXG4gICAgICAgICAgICAgICAgPyBMb25nLmZyb21WYWx1ZShvYmplY3QucGFyYW1EKVxuICAgICAgICAgICAgICAgIDogTG9uZy5VWkVSTztcbiAgICAgICAgbWVzc2FnZS5wYXJhbU0gPVxuICAgICAgICAgICAgb2JqZWN0LnBhcmFtTSAhPT0gdW5kZWZpbmVkICYmIG9iamVjdC5wYXJhbU0gIT09IG51bGxcbiAgICAgICAgICAgICAgICA/IExvbmcuZnJvbVZhbHVlKG9iamVjdC5wYXJhbU0pXG4gICAgICAgICAgICAgICAgOiBMb25nLlVaRVJPO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG59O1xuZnVuY3Rpb24gY3JlYXRlQmFzZUNNc2dHQ0NTdHJpa2UxNVYyQ2xpZW50MkdDRWNvblByZXZpZXdEYXRhQmxvY2tSZXNwb25zZSgpIHtcbiAgICByZXR1cm4geyBpdGVtaW5mbzogdW5kZWZpbmVkIH07XG59XG5leHBvcnRzLkNNc2dHQ0NTdHJpa2UxNVYyQ2xpZW50MkdDRWNvblByZXZpZXdEYXRhQmxvY2tSZXNwb25zZSA9IHtcbiAgICBlbmNvZGUobWVzc2FnZSwgd3JpdGVyID0gbWluaW1hbF8xLldyaXRlci5jcmVhdGUoKSkge1xuICAgICAgICBpZiAobWVzc2FnZS5pdGVtaW5mbyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBleHBvcnRzLkNFY29uSXRlbVByZXZpZXdEYXRhQmxvY2suZW5jb2RlKG1lc3NhZ2UuaXRlbWluZm8sIHdyaXRlci51aW50MzIoMTApLmZvcmsoKSkubGRlbGltKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9LFxuICAgIGRlY29kZShpbnB1dCwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IGlucHV0IGluc3RhbmNlb2YgbWluaW1hbF8xLlJlYWRlciA/IGlucHV0IDogbmV3IG1pbmltYWxfMS5SZWFkZXIoaW5wdXQpO1xuICAgICAgICBsZXQgZW5kID0gbGVuZ3RoID09PSB1bmRlZmluZWQgPyByZWFkZXIubGVuIDogcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDTXNnR0NDU3RyaWtlMTVWMkNsaWVudDJHQ0Vjb25QcmV2aWV3RGF0YUJsb2NrUmVzcG9uc2UoKTtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhZyA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgIHN3aXRjaCAodGFnID4+PiAzKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLml0ZW1pbmZvID0gZXhwb3J0cy5DRWNvbkl0ZW1QcmV2aWV3RGF0YUJsb2NrLmRlY29kZShyZWFkZXIsIHJlYWRlci51aW50MzIoKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJlYWRlci5za2lwVHlwZSh0YWcgJiA3KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfSxcbiAgICBmcm9tUGFydGlhbChvYmplY3QpIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDTXNnR0NDU3RyaWtlMTVWMkNsaWVudDJHQ0Vjb25QcmV2aWV3RGF0YUJsb2NrUmVzcG9uc2UoKTtcbiAgICAgICAgbWVzc2FnZS5pdGVtaW5mbyA9XG4gICAgICAgICAgICBvYmplY3QuaXRlbWluZm8gIT09IHVuZGVmaW5lZCAmJiBvYmplY3QuaXRlbWluZm8gIT09IG51bGxcbiAgICAgICAgICAgICAgICA/IGV4cG9ydHMuQ0Vjb25JdGVtUHJldmlld0RhdGFCbG9jay5mcm9tUGFydGlhbChvYmplY3QuaXRlbWluZm8pXG4gICAgICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbn07XG5mdW5jdGlvbiBjcmVhdGVCYXNlQ01zZ0dDQ1N0cmlrZTE1VjJNYXRjaExpc3RSZXF1ZXN0Q3VycmVudExpdmVHYW1lcygpIHtcbiAgICByZXR1cm4ge307XG59XG5leHBvcnRzLkNNc2dHQ0NTdHJpa2UxNVYyTWF0Y2hMaXN0UmVxdWVzdEN1cnJlbnRMaXZlR2FtZXMgPSB7XG4gICAgZW5jb2RlKF8sIHdyaXRlciA9IG1pbmltYWxfMS5Xcml0ZXIuY3JlYXRlKCkpIHtcbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9LFxuICAgIGRlY29kZShpbnB1dCwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IGlucHV0IGluc3RhbmNlb2YgbWluaW1hbF8xLlJlYWRlciA/IGlucHV0IDogbmV3IG1pbmltYWxfMS5SZWFkZXIoaW5wdXQpO1xuICAgICAgICBsZXQgZW5kID0gbGVuZ3RoID09PSB1bmRlZmluZWQgPyByZWFkZXIubGVuIDogcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDTXNnR0NDU3RyaWtlMTVWMk1hdGNoTGlzdFJlcXVlc3RDdXJyZW50TGl2ZUdhbWVzKCk7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBjb25zdCB0YWcgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKHRhZyA+Pj4gMykge1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJlYWRlci5za2lwVHlwZSh0YWcgJiA3KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfSxcbiAgICBmcm9tUGFydGlhbChfKSB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ01zZ0dDQ1N0cmlrZTE1VjJNYXRjaExpc3RSZXF1ZXN0Q3VycmVudExpdmVHYW1lcygpO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG59O1xuZnVuY3Rpb24gY3JlYXRlQmFzZUNNc2dHQ0NTdHJpa2UxNVYyTWF0Y2hMaXN0UmVxdWVzdExpdmVHYW1lRm9yVXNlcigpIHtcbiAgICByZXR1cm4geyBhY2NvdW50aWQ6IDAgfTtcbn1cbmV4cG9ydHMuQ01zZ0dDQ1N0cmlrZTE1VjJNYXRjaExpc3RSZXF1ZXN0TGl2ZUdhbWVGb3JVc2VyID0ge1xuICAgIGVuY29kZShtZXNzYWdlLCB3cml0ZXIgPSBtaW5pbWFsXzEuV3JpdGVyLmNyZWF0ZSgpKSB7XG4gICAgICAgIGlmIChtZXNzYWdlLmFjY291bnRpZCAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig4KS51aW50MzIobWVzc2FnZS5hY2NvdW50aWQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfSxcbiAgICBkZWNvZGUoaW5wdXQsIGxlbmd0aCkge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBpbnB1dCBpbnN0YW5jZW9mIG1pbmltYWxfMS5SZWFkZXIgPyBpbnB1dCA6IG5ldyBtaW5pbWFsXzEuUmVhZGVyKGlucHV0KTtcbiAgICAgICAgbGV0IGVuZCA9IGxlbmd0aCA9PT0gdW5kZWZpbmVkID8gcmVhZGVyLmxlbiA6IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ01zZ0dDQ1N0cmlrZTE1VjJNYXRjaExpc3RSZXF1ZXN0TGl2ZUdhbWVGb3JVc2VyKCk7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBjb25zdCB0YWcgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKHRhZyA+Pj4gMykge1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5hY2NvdW50aWQgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJlYWRlci5za2lwVHlwZSh0YWcgJiA3KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfSxcbiAgICBmcm9tUGFydGlhbChvYmplY3QpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNNc2dHQ0NTdHJpa2UxNVYyTWF0Y2hMaXN0UmVxdWVzdExpdmVHYW1lRm9yVXNlcigpO1xuICAgICAgICBtZXNzYWdlLmFjY291bnRpZCA9IChfYSA9IG9iamVjdC5hY2NvdW50aWQpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IDA7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbn07XG5mdW5jdGlvbiBjcmVhdGVCYXNlQ01zZ0dDQ1N0cmlrZTE1VjJNYXRjaExpc3RSZXF1ZXN0UmVjZW50VXNlckdhbWVzKCkge1xuICAgIHJldHVybiB7IGFjY291bnRpZDogMCB9O1xufVxuZXhwb3J0cy5DTXNnR0NDU3RyaWtlMTVWMk1hdGNoTGlzdFJlcXVlc3RSZWNlbnRVc2VyR2FtZXMgPSB7XG4gICAgZW5jb2RlKG1lc3NhZ2UsIHdyaXRlciA9IG1pbmltYWxfMS5Xcml0ZXIuY3JlYXRlKCkpIHtcbiAgICAgICAgaWYgKG1lc3NhZ2UuYWNjb3VudGlkICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDgpLnVpbnQzMihtZXNzYWdlLmFjY291bnRpZCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9LFxuICAgIGRlY29kZShpbnB1dCwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IGlucHV0IGluc3RhbmNlb2YgbWluaW1hbF8xLlJlYWRlciA/IGlucHV0IDogbmV3IG1pbmltYWxfMS5SZWFkZXIoaW5wdXQpO1xuICAgICAgICBsZXQgZW5kID0gbGVuZ3RoID09PSB1bmRlZmluZWQgPyByZWFkZXIubGVuIDogcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDTXNnR0NDU3RyaWtlMTVWMk1hdGNoTGlzdFJlcXVlc3RSZWNlbnRVc2VyR2FtZXMoKTtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhZyA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgIHN3aXRjaCAodGFnID4+PiAzKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmFjY291bnRpZCA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmVhZGVyLnNraXBUeXBlKHRhZyAmIDcpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9LFxuICAgIGZyb21QYXJ0aWFsKG9iamVjdCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ01zZ0dDQ1N0cmlrZTE1VjJNYXRjaExpc3RSZXF1ZXN0UmVjZW50VXNlckdhbWVzKCk7XG4gICAgICAgIG1lc3NhZ2UuYWNjb3VudGlkID0gKF9hID0gb2JqZWN0LmFjY291bnRpZCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMDtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxufTtcbmZ1bmN0aW9uIGNyZWF0ZUJhc2VDTXNnR0NDU3RyaWtlMTVWMk1hdGNoTGlzdFJlcXVlc3RUb3VybmFtZW50R2FtZXMoKSB7XG4gICAgcmV0dXJuIHsgZXZlbnRpZDogMCB9O1xufVxuZXhwb3J0cy5DTXNnR0NDU3RyaWtlMTVWMk1hdGNoTGlzdFJlcXVlc3RUb3VybmFtZW50R2FtZXMgPSB7XG4gICAgZW5jb2RlKG1lc3NhZ2UsIHdyaXRlciA9IG1pbmltYWxfMS5Xcml0ZXIuY3JlYXRlKCkpIHtcbiAgICAgICAgaWYgKG1lc3NhZ2UuZXZlbnRpZCAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig4KS5pbnQzMihtZXNzYWdlLmV2ZW50aWQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfSxcbiAgICBkZWNvZGUoaW5wdXQsIGxlbmd0aCkge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBpbnB1dCBpbnN0YW5jZW9mIG1pbmltYWxfMS5SZWFkZXIgPyBpbnB1dCA6IG5ldyBtaW5pbWFsXzEuUmVhZGVyKGlucHV0KTtcbiAgICAgICAgbGV0IGVuZCA9IGxlbmd0aCA9PT0gdW5kZWZpbmVkID8gcmVhZGVyLmxlbiA6IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ01zZ0dDQ1N0cmlrZTE1VjJNYXRjaExpc3RSZXF1ZXN0VG91cm5hbWVudEdhbWVzKCk7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBjb25zdCB0YWcgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKHRhZyA+Pj4gMykge1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5ldmVudGlkID0gcmVhZGVyLmludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJlYWRlci5za2lwVHlwZSh0YWcgJiA3KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfSxcbiAgICBmcm9tUGFydGlhbChvYmplY3QpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNNc2dHQ0NTdHJpa2UxNVYyTWF0Y2hMaXN0UmVxdWVzdFRvdXJuYW1lbnRHYW1lcygpO1xuICAgICAgICBtZXNzYWdlLmV2ZW50aWQgPSAoX2EgPSBvYmplY3QuZXZlbnRpZCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMDtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxufTtcbmZ1bmN0aW9uIGNyZWF0ZUJhc2VDTXNnR0NDU3RyaWtlMTVWMk1hdGNoTGlzdFJlcXVlc3RGdWxsR2FtZUluZm8oKSB7XG4gICAgcmV0dXJuIHsgbWF0Y2hpZDogTG9uZy5VWkVSTywgb3V0Y29tZWlkOiBMb25nLlVaRVJPLCB0b2tlbjogMCB9O1xufVxuZXhwb3J0cy5DTXNnR0NDU3RyaWtlMTVWMk1hdGNoTGlzdFJlcXVlc3RGdWxsR2FtZUluZm8gPSB7XG4gICAgZW5jb2RlKG1lc3NhZ2UsIHdyaXRlciA9IG1pbmltYWxfMS5Xcml0ZXIuY3JlYXRlKCkpIHtcbiAgICAgICAgaWYgKCFtZXNzYWdlLm1hdGNoaWQuaXNaZXJvKCkpIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoOCkudWludDY0KG1lc3NhZ2UubWF0Y2hpZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFtZXNzYWdlLm91dGNvbWVpZC5pc1plcm8oKSkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigxNikudWludDY0KG1lc3NhZ2Uub3V0Y29tZWlkKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS50b2tlbiAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigyNCkudWludDMyKG1lc3NhZ2UudG9rZW4pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfSxcbiAgICBkZWNvZGUoaW5wdXQsIGxlbmd0aCkge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBpbnB1dCBpbnN0YW5jZW9mIG1pbmltYWxfMS5SZWFkZXIgPyBpbnB1dCA6IG5ldyBtaW5pbWFsXzEuUmVhZGVyKGlucHV0KTtcbiAgICAgICAgbGV0IGVuZCA9IGxlbmd0aCA9PT0gdW5kZWZpbmVkID8gcmVhZGVyLmxlbiA6IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ01zZ0dDQ1N0cmlrZTE1VjJNYXRjaExpc3RSZXF1ZXN0RnVsbEdhbWVJbmZvKCk7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBjb25zdCB0YWcgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKHRhZyA+Pj4gMykge1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5tYXRjaGlkID0gcmVhZGVyLnVpbnQ2NCgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Uub3V0Y29tZWlkID0gcmVhZGVyLnVpbnQ2NCgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudG9rZW4gPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJlYWRlci5za2lwVHlwZSh0YWcgJiA3KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfSxcbiAgICBmcm9tUGFydGlhbChvYmplY3QpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNNc2dHQ0NTdHJpa2UxNVYyTWF0Y2hMaXN0UmVxdWVzdEZ1bGxHYW1lSW5mbygpO1xuICAgICAgICBtZXNzYWdlLm1hdGNoaWQgPVxuICAgICAgICAgICAgb2JqZWN0Lm1hdGNoaWQgIT09IHVuZGVmaW5lZCAmJiBvYmplY3QubWF0Y2hpZCAhPT0gbnVsbFxuICAgICAgICAgICAgICAgID8gTG9uZy5mcm9tVmFsdWUob2JqZWN0Lm1hdGNoaWQpXG4gICAgICAgICAgICAgICAgOiBMb25nLlVaRVJPO1xuICAgICAgICBtZXNzYWdlLm91dGNvbWVpZCA9XG4gICAgICAgICAgICBvYmplY3Qub3V0Y29tZWlkICE9PSB1bmRlZmluZWQgJiYgb2JqZWN0Lm91dGNvbWVpZCAhPT0gbnVsbFxuICAgICAgICAgICAgICAgID8gTG9uZy5mcm9tVmFsdWUob2JqZWN0Lm91dGNvbWVpZClcbiAgICAgICAgICAgICAgICA6IExvbmcuVVpFUk87XG4gICAgICAgIG1lc3NhZ2UudG9rZW4gPSAoX2EgPSBvYmplY3QudG9rZW4pICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IDA7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbn07XG5mdW5jdGlvbiBjcmVhdGVCYXNlQ0RhdGFHQ0NTdHJpa2UxNVYyTWF0Y2hJbmZvKCkge1xuICAgIHJldHVybiB7XG4gICAgICAgIG1hdGNoaWQ6IExvbmcuVVpFUk8sXG4gICAgICAgIG1hdGNodGltZTogMCxcbiAgICAgICAgd2F0Y2hhYmxlbWF0Y2hpbmZvOiB1bmRlZmluZWQsXG4gICAgICAgIHJvdW5kc3RhdHNMZWdhY3k6IHVuZGVmaW5lZCxcbiAgICAgICAgcm91bmRzdGF0c2FsbDogW11cbiAgICB9O1xufVxuZXhwb3J0cy5DRGF0YUdDQ1N0cmlrZTE1VjJNYXRjaEluZm8gPSB7XG4gICAgZW5jb2RlKG1lc3NhZ2UsIHdyaXRlciA9IG1pbmltYWxfMS5Xcml0ZXIuY3JlYXRlKCkpIHtcbiAgICAgICAgaWYgKCFtZXNzYWdlLm1hdGNoaWQuaXNaZXJvKCkpIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoOCkudWludDY0KG1lc3NhZ2UubWF0Y2hpZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UubWF0Y2h0aW1lICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDE2KS51aW50MzIobWVzc2FnZS5tYXRjaHRpbWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLndhdGNoYWJsZW1hdGNoaW5mbyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBleHBvcnRzLldhdGNoYWJsZU1hdGNoSW5mby5lbmNvZGUobWVzc2FnZS53YXRjaGFibGVtYXRjaGluZm8sIHdyaXRlci51aW50MzIoMjYpLmZvcmsoKSkubGRlbGltKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2Uucm91bmRzdGF0c0xlZ2FjeSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBleHBvcnRzLkNNc2dHQ0NTdHJpa2UxNVYyTWF0Y2htYWtpbmdTZXJ2ZXJSb3VuZFN0YXRzLmVuY29kZShtZXNzYWdlLnJvdW5kc3RhdHNMZWdhY3ksIHdyaXRlci51aW50MzIoMzQpLmZvcmsoKSkubGRlbGltKCk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCB2IG9mIG1lc3NhZ2Uucm91bmRzdGF0c2FsbCkge1xuICAgICAgICAgICAgZXhwb3J0cy5DTXNnR0NDU3RyaWtlMTVWMk1hdGNobWFraW5nU2VydmVyUm91bmRTdGF0cy5lbmNvZGUodiwgd3JpdGVyLnVpbnQzMig0MikuZm9yaygpKS5sZGVsaW0oKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH0sXG4gICAgZGVjb2RlKGlucHV0LCBsZW5ndGgpIHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gaW5wdXQgaW5zdGFuY2VvZiBtaW5pbWFsXzEuUmVhZGVyID8gaW5wdXQgOiBuZXcgbWluaW1hbF8xLlJlYWRlcihpbnB1dCk7XG4gICAgICAgIGxldCBlbmQgPSBsZW5ndGggPT09IHVuZGVmaW5lZCA/IHJlYWRlci5sZW4gOiByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNEYXRhR0NDU3RyaWtlMTVWMk1hdGNoSW5mbygpO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UubWF0Y2hpZCA9IHJlYWRlci51aW50NjQoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLm1hdGNodGltZSA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLndhdGNoYWJsZW1hdGNoaW5mbyA9IGV4cG9ydHMuV2F0Y2hhYmxlTWF0Y2hJbmZvLmRlY29kZShyZWFkZXIsIHJlYWRlci51aW50MzIoKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5yb3VuZHN0YXRzTGVnYWN5ID1cbiAgICAgICAgICAgICAgICAgICAgICAgIGV4cG9ydHMuQ01zZ0dDQ1N0cmlrZTE1VjJNYXRjaG1ha2luZ1NlcnZlclJvdW5kU3RhdHMuZGVjb2RlKHJlYWRlciwgcmVhZGVyLnVpbnQzMigpKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnJvdW5kc3RhdHNhbGwucHVzaChleHBvcnRzLkNNc2dHQ0NTdHJpa2UxNVYyTWF0Y2htYWtpbmdTZXJ2ZXJSb3VuZFN0YXRzLmRlY29kZShyZWFkZXIsIHJlYWRlci51aW50MzIoKSkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICByZWFkZXIuc2tpcFR5cGUodGFnICYgNyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH0sXG4gICAgZnJvbVBhcnRpYWwob2JqZWN0KSB7XG4gICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ0RhdGFHQ0NTdHJpa2UxNVYyTWF0Y2hJbmZvKCk7XG4gICAgICAgIG1lc3NhZ2UubWF0Y2hpZCA9XG4gICAgICAgICAgICBvYmplY3QubWF0Y2hpZCAhPT0gdW5kZWZpbmVkICYmIG9iamVjdC5tYXRjaGlkICE9PSBudWxsXG4gICAgICAgICAgICAgICAgPyBMb25nLmZyb21WYWx1ZShvYmplY3QubWF0Y2hpZClcbiAgICAgICAgICAgICAgICA6IExvbmcuVVpFUk87XG4gICAgICAgIG1lc3NhZ2UubWF0Y2h0aW1lID0gKF9hID0gb2JqZWN0Lm1hdGNodGltZSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMDtcbiAgICAgICAgbWVzc2FnZS53YXRjaGFibGVtYXRjaGluZm8gPVxuICAgICAgICAgICAgb2JqZWN0LndhdGNoYWJsZW1hdGNoaW5mbyAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAgICAgb2JqZWN0LndhdGNoYWJsZW1hdGNoaW5mbyAhPT0gbnVsbFxuICAgICAgICAgICAgICAgID8gZXhwb3J0cy5XYXRjaGFibGVNYXRjaEluZm8uZnJvbVBhcnRpYWwob2JqZWN0LndhdGNoYWJsZW1hdGNoaW5mbylcbiAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgICAgbWVzc2FnZS5yb3VuZHN0YXRzTGVnYWN5ID1cbiAgICAgICAgICAgIG9iamVjdC5yb3VuZHN0YXRzTGVnYWN5ICE9PSB1bmRlZmluZWQgJiYgb2JqZWN0LnJvdW5kc3RhdHNMZWdhY3kgIT09IG51bGxcbiAgICAgICAgICAgICAgICA/IGV4cG9ydHMuQ01zZ0dDQ1N0cmlrZTE1VjJNYXRjaG1ha2luZ1NlcnZlclJvdW5kU3RhdHMuZnJvbVBhcnRpYWwob2JqZWN0LnJvdW5kc3RhdHNMZWdhY3kpXG4gICAgICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICAgIG1lc3NhZ2Uucm91bmRzdGF0c2FsbCA9XG4gICAgICAgICAgICAoKF9iID0gb2JqZWN0LnJvdW5kc3RhdHNhbGwpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5tYXAoZSA9PiBleHBvcnRzLkNNc2dHQ0NTdHJpa2UxNVYyTWF0Y2htYWtpbmdTZXJ2ZXJSb3VuZFN0YXRzLmZyb21QYXJ0aWFsKGUpKSkgfHwgW107XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbn07XG5mdW5jdGlvbiBjcmVhdGVCYXNlQ0RhdGFHQ0NTdHJpa2UxNVYyVG91cm5hbWVudEdyb3VwVGVhbSgpIHtcbiAgICByZXR1cm4geyB0ZWFtSWQ6IDAsIHNjb3JlOiAwLCBjb3JyZWN0cGljazogZmFsc2UgfTtcbn1cbmV4cG9ydHMuQ0RhdGFHQ0NTdHJpa2UxNVYyVG91cm5hbWVudEdyb3VwVGVhbSA9IHtcbiAgICBlbmNvZGUobWVzc2FnZSwgd3JpdGVyID0gbWluaW1hbF8xLldyaXRlci5jcmVhdGUoKSkge1xuICAgICAgICBpZiAobWVzc2FnZS50ZWFtSWQgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoOCkuaW50MzIobWVzc2FnZS50ZWFtSWQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLnNjb3JlICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDE2KS5pbnQzMihtZXNzYWdlLnNjb3JlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5jb3JyZWN0cGljayA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigyNCkuYm9vbChtZXNzYWdlLmNvcnJlY3RwaWNrKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH0sXG4gICAgZGVjb2RlKGlucHV0LCBsZW5ndGgpIHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gaW5wdXQgaW5zdGFuY2VvZiBtaW5pbWFsXzEuUmVhZGVyID8gaW5wdXQgOiBuZXcgbWluaW1hbF8xLlJlYWRlcihpbnB1dCk7XG4gICAgICAgIGxldCBlbmQgPSBsZW5ndGggPT09IHVuZGVmaW5lZCA/IHJlYWRlci5sZW4gOiByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNEYXRhR0NDU3RyaWtlMTVWMlRvdXJuYW1lbnRHcm91cFRlYW0oKTtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhZyA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgIHN3aXRjaCAodGFnID4+PiAzKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnRlYW1JZCA9IHJlYWRlci5pbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Uuc2NvcmUgPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmNvcnJlY3RwaWNrID0gcmVhZGVyLmJvb2woKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmVhZGVyLnNraXBUeXBlKHRhZyAmIDcpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9LFxuICAgIGZyb21QYXJ0aWFsKG9iamVjdCkge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYztcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDRGF0YUdDQ1N0cmlrZTE1VjJUb3VybmFtZW50R3JvdXBUZWFtKCk7XG4gICAgICAgIG1lc3NhZ2UudGVhbUlkID0gKF9hID0gb2JqZWN0LnRlYW1JZCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMDtcbiAgICAgICAgbWVzc2FnZS5zY29yZSA9IChfYiA9IG9iamVjdC5zY29yZSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogMDtcbiAgICAgICAgbWVzc2FnZS5jb3JyZWN0cGljayA9IChfYyA9IG9iamVjdC5jb3JyZWN0cGljaykgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogZmFsc2U7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbn07XG5mdW5jdGlvbiBjcmVhdGVCYXNlQ0RhdGFHQ0NTdHJpa2UxNVYyVG91cm5hbWVudEdyb3VwKCkge1xuICAgIHJldHVybiB7XG4gICAgICAgIGdyb3VwaWQ6IDAsXG4gICAgICAgIG5hbWU6IFwiXCIsXG4gICAgICAgIGRlc2M6IFwiXCIsXG4gICAgICAgIHBpY2tzRGVwcmVjYXRlZDogMCxcbiAgICAgICAgdGVhbXM6IFtdLFxuICAgICAgICBzdGFnZUlkczogW10sXG4gICAgICAgIHBpY2tsb2NrdW50aWx0aW1lOiAwLFxuICAgICAgICBwaWNrYWJsZXRlYW1zOiAwLFxuICAgICAgICBwb2ludHNQZXJQaWNrOiAwLFxuICAgICAgICBwaWNrczogW11cbiAgICB9O1xufVxuZXhwb3J0cy5DRGF0YUdDQ1N0cmlrZTE1VjJUb3VybmFtZW50R3JvdXAgPSB7XG4gICAgZW5jb2RlKG1lc3NhZ2UsIHdyaXRlciA9IG1pbmltYWxfMS5Xcml0ZXIuY3JlYXRlKCkpIHtcbiAgICAgICAgaWYgKG1lc3NhZ2UuZ3JvdXBpZCAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig4KS51aW50MzIobWVzc2FnZS5ncm91cGlkKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5uYW1lICE9PSBcIlwiKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDE4KS5zdHJpbmcobWVzc2FnZS5uYW1lKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5kZXNjICE9PSBcIlwiKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDI2KS5zdHJpbmcobWVzc2FnZS5kZXNjKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5waWNrc0RlcHJlY2F0ZWQgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMzIpLnVpbnQzMihtZXNzYWdlLnBpY2tzRGVwcmVjYXRlZCk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCB2IG9mIG1lc3NhZ2UudGVhbXMpIHtcbiAgICAgICAgICAgIGV4cG9ydHMuQ0RhdGFHQ0NTdHJpa2UxNVYyVG91cm5hbWVudEdyb3VwVGVhbS5lbmNvZGUodiwgd3JpdGVyLnVpbnQzMig0MikuZm9yaygpKS5sZGVsaW0oKTtcbiAgICAgICAgfVxuICAgICAgICB3cml0ZXIudWludDMyKDUwKS5mb3JrKCk7XG4gICAgICAgIGZvciAoY29uc3QgdiBvZiBtZXNzYWdlLnN0YWdlSWRzKSB7XG4gICAgICAgICAgICB3cml0ZXIuaW50MzIodik7XG4gICAgICAgIH1cbiAgICAgICAgd3JpdGVyLmxkZWxpbSgpO1xuICAgICAgICBpZiAobWVzc2FnZS5waWNrbG9ja3VudGlsdGltZSAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig1NikudWludDMyKG1lc3NhZ2UucGlja2xvY2t1bnRpbHRpbWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLnBpY2thYmxldGVhbXMgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoNjQpLnVpbnQzMihtZXNzYWdlLnBpY2thYmxldGVhbXMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLnBvaW50c1BlclBpY2sgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoNzIpLnVpbnQzMihtZXNzYWdlLnBvaW50c1BlclBpY2spO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3QgdiBvZiBtZXNzYWdlLnBpY2tzKSB7XG4gICAgICAgICAgICBleHBvcnRzLkNEYXRhR0NDU3RyaWtlMTVWMlRvdXJuYW1lbnRHcm91cF9QaWNrcy5lbmNvZGUodiwgd3JpdGVyLnVpbnQzMig4MikuZm9yaygpKS5sZGVsaW0oKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH0sXG4gICAgZGVjb2RlKGlucHV0LCBsZW5ndGgpIHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gaW5wdXQgaW5zdGFuY2VvZiBtaW5pbWFsXzEuUmVhZGVyID8gaW5wdXQgOiBuZXcgbWluaW1hbF8xLlJlYWRlcihpbnB1dCk7XG4gICAgICAgIGxldCBlbmQgPSBsZW5ndGggPT09IHVuZGVmaW5lZCA/IHJlYWRlci5sZW4gOiByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNEYXRhR0NDU3RyaWtlMTVWMlRvdXJuYW1lbnRHcm91cCgpO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZ3JvdXBpZCA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLm5hbWUgPSByZWFkZXIuc3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5kZXNjID0gcmVhZGVyLnN0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UucGlja3NEZXByZWNhdGVkID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudGVhbXMucHVzaChleHBvcnRzLkNEYXRhR0NDU3RyaWtlMTVWMlRvdXJuYW1lbnRHcm91cFRlYW0uZGVjb2RlKHJlYWRlciwgcmVhZGVyLnVpbnQzMigpKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgaWYgKCh0YWcgJiA3KSA9PT0gMikge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZW5kMiA9IHJlYWRlci51aW50MzIoKSArIHJlYWRlci5wb3M7XG4gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZDIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnN0YWdlSWRzLnB1c2gocmVhZGVyLmludDMyKCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5zdGFnZUlkcy5wdXNoKHJlYWRlci5pbnQzMigpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UucGlja2xvY2t1bnRpbHRpbWUgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgODpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5waWNrYWJsZXRlYW1zID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDk6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UucG9pbnRzUGVyUGljayA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAxMDpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5waWNrcy5wdXNoKGV4cG9ydHMuQ0RhdGFHQ0NTdHJpa2UxNVYyVG91cm5hbWVudEdyb3VwX1BpY2tzLmRlY29kZShyZWFkZXIsIHJlYWRlci51aW50MzIoKSkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICByZWFkZXIuc2tpcFR5cGUodGFnICYgNyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH0sXG4gICAgZnJvbVBhcnRpYWwob2JqZWN0KSB7XG4gICAgICAgIHZhciBfYSwgX2IsIF9jLCBfZCwgX2UsIF9mLCBfZywgX2gsIF9qLCBfaztcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDRGF0YUdDQ1N0cmlrZTE1VjJUb3VybmFtZW50R3JvdXAoKTtcbiAgICAgICAgbWVzc2FnZS5ncm91cGlkID0gKF9hID0gb2JqZWN0Lmdyb3VwaWQpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IDA7XG4gICAgICAgIG1lc3NhZ2UubmFtZSA9IChfYiA9IG9iamVjdC5uYW1lKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBcIlwiO1xuICAgICAgICBtZXNzYWdlLmRlc2MgPSAoX2MgPSBvYmplY3QuZGVzYykgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogXCJcIjtcbiAgICAgICAgbWVzc2FnZS5waWNrc0RlcHJlY2F0ZWQgPSAoX2QgPSBvYmplY3QucGlja3NEZXByZWNhdGVkKSAhPT0gbnVsbCAmJiBfZCAhPT0gdm9pZCAwID8gX2QgOiAwO1xuICAgICAgICBtZXNzYWdlLnRlYW1zID1cbiAgICAgICAgICAgICgoX2UgPSBvYmplY3QudGVhbXMpID09PSBudWxsIHx8IF9lID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZS5tYXAoZSA9PiBleHBvcnRzLkNEYXRhR0NDU3RyaWtlMTVWMlRvdXJuYW1lbnRHcm91cFRlYW0uZnJvbVBhcnRpYWwoZSkpKSB8fCBbXTtcbiAgICAgICAgbWVzc2FnZS5zdGFnZUlkcyA9ICgoX2YgPSBvYmplY3Quc3RhZ2VJZHMpID09PSBudWxsIHx8IF9mID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZi5tYXAoZSA9PiBlKSkgfHwgW107XG4gICAgICAgIG1lc3NhZ2UucGlja2xvY2t1bnRpbHRpbWUgPSAoX2cgPSBvYmplY3QucGlja2xvY2t1bnRpbHRpbWUpICE9PSBudWxsICYmIF9nICE9PSB2b2lkIDAgPyBfZyA6IDA7XG4gICAgICAgIG1lc3NhZ2UucGlja2FibGV0ZWFtcyA9IChfaCA9IG9iamVjdC5waWNrYWJsZXRlYW1zKSAhPT0gbnVsbCAmJiBfaCAhPT0gdm9pZCAwID8gX2ggOiAwO1xuICAgICAgICBtZXNzYWdlLnBvaW50c1BlclBpY2sgPSAoX2ogPSBvYmplY3QucG9pbnRzUGVyUGljaykgIT09IG51bGwgJiYgX2ogIT09IHZvaWQgMCA/IF9qIDogMDtcbiAgICAgICAgbWVzc2FnZS5waWNrcyA9XG4gICAgICAgICAgICAoKF9rID0gb2JqZWN0LnBpY2tzKSA9PT0gbnVsbCB8fCBfayA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2subWFwKGUgPT4gZXhwb3J0cy5DRGF0YUdDQ1N0cmlrZTE1VjJUb3VybmFtZW50R3JvdXBfUGlja3MuZnJvbVBhcnRpYWwoZSkpKSB8fCBbXTtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxufTtcbmZ1bmN0aW9uIGNyZWF0ZUJhc2VDRGF0YUdDQ1N0cmlrZTE1VjJUb3VybmFtZW50R3JvdXBfUGlja3MoKSB7XG4gICAgcmV0dXJuIHsgcGlja2lkczogW10gfTtcbn1cbmV4cG9ydHMuQ0RhdGFHQ0NTdHJpa2UxNVYyVG91cm5hbWVudEdyb3VwX1BpY2tzID0ge1xuICAgIGVuY29kZShtZXNzYWdlLCB3cml0ZXIgPSBtaW5pbWFsXzEuV3JpdGVyLmNyZWF0ZSgpKSB7XG4gICAgICAgIHdyaXRlci51aW50MzIoMTApLmZvcmsoKTtcbiAgICAgICAgZm9yIChjb25zdCB2IG9mIG1lc3NhZ2UucGlja2lkcykge1xuICAgICAgICAgICAgd3JpdGVyLmludDMyKHYpO1xuICAgICAgICB9XG4gICAgICAgIHdyaXRlci5sZGVsaW0oKTtcbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9LFxuICAgIGRlY29kZShpbnB1dCwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IGlucHV0IGluc3RhbmNlb2YgbWluaW1hbF8xLlJlYWRlciA/IGlucHV0IDogbmV3IG1pbmltYWxfMS5SZWFkZXIoaW5wdXQpO1xuICAgICAgICBsZXQgZW5kID0gbGVuZ3RoID09PSB1bmRlZmluZWQgPyByZWFkZXIubGVuIDogcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDRGF0YUdDQ1N0cmlrZTE1VjJUb3VybmFtZW50R3JvdXBfUGlja3MoKTtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhZyA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgIHN3aXRjaCAodGFnID4+PiAzKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBpZiAoKHRhZyAmIDcpID09PSAyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbmQyID0gcmVhZGVyLnVpbnQzMigpICsgcmVhZGVyLnBvcztcbiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kMikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UucGlja2lkcy5wdXNoKHJlYWRlci5pbnQzMigpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UucGlja2lkcy5wdXNoKHJlYWRlci5pbnQzMigpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICByZWFkZXIuc2tpcFR5cGUodGFnICYgNyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH0sXG4gICAgZnJvbVBhcnRpYWwob2JqZWN0KSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDRGF0YUdDQ1N0cmlrZTE1VjJUb3VybmFtZW50R3JvdXBfUGlja3MoKTtcbiAgICAgICAgbWVzc2FnZS5waWNraWRzID0gKChfYSA9IG9iamVjdC5waWNraWRzKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EubWFwKGUgPT4gZSkpIHx8IFtdO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG59O1xuZnVuY3Rpb24gY3JlYXRlQmFzZUNEYXRhR0NDU3RyaWtlMTVWMlRvdXJuYW1lbnRTZWN0aW9uKCkge1xuICAgIHJldHVybiB7IHNlY3Rpb25pZDogMCwgbmFtZTogXCJcIiwgZGVzYzogXCJcIiwgZ3JvdXBzOiBbXSB9O1xufVxuZXhwb3J0cy5DRGF0YUdDQ1N0cmlrZTE1VjJUb3VybmFtZW50U2VjdGlvbiA9IHtcbiAgICBlbmNvZGUobWVzc2FnZSwgd3JpdGVyID0gbWluaW1hbF8xLldyaXRlci5jcmVhdGUoKSkge1xuICAgICAgICBpZiAobWVzc2FnZS5zZWN0aW9uaWQgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoOCkudWludDMyKG1lc3NhZ2Uuc2VjdGlvbmlkKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5uYW1lICE9PSBcIlwiKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDE4KS5zdHJpbmcobWVzc2FnZS5uYW1lKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5kZXNjICE9PSBcIlwiKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDI2KS5zdHJpbmcobWVzc2FnZS5kZXNjKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IHYgb2YgbWVzc2FnZS5ncm91cHMpIHtcbiAgICAgICAgICAgIGV4cG9ydHMuQ0RhdGFHQ0NTdHJpa2UxNVYyVG91cm5hbWVudEdyb3VwLmVuY29kZSh2LCB3cml0ZXIudWludDMyKDM0KS5mb3JrKCkpLmxkZWxpbSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfSxcbiAgICBkZWNvZGUoaW5wdXQsIGxlbmd0aCkge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBpbnB1dCBpbnN0YW5jZW9mIG1pbmltYWxfMS5SZWFkZXIgPyBpbnB1dCA6IG5ldyBtaW5pbWFsXzEuUmVhZGVyKGlucHV0KTtcbiAgICAgICAgbGV0IGVuZCA9IGxlbmd0aCA9PT0gdW5kZWZpbmVkID8gcmVhZGVyLmxlbiA6IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ0RhdGFHQ0NTdHJpa2UxNVYyVG91cm5hbWVudFNlY3Rpb24oKTtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhZyA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgIHN3aXRjaCAodGFnID4+PiAzKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnNlY3Rpb25pZCA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLm5hbWUgPSByZWFkZXIuc3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5kZXNjID0gcmVhZGVyLnN0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZ3JvdXBzLnB1c2goZXhwb3J0cy5DRGF0YUdDQ1N0cmlrZTE1VjJUb3VybmFtZW50R3JvdXAuZGVjb2RlKHJlYWRlciwgcmVhZGVyLnVpbnQzMigpKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJlYWRlci5za2lwVHlwZSh0YWcgJiA3KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfSxcbiAgICBmcm9tUGFydGlhbChvYmplY3QpIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2MsIF9kO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNEYXRhR0NDU3RyaWtlMTVWMlRvdXJuYW1lbnRTZWN0aW9uKCk7XG4gICAgICAgIG1lc3NhZ2Uuc2VjdGlvbmlkID0gKF9hID0gb2JqZWN0LnNlY3Rpb25pZCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMDtcbiAgICAgICAgbWVzc2FnZS5uYW1lID0gKF9iID0gb2JqZWN0Lm5hbWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IFwiXCI7XG4gICAgICAgIG1lc3NhZ2UuZGVzYyA9IChfYyA9IG9iamVjdC5kZXNjKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiBcIlwiO1xuICAgICAgICBtZXNzYWdlLmdyb3VwcyA9XG4gICAgICAgICAgICAoKF9kID0gb2JqZWN0Lmdyb3VwcykgPT09IG51bGwgfHwgX2QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9kLm1hcChlID0+IGV4cG9ydHMuQ0RhdGFHQ0NTdHJpa2UxNVYyVG91cm5hbWVudEdyb3VwLmZyb21QYXJ0aWFsKGUpKSkgfHwgW107XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbn07XG5mdW5jdGlvbiBjcmVhdGVCYXNlQ0RhdGFHQ0NTdHJpa2UxNVYyVG91cm5hbWVudEluZm8oKSB7XG4gICAgcmV0dXJuIHsgc2VjdGlvbnM6IFtdLCB0b3VybmFtZW50RXZlbnQ6IHVuZGVmaW5lZCwgdG91cm5hbWVudFRlYW1zOiBbXSB9O1xufVxuZXhwb3J0cy5DRGF0YUdDQ1N0cmlrZTE1VjJUb3VybmFtZW50SW5mbyA9IHtcbiAgICBlbmNvZGUobWVzc2FnZSwgd3JpdGVyID0gbWluaW1hbF8xLldyaXRlci5jcmVhdGUoKSkge1xuICAgICAgICBmb3IgKGNvbnN0IHYgb2YgbWVzc2FnZS5zZWN0aW9ucykge1xuICAgICAgICAgICAgZXhwb3J0cy5DRGF0YUdDQ1N0cmlrZTE1VjJUb3VybmFtZW50U2VjdGlvbi5lbmNvZGUodiwgd3JpdGVyLnVpbnQzMigxMCkuZm9yaygpKS5sZGVsaW0oKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS50b3VybmFtZW50RXZlbnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgZXhwb3J0cy5Ub3VybmFtZW50RXZlbnQuZW5jb2RlKG1lc3NhZ2UudG91cm5hbWVudEV2ZW50LCB3cml0ZXIudWludDMyKDE4KS5mb3JrKCkpLmxkZWxpbSgpO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3QgdiBvZiBtZXNzYWdlLnRvdXJuYW1lbnRUZWFtcykge1xuICAgICAgICAgICAgZXhwb3J0cy5Ub3VybmFtZW50VGVhbS5lbmNvZGUodiwgd3JpdGVyLnVpbnQzMigyNikuZm9yaygpKS5sZGVsaW0oKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH0sXG4gICAgZGVjb2RlKGlucHV0LCBsZW5ndGgpIHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gaW5wdXQgaW5zdGFuY2VvZiBtaW5pbWFsXzEuUmVhZGVyID8gaW5wdXQgOiBuZXcgbWluaW1hbF8xLlJlYWRlcihpbnB1dCk7XG4gICAgICAgIGxldCBlbmQgPSBsZW5ndGggPT09IHVuZGVmaW5lZCA/IHJlYWRlci5sZW4gOiByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNEYXRhR0NDU3RyaWtlMTVWMlRvdXJuYW1lbnRJbmZvKCk7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBjb25zdCB0YWcgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKHRhZyA+Pj4gMykge1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5zZWN0aW9ucy5wdXNoKGV4cG9ydHMuQ0RhdGFHQ0NTdHJpa2UxNVYyVG91cm5hbWVudFNlY3Rpb24uZGVjb2RlKHJlYWRlciwgcmVhZGVyLnVpbnQzMigpKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS50b3VybmFtZW50RXZlbnQgPSBleHBvcnRzLlRvdXJuYW1lbnRFdmVudC5kZWNvZGUocmVhZGVyLCByZWFkZXIudWludDMyKCkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudG91cm5hbWVudFRlYW1zLnB1c2goZXhwb3J0cy5Ub3VybmFtZW50VGVhbS5kZWNvZGUocmVhZGVyLCByZWFkZXIudWludDMyKCkpKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmVhZGVyLnNraXBUeXBlKHRhZyAmIDcpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9LFxuICAgIGZyb21QYXJ0aWFsKG9iamVjdCkge1xuICAgICAgICB2YXIgX2EsIF9iO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNEYXRhR0NDU3RyaWtlMTVWMlRvdXJuYW1lbnRJbmZvKCk7XG4gICAgICAgIG1lc3NhZ2Uuc2VjdGlvbnMgPVxuICAgICAgICAgICAgKChfYSA9IG9iamVjdC5zZWN0aW9ucykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLm1hcChlID0+IGV4cG9ydHMuQ0RhdGFHQ0NTdHJpa2UxNVYyVG91cm5hbWVudFNlY3Rpb24uZnJvbVBhcnRpYWwoZSkpKSB8fCBbXTtcbiAgICAgICAgbWVzc2FnZS50b3VybmFtZW50RXZlbnQgPVxuICAgICAgICAgICAgb2JqZWN0LnRvdXJuYW1lbnRFdmVudCAhPT0gdW5kZWZpbmVkICYmIG9iamVjdC50b3VybmFtZW50RXZlbnQgIT09IG51bGxcbiAgICAgICAgICAgICAgICA/IGV4cG9ydHMuVG91cm5hbWVudEV2ZW50LmZyb21QYXJ0aWFsKG9iamVjdC50b3VybmFtZW50RXZlbnQpXG4gICAgICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICAgIG1lc3NhZ2UudG91cm5hbWVudFRlYW1zID1cbiAgICAgICAgICAgICgoX2IgPSBvYmplY3QudG91cm5hbWVudFRlYW1zKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IubWFwKGUgPT4gZXhwb3J0cy5Ub3VybmFtZW50VGVhbS5mcm9tUGFydGlhbChlKSkpIHx8IFtdO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG59O1xuZnVuY3Rpb24gY3JlYXRlQmFzZUNNc2dHQ0NTdHJpa2UxNVYyTWF0Y2hMaXN0KCkge1xuICAgIHJldHVybiB7XG4gICAgICAgIG1zZ3JlcXVlc3RpZDogMCxcbiAgICAgICAgYWNjb3VudGlkOiAwLFxuICAgICAgICBzZXJ2ZXJ0aW1lOiAwLFxuICAgICAgICBtYXRjaGVzOiBbXSxcbiAgICAgICAgc3RyZWFtczogW10sXG4gICAgICAgIHRvdXJuYW1lbnRpbmZvOiB1bmRlZmluZWRcbiAgICB9O1xufVxuZXhwb3J0cy5DTXNnR0NDU3RyaWtlMTVWMk1hdGNoTGlzdCA9IHtcbiAgICBlbmNvZGUobWVzc2FnZSwgd3JpdGVyID0gbWluaW1hbF8xLldyaXRlci5jcmVhdGUoKSkge1xuICAgICAgICBpZiAobWVzc2FnZS5tc2dyZXF1ZXN0aWQgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoOCkudWludDMyKG1lc3NhZ2UubXNncmVxdWVzdGlkKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5hY2NvdW50aWQgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMTYpLnVpbnQzMihtZXNzYWdlLmFjY291bnRpZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2Uuc2VydmVydGltZSAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigyNCkudWludDMyKG1lc3NhZ2Uuc2VydmVydGltZSk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCB2IG9mIG1lc3NhZ2UubWF0Y2hlcykge1xuICAgICAgICAgICAgZXhwb3J0cy5DRGF0YUdDQ1N0cmlrZTE1VjJNYXRjaEluZm8uZW5jb2RlKHYsIHdyaXRlci51aW50MzIoMzQpLmZvcmsoKSkubGRlbGltKCk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCB2IG9mIG1lc3NhZ2Uuc3RyZWFtcykge1xuICAgICAgICAgICAgZXhwb3J0cy5Ub3VybmFtZW50VGVhbS5lbmNvZGUodiwgd3JpdGVyLnVpbnQzMig0MikuZm9yaygpKS5sZGVsaW0oKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS50b3VybmFtZW50aW5mbyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBleHBvcnRzLkNEYXRhR0NDU3RyaWtlMTVWMlRvdXJuYW1lbnRJbmZvLmVuY29kZShtZXNzYWdlLnRvdXJuYW1lbnRpbmZvLCB3cml0ZXIudWludDMyKDUwKS5mb3JrKCkpLmxkZWxpbSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfSxcbiAgICBkZWNvZGUoaW5wdXQsIGxlbmd0aCkge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBpbnB1dCBpbnN0YW5jZW9mIG1pbmltYWxfMS5SZWFkZXIgPyBpbnB1dCA6IG5ldyBtaW5pbWFsXzEuUmVhZGVyKGlucHV0KTtcbiAgICAgICAgbGV0IGVuZCA9IGxlbmd0aCA9PT0gdW5kZWZpbmVkID8gcmVhZGVyLmxlbiA6IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ01zZ0dDQ1N0cmlrZTE1VjJNYXRjaExpc3QoKTtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhZyA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgIHN3aXRjaCAodGFnID4+PiAzKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLm1zZ3JlcXVlc3RpZCA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmFjY291bnRpZCA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnNlcnZlcnRpbWUgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5tYXRjaGVzLnB1c2goZXhwb3J0cy5DRGF0YUdDQ1N0cmlrZTE1VjJNYXRjaEluZm8uZGVjb2RlKHJlYWRlciwgcmVhZGVyLnVpbnQzMigpKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5zdHJlYW1zLnB1c2goZXhwb3J0cy5Ub3VybmFtZW50VGVhbS5kZWNvZGUocmVhZGVyLCByZWFkZXIudWludDMyKCkpKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnRvdXJuYW1lbnRpbmZvID0gZXhwb3J0cy5DRGF0YUdDQ1N0cmlrZTE1VjJUb3VybmFtZW50SW5mby5kZWNvZGUocmVhZGVyLCByZWFkZXIudWludDMyKCkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICByZWFkZXIuc2tpcFR5cGUodGFnICYgNyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH0sXG4gICAgZnJvbVBhcnRpYWwob2JqZWN0KSB7XG4gICAgICAgIHZhciBfYSwgX2IsIF9jLCBfZCwgX2U7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ01zZ0dDQ1N0cmlrZTE1VjJNYXRjaExpc3QoKTtcbiAgICAgICAgbWVzc2FnZS5tc2dyZXF1ZXN0aWQgPSAoX2EgPSBvYmplY3QubXNncmVxdWVzdGlkKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAwO1xuICAgICAgICBtZXNzYWdlLmFjY291bnRpZCA9IChfYiA9IG9iamVjdC5hY2NvdW50aWQpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IDA7XG4gICAgICAgIG1lc3NhZ2Uuc2VydmVydGltZSA9IChfYyA9IG9iamVjdC5zZXJ2ZXJ0aW1lKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiAwO1xuICAgICAgICBtZXNzYWdlLm1hdGNoZXMgPVxuICAgICAgICAgICAgKChfZCA9IG9iamVjdC5tYXRjaGVzKSA9PT0gbnVsbCB8fCBfZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2QubWFwKGUgPT4gZXhwb3J0cy5DRGF0YUdDQ1N0cmlrZTE1VjJNYXRjaEluZm8uZnJvbVBhcnRpYWwoZSkpKSB8fFxuICAgICAgICAgICAgICAgIFtdO1xuICAgICAgICBtZXNzYWdlLnN0cmVhbXMgPVxuICAgICAgICAgICAgKChfZSA9IG9iamVjdC5zdHJlYW1zKSA9PT0gbnVsbCB8fCBfZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2UubWFwKGUgPT4gZXhwb3J0cy5Ub3VybmFtZW50VGVhbS5mcm9tUGFydGlhbChlKSkpIHx8IFtdO1xuICAgICAgICBtZXNzYWdlLnRvdXJuYW1lbnRpbmZvID1cbiAgICAgICAgICAgIG9iamVjdC50b3VybmFtZW50aW5mbyAhPT0gdW5kZWZpbmVkICYmIG9iamVjdC50b3VybmFtZW50aW5mbyAhPT0gbnVsbFxuICAgICAgICAgICAgICAgID8gZXhwb3J0cy5DRGF0YUdDQ1N0cmlrZTE1VjJUb3VybmFtZW50SW5mby5mcm9tUGFydGlhbChvYmplY3QudG91cm5hbWVudGluZm8pXG4gICAgICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbn07XG5mdW5jdGlvbiBjcmVhdGVCYXNlQ01zZ0dDQ1N0cmlrZTE1VjJNYXRjaExpc3RUb3VybmFtZW50T3BlcmF0b3JNZ210KCkge1xuICAgIHJldHVybiB7IGV2ZW50aWQ6IDAsIG1hdGNoZXM6IFtdIH07XG59XG5leHBvcnRzLkNNc2dHQ0NTdHJpa2UxNVYyTWF0Y2hMaXN0VG91cm5hbWVudE9wZXJhdG9yTWdtdCA9IHtcbiAgICBlbmNvZGUobWVzc2FnZSwgd3JpdGVyID0gbWluaW1hbF8xLldyaXRlci5jcmVhdGUoKSkge1xuICAgICAgICBpZiAobWVzc2FnZS5ldmVudGlkICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDgpLmludDMyKG1lc3NhZ2UuZXZlbnRpZCk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCB2IG9mIG1lc3NhZ2UubWF0Y2hlcykge1xuICAgICAgICAgICAgZXhwb3J0cy5DRGF0YUdDQ1N0cmlrZTE1VjJNYXRjaEluZm8uZW5jb2RlKHYsIHdyaXRlci51aW50MzIoMTgpLmZvcmsoKSkubGRlbGltKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9LFxuICAgIGRlY29kZShpbnB1dCwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IGlucHV0IGluc3RhbmNlb2YgbWluaW1hbF8xLlJlYWRlciA/IGlucHV0IDogbmV3IG1pbmltYWxfMS5SZWFkZXIoaW5wdXQpO1xuICAgICAgICBsZXQgZW5kID0gbGVuZ3RoID09PSB1bmRlZmluZWQgPyByZWFkZXIubGVuIDogcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDTXNnR0NDU3RyaWtlMTVWMk1hdGNoTGlzdFRvdXJuYW1lbnRPcGVyYXRvck1nbXQoKTtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhZyA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgIHN3aXRjaCAodGFnID4+PiAzKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmV2ZW50aWQgPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLm1hdGNoZXMucHVzaChleHBvcnRzLkNEYXRhR0NDU3RyaWtlMTVWMk1hdGNoSW5mby5kZWNvZGUocmVhZGVyLCByZWFkZXIudWludDMyKCkpKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmVhZGVyLnNraXBUeXBlKHRhZyAmIDcpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9LFxuICAgIGZyb21QYXJ0aWFsKG9iamVjdCkge1xuICAgICAgICB2YXIgX2EsIF9iO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNNc2dHQ0NTdHJpa2UxNVYyTWF0Y2hMaXN0VG91cm5hbWVudE9wZXJhdG9yTWdtdCgpO1xuICAgICAgICBtZXNzYWdlLmV2ZW50aWQgPSAoX2EgPSBvYmplY3QuZXZlbnRpZCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMDtcbiAgICAgICAgbWVzc2FnZS5tYXRjaGVzID1cbiAgICAgICAgICAgICgoX2IgPSBvYmplY3QubWF0Y2hlcykgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLm1hcChlID0+IGV4cG9ydHMuQ0RhdGFHQ0NTdHJpa2UxNVYyTWF0Y2hJbmZvLmZyb21QYXJ0aWFsKGUpKSkgfHxcbiAgICAgICAgICAgICAgICBbXTtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxufTtcbmZ1bmN0aW9uIGNyZWF0ZUJhc2VDTXNnR0NDU3RyaWtlMTVWMlByZWRpY3Rpb25zKCkge1xuICAgIHJldHVybiB7IGV2ZW50SWQ6IDAsIGdyb3VwTWF0Y2hUZWFtUGlja3M6IFtdIH07XG59XG5leHBvcnRzLkNNc2dHQ0NTdHJpa2UxNVYyUHJlZGljdGlvbnMgPSB7XG4gICAgZW5jb2RlKG1lc3NhZ2UsIHdyaXRlciA9IG1pbmltYWxfMS5Xcml0ZXIuY3JlYXRlKCkpIHtcbiAgICAgICAgaWYgKG1lc3NhZ2UuZXZlbnRJZCAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig4KS51aW50MzIobWVzc2FnZS5ldmVudElkKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IHYgb2YgbWVzc2FnZS5ncm91cE1hdGNoVGVhbVBpY2tzKSB7XG4gICAgICAgICAgICBleHBvcnRzLkNNc2dHQ0NTdHJpa2UxNVYyUHJlZGljdGlvbnNfR3JvdXBNYXRjaFRlYW1QaWNrLmVuY29kZSh2LCB3cml0ZXIudWludDMyKDE4KS5mb3JrKCkpLmxkZWxpbSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfSxcbiAgICBkZWNvZGUoaW5wdXQsIGxlbmd0aCkge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBpbnB1dCBpbnN0YW5jZW9mIG1pbmltYWxfMS5SZWFkZXIgPyBpbnB1dCA6IG5ldyBtaW5pbWFsXzEuUmVhZGVyKGlucHV0KTtcbiAgICAgICAgbGV0IGVuZCA9IGxlbmd0aCA9PT0gdW5kZWZpbmVkID8gcmVhZGVyLmxlbiA6IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ01zZ0dDQ1N0cmlrZTE1VjJQcmVkaWN0aW9ucygpO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZXZlbnRJZCA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmdyb3VwTWF0Y2hUZWFtUGlja3MucHVzaChleHBvcnRzLkNNc2dHQ0NTdHJpa2UxNVYyUHJlZGljdGlvbnNfR3JvdXBNYXRjaFRlYW1QaWNrLmRlY29kZShyZWFkZXIsIHJlYWRlci51aW50MzIoKSkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICByZWFkZXIuc2tpcFR5cGUodGFnICYgNyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH0sXG4gICAgZnJvbVBhcnRpYWwob2JqZWN0KSB7XG4gICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ01zZ0dDQ1N0cmlrZTE1VjJQcmVkaWN0aW9ucygpO1xuICAgICAgICBtZXNzYWdlLmV2ZW50SWQgPSAoX2EgPSBvYmplY3QuZXZlbnRJZCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMDtcbiAgICAgICAgbWVzc2FnZS5ncm91cE1hdGNoVGVhbVBpY2tzID1cbiAgICAgICAgICAgICgoX2IgPSBvYmplY3QuZ3JvdXBNYXRjaFRlYW1QaWNrcykgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLm1hcChlID0+IGV4cG9ydHMuQ01zZ0dDQ1N0cmlrZTE1VjJQcmVkaWN0aW9uc19Hcm91cE1hdGNoVGVhbVBpY2suZnJvbVBhcnRpYWwoZSkpKSB8fCBbXTtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxufTtcbmZ1bmN0aW9uIGNyZWF0ZUJhc2VDTXNnR0NDU3RyaWtlMTVWMlByZWRpY3Rpb25zX0dyb3VwTWF0Y2hUZWFtUGljaygpIHtcbiAgICByZXR1cm4geyBzZWN0aW9uaWQ6IDAsIGdyb3VwaWQ6IDAsIGluZGV4OiAwLCB0ZWFtaWQ6IDAsIGl0ZW1pZDogTG9uZy5VWkVSTyB9O1xufVxuZXhwb3J0cy5DTXNnR0NDU3RyaWtlMTVWMlByZWRpY3Rpb25zX0dyb3VwTWF0Y2hUZWFtUGljayA9IHtcbiAgICBlbmNvZGUobWVzc2FnZSwgd3JpdGVyID0gbWluaW1hbF8xLldyaXRlci5jcmVhdGUoKSkge1xuICAgICAgICBpZiAobWVzc2FnZS5zZWN0aW9uaWQgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoOCkuaW50MzIobWVzc2FnZS5zZWN0aW9uaWQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLmdyb3VwaWQgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMTYpLmludDMyKG1lc3NhZ2UuZ3JvdXBpZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UuaW5kZXggIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMjQpLmludDMyKG1lc3NhZ2UuaW5kZXgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLnRlYW1pZCAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigzMikuaW50MzIobWVzc2FnZS50ZWFtaWQpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghbWVzc2FnZS5pdGVtaWQuaXNaZXJvKCkpIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoNDApLnVpbnQ2NChtZXNzYWdlLml0ZW1pZCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9LFxuICAgIGRlY29kZShpbnB1dCwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IGlucHV0IGluc3RhbmNlb2YgbWluaW1hbF8xLlJlYWRlciA/IGlucHV0IDogbmV3IG1pbmltYWxfMS5SZWFkZXIoaW5wdXQpO1xuICAgICAgICBsZXQgZW5kID0gbGVuZ3RoID09PSB1bmRlZmluZWQgPyByZWFkZXIubGVuIDogcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDTXNnR0NDU3RyaWtlMTVWMlByZWRpY3Rpb25zX0dyb3VwTWF0Y2hUZWFtUGljaygpO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Uuc2VjdGlvbmlkID0gcmVhZGVyLmludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5ncm91cGlkID0gcmVhZGVyLmludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5pbmRleCA9IHJlYWRlci5pbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudGVhbWlkID0gcmVhZGVyLmludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5pdGVtaWQgPSByZWFkZXIudWludDY0KCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJlYWRlci5za2lwVHlwZSh0YWcgJiA3KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfSxcbiAgICBmcm9tUGFydGlhbChvYmplY3QpIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2MsIF9kO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNNc2dHQ0NTdHJpa2UxNVYyUHJlZGljdGlvbnNfR3JvdXBNYXRjaFRlYW1QaWNrKCk7XG4gICAgICAgIG1lc3NhZ2Uuc2VjdGlvbmlkID0gKF9hID0gb2JqZWN0LnNlY3Rpb25pZCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMDtcbiAgICAgICAgbWVzc2FnZS5ncm91cGlkID0gKF9iID0gb2JqZWN0Lmdyb3VwaWQpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IDA7XG4gICAgICAgIG1lc3NhZ2UuaW5kZXggPSAoX2MgPSBvYmplY3QuaW5kZXgpICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IDA7XG4gICAgICAgIG1lc3NhZ2UudGVhbWlkID0gKF9kID0gb2JqZWN0LnRlYW1pZCkgIT09IG51bGwgJiYgX2QgIT09IHZvaWQgMCA/IF9kIDogMDtcbiAgICAgICAgbWVzc2FnZS5pdGVtaWQgPVxuICAgICAgICAgICAgb2JqZWN0Lml0ZW1pZCAhPT0gdW5kZWZpbmVkICYmIG9iamVjdC5pdGVtaWQgIT09IG51bGxcbiAgICAgICAgICAgICAgICA/IExvbmcuZnJvbVZhbHVlKG9iamVjdC5pdGVtaWQpXG4gICAgICAgICAgICAgICAgOiBMb25nLlVaRVJPO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG59O1xuZnVuY3Rpb24gY3JlYXRlQmFzZUNNc2dHQ0NTdHJpa2UxNVYyRmFudGFzeSgpIHtcbiAgICByZXR1cm4geyBldmVudElkOiAwLCB0ZWFtczogW10gfTtcbn1cbmV4cG9ydHMuQ01zZ0dDQ1N0cmlrZTE1VjJGYW50YXN5ID0ge1xuICAgIGVuY29kZShtZXNzYWdlLCB3cml0ZXIgPSBtaW5pbWFsXzEuV3JpdGVyLmNyZWF0ZSgpKSB7XG4gICAgICAgIGlmIChtZXNzYWdlLmV2ZW50SWQgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoOCkudWludDMyKG1lc3NhZ2UuZXZlbnRJZCk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCB2IG9mIG1lc3NhZ2UudGVhbXMpIHtcbiAgICAgICAgICAgIGV4cG9ydHMuQ01zZ0dDQ1N0cmlrZTE1VjJGYW50YXN5X0ZhbnRhc3lUZWFtLmVuY29kZSh2LCB3cml0ZXIudWludDMyKDE4KS5mb3JrKCkpLmxkZWxpbSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfSxcbiAgICBkZWNvZGUoaW5wdXQsIGxlbmd0aCkge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBpbnB1dCBpbnN0YW5jZW9mIG1pbmltYWxfMS5SZWFkZXIgPyBpbnB1dCA6IG5ldyBtaW5pbWFsXzEuUmVhZGVyKGlucHV0KTtcbiAgICAgICAgbGV0IGVuZCA9IGxlbmd0aCA9PT0gdW5kZWZpbmVkID8gcmVhZGVyLmxlbiA6IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ01zZ0dDQ1N0cmlrZTE1VjJGYW50YXN5KCk7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBjb25zdCB0YWcgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKHRhZyA+Pj4gMykge1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5ldmVudElkID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudGVhbXMucHVzaChleHBvcnRzLkNNc2dHQ0NTdHJpa2UxNVYyRmFudGFzeV9GYW50YXN5VGVhbS5kZWNvZGUocmVhZGVyLCByZWFkZXIudWludDMyKCkpKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmVhZGVyLnNraXBUeXBlKHRhZyAmIDcpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9LFxuICAgIGZyb21QYXJ0aWFsKG9iamVjdCkge1xuICAgICAgICB2YXIgX2EsIF9iO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNNc2dHQ0NTdHJpa2UxNVYyRmFudGFzeSgpO1xuICAgICAgICBtZXNzYWdlLmV2ZW50SWQgPSAoX2EgPSBvYmplY3QuZXZlbnRJZCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMDtcbiAgICAgICAgbWVzc2FnZS50ZWFtcyA9XG4gICAgICAgICAgICAoKF9iID0gb2JqZWN0LnRlYW1zKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IubWFwKGUgPT4gZXhwb3J0cy5DTXNnR0NDU3RyaWtlMTVWMkZhbnRhc3lfRmFudGFzeVRlYW0uZnJvbVBhcnRpYWwoZSkpKSB8fCBbXTtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxufTtcbmZ1bmN0aW9uIGNyZWF0ZUJhc2VDTXNnR0NDU3RyaWtlMTVWMkZhbnRhc3lfRmFudGFzeVNsb3QoKSB7XG4gICAgcmV0dXJuIHsgdHlwZTogMCwgcGljazogMCwgaXRlbWlkOiBMb25nLlVaRVJPIH07XG59XG5leHBvcnRzLkNNc2dHQ0NTdHJpa2UxNVYyRmFudGFzeV9GYW50YXN5U2xvdCA9IHtcbiAgICBlbmNvZGUobWVzc2FnZSwgd3JpdGVyID0gbWluaW1hbF8xLldyaXRlci5jcmVhdGUoKSkge1xuICAgICAgICBpZiAobWVzc2FnZS50eXBlICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDgpLmludDMyKG1lc3NhZ2UudHlwZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UucGljayAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigxNikuaW50MzIobWVzc2FnZS5waWNrKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIW1lc3NhZ2UuaXRlbWlkLmlzWmVybygpKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDI0KS51aW50NjQobWVzc2FnZS5pdGVtaWQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfSxcbiAgICBkZWNvZGUoaW5wdXQsIGxlbmd0aCkge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBpbnB1dCBpbnN0YW5jZW9mIG1pbmltYWxfMS5SZWFkZXIgPyBpbnB1dCA6IG5ldyBtaW5pbWFsXzEuUmVhZGVyKGlucHV0KTtcbiAgICAgICAgbGV0IGVuZCA9IGxlbmd0aCA9PT0gdW5kZWZpbmVkID8gcmVhZGVyLmxlbiA6IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ01zZ0dDQ1N0cmlrZTE1VjJGYW50YXN5X0ZhbnRhc3lTbG90KCk7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBjb25zdCB0YWcgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKHRhZyA+Pj4gMykge1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS50eXBlID0gcmVhZGVyLmludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5waWNrID0gcmVhZGVyLmludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5pdGVtaWQgPSByZWFkZXIudWludDY0KCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJlYWRlci5za2lwVHlwZSh0YWcgJiA3KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfSxcbiAgICBmcm9tUGFydGlhbChvYmplY3QpIHtcbiAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDTXNnR0NDU3RyaWtlMTVWMkZhbnRhc3lfRmFudGFzeVNsb3QoKTtcbiAgICAgICAgbWVzc2FnZS50eXBlID0gKF9hID0gb2JqZWN0LnR5cGUpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IDA7XG4gICAgICAgIG1lc3NhZ2UucGljayA9IChfYiA9IG9iamVjdC5waWNrKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAwO1xuICAgICAgICBtZXNzYWdlLml0ZW1pZCA9XG4gICAgICAgICAgICBvYmplY3QuaXRlbWlkICE9PSB1bmRlZmluZWQgJiYgb2JqZWN0Lml0ZW1pZCAhPT0gbnVsbFxuICAgICAgICAgICAgICAgID8gTG9uZy5mcm9tVmFsdWUob2JqZWN0Lml0ZW1pZClcbiAgICAgICAgICAgICAgICA6IExvbmcuVVpFUk87XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbn07XG5mdW5jdGlvbiBjcmVhdGVCYXNlQ01zZ0dDQ1N0cmlrZTE1VjJGYW50YXN5X0ZhbnRhc3lUZWFtKCkge1xuICAgIHJldHVybiB7IHNlY3Rpb25pZDogMCwgc2xvdHM6IFtdIH07XG59XG5leHBvcnRzLkNNc2dHQ0NTdHJpa2UxNVYyRmFudGFzeV9GYW50YXN5VGVhbSA9IHtcbiAgICBlbmNvZGUobWVzc2FnZSwgd3JpdGVyID0gbWluaW1hbF8xLldyaXRlci5jcmVhdGUoKSkge1xuICAgICAgICBpZiAobWVzc2FnZS5zZWN0aW9uaWQgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoOCkuaW50MzIobWVzc2FnZS5zZWN0aW9uaWQpO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3QgdiBvZiBtZXNzYWdlLnNsb3RzKSB7XG4gICAgICAgICAgICBleHBvcnRzLkNNc2dHQ0NTdHJpa2UxNVYyRmFudGFzeV9GYW50YXN5U2xvdC5lbmNvZGUodiwgd3JpdGVyLnVpbnQzMigxOCkuZm9yaygpKS5sZGVsaW0oKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH0sXG4gICAgZGVjb2RlKGlucHV0LCBsZW5ndGgpIHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gaW5wdXQgaW5zdGFuY2VvZiBtaW5pbWFsXzEuUmVhZGVyID8gaW5wdXQgOiBuZXcgbWluaW1hbF8xLlJlYWRlcihpbnB1dCk7XG4gICAgICAgIGxldCBlbmQgPSBsZW5ndGggPT09IHVuZGVmaW5lZCA/IHJlYWRlci5sZW4gOiByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNNc2dHQ0NTdHJpa2UxNVYyRmFudGFzeV9GYW50YXN5VGVhbSgpO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Uuc2VjdGlvbmlkID0gcmVhZGVyLmludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5zbG90cy5wdXNoKGV4cG9ydHMuQ01zZ0dDQ1N0cmlrZTE1VjJGYW50YXN5X0ZhbnRhc3lTbG90LmRlY29kZShyZWFkZXIsIHJlYWRlci51aW50MzIoKSkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICByZWFkZXIuc2tpcFR5cGUodGFnICYgNyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH0sXG4gICAgZnJvbVBhcnRpYWwob2JqZWN0KSB7XG4gICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ01zZ0dDQ1N0cmlrZTE1VjJGYW50YXN5X0ZhbnRhc3lUZWFtKCk7XG4gICAgICAgIG1lc3NhZ2Uuc2VjdGlvbmlkID0gKF9hID0gb2JqZWN0LnNlY3Rpb25pZCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMDtcbiAgICAgICAgbWVzc2FnZS5zbG90cyA9XG4gICAgICAgICAgICAoKF9iID0gb2JqZWN0LnNsb3RzKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IubWFwKGUgPT4gZXhwb3J0cy5DTXNnR0NDU3RyaWtlMTVWMkZhbnRhc3lfRmFudGFzeVNsb3QuZnJvbVBhcnRpYWwoZSkpKSB8fCBbXTtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxufTtcbmZ1bmN0aW9uIGNyZWF0ZUJhc2VDQXR0cmlidXRlU3RyaW5nKCkge1xuICAgIHJldHVybiB7IHZhbHVlOiBcIlwiIH07XG59XG5leHBvcnRzLkNBdHRyaWJ1dGVTdHJpbmcgPSB7XG4gICAgZW5jb2RlKG1lc3NhZ2UsIHdyaXRlciA9IG1pbmltYWxfMS5Xcml0ZXIuY3JlYXRlKCkpIHtcbiAgICAgICAgaWYgKG1lc3NhZ2UudmFsdWUgIT09IFwiXCIpIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMTApLnN0cmluZyhtZXNzYWdlLnZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH0sXG4gICAgZGVjb2RlKGlucHV0LCBsZW5ndGgpIHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gaW5wdXQgaW5zdGFuY2VvZiBtaW5pbWFsXzEuUmVhZGVyID8gaW5wdXQgOiBuZXcgbWluaW1hbF8xLlJlYWRlcihpbnB1dCk7XG4gICAgICAgIGxldCBlbmQgPSBsZW5ndGggPT09IHVuZGVmaW5lZCA/IHJlYWRlci5sZW4gOiByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNBdHRyaWJ1dGVTdHJpbmcoKTtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhZyA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgIHN3aXRjaCAodGFnID4+PiAzKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnZhbHVlID0gcmVhZGVyLnN0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICByZWFkZXIuc2tpcFR5cGUodGFnICYgNyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH0sXG4gICAgZnJvbVBhcnRpYWwob2JqZWN0KSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDQXR0cmlidXRlU3RyaW5nKCk7XG4gICAgICAgIG1lc3NhZ2UudmFsdWUgPSAoX2EgPSBvYmplY3QudmFsdWUpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IFwiXCI7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbn07XG5mdW5jdGlvbiBjcmVhdGVCYXNlQ01zZ0NTdHJpa2UxNVdlbGNvbWUoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgc3RvcmVJdGVtSGFzaDogMCxcbiAgICAgICAgdGltZXBsYXllZGNvbnNlY3V0aXZlbHk6IDAsXG4gICAgICAgIHRpbWVGaXJzdFBsYXllZDogMCxcbiAgICAgICAgbGFzdFRpbWVQbGF5ZWQ6IDAsXG4gICAgICAgIGxhc3RJcEFkZHJlc3M6IDAsXG4gICAgICAgIGdzY29va2llaWQ6IExvbmcuVVpFUk8sXG4gICAgICAgIHVuaXF1ZWlkOiBMb25nLlVaRVJPXG4gICAgfTtcbn1cbmV4cG9ydHMuQ01zZ0NTdHJpa2UxNVdlbGNvbWUgPSB7XG4gICAgZW5jb2RlKG1lc3NhZ2UsIHdyaXRlciA9IG1pbmltYWxfMS5Xcml0ZXIuY3JlYXRlKCkpIHtcbiAgICAgICAgaWYgKG1lc3NhZ2Uuc3RvcmVJdGVtSGFzaCAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig0MCkudWludDMyKG1lc3NhZ2Uuc3RvcmVJdGVtSGFzaCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UudGltZXBsYXllZGNvbnNlY3V0aXZlbHkgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoNDgpLnVpbnQzMihtZXNzYWdlLnRpbWVwbGF5ZWRjb25zZWN1dGl2ZWx5KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS50aW1lRmlyc3RQbGF5ZWQgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoODApLnVpbnQzMihtZXNzYWdlLnRpbWVGaXJzdFBsYXllZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UubGFzdFRpbWVQbGF5ZWQgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoOTYpLnVpbnQzMihtZXNzYWdlLmxhc3RUaW1lUGxheWVkKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5sYXN0SXBBZGRyZXNzICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDEwNCkudWludDMyKG1lc3NhZ2UubGFzdElwQWRkcmVzcyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFtZXNzYWdlLmdzY29va2llaWQuaXNaZXJvKCkpIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMTQ0KS51aW50NjQobWVzc2FnZS5nc2Nvb2tpZWlkKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIW1lc3NhZ2UudW5pcXVlaWQuaXNaZXJvKCkpIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMTUyKS51aW50NjQobWVzc2FnZS51bmlxdWVpZCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9LFxuICAgIGRlY29kZShpbnB1dCwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IGlucHV0IGluc3RhbmNlb2YgbWluaW1hbF8xLlJlYWRlciA/IGlucHV0IDogbmV3IG1pbmltYWxfMS5SZWFkZXIoaW5wdXQpO1xuICAgICAgICBsZXQgZW5kID0gbGVuZ3RoID09PSB1bmRlZmluZWQgPyByZWFkZXIubGVuIDogcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDTXNnQ1N0cmlrZTE1V2VsY29tZSgpO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Uuc3RvcmVJdGVtSGFzaCA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnRpbWVwbGF5ZWRjb25zZWN1dGl2ZWx5ID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDEwOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnRpbWVGaXJzdFBsYXllZCA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAxMjpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5sYXN0VGltZVBsYXllZCA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAxMzpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5sYXN0SXBBZGRyZXNzID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDE4OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmdzY29va2llaWQgPSByZWFkZXIudWludDY0KCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMTk6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudW5pcXVlaWQgPSByZWFkZXIudWludDY0KCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJlYWRlci5za2lwVHlwZSh0YWcgJiA3KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfSxcbiAgICBmcm9tUGFydGlhbChvYmplY3QpIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2MsIF9kLCBfZTtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDTXNnQ1N0cmlrZTE1V2VsY29tZSgpO1xuICAgICAgICBtZXNzYWdlLnN0b3JlSXRlbUhhc2ggPSAoX2EgPSBvYmplY3Quc3RvcmVJdGVtSGFzaCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMDtcbiAgICAgICAgbWVzc2FnZS50aW1lcGxheWVkY29uc2VjdXRpdmVseSA9IChfYiA9IG9iamVjdC50aW1lcGxheWVkY29uc2VjdXRpdmVseSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogMDtcbiAgICAgICAgbWVzc2FnZS50aW1lRmlyc3RQbGF5ZWQgPSAoX2MgPSBvYmplY3QudGltZUZpcnN0UGxheWVkKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiAwO1xuICAgICAgICBtZXNzYWdlLmxhc3RUaW1lUGxheWVkID0gKF9kID0gb2JqZWN0Lmxhc3RUaW1lUGxheWVkKSAhPT0gbnVsbCAmJiBfZCAhPT0gdm9pZCAwID8gX2QgOiAwO1xuICAgICAgICBtZXNzYWdlLmxhc3RJcEFkZHJlc3MgPSAoX2UgPSBvYmplY3QubGFzdElwQWRkcmVzcykgIT09IG51bGwgJiYgX2UgIT09IHZvaWQgMCA/IF9lIDogMDtcbiAgICAgICAgbWVzc2FnZS5nc2Nvb2tpZWlkID1cbiAgICAgICAgICAgIG9iamVjdC5nc2Nvb2tpZWlkICE9PSB1bmRlZmluZWQgJiYgb2JqZWN0LmdzY29va2llaWQgIT09IG51bGxcbiAgICAgICAgICAgICAgICA/IExvbmcuZnJvbVZhbHVlKG9iamVjdC5nc2Nvb2tpZWlkKVxuICAgICAgICAgICAgICAgIDogTG9uZy5VWkVSTztcbiAgICAgICAgbWVzc2FnZS51bmlxdWVpZCA9XG4gICAgICAgICAgICBvYmplY3QudW5pcXVlaWQgIT09IHVuZGVmaW5lZCAmJiBvYmplY3QudW5pcXVlaWQgIT09IG51bGxcbiAgICAgICAgICAgICAgICA/IExvbmcuZnJvbVZhbHVlKG9iamVjdC51bmlxdWVpZClcbiAgICAgICAgICAgICAgICA6IExvbmcuVVpFUk87XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbn07XG5mdW5jdGlvbiBjcmVhdGVCYXNlQ01zZ0dDQ1N0cmlrZTE1VjJDbGllbnRWYXJWYWx1ZU5vdGlmaWNhdGlvbkluZm8oKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgdmFsdWVOYW1lOiBcIlwiLFxuICAgICAgICB2YWx1ZUludDogMCxcbiAgICAgICAgc2VydmVyQWRkcjogMCxcbiAgICAgICAgc2VydmVyUG9ydDogMCxcbiAgICAgICAgY2hva2VkQmxvY2tzOiBbXVxuICAgIH07XG59XG5leHBvcnRzLkNNc2dHQ0NTdHJpa2UxNVYyQ2xpZW50VmFyVmFsdWVOb3RpZmljYXRpb25JbmZvID0ge1xuICAgIGVuY29kZShtZXNzYWdlLCB3cml0ZXIgPSBtaW5pbWFsXzEuV3JpdGVyLmNyZWF0ZSgpKSB7XG4gICAgICAgIGlmIChtZXNzYWdlLnZhbHVlTmFtZSAhPT0gXCJcIikge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigxMCkuc3RyaW5nKG1lc3NhZ2UudmFsdWVOYW1lKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS52YWx1ZUludCAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigxNikuaW50MzIobWVzc2FnZS52YWx1ZUludCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2Uuc2VydmVyQWRkciAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigyNCkudWludDMyKG1lc3NhZ2Uuc2VydmVyQWRkcik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2Uuc2VydmVyUG9ydCAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigzMikudWludDMyKG1lc3NhZ2Uuc2VydmVyUG9ydCk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCB2IG9mIG1lc3NhZ2UuY2hva2VkQmxvY2tzKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDQyKS5zdHJpbmcodik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9LFxuICAgIGRlY29kZShpbnB1dCwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IGlucHV0IGluc3RhbmNlb2YgbWluaW1hbF8xLlJlYWRlciA/IGlucHV0IDogbmV3IG1pbmltYWxfMS5SZWFkZXIoaW5wdXQpO1xuICAgICAgICBsZXQgZW5kID0gbGVuZ3RoID09PSB1bmRlZmluZWQgPyByZWFkZXIubGVuIDogcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDTXNnR0NDU3RyaWtlMTVWMkNsaWVudFZhclZhbHVlTm90aWZpY2F0aW9uSW5mbygpO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudmFsdWVOYW1lID0gcmVhZGVyLnN0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudmFsdWVJbnQgPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnNlcnZlckFkZHIgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5zZXJ2ZXJQb3J0ID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuY2hva2VkQmxvY2tzLnB1c2gocmVhZGVyLnN0cmluZygpKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmVhZGVyLnNraXBUeXBlKHRhZyAmIDcpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9LFxuICAgIGZyb21QYXJ0aWFsKG9iamVjdCkge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYywgX2QsIF9lO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNNc2dHQ0NTdHJpa2UxNVYyQ2xpZW50VmFyVmFsdWVOb3RpZmljYXRpb25JbmZvKCk7XG4gICAgICAgIG1lc3NhZ2UudmFsdWVOYW1lID0gKF9hID0gb2JqZWN0LnZhbHVlTmFtZSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogXCJcIjtcbiAgICAgICAgbWVzc2FnZS52YWx1ZUludCA9IChfYiA9IG9iamVjdC52YWx1ZUludCkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogMDtcbiAgICAgICAgbWVzc2FnZS5zZXJ2ZXJBZGRyID0gKF9jID0gb2JqZWN0LnNlcnZlckFkZHIpICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IDA7XG4gICAgICAgIG1lc3NhZ2Uuc2VydmVyUG9ydCA9IChfZCA9IG9iamVjdC5zZXJ2ZXJQb3J0KSAhPT0gbnVsbCAmJiBfZCAhPT0gdm9pZCAwID8gX2QgOiAwO1xuICAgICAgICBtZXNzYWdlLmNob2tlZEJsb2NrcyA9ICgoX2UgPSBvYmplY3QuY2hva2VkQmxvY2tzKSA9PT0gbnVsbCB8fCBfZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2UubWFwKGUgPT4gZSkpIHx8IFtdO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG59O1xuZnVuY3Rpb24gY3JlYXRlQmFzZUNNc2dHQ0NTdHJpa2UxNVYyU2VydmVyVmFyVmFsdWVOb3RpZmljYXRpb25JbmZvKCkge1xuICAgIHJldHVybiB7IGFjY291bnRpZDogMCwgdmlld2FuZ2xlczogW10sIHR5cGU6IDAsIHVzZXJkYXRhOiBbXSB9O1xufVxuZXhwb3J0cy5DTXNnR0NDU3RyaWtlMTVWMlNlcnZlclZhclZhbHVlTm90aWZpY2F0aW9uSW5mbyA9IHtcbiAgICBlbmNvZGUobWVzc2FnZSwgd3JpdGVyID0gbWluaW1hbF8xLldyaXRlci5jcmVhdGUoKSkge1xuICAgICAgICBpZiAobWVzc2FnZS5hY2NvdW50aWQgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoOCkudWludDMyKG1lc3NhZ2UuYWNjb3VudGlkKTtcbiAgICAgICAgfVxuICAgICAgICB3cml0ZXIudWludDMyKDE4KS5mb3JrKCk7XG4gICAgICAgIGZvciAoY29uc3QgdiBvZiBtZXNzYWdlLnZpZXdhbmdsZXMpIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIodik7XG4gICAgICAgIH1cbiAgICAgICAgd3JpdGVyLmxkZWxpbSgpO1xuICAgICAgICBpZiAobWVzc2FnZS50eXBlICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDI0KS51aW50MzIobWVzc2FnZS50eXBlKTtcbiAgICAgICAgfVxuICAgICAgICB3cml0ZXIudWludDMyKDM0KS5mb3JrKCk7XG4gICAgICAgIGZvciAoY29uc3QgdiBvZiBtZXNzYWdlLnVzZXJkYXRhKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKHYpO1xuICAgICAgICB9XG4gICAgICAgIHdyaXRlci5sZGVsaW0oKTtcbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9LFxuICAgIGRlY29kZShpbnB1dCwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IGlucHV0IGluc3RhbmNlb2YgbWluaW1hbF8xLlJlYWRlciA/IGlucHV0IDogbmV3IG1pbmltYWxfMS5SZWFkZXIoaW5wdXQpO1xuICAgICAgICBsZXQgZW5kID0gbGVuZ3RoID09PSB1bmRlZmluZWQgPyByZWFkZXIubGVuIDogcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDTXNnR0NDU3RyaWtlMTVWMlNlcnZlclZhclZhbHVlTm90aWZpY2F0aW9uSW5mbygpO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuYWNjb3VudGlkID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIGlmICgodGFnICYgNykgPT09IDIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuZDIgPSByZWFkZXIudWludDMyKCkgKyByZWFkZXIucG9zO1xuICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS52aWV3YW5nbGVzLnB1c2gocmVhZGVyLnVpbnQzMigpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Uudmlld2FuZ2xlcy5wdXNoKHJlYWRlci51aW50MzIoKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnR5cGUgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgaWYgKCh0YWcgJiA3KSA9PT0gMikge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZW5kMiA9IHJlYWRlci51aW50MzIoKSArIHJlYWRlci5wb3M7XG4gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZDIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnVzZXJkYXRhLnB1c2gocmVhZGVyLnVpbnQzMigpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudXNlcmRhdGEucHVzaChyZWFkZXIudWludDMyKCkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJlYWRlci5za2lwVHlwZSh0YWcgJiA3KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfSxcbiAgICBmcm9tUGFydGlhbChvYmplY3QpIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2MsIF9kO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNNc2dHQ0NTdHJpa2UxNVYyU2VydmVyVmFyVmFsdWVOb3RpZmljYXRpb25JbmZvKCk7XG4gICAgICAgIG1lc3NhZ2UuYWNjb3VudGlkID0gKF9hID0gb2JqZWN0LmFjY291bnRpZCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMDtcbiAgICAgICAgbWVzc2FnZS52aWV3YW5nbGVzID0gKChfYiA9IG9iamVjdC52aWV3YW5nbGVzKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IubWFwKGUgPT4gZSkpIHx8IFtdO1xuICAgICAgICBtZXNzYWdlLnR5cGUgPSAoX2MgPSBvYmplY3QudHlwZSkgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogMDtcbiAgICAgICAgbWVzc2FnZS51c2VyZGF0YSA9ICgoX2QgPSBvYmplY3QudXNlcmRhdGEpID09PSBudWxsIHx8IF9kID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZC5tYXAoZSA9PiBlKSkgfHwgW107XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbn07XG5mdW5jdGlvbiBjcmVhdGVCYXNlQ01zZ0dDQ1N0cmlrZTE1VjJHaWZ0c0xlYWRlcmJvYXJkUmVxdWVzdCgpIHtcbiAgICByZXR1cm4ge307XG59XG5leHBvcnRzLkNNc2dHQ0NTdHJpa2UxNVYyR2lmdHNMZWFkZXJib2FyZFJlcXVlc3QgPSB7XG4gICAgZW5jb2RlKF8sIHdyaXRlciA9IG1pbmltYWxfMS5Xcml0ZXIuY3JlYXRlKCkpIHtcbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9LFxuICAgIGRlY29kZShpbnB1dCwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IGlucHV0IGluc3RhbmNlb2YgbWluaW1hbF8xLlJlYWRlciA/IGlucHV0IDogbmV3IG1pbmltYWxfMS5SZWFkZXIoaW5wdXQpO1xuICAgICAgICBsZXQgZW5kID0gbGVuZ3RoID09PSB1bmRlZmluZWQgPyByZWFkZXIubGVuIDogcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDTXNnR0NDU3RyaWtlMTVWMkdpZnRzTGVhZGVyYm9hcmRSZXF1ZXN0KCk7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBjb25zdCB0YWcgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKHRhZyA+Pj4gMykge1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJlYWRlci5za2lwVHlwZSh0YWcgJiA3KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfSxcbiAgICBmcm9tUGFydGlhbChfKSB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ01zZ0dDQ1N0cmlrZTE1VjJHaWZ0c0xlYWRlcmJvYXJkUmVxdWVzdCgpO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG59O1xuZnVuY3Rpb24gY3JlYXRlQmFzZUNNc2dHQ0NTdHJpa2UxNVYyR2lmdHNMZWFkZXJib2FyZFJlc3BvbnNlKCkge1xuICAgIHJldHVybiB7XG4gICAgICAgIHNlcnZlcnRpbWU6IDAsXG4gICAgICAgIHRpbWVQZXJpb2RTZWNvbmRzOiAwLFxuICAgICAgICB0b3RhbEdpZnRzR2l2ZW46IDAsXG4gICAgICAgIHRvdGFsR2l2ZXJzOiAwLFxuICAgICAgICBlbnRyaWVzOiBbXVxuICAgIH07XG59XG5leHBvcnRzLkNNc2dHQ0NTdHJpa2UxNVYyR2lmdHNMZWFkZXJib2FyZFJlc3BvbnNlID0ge1xuICAgIGVuY29kZShtZXNzYWdlLCB3cml0ZXIgPSBtaW5pbWFsXzEuV3JpdGVyLmNyZWF0ZSgpKSB7XG4gICAgICAgIGlmIChtZXNzYWdlLnNlcnZlcnRpbWUgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoOCkudWludDMyKG1lc3NhZ2Uuc2VydmVydGltZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UudGltZVBlcmlvZFNlY29uZHMgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMTYpLnVpbnQzMihtZXNzYWdlLnRpbWVQZXJpb2RTZWNvbmRzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS50b3RhbEdpZnRzR2l2ZW4gIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMjQpLnVpbnQzMihtZXNzYWdlLnRvdGFsR2lmdHNHaXZlbik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UudG90YWxHaXZlcnMgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMzIpLnVpbnQzMihtZXNzYWdlLnRvdGFsR2l2ZXJzKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IHYgb2YgbWVzc2FnZS5lbnRyaWVzKSB7XG4gICAgICAgICAgICBleHBvcnRzLkNNc2dHQ0NTdHJpa2UxNVYyR2lmdHNMZWFkZXJib2FyZFJlc3BvbnNlX0dpZnRMZWFkZXJib2FyZEVudHJ5LmVuY29kZSh2LCB3cml0ZXIudWludDMyKDQyKS5mb3JrKCkpLmxkZWxpbSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfSxcbiAgICBkZWNvZGUoaW5wdXQsIGxlbmd0aCkge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBpbnB1dCBpbnN0YW5jZW9mIG1pbmltYWxfMS5SZWFkZXIgPyBpbnB1dCA6IG5ldyBtaW5pbWFsXzEuUmVhZGVyKGlucHV0KTtcbiAgICAgICAgbGV0IGVuZCA9IGxlbmd0aCA9PT0gdW5kZWZpbmVkID8gcmVhZGVyLmxlbiA6IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ01zZ0dDQ1N0cmlrZTE1VjJHaWZ0c0xlYWRlcmJvYXJkUmVzcG9uc2UoKTtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhZyA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgIHN3aXRjaCAodGFnID4+PiAzKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnNlcnZlcnRpbWUgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS50aW1lUGVyaW9kU2Vjb25kcyA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnRvdGFsR2lmdHNHaXZlbiA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnRvdGFsR2l2ZXJzID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZW50cmllcy5wdXNoKGV4cG9ydHMuQ01zZ0dDQ1N0cmlrZTE1VjJHaWZ0c0xlYWRlcmJvYXJkUmVzcG9uc2VfR2lmdExlYWRlcmJvYXJkRW50cnkuZGVjb2RlKHJlYWRlciwgcmVhZGVyLnVpbnQzMigpKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJlYWRlci5za2lwVHlwZSh0YWcgJiA3KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfSxcbiAgICBmcm9tUGFydGlhbChvYmplY3QpIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2MsIF9kLCBfZTtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDTXNnR0NDU3RyaWtlMTVWMkdpZnRzTGVhZGVyYm9hcmRSZXNwb25zZSgpO1xuICAgICAgICBtZXNzYWdlLnNlcnZlcnRpbWUgPSAoX2EgPSBvYmplY3Quc2VydmVydGltZSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMDtcbiAgICAgICAgbWVzc2FnZS50aW1lUGVyaW9kU2Vjb25kcyA9IChfYiA9IG9iamVjdC50aW1lUGVyaW9kU2Vjb25kcykgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogMDtcbiAgICAgICAgbWVzc2FnZS50b3RhbEdpZnRzR2l2ZW4gPSAoX2MgPSBvYmplY3QudG90YWxHaWZ0c0dpdmVuKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiAwO1xuICAgICAgICBtZXNzYWdlLnRvdGFsR2l2ZXJzID0gKF9kID0gb2JqZWN0LnRvdGFsR2l2ZXJzKSAhPT0gbnVsbCAmJiBfZCAhPT0gdm9pZCAwID8gX2QgOiAwO1xuICAgICAgICBtZXNzYWdlLmVudHJpZXMgPVxuICAgICAgICAgICAgKChfZSA9IG9iamVjdC5lbnRyaWVzKSA9PT0gbnVsbCB8fCBfZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2UubWFwKGUgPT4gZXhwb3J0cy5DTXNnR0NDU3RyaWtlMTVWMkdpZnRzTGVhZGVyYm9hcmRSZXNwb25zZV9HaWZ0TGVhZGVyYm9hcmRFbnRyeS5mcm9tUGFydGlhbChlKSkpIHx8IFtdO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG59O1xuZnVuY3Rpb24gY3JlYXRlQmFzZUNNc2dHQ0NTdHJpa2UxNVYyR2lmdHNMZWFkZXJib2FyZFJlc3BvbnNlX0dpZnRMZWFkZXJib2FyZEVudHJ5KCkge1xuICAgIHJldHVybiB7IGFjY291bnRpZDogMCwgZ2lmdHM6IDAgfTtcbn1cbmV4cG9ydHMuQ01zZ0dDQ1N0cmlrZTE1VjJHaWZ0c0xlYWRlcmJvYXJkUmVzcG9uc2VfR2lmdExlYWRlcmJvYXJkRW50cnkgPSB7XG4gICAgZW5jb2RlKG1lc3NhZ2UsIHdyaXRlciA9IG1pbmltYWxfMS5Xcml0ZXIuY3JlYXRlKCkpIHtcbiAgICAgICAgaWYgKG1lc3NhZ2UuYWNjb3VudGlkICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDgpLnVpbnQzMihtZXNzYWdlLmFjY291bnRpZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UuZ2lmdHMgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMTYpLnVpbnQzMihtZXNzYWdlLmdpZnRzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH0sXG4gICAgZGVjb2RlKGlucHV0LCBsZW5ndGgpIHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gaW5wdXQgaW5zdGFuY2VvZiBtaW5pbWFsXzEuUmVhZGVyID8gaW5wdXQgOiBuZXcgbWluaW1hbF8xLlJlYWRlcihpbnB1dCk7XG4gICAgICAgIGxldCBlbmQgPSBsZW5ndGggPT09IHVuZGVmaW5lZCA/IHJlYWRlci5sZW4gOiByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNNc2dHQ0NTdHJpa2UxNVYyR2lmdHNMZWFkZXJib2FyZFJlc3BvbnNlX0dpZnRMZWFkZXJib2FyZEVudHJ5KCk7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBjb25zdCB0YWcgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKHRhZyA+Pj4gMykge1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5hY2NvdW50aWQgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5naWZ0cyA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmVhZGVyLnNraXBUeXBlKHRhZyAmIDcpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9LFxuICAgIGZyb21QYXJ0aWFsKG9iamVjdCkge1xuICAgICAgICB2YXIgX2EsIF9iO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNNc2dHQ0NTdHJpa2UxNVYyR2lmdHNMZWFkZXJib2FyZFJlc3BvbnNlX0dpZnRMZWFkZXJib2FyZEVudHJ5KCk7XG4gICAgICAgIG1lc3NhZ2UuYWNjb3VudGlkID0gKF9hID0gb2JqZWN0LmFjY291bnRpZCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMDtcbiAgICAgICAgbWVzc2FnZS5naWZ0cyA9IChfYiA9IG9iamVjdC5naWZ0cykgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogMDtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxufTtcbmZ1bmN0aW9uIGNyZWF0ZUJhc2VDTXNnR0NDU3RyaWtlMTVWMkNsaWVudFN1Ym1pdFN1cnZleVZvdGUoKSB7XG4gICAgcmV0dXJuIHsgc3VydmV5SWQ6IDAsIHZvdGU6IDAgfTtcbn1cbmV4cG9ydHMuQ01zZ0dDQ1N0cmlrZTE1VjJDbGllbnRTdWJtaXRTdXJ2ZXlWb3RlID0ge1xuICAgIGVuY29kZShtZXNzYWdlLCB3cml0ZXIgPSBtaW5pbWFsXzEuV3JpdGVyLmNyZWF0ZSgpKSB7XG4gICAgICAgIGlmIChtZXNzYWdlLnN1cnZleUlkICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDgpLnVpbnQzMihtZXNzYWdlLnN1cnZleUlkKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS52b3RlICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDE2KS51aW50MzIobWVzc2FnZS52b3RlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH0sXG4gICAgZGVjb2RlKGlucHV0LCBsZW5ndGgpIHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gaW5wdXQgaW5zdGFuY2VvZiBtaW5pbWFsXzEuUmVhZGVyID8gaW5wdXQgOiBuZXcgbWluaW1hbF8xLlJlYWRlcihpbnB1dCk7XG4gICAgICAgIGxldCBlbmQgPSBsZW5ndGggPT09IHVuZGVmaW5lZCA/IHJlYWRlci5sZW4gOiByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNNc2dHQ0NTdHJpa2UxNVYyQ2xpZW50U3VibWl0U3VydmV5Vm90ZSgpO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Uuc3VydmV5SWQgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS52b3RlID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICByZWFkZXIuc2tpcFR5cGUodGFnICYgNyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH0sXG4gICAgZnJvbVBhcnRpYWwob2JqZWN0KSB7XG4gICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ01zZ0dDQ1N0cmlrZTE1VjJDbGllbnRTdWJtaXRTdXJ2ZXlWb3RlKCk7XG4gICAgICAgIG1lc3NhZ2Uuc3VydmV5SWQgPSAoX2EgPSBvYmplY3Quc3VydmV5SWQpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IDA7XG4gICAgICAgIG1lc3NhZ2Uudm90ZSA9IChfYiA9IG9iamVjdC52b3RlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAwO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG59O1xuZnVuY3Rpb24gY3JlYXRlQmFzZUNNc2dHQ0NTdHJpa2UxNVYyU2VydmVyMkdDQ2xpZW50VmFsaWRhdGUoKSB7XG4gICAgcmV0dXJuIHsgYWNjb3VudGlkOiAwIH07XG59XG5leHBvcnRzLkNNc2dHQ0NTdHJpa2UxNVYyU2VydmVyMkdDQ2xpZW50VmFsaWRhdGUgPSB7XG4gICAgZW5jb2RlKG1lc3NhZ2UsIHdyaXRlciA9IG1pbmltYWxfMS5Xcml0ZXIuY3JlYXRlKCkpIHtcbiAgICAgICAgaWYgKG1lc3NhZ2UuYWNjb3VudGlkICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDgpLnVpbnQzMihtZXNzYWdlLmFjY291bnRpZCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9LFxuICAgIGRlY29kZShpbnB1dCwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IGlucHV0IGluc3RhbmNlb2YgbWluaW1hbF8xLlJlYWRlciA/IGlucHV0IDogbmV3IG1pbmltYWxfMS5SZWFkZXIoaW5wdXQpO1xuICAgICAgICBsZXQgZW5kID0gbGVuZ3RoID09PSB1bmRlZmluZWQgPyByZWFkZXIubGVuIDogcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDTXNnR0NDU3RyaWtlMTVWMlNlcnZlcjJHQ0NsaWVudFZhbGlkYXRlKCk7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBjb25zdCB0YWcgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKHRhZyA+Pj4gMykge1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5hY2NvdW50aWQgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJlYWRlci5za2lwVHlwZSh0YWcgJiA3KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfSxcbiAgICBmcm9tUGFydGlhbChvYmplY3QpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNNc2dHQ0NTdHJpa2UxNVYyU2VydmVyMkdDQ2xpZW50VmFsaWRhdGUoKTtcbiAgICAgICAgbWVzc2FnZS5hY2NvdW50aWQgPSAoX2EgPSBvYmplY3QuYWNjb3VudGlkKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAwO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG59O1xuZnVuY3Rpb24gY3JlYXRlQmFzZUNNc2dHQ0NTdHJpa2UxNVYyR0MyQ2xpZW50VG91cm5hbWVudEluZm8oKSB7XG4gICAgcmV0dXJuIHsgZXZlbnRpZDogMCwgc3RhZ2VpZDogMCwgZ2FtZVR5cGU6IDAsIHRlYW1pZHM6IFtdIH07XG59XG5leHBvcnRzLkNNc2dHQ0NTdHJpa2UxNVYyR0MyQ2xpZW50VG91cm5hbWVudEluZm8gPSB7XG4gICAgZW5jb2RlKG1lc3NhZ2UsIHdyaXRlciA9IG1pbmltYWxfMS5Xcml0ZXIuY3JlYXRlKCkpIHtcbiAgICAgICAgaWYgKG1lc3NhZ2UuZXZlbnRpZCAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig4KS51aW50MzIobWVzc2FnZS5ldmVudGlkKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5zdGFnZWlkICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDE2KS51aW50MzIobWVzc2FnZS5zdGFnZWlkKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5nYW1lVHlwZSAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigyNCkudWludDMyKG1lc3NhZ2UuZ2FtZVR5cGUpO1xuICAgICAgICB9XG4gICAgICAgIHdyaXRlci51aW50MzIoMzQpLmZvcmsoKTtcbiAgICAgICAgZm9yIChjb25zdCB2IG9mIG1lc3NhZ2UudGVhbWlkcykge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMih2KTtcbiAgICAgICAgfVxuICAgICAgICB3cml0ZXIubGRlbGltKCk7XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfSxcbiAgICBkZWNvZGUoaW5wdXQsIGxlbmd0aCkge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBpbnB1dCBpbnN0YW5jZW9mIG1pbmltYWxfMS5SZWFkZXIgPyBpbnB1dCA6IG5ldyBtaW5pbWFsXzEuUmVhZGVyKGlucHV0KTtcbiAgICAgICAgbGV0IGVuZCA9IGxlbmd0aCA9PT0gdW5kZWZpbmVkID8gcmVhZGVyLmxlbiA6IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ01zZ0dDQ1N0cmlrZTE1VjJHQzJDbGllbnRUb3VybmFtZW50SW5mbygpO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZXZlbnRpZCA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnN0YWdlaWQgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5nYW1lVHlwZSA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICBpZiAoKHRhZyAmIDcpID09PSAyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbmQyID0gcmVhZGVyLnVpbnQzMigpICsgcmVhZGVyLnBvcztcbiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kMikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudGVhbWlkcy5wdXNoKHJlYWRlci51aW50MzIoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnRlYW1pZHMucHVzaChyZWFkZXIudWludDMyKCkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJlYWRlci5za2lwVHlwZSh0YWcgJiA3KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfSxcbiAgICBmcm9tUGFydGlhbChvYmplY3QpIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2MsIF9kO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNNc2dHQ0NTdHJpa2UxNVYyR0MyQ2xpZW50VG91cm5hbWVudEluZm8oKTtcbiAgICAgICAgbWVzc2FnZS5ldmVudGlkID0gKF9hID0gb2JqZWN0LmV2ZW50aWQpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IDA7XG4gICAgICAgIG1lc3NhZ2Uuc3RhZ2VpZCA9IChfYiA9IG9iamVjdC5zdGFnZWlkKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAwO1xuICAgICAgICBtZXNzYWdlLmdhbWVUeXBlID0gKF9jID0gb2JqZWN0LmdhbWVUeXBlKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiAwO1xuICAgICAgICBtZXNzYWdlLnRlYW1pZHMgPSAoKF9kID0gb2JqZWN0LnRlYW1pZHMpID09PSBudWxsIHx8IF9kID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZC5tYXAoZSA9PiBlKSkgfHwgW107XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbn07XG5mdW5jdGlvbiBjcmVhdGVCYXNlQ1NPRWNvbkNvdXBvbigpIHtcbiAgICByZXR1cm4geyBlbnRyeWlkOiAwLCBkZWZpZHg6IDAsIGV4cGlyYXRpb25EYXRlOiAwIH07XG59XG5leHBvcnRzLkNTT0Vjb25Db3Vwb24gPSB7XG4gICAgZW5jb2RlKG1lc3NhZ2UsIHdyaXRlciA9IG1pbmltYWxfMS5Xcml0ZXIuY3JlYXRlKCkpIHtcbiAgICAgICAgaWYgKG1lc3NhZ2UuZW50cnlpZCAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig4KS51aW50MzIobWVzc2FnZS5lbnRyeWlkKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5kZWZpZHggIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMTYpLnVpbnQzMihtZXNzYWdlLmRlZmlkeCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UuZXhwaXJhdGlvbkRhdGUgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMjkpLmZpeGVkMzIobWVzc2FnZS5leHBpcmF0aW9uRGF0ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9LFxuICAgIGRlY29kZShpbnB1dCwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IGlucHV0IGluc3RhbmNlb2YgbWluaW1hbF8xLlJlYWRlciA/IGlucHV0IDogbmV3IG1pbmltYWxfMS5SZWFkZXIoaW5wdXQpO1xuICAgICAgICBsZXQgZW5kID0gbGVuZ3RoID09PSB1bmRlZmluZWQgPyByZWFkZXIubGVuIDogcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDU09FY29uQ291cG9uKCk7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBjb25zdCB0YWcgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKHRhZyA+Pj4gMykge1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5lbnRyeWlkID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZGVmaWR4ID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZXhwaXJhdGlvbkRhdGUgPSByZWFkZXIuZml4ZWQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICByZWFkZXIuc2tpcFR5cGUodGFnICYgNyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH0sXG4gICAgZnJvbVBhcnRpYWwob2JqZWN0KSB7XG4gICAgICAgIHZhciBfYSwgX2IsIF9jO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNTT0Vjb25Db3Vwb24oKTtcbiAgICAgICAgbWVzc2FnZS5lbnRyeWlkID0gKF9hID0gb2JqZWN0LmVudHJ5aWQpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IDA7XG4gICAgICAgIG1lc3NhZ2UuZGVmaWR4ID0gKF9iID0gb2JqZWN0LmRlZmlkeCkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogMDtcbiAgICAgICAgbWVzc2FnZS5leHBpcmF0aW9uRGF0ZSA9IChfYyA9IG9iamVjdC5leHBpcmF0aW9uRGF0ZSkgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogMDtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxufTtcbmZ1bmN0aW9uIGNyZWF0ZUJhc2VDU09RdWVzdFByb2dyZXNzKCkge1xuICAgIHJldHVybiB7IHF1ZXN0aWQ6IDAsIHBvaW50c1JlbWFpbmluZzogMCwgYm9udXNQb2ludHM6IDAgfTtcbn1cbmV4cG9ydHMuQ1NPUXVlc3RQcm9ncmVzcyA9IHtcbiAgICBlbmNvZGUobWVzc2FnZSwgd3JpdGVyID0gbWluaW1hbF8xLldyaXRlci5jcmVhdGUoKSkge1xuICAgICAgICBpZiAobWVzc2FnZS5xdWVzdGlkICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDgpLnVpbnQzMihtZXNzYWdlLnF1ZXN0aWQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLnBvaW50c1JlbWFpbmluZyAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigxNikudWludDMyKG1lc3NhZ2UucG9pbnRzUmVtYWluaW5nKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5ib251c1BvaW50cyAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigyNCkudWludDMyKG1lc3NhZ2UuYm9udXNQb2ludHMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfSxcbiAgICBkZWNvZGUoaW5wdXQsIGxlbmd0aCkge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBpbnB1dCBpbnN0YW5jZW9mIG1pbmltYWxfMS5SZWFkZXIgPyBpbnB1dCA6IG5ldyBtaW5pbWFsXzEuUmVhZGVyKGlucHV0KTtcbiAgICAgICAgbGV0IGVuZCA9IGxlbmd0aCA9PT0gdW5kZWZpbmVkID8gcmVhZGVyLmxlbiA6IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ1NPUXVlc3RQcm9ncmVzcygpO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UucXVlc3RpZCA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnBvaW50c1JlbWFpbmluZyA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmJvbnVzUG9pbnRzID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICByZWFkZXIuc2tpcFR5cGUodGFnICYgNyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH0sXG4gICAgZnJvbVBhcnRpYWwob2JqZWN0KSB7XG4gICAgICAgIHZhciBfYSwgX2IsIF9jO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNTT1F1ZXN0UHJvZ3Jlc3MoKTtcbiAgICAgICAgbWVzc2FnZS5xdWVzdGlkID0gKF9hID0gb2JqZWN0LnF1ZXN0aWQpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IDA7XG4gICAgICAgIG1lc3NhZ2UucG9pbnRzUmVtYWluaW5nID0gKF9iID0gb2JqZWN0LnBvaW50c1JlbWFpbmluZykgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogMDtcbiAgICAgICAgbWVzc2FnZS5ib251c1BvaW50cyA9IChfYyA9IG9iamVjdC5ib251c1BvaW50cykgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogMDtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxufTtcbmZ1bmN0aW9uIGNyZWF0ZUJhc2VDU09BY2NvdW50U2Vhc29uYWxPcGVyYXRpb24oKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgc2Vhc29uVmFsdWU6IDAsXG4gICAgICAgIHRpZXJVbmxvY2tlZDogMCxcbiAgICAgICAgcHJlbWl1bVRpZXJzOiAwLFxuICAgICAgICBtaXNzaW9uSWQ6IDAsXG4gICAgICAgIG1pc3Npb25zQ29tcGxldGVkOiAwLFxuICAgICAgICByZWRlZW1hYmxlQmFsYW5jZTogMCxcbiAgICAgICAgc2Vhc29uUGFzc1RpbWU6IDBcbiAgICB9O1xufVxuZXhwb3J0cy5DU09BY2NvdW50U2Vhc29uYWxPcGVyYXRpb24gPSB7XG4gICAgZW5jb2RlKG1lc3NhZ2UsIHdyaXRlciA9IG1pbmltYWxfMS5Xcml0ZXIuY3JlYXRlKCkpIHtcbiAgICAgICAgaWYgKG1lc3NhZ2Uuc2Vhc29uVmFsdWUgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoOCkudWludDMyKG1lc3NhZ2Uuc2Vhc29uVmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLnRpZXJVbmxvY2tlZCAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigxNikudWludDMyKG1lc3NhZ2UudGllclVubG9ja2VkKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5wcmVtaXVtVGllcnMgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMjQpLnVpbnQzMihtZXNzYWdlLnByZW1pdW1UaWVycyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UubWlzc2lvbklkICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDMyKS51aW50MzIobWVzc2FnZS5taXNzaW9uSWQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLm1pc3Npb25zQ29tcGxldGVkICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDQwKS51aW50MzIobWVzc2FnZS5taXNzaW9uc0NvbXBsZXRlZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UucmVkZWVtYWJsZUJhbGFuY2UgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoNDgpLnVpbnQzMihtZXNzYWdlLnJlZGVlbWFibGVCYWxhbmNlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5zZWFzb25QYXNzVGltZSAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig1NikudWludDMyKG1lc3NhZ2Uuc2Vhc29uUGFzc1RpbWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfSxcbiAgICBkZWNvZGUoaW5wdXQsIGxlbmd0aCkge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBpbnB1dCBpbnN0YW5jZW9mIG1pbmltYWxfMS5SZWFkZXIgPyBpbnB1dCA6IG5ldyBtaW5pbWFsXzEuUmVhZGVyKGlucHV0KTtcbiAgICAgICAgbGV0IGVuZCA9IGxlbmd0aCA9PT0gdW5kZWZpbmVkID8gcmVhZGVyLmxlbiA6IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ1NPQWNjb3VudFNlYXNvbmFsT3BlcmF0aW9uKCk7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBjb25zdCB0YWcgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKHRhZyA+Pj4gMykge1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5zZWFzb25WYWx1ZSA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnRpZXJVbmxvY2tlZCA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnByZW1pdW1UaWVycyA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLm1pc3Npb25JZCA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLm1pc3Npb25zQ29tcGxldGVkID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UucmVkZWVtYWJsZUJhbGFuY2UgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNzpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5zZWFzb25QYXNzVGltZSA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmVhZGVyLnNraXBUeXBlKHRhZyAmIDcpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9LFxuICAgIGZyb21QYXJ0aWFsKG9iamVjdCkge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYywgX2QsIF9lLCBfZiwgX2c7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ1NPQWNjb3VudFNlYXNvbmFsT3BlcmF0aW9uKCk7XG4gICAgICAgIG1lc3NhZ2Uuc2Vhc29uVmFsdWUgPSAoX2EgPSBvYmplY3Quc2Vhc29uVmFsdWUpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IDA7XG4gICAgICAgIG1lc3NhZ2UudGllclVubG9ja2VkID0gKF9iID0gb2JqZWN0LnRpZXJVbmxvY2tlZCkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogMDtcbiAgICAgICAgbWVzc2FnZS5wcmVtaXVtVGllcnMgPSAoX2MgPSBvYmplY3QucHJlbWl1bVRpZXJzKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiAwO1xuICAgICAgICBtZXNzYWdlLm1pc3Npb25JZCA9IChfZCA9IG9iamVjdC5taXNzaW9uSWQpICE9PSBudWxsICYmIF9kICE9PSB2b2lkIDAgPyBfZCA6IDA7XG4gICAgICAgIG1lc3NhZ2UubWlzc2lvbnNDb21wbGV0ZWQgPSAoX2UgPSBvYmplY3QubWlzc2lvbnNDb21wbGV0ZWQpICE9PSBudWxsICYmIF9lICE9PSB2b2lkIDAgPyBfZSA6IDA7XG4gICAgICAgIG1lc3NhZ2UucmVkZWVtYWJsZUJhbGFuY2UgPSAoX2YgPSBvYmplY3QucmVkZWVtYWJsZUJhbGFuY2UpICE9PSBudWxsICYmIF9mICE9PSB2b2lkIDAgPyBfZiA6IDA7XG4gICAgICAgIG1lc3NhZ2Uuc2Vhc29uUGFzc1RpbWUgPSAoX2cgPSBvYmplY3Quc2Vhc29uUGFzc1RpbWUpICE9PSBudWxsICYmIF9nICE9PSB2b2lkIDAgPyBfZyA6IDA7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbn07XG5mdW5jdGlvbiBjcmVhdGVCYXNlQ1NPQWNjb3VudFJlY3VycmluZ1N1YnNjcmlwdGlvbigpIHtcbiAgICByZXR1cm4geyB0aW1lTmV4dEN5Y2xlOiAwLCB0aW1lSW5pdGlhdGVkOiAwIH07XG59XG5leHBvcnRzLkNTT0FjY291bnRSZWN1cnJpbmdTdWJzY3JpcHRpb24gPSB7XG4gICAgZW5jb2RlKG1lc3NhZ2UsIHdyaXRlciA9IG1pbmltYWxfMS5Xcml0ZXIuY3JlYXRlKCkpIHtcbiAgICAgICAgaWYgKG1lc3NhZ2UudGltZU5leHRDeWNsZSAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig4KS51aW50MzIobWVzc2FnZS50aW1lTmV4dEN5Y2xlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS50aW1lSW5pdGlhdGVkICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDE2KS51aW50MzIobWVzc2FnZS50aW1lSW5pdGlhdGVkKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH0sXG4gICAgZGVjb2RlKGlucHV0LCBsZW5ndGgpIHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gaW5wdXQgaW5zdGFuY2VvZiBtaW5pbWFsXzEuUmVhZGVyID8gaW5wdXQgOiBuZXcgbWluaW1hbF8xLlJlYWRlcihpbnB1dCk7XG4gICAgICAgIGxldCBlbmQgPSBsZW5ndGggPT09IHVuZGVmaW5lZCA/IHJlYWRlci5sZW4gOiByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNTT0FjY291bnRSZWN1cnJpbmdTdWJzY3JpcHRpb24oKTtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhZyA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgIHN3aXRjaCAodGFnID4+PiAzKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnRpbWVOZXh0Q3ljbGUgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS50aW1lSW5pdGlhdGVkID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICByZWFkZXIuc2tpcFR5cGUodGFnICYgNyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH0sXG4gICAgZnJvbVBhcnRpYWwob2JqZWN0KSB7XG4gICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ1NPQWNjb3VudFJlY3VycmluZ1N1YnNjcmlwdGlvbigpO1xuICAgICAgICBtZXNzYWdlLnRpbWVOZXh0Q3ljbGUgPSAoX2EgPSBvYmplY3QudGltZU5leHRDeWNsZSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMDtcbiAgICAgICAgbWVzc2FnZS50aW1lSW5pdGlhdGVkID0gKF9iID0gb2JqZWN0LnRpbWVJbml0aWF0ZWQpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IDA7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbn07XG5mdW5jdGlvbiBjcmVhdGVCYXNlQ1NPUGVyc29uYURhdGFQdWJsaWMoKSB7XG4gICAgcmV0dXJuIHsgcGxheWVyTGV2ZWw6IDAsIGNvbW1lbmRhdGlvbjogdW5kZWZpbmVkLCBlbGV2YXRlZFN0YXRlOiBmYWxzZSB9O1xufVxuZXhwb3J0cy5DU09QZXJzb25hRGF0YVB1YmxpYyA9IHtcbiAgICBlbmNvZGUobWVzc2FnZSwgd3JpdGVyID0gbWluaW1hbF8xLldyaXRlci5jcmVhdGUoKSkge1xuICAgICAgICBpZiAobWVzc2FnZS5wbGF5ZXJMZXZlbCAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig4KS5pbnQzMihtZXNzYWdlLnBsYXllckxldmVsKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5jb21tZW5kYXRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgZXhwb3J0cy5QbGF5ZXJDb21tZW5kYXRpb25JbmZvLmVuY29kZShtZXNzYWdlLmNvbW1lbmRhdGlvbiwgd3JpdGVyLnVpbnQzMigxOCkuZm9yaygpKS5sZGVsaW0oKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5lbGV2YXRlZFN0YXRlID09PSB0cnVlKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDI0KS5ib29sKG1lc3NhZ2UuZWxldmF0ZWRTdGF0ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9LFxuICAgIGRlY29kZShpbnB1dCwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IGlucHV0IGluc3RhbmNlb2YgbWluaW1hbF8xLlJlYWRlciA/IGlucHV0IDogbmV3IG1pbmltYWxfMS5SZWFkZXIoaW5wdXQpO1xuICAgICAgICBsZXQgZW5kID0gbGVuZ3RoID09PSB1bmRlZmluZWQgPyByZWFkZXIubGVuIDogcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDU09QZXJzb25hRGF0YVB1YmxpYygpO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UucGxheWVyTGV2ZWwgPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmNvbW1lbmRhdGlvbiA9IGV4cG9ydHMuUGxheWVyQ29tbWVuZGF0aW9uSW5mby5kZWNvZGUocmVhZGVyLCByZWFkZXIudWludDMyKCkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZWxldmF0ZWRTdGF0ZSA9IHJlYWRlci5ib29sKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJlYWRlci5za2lwVHlwZSh0YWcgJiA3KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfSxcbiAgICBmcm9tUGFydGlhbChvYmplY3QpIHtcbiAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDU09QZXJzb25hRGF0YVB1YmxpYygpO1xuICAgICAgICBtZXNzYWdlLnBsYXllckxldmVsID0gKF9hID0gb2JqZWN0LnBsYXllckxldmVsKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAwO1xuICAgICAgICBtZXNzYWdlLmNvbW1lbmRhdGlvbiA9XG4gICAgICAgICAgICBvYmplY3QuY29tbWVuZGF0aW9uICE9PSB1bmRlZmluZWQgJiYgb2JqZWN0LmNvbW1lbmRhdGlvbiAhPT0gbnVsbFxuICAgICAgICAgICAgICAgID8gZXhwb3J0cy5QbGF5ZXJDb21tZW5kYXRpb25JbmZvLmZyb21QYXJ0aWFsKG9iamVjdC5jb21tZW5kYXRpb24pXG4gICAgICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICAgIG1lc3NhZ2UuZWxldmF0ZWRTdGF0ZSA9IChfYiA9IG9iamVjdC5lbGV2YXRlZFN0YXRlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBmYWxzZTtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxufTtcbmZ1bmN0aW9uIGNyZWF0ZUJhc2VDTXNnR0NHbG9iYWxHYW1lU3Vic2NyaWJlKCkge1xuICAgIHJldHVybiB7IHRpY2tldDogTG9uZy5VWkVSTyB9O1xufVxuZXhwb3J0cy5DTXNnR0NHbG9iYWxHYW1lU3Vic2NyaWJlID0ge1xuICAgIGVuY29kZShtZXNzYWdlLCB3cml0ZXIgPSBtaW5pbWFsXzEuV3JpdGVyLmNyZWF0ZSgpKSB7XG4gICAgICAgIGlmICghbWVzc2FnZS50aWNrZXQuaXNaZXJvKCkpIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoOCkudWludDY0KG1lc3NhZ2UudGlja2V0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH0sXG4gICAgZGVjb2RlKGlucHV0LCBsZW5ndGgpIHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gaW5wdXQgaW5zdGFuY2VvZiBtaW5pbWFsXzEuUmVhZGVyID8gaW5wdXQgOiBuZXcgbWluaW1hbF8xLlJlYWRlcihpbnB1dCk7XG4gICAgICAgIGxldCBlbmQgPSBsZW5ndGggPT09IHVuZGVmaW5lZCA/IHJlYWRlci5sZW4gOiByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNNc2dHQ0dsb2JhbEdhbWVTdWJzY3JpYmUoKTtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhZyA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgIHN3aXRjaCAodGFnID4+PiAzKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnRpY2tldCA9IHJlYWRlci51aW50NjQoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmVhZGVyLnNraXBUeXBlKHRhZyAmIDcpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9LFxuICAgIGZyb21QYXJ0aWFsKG9iamVjdCkge1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNNc2dHQ0dsb2JhbEdhbWVTdWJzY3JpYmUoKTtcbiAgICAgICAgbWVzc2FnZS50aWNrZXQgPVxuICAgICAgICAgICAgb2JqZWN0LnRpY2tldCAhPT0gdW5kZWZpbmVkICYmIG9iamVjdC50aWNrZXQgIT09IG51bGxcbiAgICAgICAgICAgICAgICA/IExvbmcuZnJvbVZhbHVlKG9iamVjdC50aWNrZXQpXG4gICAgICAgICAgICAgICAgOiBMb25nLlVaRVJPO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG59O1xuZnVuY3Rpb24gY3JlYXRlQmFzZUNNc2dHQ0dsb2JhbEdhbWVVbnN1YnNjcmliZSgpIHtcbiAgICByZXR1cm4geyB0aW1lbGVmdDogMCB9O1xufVxuZXhwb3J0cy5DTXNnR0NHbG9iYWxHYW1lVW5zdWJzY3JpYmUgPSB7XG4gICAgZW5jb2RlKG1lc3NhZ2UsIHdyaXRlciA9IG1pbmltYWxfMS5Xcml0ZXIuY3JlYXRlKCkpIHtcbiAgICAgICAgaWYgKG1lc3NhZ2UudGltZWxlZnQgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoOCkuaW50MzIobWVzc2FnZS50aW1lbGVmdCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9LFxuICAgIGRlY29kZShpbnB1dCwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IGlucHV0IGluc3RhbmNlb2YgbWluaW1hbF8xLlJlYWRlciA/IGlucHV0IDogbmV3IG1pbmltYWxfMS5SZWFkZXIoaW5wdXQpO1xuICAgICAgICBsZXQgZW5kID0gbGVuZ3RoID09PSB1bmRlZmluZWQgPyByZWFkZXIubGVuIDogcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDTXNnR0NHbG9iYWxHYW1lVW5zdWJzY3JpYmUoKTtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhZyA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgIHN3aXRjaCAodGFnID4+PiAzKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnRpbWVsZWZ0ID0gcmVhZGVyLmludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJlYWRlci5za2lwVHlwZSh0YWcgJiA3KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfSxcbiAgICBmcm9tUGFydGlhbChvYmplY3QpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNNc2dHQ0dsb2JhbEdhbWVVbnN1YnNjcmliZSgpO1xuICAgICAgICBtZXNzYWdlLnRpbWVsZWZ0ID0gKF9hID0gb2JqZWN0LnRpbWVsZWZ0KSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAwO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG59O1xuZnVuY3Rpb24gY3JlYXRlQmFzZUNNc2dHQ0dsb2JhbEdhbWVQbGF5KCkge1xuICAgIHJldHVybiB7IHRpY2tldDogTG9uZy5VWkVSTywgZ2FtZXRpbWVtczogMCwgbXNwZXJwb2ludDogMCB9O1xufVxuZXhwb3J0cy5DTXNnR0NHbG9iYWxHYW1lUGxheSA9IHtcbiAgICBlbmNvZGUobWVzc2FnZSwgd3JpdGVyID0gbWluaW1hbF8xLldyaXRlci5jcmVhdGUoKSkge1xuICAgICAgICBpZiAoIW1lc3NhZ2UudGlja2V0LmlzWmVybygpKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDgpLnVpbnQ2NChtZXNzYWdlLnRpY2tldCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UuZ2FtZXRpbWVtcyAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigxNikudWludDMyKG1lc3NhZ2UuZ2FtZXRpbWVtcyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UubXNwZXJwb2ludCAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigyNCkudWludDMyKG1lc3NhZ2UubXNwZXJwb2ludCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9LFxuICAgIGRlY29kZShpbnB1dCwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IGlucHV0IGluc3RhbmNlb2YgbWluaW1hbF8xLlJlYWRlciA/IGlucHV0IDogbmV3IG1pbmltYWxfMS5SZWFkZXIoaW5wdXQpO1xuICAgICAgICBsZXQgZW5kID0gbGVuZ3RoID09PSB1bmRlZmluZWQgPyByZWFkZXIubGVuIDogcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDTXNnR0NHbG9iYWxHYW1lUGxheSgpO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudGlja2V0ID0gcmVhZGVyLnVpbnQ2NCgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZ2FtZXRpbWVtcyA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLm1zcGVycG9pbnQgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJlYWRlci5za2lwVHlwZSh0YWcgJiA3KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfSxcbiAgICBmcm9tUGFydGlhbChvYmplY3QpIHtcbiAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDTXNnR0NHbG9iYWxHYW1lUGxheSgpO1xuICAgICAgICBtZXNzYWdlLnRpY2tldCA9XG4gICAgICAgICAgICBvYmplY3QudGlja2V0ICE9PSB1bmRlZmluZWQgJiYgb2JqZWN0LnRpY2tldCAhPT0gbnVsbFxuICAgICAgICAgICAgICAgID8gTG9uZy5mcm9tVmFsdWUob2JqZWN0LnRpY2tldClcbiAgICAgICAgICAgICAgICA6IExvbmcuVVpFUk87XG4gICAgICAgIG1lc3NhZ2UuZ2FtZXRpbWVtcyA9IChfYSA9IG9iamVjdC5nYW1ldGltZW1zKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAwO1xuICAgICAgICBtZXNzYWdlLm1zcGVycG9pbnQgPSAoX2IgPSBvYmplY3QubXNwZXJwb2ludCkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogMDtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxufTtcbmZ1bmN0aW9uIGNyZWF0ZUJhc2VDTXNnR0NDU3RyaWtlMTVWMkFja25vd2xlZGdlUGVuYWx0eSgpIHtcbiAgICByZXR1cm4geyBhY2tub3dsZWRnZWQ6IDAgfTtcbn1cbmV4cG9ydHMuQ01zZ0dDQ1N0cmlrZTE1VjJBY2tub3dsZWRnZVBlbmFsdHkgPSB7XG4gICAgZW5jb2RlKG1lc3NhZ2UsIHdyaXRlciA9IG1pbmltYWxfMS5Xcml0ZXIuY3JlYXRlKCkpIHtcbiAgICAgICAgaWYgKG1lc3NhZ2UuYWNrbm93bGVkZ2VkICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDgpLmludDMyKG1lc3NhZ2UuYWNrbm93bGVkZ2VkKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH0sXG4gICAgZGVjb2RlKGlucHV0LCBsZW5ndGgpIHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gaW5wdXQgaW5zdGFuY2VvZiBtaW5pbWFsXzEuUmVhZGVyID8gaW5wdXQgOiBuZXcgbWluaW1hbF8xLlJlYWRlcihpbnB1dCk7XG4gICAgICAgIGxldCBlbmQgPSBsZW5ndGggPT09IHVuZGVmaW5lZCA/IHJlYWRlci5sZW4gOiByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNNc2dHQ0NTdHJpa2UxNVYyQWNrbm93bGVkZ2VQZW5hbHR5KCk7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBjb25zdCB0YWcgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKHRhZyA+Pj4gMykge1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5hY2tub3dsZWRnZWQgPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmVhZGVyLnNraXBUeXBlKHRhZyAmIDcpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9LFxuICAgIGZyb21QYXJ0aWFsKG9iamVjdCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ01zZ0dDQ1N0cmlrZTE1VjJBY2tub3dsZWRnZVBlbmFsdHkoKTtcbiAgICAgICAgbWVzc2FnZS5hY2tub3dsZWRnZWQgPSAoX2EgPSBvYmplY3QuYWNrbm93bGVkZ2VkKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAwO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG59O1xuZnVuY3Rpb24gY3JlYXRlQmFzZUNNc2dHQ0NTdHJpa2UxNVYyQ2xpZW50MkdDUmVxdWVzdFByZXN0aWdlQ29pbigpIHtcbiAgICByZXR1cm4geyBkZWZpbmRleDogMCwgdXBncmFkZWlkOiBMb25nLlVaRVJPLCBob3VyczogMCwgcHJlc3RpZ2V0aW1lOiAwIH07XG59XG5leHBvcnRzLkNNc2dHQ0NTdHJpa2UxNVYyQ2xpZW50MkdDUmVxdWVzdFByZXN0aWdlQ29pbiA9IHtcbiAgICBlbmNvZGUobWVzc2FnZSwgd3JpdGVyID0gbWluaW1hbF8xLldyaXRlci5jcmVhdGUoKSkge1xuICAgICAgICBpZiAobWVzc2FnZS5kZWZpbmRleCAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig4KS51aW50MzIobWVzc2FnZS5kZWZpbmRleCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFtZXNzYWdlLnVwZ3JhZGVpZC5pc1plcm8oKSkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigxNikudWludDY0KG1lc3NhZ2UudXBncmFkZWlkKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5ob3VycyAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigyNCkudWludDMyKG1lc3NhZ2UuaG91cnMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLnByZXN0aWdldGltZSAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigzMikudWludDMyKG1lc3NhZ2UucHJlc3RpZ2V0aW1lKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH0sXG4gICAgZGVjb2RlKGlucHV0LCBsZW5ndGgpIHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gaW5wdXQgaW5zdGFuY2VvZiBtaW5pbWFsXzEuUmVhZGVyID8gaW5wdXQgOiBuZXcgbWluaW1hbF8xLlJlYWRlcihpbnB1dCk7XG4gICAgICAgIGxldCBlbmQgPSBsZW5ndGggPT09IHVuZGVmaW5lZCA/IHJlYWRlci5sZW4gOiByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNNc2dHQ0NTdHJpa2UxNVYyQ2xpZW50MkdDUmVxdWVzdFByZXN0aWdlQ29pbigpO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZGVmaW5kZXggPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS51cGdyYWRlaWQgPSByZWFkZXIudWludDY0KCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5ob3VycyA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnByZXN0aWdldGltZSA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmVhZGVyLnNraXBUeXBlKHRhZyAmIDcpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9LFxuICAgIGZyb21QYXJ0aWFsKG9iamVjdCkge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYztcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDTXNnR0NDU3RyaWtlMTVWMkNsaWVudDJHQ1JlcXVlc3RQcmVzdGlnZUNvaW4oKTtcbiAgICAgICAgbWVzc2FnZS5kZWZpbmRleCA9IChfYSA9IG9iamVjdC5kZWZpbmRleCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMDtcbiAgICAgICAgbWVzc2FnZS51cGdyYWRlaWQgPVxuICAgICAgICAgICAgb2JqZWN0LnVwZ3JhZGVpZCAhPT0gdW5kZWZpbmVkICYmIG9iamVjdC51cGdyYWRlaWQgIT09IG51bGxcbiAgICAgICAgICAgICAgICA/IExvbmcuZnJvbVZhbHVlKG9iamVjdC51cGdyYWRlaWQpXG4gICAgICAgICAgICAgICAgOiBMb25nLlVaRVJPO1xuICAgICAgICBtZXNzYWdlLmhvdXJzID0gKF9iID0gb2JqZWN0LmhvdXJzKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAwO1xuICAgICAgICBtZXNzYWdlLnByZXN0aWdldGltZSA9IChfYyA9IG9iamVjdC5wcmVzdGlnZXRpbWUpICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IDA7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbn07XG5mdW5jdGlvbiBjcmVhdGVCYXNlQ01zZ0dDQ1N0cmlrZTE1VjJDbGllbnQyR0NTdHJlYW1VbmxvY2soKSB7XG4gICAgcmV0dXJuIHsgdGlja2V0OiBMb25nLlVaRVJPLCBvczogMCB9O1xufVxuZXhwb3J0cy5DTXNnR0NDU3RyaWtlMTVWMkNsaWVudDJHQ1N0cmVhbVVubG9jayA9IHtcbiAgICBlbmNvZGUobWVzc2FnZSwgd3JpdGVyID0gbWluaW1hbF8xLldyaXRlci5jcmVhdGUoKSkge1xuICAgICAgICBpZiAoIW1lc3NhZ2UudGlja2V0LmlzWmVybygpKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDgpLnVpbnQ2NChtZXNzYWdlLnRpY2tldCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2Uub3MgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMTYpLmludDMyKG1lc3NhZ2Uub3MpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfSxcbiAgICBkZWNvZGUoaW5wdXQsIGxlbmd0aCkge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBpbnB1dCBpbnN0YW5jZW9mIG1pbmltYWxfMS5SZWFkZXIgPyBpbnB1dCA6IG5ldyBtaW5pbWFsXzEuUmVhZGVyKGlucHV0KTtcbiAgICAgICAgbGV0IGVuZCA9IGxlbmd0aCA9PT0gdW5kZWZpbmVkID8gcmVhZGVyLmxlbiA6IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ01zZ0dDQ1N0cmlrZTE1VjJDbGllbnQyR0NTdHJlYW1VbmxvY2soKTtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhZyA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgIHN3aXRjaCAodGFnID4+PiAzKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnRpY2tldCA9IHJlYWRlci51aW50NjQoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLm9zID0gcmVhZGVyLmludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJlYWRlci5za2lwVHlwZSh0YWcgJiA3KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfSxcbiAgICBmcm9tUGFydGlhbChvYmplY3QpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNNc2dHQ0NTdHJpa2UxNVYyQ2xpZW50MkdDU3RyZWFtVW5sb2NrKCk7XG4gICAgICAgIG1lc3NhZ2UudGlja2V0ID1cbiAgICAgICAgICAgIG9iamVjdC50aWNrZXQgIT09IHVuZGVmaW5lZCAmJiBvYmplY3QudGlja2V0ICE9PSBudWxsXG4gICAgICAgICAgICAgICAgPyBMb25nLmZyb21WYWx1ZShvYmplY3QudGlja2V0KVxuICAgICAgICAgICAgICAgIDogTG9uZy5VWkVSTztcbiAgICAgICAgbWVzc2FnZS5vcyA9IChfYSA9IG9iamVjdC5vcykgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMDtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxufTtcbmZ1bmN0aW9uIGNyZWF0ZUJhc2VDTXNnR0NDU3RyaWtlMTVWMkNsaWVudFRvR0NSZXF1ZXN0RWxldmF0ZSgpIHtcbiAgICByZXR1cm4geyBzdGFnZTogMCB9O1xufVxuZXhwb3J0cy5DTXNnR0NDU3RyaWtlMTVWMkNsaWVudFRvR0NSZXF1ZXN0RWxldmF0ZSA9IHtcbiAgICBlbmNvZGUobWVzc2FnZSwgd3JpdGVyID0gbWluaW1hbF8xLldyaXRlci5jcmVhdGUoKSkge1xuICAgICAgICBpZiAobWVzc2FnZS5zdGFnZSAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig4KS51aW50MzIobWVzc2FnZS5zdGFnZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9LFxuICAgIGRlY29kZShpbnB1dCwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IGlucHV0IGluc3RhbmNlb2YgbWluaW1hbF8xLlJlYWRlciA/IGlucHV0IDogbmV3IG1pbmltYWxfMS5SZWFkZXIoaW5wdXQpO1xuICAgICAgICBsZXQgZW5kID0gbGVuZ3RoID09PSB1bmRlZmluZWQgPyByZWFkZXIubGVuIDogcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDTXNnR0NDU3RyaWtlMTVWMkNsaWVudFRvR0NSZXF1ZXN0RWxldmF0ZSgpO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Uuc3RhZ2UgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJlYWRlci5za2lwVHlwZSh0YWcgJiA3KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfSxcbiAgICBmcm9tUGFydGlhbChvYmplY3QpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNNc2dHQ0NTdHJpa2UxNVYyQ2xpZW50VG9HQ1JlcXVlc3RFbGV2YXRlKCk7XG4gICAgICAgIG1lc3NhZ2Uuc3RhZ2UgPSAoX2EgPSBvYmplY3Quc3RhZ2UpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IDA7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbn07XG5mdW5jdGlvbiBjcmVhdGVCYXNlQ01zZ0dDQ1N0cmlrZTE1VjJDbGllbnRUb0dDQ2hhdCgpIHtcbiAgICByZXR1cm4geyBtYXRjaElkOiBMb25nLlVaRVJPLCB0ZXh0OiBcIlwiIH07XG59XG5leHBvcnRzLkNNc2dHQ0NTdHJpa2UxNVYyQ2xpZW50VG9HQ0NoYXQgPSB7XG4gICAgZW5jb2RlKG1lc3NhZ2UsIHdyaXRlciA9IG1pbmltYWxfMS5Xcml0ZXIuY3JlYXRlKCkpIHtcbiAgICAgICAgaWYgKCFtZXNzYWdlLm1hdGNoSWQuaXNaZXJvKCkpIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoOCkudWludDY0KG1lc3NhZ2UubWF0Y2hJZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UudGV4dCAhPT0gXCJcIikge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigxOCkuc3RyaW5nKG1lc3NhZ2UudGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9LFxuICAgIGRlY29kZShpbnB1dCwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IGlucHV0IGluc3RhbmNlb2YgbWluaW1hbF8xLlJlYWRlciA/IGlucHV0IDogbmV3IG1pbmltYWxfMS5SZWFkZXIoaW5wdXQpO1xuICAgICAgICBsZXQgZW5kID0gbGVuZ3RoID09PSB1bmRlZmluZWQgPyByZWFkZXIubGVuIDogcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDTXNnR0NDU3RyaWtlMTVWMkNsaWVudFRvR0NDaGF0KCk7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBjb25zdCB0YWcgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKHRhZyA+Pj4gMykge1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5tYXRjaElkID0gcmVhZGVyLnVpbnQ2NCgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudGV4dCA9IHJlYWRlci5zdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmVhZGVyLnNraXBUeXBlKHRhZyAmIDcpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9LFxuICAgIGZyb21QYXJ0aWFsKG9iamVjdCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ01zZ0dDQ1N0cmlrZTE1VjJDbGllbnRUb0dDQ2hhdCgpO1xuICAgICAgICBtZXNzYWdlLm1hdGNoSWQgPVxuICAgICAgICAgICAgb2JqZWN0Lm1hdGNoSWQgIT09IHVuZGVmaW5lZCAmJiBvYmplY3QubWF0Y2hJZCAhPT0gbnVsbFxuICAgICAgICAgICAgICAgID8gTG9uZy5mcm9tVmFsdWUob2JqZWN0Lm1hdGNoSWQpXG4gICAgICAgICAgICAgICAgOiBMb25nLlVaRVJPO1xuICAgICAgICBtZXNzYWdlLnRleHQgPSAoX2EgPSBvYmplY3QudGV4dCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogXCJcIjtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxufTtcbmZ1bmN0aW9uIGNyZWF0ZUJhc2VDTXNnR0NDU3RyaWtlMTVWMkdDVG9DbGllbnRDaGF0KCkge1xuICAgIHJldHVybiB7IGFjY291bnRJZDogMCwgdGV4dDogXCJcIiB9O1xufVxuZXhwb3J0cy5DTXNnR0NDU3RyaWtlMTVWMkdDVG9DbGllbnRDaGF0ID0ge1xuICAgIGVuY29kZShtZXNzYWdlLCB3cml0ZXIgPSBtaW5pbWFsXzEuV3JpdGVyLmNyZWF0ZSgpKSB7XG4gICAgICAgIGlmIChtZXNzYWdlLmFjY291bnRJZCAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig4KS51aW50MzIobWVzc2FnZS5hY2NvdW50SWQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLnRleHQgIT09IFwiXCIpIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMTgpLnN0cmluZyhtZXNzYWdlLnRleHQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfSxcbiAgICBkZWNvZGUoaW5wdXQsIGxlbmd0aCkge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBpbnB1dCBpbnN0YW5jZW9mIG1pbmltYWxfMS5SZWFkZXIgPyBpbnB1dCA6IG5ldyBtaW5pbWFsXzEuUmVhZGVyKGlucHV0KTtcbiAgICAgICAgbGV0IGVuZCA9IGxlbmd0aCA9PT0gdW5kZWZpbmVkID8gcmVhZGVyLmxlbiA6IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ01zZ0dDQ1N0cmlrZTE1VjJHQ1RvQ2xpZW50Q2hhdCgpO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuYWNjb3VudElkID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudGV4dCA9IHJlYWRlci5zdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmVhZGVyLnNraXBUeXBlKHRhZyAmIDcpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9LFxuICAgIGZyb21QYXJ0aWFsKG9iamVjdCkge1xuICAgICAgICB2YXIgX2EsIF9iO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNNc2dHQ0NTdHJpa2UxNVYyR0NUb0NsaWVudENoYXQoKTtcbiAgICAgICAgbWVzc2FnZS5hY2NvdW50SWQgPSAoX2EgPSBvYmplY3QuYWNjb3VudElkKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAwO1xuICAgICAgICBtZXNzYWdlLnRleHQgPSAoX2IgPSBvYmplY3QudGV4dCkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogXCJcIjtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxufTtcbmZ1bmN0aW9uIGNyZWF0ZUJhc2VDTXNnR0NDU3RyaWtlMTVWMkNsaWVudEF1dGhLZXlDb2RlKCkge1xuICAgIHJldHVybiB7IGV2ZW50aWQ6IDAsIGNvZGU6IFwiXCIgfTtcbn1cbmV4cG9ydHMuQ01zZ0dDQ1N0cmlrZTE1VjJDbGllbnRBdXRoS2V5Q29kZSA9IHtcbiAgICBlbmNvZGUobWVzc2FnZSwgd3JpdGVyID0gbWluaW1hbF8xLldyaXRlci5jcmVhdGUoKSkge1xuICAgICAgICBpZiAobWVzc2FnZS5ldmVudGlkICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDgpLnVpbnQzMihtZXNzYWdlLmV2ZW50aWQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLmNvZGUgIT09IFwiXCIpIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMTgpLnN0cmluZyhtZXNzYWdlLmNvZGUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfSxcbiAgICBkZWNvZGUoaW5wdXQsIGxlbmd0aCkge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBpbnB1dCBpbnN0YW5jZW9mIG1pbmltYWxfMS5SZWFkZXIgPyBpbnB1dCA6IG5ldyBtaW5pbWFsXzEuUmVhZGVyKGlucHV0KTtcbiAgICAgICAgbGV0IGVuZCA9IGxlbmd0aCA9PT0gdW5kZWZpbmVkID8gcmVhZGVyLmxlbiA6IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ01zZ0dDQ1N0cmlrZTE1VjJDbGllbnRBdXRoS2V5Q29kZSgpO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZXZlbnRpZCA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmNvZGUgPSByZWFkZXIuc3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJlYWRlci5za2lwVHlwZSh0YWcgJiA3KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfSxcbiAgICBmcm9tUGFydGlhbChvYmplY3QpIHtcbiAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDTXNnR0NDU3RyaWtlMTVWMkNsaWVudEF1dGhLZXlDb2RlKCk7XG4gICAgICAgIG1lc3NhZ2UuZXZlbnRpZCA9IChfYSA9IG9iamVjdC5ldmVudGlkKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAwO1xuICAgICAgICBtZXNzYWdlLmNvZGUgPSAoX2IgPSBvYmplY3QuY29kZSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogXCJcIjtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxufTtcbmZ1bmN0aW9uIGNyZWF0ZUJhc2VDTXNnR0NDU3RyaWtlMTVHb3R2U3luY1BhY2tldCgpIHtcbiAgICByZXR1cm4geyBkYXRhOiB1bmRlZmluZWQgfTtcbn1cbmV4cG9ydHMuQ01zZ0dDQ1N0cmlrZTE1R290dlN5bmNQYWNrZXQgPSB7XG4gICAgZW5jb2RlKG1lc3NhZ2UsIHdyaXRlciA9IG1pbmltYWxfMS5Xcml0ZXIuY3JlYXRlKCkpIHtcbiAgICAgICAgaWYgKG1lc3NhZ2UuZGF0YSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBlbmdpbmVfZ2NtZXNzYWdlc18xLkNFbmdpbmVHb3R2U3luY1BhY2tldC5lbmNvZGUobWVzc2FnZS5kYXRhLCB3cml0ZXIudWludDMyKDEwKS5mb3JrKCkpLmxkZWxpbSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfSxcbiAgICBkZWNvZGUoaW5wdXQsIGxlbmd0aCkge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBpbnB1dCBpbnN0YW5jZW9mIG1pbmltYWxfMS5SZWFkZXIgPyBpbnB1dCA6IG5ldyBtaW5pbWFsXzEuUmVhZGVyKGlucHV0KTtcbiAgICAgICAgbGV0IGVuZCA9IGxlbmd0aCA9PT0gdW5kZWZpbmVkID8gcmVhZGVyLmxlbiA6IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ01zZ0dDQ1N0cmlrZTE1R290dlN5bmNQYWNrZXQoKTtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhZyA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgIHN3aXRjaCAodGFnID4+PiAzKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmRhdGEgPSBlbmdpbmVfZ2NtZXNzYWdlc18xLkNFbmdpbmVHb3R2U3luY1BhY2tldC5kZWNvZGUocmVhZGVyLCByZWFkZXIudWludDMyKCkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICByZWFkZXIuc2tpcFR5cGUodGFnICYgNyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH0sXG4gICAgZnJvbVBhcnRpYWwob2JqZWN0KSB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ01zZ0dDQ1N0cmlrZTE1R290dlN5bmNQYWNrZXQoKTtcbiAgICAgICAgbWVzc2FnZS5kYXRhID1cbiAgICAgICAgICAgIG9iamVjdC5kYXRhICE9PSB1bmRlZmluZWQgJiYgb2JqZWN0LmRhdGEgIT09IG51bGxcbiAgICAgICAgICAgICAgICA/IGVuZ2luZV9nY21lc3NhZ2VzXzEuQ0VuZ2luZUdvdHZTeW5jUGFja2V0LmZyb21QYXJ0aWFsKG9iamVjdC5kYXRhKVxuICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG59O1xuZnVuY3Rpb24gY3JlYXRlQmFzZVBsYXllckRlY2FsRGlnaXRhbFNpZ25hdHVyZSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBzaWduYXR1cmU6IG5ldyBVaW50OEFycmF5KCksXG4gICAgICAgIGFjY291bnRpZDogMCxcbiAgICAgICAgcnRpbWU6IDAsXG4gICAgICAgIGVuZHBvczogW10sXG4gICAgICAgIHN0YXJ0cG9zOiBbXSxcbiAgICAgICAgcmlnaHQ6IFtdLFxuICAgICAgICB0eERlZmlkeDogMCxcbiAgICAgICAgZW50aW5kZXg6IDAsXG4gICAgICAgIGhpdGJveDogMCxcbiAgICAgICAgY3JlYXRpb250aW1lOiAwLFxuICAgICAgICBlcXVpcHNsb3Q6IDAsXG4gICAgICAgIHRyYWNlSWQ6IDAsXG4gICAgICAgIG5vcm1hbDogW10sXG4gICAgICAgIHRpbnRJZDogMFxuICAgIH07XG59XG5leHBvcnRzLlBsYXllckRlY2FsRGlnaXRhbFNpZ25hdHVyZSA9IHtcbiAgICBlbmNvZGUobWVzc2FnZSwgd3JpdGVyID0gbWluaW1hbF8xLldyaXRlci5jcmVhdGUoKSkge1xuICAgICAgICBpZiAobWVzc2FnZS5zaWduYXR1cmUubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDEwKS5ieXRlcyhtZXNzYWdlLnNpZ25hdHVyZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UuYWNjb3VudGlkICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDE2KS51aW50MzIobWVzc2FnZS5hY2NvdW50aWQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLnJ0aW1lICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDI0KS51aW50MzIobWVzc2FnZS5ydGltZSk7XG4gICAgICAgIH1cbiAgICAgICAgd3JpdGVyLnVpbnQzMigzNCkuZm9yaygpO1xuICAgICAgICBmb3IgKGNvbnN0IHYgb2YgbWVzc2FnZS5lbmRwb3MpIHtcbiAgICAgICAgICAgIHdyaXRlci5mbG9hdCh2KTtcbiAgICAgICAgfVxuICAgICAgICB3cml0ZXIubGRlbGltKCk7XG4gICAgICAgIHdyaXRlci51aW50MzIoNDIpLmZvcmsoKTtcbiAgICAgICAgZm9yIChjb25zdCB2IG9mIG1lc3NhZ2Uuc3RhcnRwb3MpIHtcbiAgICAgICAgICAgIHdyaXRlci5mbG9hdCh2KTtcbiAgICAgICAgfVxuICAgICAgICB3cml0ZXIubGRlbGltKCk7XG4gICAgICAgIHdyaXRlci51aW50MzIoNTApLmZvcmsoKTtcbiAgICAgICAgZm9yIChjb25zdCB2IG9mIG1lc3NhZ2UucmlnaHQpIHtcbiAgICAgICAgICAgIHdyaXRlci5mbG9hdCh2KTtcbiAgICAgICAgfVxuICAgICAgICB3cml0ZXIubGRlbGltKCk7XG4gICAgICAgIGlmIChtZXNzYWdlLnR4RGVmaWR4ICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDU2KS51aW50MzIobWVzc2FnZS50eERlZmlkeCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UuZW50aW5kZXggIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoNjQpLmludDMyKG1lc3NhZ2UuZW50aW5kZXgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLmhpdGJveCAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig3MikudWludDMyKG1lc3NhZ2UuaGl0Ym94KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5jcmVhdGlvbnRpbWUgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoODUpLmZsb2F0KG1lc3NhZ2UuY3JlYXRpb250aW1lKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5lcXVpcHNsb3QgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoODgpLnVpbnQzMihtZXNzYWdlLmVxdWlwc2xvdCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UudHJhY2VJZCAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig5NikudWludDMyKG1lc3NhZ2UudHJhY2VJZCk7XG4gICAgICAgIH1cbiAgICAgICAgd3JpdGVyLnVpbnQzMigxMDYpLmZvcmsoKTtcbiAgICAgICAgZm9yIChjb25zdCB2IG9mIG1lc3NhZ2Uubm9ybWFsKSB7XG4gICAgICAgICAgICB3cml0ZXIuZmxvYXQodik7XG4gICAgICAgIH1cbiAgICAgICAgd3JpdGVyLmxkZWxpbSgpO1xuICAgICAgICBpZiAobWVzc2FnZS50aW50SWQgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMTEyKS51aW50MzIobWVzc2FnZS50aW50SWQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfSxcbiAgICBkZWNvZGUoaW5wdXQsIGxlbmd0aCkge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBpbnB1dCBpbnN0YW5jZW9mIG1pbmltYWxfMS5SZWFkZXIgPyBpbnB1dCA6IG5ldyBtaW5pbWFsXzEuUmVhZGVyKGlucHV0KTtcbiAgICAgICAgbGV0IGVuZCA9IGxlbmd0aCA9PT0gdW5kZWZpbmVkID8gcmVhZGVyLmxlbiA6IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlUGxheWVyRGVjYWxEaWdpdGFsU2lnbmF0dXJlKCk7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBjb25zdCB0YWcgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKHRhZyA+Pj4gMykge1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5zaWduYXR1cmUgPSByZWFkZXIuYnl0ZXMoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmFjY291bnRpZCA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnJ0aW1lID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgIGlmICgodGFnICYgNykgPT09IDIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuZDIgPSByZWFkZXIudWludDMyKCkgKyByZWFkZXIucG9zO1xuICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5lbmRwb3MucHVzaChyZWFkZXIuZmxvYXQoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmVuZHBvcy5wdXNoKHJlYWRlci5mbG9hdCgpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgICAgIGlmICgodGFnICYgNykgPT09IDIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuZDIgPSByZWFkZXIudWludDMyKCkgKyByZWFkZXIucG9zO1xuICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5zdGFydHBvcy5wdXNoKHJlYWRlci5mbG9hdCgpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Uuc3RhcnRwb3MucHVzaChyZWFkZXIuZmxvYXQoKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICBpZiAoKHRhZyAmIDcpID09PSAyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbmQyID0gcmVhZGVyLnVpbnQzMigpICsgcmVhZGVyLnBvcztcbiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kMikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UucmlnaHQucHVzaChyZWFkZXIuZmxvYXQoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnJpZ2h0LnB1c2gocmVhZGVyLmZsb2F0KCkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNzpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS50eERlZmlkeCA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA4OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmVudGluZGV4ID0gcmVhZGVyLmludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgOTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5oaXRib3ggPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMTA6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuY3JlYXRpb250aW1lID0gcmVhZGVyLmZsb2F0KCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMTE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZXF1aXBzbG90ID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDEyOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnRyYWNlSWQgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMTM6XG4gICAgICAgICAgICAgICAgICAgIGlmICgodGFnICYgNykgPT09IDIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuZDIgPSByZWFkZXIudWludDMyKCkgKyByZWFkZXIucG9zO1xuICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5ub3JtYWwucHVzaChyZWFkZXIuZmxvYXQoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLm5vcm1hbC5wdXNoKHJlYWRlci5mbG9hdCgpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDE0OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnRpbnRJZCA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmVhZGVyLnNraXBUeXBlKHRhZyAmIDcpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9LFxuICAgIGZyb21QYXJ0aWFsKG9iamVjdCkge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYywgX2QsIF9lLCBfZiwgX2csIF9oLCBfaiwgX2ssIF9sLCBfbSwgX28sIF9wO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZVBsYXllckRlY2FsRGlnaXRhbFNpZ25hdHVyZSgpO1xuICAgICAgICBtZXNzYWdlLnNpZ25hdHVyZSA9IChfYSA9IG9iamVjdC5zaWduYXR1cmUpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IG5ldyBVaW50OEFycmF5KCk7XG4gICAgICAgIG1lc3NhZ2UuYWNjb3VudGlkID0gKF9iID0gb2JqZWN0LmFjY291bnRpZCkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogMDtcbiAgICAgICAgbWVzc2FnZS5ydGltZSA9IChfYyA9IG9iamVjdC5ydGltZSkgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogMDtcbiAgICAgICAgbWVzc2FnZS5lbmRwb3MgPSAoKF9kID0gb2JqZWN0LmVuZHBvcykgPT09IG51bGwgfHwgX2QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9kLm1hcChlID0+IGUpKSB8fCBbXTtcbiAgICAgICAgbWVzc2FnZS5zdGFydHBvcyA9ICgoX2UgPSBvYmplY3Quc3RhcnRwb3MpID09PSBudWxsIHx8IF9lID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZS5tYXAoZSA9PiBlKSkgfHwgW107XG4gICAgICAgIG1lc3NhZ2UucmlnaHQgPSAoKF9mID0gb2JqZWN0LnJpZ2h0KSA9PT0gbnVsbCB8fCBfZiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2YubWFwKGUgPT4gZSkpIHx8IFtdO1xuICAgICAgICBtZXNzYWdlLnR4RGVmaWR4ID0gKF9nID0gb2JqZWN0LnR4RGVmaWR4KSAhPT0gbnVsbCAmJiBfZyAhPT0gdm9pZCAwID8gX2cgOiAwO1xuICAgICAgICBtZXNzYWdlLmVudGluZGV4ID0gKF9oID0gb2JqZWN0LmVudGluZGV4KSAhPT0gbnVsbCAmJiBfaCAhPT0gdm9pZCAwID8gX2ggOiAwO1xuICAgICAgICBtZXNzYWdlLmhpdGJveCA9IChfaiA9IG9iamVjdC5oaXRib3gpICE9PSBudWxsICYmIF9qICE9PSB2b2lkIDAgPyBfaiA6IDA7XG4gICAgICAgIG1lc3NhZ2UuY3JlYXRpb250aW1lID0gKF9rID0gb2JqZWN0LmNyZWF0aW9udGltZSkgIT09IG51bGwgJiYgX2sgIT09IHZvaWQgMCA/IF9rIDogMDtcbiAgICAgICAgbWVzc2FnZS5lcXVpcHNsb3QgPSAoX2wgPSBvYmplY3QuZXF1aXBzbG90KSAhPT0gbnVsbCAmJiBfbCAhPT0gdm9pZCAwID8gX2wgOiAwO1xuICAgICAgICBtZXNzYWdlLnRyYWNlSWQgPSAoX20gPSBvYmplY3QudHJhY2VJZCkgIT09IG51bGwgJiYgX20gIT09IHZvaWQgMCA/IF9tIDogMDtcbiAgICAgICAgbWVzc2FnZS5ub3JtYWwgPSAoKF9vID0gb2JqZWN0Lm5vcm1hbCkgPT09IG51bGwgfHwgX28gPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9vLm1hcChlID0+IGUpKSB8fCBbXTtcbiAgICAgICAgbWVzc2FnZS50aW50SWQgPSAoX3AgPSBvYmplY3QudGludElkKSAhPT0gbnVsbCAmJiBfcCAhPT0gdm9pZCAwID8gX3AgOiAwO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG59O1xuZnVuY3Rpb24gY3JlYXRlQmFzZUNNc2dHQ0NTdHJpa2UxNVYyQ2xpZW50UGxheWVyRGVjYWxTaWduKCkge1xuICAgIHJldHVybiB7IGRhdGE6IHVuZGVmaW5lZCwgaXRlbWlkOiBMb25nLlVaRVJPIH07XG59XG5leHBvcnRzLkNNc2dHQ0NTdHJpa2UxNVYyQ2xpZW50UGxheWVyRGVjYWxTaWduID0ge1xuICAgIGVuY29kZShtZXNzYWdlLCB3cml0ZXIgPSBtaW5pbWFsXzEuV3JpdGVyLmNyZWF0ZSgpKSB7XG4gICAgICAgIGlmIChtZXNzYWdlLmRhdGEgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgZXhwb3J0cy5QbGF5ZXJEZWNhbERpZ2l0YWxTaWduYXR1cmUuZW5jb2RlKG1lc3NhZ2UuZGF0YSwgd3JpdGVyLnVpbnQzMigxMCkuZm9yaygpKS5sZGVsaW0oKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIW1lc3NhZ2UuaXRlbWlkLmlzWmVybygpKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDE2KS51aW50NjQobWVzc2FnZS5pdGVtaWQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfSxcbiAgICBkZWNvZGUoaW5wdXQsIGxlbmd0aCkge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBpbnB1dCBpbnN0YW5jZW9mIG1pbmltYWxfMS5SZWFkZXIgPyBpbnB1dCA6IG5ldyBtaW5pbWFsXzEuUmVhZGVyKGlucHV0KTtcbiAgICAgICAgbGV0IGVuZCA9IGxlbmd0aCA9PT0gdW5kZWZpbmVkID8gcmVhZGVyLmxlbiA6IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ01zZ0dDQ1N0cmlrZTE1VjJDbGllbnRQbGF5ZXJEZWNhbFNpZ24oKTtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhZyA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgIHN3aXRjaCAodGFnID4+PiAzKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmRhdGEgPSBleHBvcnRzLlBsYXllckRlY2FsRGlnaXRhbFNpZ25hdHVyZS5kZWNvZGUocmVhZGVyLCByZWFkZXIudWludDMyKCkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuaXRlbWlkID0gcmVhZGVyLnVpbnQ2NCgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICByZWFkZXIuc2tpcFR5cGUodGFnICYgNyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH0sXG4gICAgZnJvbVBhcnRpYWwob2JqZWN0KSB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ01zZ0dDQ1N0cmlrZTE1VjJDbGllbnRQbGF5ZXJEZWNhbFNpZ24oKTtcbiAgICAgICAgbWVzc2FnZS5kYXRhID1cbiAgICAgICAgICAgIG9iamVjdC5kYXRhICE9PSB1bmRlZmluZWQgJiYgb2JqZWN0LmRhdGEgIT09IG51bGxcbiAgICAgICAgICAgICAgICA/IGV4cG9ydHMuUGxheWVyRGVjYWxEaWdpdGFsU2lnbmF0dXJlLmZyb21QYXJ0aWFsKG9iamVjdC5kYXRhKVxuICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgICBtZXNzYWdlLml0ZW1pZCA9XG4gICAgICAgICAgICBvYmplY3QuaXRlbWlkICE9PSB1bmRlZmluZWQgJiYgb2JqZWN0Lml0ZW1pZCAhPT0gbnVsbFxuICAgICAgICAgICAgICAgID8gTG9uZy5mcm9tVmFsdWUob2JqZWN0Lml0ZW1pZClcbiAgICAgICAgICAgICAgICA6IExvbmcuVVpFUk87XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbn07XG5mdW5jdGlvbiBjcmVhdGVCYXNlQ01zZ0dDQ1N0cmlrZTE1VjJDbGllbnRMb2dvbkZhdGFsRXJyb3IoKSB7XG4gICAgcmV0dXJuIHsgZXJyb3Jjb2RlOiAwLCBtZXNzYWdlOiBcIlwiLCBjb3VudHJ5OiBcIlwiIH07XG59XG5leHBvcnRzLkNNc2dHQ0NTdHJpa2UxNVYyQ2xpZW50TG9nb25GYXRhbEVycm9yID0ge1xuICAgIGVuY29kZShtZXNzYWdlLCB3cml0ZXIgPSBtaW5pbWFsXzEuV3JpdGVyLmNyZWF0ZSgpKSB7XG4gICAgICAgIGlmIChtZXNzYWdlLmVycm9yY29kZSAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig4KS51aW50MzIobWVzc2FnZS5lcnJvcmNvZGUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLm1lc3NhZ2UgIT09IFwiXCIpIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMTgpLnN0cmluZyhtZXNzYWdlLm1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLmNvdW50cnkgIT09IFwiXCIpIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMjYpLnN0cmluZyhtZXNzYWdlLmNvdW50cnkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfSxcbiAgICBkZWNvZGUoaW5wdXQsIGxlbmd0aCkge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBpbnB1dCBpbnN0YW5jZW9mIG1pbmltYWxfMS5SZWFkZXIgPyBpbnB1dCA6IG5ldyBtaW5pbWFsXzEuUmVhZGVyKGlucHV0KTtcbiAgICAgICAgbGV0IGVuZCA9IGxlbmd0aCA9PT0gdW5kZWZpbmVkID8gcmVhZGVyLmxlbiA6IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ01zZ0dDQ1N0cmlrZTE1VjJDbGllbnRMb2dvbkZhdGFsRXJyb3IoKTtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhZyA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgIHN3aXRjaCAodGFnID4+PiAzKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmVycm9yY29kZSA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLm1lc3NhZ2UgPSByZWFkZXIuc3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5jb3VudHJ5ID0gcmVhZGVyLnN0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICByZWFkZXIuc2tpcFR5cGUodGFnICYgNyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH0sXG4gICAgZnJvbVBhcnRpYWwob2JqZWN0KSB7XG4gICAgICAgIHZhciBfYSwgX2IsIF9jO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNNc2dHQ0NTdHJpa2UxNVYyQ2xpZW50TG9nb25GYXRhbEVycm9yKCk7XG4gICAgICAgIG1lc3NhZ2UuZXJyb3Jjb2RlID0gKF9hID0gb2JqZWN0LmVycm9yY29kZSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMDtcbiAgICAgICAgbWVzc2FnZS5tZXNzYWdlID0gKF9iID0gb2JqZWN0Lm1lc3NhZ2UpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IFwiXCI7XG4gICAgICAgIG1lc3NhZ2UuY291bnRyeSA9IChfYyA9IG9iamVjdC5jb3VudHJ5KSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiBcIlwiO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG59O1xuZnVuY3Rpb24gY3JlYXRlQmFzZUNNc2dHQ0NTdHJpa2UxNVYyQ2xpZW50UG9sbFN0YXRlKCkge1xuICAgIHJldHVybiB7IHBvbGxpZDogMCwgbmFtZXM6IFtdLCB2YWx1ZXM6IFtdIH07XG59XG5leHBvcnRzLkNNc2dHQ0NTdHJpa2UxNVYyQ2xpZW50UG9sbFN0YXRlID0ge1xuICAgIGVuY29kZShtZXNzYWdlLCB3cml0ZXIgPSBtaW5pbWFsXzEuV3JpdGVyLmNyZWF0ZSgpKSB7XG4gICAgICAgIGlmIChtZXNzYWdlLnBvbGxpZCAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig4KS51aW50MzIobWVzc2FnZS5wb2xsaWQpO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3QgdiBvZiBtZXNzYWdlLm5hbWVzKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDE4KS5zdHJpbmcodik7XG4gICAgICAgIH1cbiAgICAgICAgd3JpdGVyLnVpbnQzMigyNikuZm9yaygpO1xuICAgICAgICBmb3IgKGNvbnN0IHYgb2YgbWVzc2FnZS52YWx1ZXMpIHtcbiAgICAgICAgICAgIHdyaXRlci5pbnQzMih2KTtcbiAgICAgICAgfVxuICAgICAgICB3cml0ZXIubGRlbGltKCk7XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfSxcbiAgICBkZWNvZGUoaW5wdXQsIGxlbmd0aCkge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBpbnB1dCBpbnN0YW5jZW9mIG1pbmltYWxfMS5SZWFkZXIgPyBpbnB1dCA6IG5ldyBtaW5pbWFsXzEuUmVhZGVyKGlucHV0KTtcbiAgICAgICAgbGV0IGVuZCA9IGxlbmd0aCA9PT0gdW5kZWZpbmVkID8gcmVhZGVyLmxlbiA6IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ01zZ0dDQ1N0cmlrZTE1VjJDbGllbnRQb2xsU3RhdGUoKTtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhZyA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgIHN3aXRjaCAodGFnID4+PiAzKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnBvbGxpZCA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLm5hbWVzLnB1c2gocmVhZGVyLnN0cmluZygpKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICBpZiAoKHRhZyAmIDcpID09PSAyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbmQyID0gcmVhZGVyLnVpbnQzMigpICsgcmVhZGVyLnBvcztcbiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kMikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudmFsdWVzLnB1c2gocmVhZGVyLmludDMyKCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS52YWx1ZXMucHVzaChyZWFkZXIuaW50MzIoKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmVhZGVyLnNraXBUeXBlKHRhZyAmIDcpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9LFxuICAgIGZyb21QYXJ0aWFsKG9iamVjdCkge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYztcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDTXNnR0NDU3RyaWtlMTVWMkNsaWVudFBvbGxTdGF0ZSgpO1xuICAgICAgICBtZXNzYWdlLnBvbGxpZCA9IChfYSA9IG9iamVjdC5wb2xsaWQpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IDA7XG4gICAgICAgIG1lc3NhZ2UubmFtZXMgPSAoKF9iID0gb2JqZWN0Lm5hbWVzKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IubWFwKGUgPT4gZSkpIHx8IFtdO1xuICAgICAgICBtZXNzYWdlLnZhbHVlcyA9ICgoX2MgPSBvYmplY3QudmFsdWVzKSA9PT0gbnVsbCB8fCBfYyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2MubWFwKGUgPT4gZSkpIHx8IFtdO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG59O1xuZnVuY3Rpb24gY3JlYXRlQmFzZUNNc2dHQ0NTdHJpa2UxNVYyUGFydHlSZWdpc3RlcigpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBpZDogMCxcbiAgICAgICAgdmVyOiAwLFxuICAgICAgICBhcHI6IDAsXG4gICAgICAgIGFyazogMCxcbiAgICAgICAgbmJ5OiAwLFxuICAgICAgICBncnA6IDAsXG4gICAgICAgIHNsb3RzOiAwLFxuICAgICAgICBsYXVuY2hlcjogMCxcbiAgICAgICAgZ2FtZVR5cGU6IDBcbiAgICB9O1xufVxuZXhwb3J0cy5DTXNnR0NDU3RyaWtlMTVWMlBhcnR5UmVnaXN0ZXIgPSB7XG4gICAgZW5jb2RlKG1lc3NhZ2UsIHdyaXRlciA9IG1pbmltYWxfMS5Xcml0ZXIuY3JlYXRlKCkpIHtcbiAgICAgICAgaWYgKG1lc3NhZ2UuaWQgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoOCkudWludDMyKG1lc3NhZ2UuaWQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLnZlciAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigxNikudWludDMyKG1lc3NhZ2UudmVyKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5hcHIgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMjQpLnVpbnQzMihtZXNzYWdlLmFwcik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UuYXJrICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDMyKS51aW50MzIobWVzc2FnZS5hcmspO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLm5ieSAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig0MCkudWludDMyKG1lc3NhZ2UubmJ5KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5ncnAgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoNDgpLnVpbnQzMihtZXNzYWdlLmdycCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2Uuc2xvdHMgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoNTYpLnVpbnQzMihtZXNzYWdlLnNsb3RzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5sYXVuY2hlciAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig2NCkudWludDMyKG1lc3NhZ2UubGF1bmNoZXIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLmdhbWVUeXBlICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDcyKS51aW50MzIobWVzc2FnZS5nYW1lVHlwZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9LFxuICAgIGRlY29kZShpbnB1dCwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IGlucHV0IGluc3RhbmNlb2YgbWluaW1hbF8xLlJlYWRlciA/IGlucHV0IDogbmV3IG1pbmltYWxfMS5SZWFkZXIoaW5wdXQpO1xuICAgICAgICBsZXQgZW5kID0gbGVuZ3RoID09PSB1bmRlZmluZWQgPyByZWFkZXIubGVuIDogcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDTXNnR0NDU3RyaWtlMTVWMlBhcnR5UmVnaXN0ZXIoKTtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhZyA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgIHN3aXRjaCAodGFnID4+PiAzKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmlkID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudmVyID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuYXByID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuYXJrID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UubmJ5ID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZ3JwID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Uuc2xvdHMgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgODpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5sYXVuY2hlciA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA5OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmdhbWVUeXBlID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICByZWFkZXIuc2tpcFR5cGUodGFnICYgNyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH0sXG4gICAgZnJvbVBhcnRpYWwob2JqZWN0KSB7XG4gICAgICAgIHZhciBfYSwgX2IsIF9jLCBfZCwgX2UsIF9mLCBfZywgX2gsIF9qO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNNc2dHQ0NTdHJpa2UxNVYyUGFydHlSZWdpc3RlcigpO1xuICAgICAgICBtZXNzYWdlLmlkID0gKF9hID0gb2JqZWN0LmlkKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAwO1xuICAgICAgICBtZXNzYWdlLnZlciA9IChfYiA9IG9iamVjdC52ZXIpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IDA7XG4gICAgICAgIG1lc3NhZ2UuYXByID0gKF9jID0gb2JqZWN0LmFwcikgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogMDtcbiAgICAgICAgbWVzc2FnZS5hcmsgPSAoX2QgPSBvYmplY3QuYXJrKSAhPT0gbnVsbCAmJiBfZCAhPT0gdm9pZCAwID8gX2QgOiAwO1xuICAgICAgICBtZXNzYWdlLm5ieSA9IChfZSA9IG9iamVjdC5uYnkpICE9PSBudWxsICYmIF9lICE9PSB2b2lkIDAgPyBfZSA6IDA7XG4gICAgICAgIG1lc3NhZ2UuZ3JwID0gKF9mID0gb2JqZWN0LmdycCkgIT09IG51bGwgJiYgX2YgIT09IHZvaWQgMCA/IF9mIDogMDtcbiAgICAgICAgbWVzc2FnZS5zbG90cyA9IChfZyA9IG9iamVjdC5zbG90cykgIT09IG51bGwgJiYgX2cgIT09IHZvaWQgMCA/IF9nIDogMDtcbiAgICAgICAgbWVzc2FnZS5sYXVuY2hlciA9IChfaCA9IG9iamVjdC5sYXVuY2hlcikgIT09IG51bGwgJiYgX2ggIT09IHZvaWQgMCA/IF9oIDogMDtcbiAgICAgICAgbWVzc2FnZS5nYW1lVHlwZSA9IChfaiA9IG9iamVjdC5nYW1lVHlwZSkgIT09IG51bGwgJiYgX2ogIT09IHZvaWQgMCA/IF9qIDogMDtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxufTtcbmZ1bmN0aW9uIGNyZWF0ZUJhc2VDTXNnR0NDU3RyaWtlMTVWMlBhcnR5U2VhcmNoKCkge1xuICAgIHJldHVybiB7IHZlcjogMCwgYXByOiAwLCBhcms6IDAsIGdycHM6IFtdLCBsYXVuY2hlcjogMCwgZ2FtZVR5cGU6IDAgfTtcbn1cbmV4cG9ydHMuQ01zZ0dDQ1N0cmlrZTE1VjJQYXJ0eVNlYXJjaCA9IHtcbiAgICBlbmNvZGUobWVzc2FnZSwgd3JpdGVyID0gbWluaW1hbF8xLldyaXRlci5jcmVhdGUoKSkge1xuICAgICAgICBpZiAobWVzc2FnZS52ZXIgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoOCkudWludDMyKG1lc3NhZ2UudmVyKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5hcHIgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMTYpLnVpbnQzMihtZXNzYWdlLmFwcik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UuYXJrICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDI0KS51aW50MzIobWVzc2FnZS5hcmspO1xuICAgICAgICB9XG4gICAgICAgIHdyaXRlci51aW50MzIoMzQpLmZvcmsoKTtcbiAgICAgICAgZm9yIChjb25zdCB2IG9mIG1lc3NhZ2UuZ3Jwcykge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMih2KTtcbiAgICAgICAgfVxuICAgICAgICB3cml0ZXIubGRlbGltKCk7XG4gICAgICAgIGlmIChtZXNzYWdlLmxhdW5jaGVyICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDQwKS51aW50MzIobWVzc2FnZS5sYXVuY2hlcik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UuZ2FtZVR5cGUgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoNDgpLnVpbnQzMihtZXNzYWdlLmdhbWVUeXBlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH0sXG4gICAgZGVjb2RlKGlucHV0LCBsZW5ndGgpIHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gaW5wdXQgaW5zdGFuY2VvZiBtaW5pbWFsXzEuUmVhZGVyID8gaW5wdXQgOiBuZXcgbWluaW1hbF8xLlJlYWRlcihpbnB1dCk7XG4gICAgICAgIGxldCBlbmQgPSBsZW5ndGggPT09IHVuZGVmaW5lZCA/IHJlYWRlci5sZW4gOiByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNNc2dHQ0NTdHJpa2UxNVYyUGFydHlTZWFyY2goKTtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhZyA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgIHN3aXRjaCAodGFnID4+PiAzKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnZlciA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmFwciA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmFyayA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICBpZiAoKHRhZyAmIDcpID09PSAyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbmQyID0gcmVhZGVyLnVpbnQzMigpICsgcmVhZGVyLnBvcztcbiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kMikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZ3Jwcy5wdXNoKHJlYWRlci51aW50MzIoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmdycHMucHVzaChyZWFkZXIudWludDMyKCkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5sYXVuY2hlciA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmdhbWVUeXBlID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICByZWFkZXIuc2tpcFR5cGUodGFnICYgNyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH0sXG4gICAgZnJvbVBhcnRpYWwob2JqZWN0KSB7XG4gICAgICAgIHZhciBfYSwgX2IsIF9jLCBfZCwgX2UsIF9mO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNNc2dHQ0NTdHJpa2UxNVYyUGFydHlTZWFyY2goKTtcbiAgICAgICAgbWVzc2FnZS52ZXIgPSAoX2EgPSBvYmplY3QudmVyKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAwO1xuICAgICAgICBtZXNzYWdlLmFwciA9IChfYiA9IG9iamVjdC5hcHIpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IDA7XG4gICAgICAgIG1lc3NhZ2UuYXJrID0gKF9jID0gb2JqZWN0LmFyaykgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogMDtcbiAgICAgICAgbWVzc2FnZS5ncnBzID0gKChfZCA9IG9iamVjdC5ncnBzKSA9PT0gbnVsbCB8fCBfZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2QubWFwKGUgPT4gZSkpIHx8IFtdO1xuICAgICAgICBtZXNzYWdlLmxhdW5jaGVyID0gKF9lID0gb2JqZWN0LmxhdW5jaGVyKSAhPT0gbnVsbCAmJiBfZSAhPT0gdm9pZCAwID8gX2UgOiAwO1xuICAgICAgICBtZXNzYWdlLmdhbWVUeXBlID0gKF9mID0gb2JqZWN0LmdhbWVUeXBlKSAhPT0gbnVsbCAmJiBfZiAhPT0gdm9pZCAwID8gX2YgOiAwO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG59O1xuZnVuY3Rpb24gY3JlYXRlQmFzZUNNc2dHQ0NTdHJpa2UxNVYyUGFydHlTZWFyY2hSZXN1bHRzKCkge1xuICAgIHJldHVybiB7IGVudHJpZXM6IFtdIH07XG59XG5leHBvcnRzLkNNc2dHQ0NTdHJpa2UxNVYyUGFydHlTZWFyY2hSZXN1bHRzID0ge1xuICAgIGVuY29kZShtZXNzYWdlLCB3cml0ZXIgPSBtaW5pbWFsXzEuV3JpdGVyLmNyZWF0ZSgpKSB7XG4gICAgICAgIGZvciAoY29uc3QgdiBvZiBtZXNzYWdlLmVudHJpZXMpIHtcbiAgICAgICAgICAgIGV4cG9ydHMuQ01zZ0dDQ1N0cmlrZTE1VjJQYXJ0eVNlYXJjaFJlc3VsdHNfRW50cnkuZW5jb2RlKHYsIHdyaXRlci51aW50MzIoMTApLmZvcmsoKSkubGRlbGltKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9LFxuICAgIGRlY29kZShpbnB1dCwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IGlucHV0IGluc3RhbmNlb2YgbWluaW1hbF8xLlJlYWRlciA/IGlucHV0IDogbmV3IG1pbmltYWxfMS5SZWFkZXIoaW5wdXQpO1xuICAgICAgICBsZXQgZW5kID0gbGVuZ3RoID09PSB1bmRlZmluZWQgPyByZWFkZXIubGVuIDogcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDTXNnR0NDU3RyaWtlMTVWMlBhcnR5U2VhcmNoUmVzdWx0cygpO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZW50cmllcy5wdXNoKGV4cG9ydHMuQ01zZ0dDQ1N0cmlrZTE1VjJQYXJ0eVNlYXJjaFJlc3VsdHNfRW50cnkuZGVjb2RlKHJlYWRlciwgcmVhZGVyLnVpbnQzMigpKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJlYWRlci5za2lwVHlwZSh0YWcgJiA3KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfSxcbiAgICBmcm9tUGFydGlhbChvYmplY3QpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNNc2dHQ0NTdHJpa2UxNVYyUGFydHlTZWFyY2hSZXN1bHRzKCk7XG4gICAgICAgIG1lc3NhZ2UuZW50cmllcyA9XG4gICAgICAgICAgICAoKF9hID0gb2JqZWN0LmVudHJpZXMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5tYXAoZSA9PiBleHBvcnRzLkNNc2dHQ0NTdHJpa2UxNVYyUGFydHlTZWFyY2hSZXN1bHRzX0VudHJ5LmZyb21QYXJ0aWFsKGUpKSkgfHwgW107XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbn07XG5mdW5jdGlvbiBjcmVhdGVCYXNlQ01zZ0dDQ1N0cmlrZTE1VjJQYXJ0eVNlYXJjaFJlc3VsdHNfRW50cnkoKSB7XG4gICAgcmV0dXJuIHsgaWQ6IDAsIGdycDogMCwgZ2FtZVR5cGU6IDAsIGFwcjogMCwgYXJrOiAwLCBsb2M6IDAsIGFjY291bnRpZDogMCB9O1xufVxuZXhwb3J0cy5DTXNnR0NDU3RyaWtlMTVWMlBhcnR5U2VhcmNoUmVzdWx0c19FbnRyeSA9IHtcbiAgICBlbmNvZGUobWVzc2FnZSwgd3JpdGVyID0gbWluaW1hbF8xLldyaXRlci5jcmVhdGUoKSkge1xuICAgICAgICBpZiAobWVzc2FnZS5pZCAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig4KS51aW50MzIobWVzc2FnZS5pZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UuZ3JwICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDE2KS51aW50MzIobWVzc2FnZS5ncnApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLmdhbWVUeXBlICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDI0KS51aW50MzIobWVzc2FnZS5nYW1lVHlwZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UuYXByICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDMyKS51aW50MzIobWVzc2FnZS5hcHIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLmFyayAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig0MCkudWludDMyKG1lc3NhZ2UuYXJrKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5sb2MgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoNDgpLnVpbnQzMihtZXNzYWdlLmxvYyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UuYWNjb3VudGlkICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDU2KS51aW50MzIobWVzc2FnZS5hY2NvdW50aWQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfSxcbiAgICBkZWNvZGUoaW5wdXQsIGxlbmd0aCkge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBpbnB1dCBpbnN0YW5jZW9mIG1pbmltYWxfMS5SZWFkZXIgPyBpbnB1dCA6IG5ldyBtaW5pbWFsXzEuUmVhZGVyKGlucHV0KTtcbiAgICAgICAgbGV0IGVuZCA9IGxlbmd0aCA9PT0gdW5kZWZpbmVkID8gcmVhZGVyLmxlbiA6IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ01zZ0dDQ1N0cmlrZTE1VjJQYXJ0eVNlYXJjaFJlc3VsdHNfRW50cnkoKTtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhZyA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgIHN3aXRjaCAodGFnID4+PiAzKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmlkID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZ3JwID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZ2FtZVR5cGUgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5hcHIgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5hcmsgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5sb2MgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNzpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5hY2NvdW50aWQgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJlYWRlci5za2lwVHlwZSh0YWcgJiA3KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfSxcbiAgICBmcm9tUGFydGlhbChvYmplY3QpIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2MsIF9kLCBfZSwgX2YsIF9nO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNNc2dHQ0NTdHJpa2UxNVYyUGFydHlTZWFyY2hSZXN1bHRzX0VudHJ5KCk7XG4gICAgICAgIG1lc3NhZ2UuaWQgPSAoX2EgPSBvYmplY3QuaWQpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IDA7XG4gICAgICAgIG1lc3NhZ2UuZ3JwID0gKF9iID0gb2JqZWN0LmdycCkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogMDtcbiAgICAgICAgbWVzc2FnZS5nYW1lVHlwZSA9IChfYyA9IG9iamVjdC5nYW1lVHlwZSkgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogMDtcbiAgICAgICAgbWVzc2FnZS5hcHIgPSAoX2QgPSBvYmplY3QuYXByKSAhPT0gbnVsbCAmJiBfZCAhPT0gdm9pZCAwID8gX2QgOiAwO1xuICAgICAgICBtZXNzYWdlLmFyayA9IChfZSA9IG9iamVjdC5hcmspICE9PSBudWxsICYmIF9lICE9PSB2b2lkIDAgPyBfZSA6IDA7XG4gICAgICAgIG1lc3NhZ2UubG9jID0gKF9mID0gb2JqZWN0LmxvYykgIT09IG51bGwgJiYgX2YgIT09IHZvaWQgMCA/IF9mIDogMDtcbiAgICAgICAgbWVzc2FnZS5hY2NvdW50aWQgPSAoX2cgPSBvYmplY3QuYWNjb3VudGlkKSAhPT0gbnVsbCAmJiBfZyAhPT0gdm9pZCAwID8gX2cgOiAwO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG59O1xuZnVuY3Rpb24gY3JlYXRlQmFzZUNNc2dHQ0NTdHJpa2UxNVYyUGFydHlJbnZpdGUoKSB7XG4gICAgcmV0dXJuIHsgYWNjb3VudGlkOiAwLCBsb2JieWlkOiAwIH07XG59XG5leHBvcnRzLkNNc2dHQ0NTdHJpa2UxNVYyUGFydHlJbnZpdGUgPSB7XG4gICAgZW5jb2RlKG1lc3NhZ2UsIHdyaXRlciA9IG1pbmltYWxfMS5Xcml0ZXIuY3JlYXRlKCkpIHtcbiAgICAgICAgaWYgKG1lc3NhZ2UuYWNjb3VudGlkICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDgpLnVpbnQzMihtZXNzYWdlLmFjY291bnRpZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UubG9iYnlpZCAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigxNikudWludDMyKG1lc3NhZ2UubG9iYnlpZCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9LFxuICAgIGRlY29kZShpbnB1dCwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IGlucHV0IGluc3RhbmNlb2YgbWluaW1hbF8xLlJlYWRlciA/IGlucHV0IDogbmV3IG1pbmltYWxfMS5SZWFkZXIoaW5wdXQpO1xuICAgICAgICBsZXQgZW5kID0gbGVuZ3RoID09PSB1bmRlZmluZWQgPyByZWFkZXIubGVuIDogcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDTXNnR0NDU3RyaWtlMTVWMlBhcnR5SW52aXRlKCk7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBjb25zdCB0YWcgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKHRhZyA+Pj4gMykge1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5hY2NvdW50aWQgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5sb2JieWlkID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICByZWFkZXIuc2tpcFR5cGUodGFnICYgNyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH0sXG4gICAgZnJvbVBhcnRpYWwob2JqZWN0KSB7XG4gICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ01zZ0dDQ1N0cmlrZTE1VjJQYXJ0eUludml0ZSgpO1xuICAgICAgICBtZXNzYWdlLmFjY291bnRpZCA9IChfYSA9IG9iamVjdC5hY2NvdW50aWQpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IDA7XG4gICAgICAgIG1lc3NhZ2UubG9iYnlpZCA9IChfYiA9IG9iamVjdC5sb2JieWlkKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAwO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG59O1xuZnVuY3Rpb24gY3JlYXRlQmFzZUNNc2dHQ0NTdHJpa2UxNVYyQWNjb3VudFJlcXVlc3RDb1BsYXlzKCkge1xuICAgIHJldHVybiB7IHBsYXllcnM6IFtdLCBzZXJ2ZXJ0aW1lOiAwIH07XG59XG5leHBvcnRzLkNNc2dHQ0NTdHJpa2UxNVYyQWNjb3VudFJlcXVlc3RDb1BsYXlzID0ge1xuICAgIGVuY29kZShtZXNzYWdlLCB3cml0ZXIgPSBtaW5pbWFsXzEuV3JpdGVyLmNyZWF0ZSgpKSB7XG4gICAgICAgIGZvciAoY29uc3QgdiBvZiBtZXNzYWdlLnBsYXllcnMpIHtcbiAgICAgICAgICAgIGV4cG9ydHMuQ01zZ0dDQ1N0cmlrZTE1VjJBY2NvdW50UmVxdWVzdENvUGxheXNfUGxheWVyLmVuY29kZSh2LCB3cml0ZXIudWludDMyKDEwKS5mb3JrKCkpLmxkZWxpbSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLnNlcnZlcnRpbWUgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMTYpLnVpbnQzMihtZXNzYWdlLnNlcnZlcnRpbWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfSxcbiAgICBkZWNvZGUoaW5wdXQsIGxlbmd0aCkge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBpbnB1dCBpbnN0YW5jZW9mIG1pbmltYWxfMS5SZWFkZXIgPyBpbnB1dCA6IG5ldyBtaW5pbWFsXzEuUmVhZGVyKGlucHV0KTtcbiAgICAgICAgbGV0IGVuZCA9IGxlbmd0aCA9PT0gdW5kZWZpbmVkID8gcmVhZGVyLmxlbiA6IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ01zZ0dDQ1N0cmlrZTE1VjJBY2NvdW50UmVxdWVzdENvUGxheXMoKTtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhZyA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgIHN3aXRjaCAodGFnID4+PiAzKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnBsYXllcnMucHVzaChleHBvcnRzLkNNc2dHQ0NTdHJpa2UxNVYyQWNjb3VudFJlcXVlc3RDb1BsYXlzX1BsYXllci5kZWNvZGUocmVhZGVyLCByZWFkZXIudWludDMyKCkpKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnNlcnZlcnRpbWUgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJlYWRlci5za2lwVHlwZSh0YWcgJiA3KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfSxcbiAgICBmcm9tUGFydGlhbChvYmplY3QpIHtcbiAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDTXNnR0NDU3RyaWtlMTVWMkFjY291bnRSZXF1ZXN0Q29QbGF5cygpO1xuICAgICAgICBtZXNzYWdlLnBsYXllcnMgPVxuICAgICAgICAgICAgKChfYSA9IG9iamVjdC5wbGF5ZXJzKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EubWFwKGUgPT4gZXhwb3J0cy5DTXNnR0NDU3RyaWtlMTVWMkFjY291bnRSZXF1ZXN0Q29QbGF5c19QbGF5ZXIuZnJvbVBhcnRpYWwoZSkpKSB8fCBbXTtcbiAgICAgICAgbWVzc2FnZS5zZXJ2ZXJ0aW1lID0gKF9iID0gb2JqZWN0LnNlcnZlcnRpbWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IDA7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbn07XG5mdW5jdGlvbiBjcmVhdGVCYXNlQ01zZ0dDQ1N0cmlrZTE1VjJBY2NvdW50UmVxdWVzdENvUGxheXNfUGxheWVyKCkge1xuICAgIHJldHVybiB7IGFjY291bnRpZDogMCwgcnRjb3BsYXk6IDAsIG9ubGluZTogZmFsc2UgfTtcbn1cbmV4cG9ydHMuQ01zZ0dDQ1N0cmlrZTE1VjJBY2NvdW50UmVxdWVzdENvUGxheXNfUGxheWVyID0ge1xuICAgIGVuY29kZShtZXNzYWdlLCB3cml0ZXIgPSBtaW5pbWFsXzEuV3JpdGVyLmNyZWF0ZSgpKSB7XG4gICAgICAgIGlmIChtZXNzYWdlLmFjY291bnRpZCAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig4KS51aW50MzIobWVzc2FnZS5hY2NvdW50aWQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLnJ0Y29wbGF5ICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDE2KS51aW50MzIobWVzc2FnZS5ydGNvcGxheSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2Uub25saW5lID09PSB0cnVlKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDI0KS5ib29sKG1lc3NhZ2Uub25saW5lKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH0sXG4gICAgZGVjb2RlKGlucHV0LCBsZW5ndGgpIHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gaW5wdXQgaW5zdGFuY2VvZiBtaW5pbWFsXzEuUmVhZGVyID8gaW5wdXQgOiBuZXcgbWluaW1hbF8xLlJlYWRlcihpbnB1dCk7XG4gICAgICAgIGxldCBlbmQgPSBsZW5ndGggPT09IHVuZGVmaW5lZCA/IHJlYWRlci5sZW4gOiByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNNc2dHQ0NTdHJpa2UxNVYyQWNjb3VudFJlcXVlc3RDb1BsYXlzX1BsYXllcigpO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuYWNjb3VudGlkID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UucnRjb3BsYXkgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5vbmxpbmUgPSByZWFkZXIuYm9vbCgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICByZWFkZXIuc2tpcFR5cGUodGFnICYgNyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH0sXG4gICAgZnJvbVBhcnRpYWwob2JqZWN0KSB7XG4gICAgICAgIHZhciBfYSwgX2IsIF9jO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNNc2dHQ0NTdHJpa2UxNVYyQWNjb3VudFJlcXVlc3RDb1BsYXlzX1BsYXllcigpO1xuICAgICAgICBtZXNzYWdlLmFjY291bnRpZCA9IChfYSA9IG9iamVjdC5hY2NvdW50aWQpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IDA7XG4gICAgICAgIG1lc3NhZ2UucnRjb3BsYXkgPSAoX2IgPSBvYmplY3QucnRjb3BsYXkpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IDA7XG4gICAgICAgIG1lc3NhZ2Uub25saW5lID0gKF9jID0gb2JqZWN0Lm9ubGluZSkgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogZmFsc2U7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbn07XG5mdW5jdGlvbiBjcmVhdGVCYXNlQ01zZ0dDQ1N0cmlrZTE1VjJDbGllbnRUb0dDUmVxdWVzdFRpY2tldCgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBhdXRob3JpemVkU3RlYW1JZDogTG9uZy5VWkVSTyxcbiAgICAgICAgYXV0aG9yaXplZFB1YmxpY0lwOiAwLFxuICAgICAgICBnYW1lc2VydmVyU3RlYW1JZDogTG9uZy5VWkVSTyxcbiAgICAgICAgZ2FtZXNlcnZlclNkclJvdXRpbmc6IFwiXCJcbiAgICB9O1xufVxuZXhwb3J0cy5DTXNnR0NDU3RyaWtlMTVWMkNsaWVudFRvR0NSZXF1ZXN0VGlja2V0ID0ge1xuICAgIGVuY29kZShtZXNzYWdlLCB3cml0ZXIgPSBtaW5pbWFsXzEuV3JpdGVyLmNyZWF0ZSgpKSB7XG4gICAgICAgIGlmICghbWVzc2FnZS5hdXRob3JpemVkU3RlYW1JZC5pc1plcm8oKSkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig5KS5maXhlZDY0KG1lc3NhZ2UuYXV0aG9yaXplZFN0ZWFtSWQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLmF1dGhvcml6ZWRQdWJsaWNJcCAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigyMSkuZml4ZWQzMihtZXNzYWdlLmF1dGhvcml6ZWRQdWJsaWNJcCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFtZXNzYWdlLmdhbWVzZXJ2ZXJTdGVhbUlkLmlzWmVybygpKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDI1KS5maXhlZDY0KG1lc3NhZ2UuZ2FtZXNlcnZlclN0ZWFtSWQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLmdhbWVzZXJ2ZXJTZHJSb3V0aW5nICE9PSBcIlwiKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDQyKS5zdHJpbmcobWVzc2FnZS5nYW1lc2VydmVyU2RyUm91dGluZyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9LFxuICAgIGRlY29kZShpbnB1dCwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IGlucHV0IGluc3RhbmNlb2YgbWluaW1hbF8xLlJlYWRlciA/IGlucHV0IDogbmV3IG1pbmltYWxfMS5SZWFkZXIoaW5wdXQpO1xuICAgICAgICBsZXQgZW5kID0gbGVuZ3RoID09PSB1bmRlZmluZWQgPyByZWFkZXIubGVuIDogcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDTXNnR0NDU3RyaWtlMTVWMkNsaWVudFRvR0NSZXF1ZXN0VGlja2V0KCk7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBjb25zdCB0YWcgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKHRhZyA+Pj4gMykge1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5hdXRob3JpemVkU3RlYW1JZCA9IHJlYWRlci5maXhlZDY0KCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5hdXRob3JpemVkUHVibGljSXAgPSByZWFkZXIuZml4ZWQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZ2FtZXNlcnZlclN0ZWFtSWQgPSByZWFkZXIuZml4ZWQ2NCgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZ2FtZXNlcnZlclNkclJvdXRpbmcgPSByZWFkZXIuc3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJlYWRlci5za2lwVHlwZSh0YWcgJiA3KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfSxcbiAgICBmcm9tUGFydGlhbChvYmplY3QpIHtcbiAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDTXNnR0NDU3RyaWtlMTVWMkNsaWVudFRvR0NSZXF1ZXN0VGlja2V0KCk7XG4gICAgICAgIG1lc3NhZ2UuYXV0aG9yaXplZFN0ZWFtSWQgPVxuICAgICAgICAgICAgb2JqZWN0LmF1dGhvcml6ZWRTdGVhbUlkICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICAgICBvYmplY3QuYXV0aG9yaXplZFN0ZWFtSWQgIT09IG51bGxcbiAgICAgICAgICAgICAgICA/IExvbmcuZnJvbVZhbHVlKG9iamVjdC5hdXRob3JpemVkU3RlYW1JZClcbiAgICAgICAgICAgICAgICA6IExvbmcuVVpFUk87XG4gICAgICAgIG1lc3NhZ2UuYXV0aG9yaXplZFB1YmxpY0lwID0gKF9hID0gb2JqZWN0LmF1dGhvcml6ZWRQdWJsaWNJcCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMDtcbiAgICAgICAgbWVzc2FnZS5nYW1lc2VydmVyU3RlYW1JZCA9XG4gICAgICAgICAgICBvYmplY3QuZ2FtZXNlcnZlclN0ZWFtSWQgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgICAgIG9iamVjdC5nYW1lc2VydmVyU3RlYW1JZCAhPT0gbnVsbFxuICAgICAgICAgICAgICAgID8gTG9uZy5mcm9tVmFsdWUob2JqZWN0LmdhbWVzZXJ2ZXJTdGVhbUlkKVxuICAgICAgICAgICAgICAgIDogTG9uZy5VWkVSTztcbiAgICAgICAgbWVzc2FnZS5nYW1lc2VydmVyU2RyUm91dGluZyA9IChfYiA9IG9iamVjdC5nYW1lc2VydmVyU2RyUm91dGluZykgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogXCJcIjtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxufTtcbmZ1bmN0aW9uIGNyZWF0ZUJhc2VDTXNnR0NUb0NsaWVudFN0ZWFtRGF0YWdyYW1UaWNrZXQoKSB7XG4gICAgcmV0dXJuIHsgc2VyaWFsaXplZFRpY2tldDogbmV3IFVpbnQ4QXJyYXkoKSB9O1xufVxuZXhwb3J0cy5DTXNnR0NUb0NsaWVudFN0ZWFtRGF0YWdyYW1UaWNrZXQgPSB7XG4gICAgZW5jb2RlKG1lc3NhZ2UsIHdyaXRlciA9IG1pbmltYWxfMS5Xcml0ZXIuY3JlYXRlKCkpIHtcbiAgICAgICAgaWYgKG1lc3NhZ2Uuc2VyaWFsaXplZFRpY2tldC5sZW5ndGggIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMTMwKS5ieXRlcyhtZXNzYWdlLnNlcmlhbGl6ZWRUaWNrZXQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfSxcbiAgICBkZWNvZGUoaW5wdXQsIGxlbmd0aCkge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBpbnB1dCBpbnN0YW5jZW9mIG1pbmltYWxfMS5SZWFkZXIgPyBpbnB1dCA6IG5ldyBtaW5pbWFsXzEuUmVhZGVyKGlucHV0KTtcbiAgICAgICAgbGV0IGVuZCA9IGxlbmd0aCA9PT0gdW5kZWZpbmVkID8gcmVhZGVyLmxlbiA6IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ01zZ0dDVG9DbGllbnRTdGVhbURhdGFncmFtVGlja2V0KCk7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBjb25zdCB0YWcgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKHRhZyA+Pj4gMykge1xuICAgICAgICAgICAgICAgIGNhc2UgMTY6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Uuc2VyaWFsaXplZFRpY2tldCA9IHJlYWRlci5ieXRlcygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICByZWFkZXIuc2tpcFR5cGUodGFnICYgNyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH0sXG4gICAgZnJvbVBhcnRpYWwob2JqZWN0KSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDTXNnR0NUb0NsaWVudFN0ZWFtRGF0YWdyYW1UaWNrZXQoKTtcbiAgICAgICAgbWVzc2FnZS5zZXJpYWxpemVkVGlja2V0ID0gKF9hID0gb2JqZWN0LnNlcmlhbGl6ZWRUaWNrZXQpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IG5ldyBVaW50OEFycmF5KCk7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbn07XG5mdW5jdGlvbiBjcmVhdGVCYXNlQ01zZ0dDQ1N0cmlrZTE1VjJDbGllbnRSZXF1ZXN0T2ZmZXJzKCkge1xuICAgIHJldHVybiB7fTtcbn1cbmV4cG9ydHMuQ01zZ0dDQ1N0cmlrZTE1VjJDbGllbnRSZXF1ZXN0T2ZmZXJzID0ge1xuICAgIGVuY29kZShfLCB3cml0ZXIgPSBtaW5pbWFsXzEuV3JpdGVyLmNyZWF0ZSgpKSB7XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfSxcbiAgICBkZWNvZGUoaW5wdXQsIGxlbmd0aCkge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBpbnB1dCBpbnN0YW5jZW9mIG1pbmltYWxfMS5SZWFkZXIgPyBpbnB1dCA6IG5ldyBtaW5pbWFsXzEuUmVhZGVyKGlucHV0KTtcbiAgICAgICAgbGV0IGVuZCA9IGxlbmd0aCA9PT0gdW5kZWZpbmVkID8gcmVhZGVyLmxlbiA6IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ01zZ0dDQ1N0cmlrZTE1VjJDbGllbnRSZXF1ZXN0T2ZmZXJzKCk7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBjb25zdCB0YWcgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKHRhZyA+Pj4gMykge1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJlYWRlci5za2lwVHlwZSh0YWcgJiA3KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfSxcbiAgICBmcm9tUGFydGlhbChfKSB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ01zZ0dDQ1N0cmlrZTE1VjJDbGllbnRSZXF1ZXN0T2ZmZXJzKCk7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbn07XG5mdW5jdGlvbiBjcmVhdGVCYXNlQ01zZ0dDQ1N0cmlrZTE1VjJDbGllbnRSZXF1ZXN0U291dmVuaXIoKSB7XG4gICAgcmV0dXJuIHsgaXRlbWlkOiBMb25nLlVaRVJPLCBtYXRjaGlkOiBMb25nLlVaRVJPLCBldmVudGlkOiAwIH07XG59XG5leHBvcnRzLkNNc2dHQ0NTdHJpa2UxNVYyQ2xpZW50UmVxdWVzdFNvdXZlbmlyID0ge1xuICAgIGVuY29kZShtZXNzYWdlLCB3cml0ZXIgPSBtaW5pbWFsXzEuV3JpdGVyLmNyZWF0ZSgpKSB7XG4gICAgICAgIGlmICghbWVzc2FnZS5pdGVtaWQuaXNaZXJvKCkpIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoOCkudWludDY0KG1lc3NhZ2UuaXRlbWlkKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIW1lc3NhZ2UubWF0Y2hpZC5pc1plcm8oKSkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigxNikudWludDY0KG1lc3NhZ2UubWF0Y2hpZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UuZXZlbnRpZCAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigyNCkuaW50MzIobWVzc2FnZS5ldmVudGlkKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH0sXG4gICAgZGVjb2RlKGlucHV0LCBsZW5ndGgpIHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gaW5wdXQgaW5zdGFuY2VvZiBtaW5pbWFsXzEuUmVhZGVyID8gaW5wdXQgOiBuZXcgbWluaW1hbF8xLlJlYWRlcihpbnB1dCk7XG4gICAgICAgIGxldCBlbmQgPSBsZW5ndGggPT09IHVuZGVmaW5lZCA/IHJlYWRlci5sZW4gOiByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNNc2dHQ0NTdHJpa2UxNVYyQ2xpZW50UmVxdWVzdFNvdXZlbmlyKCk7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBjb25zdCB0YWcgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKHRhZyA+Pj4gMykge1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5pdGVtaWQgPSByZWFkZXIudWludDY0KCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5tYXRjaGlkID0gcmVhZGVyLnVpbnQ2NCgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZXZlbnRpZCA9IHJlYWRlci5pbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICByZWFkZXIuc2tpcFR5cGUodGFnICYgNyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH0sXG4gICAgZnJvbVBhcnRpYWwob2JqZWN0KSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDTXNnR0NDU3RyaWtlMTVWMkNsaWVudFJlcXVlc3RTb3V2ZW5pcigpO1xuICAgICAgICBtZXNzYWdlLml0ZW1pZCA9XG4gICAgICAgICAgICBvYmplY3QuaXRlbWlkICE9PSB1bmRlZmluZWQgJiYgb2JqZWN0Lml0ZW1pZCAhPT0gbnVsbFxuICAgICAgICAgICAgICAgID8gTG9uZy5mcm9tVmFsdWUob2JqZWN0Lml0ZW1pZClcbiAgICAgICAgICAgICAgICA6IExvbmcuVVpFUk87XG4gICAgICAgIG1lc3NhZ2UubWF0Y2hpZCA9XG4gICAgICAgICAgICBvYmplY3QubWF0Y2hpZCAhPT0gdW5kZWZpbmVkICYmIG9iamVjdC5tYXRjaGlkICE9PSBudWxsXG4gICAgICAgICAgICAgICAgPyBMb25nLmZyb21WYWx1ZShvYmplY3QubWF0Y2hpZClcbiAgICAgICAgICAgICAgICA6IExvbmcuVVpFUk87XG4gICAgICAgIG1lc3NhZ2UuZXZlbnRpZCA9IChfYSA9IG9iamVjdC5ldmVudGlkKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAwO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG59O1xuZnVuY3Rpb24gY3JlYXRlQmFzZUNNc2dHQ0NTdHJpa2UxNVYyQ2xpZW50QWNjb3VudEJhbGFuY2UoKSB7XG4gICAgcmV0dXJuIHsgYW1vdW50OiBMb25nLlVaRVJPLCB1cmw6IFwiXCIgfTtcbn1cbmV4cG9ydHMuQ01zZ0dDQ1N0cmlrZTE1VjJDbGllbnRBY2NvdW50QmFsYW5jZSA9IHtcbiAgICBlbmNvZGUobWVzc2FnZSwgd3JpdGVyID0gbWluaW1hbF8xLldyaXRlci5jcmVhdGUoKSkge1xuICAgICAgICBpZiAoIW1lc3NhZ2UuYW1vdW50LmlzWmVybygpKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDgpLnVpbnQ2NChtZXNzYWdlLmFtb3VudCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UudXJsICE9PSBcIlwiKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDE4KS5zdHJpbmcobWVzc2FnZS51cmwpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfSxcbiAgICBkZWNvZGUoaW5wdXQsIGxlbmd0aCkge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBpbnB1dCBpbnN0YW5jZW9mIG1pbmltYWxfMS5SZWFkZXIgPyBpbnB1dCA6IG5ldyBtaW5pbWFsXzEuUmVhZGVyKGlucHV0KTtcbiAgICAgICAgbGV0IGVuZCA9IGxlbmd0aCA9PT0gdW5kZWZpbmVkID8gcmVhZGVyLmxlbiA6IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ01zZ0dDQ1N0cmlrZTE1VjJDbGllbnRBY2NvdW50QmFsYW5jZSgpO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuYW1vdW50ID0gcmVhZGVyLnVpbnQ2NCgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudXJsID0gcmVhZGVyLnN0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICByZWFkZXIuc2tpcFR5cGUodGFnICYgNyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH0sXG4gICAgZnJvbVBhcnRpYWwob2JqZWN0KSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDTXNnR0NDU3RyaWtlMTVWMkNsaWVudEFjY291bnRCYWxhbmNlKCk7XG4gICAgICAgIG1lc3NhZ2UuYW1vdW50ID1cbiAgICAgICAgICAgIG9iamVjdC5hbW91bnQgIT09IHVuZGVmaW5lZCAmJiBvYmplY3QuYW1vdW50ICE9PSBudWxsXG4gICAgICAgICAgICAgICAgPyBMb25nLmZyb21WYWx1ZShvYmplY3QuYW1vdW50KVxuICAgICAgICAgICAgICAgIDogTG9uZy5VWkVSTztcbiAgICAgICAgbWVzc2FnZS51cmwgPSAoX2EgPSBvYmplY3QudXJsKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBcIlwiO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG59O1xuZnVuY3Rpb24gY3JlYXRlQmFzZUNNc2dHQ0NTdHJpa2UxNVYyQ2xpZW50UGFydHlKb2luUmVsYXkoKSB7XG4gICAgcmV0dXJuIHsgYWNjb3VudGlkOiAwLCBsb2JieWlkOiBMb25nLlVaRVJPIH07XG59XG5leHBvcnRzLkNNc2dHQ0NTdHJpa2UxNVYyQ2xpZW50UGFydHlKb2luUmVsYXkgPSB7XG4gICAgZW5jb2RlKG1lc3NhZ2UsIHdyaXRlciA9IG1pbmltYWxfMS5Xcml0ZXIuY3JlYXRlKCkpIHtcbiAgICAgICAgaWYgKG1lc3NhZ2UuYWNjb3VudGlkICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDgpLnVpbnQzMihtZXNzYWdlLmFjY291bnRpZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFtZXNzYWdlLmxvYmJ5aWQuaXNaZXJvKCkpIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMTYpLnVpbnQ2NChtZXNzYWdlLmxvYmJ5aWQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfSxcbiAgICBkZWNvZGUoaW5wdXQsIGxlbmd0aCkge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBpbnB1dCBpbnN0YW5jZW9mIG1pbmltYWxfMS5SZWFkZXIgPyBpbnB1dCA6IG5ldyBtaW5pbWFsXzEuUmVhZGVyKGlucHV0KTtcbiAgICAgICAgbGV0IGVuZCA9IGxlbmd0aCA9PT0gdW5kZWZpbmVkID8gcmVhZGVyLmxlbiA6IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ01zZ0dDQ1N0cmlrZTE1VjJDbGllbnRQYXJ0eUpvaW5SZWxheSgpO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuYWNjb3VudGlkID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UubG9iYnlpZCA9IHJlYWRlci51aW50NjQoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmVhZGVyLnNraXBUeXBlKHRhZyAmIDcpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9LFxuICAgIGZyb21QYXJ0aWFsKG9iamVjdCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ01zZ0dDQ1N0cmlrZTE1VjJDbGllbnRQYXJ0eUpvaW5SZWxheSgpO1xuICAgICAgICBtZXNzYWdlLmFjY291bnRpZCA9IChfYSA9IG9iamVjdC5hY2NvdW50aWQpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IDA7XG4gICAgICAgIG1lc3NhZ2UubG9iYnlpZCA9XG4gICAgICAgICAgICBvYmplY3QubG9iYnlpZCAhPT0gdW5kZWZpbmVkICYmIG9iamVjdC5sb2JieWlkICE9PSBudWxsXG4gICAgICAgICAgICAgICAgPyBMb25nLmZyb21WYWx1ZShvYmplY3QubG9iYnlpZClcbiAgICAgICAgICAgICAgICA6IExvbmcuVVpFUk87XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbn07XG5mdW5jdGlvbiBjcmVhdGVCYXNlQ01zZ0dDQ1N0cmlrZTE1VjJDbGllbnRQYXJ0eVdhcm5pbmcoKSB7XG4gICAgcmV0dXJuIHsgZW50cmllczogW10gfTtcbn1cbmV4cG9ydHMuQ01zZ0dDQ1N0cmlrZTE1VjJDbGllbnRQYXJ0eVdhcm5pbmcgPSB7XG4gICAgZW5jb2RlKG1lc3NhZ2UsIHdyaXRlciA9IG1pbmltYWxfMS5Xcml0ZXIuY3JlYXRlKCkpIHtcbiAgICAgICAgZm9yIChjb25zdCB2IG9mIG1lc3NhZ2UuZW50cmllcykge1xuICAgICAgICAgICAgZXhwb3J0cy5DTXNnR0NDU3RyaWtlMTVWMkNsaWVudFBhcnR5V2FybmluZ19FbnRyeS5lbmNvZGUodiwgd3JpdGVyLnVpbnQzMigxMCkuZm9yaygpKS5sZGVsaW0oKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH0sXG4gICAgZGVjb2RlKGlucHV0LCBsZW5ndGgpIHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gaW5wdXQgaW5zdGFuY2VvZiBtaW5pbWFsXzEuUmVhZGVyID8gaW5wdXQgOiBuZXcgbWluaW1hbF8xLlJlYWRlcihpbnB1dCk7XG4gICAgICAgIGxldCBlbmQgPSBsZW5ndGggPT09IHVuZGVmaW5lZCA/IHJlYWRlci5sZW4gOiByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNNc2dHQ0NTdHJpa2UxNVYyQ2xpZW50UGFydHlXYXJuaW5nKCk7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBjb25zdCB0YWcgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKHRhZyA+Pj4gMykge1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5lbnRyaWVzLnB1c2goZXhwb3J0cy5DTXNnR0NDU3RyaWtlMTVWMkNsaWVudFBhcnR5V2FybmluZ19FbnRyeS5kZWNvZGUocmVhZGVyLCByZWFkZXIudWludDMyKCkpKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmVhZGVyLnNraXBUeXBlKHRhZyAmIDcpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9LFxuICAgIGZyb21QYXJ0aWFsKG9iamVjdCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ01zZ0dDQ1N0cmlrZTE1VjJDbGllbnRQYXJ0eVdhcm5pbmcoKTtcbiAgICAgICAgbWVzc2FnZS5lbnRyaWVzID1cbiAgICAgICAgICAgICgoX2EgPSBvYmplY3QuZW50cmllcykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLm1hcChlID0+IGV4cG9ydHMuQ01zZ0dDQ1N0cmlrZTE1VjJDbGllbnRQYXJ0eVdhcm5pbmdfRW50cnkuZnJvbVBhcnRpYWwoZSkpKSB8fCBbXTtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxufTtcbmZ1bmN0aW9uIGNyZWF0ZUJhc2VDTXNnR0NDU3RyaWtlMTVWMkNsaWVudFBhcnR5V2FybmluZ19FbnRyeSgpIHtcbiAgICByZXR1cm4geyBhY2NvdW50aWQ6IDAsIHdhcm50eXBlOiAwIH07XG59XG5leHBvcnRzLkNNc2dHQ0NTdHJpa2UxNVYyQ2xpZW50UGFydHlXYXJuaW5nX0VudHJ5ID0ge1xuICAgIGVuY29kZShtZXNzYWdlLCB3cml0ZXIgPSBtaW5pbWFsXzEuV3JpdGVyLmNyZWF0ZSgpKSB7XG4gICAgICAgIGlmIChtZXNzYWdlLmFjY291bnRpZCAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig4KS51aW50MzIobWVzc2FnZS5hY2NvdW50aWQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLndhcm50eXBlICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDE2KS51aW50MzIobWVzc2FnZS53YXJudHlwZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9LFxuICAgIGRlY29kZShpbnB1dCwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IGlucHV0IGluc3RhbmNlb2YgbWluaW1hbF8xLlJlYWRlciA/IGlucHV0IDogbmV3IG1pbmltYWxfMS5SZWFkZXIoaW5wdXQpO1xuICAgICAgICBsZXQgZW5kID0gbGVuZ3RoID09PSB1bmRlZmluZWQgPyByZWFkZXIubGVuIDogcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDTXNnR0NDU3RyaWtlMTVWMkNsaWVudFBhcnR5V2FybmluZ19FbnRyeSgpO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuYWNjb3VudGlkID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Uud2FybnR5cGUgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJlYWRlci5za2lwVHlwZSh0YWcgJiA3KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfSxcbiAgICBmcm9tUGFydGlhbChvYmplY3QpIHtcbiAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDTXNnR0NDU3RyaWtlMTVWMkNsaWVudFBhcnR5V2FybmluZ19FbnRyeSgpO1xuICAgICAgICBtZXNzYWdlLmFjY291bnRpZCA9IChfYSA9IG9iamVjdC5hY2NvdW50aWQpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IDA7XG4gICAgICAgIG1lc3NhZ2Uud2FybnR5cGUgPSAoX2IgPSBvYmplY3Qud2FybnR5cGUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IDA7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbn07XG5mdW5jdGlvbiBjcmVhdGVCYXNlQ01zZ0dDQ1N0cmlrZTE1VjJTZXRFdmVudEZhdm9yaXRlKCkge1xuICAgIHJldHVybiB7IGV2ZW50aWQ6IExvbmcuVVpFUk8sIGlzRmF2b3JpdGU6IGZhbHNlIH07XG59XG5leHBvcnRzLkNNc2dHQ0NTdHJpa2UxNVYyU2V0RXZlbnRGYXZvcml0ZSA9IHtcbiAgICBlbmNvZGUobWVzc2FnZSwgd3JpdGVyID0gbWluaW1hbF8xLldyaXRlci5jcmVhdGUoKSkge1xuICAgICAgICBpZiAoIW1lc3NhZ2UuZXZlbnRpZC5pc1plcm8oKSkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig4KS51aW50NjQobWVzc2FnZS5ldmVudGlkKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5pc0Zhdm9yaXRlID09PSB0cnVlKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDE2KS5ib29sKG1lc3NhZ2UuaXNGYXZvcml0ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9LFxuICAgIGRlY29kZShpbnB1dCwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IGlucHV0IGluc3RhbmNlb2YgbWluaW1hbF8xLlJlYWRlciA/IGlucHV0IDogbmV3IG1pbmltYWxfMS5SZWFkZXIoaW5wdXQpO1xuICAgICAgICBsZXQgZW5kID0gbGVuZ3RoID09PSB1bmRlZmluZWQgPyByZWFkZXIubGVuIDogcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDTXNnR0NDU3RyaWtlMTVWMlNldEV2ZW50RmF2b3JpdGUoKTtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhZyA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgIHN3aXRjaCAodGFnID4+PiAzKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmV2ZW50aWQgPSByZWFkZXIudWludDY0KCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5pc0Zhdm9yaXRlID0gcmVhZGVyLmJvb2woKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmVhZGVyLnNraXBUeXBlKHRhZyAmIDcpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9LFxuICAgIGZyb21QYXJ0aWFsKG9iamVjdCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ01zZ0dDQ1N0cmlrZTE1VjJTZXRFdmVudEZhdm9yaXRlKCk7XG4gICAgICAgIG1lc3NhZ2UuZXZlbnRpZCA9XG4gICAgICAgICAgICBvYmplY3QuZXZlbnRpZCAhPT0gdW5kZWZpbmVkICYmIG9iamVjdC5ldmVudGlkICE9PSBudWxsXG4gICAgICAgICAgICAgICAgPyBMb25nLmZyb21WYWx1ZShvYmplY3QuZXZlbnRpZClcbiAgICAgICAgICAgICAgICA6IExvbmcuVVpFUk87XG4gICAgICAgIG1lc3NhZ2UuaXNGYXZvcml0ZSA9IChfYSA9IG9iamVjdC5pc0Zhdm9yaXRlKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBmYWxzZTtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxufTtcbmZ1bmN0aW9uIGNyZWF0ZUJhc2VDTXNnR0NDU3RyaWtlMTVWMkdldEV2ZW50RmF2b3JpdGVzUmVxdWVzdCgpIHtcbiAgICByZXR1cm4geyBhbGxFdmVudHM6IGZhbHNlIH07XG59XG5leHBvcnRzLkNNc2dHQ0NTdHJpa2UxNVYyR2V0RXZlbnRGYXZvcml0ZXNSZXF1ZXN0ID0ge1xuICAgIGVuY29kZShtZXNzYWdlLCB3cml0ZXIgPSBtaW5pbWFsXzEuV3JpdGVyLmNyZWF0ZSgpKSB7XG4gICAgICAgIGlmIChtZXNzYWdlLmFsbEV2ZW50cyA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig4KS5ib29sKG1lc3NhZ2UuYWxsRXZlbnRzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH0sXG4gICAgZGVjb2RlKGlucHV0LCBsZW5ndGgpIHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gaW5wdXQgaW5zdGFuY2VvZiBtaW5pbWFsXzEuUmVhZGVyID8gaW5wdXQgOiBuZXcgbWluaW1hbF8xLlJlYWRlcihpbnB1dCk7XG4gICAgICAgIGxldCBlbmQgPSBsZW5ndGggPT09IHVuZGVmaW5lZCA/IHJlYWRlci5sZW4gOiByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNNc2dHQ0NTdHJpa2UxNVYyR2V0RXZlbnRGYXZvcml0ZXNSZXF1ZXN0KCk7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBjb25zdCB0YWcgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKHRhZyA+Pj4gMykge1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5hbGxFdmVudHMgPSByZWFkZXIuYm9vbCgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICByZWFkZXIuc2tpcFR5cGUodGFnICYgNyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH0sXG4gICAgZnJvbVBhcnRpYWwob2JqZWN0KSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDTXNnR0NDU3RyaWtlMTVWMkdldEV2ZW50RmF2b3JpdGVzUmVxdWVzdCgpO1xuICAgICAgICBtZXNzYWdlLmFsbEV2ZW50cyA9IChfYSA9IG9iamVjdC5hbGxFdmVudHMpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IGZhbHNlO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG59O1xuZnVuY3Rpb24gY3JlYXRlQmFzZUNNc2dHQ0NTdHJpa2UxNVYyR2V0RXZlbnRGYXZvcml0ZXNSZXNwb25zZSgpIHtcbiAgICByZXR1cm4geyBhbGxFdmVudHM6IGZhbHNlLCBqc29uRmF2b3JpdGVzOiBcIlwiLCBqc29uRmVhdHVyZWQ6IFwiXCIgfTtcbn1cbmV4cG9ydHMuQ01zZ0dDQ1N0cmlrZTE1VjJHZXRFdmVudEZhdm9yaXRlc1Jlc3BvbnNlID0ge1xuICAgIGVuY29kZShtZXNzYWdlLCB3cml0ZXIgPSBtaW5pbWFsXzEuV3JpdGVyLmNyZWF0ZSgpKSB7XG4gICAgICAgIGlmIChtZXNzYWdlLmFsbEV2ZW50cyA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig4KS5ib29sKG1lc3NhZ2UuYWxsRXZlbnRzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5qc29uRmF2b3JpdGVzICE9PSBcIlwiKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDE4KS5zdHJpbmcobWVzc2FnZS5qc29uRmF2b3JpdGVzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5qc29uRmVhdHVyZWQgIT09IFwiXCIpIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMjYpLnN0cmluZyhtZXNzYWdlLmpzb25GZWF0dXJlZCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9LFxuICAgIGRlY29kZShpbnB1dCwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IGlucHV0IGluc3RhbmNlb2YgbWluaW1hbF8xLlJlYWRlciA/IGlucHV0IDogbmV3IG1pbmltYWxfMS5SZWFkZXIoaW5wdXQpO1xuICAgICAgICBsZXQgZW5kID0gbGVuZ3RoID09PSB1bmRlZmluZWQgPyByZWFkZXIubGVuIDogcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDTXNnR0NDU3RyaWtlMTVWMkdldEV2ZW50RmF2b3JpdGVzUmVzcG9uc2UoKTtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhZyA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgIHN3aXRjaCAodGFnID4+PiAzKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmFsbEV2ZW50cyA9IHJlYWRlci5ib29sKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5qc29uRmF2b3JpdGVzID0gcmVhZGVyLnN0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuanNvbkZlYXR1cmVkID0gcmVhZGVyLnN0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICByZWFkZXIuc2tpcFR5cGUodGFnICYgNyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH0sXG4gICAgZnJvbVBhcnRpYWwob2JqZWN0KSB7XG4gICAgICAgIHZhciBfYSwgX2IsIF9jO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNNc2dHQ0NTdHJpa2UxNVYyR2V0RXZlbnRGYXZvcml0ZXNSZXNwb25zZSgpO1xuICAgICAgICBtZXNzYWdlLmFsbEV2ZW50cyA9IChfYSA9IG9iamVjdC5hbGxFdmVudHMpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IGZhbHNlO1xuICAgICAgICBtZXNzYWdlLmpzb25GYXZvcml0ZXMgPSAoX2IgPSBvYmplY3QuanNvbkZhdm9yaXRlcykgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogXCJcIjtcbiAgICAgICAgbWVzc2FnZS5qc29uRmVhdHVyZWQgPSAoX2MgPSBvYmplY3QuanNvbkZlYXR1cmVkKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiBcIlwiO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG59O1xuZnVuY3Rpb24gY3JlYXRlQmFzZUNNc2dHQ0NTdHJpa2UxNVYyQ2xpZW50UGVyZlJlcG9ydCgpIHtcbiAgICByZXR1cm4geyBlbnRyaWVzOiBbXSB9O1xufVxuZXhwb3J0cy5DTXNnR0NDU3RyaWtlMTVWMkNsaWVudFBlcmZSZXBvcnQgPSB7XG4gICAgZW5jb2RlKG1lc3NhZ2UsIHdyaXRlciA9IG1pbmltYWxfMS5Xcml0ZXIuY3JlYXRlKCkpIHtcbiAgICAgICAgZm9yIChjb25zdCB2IG9mIG1lc3NhZ2UuZW50cmllcykge1xuICAgICAgICAgICAgZXhwb3J0cy5DTXNnR0NDU3RyaWtlMTVWMkNsaWVudFBlcmZSZXBvcnRfRW50cnkuZW5jb2RlKHYsIHdyaXRlci51aW50MzIoMTApLmZvcmsoKSkubGRlbGltKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9LFxuICAgIGRlY29kZShpbnB1dCwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IGlucHV0IGluc3RhbmNlb2YgbWluaW1hbF8xLlJlYWRlciA/IGlucHV0IDogbmV3IG1pbmltYWxfMS5SZWFkZXIoaW5wdXQpO1xuICAgICAgICBsZXQgZW5kID0gbGVuZ3RoID09PSB1bmRlZmluZWQgPyByZWFkZXIubGVuIDogcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDTXNnR0NDU3RyaWtlMTVWMkNsaWVudFBlcmZSZXBvcnQoKTtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhZyA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgIHN3aXRjaCAodGFnID4+PiAzKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmVudHJpZXMucHVzaChleHBvcnRzLkNNc2dHQ0NTdHJpa2UxNVYyQ2xpZW50UGVyZlJlcG9ydF9FbnRyeS5kZWNvZGUocmVhZGVyLCByZWFkZXIudWludDMyKCkpKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmVhZGVyLnNraXBUeXBlKHRhZyAmIDcpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9LFxuICAgIGZyb21QYXJ0aWFsKG9iamVjdCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ01zZ0dDQ1N0cmlrZTE1VjJDbGllbnRQZXJmUmVwb3J0KCk7XG4gICAgICAgIG1lc3NhZ2UuZW50cmllcyA9XG4gICAgICAgICAgICAoKF9hID0gb2JqZWN0LmVudHJpZXMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5tYXAoZSA9PiBleHBvcnRzLkNNc2dHQ0NTdHJpa2UxNVYyQ2xpZW50UGVyZlJlcG9ydF9FbnRyeS5mcm9tUGFydGlhbChlKSkpIHx8IFtdO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG59O1xuZnVuY3Rpb24gY3JlYXRlQmFzZUNNc2dHQ0NTdHJpa2UxNVYyQ2xpZW50UGVyZlJlcG9ydF9FbnRyeSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBwZXJmY291bnRlcjogMCxcbiAgICAgICAgbGVuZ3RoOiAwLFxuICAgICAgICByZWZlcmVuY2U6IG5ldyBVaW50OEFycmF5KCksXG4gICAgICAgIGFjdHVhbDogbmV3IFVpbnQ4QXJyYXkoKSxcbiAgICAgICAgc291cmNlaWQ6IDAsXG4gICAgICAgIHN0YXR1czogMFxuICAgIH07XG59XG5leHBvcnRzLkNNc2dHQ0NTdHJpa2UxNVYyQ2xpZW50UGVyZlJlcG9ydF9FbnRyeSA9IHtcbiAgICBlbmNvZGUobWVzc2FnZSwgd3JpdGVyID0gbWluaW1hbF8xLldyaXRlci5jcmVhdGUoKSkge1xuICAgICAgICBpZiAobWVzc2FnZS5wZXJmY291bnRlciAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig4KS51aW50MzIobWVzc2FnZS5wZXJmY291bnRlcik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDE2KS51aW50MzIobWVzc2FnZS5sZW5ndGgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLnJlZmVyZW5jZS5sZW5ndGggIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMjYpLmJ5dGVzKG1lc3NhZ2UucmVmZXJlbmNlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5hY3R1YWwubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDM0KS5ieXRlcyhtZXNzYWdlLmFjdHVhbCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2Uuc291cmNlaWQgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoNDApLnVpbnQzMihtZXNzYWdlLnNvdXJjZWlkKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5zdGF0dXMgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoNDgpLnVpbnQzMihtZXNzYWdlLnN0YXR1cyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9LFxuICAgIGRlY29kZShpbnB1dCwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IGlucHV0IGluc3RhbmNlb2YgbWluaW1hbF8xLlJlYWRlciA/IGlucHV0IDogbmV3IG1pbmltYWxfMS5SZWFkZXIoaW5wdXQpO1xuICAgICAgICBsZXQgZW5kID0gbGVuZ3RoID09PSB1bmRlZmluZWQgPyByZWFkZXIubGVuIDogcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDTXNnR0NDU3RyaWtlMTVWMkNsaWVudFBlcmZSZXBvcnRfRW50cnkoKTtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhZyA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgIHN3aXRjaCAodGFnID4+PiAzKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnBlcmZjb3VudGVyID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UubGVuZ3RoID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UucmVmZXJlbmNlID0gcmVhZGVyLmJ5dGVzKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5hY3R1YWwgPSByZWFkZXIuYnl0ZXMoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnNvdXJjZWlkID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Uuc3RhdHVzID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICByZWFkZXIuc2tpcFR5cGUodGFnICYgNyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH0sXG4gICAgZnJvbVBhcnRpYWwob2JqZWN0KSB7XG4gICAgICAgIHZhciBfYSwgX2IsIF9jLCBfZCwgX2UsIF9mO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNNc2dHQ0NTdHJpa2UxNVYyQ2xpZW50UGVyZlJlcG9ydF9FbnRyeSgpO1xuICAgICAgICBtZXNzYWdlLnBlcmZjb3VudGVyID0gKF9hID0gb2JqZWN0LnBlcmZjb3VudGVyKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAwO1xuICAgICAgICBtZXNzYWdlLmxlbmd0aCA9IChfYiA9IG9iamVjdC5sZW5ndGgpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IDA7XG4gICAgICAgIG1lc3NhZ2UucmVmZXJlbmNlID0gKF9jID0gb2JqZWN0LnJlZmVyZW5jZSkgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogbmV3IFVpbnQ4QXJyYXkoKTtcbiAgICAgICAgbWVzc2FnZS5hY3R1YWwgPSAoX2QgPSBvYmplY3QuYWN0dWFsKSAhPT0gbnVsbCAmJiBfZCAhPT0gdm9pZCAwID8gX2QgOiBuZXcgVWludDhBcnJheSgpO1xuICAgICAgICBtZXNzYWdlLnNvdXJjZWlkID0gKF9lID0gb2JqZWN0LnNvdXJjZWlkKSAhPT0gbnVsbCAmJiBfZSAhPT0gdm9pZCAwID8gX2UgOiAwO1xuICAgICAgICBtZXNzYWdlLnN0YXR1cyA9IChfZiA9IG9iamVjdC5zdGF0dXMpICE9PSBudWxsICYmIF9mICE9PSB2b2lkIDAgPyBfZiA6IDA7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbn07XG5mdW5jdGlvbiBjcmVhdGVCYXNlQ1ZEaWFnbm9zdGljKCkge1xuICAgIHJldHVybiB7IGlkOiAwLCBleHRlbmRlZDogMCwgdmFsdWU6IExvbmcuVVpFUk8sIHN0cmluZ1ZhbHVlOiBcIlwiIH07XG59XG5leHBvcnRzLkNWRGlhZ25vc3RpYyA9IHtcbiAgICBlbmNvZGUobWVzc2FnZSwgd3JpdGVyID0gbWluaW1hbF8xLldyaXRlci5jcmVhdGUoKSkge1xuICAgICAgICBpZiAobWVzc2FnZS5pZCAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig4KS51aW50MzIobWVzc2FnZS5pZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UuZXh0ZW5kZWQgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMTYpLnVpbnQzMihtZXNzYWdlLmV4dGVuZGVkKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIW1lc3NhZ2UudmFsdWUuaXNaZXJvKCkpIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMjQpLnVpbnQ2NChtZXNzYWdlLnZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5zdHJpbmdWYWx1ZSAhPT0gXCJcIikge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigzNCkuc3RyaW5nKG1lc3NhZ2Uuc3RyaW5nVmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfSxcbiAgICBkZWNvZGUoaW5wdXQsIGxlbmd0aCkge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBpbnB1dCBpbnN0YW5jZW9mIG1pbmltYWxfMS5SZWFkZXIgPyBpbnB1dCA6IG5ldyBtaW5pbWFsXzEuUmVhZGVyKGlucHV0KTtcbiAgICAgICAgbGV0IGVuZCA9IGxlbmd0aCA9PT0gdW5kZWZpbmVkID8gcmVhZGVyLmxlbiA6IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ1ZEaWFnbm9zdGljKCk7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBjb25zdCB0YWcgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKHRhZyA+Pj4gMykge1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5pZCA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmV4dGVuZGVkID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudmFsdWUgPSByZWFkZXIudWludDY0KCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5zdHJpbmdWYWx1ZSA9IHJlYWRlci5zdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmVhZGVyLnNraXBUeXBlKHRhZyAmIDcpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9LFxuICAgIGZyb21QYXJ0aWFsKG9iamVjdCkge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYztcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDVkRpYWdub3N0aWMoKTtcbiAgICAgICAgbWVzc2FnZS5pZCA9IChfYSA9IG9iamVjdC5pZCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMDtcbiAgICAgICAgbWVzc2FnZS5leHRlbmRlZCA9IChfYiA9IG9iamVjdC5leHRlbmRlZCkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogMDtcbiAgICAgICAgbWVzc2FnZS52YWx1ZSA9XG4gICAgICAgICAgICBvYmplY3QudmFsdWUgIT09IHVuZGVmaW5lZCAmJiBvYmplY3QudmFsdWUgIT09IG51bGxcbiAgICAgICAgICAgICAgICA/IExvbmcuZnJvbVZhbHVlKG9iamVjdC52YWx1ZSlcbiAgICAgICAgICAgICAgICA6IExvbmcuVVpFUk87XG4gICAgICAgIG1lc3NhZ2Uuc3RyaW5nVmFsdWUgPSAoX2MgPSBvYmplY3Quc3RyaW5nVmFsdWUpICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IFwiXCI7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbn07XG5mdW5jdGlvbiBjcmVhdGVCYXNlQ01zZ0dDQ1N0cmlrZTE1VjJDbGllbnRSZXBvcnRWYWxpZGF0aW9uKCkge1xuICAgIHJldHVybiB7XG4gICAgICAgIGZpbGVSZXBvcnQ6IFwiXCIsXG4gICAgICAgIGNvbW1hbmRMaW5lOiBcIlwiLFxuICAgICAgICB0b3RhbEZpbGVzOiAwLFxuICAgICAgICBpbnRlcm5hbEVycm9yOiAwLFxuICAgICAgICB0cnVzdFRpbWU6IDAsXG4gICAgICAgIGNvdW50UGVuZGluZzogMCxcbiAgICAgICAgY291bnRDb21wbGV0ZWQ6IDAsXG4gICAgICAgIHByb2Nlc3NJZDogMCxcbiAgICAgICAgb3N2ZXJzaW9uOiAwLFxuICAgICAgICBjbGllbnRyZXBvcnR2ZXJzaW9uOiAwLFxuICAgICAgICBzdGF0dXNJZDogMCxcbiAgICAgICAgZGlhZ25vc3RpYzE6IDAsXG4gICAgICAgIGRpYWdub3N0aWMyOiBMb25nLlVaRVJPLFxuICAgICAgICBkaWFnbm9zdGljMzogTG9uZy5VWkVSTyxcbiAgICAgICAgbGFzdExhdW5jaERhdGE6IFwiXCIsXG4gICAgICAgIHJlcG9ydENvdW50OiAwLFxuICAgICAgICBjbGllbnRUaW1lOiBMb25nLlVaRVJPLFxuICAgICAgICBkaWFnbm9zdGljNDogTG9uZy5VWkVSTyxcbiAgICAgICAgZGlhZ25vc3RpYzU6IExvbmcuVVpFUk8sXG4gICAgICAgIGRpYWdub3N0aWNzOiBbXVxuICAgIH07XG59XG5leHBvcnRzLkNNc2dHQ0NTdHJpa2UxNVYyQ2xpZW50UmVwb3J0VmFsaWRhdGlvbiA9IHtcbiAgICBlbmNvZGUobWVzc2FnZSwgd3JpdGVyID0gbWluaW1hbF8xLldyaXRlci5jcmVhdGUoKSkge1xuICAgICAgICBpZiAobWVzc2FnZS5maWxlUmVwb3J0ICE9PSBcIlwiKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDEwKS5zdHJpbmcobWVzc2FnZS5maWxlUmVwb3J0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5jb21tYW5kTGluZSAhPT0gXCJcIikge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigxOCkuc3RyaW5nKG1lc3NhZ2UuY29tbWFuZExpbmUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLnRvdGFsRmlsZXMgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMjQpLnVpbnQzMihtZXNzYWdlLnRvdGFsRmlsZXMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLmludGVybmFsRXJyb3IgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMzIpLnVpbnQzMihtZXNzYWdlLmludGVybmFsRXJyb3IpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLnRydXN0VGltZSAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig0MCkudWludDMyKG1lc3NhZ2UudHJ1c3RUaW1lKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5jb3VudFBlbmRpbmcgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoNDgpLnVpbnQzMihtZXNzYWdlLmNvdW50UGVuZGluZyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UuY291bnRDb21wbGV0ZWQgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoNTYpLnVpbnQzMihtZXNzYWdlLmNvdW50Q29tcGxldGVkKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5wcm9jZXNzSWQgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoNjQpLnVpbnQzMihtZXNzYWdlLnByb2Nlc3NJZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2Uub3N2ZXJzaW9uICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDcyKS5pbnQzMihtZXNzYWdlLm9zdmVyc2lvbik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UuY2xpZW50cmVwb3J0dmVyc2lvbiAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig4MCkudWludDMyKG1lc3NhZ2UuY2xpZW50cmVwb3J0dmVyc2lvbik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2Uuc3RhdHVzSWQgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoODgpLnVpbnQzMihtZXNzYWdlLnN0YXR1c0lkKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5kaWFnbm9zdGljMSAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig5NikudWludDMyKG1lc3NhZ2UuZGlhZ25vc3RpYzEpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghbWVzc2FnZS5kaWFnbm9zdGljMi5pc1plcm8oKSkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigxMDQpLnVpbnQ2NChtZXNzYWdlLmRpYWdub3N0aWMyKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIW1lc3NhZ2UuZGlhZ25vc3RpYzMuaXNaZXJvKCkpIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMTEyKS51aW50NjQobWVzc2FnZS5kaWFnbm9zdGljMyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UubGFzdExhdW5jaERhdGEgIT09IFwiXCIpIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMTIyKS5zdHJpbmcobWVzc2FnZS5sYXN0TGF1bmNoRGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UucmVwb3J0Q291bnQgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMTI4KS51aW50MzIobWVzc2FnZS5yZXBvcnRDb3VudCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFtZXNzYWdlLmNsaWVudFRpbWUuaXNaZXJvKCkpIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMTM2KS51aW50NjQobWVzc2FnZS5jbGllbnRUaW1lKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIW1lc3NhZ2UuZGlhZ25vc3RpYzQuaXNaZXJvKCkpIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMTQ0KS51aW50NjQobWVzc2FnZS5kaWFnbm9zdGljNCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFtZXNzYWdlLmRpYWdub3N0aWM1LmlzWmVybygpKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDE1MikudWludDY0KG1lc3NhZ2UuZGlhZ25vc3RpYzUpO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3QgdiBvZiBtZXNzYWdlLmRpYWdub3N0aWNzKSB7XG4gICAgICAgICAgICBleHBvcnRzLkNWRGlhZ25vc3RpYy5lbmNvZGUodiwgd3JpdGVyLnVpbnQzMigxNjIpLmZvcmsoKSkubGRlbGltKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9LFxuICAgIGRlY29kZShpbnB1dCwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IGlucHV0IGluc3RhbmNlb2YgbWluaW1hbF8xLlJlYWRlciA/IGlucHV0IDogbmV3IG1pbmltYWxfMS5SZWFkZXIoaW5wdXQpO1xuICAgICAgICBsZXQgZW5kID0gbGVuZ3RoID09PSB1bmRlZmluZWQgPyByZWFkZXIubGVuIDogcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDTXNnR0NDU3RyaWtlMTVWMkNsaWVudFJlcG9ydFZhbGlkYXRpb24oKTtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhZyA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgIHN3aXRjaCAodGFnID4+PiAzKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmZpbGVSZXBvcnQgPSByZWFkZXIuc3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5jb21tYW5kTGluZSA9IHJlYWRlci5zdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnRvdGFsRmlsZXMgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5pbnRlcm5hbEVycm9yID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudHJ1c3RUaW1lID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuY291bnRQZW5kaW5nID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuY291bnRDb21wbGV0ZWQgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgODpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5wcm9jZXNzSWQgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgOTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5vc3ZlcnNpb24gPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAxMDpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5jbGllbnRyZXBvcnR2ZXJzaW9uID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDExOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnN0YXR1c0lkID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDEyOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmRpYWdub3N0aWMxID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDEzOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmRpYWdub3N0aWMyID0gcmVhZGVyLnVpbnQ2NCgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDE0OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmRpYWdub3N0aWMzID0gcmVhZGVyLnVpbnQ2NCgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDE1OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmxhc3RMYXVuY2hEYXRhID0gcmVhZGVyLnN0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDE2OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnJlcG9ydENvdW50ID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDE3OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmNsaWVudFRpbWUgPSByZWFkZXIudWludDY0KCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMTg6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZGlhZ25vc3RpYzQgPSByZWFkZXIudWludDY0KCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMTk6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZGlhZ25vc3RpYzUgPSByZWFkZXIudWludDY0KCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMjA6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZGlhZ25vc3RpY3MucHVzaChleHBvcnRzLkNWRGlhZ25vc3RpYy5kZWNvZGUocmVhZGVyLCByZWFkZXIudWludDMyKCkpKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmVhZGVyLnNraXBUeXBlKHRhZyAmIDcpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9LFxuICAgIGZyb21QYXJ0aWFsKG9iamVjdCkge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYywgX2QsIF9lLCBfZiwgX2csIF9oLCBfaiwgX2ssIF9sLCBfbSwgX28sIF9wLCBfcTtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDTXNnR0NDU3RyaWtlMTVWMkNsaWVudFJlcG9ydFZhbGlkYXRpb24oKTtcbiAgICAgICAgbWVzc2FnZS5maWxlUmVwb3J0ID0gKF9hID0gb2JqZWN0LmZpbGVSZXBvcnQpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IFwiXCI7XG4gICAgICAgIG1lc3NhZ2UuY29tbWFuZExpbmUgPSAoX2IgPSBvYmplY3QuY29tbWFuZExpbmUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IFwiXCI7XG4gICAgICAgIG1lc3NhZ2UudG90YWxGaWxlcyA9IChfYyA9IG9iamVjdC50b3RhbEZpbGVzKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiAwO1xuICAgICAgICBtZXNzYWdlLmludGVybmFsRXJyb3IgPSAoX2QgPSBvYmplY3QuaW50ZXJuYWxFcnJvcikgIT09IG51bGwgJiYgX2QgIT09IHZvaWQgMCA/IF9kIDogMDtcbiAgICAgICAgbWVzc2FnZS50cnVzdFRpbWUgPSAoX2UgPSBvYmplY3QudHJ1c3RUaW1lKSAhPT0gbnVsbCAmJiBfZSAhPT0gdm9pZCAwID8gX2UgOiAwO1xuICAgICAgICBtZXNzYWdlLmNvdW50UGVuZGluZyA9IChfZiA9IG9iamVjdC5jb3VudFBlbmRpbmcpICE9PSBudWxsICYmIF9mICE9PSB2b2lkIDAgPyBfZiA6IDA7XG4gICAgICAgIG1lc3NhZ2UuY291bnRDb21wbGV0ZWQgPSAoX2cgPSBvYmplY3QuY291bnRDb21wbGV0ZWQpICE9PSBudWxsICYmIF9nICE9PSB2b2lkIDAgPyBfZyA6IDA7XG4gICAgICAgIG1lc3NhZ2UucHJvY2Vzc0lkID0gKF9oID0gb2JqZWN0LnByb2Nlc3NJZCkgIT09IG51bGwgJiYgX2ggIT09IHZvaWQgMCA/IF9oIDogMDtcbiAgICAgICAgbWVzc2FnZS5vc3ZlcnNpb24gPSAoX2ogPSBvYmplY3Qub3N2ZXJzaW9uKSAhPT0gbnVsbCAmJiBfaiAhPT0gdm9pZCAwID8gX2ogOiAwO1xuICAgICAgICBtZXNzYWdlLmNsaWVudHJlcG9ydHZlcnNpb24gPSAoX2sgPSBvYmplY3QuY2xpZW50cmVwb3J0dmVyc2lvbikgIT09IG51bGwgJiYgX2sgIT09IHZvaWQgMCA/IF9rIDogMDtcbiAgICAgICAgbWVzc2FnZS5zdGF0dXNJZCA9IChfbCA9IG9iamVjdC5zdGF0dXNJZCkgIT09IG51bGwgJiYgX2wgIT09IHZvaWQgMCA/IF9sIDogMDtcbiAgICAgICAgbWVzc2FnZS5kaWFnbm9zdGljMSA9IChfbSA9IG9iamVjdC5kaWFnbm9zdGljMSkgIT09IG51bGwgJiYgX20gIT09IHZvaWQgMCA/IF9tIDogMDtcbiAgICAgICAgbWVzc2FnZS5kaWFnbm9zdGljMiA9XG4gICAgICAgICAgICBvYmplY3QuZGlhZ25vc3RpYzIgIT09IHVuZGVmaW5lZCAmJiBvYmplY3QuZGlhZ25vc3RpYzIgIT09IG51bGxcbiAgICAgICAgICAgICAgICA/IExvbmcuZnJvbVZhbHVlKG9iamVjdC5kaWFnbm9zdGljMilcbiAgICAgICAgICAgICAgICA6IExvbmcuVVpFUk87XG4gICAgICAgIG1lc3NhZ2UuZGlhZ25vc3RpYzMgPVxuICAgICAgICAgICAgb2JqZWN0LmRpYWdub3N0aWMzICE9PSB1bmRlZmluZWQgJiYgb2JqZWN0LmRpYWdub3N0aWMzICE9PSBudWxsXG4gICAgICAgICAgICAgICAgPyBMb25nLmZyb21WYWx1ZShvYmplY3QuZGlhZ25vc3RpYzMpXG4gICAgICAgICAgICAgICAgOiBMb25nLlVaRVJPO1xuICAgICAgICBtZXNzYWdlLmxhc3RMYXVuY2hEYXRhID0gKF9vID0gb2JqZWN0Lmxhc3RMYXVuY2hEYXRhKSAhPT0gbnVsbCAmJiBfbyAhPT0gdm9pZCAwID8gX28gOiBcIlwiO1xuICAgICAgICBtZXNzYWdlLnJlcG9ydENvdW50ID0gKF9wID0gb2JqZWN0LnJlcG9ydENvdW50KSAhPT0gbnVsbCAmJiBfcCAhPT0gdm9pZCAwID8gX3AgOiAwO1xuICAgICAgICBtZXNzYWdlLmNsaWVudFRpbWUgPVxuICAgICAgICAgICAgb2JqZWN0LmNsaWVudFRpbWUgIT09IHVuZGVmaW5lZCAmJiBvYmplY3QuY2xpZW50VGltZSAhPT0gbnVsbFxuICAgICAgICAgICAgICAgID8gTG9uZy5mcm9tVmFsdWUob2JqZWN0LmNsaWVudFRpbWUpXG4gICAgICAgICAgICAgICAgOiBMb25nLlVaRVJPO1xuICAgICAgICBtZXNzYWdlLmRpYWdub3N0aWM0ID1cbiAgICAgICAgICAgIG9iamVjdC5kaWFnbm9zdGljNCAhPT0gdW5kZWZpbmVkICYmIG9iamVjdC5kaWFnbm9zdGljNCAhPT0gbnVsbFxuICAgICAgICAgICAgICAgID8gTG9uZy5mcm9tVmFsdWUob2JqZWN0LmRpYWdub3N0aWM0KVxuICAgICAgICAgICAgICAgIDogTG9uZy5VWkVSTztcbiAgICAgICAgbWVzc2FnZS5kaWFnbm9zdGljNSA9XG4gICAgICAgICAgICBvYmplY3QuZGlhZ25vc3RpYzUgIT09IHVuZGVmaW5lZCAmJiBvYmplY3QuZGlhZ25vc3RpYzUgIT09IG51bGxcbiAgICAgICAgICAgICAgICA/IExvbmcuZnJvbVZhbHVlKG9iamVjdC5kaWFnbm9zdGljNSlcbiAgICAgICAgICAgICAgICA6IExvbmcuVVpFUk87XG4gICAgICAgIG1lc3NhZ2UuZGlhZ25vc3RpY3MgPVxuICAgICAgICAgICAgKChfcSA9IG9iamVjdC5kaWFnbm9zdGljcykgPT09IG51bGwgfHwgX3EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9xLm1hcChlID0+IGV4cG9ydHMuQ1ZEaWFnbm9zdGljLmZyb21QYXJ0aWFsKGUpKSkgfHwgW107XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbn07XG5mdW5jdGlvbiBjcmVhdGVCYXNlQ01zZ0dDQ1N0cmlrZTE1VjJHQzJDbGllbnRSZWZ1c2VTZWN1cmVNb2RlKCkge1xuICAgIHJldHVybiB7XG4gICAgICAgIGZpbGVSZXBvcnQ6IFwiXCIsXG4gICAgICAgIG9mZmVySW5zZWN1cmVNb2RlOiBmYWxzZSxcbiAgICAgICAgb2ZmZXJTZWN1cmVNb2RlOiBmYWxzZSxcbiAgICAgICAgc2hvd1Vuc2lnbmVkVWk6IGZhbHNlLFxuICAgICAgICBraWNrVXNlcjogZmFsc2UsXG4gICAgICAgIHNob3dUcnVzdGVkVWk6IGZhbHNlLFxuICAgICAgICBzaG93V2FybmluZ05vdFRydXN0ZWQ6IGZhbHNlLFxuICAgICAgICBzaG93V2FybmluZ05vdFRydXN0ZWQyOiBmYWxzZSxcbiAgICAgICAgZmlsZXNQcmV2ZW50ZWRUcnVzdGVkOiBcIlwiXG4gICAgfTtcbn1cbmV4cG9ydHMuQ01zZ0dDQ1N0cmlrZTE1VjJHQzJDbGllbnRSZWZ1c2VTZWN1cmVNb2RlID0ge1xuICAgIGVuY29kZShtZXNzYWdlLCB3cml0ZXIgPSBtaW5pbWFsXzEuV3JpdGVyLmNyZWF0ZSgpKSB7XG4gICAgICAgIGlmIChtZXNzYWdlLmZpbGVSZXBvcnQgIT09IFwiXCIpIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMTApLnN0cmluZyhtZXNzYWdlLmZpbGVSZXBvcnQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLm9mZmVySW5zZWN1cmVNb2RlID09PSB0cnVlKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDE2KS5ib29sKG1lc3NhZ2Uub2ZmZXJJbnNlY3VyZU1vZGUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLm9mZmVyU2VjdXJlTW9kZSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigyNCkuYm9vbChtZXNzYWdlLm9mZmVyU2VjdXJlTW9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2Uuc2hvd1Vuc2lnbmVkVWkgPT09IHRydWUpIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMzIpLmJvb2wobWVzc2FnZS5zaG93VW5zaWduZWRVaSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2Uua2lja1VzZXIgPT09IHRydWUpIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoNDApLmJvb2wobWVzc2FnZS5raWNrVXNlcik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2Uuc2hvd1RydXN0ZWRVaSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig0OCkuYm9vbChtZXNzYWdlLnNob3dUcnVzdGVkVWkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLnNob3dXYXJuaW5nTm90VHJ1c3RlZCA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig1NikuYm9vbChtZXNzYWdlLnNob3dXYXJuaW5nTm90VHJ1c3RlZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2Uuc2hvd1dhcm5pbmdOb3RUcnVzdGVkMiA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig2NCkuYm9vbChtZXNzYWdlLnNob3dXYXJuaW5nTm90VHJ1c3RlZDIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLmZpbGVzUHJldmVudGVkVHJ1c3RlZCAhPT0gXCJcIikge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig3NCkuc3RyaW5nKG1lc3NhZ2UuZmlsZXNQcmV2ZW50ZWRUcnVzdGVkKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH0sXG4gICAgZGVjb2RlKGlucHV0LCBsZW5ndGgpIHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gaW5wdXQgaW5zdGFuY2VvZiBtaW5pbWFsXzEuUmVhZGVyID8gaW5wdXQgOiBuZXcgbWluaW1hbF8xLlJlYWRlcihpbnB1dCk7XG4gICAgICAgIGxldCBlbmQgPSBsZW5ndGggPT09IHVuZGVmaW5lZCA/IHJlYWRlci5sZW4gOiByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNNc2dHQ0NTdHJpa2UxNVYyR0MyQ2xpZW50UmVmdXNlU2VjdXJlTW9kZSgpO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZmlsZVJlcG9ydCA9IHJlYWRlci5zdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLm9mZmVySW5zZWN1cmVNb2RlID0gcmVhZGVyLmJvb2woKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLm9mZmVyU2VjdXJlTW9kZSA9IHJlYWRlci5ib29sKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5zaG93VW5zaWduZWRVaSA9IHJlYWRlci5ib29sKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5raWNrVXNlciA9IHJlYWRlci5ib29sKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5zaG93VHJ1c3RlZFVpID0gcmVhZGVyLmJvb2woKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA3OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnNob3dXYXJuaW5nTm90VHJ1c3RlZCA9IHJlYWRlci5ib29sKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgODpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5zaG93V2FybmluZ05vdFRydXN0ZWQyID0gcmVhZGVyLmJvb2woKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA5OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmZpbGVzUHJldmVudGVkVHJ1c3RlZCA9IHJlYWRlci5zdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmVhZGVyLnNraXBUeXBlKHRhZyAmIDcpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9LFxuICAgIGZyb21QYXJ0aWFsKG9iamVjdCkge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYywgX2QsIF9lLCBfZiwgX2csIF9oLCBfajtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDTXNnR0NDU3RyaWtlMTVWMkdDMkNsaWVudFJlZnVzZVNlY3VyZU1vZGUoKTtcbiAgICAgICAgbWVzc2FnZS5maWxlUmVwb3J0ID0gKF9hID0gb2JqZWN0LmZpbGVSZXBvcnQpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IFwiXCI7XG4gICAgICAgIG1lc3NhZ2Uub2ZmZXJJbnNlY3VyZU1vZGUgPSAoX2IgPSBvYmplY3Qub2ZmZXJJbnNlY3VyZU1vZGUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IGZhbHNlO1xuICAgICAgICBtZXNzYWdlLm9mZmVyU2VjdXJlTW9kZSA9IChfYyA9IG9iamVjdC5vZmZlclNlY3VyZU1vZGUpICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IGZhbHNlO1xuICAgICAgICBtZXNzYWdlLnNob3dVbnNpZ25lZFVpID0gKF9kID0gb2JqZWN0LnNob3dVbnNpZ25lZFVpKSAhPT0gbnVsbCAmJiBfZCAhPT0gdm9pZCAwID8gX2QgOiBmYWxzZTtcbiAgICAgICAgbWVzc2FnZS5raWNrVXNlciA9IChfZSA9IG9iamVjdC5raWNrVXNlcikgIT09IG51bGwgJiYgX2UgIT09IHZvaWQgMCA/IF9lIDogZmFsc2U7XG4gICAgICAgIG1lc3NhZ2Uuc2hvd1RydXN0ZWRVaSA9IChfZiA9IG9iamVjdC5zaG93VHJ1c3RlZFVpKSAhPT0gbnVsbCAmJiBfZiAhPT0gdm9pZCAwID8gX2YgOiBmYWxzZTtcbiAgICAgICAgbWVzc2FnZS5zaG93V2FybmluZ05vdFRydXN0ZWQgPSAoX2cgPSBvYmplY3Quc2hvd1dhcm5pbmdOb3RUcnVzdGVkKSAhPT0gbnVsbCAmJiBfZyAhPT0gdm9pZCAwID8gX2cgOiBmYWxzZTtcbiAgICAgICAgbWVzc2FnZS5zaG93V2FybmluZ05vdFRydXN0ZWQyID0gKF9oID0gb2JqZWN0LnNob3dXYXJuaW5nTm90VHJ1c3RlZDIpICE9PSBudWxsICYmIF9oICE9PSB2b2lkIDAgPyBfaCA6IGZhbHNlO1xuICAgICAgICBtZXNzYWdlLmZpbGVzUHJldmVudGVkVHJ1c3RlZCA9IChfaiA9IG9iamVjdC5maWxlc1ByZXZlbnRlZFRydXN0ZWQpICE9PSBudWxsICYmIF9qICE9PSB2b2lkIDAgPyBfaiA6IFwiXCI7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbn07XG5mdW5jdGlvbiBjcmVhdGVCYXNlQ01zZ0dDQ1N0cmlrZTE1VjJHQzJDbGllbnRSZXF1ZXN0VmFsaWRhdGlvbigpIHtcbiAgICByZXR1cm4geyBmdWxsUmVwb3J0OiBmYWxzZSwgbW9kdWxlOiBcIlwiIH07XG59XG5leHBvcnRzLkNNc2dHQ0NTdHJpa2UxNVYyR0MyQ2xpZW50UmVxdWVzdFZhbGlkYXRpb24gPSB7XG4gICAgZW5jb2RlKG1lc3NhZ2UsIHdyaXRlciA9IG1pbmltYWxfMS5Xcml0ZXIuY3JlYXRlKCkpIHtcbiAgICAgICAgaWYgKG1lc3NhZ2UuZnVsbFJlcG9ydCA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig4KS5ib29sKG1lc3NhZ2UuZnVsbFJlcG9ydCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UubW9kdWxlICE9PSBcIlwiKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDE4KS5zdHJpbmcobWVzc2FnZS5tb2R1bGUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfSxcbiAgICBkZWNvZGUoaW5wdXQsIGxlbmd0aCkge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBpbnB1dCBpbnN0YW5jZW9mIG1pbmltYWxfMS5SZWFkZXIgPyBpbnB1dCA6IG5ldyBtaW5pbWFsXzEuUmVhZGVyKGlucHV0KTtcbiAgICAgICAgbGV0IGVuZCA9IGxlbmd0aCA9PT0gdW5kZWZpbmVkID8gcmVhZGVyLmxlbiA6IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ01zZ0dDQ1N0cmlrZTE1VjJHQzJDbGllbnRSZXF1ZXN0VmFsaWRhdGlvbigpO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZnVsbFJlcG9ydCA9IHJlYWRlci5ib29sKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5tb2R1bGUgPSByZWFkZXIuc3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJlYWRlci5za2lwVHlwZSh0YWcgJiA3KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfSxcbiAgICBmcm9tUGFydGlhbChvYmplY3QpIHtcbiAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDTXNnR0NDU3RyaWtlMTVWMkdDMkNsaWVudFJlcXVlc3RWYWxpZGF0aW9uKCk7XG4gICAgICAgIG1lc3NhZ2UuZnVsbFJlcG9ydCA9IChfYSA9IG9iamVjdC5mdWxsUmVwb3J0KSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBmYWxzZTtcbiAgICAgICAgbWVzc2FnZS5tb2R1bGUgPSAoX2IgPSBvYmplY3QubW9kdWxlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBcIlwiO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG59O1xuZnVuY3Rpb24gY3JlYXRlQmFzZUNNc2dHQ0NTdHJpa2UxNVYyR0MyQ2xpZW50SW5pdFN5c3RlbSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBsb2FkOiBmYWxzZSxcbiAgICAgICAgbmFtZTogXCJcIixcbiAgICAgICAgb3V0cHV0bmFtZTogXCJcIixcbiAgICAgICAga2V5RGF0YTogbmV3IFVpbnQ4QXJyYXkoKSxcbiAgICAgICAgc2hhSGFzaDogbmV3IFVpbnQ4QXJyYXkoKSxcbiAgICAgICAgY29va2llOiAwLFxuICAgICAgICBtYW5pZmVzdDogXCJcIixcbiAgICAgICAgc3lzdGVtUGFja2FnZTogbmV3IFVpbnQ4QXJyYXkoKSxcbiAgICAgICAgbG9hZFN5c3RlbTogZmFsc2VcbiAgICB9O1xufVxuZXhwb3J0cy5DTXNnR0NDU3RyaWtlMTVWMkdDMkNsaWVudEluaXRTeXN0ZW0gPSB7XG4gICAgZW5jb2RlKG1lc3NhZ2UsIHdyaXRlciA9IG1pbmltYWxfMS5Xcml0ZXIuY3JlYXRlKCkpIHtcbiAgICAgICAgaWYgKG1lc3NhZ2UubG9hZCA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig4KS5ib29sKG1lc3NhZ2UubG9hZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UubmFtZSAhPT0gXCJcIikge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigxOCkuc3RyaW5nKG1lc3NhZ2UubmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2Uub3V0cHV0bmFtZSAhPT0gXCJcIikge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigyNikuc3RyaW5nKG1lc3NhZ2Uub3V0cHV0bmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2Uua2V5RGF0YS5sZW5ndGggIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMzQpLmJ5dGVzKG1lc3NhZ2Uua2V5RGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2Uuc2hhSGFzaC5sZW5ndGggIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoNDIpLmJ5dGVzKG1lc3NhZ2Uuc2hhSGFzaCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UuY29va2llICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDQ4KS5pbnQzMihtZXNzYWdlLmNvb2tpZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UubWFuaWZlc3QgIT09IFwiXCIpIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoNTgpLnN0cmluZyhtZXNzYWdlLm1hbmlmZXN0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5zeXN0ZW1QYWNrYWdlLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig2NikuYnl0ZXMobWVzc2FnZS5zeXN0ZW1QYWNrYWdlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5sb2FkU3lzdGVtID09PSB0cnVlKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDcyKS5ib29sKG1lc3NhZ2UubG9hZFN5c3RlbSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9LFxuICAgIGRlY29kZShpbnB1dCwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IGlucHV0IGluc3RhbmNlb2YgbWluaW1hbF8xLlJlYWRlciA/IGlucHV0IDogbmV3IG1pbmltYWxfMS5SZWFkZXIoaW5wdXQpO1xuICAgICAgICBsZXQgZW5kID0gbGVuZ3RoID09PSB1bmRlZmluZWQgPyByZWFkZXIubGVuIDogcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDTXNnR0NDU3RyaWtlMTVWMkdDMkNsaWVudEluaXRTeXN0ZW0oKTtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhZyA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgIHN3aXRjaCAodGFnID4+PiAzKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmxvYWQgPSByZWFkZXIuYm9vbCgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UubmFtZSA9IHJlYWRlci5zdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLm91dHB1dG5hbWUgPSByZWFkZXIuc3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5rZXlEYXRhID0gcmVhZGVyLmJ5dGVzKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5zaGFIYXNoID0gcmVhZGVyLmJ5dGVzKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5jb29raWUgPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA3OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLm1hbmlmZXN0ID0gcmVhZGVyLnN0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDg6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Uuc3lzdGVtUGFja2FnZSA9IHJlYWRlci5ieXRlcygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDk6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UubG9hZFN5c3RlbSA9IHJlYWRlci5ib29sKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJlYWRlci5za2lwVHlwZSh0YWcgJiA3KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfSxcbiAgICBmcm9tUGFydGlhbChvYmplY3QpIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2MsIF9kLCBfZSwgX2YsIF9nLCBfaCwgX2o7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ01zZ0dDQ1N0cmlrZTE1VjJHQzJDbGllbnRJbml0U3lzdGVtKCk7XG4gICAgICAgIG1lc3NhZ2UubG9hZCA9IChfYSA9IG9iamVjdC5sb2FkKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBmYWxzZTtcbiAgICAgICAgbWVzc2FnZS5uYW1lID0gKF9iID0gb2JqZWN0Lm5hbWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IFwiXCI7XG4gICAgICAgIG1lc3NhZ2Uub3V0cHV0bmFtZSA9IChfYyA9IG9iamVjdC5vdXRwdXRuYW1lKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiBcIlwiO1xuICAgICAgICBtZXNzYWdlLmtleURhdGEgPSAoX2QgPSBvYmplY3Qua2V5RGF0YSkgIT09IG51bGwgJiYgX2QgIT09IHZvaWQgMCA/IF9kIDogbmV3IFVpbnQ4QXJyYXkoKTtcbiAgICAgICAgbWVzc2FnZS5zaGFIYXNoID0gKF9lID0gb2JqZWN0LnNoYUhhc2gpICE9PSBudWxsICYmIF9lICE9PSB2b2lkIDAgPyBfZSA6IG5ldyBVaW50OEFycmF5KCk7XG4gICAgICAgIG1lc3NhZ2UuY29va2llID0gKF9mID0gb2JqZWN0LmNvb2tpZSkgIT09IG51bGwgJiYgX2YgIT09IHZvaWQgMCA/IF9mIDogMDtcbiAgICAgICAgbWVzc2FnZS5tYW5pZmVzdCA9IChfZyA9IG9iamVjdC5tYW5pZmVzdCkgIT09IG51bGwgJiYgX2cgIT09IHZvaWQgMCA/IF9nIDogXCJcIjtcbiAgICAgICAgbWVzc2FnZS5zeXN0ZW1QYWNrYWdlID0gKF9oID0gb2JqZWN0LnN5c3RlbVBhY2thZ2UpICE9PSBudWxsICYmIF9oICE9PSB2b2lkIDAgPyBfaCA6IG5ldyBVaW50OEFycmF5KCk7XG4gICAgICAgIG1lc3NhZ2UubG9hZFN5c3RlbSA9IChfaiA9IG9iamVjdC5sb2FkU3lzdGVtKSAhPT0gbnVsbCAmJiBfaiAhPT0gdm9pZCAwID8gX2ogOiBmYWxzZTtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxufTtcbmZ1bmN0aW9uIGNyZWF0ZUJhc2VDTXNnR0NDU3RyaWtlMTVWMkdDMkNsaWVudEluaXRTeXN0ZW1SZXNwb25zZSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgZGlhZ25vc3RpYzogXCJcIixcbiAgICAgICAgc2hhSGFzaDogbmV3IFVpbnQ4QXJyYXkoKSxcbiAgICAgICAgcmVzcG9uc2U6IDAsXG4gICAgICAgIGVycm9yQ29kZTE6IDAsXG4gICAgICAgIGVycm9yQ29kZTI6IDAsXG4gICAgICAgIGhhbmRsZTogTG9uZy5aRVJPLFxuICAgICAgICBlaW5pdFJlc3VsdDogMCxcbiAgICAgICAgYXV4U3lzdGVtMTogMCxcbiAgICAgICAgYXV4U3lzdGVtMjogMFxuICAgIH07XG59XG5leHBvcnRzLkNNc2dHQ0NTdHJpa2UxNVYyR0MyQ2xpZW50SW5pdFN5c3RlbVJlc3BvbnNlID0ge1xuICAgIGVuY29kZShtZXNzYWdlLCB3cml0ZXIgPSBtaW5pbWFsXzEuV3JpdGVyLmNyZWF0ZSgpKSB7XG4gICAgICAgIGlmIChtZXNzYWdlLnN1Y2Nlc3MgPT09IHRydWUpIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoOCkuYm9vbChtZXNzYWdlLnN1Y2Nlc3MpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLmRpYWdub3N0aWMgIT09IFwiXCIpIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMTgpLnN0cmluZyhtZXNzYWdlLmRpYWdub3N0aWMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLnNoYUhhc2gubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDI2KS5ieXRlcyhtZXNzYWdlLnNoYUhhc2gpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLnJlc3BvbnNlICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDMyKS5pbnQzMihtZXNzYWdlLnJlc3BvbnNlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5lcnJvckNvZGUxICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDQwKS5pbnQzMihtZXNzYWdlLmVycm9yQ29kZTEpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLmVycm9yQ29kZTIgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoNDgpLmludDMyKG1lc3NhZ2UuZXJyb3JDb2RlMik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFtZXNzYWdlLmhhbmRsZS5pc1plcm8oKSkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig1NikuaW50NjQobWVzc2FnZS5oYW5kbGUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLmVpbml0UmVzdWx0ICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDY0KS5pbnQzMihtZXNzYWdlLmVpbml0UmVzdWx0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5hdXhTeXN0ZW0xICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDcyKS5pbnQzMihtZXNzYWdlLmF1eFN5c3RlbTEpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLmF1eFN5c3RlbTIgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoODApLmludDMyKG1lc3NhZ2UuYXV4U3lzdGVtMik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9LFxuICAgIGRlY29kZShpbnB1dCwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IGlucHV0IGluc3RhbmNlb2YgbWluaW1hbF8xLlJlYWRlciA/IGlucHV0IDogbmV3IG1pbmltYWxfMS5SZWFkZXIoaW5wdXQpO1xuICAgICAgICBsZXQgZW5kID0gbGVuZ3RoID09PSB1bmRlZmluZWQgPyByZWFkZXIubGVuIDogcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDTXNnR0NDU3RyaWtlMTVWMkdDMkNsaWVudEluaXRTeXN0ZW1SZXNwb25zZSgpO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Uuc3VjY2VzcyA9IHJlYWRlci5ib29sKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5kaWFnbm9zdGljID0gcmVhZGVyLnN0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Uuc2hhSGFzaCA9IHJlYWRlci5ieXRlcygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UucmVzcG9uc2UgPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmVycm9yQ29kZTEgPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmVycm9yQ29kZTIgPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA3OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmhhbmRsZSA9IHJlYWRlci5pbnQ2NCgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDg6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZWluaXRSZXN1bHQgPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA5OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmF1eFN5c3RlbTEgPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAxMDpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5hdXhTeXN0ZW0yID0gcmVhZGVyLmludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJlYWRlci5za2lwVHlwZSh0YWcgJiA3KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfSxcbiAgICBmcm9tUGFydGlhbChvYmplY3QpIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2MsIF9kLCBfZSwgX2YsIF9nLCBfaCwgX2o7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ01zZ0dDQ1N0cmlrZTE1VjJHQzJDbGllbnRJbml0U3lzdGVtUmVzcG9uc2UoKTtcbiAgICAgICAgbWVzc2FnZS5zdWNjZXNzID0gKF9hID0gb2JqZWN0LnN1Y2Nlc3MpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IGZhbHNlO1xuICAgICAgICBtZXNzYWdlLmRpYWdub3N0aWMgPSAoX2IgPSBvYmplY3QuZGlhZ25vc3RpYykgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogXCJcIjtcbiAgICAgICAgbWVzc2FnZS5zaGFIYXNoID0gKF9jID0gb2JqZWN0LnNoYUhhc2gpICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IG5ldyBVaW50OEFycmF5KCk7XG4gICAgICAgIG1lc3NhZ2UucmVzcG9uc2UgPSAoX2QgPSBvYmplY3QucmVzcG9uc2UpICE9PSBudWxsICYmIF9kICE9PSB2b2lkIDAgPyBfZCA6IDA7XG4gICAgICAgIG1lc3NhZ2UuZXJyb3JDb2RlMSA9IChfZSA9IG9iamVjdC5lcnJvckNvZGUxKSAhPT0gbnVsbCAmJiBfZSAhPT0gdm9pZCAwID8gX2UgOiAwO1xuICAgICAgICBtZXNzYWdlLmVycm9yQ29kZTIgPSAoX2YgPSBvYmplY3QuZXJyb3JDb2RlMikgIT09IG51bGwgJiYgX2YgIT09IHZvaWQgMCA/IF9mIDogMDtcbiAgICAgICAgbWVzc2FnZS5oYW5kbGUgPVxuICAgICAgICAgICAgb2JqZWN0LmhhbmRsZSAhPT0gdW5kZWZpbmVkICYmIG9iamVjdC5oYW5kbGUgIT09IG51bGxcbiAgICAgICAgICAgICAgICA/IExvbmcuZnJvbVZhbHVlKG9iamVjdC5oYW5kbGUpXG4gICAgICAgICAgICAgICAgOiBMb25nLlpFUk87XG4gICAgICAgIG1lc3NhZ2UuZWluaXRSZXN1bHQgPSAoX2cgPSBvYmplY3QuZWluaXRSZXN1bHQpICE9PSBudWxsICYmIF9nICE9PSB2b2lkIDAgPyBfZyA6IDA7XG4gICAgICAgIG1lc3NhZ2UuYXV4U3lzdGVtMSA9IChfaCA9IG9iamVjdC5hdXhTeXN0ZW0xKSAhPT0gbnVsbCAmJiBfaCAhPT0gdm9pZCAwID8gX2ggOiAwO1xuICAgICAgICBtZXNzYWdlLmF1eFN5c3RlbTIgPSAoX2ogPSBvYmplY3QuYXV4U3lzdGVtMikgIT09IG51bGwgJiYgX2ogIT09IHZvaWQgMCA/IF9qIDogMDtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxufTtcbi8vIElmIHlvdSBnZXQgYSBjb21waWxlLWVycm9yIGFib3V0ICdDb25zdHJ1Y3RvcjxMb25nPiBhbmQgLi4uIGhhdmUgbm8gb3ZlcmxhcCcsXG4vLyBhZGQgJy0tdHNfcHJvdG9fb3B0PWVzTW9kdWxlSW50ZXJvcD10cnVlJyBhcyBhIGZsYWcgd2hlbiBjYWxsaW5nICdwcm90b2MnLlxuaWYgKG1pbmltYWxfMS51dGlsLkxvbmcgIT09IExvbmcpIHtcbiAgICBtaW5pbWFsXzEudXRpbC5Mb25nID0gTG9uZztcbiAgICAoMCwgbWluaW1hbF8xLmNvbmZpZ3VyZSkoKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNzdHJpa2UxNV9nY21lc3NhZ2VzLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5DQ1NVc3JNc2dWb3RlU3RhcnQgPSBleHBvcnRzLkNDU1Vzck1zZ0NhbGxWb3RlRmFpbGVkID0gZXhwb3J0cy5DQ1NVc3JNc2dYUmFua1VwZCA9IGV4cG9ydHMuQ0NTVXNyTXNnWFJhbmtHZXQgPSBleHBvcnRzLkNDU1Vzck1zZ1BsYXllckRlY2FsRGlnaXRhbFNpZ25hdHVyZSA9IGV4cG9ydHMuQ0NTVXNyTXNnU2NvcmVMZWFkZXJib2FyZERhdGEgPSBleHBvcnRzLkNDU1Vzck1zZ1F1ZXN0UHJvZ3Jlc3MgPSBleHBvcnRzLkNDU1Vzck1zZ0Rpc3BsYXlJbnZlbnRvcnkgPSBleHBvcnRzLkNDU1Vzck1zZ1BsYXllclN0YXRzVXBkYXRlX1N0YXQgPSBleHBvcnRzLkNDU1Vzck1zZ1BsYXllclN0YXRzVXBkYXRlID0gZXhwb3J0cy5DQ1NVc3JNc2dNYXRjaEVuZENvbmRpdGlvbnMgPSBleHBvcnRzLkNDU1Vzck1zZ0FjaGlldmVtZW50RXZlbnQgPSBleHBvcnRzLkNDU1Vzck1zZ0N1cnJlbnRUaW1lc2NhbGUgPSBleHBvcnRzLkNDU1Vzck1zZ0Rlc2lyZWRUaW1lc2NhbGUgPSBleHBvcnRzLkNDU1Vzck1zZ0tpbGxDYW0gPSBleHBvcnRzLkNDU1Vzck1zZ1JlcG9ydEhpdCA9IGV4cG9ydHMuQ0NTVXNyTXNnQWRqdXN0TW9uZXkgPSBleHBvcnRzLkNDU1Vzck1zZ0VudGl0eU91dGxpbmVIaWdobGlnaHQgPSBleHBvcnRzLkNDU1Vzck1zZ1VwZGF0ZVNjcmVlbkhlYWx0aEJhciA9IGV4cG9ydHMuQ0NTVXNyTXNnV2VhcG9uU291bmQgPSBleHBvcnRzLkNDU1Vzck1zZ1JlbG9hZEVmZmVjdCA9IGV4cG9ydHMuQ0NTVXNyTXNnU2VuZFBsYXllckl0ZW1Gb3VuZCA9IGV4cG9ydHMuQ0NTVXNyTXNnU2VuZFBsYXllckl0ZW1Ecm9wcyA9IGV4cG9ydHMuQ0NTVXNyTXNnUHJvY2Vzc1Nwb3R0ZWRFbnRpdHlVcGRhdGVfU3BvdHRlZEVudGl0eVVwZGF0ZSA9IGV4cG9ydHMuQ0NTVXNyTXNnUHJvY2Vzc1Nwb3R0ZWRFbnRpdHlVcGRhdGUgPSBleHBvcnRzLkNDU1Vzck1zZ0tleUhpbnRUZXh0ID0gZXhwb3J0cy5DQ1NVc3JNc2dIaW50VGV4dCA9IGV4cG9ydHMuQ0NTVXNyTXNnUmFkaW9UZXh0ID0gZXhwb3J0cy5DQ1NVc3JNc2dEYW1hZ2UgPSBleHBvcnRzLkNDU1Vzck1zZ1ZvaWNlTWFza19QbGF5ZXJNYXNrID0gZXhwb3J0cy5DQ1NVc3JNc2dWb2ljZU1hc2sgPSBleHBvcnRzLkNDU1Vzck1zZ1Jhd0F1ZGlvID0gZXhwb3J0cy5DQ1NVc3JNc2dTZW5kQXVkaW8gPSBleHBvcnRzLkNDU1Vzck1zZ0Nsb3NlQ2FwdGlvbkRpcmVjdCA9IGV4cG9ydHMuQ0NTVXNyTXNnQ2xvc2VDYXB0aW9uID0gZXhwb3J0cy5DQ1NVc3JNc2dSdW1ibGUgPSBleHBvcnRzLkNDU1Vzck1zZ0ZhZGUgPSBleHBvcnRzLkNDU1Vzck1zZ1NoYWtlID0gZXhwb3J0cy5DQ1NVc3JNc2dIdWRNc2cgPSBleHBvcnRzLkNDU1Vzck1zZ1RleHRNc2cgPSBleHBvcnRzLkNDU1Vzck1zZ1NheVRleHQyID0gZXhwb3J0cy5DQ1NVc3JNc2dTYXlUZXh0ID0gZXhwb3J0cy5DQ1NVc3JNc2dIdWRUZXh0ID0gZXhwb3J0cy5DQ1NVc3JNc2dUcmFpbiA9IGV4cG9ydHMuQ0NTVXNyTXNnR2VpZ2VyID0gZXhwb3J0cy5DQ1NVc3JNc2dWR1VJTWVudV9TdWJrZXkgPSBleHBvcnRzLkNDU1Vzck1zZ1ZHVUlNZW51ID0gZXhwb3J0cy5FQ1NVc3JNc2dEaXNjb25uZWN0VG9Mb2JieUFjdGlvbiA9IGV4cG9ydHMuRUNzdHJpa2UxNVVzZXJNZXNzYWdlcyA9IGV4cG9ydHMucHJvdG9idWZQYWNrYWdlID0gdm9pZCAwO1xuZXhwb3J0cy5DQ1NVc3JNc2dVdGlsTXNnID0gZXhwb3J0cy5DQ1NVc3JNc2dTZXJ2ZXJSYW5rUmV2ZWFsQWxsID0gZXhwb3J0cy5DQ1NVc3JNc2dDbGllbnRJbmZvID0gZXhwb3J0cy5DQ1NVc3JNc2dXYXJtdXBIYXNFbmRlZCA9IGV4cG9ydHMuQ0NTVXNyTXNnRGlzY29ubmVjdFRvTG9iYnkgPSBleHBvcnRzLkNDU1Vzck1zZ1N0b3BTcGVjdGF0b3JNb2RlID0gZXhwb3J0cy5DQ1NVc3JNc2dSZXF1ZXN0U3RhdGUgPSBleHBvcnRzLkNDU1Vzck1zZ0dhbWVUaXRsZSA9IGV4cG9ydHMuQ0NTVXNyTXNnUmVzZXRIdWQgPSBleHBvcnRzLkNDU1Vzck1zZ0RlZXBTdGF0cyA9IGV4cG9ydHMuQ0NTVXNyTXNnQ3VycmVudFJvdW5kT2RkcyA9IGV4cG9ydHMuQ0NTVXNyTXNnUm91bmRJbXBhY3RTY29yZURhdGFfSW5pdGlhbENvbmRpdGlvbnMgPSBleHBvcnRzLkNDU1Vzck1zZ1JvdW5kSW1wYWN0U2NvcmVEYXRhX1Jpc0V2ZW50X0RhbWFnZSA9IGV4cG9ydHMuQ0NTVXNyTXNnUm91bmRJbXBhY3RTY29yZURhdGFfUmlzRXZlbnRfT2JqZWN0aXZlID0gZXhwb3J0cy5DQ1NVc3JNc2dSb3VuZEltcGFjdFNjb3JlRGF0YV9SaXNFdmVudF9WaWN0aW0gPSBleHBvcnRzLkNDU1Vzck1zZ1JvdW5kSW1wYWN0U2NvcmVEYXRhX1Jpc0V2ZW50ID0gZXhwb3J0cy5DQ1NVc3JNc2dSb3VuZEltcGFjdFNjb3JlRGF0YSA9IGV4cG9ydHMuQ0NTVXNyTXNnRW5kT2ZNYXRjaEFsbFBsYXllcnNEYXRhX1BsYXllckRhdGEgPSBleHBvcnRzLkNDU1Vzck1zZ0VuZE9mTWF0Y2hBbGxQbGF5ZXJzRGF0YV9BY2NvbGFkZSA9IGV4cG9ydHMuQ0NTVXNyTXNnRW5kT2ZNYXRjaEFsbFBsYXllcnNEYXRhID0gZXhwb3J0cy5DQ1NVc3JNc2dTdXJ2aXZhbFN0YXRzX0RhbWFnZSA9IGV4cG9ydHMuQ0NTVXNyTXNnU3Vydml2YWxTdGF0c19QbGFjZW1lbnQgPSBleHBvcnRzLkNDU1Vzck1zZ1N1cnZpdmFsU3RhdHNfRmFjdCA9IGV4cG9ydHMuQ0NTVXNyTXNnU3Vydml2YWxTdGF0cyA9IGV4cG9ydHMuQ0NTVXNyTXNnU1NVSSA9IGV4cG9ydHMuQ0NTVXNyTXNnUm91bmRCYWNrdXBGaWxlbmFtZXMgPSBleHBvcnRzLkNDU1Vzck1zZ0dsb3dQcm9wVHVybk9mZiA9IGV4cG9ydHMuQ0NTVXNyTXNnSXRlbURyb3AgPSBleHBvcnRzLkNDU1Vzck1zZ01hdGNoU3RhdHNVcGRhdGUgPSBleHBvcnRzLkNDU1Vzck1zZ01hcmtBY2hpZXZlbWVudCA9IGV4cG9ydHMuQ0NTVXNyTXNnQW1tb0RlbmllZCA9IGV4cG9ydHMuQ0NTVXNyTXNnQmFyVGltZSA9IGV4cG9ydHMuQ0NTVXNyTXNnU2hvd01lbnUgPSBleHBvcnRzLkNDU1Vzck1zZ0l0ZW1QaWNrdXAgPSBleHBvcnRzLkNDU1Vzck1zZ1hwVXBkYXRlID0gZXhwb3J0cy5DQ1NVc3JNc2dTZXJ2ZXJSYW5rVXBkYXRlX1JhbmtVcGRhdGUgPSBleHBvcnRzLkNDU1Vzck1zZ1NlcnZlclJhbmtVcGRhdGUgPSBleHBvcnRzLkNDU1Vzck1zZ1NlbmRMYXN0S2lsbGVyRGFtYWdlVG9DbGllbnQgPSBleHBvcnRzLkNDU1Vzck1zZ1ZvdGVTZXR1cCA9IGV4cG9ydHMuQ0NTVXNyTXNnVm90ZUZhaWxlZCA9IGV4cG9ydHMuQ0NTVXNyTXNnVm90ZVBhc3MgPSB2b2lkIDA7XG4vKiBlc2xpbnQtZGlzYWJsZSAqL1xuY29uc3QgbWluaW1hbF8xID0gcmVxdWlyZShcInByb3RvYnVmanMvbWluaW1hbFwiKTtcbmNvbnN0IExvbmcgPSByZXF1aXJlKFwibG9uZ1wiKTtcbmNvbnN0IG5ldG1lc3NhZ2VzXzEgPSByZXF1aXJlKFwiLi9uZXRtZXNzYWdlc1wiKTtcbmNvbnN0IGNzdHJpa2UxNV9nY21lc3NhZ2VzXzEgPSByZXF1aXJlKFwiLi9jc3RyaWtlMTVfZ2NtZXNzYWdlc1wiKTtcbmV4cG9ydHMucHJvdG9idWZQYWNrYWdlID0gXCJcIjtcbnZhciBFQ3N0cmlrZTE1VXNlck1lc3NhZ2VzO1xuKGZ1bmN0aW9uIChFQ3N0cmlrZTE1VXNlck1lc3NhZ2VzKSB7XG4gICAgRUNzdHJpa2UxNVVzZXJNZXNzYWdlc1tFQ3N0cmlrZTE1VXNlck1lc3NhZ2VzW1wiQ1NfVU1fVkdVSU1lbnVcIl0gPSAxXSA9IFwiQ1NfVU1fVkdVSU1lbnVcIjtcbiAgICBFQ3N0cmlrZTE1VXNlck1lc3NhZ2VzW0VDc3RyaWtlMTVVc2VyTWVzc2FnZXNbXCJDU19VTV9HZWlnZXJcIl0gPSAyXSA9IFwiQ1NfVU1fR2VpZ2VyXCI7XG4gICAgRUNzdHJpa2UxNVVzZXJNZXNzYWdlc1tFQ3N0cmlrZTE1VXNlck1lc3NhZ2VzW1wiQ1NfVU1fVHJhaW5cIl0gPSAzXSA9IFwiQ1NfVU1fVHJhaW5cIjtcbiAgICBFQ3N0cmlrZTE1VXNlck1lc3NhZ2VzW0VDc3RyaWtlMTVVc2VyTWVzc2FnZXNbXCJDU19VTV9IdWRUZXh0XCJdID0gNF0gPSBcIkNTX1VNX0h1ZFRleHRcIjtcbiAgICBFQ3N0cmlrZTE1VXNlck1lc3NhZ2VzW0VDc3RyaWtlMTVVc2VyTWVzc2FnZXNbXCJDU19VTV9TYXlUZXh0XCJdID0gNV0gPSBcIkNTX1VNX1NheVRleHRcIjtcbiAgICBFQ3N0cmlrZTE1VXNlck1lc3NhZ2VzW0VDc3RyaWtlMTVVc2VyTWVzc2FnZXNbXCJDU19VTV9TYXlUZXh0MlwiXSA9IDZdID0gXCJDU19VTV9TYXlUZXh0MlwiO1xuICAgIEVDc3RyaWtlMTVVc2VyTWVzc2FnZXNbRUNzdHJpa2UxNVVzZXJNZXNzYWdlc1tcIkNTX1VNX1RleHRNc2dcIl0gPSA3XSA9IFwiQ1NfVU1fVGV4dE1zZ1wiO1xuICAgIEVDc3RyaWtlMTVVc2VyTWVzc2FnZXNbRUNzdHJpa2UxNVVzZXJNZXNzYWdlc1tcIkNTX1VNX0h1ZE1zZ1wiXSA9IDhdID0gXCJDU19VTV9IdWRNc2dcIjtcbiAgICBFQ3N0cmlrZTE1VXNlck1lc3NhZ2VzW0VDc3RyaWtlMTVVc2VyTWVzc2FnZXNbXCJDU19VTV9SZXNldEh1ZFwiXSA9IDldID0gXCJDU19VTV9SZXNldEh1ZFwiO1xuICAgIEVDc3RyaWtlMTVVc2VyTWVzc2FnZXNbRUNzdHJpa2UxNVVzZXJNZXNzYWdlc1tcIkNTX1VNX0dhbWVUaXRsZVwiXSA9IDEwXSA9IFwiQ1NfVU1fR2FtZVRpdGxlXCI7XG4gICAgRUNzdHJpa2UxNVVzZXJNZXNzYWdlc1tFQ3N0cmlrZTE1VXNlck1lc3NhZ2VzW1wiQ1NfVU1fU2hha2VcIl0gPSAxMl0gPSBcIkNTX1VNX1NoYWtlXCI7XG4gICAgRUNzdHJpa2UxNVVzZXJNZXNzYWdlc1tFQ3N0cmlrZTE1VXNlck1lc3NhZ2VzW1wiQ1NfVU1fRmFkZVwiXSA9IDEzXSA9IFwiQ1NfVU1fRmFkZVwiO1xuICAgIEVDc3RyaWtlMTVVc2VyTWVzc2FnZXNbRUNzdHJpa2UxNVVzZXJNZXNzYWdlc1tcIkNTX1VNX1J1bWJsZVwiXSA9IDE0XSA9IFwiQ1NfVU1fUnVtYmxlXCI7XG4gICAgRUNzdHJpa2UxNVVzZXJNZXNzYWdlc1tFQ3N0cmlrZTE1VXNlck1lc3NhZ2VzW1wiQ1NfVU1fQ2xvc2VDYXB0aW9uXCJdID0gMTVdID0gXCJDU19VTV9DbG9zZUNhcHRpb25cIjtcbiAgICBFQ3N0cmlrZTE1VXNlck1lc3NhZ2VzW0VDc3RyaWtlMTVVc2VyTWVzc2FnZXNbXCJDU19VTV9DbG9zZUNhcHRpb25EaXJlY3RcIl0gPSAxNl0gPSBcIkNTX1VNX0Nsb3NlQ2FwdGlvbkRpcmVjdFwiO1xuICAgIEVDc3RyaWtlMTVVc2VyTWVzc2FnZXNbRUNzdHJpa2UxNVVzZXJNZXNzYWdlc1tcIkNTX1VNX1NlbmRBdWRpb1wiXSA9IDE3XSA9IFwiQ1NfVU1fU2VuZEF1ZGlvXCI7XG4gICAgRUNzdHJpa2UxNVVzZXJNZXNzYWdlc1tFQ3N0cmlrZTE1VXNlck1lc3NhZ2VzW1wiQ1NfVU1fUmF3QXVkaW9cIl0gPSAxOF0gPSBcIkNTX1VNX1Jhd0F1ZGlvXCI7XG4gICAgRUNzdHJpa2UxNVVzZXJNZXNzYWdlc1tFQ3N0cmlrZTE1VXNlck1lc3NhZ2VzW1wiQ1NfVU1fVm9pY2VNYXNrXCJdID0gMTldID0gXCJDU19VTV9Wb2ljZU1hc2tcIjtcbiAgICBFQ3N0cmlrZTE1VXNlck1lc3NhZ2VzW0VDc3RyaWtlMTVVc2VyTWVzc2FnZXNbXCJDU19VTV9SZXF1ZXN0U3RhdGVcIl0gPSAyMF0gPSBcIkNTX1VNX1JlcXVlc3RTdGF0ZVwiO1xuICAgIEVDc3RyaWtlMTVVc2VyTWVzc2FnZXNbRUNzdHJpa2UxNVVzZXJNZXNzYWdlc1tcIkNTX1VNX0RhbWFnZVwiXSA9IDIxXSA9IFwiQ1NfVU1fRGFtYWdlXCI7XG4gICAgRUNzdHJpa2UxNVVzZXJNZXNzYWdlc1tFQ3N0cmlrZTE1VXNlck1lc3NhZ2VzW1wiQ1NfVU1fUmFkaW9UZXh0XCJdID0gMjJdID0gXCJDU19VTV9SYWRpb1RleHRcIjtcbiAgICBFQ3N0cmlrZTE1VXNlck1lc3NhZ2VzW0VDc3RyaWtlMTVVc2VyTWVzc2FnZXNbXCJDU19VTV9IaW50VGV4dFwiXSA9IDIzXSA9IFwiQ1NfVU1fSGludFRleHRcIjtcbiAgICBFQ3N0cmlrZTE1VXNlck1lc3NhZ2VzW0VDc3RyaWtlMTVVc2VyTWVzc2FnZXNbXCJDU19VTV9LZXlIaW50VGV4dFwiXSA9IDI0XSA9IFwiQ1NfVU1fS2V5SGludFRleHRcIjtcbiAgICBFQ3N0cmlrZTE1VXNlck1lc3NhZ2VzW0VDc3RyaWtlMTVVc2VyTWVzc2FnZXNbXCJDU19VTV9Qcm9jZXNzU3BvdHRlZEVudGl0eVVwZGF0ZVwiXSA9IDI1XSA9IFwiQ1NfVU1fUHJvY2Vzc1Nwb3R0ZWRFbnRpdHlVcGRhdGVcIjtcbiAgICBFQ3N0cmlrZTE1VXNlck1lc3NhZ2VzW0VDc3RyaWtlMTVVc2VyTWVzc2FnZXNbXCJDU19VTV9SZWxvYWRFZmZlY3RcIl0gPSAyNl0gPSBcIkNTX1VNX1JlbG9hZEVmZmVjdFwiO1xuICAgIEVDc3RyaWtlMTVVc2VyTWVzc2FnZXNbRUNzdHJpa2UxNVVzZXJNZXNzYWdlc1tcIkNTX1VNX0FkanVzdE1vbmV5XCJdID0gMjddID0gXCJDU19VTV9BZGp1c3RNb25leVwiO1xuICAgIEVDc3RyaWtlMTVVc2VyTWVzc2FnZXNbRUNzdHJpa2UxNVVzZXJNZXNzYWdlc1tcIkNTX1VNX1VwZGF0ZVRlYW1Nb25leVwiXSA9IDI4XSA9IFwiQ1NfVU1fVXBkYXRlVGVhbU1vbmV5XCI7XG4gICAgRUNzdHJpa2UxNVVzZXJNZXNzYWdlc1tFQ3N0cmlrZTE1VXNlck1lc3NhZ2VzW1wiQ1NfVU1fU3RvcFNwZWN0YXRvck1vZGVcIl0gPSAyOV0gPSBcIkNTX1VNX1N0b3BTcGVjdGF0b3JNb2RlXCI7XG4gICAgRUNzdHJpa2UxNVVzZXJNZXNzYWdlc1tFQ3N0cmlrZTE1VXNlck1lc3NhZ2VzW1wiQ1NfVU1fS2lsbENhbVwiXSA9IDMwXSA9IFwiQ1NfVU1fS2lsbENhbVwiO1xuICAgIEVDc3RyaWtlMTVVc2VyTWVzc2FnZXNbRUNzdHJpa2UxNVVzZXJNZXNzYWdlc1tcIkNTX1VNX0Rlc2lyZWRUaW1lc2NhbGVcIl0gPSAzMV0gPSBcIkNTX1VNX0Rlc2lyZWRUaW1lc2NhbGVcIjtcbiAgICBFQ3N0cmlrZTE1VXNlck1lc3NhZ2VzW0VDc3RyaWtlMTVVc2VyTWVzc2FnZXNbXCJDU19VTV9DdXJyZW50VGltZXNjYWxlXCJdID0gMzJdID0gXCJDU19VTV9DdXJyZW50VGltZXNjYWxlXCI7XG4gICAgRUNzdHJpa2UxNVVzZXJNZXNzYWdlc1tFQ3N0cmlrZTE1VXNlck1lc3NhZ2VzW1wiQ1NfVU1fQWNoaWV2ZW1lbnRFdmVudFwiXSA9IDMzXSA9IFwiQ1NfVU1fQWNoaWV2ZW1lbnRFdmVudFwiO1xuICAgIEVDc3RyaWtlMTVVc2VyTWVzc2FnZXNbRUNzdHJpa2UxNVVzZXJNZXNzYWdlc1tcIkNTX1VNX01hdGNoRW5kQ29uZGl0aW9uc1wiXSA9IDM0XSA9IFwiQ1NfVU1fTWF0Y2hFbmRDb25kaXRpb25zXCI7XG4gICAgRUNzdHJpa2UxNVVzZXJNZXNzYWdlc1tFQ3N0cmlrZTE1VXNlck1lc3NhZ2VzW1wiQ1NfVU1fRGlzY29ubmVjdFRvTG9iYnlcIl0gPSAzNV0gPSBcIkNTX1VNX0Rpc2Nvbm5lY3RUb0xvYmJ5XCI7XG4gICAgRUNzdHJpa2UxNVVzZXJNZXNzYWdlc1tFQ3N0cmlrZTE1VXNlck1lc3NhZ2VzW1wiQ1NfVU1fUGxheWVyU3RhdHNVcGRhdGVcIl0gPSAzNl0gPSBcIkNTX1VNX1BsYXllclN0YXRzVXBkYXRlXCI7XG4gICAgRUNzdHJpa2UxNVVzZXJNZXNzYWdlc1tFQ3N0cmlrZTE1VXNlck1lc3NhZ2VzW1wiQ1NfVU1fRGlzcGxheUludmVudG9yeVwiXSA9IDM3XSA9IFwiQ1NfVU1fRGlzcGxheUludmVudG9yeVwiO1xuICAgIEVDc3RyaWtlMTVVc2VyTWVzc2FnZXNbRUNzdHJpa2UxNVVzZXJNZXNzYWdlc1tcIkNTX1VNX1dhcm11cEhhc0VuZGVkXCJdID0gMzhdID0gXCJDU19VTV9XYXJtdXBIYXNFbmRlZFwiO1xuICAgIEVDc3RyaWtlMTVVc2VyTWVzc2FnZXNbRUNzdHJpa2UxNVVzZXJNZXNzYWdlc1tcIkNTX1VNX0NsaWVudEluZm9cIl0gPSAzOV0gPSBcIkNTX1VNX0NsaWVudEluZm9cIjtcbiAgICBFQ3N0cmlrZTE1VXNlck1lc3NhZ2VzW0VDc3RyaWtlMTVVc2VyTWVzc2FnZXNbXCJDU19VTV9YUmFua0dldFwiXSA9IDQwXSA9IFwiQ1NfVU1fWFJhbmtHZXRcIjtcbiAgICBFQ3N0cmlrZTE1VXNlck1lc3NhZ2VzW0VDc3RyaWtlMTVVc2VyTWVzc2FnZXNbXCJDU19VTV9YUmFua1VwZFwiXSA9IDQxXSA9IFwiQ1NfVU1fWFJhbmtVcGRcIjtcbiAgICBFQ3N0cmlrZTE1VXNlck1lc3NhZ2VzW0VDc3RyaWtlMTVVc2VyTWVzc2FnZXNbXCJDU19VTV9DYWxsVm90ZUZhaWxlZFwiXSA9IDQ1XSA9IFwiQ1NfVU1fQ2FsbFZvdGVGYWlsZWRcIjtcbiAgICBFQ3N0cmlrZTE1VXNlck1lc3NhZ2VzW0VDc3RyaWtlMTVVc2VyTWVzc2FnZXNbXCJDU19VTV9Wb3RlU3RhcnRcIl0gPSA0Nl0gPSBcIkNTX1VNX1ZvdGVTdGFydFwiO1xuICAgIEVDc3RyaWtlMTVVc2VyTWVzc2FnZXNbRUNzdHJpa2UxNVVzZXJNZXNzYWdlc1tcIkNTX1VNX1ZvdGVQYXNzXCJdID0gNDddID0gXCJDU19VTV9Wb3RlUGFzc1wiO1xuICAgIEVDc3RyaWtlMTVVc2VyTWVzc2FnZXNbRUNzdHJpa2UxNVVzZXJNZXNzYWdlc1tcIkNTX1VNX1ZvdGVGYWlsZWRcIl0gPSA0OF0gPSBcIkNTX1VNX1ZvdGVGYWlsZWRcIjtcbiAgICBFQ3N0cmlrZTE1VXNlck1lc3NhZ2VzW0VDc3RyaWtlMTVVc2VyTWVzc2FnZXNbXCJDU19VTV9Wb3RlU2V0dXBcIl0gPSA0OV0gPSBcIkNTX1VNX1ZvdGVTZXR1cFwiO1xuICAgIEVDc3RyaWtlMTVVc2VyTWVzc2FnZXNbRUNzdHJpa2UxNVVzZXJNZXNzYWdlc1tcIkNTX1VNX1NlcnZlclJhbmtSZXZlYWxBbGxcIl0gPSA1MF0gPSBcIkNTX1VNX1NlcnZlclJhbmtSZXZlYWxBbGxcIjtcbiAgICBFQ3N0cmlrZTE1VXNlck1lc3NhZ2VzW0VDc3RyaWtlMTVVc2VyTWVzc2FnZXNbXCJDU19VTV9TZW5kTGFzdEtpbGxlckRhbWFnZVRvQ2xpZW50XCJdID0gNTFdID0gXCJDU19VTV9TZW5kTGFzdEtpbGxlckRhbWFnZVRvQ2xpZW50XCI7XG4gICAgRUNzdHJpa2UxNVVzZXJNZXNzYWdlc1tFQ3N0cmlrZTE1VXNlck1lc3NhZ2VzW1wiQ1NfVU1fU2VydmVyUmFua1VwZGF0ZVwiXSA9IDUyXSA9IFwiQ1NfVU1fU2VydmVyUmFua1VwZGF0ZVwiO1xuICAgIEVDc3RyaWtlMTVVc2VyTWVzc2FnZXNbRUNzdHJpa2UxNVVzZXJNZXNzYWdlc1tcIkNTX1VNX0l0ZW1QaWNrdXBcIl0gPSA1M10gPSBcIkNTX1VNX0l0ZW1QaWNrdXBcIjtcbiAgICBFQ3N0cmlrZTE1VXNlck1lc3NhZ2VzW0VDc3RyaWtlMTVVc2VyTWVzc2FnZXNbXCJDU19VTV9TaG93TWVudVwiXSA9IDU0XSA9IFwiQ1NfVU1fU2hvd01lbnVcIjtcbiAgICBFQ3N0cmlrZTE1VXNlck1lc3NhZ2VzW0VDc3RyaWtlMTVVc2VyTWVzc2FnZXNbXCJDU19VTV9CYXJUaW1lXCJdID0gNTVdID0gXCJDU19VTV9CYXJUaW1lXCI7XG4gICAgRUNzdHJpa2UxNVVzZXJNZXNzYWdlc1tFQ3N0cmlrZTE1VXNlck1lc3NhZ2VzW1wiQ1NfVU1fQW1tb0RlbmllZFwiXSA9IDU2XSA9IFwiQ1NfVU1fQW1tb0RlbmllZFwiO1xuICAgIEVDc3RyaWtlMTVVc2VyTWVzc2FnZXNbRUNzdHJpa2UxNVVzZXJNZXNzYWdlc1tcIkNTX1VNX01hcmtBY2hpZXZlbWVudFwiXSA9IDU3XSA9IFwiQ1NfVU1fTWFya0FjaGlldmVtZW50XCI7XG4gICAgRUNzdHJpa2UxNVVzZXJNZXNzYWdlc1tFQ3N0cmlrZTE1VXNlck1lc3NhZ2VzW1wiQ1NfVU1fTWF0Y2hTdGF0c1VwZGF0ZVwiXSA9IDU4XSA9IFwiQ1NfVU1fTWF0Y2hTdGF0c1VwZGF0ZVwiO1xuICAgIEVDc3RyaWtlMTVVc2VyTWVzc2FnZXNbRUNzdHJpa2UxNVVzZXJNZXNzYWdlc1tcIkNTX1VNX0l0ZW1Ecm9wXCJdID0gNTldID0gXCJDU19VTV9JdGVtRHJvcFwiO1xuICAgIEVDc3RyaWtlMTVVc2VyTWVzc2FnZXNbRUNzdHJpa2UxNVVzZXJNZXNzYWdlc1tcIkNTX1VNX0dsb3dQcm9wVHVybk9mZlwiXSA9IDYwXSA9IFwiQ1NfVU1fR2xvd1Byb3BUdXJuT2ZmXCI7XG4gICAgRUNzdHJpa2UxNVVzZXJNZXNzYWdlc1tFQ3N0cmlrZTE1VXNlck1lc3NhZ2VzW1wiQ1NfVU1fU2VuZFBsYXllckl0ZW1Ecm9wc1wiXSA9IDYxXSA9IFwiQ1NfVU1fU2VuZFBsYXllckl0ZW1Ecm9wc1wiO1xuICAgIEVDc3RyaWtlMTVVc2VyTWVzc2FnZXNbRUNzdHJpa2UxNVVzZXJNZXNzYWdlc1tcIkNTX1VNX1JvdW5kQmFja3VwRmlsZW5hbWVzXCJdID0gNjJdID0gXCJDU19VTV9Sb3VuZEJhY2t1cEZpbGVuYW1lc1wiO1xuICAgIEVDc3RyaWtlMTVVc2VyTWVzc2FnZXNbRUNzdHJpa2UxNVVzZXJNZXNzYWdlc1tcIkNTX1VNX1NlbmRQbGF5ZXJJdGVtRm91bmRcIl0gPSA2M10gPSBcIkNTX1VNX1NlbmRQbGF5ZXJJdGVtRm91bmRcIjtcbiAgICBFQ3N0cmlrZTE1VXNlck1lc3NhZ2VzW0VDc3RyaWtlMTVVc2VyTWVzc2FnZXNbXCJDU19VTV9SZXBvcnRIaXRcIl0gPSA2NF0gPSBcIkNTX1VNX1JlcG9ydEhpdFwiO1xuICAgIEVDc3RyaWtlMTVVc2VyTWVzc2FnZXNbRUNzdHJpa2UxNVVzZXJNZXNzYWdlc1tcIkNTX1VNX1hwVXBkYXRlXCJdID0gNjVdID0gXCJDU19VTV9YcFVwZGF0ZVwiO1xuICAgIEVDc3RyaWtlMTVVc2VyTWVzc2FnZXNbRUNzdHJpa2UxNVVzZXJNZXNzYWdlc1tcIkNTX1VNX1F1ZXN0UHJvZ3Jlc3NcIl0gPSA2Nl0gPSBcIkNTX1VNX1F1ZXN0UHJvZ3Jlc3NcIjtcbiAgICBFQ3N0cmlrZTE1VXNlck1lc3NhZ2VzW0VDc3RyaWtlMTVVc2VyTWVzc2FnZXNbXCJDU19VTV9TY29yZUxlYWRlcmJvYXJkRGF0YVwiXSA9IDY3XSA9IFwiQ1NfVU1fU2NvcmVMZWFkZXJib2FyZERhdGFcIjtcbiAgICBFQ3N0cmlrZTE1VXNlck1lc3NhZ2VzW0VDc3RyaWtlMTVVc2VyTWVzc2FnZXNbXCJDU19VTV9QbGF5ZXJEZWNhbERpZ2l0YWxTaWduYXR1cmVcIl0gPSA2OF0gPSBcIkNTX1VNX1BsYXllckRlY2FsRGlnaXRhbFNpZ25hdHVyZVwiO1xuICAgIEVDc3RyaWtlMTVVc2VyTWVzc2FnZXNbRUNzdHJpa2UxNVVzZXJNZXNzYWdlc1tcIkNTX1VNX1dlYXBvblNvdW5kXCJdID0gNjldID0gXCJDU19VTV9XZWFwb25Tb3VuZFwiO1xuICAgIEVDc3RyaWtlMTVVc2VyTWVzc2FnZXNbRUNzdHJpa2UxNVVzZXJNZXNzYWdlc1tcIkNTX1VNX1VwZGF0ZVNjcmVlbkhlYWx0aEJhclwiXSA9IDcwXSA9IFwiQ1NfVU1fVXBkYXRlU2NyZWVuSGVhbHRoQmFyXCI7XG4gICAgRUNzdHJpa2UxNVVzZXJNZXNzYWdlc1tFQ3N0cmlrZTE1VXNlck1lc3NhZ2VzW1wiQ1NfVU1fRW50aXR5T3V0bGluZUhpZ2hsaWdodFwiXSA9IDcxXSA9IFwiQ1NfVU1fRW50aXR5T3V0bGluZUhpZ2hsaWdodFwiO1xuICAgIEVDc3RyaWtlMTVVc2VyTWVzc2FnZXNbRUNzdHJpa2UxNVVzZXJNZXNzYWdlc1tcIkNTX1VNX1NTVUlcIl0gPSA3Ml0gPSBcIkNTX1VNX1NTVUlcIjtcbiAgICBFQ3N0cmlrZTE1VXNlck1lc3NhZ2VzW0VDc3RyaWtlMTVVc2VyTWVzc2FnZXNbXCJDU19VTV9TdXJ2aXZhbFN0YXRzXCJdID0gNzNdID0gXCJDU19VTV9TdXJ2aXZhbFN0YXRzXCI7XG4gICAgRUNzdHJpa2UxNVVzZXJNZXNzYWdlc1tFQ3N0cmlrZTE1VXNlck1lc3NhZ2VzW1wiQ1NfVU1fRGlzY29ubmVjdFRvTG9iYnkyXCJdID0gNzRdID0gXCJDU19VTV9EaXNjb25uZWN0VG9Mb2JieTJcIjtcbiAgICBFQ3N0cmlrZTE1VXNlck1lc3NhZ2VzW0VDc3RyaWtlMTVVc2VyTWVzc2FnZXNbXCJDU19VTV9FbmRPZk1hdGNoQWxsUGxheWVyc0RhdGFcIl0gPSA3NV0gPSBcIkNTX1VNX0VuZE9mTWF0Y2hBbGxQbGF5ZXJzRGF0YVwiO1xuICAgIEVDc3RyaWtlMTVVc2VyTWVzc2FnZXNbRUNzdHJpa2UxNVVzZXJNZXNzYWdlc1tcIkNTX1VNX1JvdW5kSW1wYWN0U2NvcmVEYXRhXCJdID0gNzldID0gXCJDU19VTV9Sb3VuZEltcGFjdFNjb3JlRGF0YVwiO1xuICAgIEVDc3RyaWtlMTVVc2VyTWVzc2FnZXNbRUNzdHJpa2UxNVVzZXJNZXNzYWdlc1tcIkNTX1VNX0N1cnJlbnRSb3VuZE9kZHNcIl0gPSA4MF0gPSBcIkNTX1VNX0N1cnJlbnRSb3VuZE9kZHNcIjtcbiAgICBFQ3N0cmlrZTE1VXNlck1lc3NhZ2VzW0VDc3RyaWtlMTVVc2VyTWVzc2FnZXNbXCJDU19VTV9EZWVwU3RhdHNcIl0gPSA4MV0gPSBcIkNTX1VNX0RlZXBTdGF0c1wiO1xuICAgIEVDc3RyaWtlMTVVc2VyTWVzc2FnZXNbRUNzdHJpa2UxNVVzZXJNZXNzYWdlc1tcIkNTX1VNX1V0aWxNc2dcIl0gPSA4Ml0gPSBcIkNTX1VNX1V0aWxNc2dcIjtcbn0pKEVDc3RyaWtlMTVVc2VyTWVzc2FnZXMgPSBleHBvcnRzLkVDc3RyaWtlMTVVc2VyTWVzc2FnZXMgfHwgKGV4cG9ydHMuRUNzdHJpa2UxNVVzZXJNZXNzYWdlcyA9IHt9KSk7XG52YXIgRUNTVXNyTXNnRGlzY29ubmVjdFRvTG9iYnlBY3Rpb247XG4oZnVuY3Rpb24gKEVDU1Vzck1zZ0Rpc2Nvbm5lY3RUb0xvYmJ5QWN0aW9uKSB7XG4gICAgRUNTVXNyTXNnRGlzY29ubmVjdFRvTG9iYnlBY3Rpb25bRUNTVXNyTXNnRGlzY29ubmVjdFRvTG9iYnlBY3Rpb25bXCJrX0VDU1Vzck1zZ19EaXNjb25uZWN0VG9Mb2JieV9BY3Rpb25fRGVmYXVsdFwiXSA9IDBdID0gXCJrX0VDU1Vzck1zZ19EaXNjb25uZWN0VG9Mb2JieV9BY3Rpb25fRGVmYXVsdFwiO1xuICAgIEVDU1Vzck1zZ0Rpc2Nvbm5lY3RUb0xvYmJ5QWN0aW9uW0VDU1Vzck1zZ0Rpc2Nvbm5lY3RUb0xvYmJ5QWN0aW9uW1wia19FQ1NVc3JNc2dfRGlzY29ubmVjdFRvTG9iYnlfQWN0aW9uX0dvUXVldWVcIl0gPSAxXSA9IFwia19FQ1NVc3JNc2dfRGlzY29ubmVjdFRvTG9iYnlfQWN0aW9uX0dvUXVldWVcIjtcbn0pKEVDU1Vzck1zZ0Rpc2Nvbm5lY3RUb0xvYmJ5QWN0aW9uID0gZXhwb3J0cy5FQ1NVc3JNc2dEaXNjb25uZWN0VG9Mb2JieUFjdGlvbiB8fCAoZXhwb3J0cy5FQ1NVc3JNc2dEaXNjb25uZWN0VG9Mb2JieUFjdGlvbiA9IHt9KSk7XG5mdW5jdGlvbiBjcmVhdGVCYXNlQ0NTVXNyTXNnVkdVSU1lbnUoKSB7XG4gICAgcmV0dXJuIHsgbmFtZTogXCJcIiwgc2hvdzogZmFsc2UsIHN1YmtleXM6IFtdIH07XG59XG5leHBvcnRzLkNDU1Vzck1zZ1ZHVUlNZW51ID0ge1xuICAgIGVuY29kZShtZXNzYWdlLCB3cml0ZXIgPSBtaW5pbWFsXzEuV3JpdGVyLmNyZWF0ZSgpKSB7XG4gICAgICAgIGlmIChtZXNzYWdlLm5hbWUgIT09IFwiXCIpIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMTApLnN0cmluZyhtZXNzYWdlLm5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLnNob3cgPT09IHRydWUpIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMTYpLmJvb2wobWVzc2FnZS5zaG93KTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IHYgb2YgbWVzc2FnZS5zdWJrZXlzKSB7XG4gICAgICAgICAgICBleHBvcnRzLkNDU1Vzck1zZ1ZHVUlNZW51X1N1YmtleS5lbmNvZGUodiwgd3JpdGVyLnVpbnQzMigyNikuZm9yaygpKS5sZGVsaW0oKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH0sXG4gICAgZGVjb2RlKGlucHV0LCBsZW5ndGgpIHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gaW5wdXQgaW5zdGFuY2VvZiBtaW5pbWFsXzEuUmVhZGVyID8gaW5wdXQgOiBuZXcgbWluaW1hbF8xLlJlYWRlcihpbnB1dCk7XG4gICAgICAgIGxldCBlbmQgPSBsZW5ndGggPT09IHVuZGVmaW5lZCA/IHJlYWRlci5sZW4gOiByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNDU1Vzck1zZ1ZHVUlNZW51KCk7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBjb25zdCB0YWcgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKHRhZyA+Pj4gMykge1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5uYW1lID0gcmVhZGVyLnN0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Uuc2hvdyA9IHJlYWRlci5ib29sKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5zdWJrZXlzLnB1c2goZXhwb3J0cy5DQ1NVc3JNc2dWR1VJTWVudV9TdWJrZXkuZGVjb2RlKHJlYWRlciwgcmVhZGVyLnVpbnQzMigpKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJlYWRlci5za2lwVHlwZSh0YWcgJiA3KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfSxcbiAgICBmcm9tUGFydGlhbChvYmplY3QpIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2M7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ0NTVXNyTXNnVkdVSU1lbnUoKTtcbiAgICAgICAgbWVzc2FnZS5uYW1lID0gKF9hID0gb2JqZWN0Lm5hbWUpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IFwiXCI7XG4gICAgICAgIG1lc3NhZ2Uuc2hvdyA9IChfYiA9IG9iamVjdC5zaG93KSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBmYWxzZTtcbiAgICAgICAgbWVzc2FnZS5zdWJrZXlzID1cbiAgICAgICAgICAgICgoX2MgPSBvYmplY3Quc3Via2V5cykgPT09IG51bGwgfHwgX2MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jLm1hcChlID0+IGV4cG9ydHMuQ0NTVXNyTXNnVkdVSU1lbnVfU3Via2V5LmZyb21QYXJ0aWFsKGUpKSkgfHwgW107XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbn07XG5mdW5jdGlvbiBjcmVhdGVCYXNlQ0NTVXNyTXNnVkdVSU1lbnVfU3Via2V5KCkge1xuICAgIHJldHVybiB7IG5hbWU6IFwiXCIsIHN0cjogXCJcIiB9O1xufVxuZXhwb3J0cy5DQ1NVc3JNc2dWR1VJTWVudV9TdWJrZXkgPSB7XG4gICAgZW5jb2RlKG1lc3NhZ2UsIHdyaXRlciA9IG1pbmltYWxfMS5Xcml0ZXIuY3JlYXRlKCkpIHtcbiAgICAgICAgaWYgKG1lc3NhZ2UubmFtZSAhPT0gXCJcIikge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigxMCkuc3RyaW5nKG1lc3NhZ2UubmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2Uuc3RyICE9PSBcIlwiKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDE4KS5zdHJpbmcobWVzc2FnZS5zdHIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfSxcbiAgICBkZWNvZGUoaW5wdXQsIGxlbmd0aCkge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBpbnB1dCBpbnN0YW5jZW9mIG1pbmltYWxfMS5SZWFkZXIgPyBpbnB1dCA6IG5ldyBtaW5pbWFsXzEuUmVhZGVyKGlucHV0KTtcbiAgICAgICAgbGV0IGVuZCA9IGxlbmd0aCA9PT0gdW5kZWZpbmVkID8gcmVhZGVyLmxlbiA6IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ0NTVXNyTXNnVkdVSU1lbnVfU3Via2V5KCk7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBjb25zdCB0YWcgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKHRhZyA+Pj4gMykge1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5uYW1lID0gcmVhZGVyLnN0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Uuc3RyID0gcmVhZGVyLnN0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICByZWFkZXIuc2tpcFR5cGUodGFnICYgNyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH0sXG4gICAgZnJvbVBhcnRpYWwob2JqZWN0KSB7XG4gICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ0NTVXNyTXNnVkdVSU1lbnVfU3Via2V5KCk7XG4gICAgICAgIG1lc3NhZ2UubmFtZSA9IChfYSA9IG9iamVjdC5uYW1lKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBcIlwiO1xuICAgICAgICBtZXNzYWdlLnN0ciA9IChfYiA9IG9iamVjdC5zdHIpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IFwiXCI7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbn07XG5mdW5jdGlvbiBjcmVhdGVCYXNlQ0NTVXNyTXNnR2VpZ2VyKCkge1xuICAgIHJldHVybiB7IHJhbmdlOiAwIH07XG59XG5leHBvcnRzLkNDU1Vzck1zZ0dlaWdlciA9IHtcbiAgICBlbmNvZGUobWVzc2FnZSwgd3JpdGVyID0gbWluaW1hbF8xLldyaXRlci5jcmVhdGUoKSkge1xuICAgICAgICBpZiAobWVzc2FnZS5yYW5nZSAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig4KS5pbnQzMihtZXNzYWdlLnJhbmdlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH0sXG4gICAgZGVjb2RlKGlucHV0LCBsZW5ndGgpIHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gaW5wdXQgaW5zdGFuY2VvZiBtaW5pbWFsXzEuUmVhZGVyID8gaW5wdXQgOiBuZXcgbWluaW1hbF8xLlJlYWRlcihpbnB1dCk7XG4gICAgICAgIGxldCBlbmQgPSBsZW5ndGggPT09IHVuZGVmaW5lZCA/IHJlYWRlci5sZW4gOiByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNDU1Vzck1zZ0dlaWdlcigpO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UucmFuZ2UgPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmVhZGVyLnNraXBUeXBlKHRhZyAmIDcpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9LFxuICAgIGZyb21QYXJ0aWFsKG9iamVjdCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ0NTVXNyTXNnR2VpZ2VyKCk7XG4gICAgICAgIG1lc3NhZ2UucmFuZ2UgPSAoX2EgPSBvYmplY3QucmFuZ2UpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IDA7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbn07XG5mdW5jdGlvbiBjcmVhdGVCYXNlQ0NTVXNyTXNnVHJhaW4oKSB7XG4gICAgcmV0dXJuIHsgdHJhaW46IDAgfTtcbn1cbmV4cG9ydHMuQ0NTVXNyTXNnVHJhaW4gPSB7XG4gICAgZW5jb2RlKG1lc3NhZ2UsIHdyaXRlciA9IG1pbmltYWxfMS5Xcml0ZXIuY3JlYXRlKCkpIHtcbiAgICAgICAgaWYgKG1lc3NhZ2UudHJhaW4gIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoOCkuaW50MzIobWVzc2FnZS50cmFpbik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9LFxuICAgIGRlY29kZShpbnB1dCwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IGlucHV0IGluc3RhbmNlb2YgbWluaW1hbF8xLlJlYWRlciA/IGlucHV0IDogbmV3IG1pbmltYWxfMS5SZWFkZXIoaW5wdXQpO1xuICAgICAgICBsZXQgZW5kID0gbGVuZ3RoID09PSB1bmRlZmluZWQgPyByZWFkZXIubGVuIDogcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDQ1NVc3JNc2dUcmFpbigpO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudHJhaW4gPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmVhZGVyLnNraXBUeXBlKHRhZyAmIDcpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9LFxuICAgIGZyb21QYXJ0aWFsKG9iamVjdCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ0NTVXNyTXNnVHJhaW4oKTtcbiAgICAgICAgbWVzc2FnZS50cmFpbiA9IChfYSA9IG9iamVjdC50cmFpbikgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMDtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxufTtcbmZ1bmN0aW9uIGNyZWF0ZUJhc2VDQ1NVc3JNc2dIdWRUZXh0KCkge1xuICAgIHJldHVybiB7IHRleHQ6IFwiXCIgfTtcbn1cbmV4cG9ydHMuQ0NTVXNyTXNnSHVkVGV4dCA9IHtcbiAgICBlbmNvZGUobWVzc2FnZSwgd3JpdGVyID0gbWluaW1hbF8xLldyaXRlci5jcmVhdGUoKSkge1xuICAgICAgICBpZiAobWVzc2FnZS50ZXh0ICE9PSBcIlwiKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDEwKS5zdHJpbmcobWVzc2FnZS50ZXh0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH0sXG4gICAgZGVjb2RlKGlucHV0LCBsZW5ndGgpIHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gaW5wdXQgaW5zdGFuY2VvZiBtaW5pbWFsXzEuUmVhZGVyID8gaW5wdXQgOiBuZXcgbWluaW1hbF8xLlJlYWRlcihpbnB1dCk7XG4gICAgICAgIGxldCBlbmQgPSBsZW5ndGggPT09IHVuZGVmaW5lZCA/IHJlYWRlci5sZW4gOiByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNDU1Vzck1zZ0h1ZFRleHQoKTtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhZyA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgIHN3aXRjaCAodGFnID4+PiAzKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnRleHQgPSByZWFkZXIuc3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJlYWRlci5za2lwVHlwZSh0YWcgJiA3KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfSxcbiAgICBmcm9tUGFydGlhbChvYmplY3QpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNDU1Vzck1zZ0h1ZFRleHQoKTtcbiAgICAgICAgbWVzc2FnZS50ZXh0ID0gKF9hID0gb2JqZWN0LnRleHQpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IFwiXCI7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbn07XG5mdW5jdGlvbiBjcmVhdGVCYXNlQ0NTVXNyTXNnU2F5VGV4dCgpIHtcbiAgICByZXR1cm4geyBlbnRJZHg6IDAsIHRleHQ6IFwiXCIsIGNoYXQ6IGZhbHNlLCB0ZXh0YWxsY2hhdDogZmFsc2UgfTtcbn1cbmV4cG9ydHMuQ0NTVXNyTXNnU2F5VGV4dCA9IHtcbiAgICBlbmNvZGUobWVzc2FnZSwgd3JpdGVyID0gbWluaW1hbF8xLldyaXRlci5jcmVhdGUoKSkge1xuICAgICAgICBpZiAobWVzc2FnZS5lbnRJZHggIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoOCkuaW50MzIobWVzc2FnZS5lbnRJZHgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLnRleHQgIT09IFwiXCIpIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMTgpLnN0cmluZyhtZXNzYWdlLnRleHQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLmNoYXQgPT09IHRydWUpIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMjQpLmJvb2wobWVzc2FnZS5jaGF0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS50ZXh0YWxsY2hhdCA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigzMikuYm9vbChtZXNzYWdlLnRleHRhbGxjaGF0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH0sXG4gICAgZGVjb2RlKGlucHV0LCBsZW5ndGgpIHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gaW5wdXQgaW5zdGFuY2VvZiBtaW5pbWFsXzEuUmVhZGVyID8gaW5wdXQgOiBuZXcgbWluaW1hbF8xLlJlYWRlcihpbnB1dCk7XG4gICAgICAgIGxldCBlbmQgPSBsZW5ndGggPT09IHVuZGVmaW5lZCA/IHJlYWRlci5sZW4gOiByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNDU1Vzck1zZ1NheVRleHQoKTtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhZyA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgIHN3aXRjaCAodGFnID4+PiAzKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmVudElkeCA9IHJlYWRlci5pbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudGV4dCA9IHJlYWRlci5zdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmNoYXQgPSByZWFkZXIuYm9vbCgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudGV4dGFsbGNoYXQgPSByZWFkZXIuYm9vbCgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICByZWFkZXIuc2tpcFR5cGUodGFnICYgNyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH0sXG4gICAgZnJvbVBhcnRpYWwob2JqZWN0KSB7XG4gICAgICAgIHZhciBfYSwgX2IsIF9jLCBfZDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDQ1NVc3JNc2dTYXlUZXh0KCk7XG4gICAgICAgIG1lc3NhZ2UuZW50SWR4ID0gKF9hID0gb2JqZWN0LmVudElkeCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMDtcbiAgICAgICAgbWVzc2FnZS50ZXh0ID0gKF9iID0gb2JqZWN0LnRleHQpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IFwiXCI7XG4gICAgICAgIG1lc3NhZ2UuY2hhdCA9IChfYyA9IG9iamVjdC5jaGF0KSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiBmYWxzZTtcbiAgICAgICAgbWVzc2FnZS50ZXh0YWxsY2hhdCA9IChfZCA9IG9iamVjdC50ZXh0YWxsY2hhdCkgIT09IG51bGwgJiYgX2QgIT09IHZvaWQgMCA/IF9kIDogZmFsc2U7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbn07XG5mdW5jdGlvbiBjcmVhdGVCYXNlQ0NTVXNyTXNnU2F5VGV4dDIoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZW50SWR4OiAwLFxuICAgICAgICBjaGF0OiBmYWxzZSxcbiAgICAgICAgbXNnTmFtZTogXCJcIixcbiAgICAgICAgcGFyYW1zOiBbXSxcbiAgICAgICAgdGV4dGFsbGNoYXQ6IGZhbHNlXG4gICAgfTtcbn1cbmV4cG9ydHMuQ0NTVXNyTXNnU2F5VGV4dDIgPSB7XG4gICAgZW5jb2RlKG1lc3NhZ2UsIHdyaXRlciA9IG1pbmltYWxfMS5Xcml0ZXIuY3JlYXRlKCkpIHtcbiAgICAgICAgaWYgKG1lc3NhZ2UuZW50SWR4ICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDgpLmludDMyKG1lc3NhZ2UuZW50SWR4KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5jaGF0ID09PSB0cnVlKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDE2KS5ib29sKG1lc3NhZ2UuY2hhdCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UubXNnTmFtZSAhPT0gXCJcIikge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigyNikuc3RyaW5nKG1lc3NhZ2UubXNnTmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCB2IG9mIG1lc3NhZ2UucGFyYW1zKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDM0KS5zdHJpbmcodik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UudGV4dGFsbGNoYXQgPT09IHRydWUpIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoNDApLmJvb2wobWVzc2FnZS50ZXh0YWxsY2hhdCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9LFxuICAgIGRlY29kZShpbnB1dCwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IGlucHV0IGluc3RhbmNlb2YgbWluaW1hbF8xLlJlYWRlciA/IGlucHV0IDogbmV3IG1pbmltYWxfMS5SZWFkZXIoaW5wdXQpO1xuICAgICAgICBsZXQgZW5kID0gbGVuZ3RoID09PSB1bmRlZmluZWQgPyByZWFkZXIubGVuIDogcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDQ1NVc3JNc2dTYXlUZXh0MigpO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZW50SWR4ID0gcmVhZGVyLmludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5jaGF0ID0gcmVhZGVyLmJvb2woKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLm1zZ05hbWUgPSByZWFkZXIuc3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5wYXJhbXMucHVzaChyZWFkZXIuc3RyaW5nKCkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudGV4dGFsbGNoYXQgPSByZWFkZXIuYm9vbCgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICByZWFkZXIuc2tpcFR5cGUodGFnICYgNyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH0sXG4gICAgZnJvbVBhcnRpYWwob2JqZWN0KSB7XG4gICAgICAgIHZhciBfYSwgX2IsIF9jLCBfZCwgX2U7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ0NTVXNyTXNnU2F5VGV4dDIoKTtcbiAgICAgICAgbWVzc2FnZS5lbnRJZHggPSAoX2EgPSBvYmplY3QuZW50SWR4KSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAwO1xuICAgICAgICBtZXNzYWdlLmNoYXQgPSAoX2IgPSBvYmplY3QuY2hhdCkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogZmFsc2U7XG4gICAgICAgIG1lc3NhZ2UubXNnTmFtZSA9IChfYyA9IG9iamVjdC5tc2dOYW1lKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiBcIlwiO1xuICAgICAgICBtZXNzYWdlLnBhcmFtcyA9ICgoX2QgPSBvYmplY3QucGFyYW1zKSA9PT0gbnVsbCB8fCBfZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2QubWFwKGUgPT4gZSkpIHx8IFtdO1xuICAgICAgICBtZXNzYWdlLnRleHRhbGxjaGF0ID0gKF9lID0gb2JqZWN0LnRleHRhbGxjaGF0KSAhPT0gbnVsbCAmJiBfZSAhPT0gdm9pZCAwID8gX2UgOiBmYWxzZTtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxufTtcbmZ1bmN0aW9uIGNyZWF0ZUJhc2VDQ1NVc3JNc2dUZXh0TXNnKCkge1xuICAgIHJldHVybiB7IG1zZ0RzdDogMCwgcGFyYW1zOiBbXSB9O1xufVxuZXhwb3J0cy5DQ1NVc3JNc2dUZXh0TXNnID0ge1xuICAgIGVuY29kZShtZXNzYWdlLCB3cml0ZXIgPSBtaW5pbWFsXzEuV3JpdGVyLmNyZWF0ZSgpKSB7XG4gICAgICAgIGlmIChtZXNzYWdlLm1zZ0RzdCAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig4KS5pbnQzMihtZXNzYWdlLm1zZ0RzdCk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCB2IG9mIG1lc3NhZ2UucGFyYW1zKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDI2KS5zdHJpbmcodik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9LFxuICAgIGRlY29kZShpbnB1dCwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IGlucHV0IGluc3RhbmNlb2YgbWluaW1hbF8xLlJlYWRlciA/IGlucHV0IDogbmV3IG1pbmltYWxfMS5SZWFkZXIoaW5wdXQpO1xuICAgICAgICBsZXQgZW5kID0gbGVuZ3RoID09PSB1bmRlZmluZWQgPyByZWFkZXIubGVuIDogcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDQ1NVc3JNc2dUZXh0TXNnKCk7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBjb25zdCB0YWcgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKHRhZyA+Pj4gMykge1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5tc2dEc3QgPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnBhcmFtcy5wdXNoKHJlYWRlci5zdHJpbmcoKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJlYWRlci5za2lwVHlwZSh0YWcgJiA3KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfSxcbiAgICBmcm9tUGFydGlhbChvYmplY3QpIHtcbiAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDQ1NVc3JNc2dUZXh0TXNnKCk7XG4gICAgICAgIG1lc3NhZ2UubXNnRHN0ID0gKF9hID0gb2JqZWN0Lm1zZ0RzdCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMDtcbiAgICAgICAgbWVzc2FnZS5wYXJhbXMgPSAoKF9iID0gb2JqZWN0LnBhcmFtcykgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLm1hcChlID0+IGUpKSB8fCBbXTtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxufTtcbmZ1bmN0aW9uIGNyZWF0ZUJhc2VDQ1NVc3JNc2dIdWRNc2coKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgY2hhbm5lbDogMCxcbiAgICAgICAgcG9zOiB1bmRlZmluZWQsXG4gICAgICAgIGNscjE6IHVuZGVmaW5lZCxcbiAgICAgICAgY2xyMjogdW5kZWZpbmVkLFxuICAgICAgICBlZmZlY3Q6IDAsXG4gICAgICAgIGZhZGVJblRpbWU6IDAsXG4gICAgICAgIGZhZGVPdXRUaW1lOiAwLFxuICAgICAgICBob2xkVGltZTogMCxcbiAgICAgICAgZnhUaW1lOiAwLFxuICAgICAgICB0ZXh0OiBcIlwiXG4gICAgfTtcbn1cbmV4cG9ydHMuQ0NTVXNyTXNnSHVkTXNnID0ge1xuICAgIGVuY29kZShtZXNzYWdlLCB3cml0ZXIgPSBtaW5pbWFsXzEuV3JpdGVyLmNyZWF0ZSgpKSB7XG4gICAgICAgIGlmIChtZXNzYWdlLmNoYW5uZWwgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoOCkuaW50MzIobWVzc2FnZS5jaGFubmVsKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5wb3MgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbmV0bWVzc2FnZXNfMS5DTXNnVmVjdG9yMkQuZW5jb2RlKG1lc3NhZ2UucG9zLCB3cml0ZXIudWludDMyKDE4KS5mb3JrKCkpLmxkZWxpbSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLmNscjEgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbmV0bWVzc2FnZXNfMS5DTXNnUkdCQS5lbmNvZGUobWVzc2FnZS5jbHIxLCB3cml0ZXIudWludDMyKDI2KS5mb3JrKCkpLmxkZWxpbSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLmNscjIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbmV0bWVzc2FnZXNfMS5DTXNnUkdCQS5lbmNvZGUobWVzc2FnZS5jbHIyLCB3cml0ZXIudWludDMyKDM0KS5mb3JrKCkpLmxkZWxpbSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLmVmZmVjdCAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig0MCkuaW50MzIobWVzc2FnZS5lZmZlY3QpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLmZhZGVJblRpbWUgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoNTMpLmZsb2F0KG1lc3NhZ2UuZmFkZUluVGltZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UuZmFkZU91dFRpbWUgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoNjEpLmZsb2F0KG1lc3NhZ2UuZmFkZU91dFRpbWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLmhvbGRUaW1lICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDc3KS5mbG9hdChtZXNzYWdlLmhvbGRUaW1lKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5meFRpbWUgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoODUpLmZsb2F0KG1lc3NhZ2UuZnhUaW1lKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS50ZXh0ICE9PSBcIlwiKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDkwKS5zdHJpbmcobWVzc2FnZS50ZXh0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH0sXG4gICAgZGVjb2RlKGlucHV0LCBsZW5ndGgpIHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gaW5wdXQgaW5zdGFuY2VvZiBtaW5pbWFsXzEuUmVhZGVyID8gaW5wdXQgOiBuZXcgbWluaW1hbF8xLlJlYWRlcihpbnB1dCk7XG4gICAgICAgIGxldCBlbmQgPSBsZW5ndGggPT09IHVuZGVmaW5lZCA/IHJlYWRlci5sZW4gOiByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNDU1Vzck1zZ0h1ZE1zZygpO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuY2hhbm5lbCA9IHJlYWRlci5pbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UucG9zID0gbmV0bWVzc2FnZXNfMS5DTXNnVmVjdG9yMkQuZGVjb2RlKHJlYWRlciwgcmVhZGVyLnVpbnQzMigpKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmNscjEgPSBuZXRtZXNzYWdlc18xLkNNc2dSR0JBLmRlY29kZShyZWFkZXIsIHJlYWRlci51aW50MzIoKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5jbHIyID0gbmV0bWVzc2FnZXNfMS5DTXNnUkdCQS5kZWNvZGUocmVhZGVyLCByZWFkZXIudWludDMyKCkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZWZmZWN0ID0gcmVhZGVyLmludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5mYWRlSW5UaW1lID0gcmVhZGVyLmZsb2F0KCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNzpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5mYWRlT3V0VGltZSA9IHJlYWRlci5mbG9hdCgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDk6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuaG9sZFRpbWUgPSByZWFkZXIuZmxvYXQoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAxMDpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5meFRpbWUgPSByZWFkZXIuZmxvYXQoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAxMTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS50ZXh0ID0gcmVhZGVyLnN0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICByZWFkZXIuc2tpcFR5cGUodGFnICYgNyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH0sXG4gICAgZnJvbVBhcnRpYWwob2JqZWN0KSB7XG4gICAgICAgIHZhciBfYSwgX2IsIF9jLCBfZCwgX2UsIF9mLCBfZztcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDQ1NVc3JNc2dIdWRNc2coKTtcbiAgICAgICAgbWVzc2FnZS5jaGFubmVsID0gKF9hID0gb2JqZWN0LmNoYW5uZWwpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IDA7XG4gICAgICAgIG1lc3NhZ2UucG9zID1cbiAgICAgICAgICAgIG9iamVjdC5wb3MgIT09IHVuZGVmaW5lZCAmJiBvYmplY3QucG9zICE9PSBudWxsXG4gICAgICAgICAgICAgICAgPyBuZXRtZXNzYWdlc18xLkNNc2dWZWN0b3IyRC5mcm9tUGFydGlhbChvYmplY3QucG9zKVxuICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgICBtZXNzYWdlLmNscjEgPVxuICAgICAgICAgICAgb2JqZWN0LmNscjEgIT09IHVuZGVmaW5lZCAmJiBvYmplY3QuY2xyMSAhPT0gbnVsbFxuICAgICAgICAgICAgICAgID8gbmV0bWVzc2FnZXNfMS5DTXNnUkdCQS5mcm9tUGFydGlhbChvYmplY3QuY2xyMSlcbiAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgICAgbWVzc2FnZS5jbHIyID1cbiAgICAgICAgICAgIG9iamVjdC5jbHIyICE9PSB1bmRlZmluZWQgJiYgb2JqZWN0LmNscjIgIT09IG51bGxcbiAgICAgICAgICAgICAgICA/IG5ldG1lc3NhZ2VzXzEuQ01zZ1JHQkEuZnJvbVBhcnRpYWwob2JqZWN0LmNscjIpXG4gICAgICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICAgIG1lc3NhZ2UuZWZmZWN0ID0gKF9iID0gb2JqZWN0LmVmZmVjdCkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogMDtcbiAgICAgICAgbWVzc2FnZS5mYWRlSW5UaW1lID0gKF9jID0gb2JqZWN0LmZhZGVJblRpbWUpICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IDA7XG4gICAgICAgIG1lc3NhZ2UuZmFkZU91dFRpbWUgPSAoX2QgPSBvYmplY3QuZmFkZU91dFRpbWUpICE9PSBudWxsICYmIF9kICE9PSB2b2lkIDAgPyBfZCA6IDA7XG4gICAgICAgIG1lc3NhZ2UuaG9sZFRpbWUgPSAoX2UgPSBvYmplY3QuaG9sZFRpbWUpICE9PSBudWxsICYmIF9lICE9PSB2b2lkIDAgPyBfZSA6IDA7XG4gICAgICAgIG1lc3NhZ2UuZnhUaW1lID0gKF9mID0gb2JqZWN0LmZ4VGltZSkgIT09IG51bGwgJiYgX2YgIT09IHZvaWQgMCA/IF9mIDogMDtcbiAgICAgICAgbWVzc2FnZS50ZXh0ID0gKF9nID0gb2JqZWN0LnRleHQpICE9PSBudWxsICYmIF9nICE9PSB2b2lkIDAgPyBfZyA6IFwiXCI7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbn07XG5mdW5jdGlvbiBjcmVhdGVCYXNlQ0NTVXNyTXNnU2hha2UoKSB7XG4gICAgcmV0dXJuIHsgY29tbWFuZDogMCwgbG9jYWxBbXBsaXR1ZGU6IDAsIGZyZXF1ZW5jeTogMCwgZHVyYXRpb246IDAgfTtcbn1cbmV4cG9ydHMuQ0NTVXNyTXNnU2hha2UgPSB7XG4gICAgZW5jb2RlKG1lc3NhZ2UsIHdyaXRlciA9IG1pbmltYWxfMS5Xcml0ZXIuY3JlYXRlKCkpIHtcbiAgICAgICAgaWYgKG1lc3NhZ2UuY29tbWFuZCAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig4KS5pbnQzMihtZXNzYWdlLmNvbW1hbmQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLmxvY2FsQW1wbGl0dWRlICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDIxKS5mbG9hdChtZXNzYWdlLmxvY2FsQW1wbGl0dWRlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5mcmVxdWVuY3kgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMjkpLmZsb2F0KG1lc3NhZ2UuZnJlcXVlbmN5KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5kdXJhdGlvbiAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigzNykuZmxvYXQobWVzc2FnZS5kdXJhdGlvbik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9LFxuICAgIGRlY29kZShpbnB1dCwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IGlucHV0IGluc3RhbmNlb2YgbWluaW1hbF8xLlJlYWRlciA/IGlucHV0IDogbmV3IG1pbmltYWxfMS5SZWFkZXIoaW5wdXQpO1xuICAgICAgICBsZXQgZW5kID0gbGVuZ3RoID09PSB1bmRlZmluZWQgPyByZWFkZXIubGVuIDogcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDQ1NVc3JNc2dTaGFrZSgpO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuY29tbWFuZCA9IHJlYWRlci5pbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UubG9jYWxBbXBsaXR1ZGUgPSByZWFkZXIuZmxvYXQoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmZyZXF1ZW5jeSA9IHJlYWRlci5mbG9hdCgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZHVyYXRpb24gPSByZWFkZXIuZmxvYXQoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmVhZGVyLnNraXBUeXBlKHRhZyAmIDcpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9LFxuICAgIGZyb21QYXJ0aWFsKG9iamVjdCkge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYywgX2Q7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ0NTVXNyTXNnU2hha2UoKTtcbiAgICAgICAgbWVzc2FnZS5jb21tYW5kID0gKF9hID0gb2JqZWN0LmNvbW1hbmQpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IDA7XG4gICAgICAgIG1lc3NhZ2UubG9jYWxBbXBsaXR1ZGUgPSAoX2IgPSBvYmplY3QubG9jYWxBbXBsaXR1ZGUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IDA7XG4gICAgICAgIG1lc3NhZ2UuZnJlcXVlbmN5ID0gKF9jID0gb2JqZWN0LmZyZXF1ZW5jeSkgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogMDtcbiAgICAgICAgbWVzc2FnZS5kdXJhdGlvbiA9IChfZCA9IG9iamVjdC5kdXJhdGlvbikgIT09IG51bGwgJiYgX2QgIT09IHZvaWQgMCA/IF9kIDogMDtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxufTtcbmZ1bmN0aW9uIGNyZWF0ZUJhc2VDQ1NVc3JNc2dGYWRlKCkge1xuICAgIHJldHVybiB7IGR1cmF0aW9uOiAwLCBob2xkVGltZTogMCwgZmxhZ3M6IDAsIGNscjogdW5kZWZpbmVkIH07XG59XG5leHBvcnRzLkNDU1Vzck1zZ0ZhZGUgPSB7XG4gICAgZW5jb2RlKG1lc3NhZ2UsIHdyaXRlciA9IG1pbmltYWxfMS5Xcml0ZXIuY3JlYXRlKCkpIHtcbiAgICAgICAgaWYgKG1lc3NhZ2UuZHVyYXRpb24gIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoOCkuaW50MzIobWVzc2FnZS5kdXJhdGlvbik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UuaG9sZFRpbWUgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMTYpLmludDMyKG1lc3NhZ2UuaG9sZFRpbWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLmZsYWdzICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDI0KS5pbnQzMihtZXNzYWdlLmZsYWdzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5jbHIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbmV0bWVzc2FnZXNfMS5DTXNnUkdCQS5lbmNvZGUobWVzc2FnZS5jbHIsIHdyaXRlci51aW50MzIoMzQpLmZvcmsoKSkubGRlbGltKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9LFxuICAgIGRlY29kZShpbnB1dCwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IGlucHV0IGluc3RhbmNlb2YgbWluaW1hbF8xLlJlYWRlciA/IGlucHV0IDogbmV3IG1pbmltYWxfMS5SZWFkZXIoaW5wdXQpO1xuICAgICAgICBsZXQgZW5kID0gbGVuZ3RoID09PSB1bmRlZmluZWQgPyByZWFkZXIubGVuIDogcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDQ1NVc3JNc2dGYWRlKCk7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBjb25zdCB0YWcgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKHRhZyA+Pj4gMykge1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5kdXJhdGlvbiA9IHJlYWRlci5pbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuaG9sZFRpbWUgPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmZsYWdzID0gcmVhZGVyLmludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5jbHIgPSBuZXRtZXNzYWdlc18xLkNNc2dSR0JBLmRlY29kZShyZWFkZXIsIHJlYWRlci51aW50MzIoKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJlYWRlci5za2lwVHlwZSh0YWcgJiA3KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfSxcbiAgICBmcm9tUGFydGlhbChvYmplY3QpIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2M7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ0NTVXNyTXNnRmFkZSgpO1xuICAgICAgICBtZXNzYWdlLmR1cmF0aW9uID0gKF9hID0gb2JqZWN0LmR1cmF0aW9uKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAwO1xuICAgICAgICBtZXNzYWdlLmhvbGRUaW1lID0gKF9iID0gb2JqZWN0LmhvbGRUaW1lKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAwO1xuICAgICAgICBtZXNzYWdlLmZsYWdzID0gKF9jID0gb2JqZWN0LmZsYWdzKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiAwO1xuICAgICAgICBtZXNzYWdlLmNsciA9XG4gICAgICAgICAgICBvYmplY3QuY2xyICE9PSB1bmRlZmluZWQgJiYgb2JqZWN0LmNsciAhPT0gbnVsbFxuICAgICAgICAgICAgICAgID8gbmV0bWVzc2FnZXNfMS5DTXNnUkdCQS5mcm9tUGFydGlhbChvYmplY3QuY2xyKVxuICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG59O1xuZnVuY3Rpb24gY3JlYXRlQmFzZUNDU1Vzck1zZ1J1bWJsZSgpIHtcbiAgICByZXR1cm4geyBpbmRleDogMCwgZGF0YTogMCwgZmxhZ3M6IDAgfTtcbn1cbmV4cG9ydHMuQ0NTVXNyTXNnUnVtYmxlID0ge1xuICAgIGVuY29kZShtZXNzYWdlLCB3cml0ZXIgPSBtaW5pbWFsXzEuV3JpdGVyLmNyZWF0ZSgpKSB7XG4gICAgICAgIGlmIChtZXNzYWdlLmluZGV4ICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDgpLmludDMyKG1lc3NhZ2UuaW5kZXgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLmRhdGEgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMTYpLmludDMyKG1lc3NhZ2UuZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UuZmxhZ3MgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMjQpLmludDMyKG1lc3NhZ2UuZmxhZ3MpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfSxcbiAgICBkZWNvZGUoaW5wdXQsIGxlbmd0aCkge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBpbnB1dCBpbnN0YW5jZW9mIG1pbmltYWxfMS5SZWFkZXIgPyBpbnB1dCA6IG5ldyBtaW5pbWFsXzEuUmVhZGVyKGlucHV0KTtcbiAgICAgICAgbGV0IGVuZCA9IGxlbmd0aCA9PT0gdW5kZWZpbmVkID8gcmVhZGVyLmxlbiA6IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ0NTVXNyTXNnUnVtYmxlKCk7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBjb25zdCB0YWcgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKHRhZyA+Pj4gMykge1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5pbmRleCA9IHJlYWRlci5pbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZGF0YSA9IHJlYWRlci5pbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZmxhZ3MgPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmVhZGVyLnNraXBUeXBlKHRhZyAmIDcpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9LFxuICAgIGZyb21QYXJ0aWFsKG9iamVjdCkge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYztcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDQ1NVc3JNc2dSdW1ibGUoKTtcbiAgICAgICAgbWVzc2FnZS5pbmRleCA9IChfYSA9IG9iamVjdC5pbmRleCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMDtcbiAgICAgICAgbWVzc2FnZS5kYXRhID0gKF9iID0gb2JqZWN0LmRhdGEpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IDA7XG4gICAgICAgIG1lc3NhZ2UuZmxhZ3MgPSAoX2MgPSBvYmplY3QuZmxhZ3MpICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IDA7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbn07XG5mdW5jdGlvbiBjcmVhdGVCYXNlQ0NTVXNyTXNnQ2xvc2VDYXB0aW9uKCkge1xuICAgIHJldHVybiB7IGhhc2g6IDAsIGR1cmF0aW9uOiAwLCBmcm9tUGxheWVyOiBmYWxzZSwgY2N0b2tlbjogXCJcIiB9O1xufVxuZXhwb3J0cy5DQ1NVc3JNc2dDbG9zZUNhcHRpb24gPSB7XG4gICAgZW5jb2RlKG1lc3NhZ2UsIHdyaXRlciA9IG1pbmltYWxfMS5Xcml0ZXIuY3JlYXRlKCkpIHtcbiAgICAgICAgaWYgKG1lc3NhZ2UuaGFzaCAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig4KS51aW50MzIobWVzc2FnZS5oYXNoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5kdXJhdGlvbiAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigxNikuaW50MzIobWVzc2FnZS5kdXJhdGlvbik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UuZnJvbVBsYXllciA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigyNCkuYm9vbChtZXNzYWdlLmZyb21QbGF5ZXIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLmNjdG9rZW4gIT09IFwiXCIpIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMzQpLnN0cmluZyhtZXNzYWdlLmNjdG9rZW4pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfSxcbiAgICBkZWNvZGUoaW5wdXQsIGxlbmd0aCkge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBpbnB1dCBpbnN0YW5jZW9mIG1pbmltYWxfMS5SZWFkZXIgPyBpbnB1dCA6IG5ldyBtaW5pbWFsXzEuUmVhZGVyKGlucHV0KTtcbiAgICAgICAgbGV0IGVuZCA9IGxlbmd0aCA9PT0gdW5kZWZpbmVkID8gcmVhZGVyLmxlbiA6IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ0NTVXNyTXNnQ2xvc2VDYXB0aW9uKCk7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBjb25zdCB0YWcgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKHRhZyA+Pj4gMykge1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5oYXNoID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZHVyYXRpb24gPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmZyb21QbGF5ZXIgPSByZWFkZXIuYm9vbCgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuY2N0b2tlbiA9IHJlYWRlci5zdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmVhZGVyLnNraXBUeXBlKHRhZyAmIDcpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9LFxuICAgIGZyb21QYXJ0aWFsKG9iamVjdCkge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYywgX2Q7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ0NTVXNyTXNnQ2xvc2VDYXB0aW9uKCk7XG4gICAgICAgIG1lc3NhZ2UuaGFzaCA9IChfYSA9IG9iamVjdC5oYXNoKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAwO1xuICAgICAgICBtZXNzYWdlLmR1cmF0aW9uID0gKF9iID0gb2JqZWN0LmR1cmF0aW9uKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAwO1xuICAgICAgICBtZXNzYWdlLmZyb21QbGF5ZXIgPSAoX2MgPSBvYmplY3QuZnJvbVBsYXllcikgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogZmFsc2U7XG4gICAgICAgIG1lc3NhZ2UuY2N0b2tlbiA9IChfZCA9IG9iamVjdC5jY3Rva2VuKSAhPT0gbnVsbCAmJiBfZCAhPT0gdm9pZCAwID8gX2QgOiBcIlwiO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG59O1xuZnVuY3Rpb24gY3JlYXRlQmFzZUNDU1Vzck1zZ0Nsb3NlQ2FwdGlvbkRpcmVjdCgpIHtcbiAgICByZXR1cm4geyBoYXNoOiAwLCBkdXJhdGlvbjogMCwgZnJvbVBsYXllcjogZmFsc2UgfTtcbn1cbmV4cG9ydHMuQ0NTVXNyTXNnQ2xvc2VDYXB0aW9uRGlyZWN0ID0ge1xuICAgIGVuY29kZShtZXNzYWdlLCB3cml0ZXIgPSBtaW5pbWFsXzEuV3JpdGVyLmNyZWF0ZSgpKSB7XG4gICAgICAgIGlmIChtZXNzYWdlLmhhc2ggIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoOCkudWludDMyKG1lc3NhZ2UuaGFzaCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UuZHVyYXRpb24gIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMTYpLmludDMyKG1lc3NhZ2UuZHVyYXRpb24pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLmZyb21QbGF5ZXIgPT09IHRydWUpIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMjQpLmJvb2wobWVzc2FnZS5mcm9tUGxheWVyKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH0sXG4gICAgZGVjb2RlKGlucHV0LCBsZW5ndGgpIHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gaW5wdXQgaW5zdGFuY2VvZiBtaW5pbWFsXzEuUmVhZGVyID8gaW5wdXQgOiBuZXcgbWluaW1hbF8xLlJlYWRlcihpbnB1dCk7XG4gICAgICAgIGxldCBlbmQgPSBsZW5ndGggPT09IHVuZGVmaW5lZCA/IHJlYWRlci5sZW4gOiByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNDU1Vzck1zZ0Nsb3NlQ2FwdGlvbkRpcmVjdCgpO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuaGFzaCA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmR1cmF0aW9uID0gcmVhZGVyLmludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5mcm9tUGxheWVyID0gcmVhZGVyLmJvb2woKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmVhZGVyLnNraXBUeXBlKHRhZyAmIDcpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9LFxuICAgIGZyb21QYXJ0aWFsKG9iamVjdCkge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYztcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDQ1NVc3JNc2dDbG9zZUNhcHRpb25EaXJlY3QoKTtcbiAgICAgICAgbWVzc2FnZS5oYXNoID0gKF9hID0gb2JqZWN0Lmhhc2gpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IDA7XG4gICAgICAgIG1lc3NhZ2UuZHVyYXRpb24gPSAoX2IgPSBvYmplY3QuZHVyYXRpb24pICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IDA7XG4gICAgICAgIG1lc3NhZ2UuZnJvbVBsYXllciA9IChfYyA9IG9iamVjdC5mcm9tUGxheWVyKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiBmYWxzZTtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxufTtcbmZ1bmN0aW9uIGNyZWF0ZUJhc2VDQ1NVc3JNc2dTZW5kQXVkaW8oKSB7XG4gICAgcmV0dXJuIHsgcmFkaW9Tb3VuZDogXCJcIiB9O1xufVxuZXhwb3J0cy5DQ1NVc3JNc2dTZW5kQXVkaW8gPSB7XG4gICAgZW5jb2RlKG1lc3NhZ2UsIHdyaXRlciA9IG1pbmltYWxfMS5Xcml0ZXIuY3JlYXRlKCkpIHtcbiAgICAgICAgaWYgKG1lc3NhZ2UucmFkaW9Tb3VuZCAhPT0gXCJcIikge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigxMCkuc3RyaW5nKG1lc3NhZ2UucmFkaW9Tb3VuZCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9LFxuICAgIGRlY29kZShpbnB1dCwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IGlucHV0IGluc3RhbmNlb2YgbWluaW1hbF8xLlJlYWRlciA/IGlucHV0IDogbmV3IG1pbmltYWxfMS5SZWFkZXIoaW5wdXQpO1xuICAgICAgICBsZXQgZW5kID0gbGVuZ3RoID09PSB1bmRlZmluZWQgPyByZWFkZXIubGVuIDogcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDQ1NVc3JNc2dTZW5kQXVkaW8oKTtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhZyA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgIHN3aXRjaCAodGFnID4+PiAzKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnJhZGlvU291bmQgPSByZWFkZXIuc3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJlYWRlci5za2lwVHlwZSh0YWcgJiA3KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfSxcbiAgICBmcm9tUGFydGlhbChvYmplY3QpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNDU1Vzck1zZ1NlbmRBdWRpbygpO1xuICAgICAgICBtZXNzYWdlLnJhZGlvU291bmQgPSAoX2EgPSBvYmplY3QucmFkaW9Tb3VuZCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogXCJcIjtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxufTtcbmZ1bmN0aW9uIGNyZWF0ZUJhc2VDQ1NVc3JNc2dSYXdBdWRpbygpIHtcbiAgICByZXR1cm4geyBwaXRjaDogMCwgZW50aWR4OiAwLCBkdXJhdGlvbjogMCwgdm9pY2VGaWxlbmFtZTogXCJcIiB9O1xufVxuZXhwb3J0cy5DQ1NVc3JNc2dSYXdBdWRpbyA9IHtcbiAgICBlbmNvZGUobWVzc2FnZSwgd3JpdGVyID0gbWluaW1hbF8xLldyaXRlci5jcmVhdGUoKSkge1xuICAgICAgICBpZiAobWVzc2FnZS5waXRjaCAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig4KS5pbnQzMihtZXNzYWdlLnBpdGNoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5lbnRpZHggIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMTYpLmludDMyKG1lc3NhZ2UuZW50aWR4KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5kdXJhdGlvbiAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigyOSkuZmxvYXQobWVzc2FnZS5kdXJhdGlvbik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2Uudm9pY2VGaWxlbmFtZSAhPT0gXCJcIikge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigzNCkuc3RyaW5nKG1lc3NhZ2Uudm9pY2VGaWxlbmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9LFxuICAgIGRlY29kZShpbnB1dCwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IGlucHV0IGluc3RhbmNlb2YgbWluaW1hbF8xLlJlYWRlciA/IGlucHV0IDogbmV3IG1pbmltYWxfMS5SZWFkZXIoaW5wdXQpO1xuICAgICAgICBsZXQgZW5kID0gbGVuZ3RoID09PSB1bmRlZmluZWQgPyByZWFkZXIubGVuIDogcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDQ1NVc3JNc2dSYXdBdWRpbygpO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UucGl0Y2ggPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmVudGlkeCA9IHJlYWRlci5pbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZHVyYXRpb24gPSByZWFkZXIuZmxvYXQoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnZvaWNlRmlsZW5hbWUgPSByZWFkZXIuc3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJlYWRlci5za2lwVHlwZSh0YWcgJiA3KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfSxcbiAgICBmcm9tUGFydGlhbChvYmplY3QpIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2MsIF9kO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNDU1Vzck1zZ1Jhd0F1ZGlvKCk7XG4gICAgICAgIG1lc3NhZ2UucGl0Y2ggPSAoX2EgPSBvYmplY3QucGl0Y2gpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IDA7XG4gICAgICAgIG1lc3NhZ2UuZW50aWR4ID0gKF9iID0gb2JqZWN0LmVudGlkeCkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogMDtcbiAgICAgICAgbWVzc2FnZS5kdXJhdGlvbiA9IChfYyA9IG9iamVjdC5kdXJhdGlvbikgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogMDtcbiAgICAgICAgbWVzc2FnZS52b2ljZUZpbGVuYW1lID0gKF9kID0gb2JqZWN0LnZvaWNlRmlsZW5hbWUpICE9PSBudWxsICYmIF9kICE9PSB2b2lkIDAgPyBfZCA6IFwiXCI7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbn07XG5mdW5jdGlvbiBjcmVhdGVCYXNlQ0NTVXNyTXNnVm9pY2VNYXNrKCkge1xuICAgIHJldHVybiB7IHBsYXllck1hc2tzOiBbXSwgcGxheWVyTW9kRW5hYmxlOiBmYWxzZSB9O1xufVxuZXhwb3J0cy5DQ1NVc3JNc2dWb2ljZU1hc2sgPSB7XG4gICAgZW5jb2RlKG1lc3NhZ2UsIHdyaXRlciA9IG1pbmltYWxfMS5Xcml0ZXIuY3JlYXRlKCkpIHtcbiAgICAgICAgZm9yIChjb25zdCB2IG9mIG1lc3NhZ2UucGxheWVyTWFza3MpIHtcbiAgICAgICAgICAgIGV4cG9ydHMuQ0NTVXNyTXNnVm9pY2VNYXNrX1BsYXllck1hc2suZW5jb2RlKHYsIHdyaXRlci51aW50MzIoMTApLmZvcmsoKSkubGRlbGltKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UucGxheWVyTW9kRW5hYmxlID09PSB0cnVlKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDE2KS5ib29sKG1lc3NhZ2UucGxheWVyTW9kRW5hYmxlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH0sXG4gICAgZGVjb2RlKGlucHV0LCBsZW5ndGgpIHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gaW5wdXQgaW5zdGFuY2VvZiBtaW5pbWFsXzEuUmVhZGVyID8gaW5wdXQgOiBuZXcgbWluaW1hbF8xLlJlYWRlcihpbnB1dCk7XG4gICAgICAgIGxldCBlbmQgPSBsZW5ndGggPT09IHVuZGVmaW5lZCA/IHJlYWRlci5sZW4gOiByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNDU1Vzck1zZ1ZvaWNlTWFzaygpO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UucGxheWVyTWFza3MucHVzaChleHBvcnRzLkNDU1Vzck1zZ1ZvaWNlTWFza19QbGF5ZXJNYXNrLmRlY29kZShyZWFkZXIsIHJlYWRlci51aW50MzIoKSkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UucGxheWVyTW9kRW5hYmxlID0gcmVhZGVyLmJvb2woKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmVhZGVyLnNraXBUeXBlKHRhZyAmIDcpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9LFxuICAgIGZyb21QYXJ0aWFsKG9iamVjdCkge1xuICAgICAgICB2YXIgX2EsIF9iO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNDU1Vzck1zZ1ZvaWNlTWFzaygpO1xuICAgICAgICBtZXNzYWdlLnBsYXllck1hc2tzID1cbiAgICAgICAgICAgICgoX2EgPSBvYmplY3QucGxheWVyTWFza3MpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5tYXAoZSA9PiBleHBvcnRzLkNDU1Vzck1zZ1ZvaWNlTWFza19QbGF5ZXJNYXNrLmZyb21QYXJ0aWFsKGUpKSkgfHwgW107XG4gICAgICAgIG1lc3NhZ2UucGxheWVyTW9kRW5hYmxlID0gKF9iID0gb2JqZWN0LnBsYXllck1vZEVuYWJsZSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogZmFsc2U7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbn07XG5mdW5jdGlvbiBjcmVhdGVCYXNlQ0NTVXNyTXNnVm9pY2VNYXNrX1BsYXllck1hc2soKSB7XG4gICAgcmV0dXJuIHsgZ2FtZVJ1bGVzTWFzazogMCwgYmFuTWFza3M6IDAgfTtcbn1cbmV4cG9ydHMuQ0NTVXNyTXNnVm9pY2VNYXNrX1BsYXllck1hc2sgPSB7XG4gICAgZW5jb2RlKG1lc3NhZ2UsIHdyaXRlciA9IG1pbmltYWxfMS5Xcml0ZXIuY3JlYXRlKCkpIHtcbiAgICAgICAgaWYgKG1lc3NhZ2UuZ2FtZVJ1bGVzTWFzayAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig4KS5pbnQzMihtZXNzYWdlLmdhbWVSdWxlc01hc2spO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLmJhbk1hc2tzICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDE2KS5pbnQzMihtZXNzYWdlLmJhbk1hc2tzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH0sXG4gICAgZGVjb2RlKGlucHV0LCBsZW5ndGgpIHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gaW5wdXQgaW5zdGFuY2VvZiBtaW5pbWFsXzEuUmVhZGVyID8gaW5wdXQgOiBuZXcgbWluaW1hbF8xLlJlYWRlcihpbnB1dCk7XG4gICAgICAgIGxldCBlbmQgPSBsZW5ndGggPT09IHVuZGVmaW5lZCA/IHJlYWRlci5sZW4gOiByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNDU1Vzck1zZ1ZvaWNlTWFza19QbGF5ZXJNYXNrKCk7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBjb25zdCB0YWcgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKHRhZyA+Pj4gMykge1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5nYW1lUnVsZXNNYXNrID0gcmVhZGVyLmludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5iYW5NYXNrcyA9IHJlYWRlci5pbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICByZWFkZXIuc2tpcFR5cGUodGFnICYgNyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH0sXG4gICAgZnJvbVBhcnRpYWwob2JqZWN0KSB7XG4gICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ0NTVXNyTXNnVm9pY2VNYXNrX1BsYXllck1hc2soKTtcbiAgICAgICAgbWVzc2FnZS5nYW1lUnVsZXNNYXNrID0gKF9hID0gb2JqZWN0LmdhbWVSdWxlc01hc2spICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IDA7XG4gICAgICAgIG1lc3NhZ2UuYmFuTWFza3MgPSAoX2IgPSBvYmplY3QuYmFuTWFza3MpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IDA7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbn07XG5mdW5jdGlvbiBjcmVhdGVCYXNlQ0NTVXNyTXNnRGFtYWdlKCkge1xuICAgIHJldHVybiB7IGFtb3VudDogMCwgaW5mbGljdG9yV29ybGRQb3M6IHVuZGVmaW5lZCwgdmljdGltRW50aW5kZXg6IDAgfTtcbn1cbmV4cG9ydHMuQ0NTVXNyTXNnRGFtYWdlID0ge1xuICAgIGVuY29kZShtZXNzYWdlLCB3cml0ZXIgPSBtaW5pbWFsXzEuV3JpdGVyLmNyZWF0ZSgpKSB7XG4gICAgICAgIGlmIChtZXNzYWdlLmFtb3VudCAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig4KS5pbnQzMihtZXNzYWdlLmFtb3VudCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UuaW5mbGljdG9yV29ybGRQb3MgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbmV0bWVzc2FnZXNfMS5DTXNnVmVjdG9yLmVuY29kZShtZXNzYWdlLmluZmxpY3RvcldvcmxkUG9zLCB3cml0ZXIudWludDMyKDE4KS5mb3JrKCkpLmxkZWxpbSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLnZpY3RpbUVudGluZGV4ICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDI0KS5pbnQzMihtZXNzYWdlLnZpY3RpbUVudGluZGV4KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH0sXG4gICAgZGVjb2RlKGlucHV0LCBsZW5ndGgpIHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gaW5wdXQgaW5zdGFuY2VvZiBtaW5pbWFsXzEuUmVhZGVyID8gaW5wdXQgOiBuZXcgbWluaW1hbF8xLlJlYWRlcihpbnB1dCk7XG4gICAgICAgIGxldCBlbmQgPSBsZW5ndGggPT09IHVuZGVmaW5lZCA/IHJlYWRlci5sZW4gOiByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNDU1Vzck1zZ0RhbWFnZSgpO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuYW1vdW50ID0gcmVhZGVyLmludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5pbmZsaWN0b3JXb3JsZFBvcyA9IG5ldG1lc3NhZ2VzXzEuQ01zZ1ZlY3Rvci5kZWNvZGUocmVhZGVyLCByZWFkZXIudWludDMyKCkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudmljdGltRW50aW5kZXggPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmVhZGVyLnNraXBUeXBlKHRhZyAmIDcpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9LFxuICAgIGZyb21QYXJ0aWFsKG9iamVjdCkge1xuICAgICAgICB2YXIgX2EsIF9iO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNDU1Vzck1zZ0RhbWFnZSgpO1xuICAgICAgICBtZXNzYWdlLmFtb3VudCA9IChfYSA9IG9iamVjdC5hbW91bnQpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IDA7XG4gICAgICAgIG1lc3NhZ2UuaW5mbGljdG9yV29ybGRQb3MgPVxuICAgICAgICAgICAgb2JqZWN0LmluZmxpY3RvcldvcmxkUG9zICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICAgICBvYmplY3QuaW5mbGljdG9yV29ybGRQb3MgIT09IG51bGxcbiAgICAgICAgICAgICAgICA/IG5ldG1lc3NhZ2VzXzEuQ01zZ1ZlY3Rvci5mcm9tUGFydGlhbChvYmplY3QuaW5mbGljdG9yV29ybGRQb3MpXG4gICAgICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICAgIG1lc3NhZ2UudmljdGltRW50aW5kZXggPSAoX2IgPSBvYmplY3QudmljdGltRW50aW5kZXgpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IDA7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbn07XG5mdW5jdGlvbiBjcmVhdGVCYXNlQ0NTVXNyTXNnUmFkaW9UZXh0KCkge1xuICAgIHJldHVybiB7IG1zZ0RzdDogMCwgY2xpZW50OiAwLCBtc2dOYW1lOiBcIlwiLCBwYXJhbXM6IFtdIH07XG59XG5leHBvcnRzLkNDU1Vzck1zZ1JhZGlvVGV4dCA9IHtcbiAgICBlbmNvZGUobWVzc2FnZSwgd3JpdGVyID0gbWluaW1hbF8xLldyaXRlci5jcmVhdGUoKSkge1xuICAgICAgICBpZiAobWVzc2FnZS5tc2dEc3QgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoOCkuaW50MzIobWVzc2FnZS5tc2dEc3QpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLmNsaWVudCAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigxNikuaW50MzIobWVzc2FnZS5jbGllbnQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLm1zZ05hbWUgIT09IFwiXCIpIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMjYpLnN0cmluZyhtZXNzYWdlLm1zZ05hbWUpO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3QgdiBvZiBtZXNzYWdlLnBhcmFtcykge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigzNCkuc3RyaW5nKHYpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfSxcbiAgICBkZWNvZGUoaW5wdXQsIGxlbmd0aCkge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBpbnB1dCBpbnN0YW5jZW9mIG1pbmltYWxfMS5SZWFkZXIgPyBpbnB1dCA6IG5ldyBtaW5pbWFsXzEuUmVhZGVyKGlucHV0KTtcbiAgICAgICAgbGV0IGVuZCA9IGxlbmd0aCA9PT0gdW5kZWZpbmVkID8gcmVhZGVyLmxlbiA6IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ0NTVXNyTXNnUmFkaW9UZXh0KCk7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBjb25zdCB0YWcgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKHRhZyA+Pj4gMykge1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5tc2dEc3QgPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmNsaWVudCA9IHJlYWRlci5pbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UubXNnTmFtZSA9IHJlYWRlci5zdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnBhcmFtcy5wdXNoKHJlYWRlci5zdHJpbmcoKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJlYWRlci5za2lwVHlwZSh0YWcgJiA3KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfSxcbiAgICBmcm9tUGFydGlhbChvYmplY3QpIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2MsIF9kO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNDU1Vzck1zZ1JhZGlvVGV4dCgpO1xuICAgICAgICBtZXNzYWdlLm1zZ0RzdCA9IChfYSA9IG9iamVjdC5tc2dEc3QpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IDA7XG4gICAgICAgIG1lc3NhZ2UuY2xpZW50ID0gKF9iID0gb2JqZWN0LmNsaWVudCkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogMDtcbiAgICAgICAgbWVzc2FnZS5tc2dOYW1lID0gKF9jID0gb2JqZWN0Lm1zZ05hbWUpICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IFwiXCI7XG4gICAgICAgIG1lc3NhZ2UucGFyYW1zID0gKChfZCA9IG9iamVjdC5wYXJhbXMpID09PSBudWxsIHx8IF9kID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZC5tYXAoZSA9PiBlKSkgfHwgW107XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbn07XG5mdW5jdGlvbiBjcmVhdGVCYXNlQ0NTVXNyTXNnSGludFRleHQoKSB7XG4gICAgcmV0dXJuIHsgdGV4dDogXCJcIiB9O1xufVxuZXhwb3J0cy5DQ1NVc3JNc2dIaW50VGV4dCA9IHtcbiAgICBlbmNvZGUobWVzc2FnZSwgd3JpdGVyID0gbWluaW1hbF8xLldyaXRlci5jcmVhdGUoKSkge1xuICAgICAgICBpZiAobWVzc2FnZS50ZXh0ICE9PSBcIlwiKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDEwKS5zdHJpbmcobWVzc2FnZS50ZXh0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH0sXG4gICAgZGVjb2RlKGlucHV0LCBsZW5ndGgpIHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gaW5wdXQgaW5zdGFuY2VvZiBtaW5pbWFsXzEuUmVhZGVyID8gaW5wdXQgOiBuZXcgbWluaW1hbF8xLlJlYWRlcihpbnB1dCk7XG4gICAgICAgIGxldCBlbmQgPSBsZW5ndGggPT09IHVuZGVmaW5lZCA/IHJlYWRlci5sZW4gOiByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNDU1Vzck1zZ0hpbnRUZXh0KCk7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBjb25zdCB0YWcgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKHRhZyA+Pj4gMykge1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS50ZXh0ID0gcmVhZGVyLnN0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICByZWFkZXIuc2tpcFR5cGUodGFnICYgNyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH0sXG4gICAgZnJvbVBhcnRpYWwob2JqZWN0KSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDQ1NVc3JNc2dIaW50VGV4dCgpO1xuICAgICAgICBtZXNzYWdlLnRleHQgPSAoX2EgPSBvYmplY3QudGV4dCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogXCJcIjtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxufTtcbmZ1bmN0aW9uIGNyZWF0ZUJhc2VDQ1NVc3JNc2dLZXlIaW50VGV4dCgpIHtcbiAgICByZXR1cm4geyBoaW50czogW10gfTtcbn1cbmV4cG9ydHMuQ0NTVXNyTXNnS2V5SGludFRleHQgPSB7XG4gICAgZW5jb2RlKG1lc3NhZ2UsIHdyaXRlciA9IG1pbmltYWxfMS5Xcml0ZXIuY3JlYXRlKCkpIHtcbiAgICAgICAgZm9yIChjb25zdCB2IG9mIG1lc3NhZ2UuaGludHMpIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMTApLnN0cmluZyh2KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH0sXG4gICAgZGVjb2RlKGlucHV0LCBsZW5ndGgpIHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gaW5wdXQgaW5zdGFuY2VvZiBtaW5pbWFsXzEuUmVhZGVyID8gaW5wdXQgOiBuZXcgbWluaW1hbF8xLlJlYWRlcihpbnB1dCk7XG4gICAgICAgIGxldCBlbmQgPSBsZW5ndGggPT09IHVuZGVmaW5lZCA/IHJlYWRlci5sZW4gOiByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNDU1Vzck1zZ0tleUhpbnRUZXh0KCk7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBjb25zdCB0YWcgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKHRhZyA+Pj4gMykge1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5oaW50cy5wdXNoKHJlYWRlci5zdHJpbmcoKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJlYWRlci5za2lwVHlwZSh0YWcgJiA3KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfSxcbiAgICBmcm9tUGFydGlhbChvYmplY3QpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNDU1Vzck1zZ0tleUhpbnRUZXh0KCk7XG4gICAgICAgIG1lc3NhZ2UuaGludHMgPSAoKF9hID0gb2JqZWN0LmhpbnRzKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EubWFwKGUgPT4gZSkpIHx8IFtdO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG59O1xuZnVuY3Rpb24gY3JlYXRlQmFzZUNDU1Vzck1zZ1Byb2Nlc3NTcG90dGVkRW50aXR5VXBkYXRlKCkge1xuICAgIHJldHVybiB7IG5ld1VwZGF0ZTogZmFsc2UsIGVudGl0eVVwZGF0ZXM6IFtdIH07XG59XG5leHBvcnRzLkNDU1Vzck1zZ1Byb2Nlc3NTcG90dGVkRW50aXR5VXBkYXRlID0ge1xuICAgIGVuY29kZShtZXNzYWdlLCB3cml0ZXIgPSBtaW5pbWFsXzEuV3JpdGVyLmNyZWF0ZSgpKSB7XG4gICAgICAgIGlmIChtZXNzYWdlLm5ld1VwZGF0ZSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig4KS5ib29sKG1lc3NhZ2UubmV3VXBkYXRlKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IHYgb2YgbWVzc2FnZS5lbnRpdHlVcGRhdGVzKSB7XG4gICAgICAgICAgICBleHBvcnRzLkNDU1Vzck1zZ1Byb2Nlc3NTcG90dGVkRW50aXR5VXBkYXRlX1Nwb3R0ZWRFbnRpdHlVcGRhdGUuZW5jb2RlKHYsIHdyaXRlci51aW50MzIoMTgpLmZvcmsoKSkubGRlbGltKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9LFxuICAgIGRlY29kZShpbnB1dCwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IGlucHV0IGluc3RhbmNlb2YgbWluaW1hbF8xLlJlYWRlciA/IGlucHV0IDogbmV3IG1pbmltYWxfMS5SZWFkZXIoaW5wdXQpO1xuICAgICAgICBsZXQgZW5kID0gbGVuZ3RoID09PSB1bmRlZmluZWQgPyByZWFkZXIubGVuIDogcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDQ1NVc3JNc2dQcm9jZXNzU3BvdHRlZEVudGl0eVVwZGF0ZSgpO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UubmV3VXBkYXRlID0gcmVhZGVyLmJvb2woKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmVudGl0eVVwZGF0ZXMucHVzaChleHBvcnRzLkNDU1Vzck1zZ1Byb2Nlc3NTcG90dGVkRW50aXR5VXBkYXRlX1Nwb3R0ZWRFbnRpdHlVcGRhdGUuZGVjb2RlKHJlYWRlciwgcmVhZGVyLnVpbnQzMigpKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJlYWRlci5za2lwVHlwZSh0YWcgJiA3KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfSxcbiAgICBmcm9tUGFydGlhbChvYmplY3QpIHtcbiAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDQ1NVc3JNc2dQcm9jZXNzU3BvdHRlZEVudGl0eVVwZGF0ZSgpO1xuICAgICAgICBtZXNzYWdlLm5ld1VwZGF0ZSA9IChfYSA9IG9iamVjdC5uZXdVcGRhdGUpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IGZhbHNlO1xuICAgICAgICBtZXNzYWdlLmVudGl0eVVwZGF0ZXMgPVxuICAgICAgICAgICAgKChfYiA9IG9iamVjdC5lbnRpdHlVcGRhdGVzKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IubWFwKGUgPT4gZXhwb3J0cy5DQ1NVc3JNc2dQcm9jZXNzU3BvdHRlZEVudGl0eVVwZGF0ZV9TcG90dGVkRW50aXR5VXBkYXRlLmZyb21QYXJ0aWFsKGUpKSkgfHwgW107XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbn07XG5mdW5jdGlvbiBjcmVhdGVCYXNlQ0NTVXNyTXNnUHJvY2Vzc1Nwb3R0ZWRFbnRpdHlVcGRhdGVfU3BvdHRlZEVudGl0eVVwZGF0ZSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBlbnRpdHlJZHg6IDAsXG4gICAgICAgIGNsYXNzSWQ6IDAsXG4gICAgICAgIG9yaWdpblg6IDAsXG4gICAgICAgIG9yaWdpblk6IDAsXG4gICAgICAgIG9yaWdpblo6IDAsXG4gICAgICAgIGFuZ2xlWTogMCxcbiAgICAgICAgZGVmdXNlcjogZmFsc2UsXG4gICAgICAgIHBsYXllckhhc0RlZnVzZXI6IGZhbHNlLFxuICAgICAgICBwbGF5ZXJIYXNDNDogZmFsc2VcbiAgICB9O1xufVxuZXhwb3J0cy5DQ1NVc3JNc2dQcm9jZXNzU3BvdHRlZEVudGl0eVVwZGF0ZV9TcG90dGVkRW50aXR5VXBkYXRlID0ge1xuICAgIGVuY29kZShtZXNzYWdlLCB3cml0ZXIgPSBtaW5pbWFsXzEuV3JpdGVyLmNyZWF0ZSgpKSB7XG4gICAgICAgIGlmIChtZXNzYWdlLmVudGl0eUlkeCAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig4KS5pbnQzMihtZXNzYWdlLmVudGl0eUlkeCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UuY2xhc3NJZCAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigxNikuaW50MzIobWVzc2FnZS5jbGFzc0lkKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5vcmlnaW5YICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDI0KS5pbnQzMihtZXNzYWdlLm9yaWdpblgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLm9yaWdpblkgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMzIpLmludDMyKG1lc3NhZ2Uub3JpZ2luWSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2Uub3JpZ2luWiAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig0MCkuaW50MzIobWVzc2FnZS5vcmlnaW5aKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5hbmdsZVkgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoNDgpLmludDMyKG1lc3NhZ2UuYW5nbGVZKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5kZWZ1c2VyID09PSB0cnVlKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDU2KS5ib29sKG1lc3NhZ2UuZGVmdXNlcik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UucGxheWVySGFzRGVmdXNlciA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig2NCkuYm9vbChtZXNzYWdlLnBsYXllckhhc0RlZnVzZXIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLnBsYXllckhhc0M0ID09PSB0cnVlKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDcyKS5ib29sKG1lc3NhZ2UucGxheWVySGFzQzQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfSxcbiAgICBkZWNvZGUoaW5wdXQsIGxlbmd0aCkge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBpbnB1dCBpbnN0YW5jZW9mIG1pbmltYWxfMS5SZWFkZXIgPyBpbnB1dCA6IG5ldyBtaW5pbWFsXzEuUmVhZGVyKGlucHV0KTtcbiAgICAgICAgbGV0IGVuZCA9IGxlbmd0aCA9PT0gdW5kZWZpbmVkID8gcmVhZGVyLmxlbiA6IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ0NTVXNyTXNnUHJvY2Vzc1Nwb3R0ZWRFbnRpdHlVcGRhdGVfU3BvdHRlZEVudGl0eVVwZGF0ZSgpO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZW50aXR5SWR4ID0gcmVhZGVyLmludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5jbGFzc0lkID0gcmVhZGVyLmludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5vcmlnaW5YID0gcmVhZGVyLmludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5vcmlnaW5ZID0gcmVhZGVyLmludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5vcmlnaW5aID0gcmVhZGVyLmludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5hbmdsZVkgPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA3OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmRlZnVzZXIgPSByZWFkZXIuYm9vbCgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDg6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UucGxheWVySGFzRGVmdXNlciA9IHJlYWRlci5ib29sKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgOTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5wbGF5ZXJIYXNDNCA9IHJlYWRlci5ib29sKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJlYWRlci5za2lwVHlwZSh0YWcgJiA3KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfSxcbiAgICBmcm9tUGFydGlhbChvYmplY3QpIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2MsIF9kLCBfZSwgX2YsIF9nLCBfaCwgX2o7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ0NTVXNyTXNnUHJvY2Vzc1Nwb3R0ZWRFbnRpdHlVcGRhdGVfU3BvdHRlZEVudGl0eVVwZGF0ZSgpO1xuICAgICAgICBtZXNzYWdlLmVudGl0eUlkeCA9IChfYSA9IG9iamVjdC5lbnRpdHlJZHgpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IDA7XG4gICAgICAgIG1lc3NhZ2UuY2xhc3NJZCA9IChfYiA9IG9iamVjdC5jbGFzc0lkKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAwO1xuICAgICAgICBtZXNzYWdlLm9yaWdpblggPSAoX2MgPSBvYmplY3Qub3JpZ2luWCkgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogMDtcbiAgICAgICAgbWVzc2FnZS5vcmlnaW5ZID0gKF9kID0gb2JqZWN0Lm9yaWdpblkpICE9PSBudWxsICYmIF9kICE9PSB2b2lkIDAgPyBfZCA6IDA7XG4gICAgICAgIG1lc3NhZ2Uub3JpZ2luWiA9IChfZSA9IG9iamVjdC5vcmlnaW5aKSAhPT0gbnVsbCAmJiBfZSAhPT0gdm9pZCAwID8gX2UgOiAwO1xuICAgICAgICBtZXNzYWdlLmFuZ2xlWSA9IChfZiA9IG9iamVjdC5hbmdsZVkpICE9PSBudWxsICYmIF9mICE9PSB2b2lkIDAgPyBfZiA6IDA7XG4gICAgICAgIG1lc3NhZ2UuZGVmdXNlciA9IChfZyA9IG9iamVjdC5kZWZ1c2VyKSAhPT0gbnVsbCAmJiBfZyAhPT0gdm9pZCAwID8gX2cgOiBmYWxzZTtcbiAgICAgICAgbWVzc2FnZS5wbGF5ZXJIYXNEZWZ1c2VyID0gKF9oID0gb2JqZWN0LnBsYXllckhhc0RlZnVzZXIpICE9PSBudWxsICYmIF9oICE9PSB2b2lkIDAgPyBfaCA6IGZhbHNlO1xuICAgICAgICBtZXNzYWdlLnBsYXllckhhc0M0ID0gKF9qID0gb2JqZWN0LnBsYXllckhhc0M0KSAhPT0gbnVsbCAmJiBfaiAhPT0gdm9pZCAwID8gX2ogOiBmYWxzZTtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxufTtcbmZ1bmN0aW9uIGNyZWF0ZUJhc2VDQ1NVc3JNc2dTZW5kUGxheWVySXRlbURyb3BzKCkge1xuICAgIHJldHVybiB7IGVudGl0eVVwZGF0ZXM6IFtdIH07XG59XG5leHBvcnRzLkNDU1Vzck1zZ1NlbmRQbGF5ZXJJdGVtRHJvcHMgPSB7XG4gICAgZW5jb2RlKG1lc3NhZ2UsIHdyaXRlciA9IG1pbmltYWxfMS5Xcml0ZXIuY3JlYXRlKCkpIHtcbiAgICAgICAgZm9yIChjb25zdCB2IG9mIG1lc3NhZ2UuZW50aXR5VXBkYXRlcykge1xuICAgICAgICAgICAgY3N0cmlrZTE1X2djbWVzc2FnZXNfMS5DRWNvbkl0ZW1QcmV2aWV3RGF0YUJsb2NrLmVuY29kZSh2LCB3cml0ZXIudWludDMyKDEwKS5mb3JrKCkpLmxkZWxpbSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfSxcbiAgICBkZWNvZGUoaW5wdXQsIGxlbmd0aCkge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBpbnB1dCBpbnN0YW5jZW9mIG1pbmltYWxfMS5SZWFkZXIgPyBpbnB1dCA6IG5ldyBtaW5pbWFsXzEuUmVhZGVyKGlucHV0KTtcbiAgICAgICAgbGV0IGVuZCA9IGxlbmd0aCA9PT0gdW5kZWZpbmVkID8gcmVhZGVyLmxlbiA6IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ0NTVXNyTXNnU2VuZFBsYXllckl0ZW1Ecm9wcygpO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZW50aXR5VXBkYXRlcy5wdXNoKGNzdHJpa2UxNV9nY21lc3NhZ2VzXzEuQ0Vjb25JdGVtUHJldmlld0RhdGFCbG9jay5kZWNvZGUocmVhZGVyLCByZWFkZXIudWludDMyKCkpKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmVhZGVyLnNraXBUeXBlKHRhZyAmIDcpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9LFxuICAgIGZyb21QYXJ0aWFsKG9iamVjdCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ0NTVXNyTXNnU2VuZFBsYXllckl0ZW1Ecm9wcygpO1xuICAgICAgICBtZXNzYWdlLmVudGl0eVVwZGF0ZXMgPVxuICAgICAgICAgICAgKChfYSA9IG9iamVjdC5lbnRpdHlVcGRhdGVzKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EubWFwKGUgPT4gY3N0cmlrZTE1X2djbWVzc2FnZXNfMS5DRWNvbkl0ZW1QcmV2aWV3RGF0YUJsb2NrLmZyb21QYXJ0aWFsKGUpKSkgfHwgW107XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbn07XG5mdW5jdGlvbiBjcmVhdGVCYXNlQ0NTVXNyTXNnU2VuZFBsYXllckl0ZW1Gb3VuZCgpIHtcbiAgICByZXR1cm4geyBpdGVtaW5mbzogdW5kZWZpbmVkLCBlbnRpbmRleDogMCB9O1xufVxuZXhwb3J0cy5DQ1NVc3JNc2dTZW5kUGxheWVySXRlbUZvdW5kID0ge1xuICAgIGVuY29kZShtZXNzYWdlLCB3cml0ZXIgPSBtaW5pbWFsXzEuV3JpdGVyLmNyZWF0ZSgpKSB7XG4gICAgICAgIGlmIChtZXNzYWdlLml0ZW1pbmZvICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNzdHJpa2UxNV9nY21lc3NhZ2VzXzEuQ0Vjb25JdGVtUHJldmlld0RhdGFCbG9jay5lbmNvZGUobWVzc2FnZS5pdGVtaW5mbywgd3JpdGVyLnVpbnQzMigxMCkuZm9yaygpKS5sZGVsaW0oKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5lbnRpbmRleCAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigxNikuaW50MzIobWVzc2FnZS5lbnRpbmRleCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9LFxuICAgIGRlY29kZShpbnB1dCwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IGlucHV0IGluc3RhbmNlb2YgbWluaW1hbF8xLlJlYWRlciA/IGlucHV0IDogbmV3IG1pbmltYWxfMS5SZWFkZXIoaW5wdXQpO1xuICAgICAgICBsZXQgZW5kID0gbGVuZ3RoID09PSB1bmRlZmluZWQgPyByZWFkZXIubGVuIDogcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDQ1NVc3JNc2dTZW5kUGxheWVySXRlbUZvdW5kKCk7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBjb25zdCB0YWcgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKHRhZyA+Pj4gMykge1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5pdGVtaW5mbyA9IGNzdHJpa2UxNV9nY21lc3NhZ2VzXzEuQ0Vjb25JdGVtUHJldmlld0RhdGFCbG9jay5kZWNvZGUocmVhZGVyLCByZWFkZXIudWludDMyKCkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZW50aW5kZXggPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmVhZGVyLnNraXBUeXBlKHRhZyAmIDcpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9LFxuICAgIGZyb21QYXJ0aWFsKG9iamVjdCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ0NTVXNyTXNnU2VuZFBsYXllckl0ZW1Gb3VuZCgpO1xuICAgICAgICBtZXNzYWdlLml0ZW1pbmZvID1cbiAgICAgICAgICAgIG9iamVjdC5pdGVtaW5mbyAhPT0gdW5kZWZpbmVkICYmIG9iamVjdC5pdGVtaW5mbyAhPT0gbnVsbFxuICAgICAgICAgICAgICAgID8gY3N0cmlrZTE1X2djbWVzc2FnZXNfMS5DRWNvbkl0ZW1QcmV2aWV3RGF0YUJsb2NrLmZyb21QYXJ0aWFsKG9iamVjdC5pdGVtaW5mbylcbiAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgICAgbWVzc2FnZS5lbnRpbmRleCA9IChfYSA9IG9iamVjdC5lbnRpbmRleCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMDtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxufTtcbmZ1bmN0aW9uIGNyZWF0ZUJhc2VDQ1NVc3JNc2dSZWxvYWRFZmZlY3QoKSB7XG4gICAgcmV0dXJuIHsgZW50aWR4OiAwLCBhY3RhbmltOiAwLCBvcmlnaW5YOiAwLCBvcmlnaW5ZOiAwLCBvcmlnaW5aOiAwIH07XG59XG5leHBvcnRzLkNDU1Vzck1zZ1JlbG9hZEVmZmVjdCA9IHtcbiAgICBlbmNvZGUobWVzc2FnZSwgd3JpdGVyID0gbWluaW1hbF8xLldyaXRlci5jcmVhdGUoKSkge1xuICAgICAgICBpZiAobWVzc2FnZS5lbnRpZHggIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoOCkuaW50MzIobWVzc2FnZS5lbnRpZHgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLmFjdGFuaW0gIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMTYpLmludDMyKG1lc3NhZ2UuYWN0YW5pbSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2Uub3JpZ2luWCAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigyOSkuZmxvYXQobWVzc2FnZS5vcmlnaW5YKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5vcmlnaW5ZICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDM3KS5mbG9hdChtZXNzYWdlLm9yaWdpblkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLm9yaWdpblogIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoNDUpLmZsb2F0KG1lc3NhZ2Uub3JpZ2luWik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9LFxuICAgIGRlY29kZShpbnB1dCwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IGlucHV0IGluc3RhbmNlb2YgbWluaW1hbF8xLlJlYWRlciA/IGlucHV0IDogbmV3IG1pbmltYWxfMS5SZWFkZXIoaW5wdXQpO1xuICAgICAgICBsZXQgZW5kID0gbGVuZ3RoID09PSB1bmRlZmluZWQgPyByZWFkZXIubGVuIDogcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDQ1NVc3JNc2dSZWxvYWRFZmZlY3QoKTtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhZyA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgIHN3aXRjaCAodGFnID4+PiAzKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmVudGlkeCA9IHJlYWRlci5pbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuYWN0YW5pbSA9IHJlYWRlci5pbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Uub3JpZ2luWCA9IHJlYWRlci5mbG9hdCgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Uub3JpZ2luWSA9IHJlYWRlci5mbG9hdCgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Uub3JpZ2luWiA9IHJlYWRlci5mbG9hdCgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICByZWFkZXIuc2tpcFR5cGUodGFnICYgNyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH0sXG4gICAgZnJvbVBhcnRpYWwob2JqZWN0KSB7XG4gICAgICAgIHZhciBfYSwgX2IsIF9jLCBfZCwgX2U7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ0NTVXNyTXNnUmVsb2FkRWZmZWN0KCk7XG4gICAgICAgIG1lc3NhZ2UuZW50aWR4ID0gKF9hID0gb2JqZWN0LmVudGlkeCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMDtcbiAgICAgICAgbWVzc2FnZS5hY3RhbmltID0gKF9iID0gb2JqZWN0LmFjdGFuaW0pICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IDA7XG4gICAgICAgIG1lc3NhZ2Uub3JpZ2luWCA9IChfYyA9IG9iamVjdC5vcmlnaW5YKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiAwO1xuICAgICAgICBtZXNzYWdlLm9yaWdpblkgPSAoX2QgPSBvYmplY3Qub3JpZ2luWSkgIT09IG51bGwgJiYgX2QgIT09IHZvaWQgMCA/IF9kIDogMDtcbiAgICAgICAgbWVzc2FnZS5vcmlnaW5aID0gKF9lID0gb2JqZWN0Lm9yaWdpblopICE9PSBudWxsICYmIF9lICE9PSB2b2lkIDAgPyBfZSA6IDA7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbn07XG5mdW5jdGlvbiBjcmVhdGVCYXNlQ0NTVXNyTXNnV2VhcG9uU291bmQoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZW50aWR4OiAwLFxuICAgICAgICBvcmlnaW5YOiAwLFxuICAgICAgICBvcmlnaW5ZOiAwLFxuICAgICAgICBvcmlnaW5aOiAwLFxuICAgICAgICBzb3VuZDogXCJcIixcbiAgICAgICAgdGltZXN0YW1wOiAwXG4gICAgfTtcbn1cbmV4cG9ydHMuQ0NTVXNyTXNnV2VhcG9uU291bmQgPSB7XG4gICAgZW5jb2RlKG1lc3NhZ2UsIHdyaXRlciA9IG1pbmltYWxfMS5Xcml0ZXIuY3JlYXRlKCkpIHtcbiAgICAgICAgaWYgKG1lc3NhZ2UuZW50aWR4ICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDgpLmludDMyKG1lc3NhZ2UuZW50aWR4KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5vcmlnaW5YICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDIxKS5mbG9hdChtZXNzYWdlLm9yaWdpblgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLm9yaWdpblkgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMjkpLmZsb2F0KG1lc3NhZ2Uub3JpZ2luWSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2Uub3JpZ2luWiAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigzNykuZmxvYXQobWVzc2FnZS5vcmlnaW5aKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5zb3VuZCAhPT0gXCJcIikge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig0Mikuc3RyaW5nKG1lc3NhZ2Uuc291bmQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLnRpbWVzdGFtcCAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig1MykuZmxvYXQobWVzc2FnZS50aW1lc3RhbXApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfSxcbiAgICBkZWNvZGUoaW5wdXQsIGxlbmd0aCkge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBpbnB1dCBpbnN0YW5jZW9mIG1pbmltYWxfMS5SZWFkZXIgPyBpbnB1dCA6IG5ldyBtaW5pbWFsXzEuUmVhZGVyKGlucHV0KTtcbiAgICAgICAgbGV0IGVuZCA9IGxlbmd0aCA9PT0gdW5kZWZpbmVkID8gcmVhZGVyLmxlbiA6IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ0NTVXNyTXNnV2VhcG9uU291bmQoKTtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhZyA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgIHN3aXRjaCAodGFnID4+PiAzKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmVudGlkeCA9IHJlYWRlci5pbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Uub3JpZ2luWCA9IHJlYWRlci5mbG9hdCgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Uub3JpZ2luWSA9IHJlYWRlci5mbG9hdCgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Uub3JpZ2luWiA9IHJlYWRlci5mbG9hdCgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Uuc291bmQgPSByZWFkZXIuc3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS50aW1lc3RhbXAgPSByZWFkZXIuZmxvYXQoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmVhZGVyLnNraXBUeXBlKHRhZyAmIDcpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9LFxuICAgIGZyb21QYXJ0aWFsKG9iamVjdCkge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYywgX2QsIF9lLCBfZjtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDQ1NVc3JNc2dXZWFwb25Tb3VuZCgpO1xuICAgICAgICBtZXNzYWdlLmVudGlkeCA9IChfYSA9IG9iamVjdC5lbnRpZHgpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IDA7XG4gICAgICAgIG1lc3NhZ2Uub3JpZ2luWCA9IChfYiA9IG9iamVjdC5vcmlnaW5YKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAwO1xuICAgICAgICBtZXNzYWdlLm9yaWdpblkgPSAoX2MgPSBvYmplY3Qub3JpZ2luWSkgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogMDtcbiAgICAgICAgbWVzc2FnZS5vcmlnaW5aID0gKF9kID0gb2JqZWN0Lm9yaWdpblopICE9PSBudWxsICYmIF9kICE9PSB2b2lkIDAgPyBfZCA6IDA7XG4gICAgICAgIG1lc3NhZ2Uuc291bmQgPSAoX2UgPSBvYmplY3Quc291bmQpICE9PSBudWxsICYmIF9lICE9PSB2b2lkIDAgPyBfZSA6IFwiXCI7XG4gICAgICAgIG1lc3NhZ2UudGltZXN0YW1wID0gKF9mID0gb2JqZWN0LnRpbWVzdGFtcCkgIT09IG51bGwgJiYgX2YgIT09IHZvaWQgMCA/IF9mIDogMDtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxufTtcbmZ1bmN0aW9uIGNyZWF0ZUJhc2VDQ1NVc3JNc2dVcGRhdGVTY3JlZW5IZWFsdGhCYXIoKSB7XG4gICAgcmV0dXJuIHsgZW50aWR4OiAwLCBoZWFsdGhyYXRpb09sZDogMCwgaGVhbHRocmF0aW9OZXc6IDAsIHN0eWxlOiAwIH07XG59XG5leHBvcnRzLkNDU1Vzck1zZ1VwZGF0ZVNjcmVlbkhlYWx0aEJhciA9IHtcbiAgICBlbmNvZGUobWVzc2FnZSwgd3JpdGVyID0gbWluaW1hbF8xLldyaXRlci5jcmVhdGUoKSkge1xuICAgICAgICBpZiAobWVzc2FnZS5lbnRpZHggIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoOCkuaW50MzIobWVzc2FnZS5lbnRpZHgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLmhlYWx0aHJhdGlvT2xkICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDIxKS5mbG9hdChtZXNzYWdlLmhlYWx0aHJhdGlvT2xkKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5oZWFsdGhyYXRpb05ldyAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigyOSkuZmxvYXQobWVzc2FnZS5oZWFsdGhyYXRpb05ldyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2Uuc3R5bGUgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMzIpLmludDMyKG1lc3NhZ2Uuc3R5bGUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfSxcbiAgICBkZWNvZGUoaW5wdXQsIGxlbmd0aCkge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBpbnB1dCBpbnN0YW5jZW9mIG1pbmltYWxfMS5SZWFkZXIgPyBpbnB1dCA6IG5ldyBtaW5pbWFsXzEuUmVhZGVyKGlucHV0KTtcbiAgICAgICAgbGV0IGVuZCA9IGxlbmd0aCA9PT0gdW5kZWZpbmVkID8gcmVhZGVyLmxlbiA6IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ0NTVXNyTXNnVXBkYXRlU2NyZWVuSGVhbHRoQmFyKCk7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBjb25zdCB0YWcgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKHRhZyA+Pj4gMykge1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5lbnRpZHggPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmhlYWx0aHJhdGlvT2xkID0gcmVhZGVyLmZsb2F0KCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5oZWFsdGhyYXRpb05ldyA9IHJlYWRlci5mbG9hdCgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Uuc3R5bGUgPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmVhZGVyLnNraXBUeXBlKHRhZyAmIDcpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9LFxuICAgIGZyb21QYXJ0aWFsKG9iamVjdCkge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYywgX2Q7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ0NTVXNyTXNnVXBkYXRlU2NyZWVuSGVhbHRoQmFyKCk7XG4gICAgICAgIG1lc3NhZ2UuZW50aWR4ID0gKF9hID0gb2JqZWN0LmVudGlkeCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMDtcbiAgICAgICAgbWVzc2FnZS5oZWFsdGhyYXRpb09sZCA9IChfYiA9IG9iamVjdC5oZWFsdGhyYXRpb09sZCkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogMDtcbiAgICAgICAgbWVzc2FnZS5oZWFsdGhyYXRpb05ldyA9IChfYyA9IG9iamVjdC5oZWFsdGhyYXRpb05ldykgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogMDtcbiAgICAgICAgbWVzc2FnZS5zdHlsZSA9IChfZCA9IG9iamVjdC5zdHlsZSkgIT09IG51bGwgJiYgX2QgIT09IHZvaWQgMCA/IF9kIDogMDtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxufTtcbmZ1bmN0aW9uIGNyZWF0ZUJhc2VDQ1NVc3JNc2dFbnRpdHlPdXRsaW5lSGlnaGxpZ2h0KCkge1xuICAgIHJldHVybiB7IGVudGlkeDogMCwgcmVtb3ZlaGlnaGxpZ2h0OiBmYWxzZSB9O1xufVxuZXhwb3J0cy5DQ1NVc3JNc2dFbnRpdHlPdXRsaW5lSGlnaGxpZ2h0ID0ge1xuICAgIGVuY29kZShtZXNzYWdlLCB3cml0ZXIgPSBtaW5pbWFsXzEuV3JpdGVyLmNyZWF0ZSgpKSB7XG4gICAgICAgIGlmIChtZXNzYWdlLmVudGlkeCAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig4KS5pbnQzMihtZXNzYWdlLmVudGlkeCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UucmVtb3ZlaGlnaGxpZ2h0ID09PSB0cnVlKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDE2KS5ib29sKG1lc3NhZ2UucmVtb3ZlaGlnaGxpZ2h0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH0sXG4gICAgZGVjb2RlKGlucHV0LCBsZW5ndGgpIHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gaW5wdXQgaW5zdGFuY2VvZiBtaW5pbWFsXzEuUmVhZGVyID8gaW5wdXQgOiBuZXcgbWluaW1hbF8xLlJlYWRlcihpbnB1dCk7XG4gICAgICAgIGxldCBlbmQgPSBsZW5ndGggPT09IHVuZGVmaW5lZCA/IHJlYWRlci5sZW4gOiByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNDU1Vzck1zZ0VudGl0eU91dGxpbmVIaWdobGlnaHQoKTtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhZyA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgIHN3aXRjaCAodGFnID4+PiAzKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmVudGlkeCA9IHJlYWRlci5pbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UucmVtb3ZlaGlnaGxpZ2h0ID0gcmVhZGVyLmJvb2woKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmVhZGVyLnNraXBUeXBlKHRhZyAmIDcpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9LFxuICAgIGZyb21QYXJ0aWFsKG9iamVjdCkge1xuICAgICAgICB2YXIgX2EsIF9iO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNDU1Vzck1zZ0VudGl0eU91dGxpbmVIaWdobGlnaHQoKTtcbiAgICAgICAgbWVzc2FnZS5lbnRpZHggPSAoX2EgPSBvYmplY3QuZW50aWR4KSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAwO1xuICAgICAgICBtZXNzYWdlLnJlbW92ZWhpZ2hsaWdodCA9IChfYiA9IG9iamVjdC5yZW1vdmVoaWdobGlnaHQpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IGZhbHNlO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG59O1xuZnVuY3Rpb24gY3JlYXRlQmFzZUNDU1Vzck1zZ0FkanVzdE1vbmV5KCkge1xuICAgIHJldHVybiB7IGFtb3VudDogMCB9O1xufVxuZXhwb3J0cy5DQ1NVc3JNc2dBZGp1c3RNb25leSA9IHtcbiAgICBlbmNvZGUobWVzc2FnZSwgd3JpdGVyID0gbWluaW1hbF8xLldyaXRlci5jcmVhdGUoKSkge1xuICAgICAgICBpZiAobWVzc2FnZS5hbW91bnQgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoOCkuaW50MzIobWVzc2FnZS5hbW91bnQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfSxcbiAgICBkZWNvZGUoaW5wdXQsIGxlbmd0aCkge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBpbnB1dCBpbnN0YW5jZW9mIG1pbmltYWxfMS5SZWFkZXIgPyBpbnB1dCA6IG5ldyBtaW5pbWFsXzEuUmVhZGVyKGlucHV0KTtcbiAgICAgICAgbGV0IGVuZCA9IGxlbmd0aCA9PT0gdW5kZWZpbmVkID8gcmVhZGVyLmxlbiA6IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ0NTVXNyTXNnQWRqdXN0TW9uZXkoKTtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhZyA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgIHN3aXRjaCAodGFnID4+PiAzKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmFtb3VudCA9IHJlYWRlci5pbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICByZWFkZXIuc2tpcFR5cGUodGFnICYgNyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH0sXG4gICAgZnJvbVBhcnRpYWwob2JqZWN0KSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDQ1NVc3JNc2dBZGp1c3RNb25leSgpO1xuICAgICAgICBtZXNzYWdlLmFtb3VudCA9IChfYSA9IG9iamVjdC5hbW91bnQpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IDA7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbn07XG5mdW5jdGlvbiBjcmVhdGVCYXNlQ0NTVXNyTXNnUmVwb3J0SGl0KCkge1xuICAgIHJldHVybiB7IHBvc1g6IDAsIHBvc1k6IDAsIHRpbWVzdGFtcDogMCwgcG9zWjogMCB9O1xufVxuZXhwb3J0cy5DQ1NVc3JNc2dSZXBvcnRIaXQgPSB7XG4gICAgZW5jb2RlKG1lc3NhZ2UsIHdyaXRlciA9IG1pbmltYWxfMS5Xcml0ZXIuY3JlYXRlKCkpIHtcbiAgICAgICAgaWYgKG1lc3NhZ2UucG9zWCAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigxMykuZmxvYXQobWVzc2FnZS5wb3NYKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5wb3NZICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDIxKS5mbG9hdChtZXNzYWdlLnBvc1kpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLnRpbWVzdGFtcCAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigzNykuZmxvYXQobWVzc2FnZS50aW1lc3RhbXApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLnBvc1ogIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMjkpLmZsb2F0KG1lc3NhZ2UucG9zWik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9LFxuICAgIGRlY29kZShpbnB1dCwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IGlucHV0IGluc3RhbmNlb2YgbWluaW1hbF8xLlJlYWRlciA/IGlucHV0IDogbmV3IG1pbmltYWxfMS5SZWFkZXIoaW5wdXQpO1xuICAgICAgICBsZXQgZW5kID0gbGVuZ3RoID09PSB1bmRlZmluZWQgPyByZWFkZXIubGVuIDogcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDQ1NVc3JNc2dSZXBvcnRIaXQoKTtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhZyA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgIHN3aXRjaCAodGFnID4+PiAzKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnBvc1ggPSByZWFkZXIuZmxvYXQoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnBvc1kgPSByZWFkZXIuZmxvYXQoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnRpbWVzdGFtcCA9IHJlYWRlci5mbG9hdCgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UucG9zWiA9IHJlYWRlci5mbG9hdCgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICByZWFkZXIuc2tpcFR5cGUodGFnICYgNyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH0sXG4gICAgZnJvbVBhcnRpYWwob2JqZWN0KSB7XG4gICAgICAgIHZhciBfYSwgX2IsIF9jLCBfZDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDQ1NVc3JNc2dSZXBvcnRIaXQoKTtcbiAgICAgICAgbWVzc2FnZS5wb3NYID0gKF9hID0gb2JqZWN0LnBvc1gpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IDA7XG4gICAgICAgIG1lc3NhZ2UucG9zWSA9IChfYiA9IG9iamVjdC5wb3NZKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAwO1xuICAgICAgICBtZXNzYWdlLnRpbWVzdGFtcCA9IChfYyA9IG9iamVjdC50aW1lc3RhbXApICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IDA7XG4gICAgICAgIG1lc3NhZ2UucG9zWiA9IChfZCA9IG9iamVjdC5wb3NaKSAhPT0gbnVsbCAmJiBfZCAhPT0gdm9pZCAwID8gX2QgOiAwO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG59O1xuZnVuY3Rpb24gY3JlYXRlQmFzZUNDU1Vzck1zZ0tpbGxDYW0oKSB7XG4gICAgcmV0dXJuIHsgb2JzTW9kZTogMCwgZmlyc3RUYXJnZXQ6IDAsIHNlY29uZFRhcmdldDogMCB9O1xufVxuZXhwb3J0cy5DQ1NVc3JNc2dLaWxsQ2FtID0ge1xuICAgIGVuY29kZShtZXNzYWdlLCB3cml0ZXIgPSBtaW5pbWFsXzEuV3JpdGVyLmNyZWF0ZSgpKSB7XG4gICAgICAgIGlmIChtZXNzYWdlLm9ic01vZGUgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoOCkuaW50MzIobWVzc2FnZS5vYnNNb2RlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5maXJzdFRhcmdldCAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigxNikuaW50MzIobWVzc2FnZS5maXJzdFRhcmdldCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2Uuc2Vjb25kVGFyZ2V0ICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDI0KS5pbnQzMihtZXNzYWdlLnNlY29uZFRhcmdldCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9LFxuICAgIGRlY29kZShpbnB1dCwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IGlucHV0IGluc3RhbmNlb2YgbWluaW1hbF8xLlJlYWRlciA/IGlucHV0IDogbmV3IG1pbmltYWxfMS5SZWFkZXIoaW5wdXQpO1xuICAgICAgICBsZXQgZW5kID0gbGVuZ3RoID09PSB1bmRlZmluZWQgPyByZWFkZXIubGVuIDogcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDQ1NVc3JNc2dLaWxsQ2FtKCk7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBjb25zdCB0YWcgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKHRhZyA+Pj4gMykge1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5vYnNNb2RlID0gcmVhZGVyLmludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5maXJzdFRhcmdldCA9IHJlYWRlci5pbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Uuc2Vjb25kVGFyZ2V0ID0gcmVhZGVyLmludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJlYWRlci5za2lwVHlwZSh0YWcgJiA3KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfSxcbiAgICBmcm9tUGFydGlhbChvYmplY3QpIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2M7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ0NTVXNyTXNnS2lsbENhbSgpO1xuICAgICAgICBtZXNzYWdlLm9ic01vZGUgPSAoX2EgPSBvYmplY3Qub2JzTW9kZSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMDtcbiAgICAgICAgbWVzc2FnZS5maXJzdFRhcmdldCA9IChfYiA9IG9iamVjdC5maXJzdFRhcmdldCkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogMDtcbiAgICAgICAgbWVzc2FnZS5zZWNvbmRUYXJnZXQgPSAoX2MgPSBvYmplY3Quc2Vjb25kVGFyZ2V0KSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiAwO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG59O1xuZnVuY3Rpb24gY3JlYXRlQmFzZUNDU1Vzck1zZ0Rlc2lyZWRUaW1lc2NhbGUoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZGVzaXJlZFRpbWVzY2FsZTogMCxcbiAgICAgICAgZHVyYXRpb25SZWFsdGltZVNlYzogMCxcbiAgICAgICAgaW50ZXJwb2xhdG9yVHlwZTogMCxcbiAgICAgICAgc3RhcnRCbGVuZFRpbWU6IDBcbiAgICB9O1xufVxuZXhwb3J0cy5DQ1NVc3JNc2dEZXNpcmVkVGltZXNjYWxlID0ge1xuICAgIGVuY29kZShtZXNzYWdlLCB3cml0ZXIgPSBtaW5pbWFsXzEuV3JpdGVyLmNyZWF0ZSgpKSB7XG4gICAgICAgIGlmIChtZXNzYWdlLmRlc2lyZWRUaW1lc2NhbGUgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMTMpLmZsb2F0KG1lc3NhZ2UuZGVzaXJlZFRpbWVzY2FsZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UuZHVyYXRpb25SZWFsdGltZVNlYyAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigyMSkuZmxvYXQobWVzc2FnZS5kdXJhdGlvblJlYWx0aW1lU2VjKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5pbnRlcnBvbGF0b3JUeXBlICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDI0KS5pbnQzMihtZXNzYWdlLmludGVycG9sYXRvclR5cGUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLnN0YXJ0QmxlbmRUaW1lICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDM3KS5mbG9hdChtZXNzYWdlLnN0YXJ0QmxlbmRUaW1lKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH0sXG4gICAgZGVjb2RlKGlucHV0LCBsZW5ndGgpIHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gaW5wdXQgaW5zdGFuY2VvZiBtaW5pbWFsXzEuUmVhZGVyID8gaW5wdXQgOiBuZXcgbWluaW1hbF8xLlJlYWRlcihpbnB1dCk7XG4gICAgICAgIGxldCBlbmQgPSBsZW5ndGggPT09IHVuZGVmaW5lZCA/IHJlYWRlci5sZW4gOiByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNDU1Vzck1zZ0Rlc2lyZWRUaW1lc2NhbGUoKTtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhZyA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgIHN3aXRjaCAodGFnID4+PiAzKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmRlc2lyZWRUaW1lc2NhbGUgPSByZWFkZXIuZmxvYXQoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmR1cmF0aW9uUmVhbHRpbWVTZWMgPSByZWFkZXIuZmxvYXQoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmludGVycG9sYXRvclR5cGUgPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnN0YXJ0QmxlbmRUaW1lID0gcmVhZGVyLmZsb2F0KCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJlYWRlci5za2lwVHlwZSh0YWcgJiA3KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfSxcbiAgICBmcm9tUGFydGlhbChvYmplY3QpIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2MsIF9kO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNDU1Vzck1zZ0Rlc2lyZWRUaW1lc2NhbGUoKTtcbiAgICAgICAgbWVzc2FnZS5kZXNpcmVkVGltZXNjYWxlID0gKF9hID0gb2JqZWN0LmRlc2lyZWRUaW1lc2NhbGUpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IDA7XG4gICAgICAgIG1lc3NhZ2UuZHVyYXRpb25SZWFsdGltZVNlYyA9IChfYiA9IG9iamVjdC5kdXJhdGlvblJlYWx0aW1lU2VjKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAwO1xuICAgICAgICBtZXNzYWdlLmludGVycG9sYXRvclR5cGUgPSAoX2MgPSBvYmplY3QuaW50ZXJwb2xhdG9yVHlwZSkgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogMDtcbiAgICAgICAgbWVzc2FnZS5zdGFydEJsZW5kVGltZSA9IChfZCA9IG9iamVjdC5zdGFydEJsZW5kVGltZSkgIT09IG51bGwgJiYgX2QgIT09IHZvaWQgMCA/IF9kIDogMDtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxufTtcbmZ1bmN0aW9uIGNyZWF0ZUJhc2VDQ1NVc3JNc2dDdXJyZW50VGltZXNjYWxlKCkge1xuICAgIHJldHVybiB7IGN1clRpbWVzY2FsZTogMCB9O1xufVxuZXhwb3J0cy5DQ1NVc3JNc2dDdXJyZW50VGltZXNjYWxlID0ge1xuICAgIGVuY29kZShtZXNzYWdlLCB3cml0ZXIgPSBtaW5pbWFsXzEuV3JpdGVyLmNyZWF0ZSgpKSB7XG4gICAgICAgIGlmIChtZXNzYWdlLmN1clRpbWVzY2FsZSAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigxMykuZmxvYXQobWVzc2FnZS5jdXJUaW1lc2NhbGUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfSxcbiAgICBkZWNvZGUoaW5wdXQsIGxlbmd0aCkge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBpbnB1dCBpbnN0YW5jZW9mIG1pbmltYWxfMS5SZWFkZXIgPyBpbnB1dCA6IG5ldyBtaW5pbWFsXzEuUmVhZGVyKGlucHV0KTtcbiAgICAgICAgbGV0IGVuZCA9IGxlbmd0aCA9PT0gdW5kZWZpbmVkID8gcmVhZGVyLmxlbiA6IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ0NTVXNyTXNnQ3VycmVudFRpbWVzY2FsZSgpO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuY3VyVGltZXNjYWxlID0gcmVhZGVyLmZsb2F0KCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJlYWRlci5za2lwVHlwZSh0YWcgJiA3KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfSxcbiAgICBmcm9tUGFydGlhbChvYmplY3QpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNDU1Vzck1zZ0N1cnJlbnRUaW1lc2NhbGUoKTtcbiAgICAgICAgbWVzc2FnZS5jdXJUaW1lc2NhbGUgPSAoX2EgPSBvYmplY3QuY3VyVGltZXNjYWxlKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAwO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG59O1xuZnVuY3Rpb24gY3JlYXRlQmFzZUNDU1Vzck1zZ0FjaGlldmVtZW50RXZlbnQoKSB7XG4gICAgcmV0dXJuIHsgYWNoaWV2ZW1lbnQ6IDAsIGNvdW50OiAwLCB1c2VySWQ6IDAgfTtcbn1cbmV4cG9ydHMuQ0NTVXNyTXNnQWNoaWV2ZW1lbnRFdmVudCA9IHtcbiAgICBlbmNvZGUobWVzc2FnZSwgd3JpdGVyID0gbWluaW1hbF8xLldyaXRlci5jcmVhdGUoKSkge1xuICAgICAgICBpZiAobWVzc2FnZS5hY2hpZXZlbWVudCAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig4KS5pbnQzMihtZXNzYWdlLmFjaGlldmVtZW50KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5jb3VudCAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigxNikuaW50MzIobWVzc2FnZS5jb3VudCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UudXNlcklkICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDI0KS5pbnQzMihtZXNzYWdlLnVzZXJJZCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9LFxuICAgIGRlY29kZShpbnB1dCwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IGlucHV0IGluc3RhbmNlb2YgbWluaW1hbF8xLlJlYWRlciA/IGlucHV0IDogbmV3IG1pbmltYWxfMS5SZWFkZXIoaW5wdXQpO1xuICAgICAgICBsZXQgZW5kID0gbGVuZ3RoID09PSB1bmRlZmluZWQgPyByZWFkZXIubGVuIDogcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDQ1NVc3JNc2dBY2hpZXZlbWVudEV2ZW50KCk7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBjb25zdCB0YWcgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKHRhZyA+Pj4gMykge1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5hY2hpZXZlbWVudCA9IHJlYWRlci5pbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuY291bnQgPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnVzZXJJZCA9IHJlYWRlci5pbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICByZWFkZXIuc2tpcFR5cGUodGFnICYgNyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH0sXG4gICAgZnJvbVBhcnRpYWwob2JqZWN0KSB7XG4gICAgICAgIHZhciBfYSwgX2IsIF9jO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNDU1Vzck1zZ0FjaGlldmVtZW50RXZlbnQoKTtcbiAgICAgICAgbWVzc2FnZS5hY2hpZXZlbWVudCA9IChfYSA9IG9iamVjdC5hY2hpZXZlbWVudCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMDtcbiAgICAgICAgbWVzc2FnZS5jb3VudCA9IChfYiA9IG9iamVjdC5jb3VudCkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogMDtcbiAgICAgICAgbWVzc2FnZS51c2VySWQgPSAoX2MgPSBvYmplY3QudXNlcklkKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiAwO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG59O1xuZnVuY3Rpb24gY3JlYXRlQmFzZUNDU1Vzck1zZ01hdGNoRW5kQ29uZGl0aW9ucygpIHtcbiAgICByZXR1cm4geyBmcmFnbGltaXQ6IDAsIG1wTWF4cm91bmRzOiAwLCBtcFdpbmxpbWl0OiAwLCBtcFRpbWVsaW1pdDogMCB9O1xufVxuZXhwb3J0cy5DQ1NVc3JNc2dNYXRjaEVuZENvbmRpdGlvbnMgPSB7XG4gICAgZW5jb2RlKG1lc3NhZ2UsIHdyaXRlciA9IG1pbmltYWxfMS5Xcml0ZXIuY3JlYXRlKCkpIHtcbiAgICAgICAgaWYgKG1lc3NhZ2UuZnJhZ2xpbWl0ICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDgpLmludDMyKG1lc3NhZ2UuZnJhZ2xpbWl0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5tcE1heHJvdW5kcyAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigxNikuaW50MzIobWVzc2FnZS5tcE1heHJvdW5kcyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UubXBXaW5saW1pdCAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigyNCkuaW50MzIobWVzc2FnZS5tcFdpbmxpbWl0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5tcFRpbWVsaW1pdCAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigzMikuaW50MzIobWVzc2FnZS5tcFRpbWVsaW1pdCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9LFxuICAgIGRlY29kZShpbnB1dCwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IGlucHV0IGluc3RhbmNlb2YgbWluaW1hbF8xLlJlYWRlciA/IGlucHV0IDogbmV3IG1pbmltYWxfMS5SZWFkZXIoaW5wdXQpO1xuICAgICAgICBsZXQgZW5kID0gbGVuZ3RoID09PSB1bmRlZmluZWQgPyByZWFkZXIubGVuIDogcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDQ1NVc3JNc2dNYXRjaEVuZENvbmRpdGlvbnMoKTtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhZyA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgIHN3aXRjaCAodGFnID4+PiAzKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmZyYWdsaW1pdCA9IHJlYWRlci5pbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UubXBNYXhyb3VuZHMgPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLm1wV2lubGltaXQgPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLm1wVGltZWxpbWl0ID0gcmVhZGVyLmludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJlYWRlci5za2lwVHlwZSh0YWcgJiA3KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfSxcbiAgICBmcm9tUGFydGlhbChvYmplY3QpIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2MsIF9kO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNDU1Vzck1zZ01hdGNoRW5kQ29uZGl0aW9ucygpO1xuICAgICAgICBtZXNzYWdlLmZyYWdsaW1pdCA9IChfYSA9IG9iamVjdC5mcmFnbGltaXQpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IDA7XG4gICAgICAgIG1lc3NhZ2UubXBNYXhyb3VuZHMgPSAoX2IgPSBvYmplY3QubXBNYXhyb3VuZHMpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IDA7XG4gICAgICAgIG1lc3NhZ2UubXBXaW5saW1pdCA9IChfYyA9IG9iamVjdC5tcFdpbmxpbWl0KSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiAwO1xuICAgICAgICBtZXNzYWdlLm1wVGltZWxpbWl0ID0gKF9kID0gb2JqZWN0Lm1wVGltZWxpbWl0KSAhPT0gbnVsbCAmJiBfZCAhPT0gdm9pZCAwID8gX2QgOiAwO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG59O1xuZnVuY3Rpb24gY3JlYXRlQmFzZUNDU1Vzck1zZ1BsYXllclN0YXRzVXBkYXRlKCkge1xuICAgIHJldHVybiB7IHZlcnNpb246IDAsIHN0YXRzOiBbXSwgdXNlcklkOiAwLCBjcmM6IDAgfTtcbn1cbmV4cG9ydHMuQ0NTVXNyTXNnUGxheWVyU3RhdHNVcGRhdGUgPSB7XG4gICAgZW5jb2RlKG1lc3NhZ2UsIHdyaXRlciA9IG1pbmltYWxfMS5Xcml0ZXIuY3JlYXRlKCkpIHtcbiAgICAgICAgaWYgKG1lc3NhZ2UudmVyc2lvbiAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig4KS5pbnQzMihtZXNzYWdlLnZlcnNpb24pO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3QgdiBvZiBtZXNzYWdlLnN0YXRzKSB7XG4gICAgICAgICAgICBleHBvcnRzLkNDU1Vzck1zZ1BsYXllclN0YXRzVXBkYXRlX1N0YXQuZW5jb2RlKHYsIHdyaXRlci51aW50MzIoMzQpLmZvcmsoKSkubGRlbGltKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UudXNlcklkICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDQwKS5pbnQzMihtZXNzYWdlLnVzZXJJZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UuY3JjICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDQ4KS5pbnQzMihtZXNzYWdlLmNyYyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9LFxuICAgIGRlY29kZShpbnB1dCwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IGlucHV0IGluc3RhbmNlb2YgbWluaW1hbF8xLlJlYWRlciA/IGlucHV0IDogbmV3IG1pbmltYWxfMS5SZWFkZXIoaW5wdXQpO1xuICAgICAgICBsZXQgZW5kID0gbGVuZ3RoID09PSB1bmRlZmluZWQgPyByZWFkZXIubGVuIDogcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDQ1NVc3JNc2dQbGF5ZXJTdGF0c1VwZGF0ZSgpO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudmVyc2lvbiA9IHJlYWRlci5pbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Uuc3RhdHMucHVzaChleHBvcnRzLkNDU1Vzck1zZ1BsYXllclN0YXRzVXBkYXRlX1N0YXQuZGVjb2RlKHJlYWRlciwgcmVhZGVyLnVpbnQzMigpKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS51c2VySWQgPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmNyYyA9IHJlYWRlci5pbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICByZWFkZXIuc2tpcFR5cGUodGFnICYgNyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH0sXG4gICAgZnJvbVBhcnRpYWwob2JqZWN0KSB7XG4gICAgICAgIHZhciBfYSwgX2IsIF9jLCBfZDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDQ1NVc3JNc2dQbGF5ZXJTdGF0c1VwZGF0ZSgpO1xuICAgICAgICBtZXNzYWdlLnZlcnNpb24gPSAoX2EgPSBvYmplY3QudmVyc2lvbikgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMDtcbiAgICAgICAgbWVzc2FnZS5zdGF0cyA9XG4gICAgICAgICAgICAoKF9iID0gb2JqZWN0LnN0YXRzKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IubWFwKGUgPT4gZXhwb3J0cy5DQ1NVc3JNc2dQbGF5ZXJTdGF0c1VwZGF0ZV9TdGF0LmZyb21QYXJ0aWFsKGUpKSkgfHxcbiAgICAgICAgICAgICAgICBbXTtcbiAgICAgICAgbWVzc2FnZS51c2VySWQgPSAoX2MgPSBvYmplY3QudXNlcklkKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiAwO1xuICAgICAgICBtZXNzYWdlLmNyYyA9IChfZCA9IG9iamVjdC5jcmMpICE9PSBudWxsICYmIF9kICE9PSB2b2lkIDAgPyBfZCA6IDA7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbn07XG5mdW5jdGlvbiBjcmVhdGVCYXNlQ0NTVXNyTXNnUGxheWVyU3RhdHNVcGRhdGVfU3RhdCgpIHtcbiAgICByZXR1cm4geyBpZHg6IDAsIGRlbHRhOiAwIH07XG59XG5leHBvcnRzLkNDU1Vzck1zZ1BsYXllclN0YXRzVXBkYXRlX1N0YXQgPSB7XG4gICAgZW5jb2RlKG1lc3NhZ2UsIHdyaXRlciA9IG1pbmltYWxfMS5Xcml0ZXIuY3JlYXRlKCkpIHtcbiAgICAgICAgaWYgKG1lc3NhZ2UuaWR4ICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDgpLmludDMyKG1lc3NhZ2UuaWR4KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5kZWx0YSAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigxNikuaW50MzIobWVzc2FnZS5kZWx0YSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9LFxuICAgIGRlY29kZShpbnB1dCwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IGlucHV0IGluc3RhbmNlb2YgbWluaW1hbF8xLlJlYWRlciA/IGlucHV0IDogbmV3IG1pbmltYWxfMS5SZWFkZXIoaW5wdXQpO1xuICAgICAgICBsZXQgZW5kID0gbGVuZ3RoID09PSB1bmRlZmluZWQgPyByZWFkZXIubGVuIDogcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDQ1NVc3JNc2dQbGF5ZXJTdGF0c1VwZGF0ZV9TdGF0KCk7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBjb25zdCB0YWcgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKHRhZyA+Pj4gMykge1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5pZHggPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmRlbHRhID0gcmVhZGVyLmludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJlYWRlci5za2lwVHlwZSh0YWcgJiA3KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfSxcbiAgICBmcm9tUGFydGlhbChvYmplY3QpIHtcbiAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDQ1NVc3JNc2dQbGF5ZXJTdGF0c1VwZGF0ZV9TdGF0KCk7XG4gICAgICAgIG1lc3NhZ2UuaWR4ID0gKF9hID0gb2JqZWN0LmlkeCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMDtcbiAgICAgICAgbWVzc2FnZS5kZWx0YSA9IChfYiA9IG9iamVjdC5kZWx0YSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogMDtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxufTtcbmZ1bmN0aW9uIGNyZWF0ZUJhc2VDQ1NVc3JNc2dEaXNwbGF5SW52ZW50b3J5KCkge1xuICAgIHJldHVybiB7IGRpc3BsYXk6IGZhbHNlLCB1c2VySWQ6IDAgfTtcbn1cbmV4cG9ydHMuQ0NTVXNyTXNnRGlzcGxheUludmVudG9yeSA9IHtcbiAgICBlbmNvZGUobWVzc2FnZSwgd3JpdGVyID0gbWluaW1hbF8xLldyaXRlci5jcmVhdGUoKSkge1xuICAgICAgICBpZiAobWVzc2FnZS5kaXNwbGF5ID09PSB0cnVlKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDgpLmJvb2wobWVzc2FnZS5kaXNwbGF5KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS51c2VySWQgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMTYpLmludDMyKG1lc3NhZ2UudXNlcklkKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH0sXG4gICAgZGVjb2RlKGlucHV0LCBsZW5ndGgpIHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gaW5wdXQgaW5zdGFuY2VvZiBtaW5pbWFsXzEuUmVhZGVyID8gaW5wdXQgOiBuZXcgbWluaW1hbF8xLlJlYWRlcihpbnB1dCk7XG4gICAgICAgIGxldCBlbmQgPSBsZW5ndGggPT09IHVuZGVmaW5lZCA/IHJlYWRlci5sZW4gOiByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNDU1Vzck1zZ0Rpc3BsYXlJbnZlbnRvcnkoKTtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhZyA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgIHN3aXRjaCAodGFnID4+PiAzKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmRpc3BsYXkgPSByZWFkZXIuYm9vbCgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudXNlcklkID0gcmVhZGVyLmludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJlYWRlci5za2lwVHlwZSh0YWcgJiA3KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfSxcbiAgICBmcm9tUGFydGlhbChvYmplY3QpIHtcbiAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDQ1NVc3JNc2dEaXNwbGF5SW52ZW50b3J5KCk7XG4gICAgICAgIG1lc3NhZ2UuZGlzcGxheSA9IChfYSA9IG9iamVjdC5kaXNwbGF5KSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBmYWxzZTtcbiAgICAgICAgbWVzc2FnZS51c2VySWQgPSAoX2IgPSBvYmplY3QudXNlcklkKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAwO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG59O1xuZnVuY3Rpb24gY3JlYXRlQmFzZUNDU1Vzck1zZ1F1ZXN0UHJvZ3Jlc3MoKSB7XG4gICAgcmV0dXJuIHsgcXVlc3RJZDogMCwgbm9ybWFsUG9pbnRzOiAwLCBib251c1BvaW50czogMCwgaXNFdmVudFF1ZXN0OiBmYWxzZSB9O1xufVxuZXhwb3J0cy5DQ1NVc3JNc2dRdWVzdFByb2dyZXNzID0ge1xuICAgIGVuY29kZShtZXNzYWdlLCB3cml0ZXIgPSBtaW5pbWFsXzEuV3JpdGVyLmNyZWF0ZSgpKSB7XG4gICAgICAgIGlmIChtZXNzYWdlLnF1ZXN0SWQgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoOCkudWludDMyKG1lc3NhZ2UucXVlc3RJZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2Uubm9ybWFsUG9pbnRzICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDE2KS51aW50MzIobWVzc2FnZS5ub3JtYWxQb2ludHMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLmJvbnVzUG9pbnRzICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDI0KS51aW50MzIobWVzc2FnZS5ib251c1BvaW50cyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UuaXNFdmVudFF1ZXN0ID09PSB0cnVlKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDMyKS5ib29sKG1lc3NhZ2UuaXNFdmVudFF1ZXN0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH0sXG4gICAgZGVjb2RlKGlucHV0LCBsZW5ndGgpIHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gaW5wdXQgaW5zdGFuY2VvZiBtaW5pbWFsXzEuUmVhZGVyID8gaW5wdXQgOiBuZXcgbWluaW1hbF8xLlJlYWRlcihpbnB1dCk7XG4gICAgICAgIGxldCBlbmQgPSBsZW5ndGggPT09IHVuZGVmaW5lZCA/IHJlYWRlci5sZW4gOiByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNDU1Vzck1zZ1F1ZXN0UHJvZ3Jlc3MoKTtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhZyA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgIHN3aXRjaCAodGFnID4+PiAzKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnF1ZXN0SWQgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5ub3JtYWxQb2ludHMgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5ib251c1BvaW50cyA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmlzRXZlbnRRdWVzdCA9IHJlYWRlci5ib29sKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJlYWRlci5za2lwVHlwZSh0YWcgJiA3KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfSxcbiAgICBmcm9tUGFydGlhbChvYmplY3QpIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2MsIF9kO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNDU1Vzck1zZ1F1ZXN0UHJvZ3Jlc3MoKTtcbiAgICAgICAgbWVzc2FnZS5xdWVzdElkID0gKF9hID0gb2JqZWN0LnF1ZXN0SWQpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IDA7XG4gICAgICAgIG1lc3NhZ2Uubm9ybWFsUG9pbnRzID0gKF9iID0gb2JqZWN0Lm5vcm1hbFBvaW50cykgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogMDtcbiAgICAgICAgbWVzc2FnZS5ib251c1BvaW50cyA9IChfYyA9IG9iamVjdC5ib251c1BvaW50cykgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogMDtcbiAgICAgICAgbWVzc2FnZS5pc0V2ZW50UXVlc3QgPSAoX2QgPSBvYmplY3QuaXNFdmVudFF1ZXN0KSAhPT0gbnVsbCAmJiBfZCAhPT0gdm9pZCAwID8gX2QgOiBmYWxzZTtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxufTtcbmZ1bmN0aW9uIGNyZWF0ZUJhc2VDQ1NVc3JNc2dTY29yZUxlYWRlcmJvYXJkRGF0YSgpIHtcbiAgICByZXR1cm4geyBkYXRhOiB1bmRlZmluZWQgfTtcbn1cbmV4cG9ydHMuQ0NTVXNyTXNnU2NvcmVMZWFkZXJib2FyZERhdGEgPSB7XG4gICAgZW5jb2RlKG1lc3NhZ2UsIHdyaXRlciA9IG1pbmltYWxfMS5Xcml0ZXIuY3JlYXRlKCkpIHtcbiAgICAgICAgaWYgKG1lc3NhZ2UuZGF0YSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjc3RyaWtlMTVfZ2NtZXNzYWdlc18xLlNjb3JlTGVhZGVyYm9hcmREYXRhLmVuY29kZShtZXNzYWdlLmRhdGEsIHdyaXRlci51aW50MzIoMTApLmZvcmsoKSkubGRlbGltKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9LFxuICAgIGRlY29kZShpbnB1dCwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IGlucHV0IGluc3RhbmNlb2YgbWluaW1hbF8xLlJlYWRlciA/IGlucHV0IDogbmV3IG1pbmltYWxfMS5SZWFkZXIoaW5wdXQpO1xuICAgICAgICBsZXQgZW5kID0gbGVuZ3RoID09PSB1bmRlZmluZWQgPyByZWFkZXIubGVuIDogcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDQ1NVc3JNc2dTY29yZUxlYWRlcmJvYXJkRGF0YSgpO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZGF0YSA9IGNzdHJpa2UxNV9nY21lc3NhZ2VzXzEuU2NvcmVMZWFkZXJib2FyZERhdGEuZGVjb2RlKHJlYWRlciwgcmVhZGVyLnVpbnQzMigpKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmVhZGVyLnNraXBUeXBlKHRhZyAmIDcpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9LFxuICAgIGZyb21QYXJ0aWFsKG9iamVjdCkge1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNDU1Vzck1zZ1Njb3JlTGVhZGVyYm9hcmREYXRhKCk7XG4gICAgICAgIG1lc3NhZ2UuZGF0YSA9XG4gICAgICAgICAgICBvYmplY3QuZGF0YSAhPT0gdW5kZWZpbmVkICYmIG9iamVjdC5kYXRhICE9PSBudWxsXG4gICAgICAgICAgICAgICAgPyBjc3RyaWtlMTVfZ2NtZXNzYWdlc18xLlNjb3JlTGVhZGVyYm9hcmREYXRhLmZyb21QYXJ0aWFsKG9iamVjdC5kYXRhKVxuICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG59O1xuZnVuY3Rpb24gY3JlYXRlQmFzZUNDU1Vzck1zZ1BsYXllckRlY2FsRGlnaXRhbFNpZ25hdHVyZSgpIHtcbiAgICByZXR1cm4geyBkYXRhOiB1bmRlZmluZWQgfTtcbn1cbmV4cG9ydHMuQ0NTVXNyTXNnUGxheWVyRGVjYWxEaWdpdGFsU2lnbmF0dXJlID0ge1xuICAgIGVuY29kZShtZXNzYWdlLCB3cml0ZXIgPSBtaW5pbWFsXzEuV3JpdGVyLmNyZWF0ZSgpKSB7XG4gICAgICAgIGlmIChtZXNzYWdlLmRhdGEgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY3N0cmlrZTE1X2djbWVzc2FnZXNfMS5QbGF5ZXJEZWNhbERpZ2l0YWxTaWduYXR1cmUuZW5jb2RlKG1lc3NhZ2UuZGF0YSwgd3JpdGVyLnVpbnQzMigxMCkuZm9yaygpKS5sZGVsaW0oKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH0sXG4gICAgZGVjb2RlKGlucHV0LCBsZW5ndGgpIHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gaW5wdXQgaW5zdGFuY2VvZiBtaW5pbWFsXzEuUmVhZGVyID8gaW5wdXQgOiBuZXcgbWluaW1hbF8xLlJlYWRlcihpbnB1dCk7XG4gICAgICAgIGxldCBlbmQgPSBsZW5ndGggPT09IHVuZGVmaW5lZCA/IHJlYWRlci5sZW4gOiByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNDU1Vzck1zZ1BsYXllckRlY2FsRGlnaXRhbFNpZ25hdHVyZSgpO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZGF0YSA9IGNzdHJpa2UxNV9nY21lc3NhZ2VzXzEuUGxheWVyRGVjYWxEaWdpdGFsU2lnbmF0dXJlLmRlY29kZShyZWFkZXIsIHJlYWRlci51aW50MzIoKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJlYWRlci5za2lwVHlwZSh0YWcgJiA3KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfSxcbiAgICBmcm9tUGFydGlhbChvYmplY3QpIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDQ1NVc3JNc2dQbGF5ZXJEZWNhbERpZ2l0YWxTaWduYXR1cmUoKTtcbiAgICAgICAgbWVzc2FnZS5kYXRhID1cbiAgICAgICAgICAgIG9iamVjdC5kYXRhICE9PSB1bmRlZmluZWQgJiYgb2JqZWN0LmRhdGEgIT09IG51bGxcbiAgICAgICAgICAgICAgICA/IGNzdHJpa2UxNV9nY21lc3NhZ2VzXzEuUGxheWVyRGVjYWxEaWdpdGFsU2lnbmF0dXJlLmZyb21QYXJ0aWFsKG9iamVjdC5kYXRhKVxuICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG59O1xuZnVuY3Rpb24gY3JlYXRlQmFzZUNDU1Vzck1zZ1hSYW5rR2V0KCkge1xuICAgIHJldHVybiB7IG1vZGVJZHg6IDAsIGNvbnRyb2xsZXI6IDAgfTtcbn1cbmV4cG9ydHMuQ0NTVXNyTXNnWFJhbmtHZXQgPSB7XG4gICAgZW5jb2RlKG1lc3NhZ2UsIHdyaXRlciA9IG1pbmltYWxfMS5Xcml0ZXIuY3JlYXRlKCkpIHtcbiAgICAgICAgaWYgKG1lc3NhZ2UubW9kZUlkeCAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig4KS5pbnQzMihtZXNzYWdlLm1vZGVJZHgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLmNvbnRyb2xsZXIgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMTYpLmludDMyKG1lc3NhZ2UuY29udHJvbGxlcik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9LFxuICAgIGRlY29kZShpbnB1dCwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IGlucHV0IGluc3RhbmNlb2YgbWluaW1hbF8xLlJlYWRlciA/IGlucHV0IDogbmV3IG1pbmltYWxfMS5SZWFkZXIoaW5wdXQpO1xuICAgICAgICBsZXQgZW5kID0gbGVuZ3RoID09PSB1bmRlZmluZWQgPyByZWFkZXIubGVuIDogcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDQ1NVc3JNc2dYUmFua0dldCgpO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UubW9kZUlkeCA9IHJlYWRlci5pbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuY29udHJvbGxlciA9IHJlYWRlci5pbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICByZWFkZXIuc2tpcFR5cGUodGFnICYgNyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH0sXG4gICAgZnJvbVBhcnRpYWwob2JqZWN0KSB7XG4gICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ0NTVXNyTXNnWFJhbmtHZXQoKTtcbiAgICAgICAgbWVzc2FnZS5tb2RlSWR4ID0gKF9hID0gb2JqZWN0Lm1vZGVJZHgpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IDA7XG4gICAgICAgIG1lc3NhZ2UuY29udHJvbGxlciA9IChfYiA9IG9iamVjdC5jb250cm9sbGVyKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAwO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG59O1xuZnVuY3Rpb24gY3JlYXRlQmFzZUNDU1Vzck1zZ1hSYW5rVXBkKCkge1xuICAgIHJldHVybiB7IG1vZGVJZHg6IDAsIGNvbnRyb2xsZXI6IDAsIHJhbmtpbmc6IDAgfTtcbn1cbmV4cG9ydHMuQ0NTVXNyTXNnWFJhbmtVcGQgPSB7XG4gICAgZW5jb2RlKG1lc3NhZ2UsIHdyaXRlciA9IG1pbmltYWxfMS5Xcml0ZXIuY3JlYXRlKCkpIHtcbiAgICAgICAgaWYgKG1lc3NhZ2UubW9kZUlkeCAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig4KS5pbnQzMihtZXNzYWdlLm1vZGVJZHgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLmNvbnRyb2xsZXIgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMTYpLmludDMyKG1lc3NhZ2UuY29udHJvbGxlcik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UucmFua2luZyAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigyNCkuaW50MzIobWVzc2FnZS5yYW5raW5nKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH0sXG4gICAgZGVjb2RlKGlucHV0LCBsZW5ndGgpIHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gaW5wdXQgaW5zdGFuY2VvZiBtaW5pbWFsXzEuUmVhZGVyID8gaW5wdXQgOiBuZXcgbWluaW1hbF8xLlJlYWRlcihpbnB1dCk7XG4gICAgICAgIGxldCBlbmQgPSBsZW5ndGggPT09IHVuZGVmaW5lZCA/IHJlYWRlci5sZW4gOiByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNDU1Vzck1zZ1hSYW5rVXBkKCk7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBjb25zdCB0YWcgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKHRhZyA+Pj4gMykge1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5tb2RlSWR4ID0gcmVhZGVyLmludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5jb250cm9sbGVyID0gcmVhZGVyLmludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5yYW5raW5nID0gcmVhZGVyLmludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJlYWRlci5za2lwVHlwZSh0YWcgJiA3KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfSxcbiAgICBmcm9tUGFydGlhbChvYmplY3QpIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2M7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ0NTVXNyTXNnWFJhbmtVcGQoKTtcbiAgICAgICAgbWVzc2FnZS5tb2RlSWR4ID0gKF9hID0gb2JqZWN0Lm1vZGVJZHgpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IDA7XG4gICAgICAgIG1lc3NhZ2UuY29udHJvbGxlciA9IChfYiA9IG9iamVjdC5jb250cm9sbGVyKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAwO1xuICAgICAgICBtZXNzYWdlLnJhbmtpbmcgPSAoX2MgPSBvYmplY3QucmFua2luZykgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogMDtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxufTtcbmZ1bmN0aW9uIGNyZWF0ZUJhc2VDQ1NVc3JNc2dDYWxsVm90ZUZhaWxlZCgpIHtcbiAgICByZXR1cm4geyByZWFzb246IDAsIHRpbWU6IDAgfTtcbn1cbmV4cG9ydHMuQ0NTVXNyTXNnQ2FsbFZvdGVGYWlsZWQgPSB7XG4gICAgZW5jb2RlKG1lc3NhZ2UsIHdyaXRlciA9IG1pbmltYWxfMS5Xcml0ZXIuY3JlYXRlKCkpIHtcbiAgICAgICAgaWYgKG1lc3NhZ2UucmVhc29uICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDgpLmludDMyKG1lc3NhZ2UucmVhc29uKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS50aW1lICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDE2KS5pbnQzMihtZXNzYWdlLnRpbWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfSxcbiAgICBkZWNvZGUoaW5wdXQsIGxlbmd0aCkge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBpbnB1dCBpbnN0YW5jZW9mIG1pbmltYWxfMS5SZWFkZXIgPyBpbnB1dCA6IG5ldyBtaW5pbWFsXzEuUmVhZGVyKGlucHV0KTtcbiAgICAgICAgbGV0IGVuZCA9IGxlbmd0aCA9PT0gdW5kZWZpbmVkID8gcmVhZGVyLmxlbiA6IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ0NTVXNyTXNnQ2FsbFZvdGVGYWlsZWQoKTtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhZyA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgIHN3aXRjaCAodGFnID4+PiAzKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnJlYXNvbiA9IHJlYWRlci5pbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudGltZSA9IHJlYWRlci5pbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICByZWFkZXIuc2tpcFR5cGUodGFnICYgNyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH0sXG4gICAgZnJvbVBhcnRpYWwob2JqZWN0KSB7XG4gICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ0NTVXNyTXNnQ2FsbFZvdGVGYWlsZWQoKTtcbiAgICAgICAgbWVzc2FnZS5yZWFzb24gPSAoX2EgPSBvYmplY3QucmVhc29uKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAwO1xuICAgICAgICBtZXNzYWdlLnRpbWUgPSAoX2IgPSBvYmplY3QudGltZSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogMDtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxufTtcbmZ1bmN0aW9uIGNyZWF0ZUJhc2VDQ1NVc3JNc2dWb3RlU3RhcnQoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgdGVhbTogMCxcbiAgICAgICAgZW50SWR4OiAwLFxuICAgICAgICB2b3RlVHlwZTogMCxcbiAgICAgICAgZGlzcFN0cjogXCJcIixcbiAgICAgICAgZGV0YWlsc1N0cjogXCJcIixcbiAgICAgICAgb3RoZXJUZWFtU3RyOiBcIlwiLFxuICAgICAgICBpc1llc05vVm90ZTogZmFsc2UsXG4gICAgICAgIGVudGlkeFRhcmdldDogMFxuICAgIH07XG59XG5leHBvcnRzLkNDU1Vzck1zZ1ZvdGVTdGFydCA9IHtcbiAgICBlbmNvZGUobWVzc2FnZSwgd3JpdGVyID0gbWluaW1hbF8xLldyaXRlci5jcmVhdGUoKSkge1xuICAgICAgICBpZiAobWVzc2FnZS50ZWFtICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDgpLmludDMyKG1lc3NhZ2UudGVhbSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UuZW50SWR4ICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDE2KS5pbnQzMihtZXNzYWdlLmVudElkeCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2Uudm90ZVR5cGUgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMjQpLmludDMyKG1lc3NhZ2Uudm90ZVR5cGUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLmRpc3BTdHIgIT09IFwiXCIpIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMzQpLnN0cmluZyhtZXNzYWdlLmRpc3BTdHIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLmRldGFpbHNTdHIgIT09IFwiXCIpIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoNDIpLnN0cmluZyhtZXNzYWdlLmRldGFpbHNTdHIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLm90aGVyVGVhbVN0ciAhPT0gXCJcIikge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig1MCkuc3RyaW5nKG1lc3NhZ2Uub3RoZXJUZWFtU3RyKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5pc1llc05vVm90ZSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig1NikuYm9vbChtZXNzYWdlLmlzWWVzTm9Wb3RlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5lbnRpZHhUYXJnZXQgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoNjQpLmludDMyKG1lc3NhZ2UuZW50aWR4VGFyZ2V0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH0sXG4gICAgZGVjb2RlKGlucHV0LCBsZW5ndGgpIHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gaW5wdXQgaW5zdGFuY2VvZiBtaW5pbWFsXzEuUmVhZGVyID8gaW5wdXQgOiBuZXcgbWluaW1hbF8xLlJlYWRlcihpbnB1dCk7XG4gICAgICAgIGxldCBlbmQgPSBsZW5ndGggPT09IHVuZGVmaW5lZCA/IHJlYWRlci5sZW4gOiByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNDU1Vzck1zZ1ZvdGVTdGFydCgpO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudGVhbSA9IHJlYWRlci5pbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZW50SWR4ID0gcmVhZGVyLmludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS52b3RlVHlwZSA9IHJlYWRlci5pbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZGlzcFN0ciA9IHJlYWRlci5zdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmRldGFpbHNTdHIgPSByZWFkZXIuc3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5vdGhlclRlYW1TdHIgPSByZWFkZXIuc3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNzpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5pc1llc05vVm90ZSA9IHJlYWRlci5ib29sKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgODpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5lbnRpZHhUYXJnZXQgPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmVhZGVyLnNraXBUeXBlKHRhZyAmIDcpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9LFxuICAgIGZyb21QYXJ0aWFsKG9iamVjdCkge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYywgX2QsIF9lLCBfZiwgX2csIF9oO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNDU1Vzck1zZ1ZvdGVTdGFydCgpO1xuICAgICAgICBtZXNzYWdlLnRlYW0gPSAoX2EgPSBvYmplY3QudGVhbSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMDtcbiAgICAgICAgbWVzc2FnZS5lbnRJZHggPSAoX2IgPSBvYmplY3QuZW50SWR4KSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAwO1xuICAgICAgICBtZXNzYWdlLnZvdGVUeXBlID0gKF9jID0gb2JqZWN0LnZvdGVUeXBlKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiAwO1xuICAgICAgICBtZXNzYWdlLmRpc3BTdHIgPSAoX2QgPSBvYmplY3QuZGlzcFN0cikgIT09IG51bGwgJiYgX2QgIT09IHZvaWQgMCA/IF9kIDogXCJcIjtcbiAgICAgICAgbWVzc2FnZS5kZXRhaWxzU3RyID0gKF9lID0gb2JqZWN0LmRldGFpbHNTdHIpICE9PSBudWxsICYmIF9lICE9PSB2b2lkIDAgPyBfZSA6IFwiXCI7XG4gICAgICAgIG1lc3NhZ2Uub3RoZXJUZWFtU3RyID0gKF9mID0gb2JqZWN0Lm90aGVyVGVhbVN0cikgIT09IG51bGwgJiYgX2YgIT09IHZvaWQgMCA/IF9mIDogXCJcIjtcbiAgICAgICAgbWVzc2FnZS5pc1llc05vVm90ZSA9IChfZyA9IG9iamVjdC5pc1llc05vVm90ZSkgIT09IG51bGwgJiYgX2cgIT09IHZvaWQgMCA/IF9nIDogZmFsc2U7XG4gICAgICAgIG1lc3NhZ2UuZW50aWR4VGFyZ2V0ID0gKF9oID0gb2JqZWN0LmVudGlkeFRhcmdldCkgIT09IG51bGwgJiYgX2ggIT09IHZvaWQgMCA/IF9oIDogMDtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxufTtcbmZ1bmN0aW9uIGNyZWF0ZUJhc2VDQ1NVc3JNc2dWb3RlUGFzcygpIHtcbiAgICByZXR1cm4geyB0ZWFtOiAwLCB2b3RlVHlwZTogMCwgZGlzcFN0cjogXCJcIiwgZGV0YWlsc1N0cjogXCJcIiB9O1xufVxuZXhwb3J0cy5DQ1NVc3JNc2dWb3RlUGFzcyA9IHtcbiAgICBlbmNvZGUobWVzc2FnZSwgd3JpdGVyID0gbWluaW1hbF8xLldyaXRlci5jcmVhdGUoKSkge1xuICAgICAgICBpZiAobWVzc2FnZS50ZWFtICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDgpLmludDMyKG1lc3NhZ2UudGVhbSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2Uudm90ZVR5cGUgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMTYpLmludDMyKG1lc3NhZ2Uudm90ZVR5cGUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLmRpc3BTdHIgIT09IFwiXCIpIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMjYpLnN0cmluZyhtZXNzYWdlLmRpc3BTdHIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLmRldGFpbHNTdHIgIT09IFwiXCIpIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMzQpLnN0cmluZyhtZXNzYWdlLmRldGFpbHNTdHIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfSxcbiAgICBkZWNvZGUoaW5wdXQsIGxlbmd0aCkge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBpbnB1dCBpbnN0YW5jZW9mIG1pbmltYWxfMS5SZWFkZXIgPyBpbnB1dCA6IG5ldyBtaW5pbWFsXzEuUmVhZGVyKGlucHV0KTtcbiAgICAgICAgbGV0IGVuZCA9IGxlbmd0aCA9PT0gdW5kZWZpbmVkID8gcmVhZGVyLmxlbiA6IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ0NTVXNyTXNnVm90ZVBhc3MoKTtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhZyA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgIHN3aXRjaCAodGFnID4+PiAzKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnRlYW0gPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnZvdGVUeXBlID0gcmVhZGVyLmludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5kaXNwU3RyID0gcmVhZGVyLnN0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZGV0YWlsc1N0ciA9IHJlYWRlci5zdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmVhZGVyLnNraXBUeXBlKHRhZyAmIDcpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9LFxuICAgIGZyb21QYXJ0aWFsKG9iamVjdCkge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYywgX2Q7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ0NTVXNyTXNnVm90ZVBhc3MoKTtcbiAgICAgICAgbWVzc2FnZS50ZWFtID0gKF9hID0gb2JqZWN0LnRlYW0pICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IDA7XG4gICAgICAgIG1lc3NhZ2Uudm90ZVR5cGUgPSAoX2IgPSBvYmplY3Qudm90ZVR5cGUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IDA7XG4gICAgICAgIG1lc3NhZ2UuZGlzcFN0ciA9IChfYyA9IG9iamVjdC5kaXNwU3RyKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiBcIlwiO1xuICAgICAgICBtZXNzYWdlLmRldGFpbHNTdHIgPSAoX2QgPSBvYmplY3QuZGV0YWlsc1N0cikgIT09IG51bGwgJiYgX2QgIT09IHZvaWQgMCA/IF9kIDogXCJcIjtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxufTtcbmZ1bmN0aW9uIGNyZWF0ZUJhc2VDQ1NVc3JNc2dWb3RlRmFpbGVkKCkge1xuICAgIHJldHVybiB7IHRlYW06IDAsIHJlYXNvbjogMCB9O1xufVxuZXhwb3J0cy5DQ1NVc3JNc2dWb3RlRmFpbGVkID0ge1xuICAgIGVuY29kZShtZXNzYWdlLCB3cml0ZXIgPSBtaW5pbWFsXzEuV3JpdGVyLmNyZWF0ZSgpKSB7XG4gICAgICAgIGlmIChtZXNzYWdlLnRlYW0gIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoOCkuaW50MzIobWVzc2FnZS50ZWFtKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5yZWFzb24gIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMTYpLmludDMyKG1lc3NhZ2UucmVhc29uKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH0sXG4gICAgZGVjb2RlKGlucHV0LCBsZW5ndGgpIHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gaW5wdXQgaW5zdGFuY2VvZiBtaW5pbWFsXzEuUmVhZGVyID8gaW5wdXQgOiBuZXcgbWluaW1hbF8xLlJlYWRlcihpbnB1dCk7XG4gICAgICAgIGxldCBlbmQgPSBsZW5ndGggPT09IHVuZGVmaW5lZCA/IHJlYWRlci5sZW4gOiByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNDU1Vzck1zZ1ZvdGVGYWlsZWQoKTtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhZyA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgIHN3aXRjaCAodGFnID4+PiAzKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnRlYW0gPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnJlYXNvbiA9IHJlYWRlci5pbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICByZWFkZXIuc2tpcFR5cGUodGFnICYgNyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH0sXG4gICAgZnJvbVBhcnRpYWwob2JqZWN0KSB7XG4gICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ0NTVXNyTXNnVm90ZUZhaWxlZCgpO1xuICAgICAgICBtZXNzYWdlLnRlYW0gPSAoX2EgPSBvYmplY3QudGVhbSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMDtcbiAgICAgICAgbWVzc2FnZS5yZWFzb24gPSAoX2IgPSBvYmplY3QucmVhc29uKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAwO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG59O1xuZnVuY3Rpb24gY3JlYXRlQmFzZUNDU1Vzck1zZ1ZvdGVTZXR1cCgpIHtcbiAgICByZXR1cm4geyBwb3RlbnRpYWxJc3N1ZXM6IFtdIH07XG59XG5leHBvcnRzLkNDU1Vzck1zZ1ZvdGVTZXR1cCA9IHtcbiAgICBlbmNvZGUobWVzc2FnZSwgd3JpdGVyID0gbWluaW1hbF8xLldyaXRlci5jcmVhdGUoKSkge1xuICAgICAgICBmb3IgKGNvbnN0IHYgb2YgbWVzc2FnZS5wb3RlbnRpYWxJc3N1ZXMpIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMTApLnN0cmluZyh2KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH0sXG4gICAgZGVjb2RlKGlucHV0LCBsZW5ndGgpIHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gaW5wdXQgaW5zdGFuY2VvZiBtaW5pbWFsXzEuUmVhZGVyID8gaW5wdXQgOiBuZXcgbWluaW1hbF8xLlJlYWRlcihpbnB1dCk7XG4gICAgICAgIGxldCBlbmQgPSBsZW5ndGggPT09IHVuZGVmaW5lZCA/IHJlYWRlci5sZW4gOiByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNDU1Vzck1zZ1ZvdGVTZXR1cCgpO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UucG90ZW50aWFsSXNzdWVzLnB1c2gocmVhZGVyLnN0cmluZygpKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmVhZGVyLnNraXBUeXBlKHRhZyAmIDcpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9LFxuICAgIGZyb21QYXJ0aWFsKG9iamVjdCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ0NTVXNyTXNnVm90ZVNldHVwKCk7XG4gICAgICAgIG1lc3NhZ2UucG90ZW50aWFsSXNzdWVzID0gKChfYSA9IG9iamVjdC5wb3RlbnRpYWxJc3N1ZXMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5tYXAoZSA9PiBlKSkgfHwgW107XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbn07XG5mdW5jdGlvbiBjcmVhdGVCYXNlQ0NTVXNyTXNnU2VuZExhc3RLaWxsZXJEYW1hZ2VUb0NsaWVudCgpIHtcbiAgICByZXR1cm4geyBudW1IaXRzR2l2ZW46IDAsIGRhbWFnZUdpdmVuOiAwLCBudW1IaXRzVGFrZW46IDAsIGRhbWFnZVRha2VuOiAwIH07XG59XG5leHBvcnRzLkNDU1Vzck1zZ1NlbmRMYXN0S2lsbGVyRGFtYWdlVG9DbGllbnQgPSB7XG4gICAgZW5jb2RlKG1lc3NhZ2UsIHdyaXRlciA9IG1pbmltYWxfMS5Xcml0ZXIuY3JlYXRlKCkpIHtcbiAgICAgICAgaWYgKG1lc3NhZ2UubnVtSGl0c0dpdmVuICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDgpLmludDMyKG1lc3NhZ2UubnVtSGl0c0dpdmVuKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5kYW1hZ2VHaXZlbiAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigxNikuaW50MzIobWVzc2FnZS5kYW1hZ2VHaXZlbik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UubnVtSGl0c1Rha2VuICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDI0KS5pbnQzMihtZXNzYWdlLm51bUhpdHNUYWtlbik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UuZGFtYWdlVGFrZW4gIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMzIpLmludDMyKG1lc3NhZ2UuZGFtYWdlVGFrZW4pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfSxcbiAgICBkZWNvZGUoaW5wdXQsIGxlbmd0aCkge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBpbnB1dCBpbnN0YW5jZW9mIG1pbmltYWxfMS5SZWFkZXIgPyBpbnB1dCA6IG5ldyBtaW5pbWFsXzEuUmVhZGVyKGlucHV0KTtcbiAgICAgICAgbGV0IGVuZCA9IGxlbmd0aCA9PT0gdW5kZWZpbmVkID8gcmVhZGVyLmxlbiA6IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ0NTVXNyTXNnU2VuZExhc3RLaWxsZXJEYW1hZ2VUb0NsaWVudCgpO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UubnVtSGl0c0dpdmVuID0gcmVhZGVyLmludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5kYW1hZ2VHaXZlbiA9IHJlYWRlci5pbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UubnVtSGl0c1Rha2VuID0gcmVhZGVyLmludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5kYW1hZ2VUYWtlbiA9IHJlYWRlci5pbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICByZWFkZXIuc2tpcFR5cGUodGFnICYgNyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH0sXG4gICAgZnJvbVBhcnRpYWwob2JqZWN0KSB7XG4gICAgICAgIHZhciBfYSwgX2IsIF9jLCBfZDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDQ1NVc3JNc2dTZW5kTGFzdEtpbGxlckRhbWFnZVRvQ2xpZW50KCk7XG4gICAgICAgIG1lc3NhZ2UubnVtSGl0c0dpdmVuID0gKF9hID0gb2JqZWN0Lm51bUhpdHNHaXZlbikgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMDtcbiAgICAgICAgbWVzc2FnZS5kYW1hZ2VHaXZlbiA9IChfYiA9IG9iamVjdC5kYW1hZ2VHaXZlbikgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogMDtcbiAgICAgICAgbWVzc2FnZS5udW1IaXRzVGFrZW4gPSAoX2MgPSBvYmplY3QubnVtSGl0c1Rha2VuKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiAwO1xuICAgICAgICBtZXNzYWdlLmRhbWFnZVRha2VuID0gKF9kID0gb2JqZWN0LmRhbWFnZVRha2VuKSAhPT0gbnVsbCAmJiBfZCAhPT0gdm9pZCAwID8gX2QgOiAwO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG59O1xuZnVuY3Rpb24gY3JlYXRlQmFzZUNDU1Vzck1zZ1NlcnZlclJhbmtVcGRhdGUoKSB7XG4gICAgcmV0dXJuIHsgcmFua1VwZGF0ZTogW10gfTtcbn1cbmV4cG9ydHMuQ0NTVXNyTXNnU2VydmVyUmFua1VwZGF0ZSA9IHtcbiAgICBlbmNvZGUobWVzc2FnZSwgd3JpdGVyID0gbWluaW1hbF8xLldyaXRlci5jcmVhdGUoKSkge1xuICAgICAgICBmb3IgKGNvbnN0IHYgb2YgbWVzc2FnZS5yYW5rVXBkYXRlKSB7XG4gICAgICAgICAgICBleHBvcnRzLkNDU1Vzck1zZ1NlcnZlclJhbmtVcGRhdGVfUmFua1VwZGF0ZS5lbmNvZGUodiwgd3JpdGVyLnVpbnQzMigxMCkuZm9yaygpKS5sZGVsaW0oKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH0sXG4gICAgZGVjb2RlKGlucHV0LCBsZW5ndGgpIHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gaW5wdXQgaW5zdGFuY2VvZiBtaW5pbWFsXzEuUmVhZGVyID8gaW5wdXQgOiBuZXcgbWluaW1hbF8xLlJlYWRlcihpbnB1dCk7XG4gICAgICAgIGxldCBlbmQgPSBsZW5ndGggPT09IHVuZGVmaW5lZCA/IHJlYWRlci5sZW4gOiByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNDU1Vzck1zZ1NlcnZlclJhbmtVcGRhdGUoKTtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhZyA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgIHN3aXRjaCAodGFnID4+PiAzKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnJhbmtVcGRhdGUucHVzaChleHBvcnRzLkNDU1Vzck1zZ1NlcnZlclJhbmtVcGRhdGVfUmFua1VwZGF0ZS5kZWNvZGUocmVhZGVyLCByZWFkZXIudWludDMyKCkpKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmVhZGVyLnNraXBUeXBlKHRhZyAmIDcpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9LFxuICAgIGZyb21QYXJ0aWFsKG9iamVjdCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ0NTVXNyTXNnU2VydmVyUmFua1VwZGF0ZSgpO1xuICAgICAgICBtZXNzYWdlLnJhbmtVcGRhdGUgPVxuICAgICAgICAgICAgKChfYSA9IG9iamVjdC5yYW5rVXBkYXRlKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EubWFwKGUgPT4gZXhwb3J0cy5DQ1NVc3JNc2dTZXJ2ZXJSYW5rVXBkYXRlX1JhbmtVcGRhdGUuZnJvbVBhcnRpYWwoZSkpKSB8fCBbXTtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxufTtcbmZ1bmN0aW9uIGNyZWF0ZUJhc2VDQ1NVc3JNc2dTZXJ2ZXJSYW5rVXBkYXRlX1JhbmtVcGRhdGUoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgYWNjb3VudElkOiAwLFxuICAgICAgICByYW5rT2xkOiAwLFxuICAgICAgICByYW5rTmV3OiAwLFxuICAgICAgICBudW1XaW5zOiAwLFxuICAgICAgICByYW5rQ2hhbmdlOiAwLFxuICAgICAgICByYW5rVHlwZUlkOiAwXG4gICAgfTtcbn1cbmV4cG9ydHMuQ0NTVXNyTXNnU2VydmVyUmFua1VwZGF0ZV9SYW5rVXBkYXRlID0ge1xuICAgIGVuY29kZShtZXNzYWdlLCB3cml0ZXIgPSBtaW5pbWFsXzEuV3JpdGVyLmNyZWF0ZSgpKSB7XG4gICAgICAgIGlmIChtZXNzYWdlLmFjY291bnRJZCAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig4KS5pbnQzMihtZXNzYWdlLmFjY291bnRJZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UucmFua09sZCAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigxNikuaW50MzIobWVzc2FnZS5yYW5rT2xkKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5yYW5rTmV3ICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDI0KS5pbnQzMihtZXNzYWdlLnJhbmtOZXcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLm51bVdpbnMgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMzIpLmludDMyKG1lc3NhZ2UubnVtV2lucyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UucmFua0NoYW5nZSAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig0NSkuZmxvYXQobWVzc2FnZS5yYW5rQ2hhbmdlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5yYW5rVHlwZUlkICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDQ4KS5pbnQzMihtZXNzYWdlLnJhbmtUeXBlSWQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfSxcbiAgICBkZWNvZGUoaW5wdXQsIGxlbmd0aCkge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBpbnB1dCBpbnN0YW5jZW9mIG1pbmltYWxfMS5SZWFkZXIgPyBpbnB1dCA6IG5ldyBtaW5pbWFsXzEuUmVhZGVyKGlucHV0KTtcbiAgICAgICAgbGV0IGVuZCA9IGxlbmd0aCA9PT0gdW5kZWZpbmVkID8gcmVhZGVyLmxlbiA6IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ0NTVXNyTXNnU2VydmVyUmFua1VwZGF0ZV9SYW5rVXBkYXRlKCk7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBjb25zdCB0YWcgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKHRhZyA+Pj4gMykge1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5hY2NvdW50SWQgPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnJhbmtPbGQgPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnJhbmtOZXcgPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLm51bVdpbnMgPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnJhbmtDaGFuZ2UgPSByZWFkZXIuZmxvYXQoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnJhbmtUeXBlSWQgPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmVhZGVyLnNraXBUeXBlKHRhZyAmIDcpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9LFxuICAgIGZyb21QYXJ0aWFsKG9iamVjdCkge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYywgX2QsIF9lLCBfZjtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDQ1NVc3JNc2dTZXJ2ZXJSYW5rVXBkYXRlX1JhbmtVcGRhdGUoKTtcbiAgICAgICAgbWVzc2FnZS5hY2NvdW50SWQgPSAoX2EgPSBvYmplY3QuYWNjb3VudElkKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAwO1xuICAgICAgICBtZXNzYWdlLnJhbmtPbGQgPSAoX2IgPSBvYmplY3QucmFua09sZCkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogMDtcbiAgICAgICAgbWVzc2FnZS5yYW5rTmV3ID0gKF9jID0gb2JqZWN0LnJhbmtOZXcpICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IDA7XG4gICAgICAgIG1lc3NhZ2UubnVtV2lucyA9IChfZCA9IG9iamVjdC5udW1XaW5zKSAhPT0gbnVsbCAmJiBfZCAhPT0gdm9pZCAwID8gX2QgOiAwO1xuICAgICAgICBtZXNzYWdlLnJhbmtDaGFuZ2UgPSAoX2UgPSBvYmplY3QucmFua0NoYW5nZSkgIT09IG51bGwgJiYgX2UgIT09IHZvaWQgMCA/IF9lIDogMDtcbiAgICAgICAgbWVzc2FnZS5yYW5rVHlwZUlkID0gKF9mID0gb2JqZWN0LnJhbmtUeXBlSWQpICE9PSBudWxsICYmIF9mICE9PSB2b2lkIDAgPyBfZiA6IDA7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbn07XG5mdW5jdGlvbiBjcmVhdGVCYXNlQ0NTVXNyTXNnWHBVcGRhdGUoKSB7XG4gICAgcmV0dXJuIHsgZGF0YTogdW5kZWZpbmVkIH07XG59XG5leHBvcnRzLkNDU1Vzck1zZ1hwVXBkYXRlID0ge1xuICAgIGVuY29kZShtZXNzYWdlLCB3cml0ZXIgPSBtaW5pbWFsXzEuV3JpdGVyLmNyZWF0ZSgpKSB7XG4gICAgICAgIGlmIChtZXNzYWdlLmRhdGEgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY3N0cmlrZTE1X2djbWVzc2FnZXNfMS5DTXNnR0NDc3RyaWtlMTVWMkdDMlNlcnZlck5vdGlmeVhQUmV3YXJkZWQuZW5jb2RlKG1lc3NhZ2UuZGF0YSwgd3JpdGVyLnVpbnQzMigxMCkuZm9yaygpKS5sZGVsaW0oKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH0sXG4gICAgZGVjb2RlKGlucHV0LCBsZW5ndGgpIHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gaW5wdXQgaW5zdGFuY2VvZiBtaW5pbWFsXzEuUmVhZGVyID8gaW5wdXQgOiBuZXcgbWluaW1hbF8xLlJlYWRlcihpbnB1dCk7XG4gICAgICAgIGxldCBlbmQgPSBsZW5ndGggPT09IHVuZGVmaW5lZCA/IHJlYWRlci5sZW4gOiByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNDU1Vzck1zZ1hwVXBkYXRlKCk7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBjb25zdCB0YWcgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKHRhZyA+Pj4gMykge1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5kYXRhID0gY3N0cmlrZTE1X2djbWVzc2FnZXNfMS5DTXNnR0NDc3RyaWtlMTVWMkdDMlNlcnZlck5vdGlmeVhQUmV3YXJkZWQuZGVjb2RlKHJlYWRlciwgcmVhZGVyLnVpbnQzMigpKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmVhZGVyLnNraXBUeXBlKHRhZyAmIDcpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9LFxuICAgIGZyb21QYXJ0aWFsKG9iamVjdCkge1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNDU1Vzck1zZ1hwVXBkYXRlKCk7XG4gICAgICAgIG1lc3NhZ2UuZGF0YSA9XG4gICAgICAgICAgICBvYmplY3QuZGF0YSAhPT0gdW5kZWZpbmVkICYmIG9iamVjdC5kYXRhICE9PSBudWxsXG4gICAgICAgICAgICAgICAgPyBjc3RyaWtlMTVfZ2NtZXNzYWdlc18xLkNNc2dHQ0NzdHJpa2UxNVYyR0MyU2VydmVyTm90aWZ5WFBSZXdhcmRlZC5mcm9tUGFydGlhbChvYmplY3QuZGF0YSlcbiAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxufTtcbmZ1bmN0aW9uIGNyZWF0ZUJhc2VDQ1NVc3JNc2dJdGVtUGlja3VwKCkge1xuICAgIHJldHVybiB7IGl0ZW06IFwiXCIgfTtcbn1cbmV4cG9ydHMuQ0NTVXNyTXNnSXRlbVBpY2t1cCA9IHtcbiAgICBlbmNvZGUobWVzc2FnZSwgd3JpdGVyID0gbWluaW1hbF8xLldyaXRlci5jcmVhdGUoKSkge1xuICAgICAgICBpZiAobWVzc2FnZS5pdGVtICE9PSBcIlwiKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDEwKS5zdHJpbmcobWVzc2FnZS5pdGVtKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH0sXG4gICAgZGVjb2RlKGlucHV0LCBsZW5ndGgpIHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gaW5wdXQgaW5zdGFuY2VvZiBtaW5pbWFsXzEuUmVhZGVyID8gaW5wdXQgOiBuZXcgbWluaW1hbF8xLlJlYWRlcihpbnB1dCk7XG4gICAgICAgIGxldCBlbmQgPSBsZW5ndGggPT09IHVuZGVmaW5lZCA/IHJlYWRlci5sZW4gOiByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNDU1Vzck1zZ0l0ZW1QaWNrdXAoKTtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhZyA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgIHN3aXRjaCAodGFnID4+PiAzKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLml0ZW0gPSByZWFkZXIuc3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJlYWRlci5za2lwVHlwZSh0YWcgJiA3KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfSxcbiAgICBmcm9tUGFydGlhbChvYmplY3QpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNDU1Vzck1zZ0l0ZW1QaWNrdXAoKTtcbiAgICAgICAgbWVzc2FnZS5pdGVtID0gKF9hID0gb2JqZWN0Lml0ZW0pICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IFwiXCI7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbn07XG5mdW5jdGlvbiBjcmVhdGVCYXNlQ0NTVXNyTXNnU2hvd01lbnUoKSB7XG4gICAgcmV0dXJuIHsgYml0c1ZhbGlkU2xvdHM6IDAsIGRpc3BsYXlUaW1lOiAwLCBtZW51U3RyaW5nOiBcIlwiIH07XG59XG5leHBvcnRzLkNDU1Vzck1zZ1Nob3dNZW51ID0ge1xuICAgIGVuY29kZShtZXNzYWdlLCB3cml0ZXIgPSBtaW5pbWFsXzEuV3JpdGVyLmNyZWF0ZSgpKSB7XG4gICAgICAgIGlmIChtZXNzYWdlLmJpdHNWYWxpZFNsb3RzICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDgpLmludDMyKG1lc3NhZ2UuYml0c1ZhbGlkU2xvdHMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLmRpc3BsYXlUaW1lICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDE2KS5pbnQzMihtZXNzYWdlLmRpc3BsYXlUaW1lKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5tZW51U3RyaW5nICE9PSBcIlwiKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDI2KS5zdHJpbmcobWVzc2FnZS5tZW51U3RyaW5nKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH0sXG4gICAgZGVjb2RlKGlucHV0LCBsZW5ndGgpIHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gaW5wdXQgaW5zdGFuY2VvZiBtaW5pbWFsXzEuUmVhZGVyID8gaW5wdXQgOiBuZXcgbWluaW1hbF8xLlJlYWRlcihpbnB1dCk7XG4gICAgICAgIGxldCBlbmQgPSBsZW5ndGggPT09IHVuZGVmaW5lZCA/IHJlYWRlci5sZW4gOiByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNDU1Vzck1zZ1Nob3dNZW51KCk7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBjb25zdCB0YWcgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKHRhZyA+Pj4gMykge1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5iaXRzVmFsaWRTbG90cyA9IHJlYWRlci5pbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZGlzcGxheVRpbWUgPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLm1lbnVTdHJpbmcgPSByZWFkZXIuc3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJlYWRlci5za2lwVHlwZSh0YWcgJiA3KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfSxcbiAgICBmcm9tUGFydGlhbChvYmplY3QpIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2M7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ0NTVXNyTXNnU2hvd01lbnUoKTtcbiAgICAgICAgbWVzc2FnZS5iaXRzVmFsaWRTbG90cyA9IChfYSA9IG9iamVjdC5iaXRzVmFsaWRTbG90cykgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMDtcbiAgICAgICAgbWVzc2FnZS5kaXNwbGF5VGltZSA9IChfYiA9IG9iamVjdC5kaXNwbGF5VGltZSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogMDtcbiAgICAgICAgbWVzc2FnZS5tZW51U3RyaW5nID0gKF9jID0gb2JqZWN0Lm1lbnVTdHJpbmcpICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IFwiXCI7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbn07XG5mdW5jdGlvbiBjcmVhdGVCYXNlQ0NTVXNyTXNnQmFyVGltZSgpIHtcbiAgICByZXR1cm4geyB0aW1lOiBcIlwiIH07XG59XG5leHBvcnRzLkNDU1Vzck1zZ0JhclRpbWUgPSB7XG4gICAgZW5jb2RlKG1lc3NhZ2UsIHdyaXRlciA9IG1pbmltYWxfMS5Xcml0ZXIuY3JlYXRlKCkpIHtcbiAgICAgICAgaWYgKG1lc3NhZ2UudGltZSAhPT0gXCJcIikge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigxMCkuc3RyaW5nKG1lc3NhZ2UudGltZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9LFxuICAgIGRlY29kZShpbnB1dCwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IGlucHV0IGluc3RhbmNlb2YgbWluaW1hbF8xLlJlYWRlciA/IGlucHV0IDogbmV3IG1pbmltYWxfMS5SZWFkZXIoaW5wdXQpO1xuICAgICAgICBsZXQgZW5kID0gbGVuZ3RoID09PSB1bmRlZmluZWQgPyByZWFkZXIubGVuIDogcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDQ1NVc3JNc2dCYXJUaW1lKCk7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBjb25zdCB0YWcgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKHRhZyA+Pj4gMykge1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS50aW1lID0gcmVhZGVyLnN0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICByZWFkZXIuc2tpcFR5cGUodGFnICYgNyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH0sXG4gICAgZnJvbVBhcnRpYWwob2JqZWN0KSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDQ1NVc3JNc2dCYXJUaW1lKCk7XG4gICAgICAgIG1lc3NhZ2UudGltZSA9IChfYSA9IG9iamVjdC50aW1lKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBcIlwiO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG59O1xuZnVuY3Rpb24gY3JlYXRlQmFzZUNDU1Vzck1zZ0FtbW9EZW5pZWQoKSB7XG4gICAgcmV0dXJuIHsgYW1tb0lkeDogMCB9O1xufVxuZXhwb3J0cy5DQ1NVc3JNc2dBbW1vRGVuaWVkID0ge1xuICAgIGVuY29kZShtZXNzYWdlLCB3cml0ZXIgPSBtaW5pbWFsXzEuV3JpdGVyLmNyZWF0ZSgpKSB7XG4gICAgICAgIGlmIChtZXNzYWdlLmFtbW9JZHggIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoOCkuaW50MzIobWVzc2FnZS5hbW1vSWR4KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH0sXG4gICAgZGVjb2RlKGlucHV0LCBsZW5ndGgpIHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gaW5wdXQgaW5zdGFuY2VvZiBtaW5pbWFsXzEuUmVhZGVyID8gaW5wdXQgOiBuZXcgbWluaW1hbF8xLlJlYWRlcihpbnB1dCk7XG4gICAgICAgIGxldCBlbmQgPSBsZW5ndGggPT09IHVuZGVmaW5lZCA/IHJlYWRlci5sZW4gOiByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNDU1Vzck1zZ0FtbW9EZW5pZWQoKTtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhZyA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgIHN3aXRjaCAodGFnID4+PiAzKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmFtbW9JZHggPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmVhZGVyLnNraXBUeXBlKHRhZyAmIDcpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9LFxuICAgIGZyb21QYXJ0aWFsKG9iamVjdCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ0NTVXNyTXNnQW1tb0RlbmllZCgpO1xuICAgICAgICBtZXNzYWdlLmFtbW9JZHggPSAoX2EgPSBvYmplY3QuYW1tb0lkeCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMDtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxufTtcbmZ1bmN0aW9uIGNyZWF0ZUJhc2VDQ1NVc3JNc2dNYXJrQWNoaWV2ZW1lbnQoKSB7XG4gICAgcmV0dXJuIHsgYWNoaWV2ZW1lbnQ6IFwiXCIgfTtcbn1cbmV4cG9ydHMuQ0NTVXNyTXNnTWFya0FjaGlldmVtZW50ID0ge1xuICAgIGVuY29kZShtZXNzYWdlLCB3cml0ZXIgPSBtaW5pbWFsXzEuV3JpdGVyLmNyZWF0ZSgpKSB7XG4gICAgICAgIGlmIChtZXNzYWdlLmFjaGlldmVtZW50ICE9PSBcIlwiKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDEwKS5zdHJpbmcobWVzc2FnZS5hY2hpZXZlbWVudCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9LFxuICAgIGRlY29kZShpbnB1dCwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IGlucHV0IGluc3RhbmNlb2YgbWluaW1hbF8xLlJlYWRlciA/IGlucHV0IDogbmV3IG1pbmltYWxfMS5SZWFkZXIoaW5wdXQpO1xuICAgICAgICBsZXQgZW5kID0gbGVuZ3RoID09PSB1bmRlZmluZWQgPyByZWFkZXIubGVuIDogcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDQ1NVc3JNc2dNYXJrQWNoaWV2ZW1lbnQoKTtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhZyA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgIHN3aXRjaCAodGFnID4+PiAzKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmFjaGlldmVtZW50ID0gcmVhZGVyLnN0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICByZWFkZXIuc2tpcFR5cGUodGFnICYgNyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH0sXG4gICAgZnJvbVBhcnRpYWwob2JqZWN0KSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDQ1NVc3JNc2dNYXJrQWNoaWV2ZW1lbnQoKTtcbiAgICAgICAgbWVzc2FnZS5hY2hpZXZlbWVudCA9IChfYSA9IG9iamVjdC5hY2hpZXZlbWVudCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogXCJcIjtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxufTtcbmZ1bmN0aW9uIGNyZWF0ZUJhc2VDQ1NVc3JNc2dNYXRjaFN0YXRzVXBkYXRlKCkge1xuICAgIHJldHVybiB7IHVwZGF0ZTogXCJcIiB9O1xufVxuZXhwb3J0cy5DQ1NVc3JNc2dNYXRjaFN0YXRzVXBkYXRlID0ge1xuICAgIGVuY29kZShtZXNzYWdlLCB3cml0ZXIgPSBtaW5pbWFsXzEuV3JpdGVyLmNyZWF0ZSgpKSB7XG4gICAgICAgIGlmIChtZXNzYWdlLnVwZGF0ZSAhPT0gXCJcIikge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigxMCkuc3RyaW5nKG1lc3NhZ2UudXBkYXRlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH0sXG4gICAgZGVjb2RlKGlucHV0LCBsZW5ndGgpIHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gaW5wdXQgaW5zdGFuY2VvZiBtaW5pbWFsXzEuUmVhZGVyID8gaW5wdXQgOiBuZXcgbWluaW1hbF8xLlJlYWRlcihpbnB1dCk7XG4gICAgICAgIGxldCBlbmQgPSBsZW5ndGggPT09IHVuZGVmaW5lZCA/IHJlYWRlci5sZW4gOiByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNDU1Vzck1zZ01hdGNoU3RhdHNVcGRhdGUoKTtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhZyA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgIHN3aXRjaCAodGFnID4+PiAzKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnVwZGF0ZSA9IHJlYWRlci5zdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmVhZGVyLnNraXBUeXBlKHRhZyAmIDcpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9LFxuICAgIGZyb21QYXJ0aWFsKG9iamVjdCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ0NTVXNyTXNnTWF0Y2hTdGF0c1VwZGF0ZSgpO1xuICAgICAgICBtZXNzYWdlLnVwZGF0ZSA9IChfYSA9IG9iamVjdC51cGRhdGUpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IFwiXCI7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbn07XG5mdW5jdGlvbiBjcmVhdGVCYXNlQ0NTVXNyTXNnSXRlbURyb3AoKSB7XG4gICAgcmV0dXJuIHsgaXRlbWlkOiBMb25nLlpFUk8sIGRlYXRoOiBmYWxzZSB9O1xufVxuZXhwb3J0cy5DQ1NVc3JNc2dJdGVtRHJvcCA9IHtcbiAgICBlbmNvZGUobWVzc2FnZSwgd3JpdGVyID0gbWluaW1hbF8xLldyaXRlci5jcmVhdGUoKSkge1xuICAgICAgICBpZiAoIW1lc3NhZ2UuaXRlbWlkLmlzWmVybygpKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDgpLmludDY0KG1lc3NhZ2UuaXRlbWlkKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5kZWF0aCA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigxNikuYm9vbChtZXNzYWdlLmRlYXRoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH0sXG4gICAgZGVjb2RlKGlucHV0LCBsZW5ndGgpIHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gaW5wdXQgaW5zdGFuY2VvZiBtaW5pbWFsXzEuUmVhZGVyID8gaW5wdXQgOiBuZXcgbWluaW1hbF8xLlJlYWRlcihpbnB1dCk7XG4gICAgICAgIGxldCBlbmQgPSBsZW5ndGggPT09IHVuZGVmaW5lZCA/IHJlYWRlci5sZW4gOiByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNDU1Vzck1zZ0l0ZW1Ecm9wKCk7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBjb25zdCB0YWcgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKHRhZyA+Pj4gMykge1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5pdGVtaWQgPSByZWFkZXIuaW50NjQoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmRlYXRoID0gcmVhZGVyLmJvb2woKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmVhZGVyLnNraXBUeXBlKHRhZyAmIDcpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9LFxuICAgIGZyb21QYXJ0aWFsKG9iamVjdCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ0NTVXNyTXNnSXRlbURyb3AoKTtcbiAgICAgICAgbWVzc2FnZS5pdGVtaWQgPVxuICAgICAgICAgICAgb2JqZWN0Lml0ZW1pZCAhPT0gdW5kZWZpbmVkICYmIG9iamVjdC5pdGVtaWQgIT09IG51bGxcbiAgICAgICAgICAgICAgICA/IExvbmcuZnJvbVZhbHVlKG9iamVjdC5pdGVtaWQpXG4gICAgICAgICAgICAgICAgOiBMb25nLlpFUk87XG4gICAgICAgIG1lc3NhZ2UuZGVhdGggPSAoX2EgPSBvYmplY3QuZGVhdGgpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IGZhbHNlO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG59O1xuZnVuY3Rpb24gY3JlYXRlQmFzZUNDU1Vzck1zZ0dsb3dQcm9wVHVybk9mZigpIHtcbiAgICByZXR1cm4geyBlbnRpZHg6IDAgfTtcbn1cbmV4cG9ydHMuQ0NTVXNyTXNnR2xvd1Byb3BUdXJuT2ZmID0ge1xuICAgIGVuY29kZShtZXNzYWdlLCB3cml0ZXIgPSBtaW5pbWFsXzEuV3JpdGVyLmNyZWF0ZSgpKSB7XG4gICAgICAgIGlmIChtZXNzYWdlLmVudGlkeCAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig4KS5pbnQzMihtZXNzYWdlLmVudGlkeCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9LFxuICAgIGRlY29kZShpbnB1dCwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IGlucHV0IGluc3RhbmNlb2YgbWluaW1hbF8xLlJlYWRlciA/IGlucHV0IDogbmV3IG1pbmltYWxfMS5SZWFkZXIoaW5wdXQpO1xuICAgICAgICBsZXQgZW5kID0gbGVuZ3RoID09PSB1bmRlZmluZWQgPyByZWFkZXIubGVuIDogcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDQ1NVc3JNc2dHbG93UHJvcFR1cm5PZmYoKTtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhZyA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgIHN3aXRjaCAodGFnID4+PiAzKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmVudGlkeCA9IHJlYWRlci5pbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICByZWFkZXIuc2tpcFR5cGUodGFnICYgNyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH0sXG4gICAgZnJvbVBhcnRpYWwob2JqZWN0KSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDQ1NVc3JNc2dHbG93UHJvcFR1cm5PZmYoKTtcbiAgICAgICAgbWVzc2FnZS5lbnRpZHggPSAoX2EgPSBvYmplY3QuZW50aWR4KSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAwO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG59O1xuZnVuY3Rpb24gY3JlYXRlQmFzZUNDU1Vzck1zZ1JvdW5kQmFja3VwRmlsZW5hbWVzKCkge1xuICAgIHJldHVybiB7IGNvdW50OiAwLCBpbmRleDogMCwgZmlsZW5hbWU6IFwiXCIsIG5pY2VuYW1lOiBcIlwiIH07XG59XG5leHBvcnRzLkNDU1Vzck1zZ1JvdW5kQmFja3VwRmlsZW5hbWVzID0ge1xuICAgIGVuY29kZShtZXNzYWdlLCB3cml0ZXIgPSBtaW5pbWFsXzEuV3JpdGVyLmNyZWF0ZSgpKSB7XG4gICAgICAgIGlmIChtZXNzYWdlLmNvdW50ICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDgpLmludDMyKG1lc3NhZ2UuY291bnQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLmluZGV4ICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDE2KS5pbnQzMihtZXNzYWdlLmluZGV4KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5maWxlbmFtZSAhPT0gXCJcIikge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigyNikuc3RyaW5nKG1lc3NhZ2UuZmlsZW5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLm5pY2VuYW1lICE9PSBcIlwiKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDM0KS5zdHJpbmcobWVzc2FnZS5uaWNlbmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9LFxuICAgIGRlY29kZShpbnB1dCwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IGlucHV0IGluc3RhbmNlb2YgbWluaW1hbF8xLlJlYWRlciA/IGlucHV0IDogbmV3IG1pbmltYWxfMS5SZWFkZXIoaW5wdXQpO1xuICAgICAgICBsZXQgZW5kID0gbGVuZ3RoID09PSB1bmRlZmluZWQgPyByZWFkZXIubGVuIDogcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDQ1NVc3JNc2dSb3VuZEJhY2t1cEZpbGVuYW1lcygpO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuY291bnQgPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmluZGV4ID0gcmVhZGVyLmludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5maWxlbmFtZSA9IHJlYWRlci5zdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLm5pY2VuYW1lID0gcmVhZGVyLnN0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICByZWFkZXIuc2tpcFR5cGUodGFnICYgNyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH0sXG4gICAgZnJvbVBhcnRpYWwob2JqZWN0KSB7XG4gICAgICAgIHZhciBfYSwgX2IsIF9jLCBfZDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDQ1NVc3JNc2dSb3VuZEJhY2t1cEZpbGVuYW1lcygpO1xuICAgICAgICBtZXNzYWdlLmNvdW50ID0gKF9hID0gb2JqZWN0LmNvdW50KSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAwO1xuICAgICAgICBtZXNzYWdlLmluZGV4ID0gKF9iID0gb2JqZWN0LmluZGV4KSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAwO1xuICAgICAgICBtZXNzYWdlLmZpbGVuYW1lID0gKF9jID0gb2JqZWN0LmZpbGVuYW1lKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiBcIlwiO1xuICAgICAgICBtZXNzYWdlLm5pY2VuYW1lID0gKF9kID0gb2JqZWN0Lm5pY2VuYW1lKSAhPT0gbnVsbCAmJiBfZCAhPT0gdm9pZCAwID8gX2QgOiBcIlwiO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG59O1xuZnVuY3Rpb24gY3JlYXRlQmFzZUNDU1Vzck1zZ1NTVUkoKSB7XG4gICAgcmV0dXJuIHsgc2hvdzogZmFsc2UsIHN0YXJ0VGltZTogMCwgZW5kVGltZTogMCB9O1xufVxuZXhwb3J0cy5DQ1NVc3JNc2dTU1VJID0ge1xuICAgIGVuY29kZShtZXNzYWdlLCB3cml0ZXIgPSBtaW5pbWFsXzEuV3JpdGVyLmNyZWF0ZSgpKSB7XG4gICAgICAgIGlmIChtZXNzYWdlLnNob3cgPT09IHRydWUpIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoOCkuYm9vbChtZXNzYWdlLnNob3cpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLnN0YXJ0VGltZSAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigyMSkuZmxvYXQobWVzc2FnZS5zdGFydFRpbWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLmVuZFRpbWUgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMjkpLmZsb2F0KG1lc3NhZ2UuZW5kVGltZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9LFxuICAgIGRlY29kZShpbnB1dCwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IGlucHV0IGluc3RhbmNlb2YgbWluaW1hbF8xLlJlYWRlciA/IGlucHV0IDogbmV3IG1pbmltYWxfMS5SZWFkZXIoaW5wdXQpO1xuICAgICAgICBsZXQgZW5kID0gbGVuZ3RoID09PSB1bmRlZmluZWQgPyByZWFkZXIubGVuIDogcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDQ1NVc3JNc2dTU1VJKCk7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBjb25zdCB0YWcgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKHRhZyA+Pj4gMykge1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5zaG93ID0gcmVhZGVyLmJvb2woKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnN0YXJ0VGltZSA9IHJlYWRlci5mbG9hdCgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZW5kVGltZSA9IHJlYWRlci5mbG9hdCgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICByZWFkZXIuc2tpcFR5cGUodGFnICYgNyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH0sXG4gICAgZnJvbVBhcnRpYWwob2JqZWN0KSB7XG4gICAgICAgIHZhciBfYSwgX2IsIF9jO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNDU1Vzck1zZ1NTVUkoKTtcbiAgICAgICAgbWVzc2FnZS5zaG93ID0gKF9hID0gb2JqZWN0LnNob3cpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IGZhbHNlO1xuICAgICAgICBtZXNzYWdlLnN0YXJ0VGltZSA9IChfYiA9IG9iamVjdC5zdGFydFRpbWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IDA7XG4gICAgICAgIG1lc3NhZ2UuZW5kVGltZSA9IChfYyA9IG9iamVjdC5lbmRUaW1lKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiAwO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG59O1xuZnVuY3Rpb24gY3JlYXRlQmFzZUNDU1Vzck1zZ1N1cnZpdmFsU3RhdHMoKSB7XG4gICAgcmV0dXJuIHsgeHVpZDogTG9uZy5VWkVSTywgZmFjdHM6IFtdLCB1c2VyczogW10sIGRhbWFnZXM6IFtdLCB0aWNrbnVtYmVyOiAwIH07XG59XG5leHBvcnRzLkNDU1Vzck1zZ1N1cnZpdmFsU3RhdHMgPSB7XG4gICAgZW5jb2RlKG1lc3NhZ2UsIHdyaXRlciA9IG1pbmltYWxfMS5Xcml0ZXIuY3JlYXRlKCkpIHtcbiAgICAgICAgaWYgKCFtZXNzYWdlLnh1aWQuaXNaZXJvKCkpIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoOCkudWludDY0KG1lc3NhZ2UueHVpZCk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCB2IG9mIG1lc3NhZ2UuZmFjdHMpIHtcbiAgICAgICAgICAgIGV4cG9ydHMuQ0NTVXNyTXNnU3Vydml2YWxTdGF0c19GYWN0LmVuY29kZSh2LCB3cml0ZXIudWludDMyKDE4KS5mb3JrKCkpLmxkZWxpbSgpO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3QgdiBvZiBtZXNzYWdlLnVzZXJzKSB7XG4gICAgICAgICAgICBleHBvcnRzLkNDU1Vzck1zZ1N1cnZpdmFsU3RhdHNfUGxhY2VtZW50LmVuY29kZSh2LCB3cml0ZXIudWludDMyKDI2KS5mb3JrKCkpLmxkZWxpbSgpO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3QgdiBvZiBtZXNzYWdlLmRhbWFnZXMpIHtcbiAgICAgICAgICAgIGV4cG9ydHMuQ0NTVXNyTXNnU3Vydml2YWxTdGF0c19EYW1hZ2UuZW5jb2RlKHYsIHdyaXRlci51aW50MzIoNDIpLmZvcmsoKSkubGRlbGltKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UudGlja251bWJlciAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigzMikuaW50MzIobWVzc2FnZS50aWNrbnVtYmVyKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH0sXG4gICAgZGVjb2RlKGlucHV0LCBsZW5ndGgpIHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gaW5wdXQgaW5zdGFuY2VvZiBtaW5pbWFsXzEuUmVhZGVyID8gaW5wdXQgOiBuZXcgbWluaW1hbF8xLlJlYWRlcihpbnB1dCk7XG4gICAgICAgIGxldCBlbmQgPSBsZW5ndGggPT09IHVuZGVmaW5lZCA/IHJlYWRlci5sZW4gOiByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNDU1Vzck1zZ1N1cnZpdmFsU3RhdHMoKTtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhZyA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgIHN3aXRjaCAodGFnID4+PiAzKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnh1aWQgPSByZWFkZXIudWludDY0KCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5mYWN0cy5wdXNoKGV4cG9ydHMuQ0NTVXNyTXNnU3Vydml2YWxTdGF0c19GYWN0LmRlY29kZShyZWFkZXIsIHJlYWRlci51aW50MzIoKSkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudXNlcnMucHVzaChleHBvcnRzLkNDU1Vzck1zZ1N1cnZpdmFsU3RhdHNfUGxhY2VtZW50LmRlY29kZShyZWFkZXIsIHJlYWRlci51aW50MzIoKSkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZGFtYWdlcy5wdXNoKGV4cG9ydHMuQ0NTVXNyTXNnU3Vydml2YWxTdGF0c19EYW1hZ2UuZGVjb2RlKHJlYWRlciwgcmVhZGVyLnVpbnQzMigpKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS50aWNrbnVtYmVyID0gcmVhZGVyLmludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJlYWRlci5za2lwVHlwZSh0YWcgJiA3KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfSxcbiAgICBmcm9tUGFydGlhbChvYmplY3QpIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2MsIF9kO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNDU1Vzck1zZ1N1cnZpdmFsU3RhdHMoKTtcbiAgICAgICAgbWVzc2FnZS54dWlkID1cbiAgICAgICAgICAgIG9iamVjdC54dWlkICE9PSB1bmRlZmluZWQgJiYgb2JqZWN0Lnh1aWQgIT09IG51bGxcbiAgICAgICAgICAgICAgICA/IExvbmcuZnJvbVZhbHVlKG9iamVjdC54dWlkKVxuICAgICAgICAgICAgICAgIDogTG9uZy5VWkVSTztcbiAgICAgICAgbWVzc2FnZS5mYWN0cyA9XG4gICAgICAgICAgICAoKF9hID0gb2JqZWN0LmZhY3RzKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EubWFwKGUgPT4gZXhwb3J0cy5DQ1NVc3JNc2dTdXJ2aXZhbFN0YXRzX0ZhY3QuZnJvbVBhcnRpYWwoZSkpKSB8fCBbXTtcbiAgICAgICAgbWVzc2FnZS51c2VycyA9XG4gICAgICAgICAgICAoKF9iID0gb2JqZWN0LnVzZXJzKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IubWFwKGUgPT4gZXhwb3J0cy5DQ1NVc3JNc2dTdXJ2aXZhbFN0YXRzX1BsYWNlbWVudC5mcm9tUGFydGlhbChlKSkpIHx8XG4gICAgICAgICAgICAgICAgW107XG4gICAgICAgIG1lc3NhZ2UuZGFtYWdlcyA9XG4gICAgICAgICAgICAoKF9jID0gb2JqZWN0LmRhbWFnZXMpID09PSBudWxsIHx8IF9jID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYy5tYXAoZSA9PiBleHBvcnRzLkNDU1Vzck1zZ1N1cnZpdmFsU3RhdHNfRGFtYWdlLmZyb21QYXJ0aWFsKGUpKSkgfHxcbiAgICAgICAgICAgICAgICBbXTtcbiAgICAgICAgbWVzc2FnZS50aWNrbnVtYmVyID0gKF9kID0gb2JqZWN0LnRpY2tudW1iZXIpICE9PSBudWxsICYmIF9kICE9PSB2b2lkIDAgPyBfZCA6IDA7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbn07XG5mdW5jdGlvbiBjcmVhdGVCYXNlQ0NTVXNyTXNnU3Vydml2YWxTdGF0c19GYWN0KCkge1xuICAgIHJldHVybiB7IHR5cGU6IDAsIGRpc3BsYXk6IDAsIHZhbHVlOiAwLCBpbnRlcmVzdGluZ25lc3M6IDAgfTtcbn1cbmV4cG9ydHMuQ0NTVXNyTXNnU3Vydml2YWxTdGF0c19GYWN0ID0ge1xuICAgIGVuY29kZShtZXNzYWdlLCB3cml0ZXIgPSBtaW5pbWFsXzEuV3JpdGVyLmNyZWF0ZSgpKSB7XG4gICAgICAgIGlmIChtZXNzYWdlLnR5cGUgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoOCkuaW50MzIobWVzc2FnZS50eXBlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5kaXNwbGF5ICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDE2KS5pbnQzMihtZXNzYWdlLmRpc3BsYXkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLnZhbHVlICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDI0KS5pbnQzMihtZXNzYWdlLnZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5pbnRlcmVzdGluZ25lc3MgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMzcpLmZsb2F0KG1lc3NhZ2UuaW50ZXJlc3RpbmduZXNzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH0sXG4gICAgZGVjb2RlKGlucHV0LCBsZW5ndGgpIHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gaW5wdXQgaW5zdGFuY2VvZiBtaW5pbWFsXzEuUmVhZGVyID8gaW5wdXQgOiBuZXcgbWluaW1hbF8xLlJlYWRlcihpbnB1dCk7XG4gICAgICAgIGxldCBlbmQgPSBsZW5ndGggPT09IHVuZGVmaW5lZCA/IHJlYWRlci5sZW4gOiByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNDU1Vzck1zZ1N1cnZpdmFsU3RhdHNfRmFjdCgpO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudHlwZSA9IHJlYWRlci5pbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZGlzcGxheSA9IHJlYWRlci5pbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudmFsdWUgPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmludGVyZXN0aW5nbmVzcyA9IHJlYWRlci5mbG9hdCgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICByZWFkZXIuc2tpcFR5cGUodGFnICYgNyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH0sXG4gICAgZnJvbVBhcnRpYWwob2JqZWN0KSB7XG4gICAgICAgIHZhciBfYSwgX2IsIF9jLCBfZDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDQ1NVc3JNc2dTdXJ2aXZhbFN0YXRzX0ZhY3QoKTtcbiAgICAgICAgbWVzc2FnZS50eXBlID0gKF9hID0gb2JqZWN0LnR5cGUpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IDA7XG4gICAgICAgIG1lc3NhZ2UuZGlzcGxheSA9IChfYiA9IG9iamVjdC5kaXNwbGF5KSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAwO1xuICAgICAgICBtZXNzYWdlLnZhbHVlID0gKF9jID0gb2JqZWN0LnZhbHVlKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiAwO1xuICAgICAgICBtZXNzYWdlLmludGVyZXN0aW5nbmVzcyA9IChfZCA9IG9iamVjdC5pbnRlcmVzdGluZ25lc3MpICE9PSBudWxsICYmIF9kICE9PSB2b2lkIDAgPyBfZCA6IDA7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbn07XG5mdW5jdGlvbiBjcmVhdGVCYXNlQ0NTVXNyTXNnU3Vydml2YWxTdGF0c19QbGFjZW1lbnQoKSB7XG4gICAgcmV0dXJuIHsgeHVpZDogTG9uZy5VWkVSTywgdGVhbW51bWJlcjogMCwgcGxhY2VtZW50OiAwIH07XG59XG5leHBvcnRzLkNDU1Vzck1zZ1N1cnZpdmFsU3RhdHNfUGxhY2VtZW50ID0ge1xuICAgIGVuY29kZShtZXNzYWdlLCB3cml0ZXIgPSBtaW5pbWFsXzEuV3JpdGVyLmNyZWF0ZSgpKSB7XG4gICAgICAgIGlmICghbWVzc2FnZS54dWlkLmlzWmVybygpKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDgpLnVpbnQ2NChtZXNzYWdlLnh1aWQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLnRlYW1udW1iZXIgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMTYpLmludDMyKG1lc3NhZ2UudGVhbW51bWJlcik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UucGxhY2VtZW50ICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDI0KS5pbnQzMihtZXNzYWdlLnBsYWNlbWVudCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9LFxuICAgIGRlY29kZShpbnB1dCwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IGlucHV0IGluc3RhbmNlb2YgbWluaW1hbF8xLlJlYWRlciA/IGlucHV0IDogbmV3IG1pbmltYWxfMS5SZWFkZXIoaW5wdXQpO1xuICAgICAgICBsZXQgZW5kID0gbGVuZ3RoID09PSB1bmRlZmluZWQgPyByZWFkZXIubGVuIDogcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDQ1NVc3JNc2dTdXJ2aXZhbFN0YXRzX1BsYWNlbWVudCgpO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UueHVpZCA9IHJlYWRlci51aW50NjQoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnRlYW1udW1iZXIgPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnBsYWNlbWVudCA9IHJlYWRlci5pbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICByZWFkZXIuc2tpcFR5cGUodGFnICYgNyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH0sXG4gICAgZnJvbVBhcnRpYWwob2JqZWN0KSB7XG4gICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ0NTVXNyTXNnU3Vydml2YWxTdGF0c19QbGFjZW1lbnQoKTtcbiAgICAgICAgbWVzc2FnZS54dWlkID1cbiAgICAgICAgICAgIG9iamVjdC54dWlkICE9PSB1bmRlZmluZWQgJiYgb2JqZWN0Lnh1aWQgIT09IG51bGxcbiAgICAgICAgICAgICAgICA/IExvbmcuZnJvbVZhbHVlKG9iamVjdC54dWlkKVxuICAgICAgICAgICAgICAgIDogTG9uZy5VWkVSTztcbiAgICAgICAgbWVzc2FnZS50ZWFtbnVtYmVyID0gKF9hID0gb2JqZWN0LnRlYW1udW1iZXIpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IDA7XG4gICAgICAgIG1lc3NhZ2UucGxhY2VtZW50ID0gKF9iID0gb2JqZWN0LnBsYWNlbWVudCkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogMDtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxufTtcbmZ1bmN0aW9uIGNyZWF0ZUJhc2VDQ1NVc3JNc2dTdXJ2aXZhbFN0YXRzX0RhbWFnZSgpIHtcbiAgICByZXR1cm4geyB4dWlkOiBMb25nLlVaRVJPLCB0bzogMCwgdG9IaXRzOiAwLCBmcm9tOiAwLCBmcm9tSGl0czogMCB9O1xufVxuZXhwb3J0cy5DQ1NVc3JNc2dTdXJ2aXZhbFN0YXRzX0RhbWFnZSA9IHtcbiAgICBlbmNvZGUobWVzc2FnZSwgd3JpdGVyID0gbWluaW1hbF8xLldyaXRlci5jcmVhdGUoKSkge1xuICAgICAgICBpZiAoIW1lc3NhZ2UueHVpZC5pc1plcm8oKSkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig4KS51aW50NjQobWVzc2FnZS54dWlkKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS50byAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigxNikuaW50MzIobWVzc2FnZS50byk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UudG9IaXRzICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDI0KS5pbnQzMihtZXNzYWdlLnRvSGl0cyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UuZnJvbSAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigzMikuaW50MzIobWVzc2FnZS5mcm9tKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5mcm9tSGl0cyAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig0MCkuaW50MzIobWVzc2FnZS5mcm9tSGl0cyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9LFxuICAgIGRlY29kZShpbnB1dCwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IGlucHV0IGluc3RhbmNlb2YgbWluaW1hbF8xLlJlYWRlciA/IGlucHV0IDogbmV3IG1pbmltYWxfMS5SZWFkZXIoaW5wdXQpO1xuICAgICAgICBsZXQgZW5kID0gbGVuZ3RoID09PSB1bmRlZmluZWQgPyByZWFkZXIubGVuIDogcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDQ1NVc3JNc2dTdXJ2aXZhbFN0YXRzX0RhbWFnZSgpO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UueHVpZCA9IHJlYWRlci51aW50NjQoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnRvID0gcmVhZGVyLmludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS50b0hpdHMgPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmZyb20gPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmZyb21IaXRzID0gcmVhZGVyLmludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJlYWRlci5za2lwVHlwZSh0YWcgJiA3KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfSxcbiAgICBmcm9tUGFydGlhbChvYmplY3QpIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2MsIF9kO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNDU1Vzck1zZ1N1cnZpdmFsU3RhdHNfRGFtYWdlKCk7XG4gICAgICAgIG1lc3NhZ2UueHVpZCA9XG4gICAgICAgICAgICBvYmplY3QueHVpZCAhPT0gdW5kZWZpbmVkICYmIG9iamVjdC54dWlkICE9PSBudWxsXG4gICAgICAgICAgICAgICAgPyBMb25nLmZyb21WYWx1ZShvYmplY3QueHVpZClcbiAgICAgICAgICAgICAgICA6IExvbmcuVVpFUk87XG4gICAgICAgIG1lc3NhZ2UudG8gPSAoX2EgPSBvYmplY3QudG8pICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IDA7XG4gICAgICAgIG1lc3NhZ2UudG9IaXRzID0gKF9iID0gb2JqZWN0LnRvSGl0cykgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogMDtcbiAgICAgICAgbWVzc2FnZS5mcm9tID0gKF9jID0gb2JqZWN0LmZyb20pICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IDA7XG4gICAgICAgIG1lc3NhZ2UuZnJvbUhpdHMgPSAoX2QgPSBvYmplY3QuZnJvbUhpdHMpICE9PSBudWxsICYmIF9kICE9PSB2b2lkIDAgPyBfZCA6IDA7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbn07XG5mdW5jdGlvbiBjcmVhdGVCYXNlQ0NTVXNyTXNnRW5kT2ZNYXRjaEFsbFBsYXllcnNEYXRhKCkge1xuICAgIHJldHVybiB7IGFsbHBsYXllcmRhdGE6IFtdLCBzY2VuZTogMCB9O1xufVxuZXhwb3J0cy5DQ1NVc3JNc2dFbmRPZk1hdGNoQWxsUGxheWVyc0RhdGEgPSB7XG4gICAgZW5jb2RlKG1lc3NhZ2UsIHdyaXRlciA9IG1pbmltYWxfMS5Xcml0ZXIuY3JlYXRlKCkpIHtcbiAgICAgICAgZm9yIChjb25zdCB2IG9mIG1lc3NhZ2UuYWxscGxheWVyZGF0YSkge1xuICAgICAgICAgICAgZXhwb3J0cy5DQ1NVc3JNc2dFbmRPZk1hdGNoQWxsUGxheWVyc0RhdGFfUGxheWVyRGF0YS5lbmNvZGUodiwgd3JpdGVyLnVpbnQzMigxMCkuZm9yaygpKS5sZGVsaW0oKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5zY2VuZSAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigxNikuaW50MzIobWVzc2FnZS5zY2VuZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9LFxuICAgIGRlY29kZShpbnB1dCwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IGlucHV0IGluc3RhbmNlb2YgbWluaW1hbF8xLlJlYWRlciA/IGlucHV0IDogbmV3IG1pbmltYWxfMS5SZWFkZXIoaW5wdXQpO1xuICAgICAgICBsZXQgZW5kID0gbGVuZ3RoID09PSB1bmRlZmluZWQgPyByZWFkZXIubGVuIDogcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDQ1NVc3JNc2dFbmRPZk1hdGNoQWxsUGxheWVyc0RhdGEoKTtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhZyA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgIHN3aXRjaCAodGFnID4+PiAzKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmFsbHBsYXllcmRhdGEucHVzaChleHBvcnRzLkNDU1Vzck1zZ0VuZE9mTWF0Y2hBbGxQbGF5ZXJzRGF0YV9QbGF5ZXJEYXRhLmRlY29kZShyZWFkZXIsIHJlYWRlci51aW50MzIoKSkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Uuc2NlbmUgPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmVhZGVyLnNraXBUeXBlKHRhZyAmIDcpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9LFxuICAgIGZyb21QYXJ0aWFsKG9iamVjdCkge1xuICAgICAgICB2YXIgX2EsIF9iO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNDU1Vzck1zZ0VuZE9mTWF0Y2hBbGxQbGF5ZXJzRGF0YSgpO1xuICAgICAgICBtZXNzYWdlLmFsbHBsYXllcmRhdGEgPVxuICAgICAgICAgICAgKChfYSA9IG9iamVjdC5hbGxwbGF5ZXJkYXRhKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EubWFwKGUgPT4gZXhwb3J0cy5DQ1NVc3JNc2dFbmRPZk1hdGNoQWxsUGxheWVyc0RhdGFfUGxheWVyRGF0YS5mcm9tUGFydGlhbChlKSkpIHx8IFtdO1xuICAgICAgICBtZXNzYWdlLnNjZW5lID0gKF9iID0gb2JqZWN0LnNjZW5lKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAwO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG59O1xuZnVuY3Rpb24gY3JlYXRlQmFzZUNDU1Vzck1zZ0VuZE9mTWF0Y2hBbGxQbGF5ZXJzRGF0YV9BY2NvbGFkZSgpIHtcbiAgICByZXR1cm4geyBlYWNjb2xhZGU6IDAsIHZhbHVlOiAwLCBwb3NpdGlvbjogMCB9O1xufVxuZXhwb3J0cy5DQ1NVc3JNc2dFbmRPZk1hdGNoQWxsUGxheWVyc0RhdGFfQWNjb2xhZGUgPSB7XG4gICAgZW5jb2RlKG1lc3NhZ2UsIHdyaXRlciA9IG1pbmltYWxfMS5Xcml0ZXIuY3JlYXRlKCkpIHtcbiAgICAgICAgaWYgKG1lc3NhZ2UuZWFjY29sYWRlICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDgpLmludDMyKG1lc3NhZ2UuZWFjY29sYWRlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS52YWx1ZSAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigyMSkuZmxvYXQobWVzc2FnZS52YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UucG9zaXRpb24gIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMjQpLmludDMyKG1lc3NhZ2UucG9zaXRpb24pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfSxcbiAgICBkZWNvZGUoaW5wdXQsIGxlbmd0aCkge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBpbnB1dCBpbnN0YW5jZW9mIG1pbmltYWxfMS5SZWFkZXIgPyBpbnB1dCA6IG5ldyBtaW5pbWFsXzEuUmVhZGVyKGlucHV0KTtcbiAgICAgICAgbGV0IGVuZCA9IGxlbmd0aCA9PT0gdW5kZWZpbmVkID8gcmVhZGVyLmxlbiA6IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ0NTVXNyTXNnRW5kT2ZNYXRjaEFsbFBsYXllcnNEYXRhX0FjY29sYWRlKCk7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBjb25zdCB0YWcgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKHRhZyA+Pj4gMykge1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5lYWNjb2xhZGUgPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnZhbHVlID0gcmVhZGVyLmZsb2F0KCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5wb3NpdGlvbiA9IHJlYWRlci5pbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICByZWFkZXIuc2tpcFR5cGUodGFnICYgNyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH0sXG4gICAgZnJvbVBhcnRpYWwob2JqZWN0KSB7XG4gICAgICAgIHZhciBfYSwgX2IsIF9jO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNDU1Vzck1zZ0VuZE9mTWF0Y2hBbGxQbGF5ZXJzRGF0YV9BY2NvbGFkZSgpO1xuICAgICAgICBtZXNzYWdlLmVhY2NvbGFkZSA9IChfYSA9IG9iamVjdC5lYWNjb2xhZGUpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IDA7XG4gICAgICAgIG1lc3NhZ2UudmFsdWUgPSAoX2IgPSBvYmplY3QudmFsdWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IDA7XG4gICAgICAgIG1lc3NhZ2UucG9zaXRpb24gPSAoX2MgPSBvYmplY3QucG9zaXRpb24pICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IDA7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbn07XG5mdW5jdGlvbiBjcmVhdGVCYXNlQ0NTVXNyTXNnRW5kT2ZNYXRjaEFsbFBsYXllcnNEYXRhX1BsYXllckRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZW50aW5kZXg6IDAsXG4gICAgICAgIHh1aWQ6IExvbmcuVVpFUk8sXG4gICAgICAgIG5hbWU6IFwiXCIsXG4gICAgICAgIHRlYW1udW1iZXI6IDAsXG4gICAgICAgIG5vbWluYXRpb246IHVuZGVmaW5lZCxcbiAgICAgICAgaXRlbXM6IFtdLFxuICAgICAgICBwbGF5ZXJjb2xvcjogMCxcbiAgICAgICAgaXNib3Q6IGZhbHNlXG4gICAgfTtcbn1cbmV4cG9ydHMuQ0NTVXNyTXNnRW5kT2ZNYXRjaEFsbFBsYXllcnNEYXRhX1BsYXllckRhdGEgPSB7XG4gICAgZW5jb2RlKG1lc3NhZ2UsIHdyaXRlciA9IG1pbmltYWxfMS5Xcml0ZXIuY3JlYXRlKCkpIHtcbiAgICAgICAgaWYgKG1lc3NhZ2UuZW50aW5kZXggIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoOCkuaW50MzIobWVzc2FnZS5lbnRpbmRleCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFtZXNzYWdlLnh1aWQuaXNaZXJvKCkpIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMTYpLnVpbnQ2NChtZXNzYWdlLnh1aWQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLm5hbWUgIT09IFwiXCIpIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMjYpLnN0cmluZyhtZXNzYWdlLm5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLnRlYW1udW1iZXIgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMzIpLmludDMyKG1lc3NhZ2UudGVhbW51bWJlcik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2Uubm9taW5hdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBleHBvcnRzLkNDU1Vzck1zZ0VuZE9mTWF0Y2hBbGxQbGF5ZXJzRGF0YV9BY2NvbGFkZS5lbmNvZGUobWVzc2FnZS5ub21pbmF0aW9uLCB3cml0ZXIudWludDMyKDQyKS5mb3JrKCkpLmxkZWxpbSgpO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3QgdiBvZiBtZXNzYWdlLml0ZW1zKSB7XG4gICAgICAgICAgICBjc3RyaWtlMTVfZ2NtZXNzYWdlc18xLkNFY29uSXRlbVByZXZpZXdEYXRhQmxvY2suZW5jb2RlKHYsIHdyaXRlci51aW50MzIoNTApLmZvcmsoKSkubGRlbGltKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UucGxheWVyY29sb3IgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoNTYpLmludDMyKG1lc3NhZ2UucGxheWVyY29sb3IpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLmlzYm90ID09PSB0cnVlKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDY0KS5ib29sKG1lc3NhZ2UuaXNib3QpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfSxcbiAgICBkZWNvZGUoaW5wdXQsIGxlbmd0aCkge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBpbnB1dCBpbnN0YW5jZW9mIG1pbmltYWxfMS5SZWFkZXIgPyBpbnB1dCA6IG5ldyBtaW5pbWFsXzEuUmVhZGVyKGlucHV0KTtcbiAgICAgICAgbGV0IGVuZCA9IGxlbmd0aCA9PT0gdW5kZWZpbmVkID8gcmVhZGVyLmxlbiA6IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ0NTVXNyTXNnRW5kT2ZNYXRjaEFsbFBsYXllcnNEYXRhX1BsYXllckRhdGEoKTtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhZyA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgIHN3aXRjaCAodGFnID4+PiAzKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmVudGluZGV4ID0gcmVhZGVyLmludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS54dWlkID0gcmVhZGVyLnVpbnQ2NCgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UubmFtZSA9IHJlYWRlci5zdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnRlYW1udW1iZXIgPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLm5vbWluYXRpb24gPVxuICAgICAgICAgICAgICAgICAgICAgICAgZXhwb3J0cy5DQ1NVc3JNc2dFbmRPZk1hdGNoQWxsUGxheWVyc0RhdGFfQWNjb2xhZGUuZGVjb2RlKHJlYWRlciwgcmVhZGVyLnVpbnQzMigpKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLml0ZW1zLnB1c2goY3N0cmlrZTE1X2djbWVzc2FnZXNfMS5DRWNvbkl0ZW1QcmV2aWV3RGF0YUJsb2NrLmRlY29kZShyZWFkZXIsIHJlYWRlci51aW50MzIoKSkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UucGxheWVyY29sb3IgPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA4OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmlzYm90ID0gcmVhZGVyLmJvb2woKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmVhZGVyLnNraXBUeXBlKHRhZyAmIDcpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9LFxuICAgIGZyb21QYXJ0aWFsKG9iamVjdCkge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYywgX2QsIF9lLCBfZjtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDQ1NVc3JNc2dFbmRPZk1hdGNoQWxsUGxheWVyc0RhdGFfUGxheWVyRGF0YSgpO1xuICAgICAgICBtZXNzYWdlLmVudGluZGV4ID0gKF9hID0gb2JqZWN0LmVudGluZGV4KSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAwO1xuICAgICAgICBtZXNzYWdlLnh1aWQgPVxuICAgICAgICAgICAgb2JqZWN0Lnh1aWQgIT09IHVuZGVmaW5lZCAmJiBvYmplY3QueHVpZCAhPT0gbnVsbFxuICAgICAgICAgICAgICAgID8gTG9uZy5mcm9tVmFsdWUob2JqZWN0Lnh1aWQpXG4gICAgICAgICAgICAgICAgOiBMb25nLlVaRVJPO1xuICAgICAgICBtZXNzYWdlLm5hbWUgPSAoX2IgPSBvYmplY3QubmFtZSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogXCJcIjtcbiAgICAgICAgbWVzc2FnZS50ZWFtbnVtYmVyID0gKF9jID0gb2JqZWN0LnRlYW1udW1iZXIpICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IDA7XG4gICAgICAgIG1lc3NhZ2Uubm9taW5hdGlvbiA9XG4gICAgICAgICAgICBvYmplY3Qubm9taW5hdGlvbiAhPT0gdW5kZWZpbmVkICYmIG9iamVjdC5ub21pbmF0aW9uICE9PSBudWxsXG4gICAgICAgICAgICAgICAgPyBleHBvcnRzLkNDU1Vzck1zZ0VuZE9mTWF0Y2hBbGxQbGF5ZXJzRGF0YV9BY2NvbGFkZS5mcm9tUGFydGlhbChvYmplY3Qubm9taW5hdGlvbilcbiAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgICAgbWVzc2FnZS5pdGVtcyA9XG4gICAgICAgICAgICAoKF9kID0gb2JqZWN0Lml0ZW1zKSA9PT0gbnVsbCB8fCBfZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2QubWFwKGUgPT4gY3N0cmlrZTE1X2djbWVzc2FnZXNfMS5DRWNvbkl0ZW1QcmV2aWV3RGF0YUJsb2NrLmZyb21QYXJ0aWFsKGUpKSkgfHwgW107XG4gICAgICAgIG1lc3NhZ2UucGxheWVyY29sb3IgPSAoX2UgPSBvYmplY3QucGxheWVyY29sb3IpICE9PSBudWxsICYmIF9lICE9PSB2b2lkIDAgPyBfZSA6IDA7XG4gICAgICAgIG1lc3NhZ2UuaXNib3QgPSAoX2YgPSBvYmplY3QuaXNib3QpICE9PSBudWxsICYmIF9mICE9PSB2b2lkIDAgPyBfZiA6IGZhbHNlO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG59O1xuZnVuY3Rpb24gY3JlYXRlQmFzZUNDU1Vzck1zZ1JvdW5kSW1wYWN0U2NvcmVEYXRhKCkge1xuICAgIHJldHVybiB7IGluaXRDb25kaXRpb25zOiB1bmRlZmluZWQsIGFsbFJpc0V2ZW50RGF0YTogW10gfTtcbn1cbmV4cG9ydHMuQ0NTVXNyTXNnUm91bmRJbXBhY3RTY29yZURhdGEgPSB7XG4gICAgZW5jb2RlKG1lc3NhZ2UsIHdyaXRlciA9IG1pbmltYWxfMS5Xcml0ZXIuY3JlYXRlKCkpIHtcbiAgICAgICAgaWYgKG1lc3NhZ2UuaW5pdENvbmRpdGlvbnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgZXhwb3J0cy5DQ1NVc3JNc2dSb3VuZEltcGFjdFNjb3JlRGF0YV9Jbml0aWFsQ29uZGl0aW9ucy5lbmNvZGUobWVzc2FnZS5pbml0Q29uZGl0aW9ucywgd3JpdGVyLnVpbnQzMigxMCkuZm9yaygpKS5sZGVsaW0oKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IHYgb2YgbWVzc2FnZS5hbGxSaXNFdmVudERhdGEpIHtcbiAgICAgICAgICAgIGV4cG9ydHMuQ0NTVXNyTXNnUm91bmRJbXBhY3RTY29yZURhdGFfUmlzRXZlbnQuZW5jb2RlKHYsIHdyaXRlci51aW50MzIoMTgpLmZvcmsoKSkubGRlbGltKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9LFxuICAgIGRlY29kZShpbnB1dCwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IGlucHV0IGluc3RhbmNlb2YgbWluaW1hbF8xLlJlYWRlciA/IGlucHV0IDogbmV3IG1pbmltYWxfMS5SZWFkZXIoaW5wdXQpO1xuICAgICAgICBsZXQgZW5kID0gbGVuZ3RoID09PSB1bmRlZmluZWQgPyByZWFkZXIubGVuIDogcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDQ1NVc3JNc2dSb3VuZEltcGFjdFNjb3JlRGF0YSgpO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuaW5pdENvbmRpdGlvbnMgPVxuICAgICAgICAgICAgICAgICAgICAgICAgZXhwb3J0cy5DQ1NVc3JNc2dSb3VuZEltcGFjdFNjb3JlRGF0YV9Jbml0aWFsQ29uZGl0aW9ucy5kZWNvZGUocmVhZGVyLCByZWFkZXIudWludDMyKCkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuYWxsUmlzRXZlbnREYXRhLnB1c2goZXhwb3J0cy5DQ1NVc3JNc2dSb3VuZEltcGFjdFNjb3JlRGF0YV9SaXNFdmVudC5kZWNvZGUocmVhZGVyLCByZWFkZXIudWludDMyKCkpKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmVhZGVyLnNraXBUeXBlKHRhZyAmIDcpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9LFxuICAgIGZyb21QYXJ0aWFsKG9iamVjdCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ0NTVXNyTXNnUm91bmRJbXBhY3RTY29yZURhdGEoKTtcbiAgICAgICAgbWVzc2FnZS5pbml0Q29uZGl0aW9ucyA9XG4gICAgICAgICAgICBvYmplY3QuaW5pdENvbmRpdGlvbnMgIT09IHVuZGVmaW5lZCAmJiBvYmplY3QuaW5pdENvbmRpdGlvbnMgIT09IG51bGxcbiAgICAgICAgICAgICAgICA/IGV4cG9ydHMuQ0NTVXNyTXNnUm91bmRJbXBhY3RTY29yZURhdGFfSW5pdGlhbENvbmRpdGlvbnMuZnJvbVBhcnRpYWwob2JqZWN0LmluaXRDb25kaXRpb25zKVxuICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgICBtZXNzYWdlLmFsbFJpc0V2ZW50RGF0YSA9XG4gICAgICAgICAgICAoKF9hID0gb2JqZWN0LmFsbFJpc0V2ZW50RGF0YSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLm1hcChlID0+IGV4cG9ydHMuQ0NTVXNyTXNnUm91bmRJbXBhY3RTY29yZURhdGFfUmlzRXZlbnQuZnJvbVBhcnRpYWwoZSkpKSB8fCBbXTtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxufTtcbmZ1bmN0aW9uIGNyZWF0ZUJhc2VDQ1NVc3JNc2dSb3VuZEltcGFjdFNjb3JlRGF0YV9SaXNFdmVudCgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICB0aW1lc3RhbXA6IDAsXG4gICAgICAgIHRlcnJvcmlzdE9kZHM6IDAsXG4gICAgICAgIGN0QWxpdmU6IDAsXG4gICAgICAgIHRBbGl2ZTogMCxcbiAgICAgICAgdmljdGltRGF0YTogdW5kZWZpbmVkLFxuICAgICAgICBvYmplY3RpdmVEYXRhOiB1bmRlZmluZWQsXG4gICAgICAgIGFsbERhbWFnZURhdGE6IFtdXG4gICAgfTtcbn1cbmV4cG9ydHMuQ0NTVXNyTXNnUm91bmRJbXBhY3RTY29yZURhdGFfUmlzRXZlbnQgPSB7XG4gICAgZW5jb2RlKG1lc3NhZ2UsIHdyaXRlciA9IG1pbmltYWxfMS5Xcml0ZXIuY3JlYXRlKCkpIHtcbiAgICAgICAgaWYgKG1lc3NhZ2UudGltZXN0YW1wICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDEzKS5mbG9hdChtZXNzYWdlLnRpbWVzdGFtcCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UudGVycm9yaXN0T2RkcyAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigxNikuaW50MzIobWVzc2FnZS50ZXJyb3Jpc3RPZGRzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5jdEFsaXZlICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDI0KS5pbnQzMihtZXNzYWdlLmN0QWxpdmUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLnRBbGl2ZSAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigzMikuaW50MzIobWVzc2FnZS50QWxpdmUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLnZpY3RpbURhdGEgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgZXhwb3J0cy5DQ1NVc3JNc2dSb3VuZEltcGFjdFNjb3JlRGF0YV9SaXNFdmVudF9WaWN0aW0uZW5jb2RlKG1lc3NhZ2UudmljdGltRGF0YSwgd3JpdGVyLnVpbnQzMig0MikuZm9yaygpKS5sZGVsaW0oKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5vYmplY3RpdmVEYXRhICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGV4cG9ydHMuQ0NTVXNyTXNnUm91bmRJbXBhY3RTY29yZURhdGFfUmlzRXZlbnRfT2JqZWN0aXZlLmVuY29kZShtZXNzYWdlLm9iamVjdGl2ZURhdGEsIHdyaXRlci51aW50MzIoNTApLmZvcmsoKSkubGRlbGltKCk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCB2IG9mIG1lc3NhZ2UuYWxsRGFtYWdlRGF0YSkge1xuICAgICAgICAgICAgZXhwb3J0cy5DQ1NVc3JNc2dSb3VuZEltcGFjdFNjb3JlRGF0YV9SaXNFdmVudF9EYW1hZ2UuZW5jb2RlKHYsIHdyaXRlci51aW50MzIoNTgpLmZvcmsoKSkubGRlbGltKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9LFxuICAgIGRlY29kZShpbnB1dCwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IGlucHV0IGluc3RhbmNlb2YgbWluaW1hbF8xLlJlYWRlciA/IGlucHV0IDogbmV3IG1pbmltYWxfMS5SZWFkZXIoaW5wdXQpO1xuICAgICAgICBsZXQgZW5kID0gbGVuZ3RoID09PSB1bmRlZmluZWQgPyByZWFkZXIubGVuIDogcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDQ1NVc3JNc2dSb3VuZEltcGFjdFNjb3JlRGF0YV9SaXNFdmVudCgpO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudGltZXN0YW1wID0gcmVhZGVyLmZsb2F0KCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS50ZXJyb3Jpc3RPZGRzID0gcmVhZGVyLmludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5jdEFsaXZlID0gcmVhZGVyLmludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS50QWxpdmUgPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnZpY3RpbURhdGEgPVxuICAgICAgICAgICAgICAgICAgICAgICAgZXhwb3J0cy5DQ1NVc3JNc2dSb3VuZEltcGFjdFNjb3JlRGF0YV9SaXNFdmVudF9WaWN0aW0uZGVjb2RlKHJlYWRlciwgcmVhZGVyLnVpbnQzMigpKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLm9iamVjdGl2ZURhdGEgPVxuICAgICAgICAgICAgICAgICAgICAgICAgZXhwb3J0cy5DQ1NVc3JNc2dSb3VuZEltcGFjdFNjb3JlRGF0YV9SaXNFdmVudF9PYmplY3RpdmUuZGVjb2RlKHJlYWRlciwgcmVhZGVyLnVpbnQzMigpKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA3OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmFsbERhbWFnZURhdGEucHVzaChleHBvcnRzLkNDU1Vzck1zZ1JvdW5kSW1wYWN0U2NvcmVEYXRhX1Jpc0V2ZW50X0RhbWFnZS5kZWNvZGUocmVhZGVyLCByZWFkZXIudWludDMyKCkpKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmVhZGVyLnNraXBUeXBlKHRhZyAmIDcpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9LFxuICAgIGZyb21QYXJ0aWFsKG9iamVjdCkge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYywgX2QsIF9lO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNDU1Vzck1zZ1JvdW5kSW1wYWN0U2NvcmVEYXRhX1Jpc0V2ZW50KCk7XG4gICAgICAgIG1lc3NhZ2UudGltZXN0YW1wID0gKF9hID0gb2JqZWN0LnRpbWVzdGFtcCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMDtcbiAgICAgICAgbWVzc2FnZS50ZXJyb3Jpc3RPZGRzID0gKF9iID0gb2JqZWN0LnRlcnJvcmlzdE9kZHMpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IDA7XG4gICAgICAgIG1lc3NhZ2UuY3RBbGl2ZSA9IChfYyA9IG9iamVjdC5jdEFsaXZlKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiAwO1xuICAgICAgICBtZXNzYWdlLnRBbGl2ZSA9IChfZCA9IG9iamVjdC50QWxpdmUpICE9PSBudWxsICYmIF9kICE9PSB2b2lkIDAgPyBfZCA6IDA7XG4gICAgICAgIG1lc3NhZ2UudmljdGltRGF0YSA9XG4gICAgICAgICAgICBvYmplY3QudmljdGltRGF0YSAhPT0gdW5kZWZpbmVkICYmIG9iamVjdC52aWN0aW1EYXRhICE9PSBudWxsXG4gICAgICAgICAgICAgICAgPyBleHBvcnRzLkNDU1Vzck1zZ1JvdW5kSW1wYWN0U2NvcmVEYXRhX1Jpc0V2ZW50X1ZpY3RpbS5mcm9tUGFydGlhbChvYmplY3QudmljdGltRGF0YSlcbiAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgICAgbWVzc2FnZS5vYmplY3RpdmVEYXRhID1cbiAgICAgICAgICAgIG9iamVjdC5vYmplY3RpdmVEYXRhICE9PSB1bmRlZmluZWQgJiYgb2JqZWN0Lm9iamVjdGl2ZURhdGEgIT09IG51bGxcbiAgICAgICAgICAgICAgICA/IGV4cG9ydHMuQ0NTVXNyTXNnUm91bmRJbXBhY3RTY29yZURhdGFfUmlzRXZlbnRfT2JqZWN0aXZlLmZyb21QYXJ0aWFsKG9iamVjdC5vYmplY3RpdmVEYXRhKVxuICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgICBtZXNzYWdlLmFsbERhbWFnZURhdGEgPVxuICAgICAgICAgICAgKChfZSA9IG9iamVjdC5hbGxEYW1hZ2VEYXRhKSA9PT0gbnVsbCB8fCBfZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2UubWFwKGUgPT4gZXhwb3J0cy5DQ1NVc3JNc2dSb3VuZEltcGFjdFNjb3JlRGF0YV9SaXNFdmVudF9EYW1hZ2UuZnJvbVBhcnRpYWwoZSkpKSB8fCBbXTtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxufTtcbmZ1bmN0aW9uIGNyZWF0ZUJhc2VDQ1NVc3JNc2dSb3VuZEltcGFjdFNjb3JlRGF0YV9SaXNFdmVudF9WaWN0aW0oKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgdGVhbU51bWJlcjogMCxcbiAgICAgICAgZW50aW5kZXg6IDAsXG4gICAgICAgIHh1aWQ6IExvbmcuVVpFUk8sXG4gICAgICAgIGNvbG9yOiAwLFxuICAgICAgICBpc0JvdDogZmFsc2UsXG4gICAgICAgIGlzRGVhZDogZmFsc2VcbiAgICB9O1xufVxuZXhwb3J0cy5DQ1NVc3JNc2dSb3VuZEltcGFjdFNjb3JlRGF0YV9SaXNFdmVudF9WaWN0aW0gPSB7XG4gICAgZW5jb2RlKG1lc3NhZ2UsIHdyaXRlciA9IG1pbmltYWxfMS5Xcml0ZXIuY3JlYXRlKCkpIHtcbiAgICAgICAgaWYgKG1lc3NhZ2UudGVhbU51bWJlciAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig4KS5pbnQzMihtZXNzYWdlLnRlYW1OdW1iZXIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLmVudGluZGV4ICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDE2KS5pbnQzMihtZXNzYWdlLmVudGluZGV4KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIW1lc3NhZ2UueHVpZC5pc1plcm8oKSkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigyNCkudWludDY0KG1lc3NhZ2UueHVpZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UuY29sb3IgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMzIpLmludDMyKG1lc3NhZ2UuY29sb3IpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLmlzQm90ID09PSB0cnVlKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDQwKS5ib29sKG1lc3NhZ2UuaXNCb3QpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLmlzRGVhZCA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig0OCkuYm9vbChtZXNzYWdlLmlzRGVhZCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9LFxuICAgIGRlY29kZShpbnB1dCwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IGlucHV0IGluc3RhbmNlb2YgbWluaW1hbF8xLlJlYWRlciA/IGlucHV0IDogbmV3IG1pbmltYWxfMS5SZWFkZXIoaW5wdXQpO1xuICAgICAgICBsZXQgZW5kID0gbGVuZ3RoID09PSB1bmRlZmluZWQgPyByZWFkZXIubGVuIDogcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDQ1NVc3JNc2dSb3VuZEltcGFjdFNjb3JlRGF0YV9SaXNFdmVudF9WaWN0aW0oKTtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhZyA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgIHN3aXRjaCAodGFnID4+PiAzKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnRlYW1OdW1iZXIgPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmVudGluZGV4ID0gcmVhZGVyLmludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS54dWlkID0gcmVhZGVyLnVpbnQ2NCgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuY29sb3IgPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmlzQm90ID0gcmVhZGVyLmJvb2woKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmlzRGVhZCA9IHJlYWRlci5ib29sKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJlYWRlci5za2lwVHlwZSh0YWcgJiA3KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfSxcbiAgICBmcm9tUGFydGlhbChvYmplY3QpIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2MsIF9kLCBfZTtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDQ1NVc3JNc2dSb3VuZEltcGFjdFNjb3JlRGF0YV9SaXNFdmVudF9WaWN0aW0oKTtcbiAgICAgICAgbWVzc2FnZS50ZWFtTnVtYmVyID0gKF9hID0gb2JqZWN0LnRlYW1OdW1iZXIpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IDA7XG4gICAgICAgIG1lc3NhZ2UuZW50aW5kZXggPSAoX2IgPSBvYmplY3QuZW50aW5kZXgpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IDA7XG4gICAgICAgIG1lc3NhZ2UueHVpZCA9XG4gICAgICAgICAgICBvYmplY3QueHVpZCAhPT0gdW5kZWZpbmVkICYmIG9iamVjdC54dWlkICE9PSBudWxsXG4gICAgICAgICAgICAgICAgPyBMb25nLmZyb21WYWx1ZShvYmplY3QueHVpZClcbiAgICAgICAgICAgICAgICA6IExvbmcuVVpFUk87XG4gICAgICAgIG1lc3NhZ2UuY29sb3IgPSAoX2MgPSBvYmplY3QuY29sb3IpICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IDA7XG4gICAgICAgIG1lc3NhZ2UuaXNCb3QgPSAoX2QgPSBvYmplY3QuaXNCb3QpICE9PSBudWxsICYmIF9kICE9PSB2b2lkIDAgPyBfZCA6IGZhbHNlO1xuICAgICAgICBtZXNzYWdlLmlzRGVhZCA9IChfZSA9IG9iamVjdC5pc0RlYWQpICE9PSBudWxsICYmIF9lICE9PSB2b2lkIDAgPyBfZSA6IGZhbHNlO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG59O1xuZnVuY3Rpb24gY3JlYXRlQmFzZUNDU1Vzck1zZ1JvdW5kSW1wYWN0U2NvcmVEYXRhX1Jpc0V2ZW50X09iamVjdGl2ZSgpIHtcbiAgICByZXR1cm4geyB0eXBlOiAwIH07XG59XG5leHBvcnRzLkNDU1Vzck1zZ1JvdW5kSW1wYWN0U2NvcmVEYXRhX1Jpc0V2ZW50X09iamVjdGl2ZSA9IHtcbiAgICBlbmNvZGUobWVzc2FnZSwgd3JpdGVyID0gbWluaW1hbF8xLldyaXRlci5jcmVhdGUoKSkge1xuICAgICAgICBpZiAobWVzc2FnZS50eXBlICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDgpLmludDMyKG1lc3NhZ2UudHlwZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9LFxuICAgIGRlY29kZShpbnB1dCwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IGlucHV0IGluc3RhbmNlb2YgbWluaW1hbF8xLlJlYWRlciA/IGlucHV0IDogbmV3IG1pbmltYWxfMS5SZWFkZXIoaW5wdXQpO1xuICAgICAgICBsZXQgZW5kID0gbGVuZ3RoID09PSB1bmRlZmluZWQgPyByZWFkZXIubGVuIDogcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDQ1NVc3JNc2dSb3VuZEltcGFjdFNjb3JlRGF0YV9SaXNFdmVudF9PYmplY3RpdmUoKTtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhZyA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgIHN3aXRjaCAodGFnID4+PiAzKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnR5cGUgPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmVhZGVyLnNraXBUeXBlKHRhZyAmIDcpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9LFxuICAgIGZyb21QYXJ0aWFsKG9iamVjdCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ0NTVXNyTXNnUm91bmRJbXBhY3RTY29yZURhdGFfUmlzRXZlbnRfT2JqZWN0aXZlKCk7XG4gICAgICAgIG1lc3NhZ2UudHlwZSA9IChfYSA9IG9iamVjdC50eXBlKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAwO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG59O1xuZnVuY3Rpb24gY3JlYXRlQmFzZUNDU1Vzck1zZ1JvdW5kSW1wYWN0U2NvcmVEYXRhX1Jpc0V2ZW50X0RhbWFnZSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICB0YXJnZXRFbnRpbmRleDogMCxcbiAgICAgICAgdGFyZ2V0WHVpZDogTG9uZy5VWkVSTyxcbiAgICAgICAgaGVhbHRoUmVtb3ZlZDogMCxcbiAgICAgICAgbnVtSGl0czogMCxcbiAgICAgICAgcmV0dXJuSGVhbHRoUmVtb3ZlZDogMCxcbiAgICAgICAgbnVtUmV0dXJuSGl0czogMFxuICAgIH07XG59XG5leHBvcnRzLkNDU1Vzck1zZ1JvdW5kSW1wYWN0U2NvcmVEYXRhX1Jpc0V2ZW50X0RhbWFnZSA9IHtcbiAgICBlbmNvZGUobWVzc2FnZSwgd3JpdGVyID0gbWluaW1hbF8xLldyaXRlci5jcmVhdGUoKSkge1xuICAgICAgICBpZiAobWVzc2FnZS50YXJnZXRFbnRpbmRleCAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig4KS5pbnQzMihtZXNzYWdlLnRhcmdldEVudGluZGV4KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIW1lc3NhZ2UudGFyZ2V0WHVpZC5pc1plcm8oKSkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigxNikudWludDY0KG1lc3NhZ2UudGFyZ2V0WHVpZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UuaGVhbHRoUmVtb3ZlZCAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigyNCkuaW50MzIobWVzc2FnZS5oZWFsdGhSZW1vdmVkKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5udW1IaXRzICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDMyKS5pbnQzMihtZXNzYWdlLm51bUhpdHMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLnJldHVybkhlYWx0aFJlbW92ZWQgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoNDApLmludDMyKG1lc3NhZ2UucmV0dXJuSGVhbHRoUmVtb3ZlZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UubnVtUmV0dXJuSGl0cyAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig0OCkuaW50MzIobWVzc2FnZS5udW1SZXR1cm5IaXRzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH0sXG4gICAgZGVjb2RlKGlucHV0LCBsZW5ndGgpIHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gaW5wdXQgaW5zdGFuY2VvZiBtaW5pbWFsXzEuUmVhZGVyID8gaW5wdXQgOiBuZXcgbWluaW1hbF8xLlJlYWRlcihpbnB1dCk7XG4gICAgICAgIGxldCBlbmQgPSBsZW5ndGggPT09IHVuZGVmaW5lZCA/IHJlYWRlci5sZW4gOiByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNDU1Vzck1zZ1JvdW5kSW1wYWN0U2NvcmVEYXRhX1Jpc0V2ZW50X0RhbWFnZSgpO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudGFyZ2V0RW50aW5kZXggPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnRhcmdldFh1aWQgPSByZWFkZXIudWludDY0KCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5oZWFsdGhSZW1vdmVkID0gcmVhZGVyLmludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5udW1IaXRzID0gcmVhZGVyLmludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5yZXR1cm5IZWFsdGhSZW1vdmVkID0gcmVhZGVyLmludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5udW1SZXR1cm5IaXRzID0gcmVhZGVyLmludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJlYWRlci5za2lwVHlwZSh0YWcgJiA3KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfSxcbiAgICBmcm9tUGFydGlhbChvYmplY3QpIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2MsIF9kLCBfZTtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDQ1NVc3JNc2dSb3VuZEltcGFjdFNjb3JlRGF0YV9SaXNFdmVudF9EYW1hZ2UoKTtcbiAgICAgICAgbWVzc2FnZS50YXJnZXRFbnRpbmRleCA9IChfYSA9IG9iamVjdC50YXJnZXRFbnRpbmRleCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMDtcbiAgICAgICAgbWVzc2FnZS50YXJnZXRYdWlkID1cbiAgICAgICAgICAgIG9iamVjdC50YXJnZXRYdWlkICE9PSB1bmRlZmluZWQgJiYgb2JqZWN0LnRhcmdldFh1aWQgIT09IG51bGxcbiAgICAgICAgICAgICAgICA/IExvbmcuZnJvbVZhbHVlKG9iamVjdC50YXJnZXRYdWlkKVxuICAgICAgICAgICAgICAgIDogTG9uZy5VWkVSTztcbiAgICAgICAgbWVzc2FnZS5oZWFsdGhSZW1vdmVkID0gKF9iID0gb2JqZWN0LmhlYWx0aFJlbW92ZWQpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IDA7XG4gICAgICAgIG1lc3NhZ2UubnVtSGl0cyA9IChfYyA9IG9iamVjdC5udW1IaXRzKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiAwO1xuICAgICAgICBtZXNzYWdlLnJldHVybkhlYWx0aFJlbW92ZWQgPSAoX2QgPSBvYmplY3QucmV0dXJuSGVhbHRoUmVtb3ZlZCkgIT09IG51bGwgJiYgX2QgIT09IHZvaWQgMCA/IF9kIDogMDtcbiAgICAgICAgbWVzc2FnZS5udW1SZXR1cm5IaXRzID0gKF9lID0gb2JqZWN0Lm51bVJldHVybkhpdHMpICE9PSBudWxsICYmIF9lICE9PSB2b2lkIDAgPyBfZSA6IDA7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbn07XG5mdW5jdGlvbiBjcmVhdGVCYXNlQ0NTVXNyTXNnUm91bmRJbXBhY3RTY29yZURhdGFfSW5pdGlhbENvbmRpdGlvbnMoKSB7XG4gICAgcmV0dXJuIHsgY3RFcXVpcFZhbHVlOiAwLCB0RXF1aXBWYWx1ZTogMCwgdGVycm9yaXN0T2RkczogMCB9O1xufVxuZXhwb3J0cy5DQ1NVc3JNc2dSb3VuZEltcGFjdFNjb3JlRGF0YV9Jbml0aWFsQ29uZGl0aW9ucyA9IHtcbiAgICBlbmNvZGUobWVzc2FnZSwgd3JpdGVyID0gbWluaW1hbF8xLldyaXRlci5jcmVhdGUoKSkge1xuICAgICAgICBpZiAobWVzc2FnZS5jdEVxdWlwVmFsdWUgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoOCkuaW50MzIobWVzc2FnZS5jdEVxdWlwVmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLnRFcXVpcFZhbHVlICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDE2KS5pbnQzMihtZXNzYWdlLnRFcXVpcFZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS50ZXJyb3Jpc3RPZGRzICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDI0KS5pbnQzMihtZXNzYWdlLnRlcnJvcmlzdE9kZHMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfSxcbiAgICBkZWNvZGUoaW5wdXQsIGxlbmd0aCkge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBpbnB1dCBpbnN0YW5jZW9mIG1pbmltYWxfMS5SZWFkZXIgPyBpbnB1dCA6IG5ldyBtaW5pbWFsXzEuUmVhZGVyKGlucHV0KTtcbiAgICAgICAgbGV0IGVuZCA9IGxlbmd0aCA9PT0gdW5kZWZpbmVkID8gcmVhZGVyLmxlbiA6IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ0NTVXNyTXNnUm91bmRJbXBhY3RTY29yZURhdGFfSW5pdGlhbENvbmRpdGlvbnMoKTtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhZyA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgIHN3aXRjaCAodGFnID4+PiAzKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmN0RXF1aXBWYWx1ZSA9IHJlYWRlci5pbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudEVxdWlwVmFsdWUgPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnRlcnJvcmlzdE9kZHMgPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmVhZGVyLnNraXBUeXBlKHRhZyAmIDcpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9LFxuICAgIGZyb21QYXJ0aWFsKG9iamVjdCkge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYztcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDQ1NVc3JNc2dSb3VuZEltcGFjdFNjb3JlRGF0YV9Jbml0aWFsQ29uZGl0aW9ucygpO1xuICAgICAgICBtZXNzYWdlLmN0RXF1aXBWYWx1ZSA9IChfYSA9IG9iamVjdC5jdEVxdWlwVmFsdWUpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IDA7XG4gICAgICAgIG1lc3NhZ2UudEVxdWlwVmFsdWUgPSAoX2IgPSBvYmplY3QudEVxdWlwVmFsdWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IDA7XG4gICAgICAgIG1lc3NhZ2UudGVycm9yaXN0T2RkcyA9IChfYyA9IG9iamVjdC50ZXJyb3Jpc3RPZGRzKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiAwO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG59O1xuZnVuY3Rpb24gY3JlYXRlQmFzZUNDU1Vzck1zZ0N1cnJlbnRSb3VuZE9kZHMoKSB7XG4gICAgcmV0dXJuIHsgb2RkczogMCB9O1xufVxuZXhwb3J0cy5DQ1NVc3JNc2dDdXJyZW50Um91bmRPZGRzID0ge1xuICAgIGVuY29kZShtZXNzYWdlLCB3cml0ZXIgPSBtaW5pbWFsXzEuV3JpdGVyLmNyZWF0ZSgpKSB7XG4gICAgICAgIGlmIChtZXNzYWdlLm9kZHMgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoOCkuaW50MzIobWVzc2FnZS5vZGRzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH0sXG4gICAgZGVjb2RlKGlucHV0LCBsZW5ndGgpIHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gaW5wdXQgaW5zdGFuY2VvZiBtaW5pbWFsXzEuUmVhZGVyID8gaW5wdXQgOiBuZXcgbWluaW1hbF8xLlJlYWRlcihpbnB1dCk7XG4gICAgICAgIGxldCBlbmQgPSBsZW5ndGggPT09IHVuZGVmaW5lZCA/IHJlYWRlci5sZW4gOiByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNDU1Vzck1zZ0N1cnJlbnRSb3VuZE9kZHMoKTtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhZyA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgIHN3aXRjaCAodGFnID4+PiAzKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLm9kZHMgPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmVhZGVyLnNraXBUeXBlKHRhZyAmIDcpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9LFxuICAgIGZyb21QYXJ0aWFsKG9iamVjdCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ0NTVXNyTXNnQ3VycmVudFJvdW5kT2RkcygpO1xuICAgICAgICBtZXNzYWdlLm9kZHMgPSAoX2EgPSBvYmplY3Qub2RkcykgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMDtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxufTtcbmZ1bmN0aW9uIGNyZWF0ZUJhc2VDQ1NVc3JNc2dEZWVwU3RhdHMoKSB7XG4gICAgcmV0dXJuIHsgc3RhdHM6IHVuZGVmaW5lZCB9O1xufVxuZXhwb3J0cy5DQ1NVc3JNc2dEZWVwU3RhdHMgPSB7XG4gICAgZW5jb2RlKG1lc3NhZ2UsIHdyaXRlciA9IG1pbmltYWxfMS5Xcml0ZXIuY3JlYXRlKCkpIHtcbiAgICAgICAgaWYgKG1lc3NhZ2Uuc3RhdHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY3N0cmlrZTE1X2djbWVzc2FnZXNfMS5DTXNnR0NDU3RyaWtlMTVDbGllbnREZWVwU3RhdHMuZW5jb2RlKG1lc3NhZ2Uuc3RhdHMsIHdyaXRlci51aW50MzIoMTApLmZvcmsoKSkubGRlbGltKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9LFxuICAgIGRlY29kZShpbnB1dCwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IGlucHV0IGluc3RhbmNlb2YgbWluaW1hbF8xLlJlYWRlciA/IGlucHV0IDogbmV3IG1pbmltYWxfMS5SZWFkZXIoaW5wdXQpO1xuICAgICAgICBsZXQgZW5kID0gbGVuZ3RoID09PSB1bmRlZmluZWQgPyByZWFkZXIubGVuIDogcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDQ1NVc3JNc2dEZWVwU3RhdHMoKTtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhZyA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgIHN3aXRjaCAodGFnID4+PiAzKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnN0YXRzID0gY3N0cmlrZTE1X2djbWVzc2FnZXNfMS5DTXNnR0NDU3RyaWtlMTVDbGllbnREZWVwU3RhdHMuZGVjb2RlKHJlYWRlciwgcmVhZGVyLnVpbnQzMigpKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmVhZGVyLnNraXBUeXBlKHRhZyAmIDcpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9LFxuICAgIGZyb21QYXJ0aWFsKG9iamVjdCkge1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNDU1Vzck1zZ0RlZXBTdGF0cygpO1xuICAgICAgICBtZXNzYWdlLnN0YXRzID1cbiAgICAgICAgICAgIG9iamVjdC5zdGF0cyAhPT0gdW5kZWZpbmVkICYmIG9iamVjdC5zdGF0cyAhPT0gbnVsbFxuICAgICAgICAgICAgICAgID8gY3N0cmlrZTE1X2djbWVzc2FnZXNfMS5DTXNnR0NDU3RyaWtlMTVDbGllbnREZWVwU3RhdHMuZnJvbVBhcnRpYWwob2JqZWN0LnN0YXRzKVxuICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG59O1xuZnVuY3Rpb24gY3JlYXRlQmFzZUNDU1Vzck1zZ1Jlc2V0SHVkKCkge1xuICAgIHJldHVybiB7IHJlc2V0OiBmYWxzZSB9O1xufVxuZXhwb3J0cy5DQ1NVc3JNc2dSZXNldEh1ZCA9IHtcbiAgICBlbmNvZGUobWVzc2FnZSwgd3JpdGVyID0gbWluaW1hbF8xLldyaXRlci5jcmVhdGUoKSkge1xuICAgICAgICBpZiAobWVzc2FnZS5yZXNldCA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig4KS5ib29sKG1lc3NhZ2UucmVzZXQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfSxcbiAgICBkZWNvZGUoaW5wdXQsIGxlbmd0aCkge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBpbnB1dCBpbnN0YW5jZW9mIG1pbmltYWxfMS5SZWFkZXIgPyBpbnB1dCA6IG5ldyBtaW5pbWFsXzEuUmVhZGVyKGlucHV0KTtcbiAgICAgICAgbGV0IGVuZCA9IGxlbmd0aCA9PT0gdW5kZWZpbmVkID8gcmVhZGVyLmxlbiA6IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ0NTVXNyTXNnUmVzZXRIdWQoKTtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhZyA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgIHN3aXRjaCAodGFnID4+PiAzKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnJlc2V0ID0gcmVhZGVyLmJvb2woKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmVhZGVyLnNraXBUeXBlKHRhZyAmIDcpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9LFxuICAgIGZyb21QYXJ0aWFsKG9iamVjdCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ0NTVXNyTXNnUmVzZXRIdWQoKTtcbiAgICAgICAgbWVzc2FnZS5yZXNldCA9IChfYSA9IG9iamVjdC5yZXNldCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogZmFsc2U7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbn07XG5mdW5jdGlvbiBjcmVhdGVCYXNlQ0NTVXNyTXNnR2FtZVRpdGxlKCkge1xuICAgIHJldHVybiB7IGR1bW15OiAwIH07XG59XG5leHBvcnRzLkNDU1Vzck1zZ0dhbWVUaXRsZSA9IHtcbiAgICBlbmNvZGUobWVzc2FnZSwgd3JpdGVyID0gbWluaW1hbF8xLldyaXRlci5jcmVhdGUoKSkge1xuICAgICAgICBpZiAobWVzc2FnZS5kdW1teSAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig4KS5pbnQzMihtZXNzYWdlLmR1bW15KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH0sXG4gICAgZGVjb2RlKGlucHV0LCBsZW5ndGgpIHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gaW5wdXQgaW5zdGFuY2VvZiBtaW5pbWFsXzEuUmVhZGVyID8gaW5wdXQgOiBuZXcgbWluaW1hbF8xLlJlYWRlcihpbnB1dCk7XG4gICAgICAgIGxldCBlbmQgPSBsZW5ndGggPT09IHVuZGVmaW5lZCA/IHJlYWRlci5sZW4gOiByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNDU1Vzck1zZ0dhbWVUaXRsZSgpO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZHVtbXkgPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmVhZGVyLnNraXBUeXBlKHRhZyAmIDcpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9LFxuICAgIGZyb21QYXJ0aWFsKG9iamVjdCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ0NTVXNyTXNnR2FtZVRpdGxlKCk7XG4gICAgICAgIG1lc3NhZ2UuZHVtbXkgPSAoX2EgPSBvYmplY3QuZHVtbXkpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IDA7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbn07XG5mdW5jdGlvbiBjcmVhdGVCYXNlQ0NTVXNyTXNnUmVxdWVzdFN0YXRlKCkge1xuICAgIHJldHVybiB7IGR1bW15OiAwIH07XG59XG5leHBvcnRzLkNDU1Vzck1zZ1JlcXVlc3RTdGF0ZSA9IHtcbiAgICBlbmNvZGUobWVzc2FnZSwgd3JpdGVyID0gbWluaW1hbF8xLldyaXRlci5jcmVhdGUoKSkge1xuICAgICAgICBpZiAobWVzc2FnZS5kdW1teSAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig4KS5pbnQzMihtZXNzYWdlLmR1bW15KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH0sXG4gICAgZGVjb2RlKGlucHV0LCBsZW5ndGgpIHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gaW5wdXQgaW5zdGFuY2VvZiBtaW5pbWFsXzEuUmVhZGVyID8gaW5wdXQgOiBuZXcgbWluaW1hbF8xLlJlYWRlcihpbnB1dCk7XG4gICAgICAgIGxldCBlbmQgPSBsZW5ndGggPT09IHVuZGVmaW5lZCA/IHJlYWRlci5sZW4gOiByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNDU1Vzck1zZ1JlcXVlc3RTdGF0ZSgpO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZHVtbXkgPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmVhZGVyLnNraXBUeXBlKHRhZyAmIDcpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9LFxuICAgIGZyb21QYXJ0aWFsKG9iamVjdCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ0NTVXNyTXNnUmVxdWVzdFN0YXRlKCk7XG4gICAgICAgIG1lc3NhZ2UuZHVtbXkgPSAoX2EgPSBvYmplY3QuZHVtbXkpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IDA7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbn07XG5mdW5jdGlvbiBjcmVhdGVCYXNlQ0NTVXNyTXNnU3RvcFNwZWN0YXRvck1vZGUoKSB7XG4gICAgcmV0dXJuIHsgZHVtbXk6IDAgfTtcbn1cbmV4cG9ydHMuQ0NTVXNyTXNnU3RvcFNwZWN0YXRvck1vZGUgPSB7XG4gICAgZW5jb2RlKG1lc3NhZ2UsIHdyaXRlciA9IG1pbmltYWxfMS5Xcml0ZXIuY3JlYXRlKCkpIHtcbiAgICAgICAgaWYgKG1lc3NhZ2UuZHVtbXkgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoOCkuaW50MzIobWVzc2FnZS5kdW1teSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9LFxuICAgIGRlY29kZShpbnB1dCwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IGlucHV0IGluc3RhbmNlb2YgbWluaW1hbF8xLlJlYWRlciA/IGlucHV0IDogbmV3IG1pbmltYWxfMS5SZWFkZXIoaW5wdXQpO1xuICAgICAgICBsZXQgZW5kID0gbGVuZ3RoID09PSB1bmRlZmluZWQgPyByZWFkZXIubGVuIDogcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDQ1NVc3JNc2dTdG9wU3BlY3RhdG9yTW9kZSgpO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZHVtbXkgPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmVhZGVyLnNraXBUeXBlKHRhZyAmIDcpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9LFxuICAgIGZyb21QYXJ0aWFsKG9iamVjdCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ0NTVXNyTXNnU3RvcFNwZWN0YXRvck1vZGUoKTtcbiAgICAgICAgbWVzc2FnZS5kdW1teSA9IChfYSA9IG9iamVjdC5kdW1teSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMDtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxufTtcbmZ1bmN0aW9uIGNyZWF0ZUJhc2VDQ1NVc3JNc2dEaXNjb25uZWN0VG9Mb2JieSgpIHtcbiAgICByZXR1cm4geyBkdW1teTogMCB9O1xufVxuZXhwb3J0cy5DQ1NVc3JNc2dEaXNjb25uZWN0VG9Mb2JieSA9IHtcbiAgICBlbmNvZGUobWVzc2FnZSwgd3JpdGVyID0gbWluaW1hbF8xLldyaXRlci5jcmVhdGUoKSkge1xuICAgICAgICBpZiAobWVzc2FnZS5kdW1teSAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig4KS5pbnQzMihtZXNzYWdlLmR1bW15KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH0sXG4gICAgZGVjb2RlKGlucHV0LCBsZW5ndGgpIHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gaW5wdXQgaW5zdGFuY2VvZiBtaW5pbWFsXzEuUmVhZGVyID8gaW5wdXQgOiBuZXcgbWluaW1hbF8xLlJlYWRlcihpbnB1dCk7XG4gICAgICAgIGxldCBlbmQgPSBsZW5ndGggPT09IHVuZGVmaW5lZCA/IHJlYWRlci5sZW4gOiByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNDU1Vzck1zZ0Rpc2Nvbm5lY3RUb0xvYmJ5KCk7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBjb25zdCB0YWcgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKHRhZyA+Pj4gMykge1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5kdW1teSA9IHJlYWRlci5pbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICByZWFkZXIuc2tpcFR5cGUodGFnICYgNyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH0sXG4gICAgZnJvbVBhcnRpYWwob2JqZWN0KSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDQ1NVc3JNc2dEaXNjb25uZWN0VG9Mb2JieSgpO1xuICAgICAgICBtZXNzYWdlLmR1bW15ID0gKF9hID0gb2JqZWN0LmR1bW15KSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAwO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG59O1xuZnVuY3Rpb24gY3JlYXRlQmFzZUNDU1Vzck1zZ1dhcm11cEhhc0VuZGVkKCkge1xuICAgIHJldHVybiB7IGR1bW15OiAwIH07XG59XG5leHBvcnRzLkNDU1Vzck1zZ1dhcm11cEhhc0VuZGVkID0ge1xuICAgIGVuY29kZShtZXNzYWdlLCB3cml0ZXIgPSBtaW5pbWFsXzEuV3JpdGVyLmNyZWF0ZSgpKSB7XG4gICAgICAgIGlmIChtZXNzYWdlLmR1bW15ICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDgpLmludDMyKG1lc3NhZ2UuZHVtbXkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfSxcbiAgICBkZWNvZGUoaW5wdXQsIGxlbmd0aCkge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBpbnB1dCBpbnN0YW5jZW9mIG1pbmltYWxfMS5SZWFkZXIgPyBpbnB1dCA6IG5ldyBtaW5pbWFsXzEuUmVhZGVyKGlucHV0KTtcbiAgICAgICAgbGV0IGVuZCA9IGxlbmd0aCA9PT0gdW5kZWZpbmVkID8gcmVhZGVyLmxlbiA6IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ0NTVXNyTXNnV2FybXVwSGFzRW5kZWQoKTtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhZyA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgIHN3aXRjaCAodGFnID4+PiAzKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmR1bW15ID0gcmVhZGVyLmludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJlYWRlci5za2lwVHlwZSh0YWcgJiA3KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfSxcbiAgICBmcm9tUGFydGlhbChvYmplY3QpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNDU1Vzck1zZ1dhcm11cEhhc0VuZGVkKCk7XG4gICAgICAgIG1lc3NhZ2UuZHVtbXkgPSAoX2EgPSBvYmplY3QuZHVtbXkpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IDA7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbn07XG5mdW5jdGlvbiBjcmVhdGVCYXNlQ0NTVXNyTXNnQ2xpZW50SW5mbygpIHtcbiAgICByZXR1cm4geyBkdW1teTogMCB9O1xufVxuZXhwb3J0cy5DQ1NVc3JNc2dDbGllbnRJbmZvID0ge1xuICAgIGVuY29kZShtZXNzYWdlLCB3cml0ZXIgPSBtaW5pbWFsXzEuV3JpdGVyLmNyZWF0ZSgpKSB7XG4gICAgICAgIGlmIChtZXNzYWdlLmR1bW15ICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDgpLmludDMyKG1lc3NhZ2UuZHVtbXkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfSxcbiAgICBkZWNvZGUoaW5wdXQsIGxlbmd0aCkge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBpbnB1dCBpbnN0YW5jZW9mIG1pbmltYWxfMS5SZWFkZXIgPyBpbnB1dCA6IG5ldyBtaW5pbWFsXzEuUmVhZGVyKGlucHV0KTtcbiAgICAgICAgbGV0IGVuZCA9IGxlbmd0aCA9PT0gdW5kZWZpbmVkID8gcmVhZGVyLmxlbiA6IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ0NTVXNyTXNnQ2xpZW50SW5mbygpO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZHVtbXkgPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmVhZGVyLnNraXBUeXBlKHRhZyAmIDcpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9LFxuICAgIGZyb21QYXJ0aWFsKG9iamVjdCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ0NTVXNyTXNnQ2xpZW50SW5mbygpO1xuICAgICAgICBtZXNzYWdlLmR1bW15ID0gKF9hID0gb2JqZWN0LmR1bW15KSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAwO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG59O1xuZnVuY3Rpb24gY3JlYXRlQmFzZUNDU1Vzck1zZ1NlcnZlclJhbmtSZXZlYWxBbGwoKSB7XG4gICAgcmV0dXJuIHsgc2Vjb25kc1RpbGxTaHV0ZG93bjogMCwgcmVzZXJ2YXRpb246IHVuZGVmaW5lZCB9O1xufVxuZXhwb3J0cy5DQ1NVc3JNc2dTZXJ2ZXJSYW5rUmV2ZWFsQWxsID0ge1xuICAgIGVuY29kZShtZXNzYWdlLCB3cml0ZXIgPSBtaW5pbWFsXzEuV3JpdGVyLmNyZWF0ZSgpKSB7XG4gICAgICAgIGlmIChtZXNzYWdlLnNlY29uZHNUaWxsU2h1dGRvd24gIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoOCkuaW50MzIobWVzc2FnZS5zZWNvbmRzVGlsbFNodXRkb3duKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5yZXNlcnZhdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjc3RyaWtlMTVfZ2NtZXNzYWdlc18xLkNNc2dHQ0NTdHJpa2UxNVYyTWF0Y2htYWtpbmdHQzJTZXJ2ZXJSZXNlcnZlLmVuY29kZShtZXNzYWdlLnJlc2VydmF0aW9uLCB3cml0ZXIudWludDMyKDE4KS5mb3JrKCkpLmxkZWxpbSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfSxcbiAgICBkZWNvZGUoaW5wdXQsIGxlbmd0aCkge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBpbnB1dCBpbnN0YW5jZW9mIG1pbmltYWxfMS5SZWFkZXIgPyBpbnB1dCA6IG5ldyBtaW5pbWFsXzEuUmVhZGVyKGlucHV0KTtcbiAgICAgICAgbGV0IGVuZCA9IGxlbmd0aCA9PT0gdW5kZWZpbmVkID8gcmVhZGVyLmxlbiA6IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ0NTVXNyTXNnU2VydmVyUmFua1JldmVhbEFsbCgpO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Uuc2Vjb25kc1RpbGxTaHV0ZG93biA9IHJlYWRlci5pbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UucmVzZXJ2YXRpb24gPVxuICAgICAgICAgICAgICAgICAgICAgICAgY3N0cmlrZTE1X2djbWVzc2FnZXNfMS5DTXNnR0NDU3RyaWtlMTVWMk1hdGNobWFraW5nR0MyU2VydmVyUmVzZXJ2ZS5kZWNvZGUocmVhZGVyLCByZWFkZXIudWludDMyKCkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICByZWFkZXIuc2tpcFR5cGUodGFnICYgNyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH0sXG4gICAgZnJvbVBhcnRpYWwob2JqZWN0KSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDQ1NVc3JNc2dTZXJ2ZXJSYW5rUmV2ZWFsQWxsKCk7XG4gICAgICAgIG1lc3NhZ2Uuc2Vjb25kc1RpbGxTaHV0ZG93biA9IChfYSA9IG9iamVjdC5zZWNvbmRzVGlsbFNodXRkb3duKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAwO1xuICAgICAgICBtZXNzYWdlLnJlc2VydmF0aW9uID1cbiAgICAgICAgICAgIG9iamVjdC5yZXNlcnZhdGlvbiAhPT0gdW5kZWZpbmVkICYmIG9iamVjdC5yZXNlcnZhdGlvbiAhPT0gbnVsbFxuICAgICAgICAgICAgICAgID8gY3N0cmlrZTE1X2djbWVzc2FnZXNfMS5DTXNnR0NDU3RyaWtlMTVWMk1hdGNobWFraW5nR0MyU2VydmVyUmVzZXJ2ZS5mcm9tUGFydGlhbChvYmplY3QucmVzZXJ2YXRpb24pXG4gICAgICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbn07XG5mdW5jdGlvbiBjcmVhdGVCYXNlQ0NTVXNyTXNnVXRpbE1zZygpIHtcbiAgICByZXR1cm4geyB1dGlsQWN0aW9uOiBcIlwiLCB1dGlsMTogMCwgdXRpbDI6IDAsIHV0aWwzOiAwLCB1dGlsNDogMCwgdXRpbDU6IDAgfTtcbn1cbmV4cG9ydHMuQ0NTVXNyTXNnVXRpbE1zZyA9IHtcbiAgICBlbmNvZGUobWVzc2FnZSwgd3JpdGVyID0gbWluaW1hbF8xLldyaXRlci5jcmVhdGUoKSkge1xuICAgICAgICBpZiAobWVzc2FnZS51dGlsQWN0aW9uICE9PSBcIlwiKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDEwKS5zdHJpbmcobWVzc2FnZS51dGlsQWN0aW9uKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS51dGlsMSAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigxNikuaW50MzIobWVzc2FnZS51dGlsMSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UudXRpbDIgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMjQpLmludDMyKG1lc3NhZ2UudXRpbDIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLnV0aWwzICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDMyKS5pbnQzMihtZXNzYWdlLnV0aWwzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS51dGlsNCAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig0MCkuaW50MzIobWVzc2FnZS51dGlsNCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UudXRpbDUgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoNDgpLmludDMyKG1lc3NhZ2UudXRpbDUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfSxcbiAgICBkZWNvZGUoaW5wdXQsIGxlbmd0aCkge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBpbnB1dCBpbnN0YW5jZW9mIG1pbmltYWxfMS5SZWFkZXIgPyBpbnB1dCA6IG5ldyBtaW5pbWFsXzEuUmVhZGVyKGlucHV0KTtcbiAgICAgICAgbGV0IGVuZCA9IGxlbmd0aCA9PT0gdW5kZWZpbmVkID8gcmVhZGVyLmxlbiA6IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ0NTVXNyTXNnVXRpbE1zZygpO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudXRpbEFjdGlvbiA9IHJlYWRlci5zdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnV0aWwxID0gcmVhZGVyLmludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS51dGlsMiA9IHJlYWRlci5pbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudXRpbDMgPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnV0aWw0ID0gcmVhZGVyLmludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS51dGlsNSA9IHJlYWRlci5pbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICByZWFkZXIuc2tpcFR5cGUodGFnICYgNyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH0sXG4gICAgZnJvbVBhcnRpYWwob2JqZWN0KSB7XG4gICAgICAgIHZhciBfYSwgX2IsIF9jLCBfZCwgX2UsIF9mO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNDU1Vzck1zZ1V0aWxNc2coKTtcbiAgICAgICAgbWVzc2FnZS51dGlsQWN0aW9uID0gKF9hID0gb2JqZWN0LnV0aWxBY3Rpb24pICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IFwiXCI7XG4gICAgICAgIG1lc3NhZ2UudXRpbDEgPSAoX2IgPSBvYmplY3QudXRpbDEpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IDA7XG4gICAgICAgIG1lc3NhZ2UudXRpbDIgPSAoX2MgPSBvYmplY3QudXRpbDIpICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IDA7XG4gICAgICAgIG1lc3NhZ2UudXRpbDMgPSAoX2QgPSBvYmplY3QudXRpbDMpICE9PSBudWxsICYmIF9kICE9PSB2b2lkIDAgPyBfZCA6IDA7XG4gICAgICAgIG1lc3NhZ2UudXRpbDQgPSAoX2UgPSBvYmplY3QudXRpbDQpICE9PSBudWxsICYmIF9lICE9PSB2b2lkIDAgPyBfZSA6IDA7XG4gICAgICAgIG1lc3NhZ2UudXRpbDUgPSAoX2YgPSBvYmplY3QudXRpbDUpICE9PSBudWxsICYmIF9mICE9PSB2b2lkIDAgPyBfZiA6IDA7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbn07XG4vLyBJZiB5b3UgZ2V0IGEgY29tcGlsZS1lcnJvciBhYm91dCAnQ29uc3RydWN0b3I8TG9uZz4gYW5kIC4uLiBoYXZlIG5vIG92ZXJsYXAnLFxuLy8gYWRkICctLXRzX3Byb3RvX29wdD1lc01vZHVsZUludGVyb3A9dHJ1ZScgYXMgYSBmbGFnIHdoZW4gY2FsbGluZyAncHJvdG9jJy5cbmlmIChtaW5pbWFsXzEudXRpbC5Mb25nICE9PSBMb25nKSB7XG4gICAgbWluaW1hbF8xLnV0aWwuTG9uZyA9IExvbmc7XG4gICAgKDAsIG1pbmltYWxfMS5jb25maWd1cmUpKCk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jc3RyaWtlMTVfdXNlcm1lc3NhZ2VzLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5DRW5naW5lR290dlN5bmNQYWNrZXQgPSBleHBvcnRzLnByb3RvYnVmUGFja2FnZSA9IHZvaWQgMDtcbi8qIGVzbGludC1kaXNhYmxlICovXG5jb25zdCBtaW5pbWFsXzEgPSByZXF1aXJlKFwicHJvdG9idWZqcy9taW5pbWFsXCIpO1xuY29uc3QgTG9uZyA9IHJlcXVpcmUoXCJsb25nXCIpO1xuZXhwb3J0cy5wcm90b2J1ZlBhY2thZ2UgPSBcIlwiO1xuZnVuY3Rpb24gY3JlYXRlQmFzZUNFbmdpbmVHb3R2U3luY1BhY2tldCgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBtYXRjaElkOiBMb25nLlVaRVJPLFxuICAgICAgICBpbnN0YW5jZUlkOiAwLFxuICAgICAgICBzaWdudXBmcmFnbWVudDogMCxcbiAgICAgICAgY3VycmVudGZyYWdtZW50OiAwLFxuICAgICAgICB0aWNrcmF0ZTogMCxcbiAgICAgICAgdGljazogMCxcbiAgICAgICAgcnRkZWxheTogMCxcbiAgICAgICAgcmN2YWdlOiAwLFxuICAgICAgICBrZXlmcmFtZUludGVydmFsOiAwLFxuICAgICAgICBjZG5kZWxheTogMFxuICAgIH07XG59XG5leHBvcnRzLkNFbmdpbmVHb3R2U3luY1BhY2tldCA9IHtcbiAgICBlbmNvZGUobWVzc2FnZSwgd3JpdGVyID0gbWluaW1hbF8xLldyaXRlci5jcmVhdGUoKSkge1xuICAgICAgICBpZiAoIW1lc3NhZ2UubWF0Y2hJZC5pc1plcm8oKSkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig4KS51aW50NjQobWVzc2FnZS5tYXRjaElkKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5pbnN0YW5jZUlkICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDE2KS51aW50MzIobWVzc2FnZS5pbnN0YW5jZUlkKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5zaWdudXBmcmFnbWVudCAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigyNCkudWludDMyKG1lc3NhZ2Uuc2lnbnVwZnJhZ21lbnQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLmN1cnJlbnRmcmFnbWVudCAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigzMikudWludDMyKG1lc3NhZ2UuY3VycmVudGZyYWdtZW50KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS50aWNrcmF0ZSAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig0NSkuZmxvYXQobWVzc2FnZS50aWNrcmF0ZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UudGljayAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig0OCkudWludDMyKG1lc3NhZ2UudGljayk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UucnRkZWxheSAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig2OSkuZmxvYXQobWVzc2FnZS5ydGRlbGF5KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5yY3ZhZ2UgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoNzcpLmZsb2F0KG1lc3NhZ2UucmN2YWdlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5rZXlmcmFtZUludGVydmFsICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDg1KS5mbG9hdChtZXNzYWdlLmtleWZyYW1lSW50ZXJ2YWwpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLmNkbmRlbGF5ICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDg4KS51aW50MzIobWVzc2FnZS5jZG5kZWxheSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9LFxuICAgIGRlY29kZShpbnB1dCwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IGlucHV0IGluc3RhbmNlb2YgbWluaW1hbF8xLlJlYWRlciA/IGlucHV0IDogbmV3IG1pbmltYWxfMS5SZWFkZXIoaW5wdXQpO1xuICAgICAgICBsZXQgZW5kID0gbGVuZ3RoID09PSB1bmRlZmluZWQgPyByZWFkZXIubGVuIDogcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDRW5naW5lR290dlN5bmNQYWNrZXQoKTtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhZyA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgIHN3aXRjaCAodGFnID4+PiAzKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLm1hdGNoSWQgPSByZWFkZXIudWludDY0KCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5pbnN0YW5jZUlkID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Uuc2lnbnVwZnJhZ21lbnQgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5jdXJyZW50ZnJhZ21lbnQgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS50aWNrcmF0ZSA9IHJlYWRlci5mbG9hdCgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudGljayA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA4OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnJ0ZGVsYXkgPSByZWFkZXIuZmxvYXQoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA5OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnJjdmFnZSA9IHJlYWRlci5mbG9hdCgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDEwOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmtleWZyYW1lSW50ZXJ2YWwgPSByZWFkZXIuZmxvYXQoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAxMTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5jZG5kZWxheSA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmVhZGVyLnNraXBUeXBlKHRhZyAmIDcpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9LFxuICAgIGZyb21QYXJ0aWFsKG9iamVjdCkge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYywgX2QsIF9lLCBfZiwgX2csIF9oLCBfajtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDRW5naW5lR290dlN5bmNQYWNrZXQoKTtcbiAgICAgICAgbWVzc2FnZS5tYXRjaElkID1cbiAgICAgICAgICAgIG9iamVjdC5tYXRjaElkICE9PSB1bmRlZmluZWQgJiYgb2JqZWN0Lm1hdGNoSWQgIT09IG51bGxcbiAgICAgICAgICAgICAgICA/IExvbmcuZnJvbVZhbHVlKG9iamVjdC5tYXRjaElkKVxuICAgICAgICAgICAgICAgIDogTG9uZy5VWkVSTztcbiAgICAgICAgbWVzc2FnZS5pbnN0YW5jZUlkID0gKF9hID0gb2JqZWN0Lmluc3RhbmNlSWQpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IDA7XG4gICAgICAgIG1lc3NhZ2Uuc2lnbnVwZnJhZ21lbnQgPSAoX2IgPSBvYmplY3Quc2lnbnVwZnJhZ21lbnQpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IDA7XG4gICAgICAgIG1lc3NhZ2UuY3VycmVudGZyYWdtZW50ID0gKF9jID0gb2JqZWN0LmN1cnJlbnRmcmFnbWVudCkgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogMDtcbiAgICAgICAgbWVzc2FnZS50aWNrcmF0ZSA9IChfZCA9IG9iamVjdC50aWNrcmF0ZSkgIT09IG51bGwgJiYgX2QgIT09IHZvaWQgMCA/IF9kIDogMDtcbiAgICAgICAgbWVzc2FnZS50aWNrID0gKF9lID0gb2JqZWN0LnRpY2spICE9PSBudWxsICYmIF9lICE9PSB2b2lkIDAgPyBfZSA6IDA7XG4gICAgICAgIG1lc3NhZ2UucnRkZWxheSA9IChfZiA9IG9iamVjdC5ydGRlbGF5KSAhPT0gbnVsbCAmJiBfZiAhPT0gdm9pZCAwID8gX2YgOiAwO1xuICAgICAgICBtZXNzYWdlLnJjdmFnZSA9IChfZyA9IG9iamVjdC5yY3ZhZ2UpICE9PSBudWxsICYmIF9nICE9PSB2b2lkIDAgPyBfZyA6IDA7XG4gICAgICAgIG1lc3NhZ2Uua2V5ZnJhbWVJbnRlcnZhbCA9IChfaCA9IG9iamVjdC5rZXlmcmFtZUludGVydmFsKSAhPT0gbnVsbCAmJiBfaCAhPT0gdm9pZCAwID8gX2ggOiAwO1xuICAgICAgICBtZXNzYWdlLmNkbmRlbGF5ID0gKF9qID0gb2JqZWN0LmNkbmRlbGF5KSAhPT0gbnVsbCAmJiBfaiAhPT0gdm9pZCAwID8gX2ogOiAwO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG59O1xuLy8gSWYgeW91IGdldCBhIGNvbXBpbGUtZXJyb3IgYWJvdXQgJ0NvbnN0cnVjdG9yPExvbmc+IGFuZCAuLi4gaGF2ZSBubyBvdmVybGFwJyxcbi8vIGFkZCAnLS10c19wcm90b19vcHQ9ZXNNb2R1bGVJbnRlcm9wPXRydWUnIGFzIGEgZmxhZyB3aGVuIGNhbGxpbmcgJ3Byb3RvYycuXG5pZiAobWluaW1hbF8xLnV0aWwuTG9uZyAhPT0gTG9uZykge1xuICAgIG1pbmltYWxfMS51dGlsLkxvbmcgPSBMb25nO1xuICAgICgwLCBtaW5pbWFsXzEuY29uZmlndXJlKSgpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZW5naW5lX2djbWVzc2FnZXMuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLkNTVkNNc2dHZXRDdmFyVmFsdWUgPSBleHBvcnRzLkNTVkNNc2dTcGxpdFNjcmVlbiA9IGV4cG9ydHMuQ1NWQ01zZ0JTUERlY2FsID0gZXhwb3J0cy5DU1ZDTXNnUHJlZmV0Y2ggPSBleHBvcnRzLkNTVkNNc2dDcm9zc2hhaXJBbmdsZSA9IGV4cG9ydHMuQ1NWQ01zZ0ZpeEFuZ2xlID0gZXhwb3J0cy5DU1ZDTXNnVm9pY2VEYXRhID0gZXhwb3J0cy5DU1ZDTXNnVm9pY2VJbml0ID0gZXhwb3J0cy5DU1ZDTXNnVXBkYXRlU3RyaW5nVGFibGUgPSBleHBvcnRzLkNTVkNNc2dDcmVhdGVTdHJpbmdUYWJsZSA9IGV4cG9ydHMuQ1NWQ01zZ1NldFZpZXcgPSBleHBvcnRzLkNTVkNNc2dTZXRQYXVzZSA9IGV4cG9ydHMuQ1NWQ01zZ1ByaW50ID0gZXhwb3J0cy5DU1ZDTXNnU2VuZFRhYmxlX3NlbmRwcm9wVCA9IGV4cG9ydHMuQ1NWQ01zZ1NlbmRUYWJsZSA9IGV4cG9ydHMuQ1NWQ01zZ0NsYXNzSW5mb19jbGFzc1QgPSBleHBvcnRzLkNTVkNNc2dDbGFzc0luZm8gPSBleHBvcnRzLkNTVkNNc2dTZXJ2ZXJJbmZvID0gZXhwb3J0cy5DQ0xDTXNnQ21kS2V5VmFsdWVzID0gZXhwb3J0cy5DQ0xDTXNnU3BsaXRQbGF5ZXJDb25uZWN0ID0gZXhwb3J0cy5DQ0xDTXNnTG9hZGluZ1Byb2dyZXNzID0gZXhwb3J0cy5DQ0xDTXNnRmlsZUNSQ0NoZWNrID0gZXhwb3J0cy5DQ0xDTXNnUmVzcG9uZEN2YXJWYWx1ZSA9IGV4cG9ydHMuQ0NMQ01zZ0xpc3RlbkV2ZW50cyA9IGV4cG9ydHMuQ0NMQ01zZ0Jhc2VsaW5lQWNrID0gZXhwb3J0cy5DQ0xDTXNnVm9pY2VEYXRhID0gZXhwb3J0cy5DQ0xDTXNnTW92ZSA9IGV4cG9ydHMuQ0NMQ01zZ0NsaWVudEluZm8gPSBleHBvcnRzLkNORVRNc2dQbGF5ZXJBdmF0YXJEYXRhID0gZXhwb3J0cy5DTkVUTXNnU3BsaXRTY3JlZW5Vc2VyID0gZXhwb3J0cy5DTkVUTXNnRmlsZSA9IGV4cG9ydHMuQ05FVE1zZ0Rpc2Nvbm5lY3QgPSBleHBvcnRzLkNORVRNc2dOT1AgPSBleHBvcnRzLkNORVRNc2dTZXRDb25WYXIgPSBleHBvcnRzLkNNc2dDVmFyc19DVmFyID0gZXhwb3J0cy5DTXNnQ1ZhcnMgPSBleHBvcnRzLkNORVRNc2dTaWdub25TdGF0ZSA9IGV4cG9ydHMuQ05FVE1zZ1N0cmluZ0NtZCA9IGV4cG9ydHMuQ05FVE1zZ1RpY2sgPSBleHBvcnRzLkNNc2dSR0JBID0gZXhwb3J0cy5DTXNnUUFuZ2xlID0gZXhwb3J0cy5DTXNnVmVjdG9yMkQgPSBleHBvcnRzLkNNc2dWZWN0b3IgPSBleHBvcnRzLlJlcGxheUV2ZW50VHlwZVQgPSBleHBvcnRzLlNWQ01lc3NhZ2VzID0gZXhwb3J0cy5FU3BsaXRTY3JlZW5NZXNzYWdlVHlwZSA9IGV4cG9ydHMuVm9pY2VEYXRhRm9ybWF0VCA9IGV4cG9ydHMuQ0xDTWVzc2FnZXMgPSBleHBvcnRzLk5FVE1lc3NhZ2VzID0gZXhwb3J0cy5wcm90b2J1ZlBhY2thZ2UgPSB2b2lkIDA7XG5leHBvcnRzLkNTVkNNc2dCcm9hZGNhc3RDb21tYW5kID0gZXhwb3J0cy5DQ0xDTXNnSGx0dlJlcGxheSA9IGV4cG9ydHMuQ1NWQ01zZ0hsdHZSZXBsYXkgPSBleHBvcnRzLkNTVkNNc2dFbmNyeXB0ZWREYXRhID0gZXhwb3J0cy5DU1ZDTXNnQ21kS2V5VmFsdWVzID0gZXhwb3J0cy5DU1ZDTXNnRW50aXR5TXNnID0gZXhwb3J0cy5DU1ZDTXNnU291bmRzX3NvdW5kZGF0YVQgPSBleHBvcnRzLkNTVkNNc2dTb3VuZHMgPSBleHBvcnRzLkNTVkNNc2dQYWNrZXRFbnRpdGllcyA9IGV4cG9ydHMuQ1NWQ01zZ1RlbXBFbnRpdGllcyA9IGV4cG9ydHMuQ1NWQ01zZ0dhbWVFdmVudExpc3RfZGVzY3JpcHRvclQgPSBleHBvcnRzLkNTVkNNc2dHYW1lRXZlbnRMaXN0X2tleVQgPSBleHBvcnRzLkNTVkNNc2dHYW1lRXZlbnRMaXN0ID0gZXhwb3J0cy5DU1ZDTXNnR2FtZUV2ZW50X2tleVQgPSBleHBvcnRzLkNTVkNNc2dHYW1lRXZlbnQgPSBleHBvcnRzLkNTVkNNc2dQYWludG1hcERhdGEgPSBleHBvcnRzLkNTVkNNc2dVc2VyTWVzc2FnZSA9IGV4cG9ydHMuQ1NWQ01zZ01lbnUgPSB2b2lkIDA7XG4vKiBlc2xpbnQtZGlzYWJsZSAqL1xuY29uc3QgbWluaW1hbF8xID0gcmVxdWlyZShcInByb3RvYnVmanMvbWluaW1hbFwiKTtcbmNvbnN0IExvbmcgPSByZXF1aXJlKFwibG9uZ1wiKTtcbmV4cG9ydHMucHJvdG9idWZQYWNrYWdlID0gXCJcIjtcbnZhciBORVRNZXNzYWdlcztcbihmdW5jdGlvbiAoTkVUTWVzc2FnZXMpIHtcbiAgICBORVRNZXNzYWdlc1tORVRNZXNzYWdlc1tcIm5ldF9OT1BcIl0gPSAwXSA9IFwibmV0X05PUFwiO1xuICAgIE5FVE1lc3NhZ2VzW05FVE1lc3NhZ2VzW1wibmV0X0Rpc2Nvbm5lY3RcIl0gPSAxXSA9IFwibmV0X0Rpc2Nvbm5lY3RcIjtcbiAgICBORVRNZXNzYWdlc1tORVRNZXNzYWdlc1tcIm5ldF9GaWxlXCJdID0gMl0gPSBcIm5ldF9GaWxlXCI7XG4gICAgTkVUTWVzc2FnZXNbTkVUTWVzc2FnZXNbXCJuZXRfU3BsaXRTY3JlZW5Vc2VyXCJdID0gM10gPSBcIm5ldF9TcGxpdFNjcmVlblVzZXJcIjtcbiAgICBORVRNZXNzYWdlc1tORVRNZXNzYWdlc1tcIm5ldF9UaWNrXCJdID0gNF0gPSBcIm5ldF9UaWNrXCI7XG4gICAgTkVUTWVzc2FnZXNbTkVUTWVzc2FnZXNbXCJuZXRfU3RyaW5nQ21kXCJdID0gNV0gPSBcIm5ldF9TdHJpbmdDbWRcIjtcbiAgICBORVRNZXNzYWdlc1tORVRNZXNzYWdlc1tcIm5ldF9TZXRDb25WYXJcIl0gPSA2XSA9IFwibmV0X1NldENvblZhclwiO1xuICAgIE5FVE1lc3NhZ2VzW05FVE1lc3NhZ2VzW1wibmV0X1NpZ25vblN0YXRlXCJdID0gN10gPSBcIm5ldF9TaWdub25TdGF0ZVwiO1xuICAgIE5FVE1lc3NhZ2VzW05FVE1lc3NhZ2VzW1wibmV0X1BsYXllckF2YXRhckRhdGFcIl0gPSAxMDBdID0gXCJuZXRfUGxheWVyQXZhdGFyRGF0YVwiO1xufSkoTkVUTWVzc2FnZXMgPSBleHBvcnRzLk5FVE1lc3NhZ2VzIHx8IChleHBvcnRzLk5FVE1lc3NhZ2VzID0ge30pKTtcbnZhciBDTENNZXNzYWdlcztcbihmdW5jdGlvbiAoQ0xDTWVzc2FnZXMpIHtcbiAgICBDTENNZXNzYWdlc1tDTENNZXNzYWdlc1tcImNsY19DbGllbnRJbmZvXCJdID0gOF0gPSBcImNsY19DbGllbnRJbmZvXCI7XG4gICAgQ0xDTWVzc2FnZXNbQ0xDTWVzc2FnZXNbXCJjbGNfTW92ZVwiXSA9IDldID0gXCJjbGNfTW92ZVwiO1xuICAgIENMQ01lc3NhZ2VzW0NMQ01lc3NhZ2VzW1wiY2xjX1ZvaWNlRGF0YVwiXSA9IDEwXSA9IFwiY2xjX1ZvaWNlRGF0YVwiO1xuICAgIENMQ01lc3NhZ2VzW0NMQ01lc3NhZ2VzW1wiY2xjX0Jhc2VsaW5lQWNrXCJdID0gMTFdID0gXCJjbGNfQmFzZWxpbmVBY2tcIjtcbiAgICBDTENNZXNzYWdlc1tDTENNZXNzYWdlc1tcImNsY19MaXN0ZW5FdmVudHNcIl0gPSAxMl0gPSBcImNsY19MaXN0ZW5FdmVudHNcIjtcbiAgICBDTENNZXNzYWdlc1tDTENNZXNzYWdlc1tcImNsY19SZXNwb25kQ3ZhclZhbHVlXCJdID0gMTNdID0gXCJjbGNfUmVzcG9uZEN2YXJWYWx1ZVwiO1xuICAgIENMQ01lc3NhZ2VzW0NMQ01lc3NhZ2VzW1wiY2xjX0ZpbGVDUkNDaGVja1wiXSA9IDE0XSA9IFwiY2xjX0ZpbGVDUkNDaGVja1wiO1xuICAgIENMQ01lc3NhZ2VzW0NMQ01lc3NhZ2VzW1wiY2xjX0xvYWRpbmdQcm9ncmVzc1wiXSA9IDE1XSA9IFwiY2xjX0xvYWRpbmdQcm9ncmVzc1wiO1xuICAgIENMQ01lc3NhZ2VzW0NMQ01lc3NhZ2VzW1wiY2xjX1NwbGl0UGxheWVyQ29ubmVjdFwiXSA9IDE2XSA9IFwiY2xjX1NwbGl0UGxheWVyQ29ubmVjdFwiO1xuICAgIENMQ01lc3NhZ2VzW0NMQ01lc3NhZ2VzW1wiY2xjX0NsaWVudE1lc3NhZ2VcIl0gPSAxN10gPSBcImNsY19DbGllbnRNZXNzYWdlXCI7XG4gICAgQ0xDTWVzc2FnZXNbQ0xDTWVzc2FnZXNbXCJjbGNfQ21kS2V5VmFsdWVzXCJdID0gMThdID0gXCJjbGNfQ21kS2V5VmFsdWVzXCI7XG4gICAgQ0xDTWVzc2FnZXNbQ0xDTWVzc2FnZXNbXCJjbGNfSGx0dlJlcGxheVwiXSA9IDIwXSA9IFwiY2xjX0hsdHZSZXBsYXlcIjtcbn0pKENMQ01lc3NhZ2VzID0gZXhwb3J0cy5DTENNZXNzYWdlcyB8fCAoZXhwb3J0cy5DTENNZXNzYWdlcyA9IHt9KSk7XG52YXIgVm9pY2VEYXRhRm9ybWF0VDtcbihmdW5jdGlvbiAoVm9pY2VEYXRhRm9ybWF0VCkge1xuICAgIFZvaWNlRGF0YUZvcm1hdFRbVm9pY2VEYXRhRm9ybWF0VFtcIlZPSUNFREFUQV9GT1JNQVRfU1RFQU1cIl0gPSAwXSA9IFwiVk9JQ0VEQVRBX0ZPUk1BVF9TVEVBTVwiO1xuICAgIFZvaWNlRGF0YUZvcm1hdFRbVm9pY2VEYXRhRm9ybWF0VFtcIlZPSUNFREFUQV9GT1JNQVRfRU5HSU5FXCJdID0gMV0gPSBcIlZPSUNFREFUQV9GT1JNQVRfRU5HSU5FXCI7XG59KShWb2ljZURhdGFGb3JtYXRUID0gZXhwb3J0cy5Wb2ljZURhdGFGb3JtYXRUIHx8IChleHBvcnRzLlZvaWNlRGF0YUZvcm1hdFQgPSB7fSkpO1xudmFyIEVTcGxpdFNjcmVlbk1lc3NhZ2VUeXBlO1xuKGZ1bmN0aW9uIChFU3BsaXRTY3JlZW5NZXNzYWdlVHlwZSkge1xuICAgIEVTcGxpdFNjcmVlbk1lc3NhZ2VUeXBlW0VTcGxpdFNjcmVlbk1lc3NhZ2VUeXBlW1wiTVNHX1NQTElUU0NSRUVOX0FERFVTRVJcIl0gPSAwXSA9IFwiTVNHX1NQTElUU0NSRUVOX0FERFVTRVJcIjtcbiAgICBFU3BsaXRTY3JlZW5NZXNzYWdlVHlwZVtFU3BsaXRTY3JlZW5NZXNzYWdlVHlwZVtcIk1TR19TUExJVFNDUkVFTl9SRU1PVkVVU0VSXCJdID0gMV0gPSBcIk1TR19TUExJVFNDUkVFTl9SRU1PVkVVU0VSXCI7XG4gICAgRVNwbGl0U2NyZWVuTWVzc2FnZVR5cGVbRVNwbGl0U2NyZWVuTWVzc2FnZVR5cGVbXCJNU0dfU1BMSVRTQ1JFRU5fVFlQRV9CSVRTXCJdID0gMV0gPSBcIk1TR19TUExJVFNDUkVFTl9UWVBFX0JJVFNcIjtcbn0pKEVTcGxpdFNjcmVlbk1lc3NhZ2VUeXBlID0gZXhwb3J0cy5FU3BsaXRTY3JlZW5NZXNzYWdlVHlwZSB8fCAoZXhwb3J0cy5FU3BsaXRTY3JlZW5NZXNzYWdlVHlwZSA9IHt9KSk7XG52YXIgU1ZDTWVzc2FnZXM7XG4oZnVuY3Rpb24gKFNWQ01lc3NhZ2VzKSB7XG4gICAgU1ZDTWVzc2FnZXNbU1ZDTWVzc2FnZXNbXCJzdmNfU2VydmVySW5mb1wiXSA9IDhdID0gXCJzdmNfU2VydmVySW5mb1wiO1xuICAgIFNWQ01lc3NhZ2VzW1NWQ01lc3NhZ2VzW1wic3ZjX1NlbmRUYWJsZVwiXSA9IDldID0gXCJzdmNfU2VuZFRhYmxlXCI7XG4gICAgU1ZDTWVzc2FnZXNbU1ZDTWVzc2FnZXNbXCJzdmNfQ2xhc3NJbmZvXCJdID0gMTBdID0gXCJzdmNfQ2xhc3NJbmZvXCI7XG4gICAgU1ZDTWVzc2FnZXNbU1ZDTWVzc2FnZXNbXCJzdmNfU2V0UGF1c2VcIl0gPSAxMV0gPSBcInN2Y19TZXRQYXVzZVwiO1xuICAgIFNWQ01lc3NhZ2VzW1NWQ01lc3NhZ2VzW1wic3ZjX0NyZWF0ZVN0cmluZ1RhYmxlXCJdID0gMTJdID0gXCJzdmNfQ3JlYXRlU3RyaW5nVGFibGVcIjtcbiAgICBTVkNNZXNzYWdlc1tTVkNNZXNzYWdlc1tcInN2Y19VcGRhdGVTdHJpbmdUYWJsZVwiXSA9IDEzXSA9IFwic3ZjX1VwZGF0ZVN0cmluZ1RhYmxlXCI7XG4gICAgU1ZDTWVzc2FnZXNbU1ZDTWVzc2FnZXNbXCJzdmNfVm9pY2VJbml0XCJdID0gMTRdID0gXCJzdmNfVm9pY2VJbml0XCI7XG4gICAgU1ZDTWVzc2FnZXNbU1ZDTWVzc2FnZXNbXCJzdmNfVm9pY2VEYXRhXCJdID0gMTVdID0gXCJzdmNfVm9pY2VEYXRhXCI7XG4gICAgU1ZDTWVzc2FnZXNbU1ZDTWVzc2FnZXNbXCJzdmNfUHJpbnRcIl0gPSAxNl0gPSBcInN2Y19QcmludFwiO1xuICAgIFNWQ01lc3NhZ2VzW1NWQ01lc3NhZ2VzW1wic3ZjX1NvdW5kc1wiXSA9IDE3XSA9IFwic3ZjX1NvdW5kc1wiO1xuICAgIFNWQ01lc3NhZ2VzW1NWQ01lc3NhZ2VzW1wic3ZjX1NldFZpZXdcIl0gPSAxOF0gPSBcInN2Y19TZXRWaWV3XCI7XG4gICAgU1ZDTWVzc2FnZXNbU1ZDTWVzc2FnZXNbXCJzdmNfRml4QW5nbGVcIl0gPSAxOV0gPSBcInN2Y19GaXhBbmdsZVwiO1xuICAgIFNWQ01lc3NhZ2VzW1NWQ01lc3NhZ2VzW1wic3ZjX0Nyb3NzaGFpckFuZ2xlXCJdID0gMjBdID0gXCJzdmNfQ3Jvc3NoYWlyQW5nbGVcIjtcbiAgICBTVkNNZXNzYWdlc1tTVkNNZXNzYWdlc1tcInN2Y19CU1BEZWNhbFwiXSA9IDIxXSA9IFwic3ZjX0JTUERlY2FsXCI7XG4gICAgU1ZDTWVzc2FnZXNbU1ZDTWVzc2FnZXNbXCJzdmNfU3BsaXRTY3JlZW5cIl0gPSAyMl0gPSBcInN2Y19TcGxpdFNjcmVlblwiO1xuICAgIFNWQ01lc3NhZ2VzW1NWQ01lc3NhZ2VzW1wic3ZjX1VzZXJNZXNzYWdlXCJdID0gMjNdID0gXCJzdmNfVXNlck1lc3NhZ2VcIjtcbiAgICBTVkNNZXNzYWdlc1tTVkNNZXNzYWdlc1tcInN2Y19FbnRpdHlNZXNzYWdlXCJdID0gMjRdID0gXCJzdmNfRW50aXR5TWVzc2FnZVwiO1xuICAgIFNWQ01lc3NhZ2VzW1NWQ01lc3NhZ2VzW1wic3ZjX0dhbWVFdmVudFwiXSA9IDI1XSA9IFwic3ZjX0dhbWVFdmVudFwiO1xuICAgIFNWQ01lc3NhZ2VzW1NWQ01lc3NhZ2VzW1wic3ZjX1BhY2tldEVudGl0aWVzXCJdID0gMjZdID0gXCJzdmNfUGFja2V0RW50aXRpZXNcIjtcbiAgICBTVkNNZXNzYWdlc1tTVkNNZXNzYWdlc1tcInN2Y19UZW1wRW50aXRpZXNcIl0gPSAyN10gPSBcInN2Y19UZW1wRW50aXRpZXNcIjtcbiAgICBTVkNNZXNzYWdlc1tTVkNNZXNzYWdlc1tcInN2Y19QcmVmZXRjaFwiXSA9IDI4XSA9IFwic3ZjX1ByZWZldGNoXCI7XG4gICAgU1ZDTWVzc2FnZXNbU1ZDTWVzc2FnZXNbXCJzdmNfTWVudVwiXSA9IDI5XSA9IFwic3ZjX01lbnVcIjtcbiAgICBTVkNNZXNzYWdlc1tTVkNNZXNzYWdlc1tcInN2Y19HYW1lRXZlbnRMaXN0XCJdID0gMzBdID0gXCJzdmNfR2FtZUV2ZW50TGlzdFwiO1xuICAgIFNWQ01lc3NhZ2VzW1NWQ01lc3NhZ2VzW1wic3ZjX0dldEN2YXJWYWx1ZVwiXSA9IDMxXSA9IFwic3ZjX0dldEN2YXJWYWx1ZVwiO1xuICAgIFNWQ01lc3NhZ2VzW1NWQ01lc3NhZ2VzW1wic3ZjX1BhaW50bWFwRGF0YVwiXSA9IDMzXSA9IFwic3ZjX1BhaW50bWFwRGF0YVwiO1xuICAgIFNWQ01lc3NhZ2VzW1NWQ01lc3NhZ2VzW1wic3ZjX0NtZEtleVZhbHVlc1wiXSA9IDM0XSA9IFwic3ZjX0NtZEtleVZhbHVlc1wiO1xuICAgIFNWQ01lc3NhZ2VzW1NWQ01lc3NhZ2VzW1wic3ZjX0VuY3J5cHRlZERhdGFcIl0gPSAzNV0gPSBcInN2Y19FbmNyeXB0ZWREYXRhXCI7XG4gICAgU1ZDTWVzc2FnZXNbU1ZDTWVzc2FnZXNbXCJzdmNfSGx0dlJlcGxheVwiXSA9IDM2XSA9IFwic3ZjX0hsdHZSZXBsYXlcIjtcbiAgICBTVkNNZXNzYWdlc1tTVkNNZXNzYWdlc1tcInN2Y19Ccm9hZGNhc3RfQ29tbWFuZFwiXSA9IDM4XSA9IFwic3ZjX0Jyb2FkY2FzdF9Db21tYW5kXCI7XG59KShTVkNNZXNzYWdlcyA9IGV4cG9ydHMuU1ZDTWVzc2FnZXMgfHwgKGV4cG9ydHMuU1ZDTWVzc2FnZXMgPSB7fSkpO1xudmFyIFJlcGxheUV2ZW50VHlwZVQ7XG4oZnVuY3Rpb24gKFJlcGxheUV2ZW50VHlwZVQpIHtcbiAgICBSZXBsYXlFdmVudFR5cGVUW1JlcGxheUV2ZW50VHlwZVRbXCJSRVBMQVlfRVZFTlRfQ0FOQ0VMXCJdID0gMF0gPSBcIlJFUExBWV9FVkVOVF9DQU5DRUxcIjtcbiAgICBSZXBsYXlFdmVudFR5cGVUW1JlcGxheUV2ZW50VHlwZVRbXCJSRVBMQVlfRVZFTlRfREVBVEhcIl0gPSAxXSA9IFwiUkVQTEFZX0VWRU5UX0RFQVRIXCI7XG4gICAgUmVwbGF5RXZlbnRUeXBlVFtSZXBsYXlFdmVudFR5cGVUW1wiUkVQTEFZX0VWRU5UX0dFTkVSSUNcIl0gPSAyXSA9IFwiUkVQTEFZX0VWRU5UX0dFTkVSSUNcIjtcbiAgICBSZXBsYXlFdmVudFR5cGVUW1JlcGxheUV2ZW50VHlwZVRbXCJSRVBMQVlfRVZFTlRfU1RVQ0tfTkVFRF9GVUxMX1VQREFURVwiXSA9IDNdID0gXCJSRVBMQVlfRVZFTlRfU1RVQ0tfTkVFRF9GVUxMX1VQREFURVwiO1xufSkoUmVwbGF5RXZlbnRUeXBlVCA9IGV4cG9ydHMuUmVwbGF5RXZlbnRUeXBlVCB8fCAoZXhwb3J0cy5SZXBsYXlFdmVudFR5cGVUID0ge30pKTtcbmZ1bmN0aW9uIGNyZWF0ZUJhc2VDTXNnVmVjdG9yKCkge1xuICAgIHJldHVybiB7IHg6IDAsIHk6IDAsIHo6IDAgfTtcbn1cbmV4cG9ydHMuQ01zZ1ZlY3RvciA9IHtcbiAgICBlbmNvZGUobWVzc2FnZSwgd3JpdGVyID0gbWluaW1hbF8xLldyaXRlci5jcmVhdGUoKSkge1xuICAgICAgICBpZiAobWVzc2FnZS54ICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDEzKS5mbG9hdChtZXNzYWdlLngpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLnkgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMjEpLmZsb2F0KG1lc3NhZ2UueSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UueiAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigyOSkuZmxvYXQobWVzc2FnZS56KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH0sXG4gICAgZGVjb2RlKGlucHV0LCBsZW5ndGgpIHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gaW5wdXQgaW5zdGFuY2VvZiBtaW5pbWFsXzEuUmVhZGVyID8gaW5wdXQgOiBuZXcgbWluaW1hbF8xLlJlYWRlcihpbnB1dCk7XG4gICAgICAgIGxldCBlbmQgPSBsZW5ndGggPT09IHVuZGVmaW5lZCA/IHJlYWRlci5sZW4gOiByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNNc2dWZWN0b3IoKTtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhZyA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgIHN3aXRjaCAodGFnID4+PiAzKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnggPSByZWFkZXIuZmxvYXQoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnkgPSByZWFkZXIuZmxvYXQoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnogPSByZWFkZXIuZmxvYXQoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmVhZGVyLnNraXBUeXBlKHRhZyAmIDcpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9LFxuICAgIGZyb21QYXJ0aWFsKG9iamVjdCkge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYztcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDTXNnVmVjdG9yKCk7XG4gICAgICAgIG1lc3NhZ2UueCA9IChfYSA9IG9iamVjdC54KSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAwO1xuICAgICAgICBtZXNzYWdlLnkgPSAoX2IgPSBvYmplY3QueSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogMDtcbiAgICAgICAgbWVzc2FnZS56ID0gKF9jID0gb2JqZWN0LnopICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IDA7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbn07XG5mdW5jdGlvbiBjcmVhdGVCYXNlQ01zZ1ZlY3RvcjJEKCkge1xuICAgIHJldHVybiB7IHg6IDAsIHk6IDAgfTtcbn1cbmV4cG9ydHMuQ01zZ1ZlY3RvcjJEID0ge1xuICAgIGVuY29kZShtZXNzYWdlLCB3cml0ZXIgPSBtaW5pbWFsXzEuV3JpdGVyLmNyZWF0ZSgpKSB7XG4gICAgICAgIGlmIChtZXNzYWdlLnggIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMTMpLmZsb2F0KG1lc3NhZ2UueCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UueSAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigyMSkuZmxvYXQobWVzc2FnZS55KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH0sXG4gICAgZGVjb2RlKGlucHV0LCBsZW5ndGgpIHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gaW5wdXQgaW5zdGFuY2VvZiBtaW5pbWFsXzEuUmVhZGVyID8gaW5wdXQgOiBuZXcgbWluaW1hbF8xLlJlYWRlcihpbnB1dCk7XG4gICAgICAgIGxldCBlbmQgPSBsZW5ndGggPT09IHVuZGVmaW5lZCA/IHJlYWRlci5sZW4gOiByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNNc2dWZWN0b3IyRCgpO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UueCA9IHJlYWRlci5mbG9hdCgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UueSA9IHJlYWRlci5mbG9hdCgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICByZWFkZXIuc2tpcFR5cGUodGFnICYgNyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH0sXG4gICAgZnJvbVBhcnRpYWwob2JqZWN0KSB7XG4gICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ01zZ1ZlY3RvcjJEKCk7XG4gICAgICAgIG1lc3NhZ2UueCA9IChfYSA9IG9iamVjdC54KSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAwO1xuICAgICAgICBtZXNzYWdlLnkgPSAoX2IgPSBvYmplY3QueSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogMDtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxufTtcbmZ1bmN0aW9uIGNyZWF0ZUJhc2VDTXNnUUFuZ2xlKCkge1xuICAgIHJldHVybiB7IHg6IDAsIHk6IDAsIHo6IDAgfTtcbn1cbmV4cG9ydHMuQ01zZ1FBbmdsZSA9IHtcbiAgICBlbmNvZGUobWVzc2FnZSwgd3JpdGVyID0gbWluaW1hbF8xLldyaXRlci5jcmVhdGUoKSkge1xuICAgICAgICBpZiAobWVzc2FnZS54ICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDEzKS5mbG9hdChtZXNzYWdlLngpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLnkgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMjEpLmZsb2F0KG1lc3NhZ2UueSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UueiAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigyOSkuZmxvYXQobWVzc2FnZS56KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH0sXG4gICAgZGVjb2RlKGlucHV0LCBsZW5ndGgpIHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gaW5wdXQgaW5zdGFuY2VvZiBtaW5pbWFsXzEuUmVhZGVyID8gaW5wdXQgOiBuZXcgbWluaW1hbF8xLlJlYWRlcihpbnB1dCk7XG4gICAgICAgIGxldCBlbmQgPSBsZW5ndGggPT09IHVuZGVmaW5lZCA/IHJlYWRlci5sZW4gOiByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNNc2dRQW5nbGUoKTtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhZyA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgIHN3aXRjaCAodGFnID4+PiAzKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnggPSByZWFkZXIuZmxvYXQoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnkgPSByZWFkZXIuZmxvYXQoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnogPSByZWFkZXIuZmxvYXQoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmVhZGVyLnNraXBUeXBlKHRhZyAmIDcpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9LFxuICAgIGZyb21QYXJ0aWFsKG9iamVjdCkge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYztcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDTXNnUUFuZ2xlKCk7XG4gICAgICAgIG1lc3NhZ2UueCA9IChfYSA9IG9iamVjdC54KSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAwO1xuICAgICAgICBtZXNzYWdlLnkgPSAoX2IgPSBvYmplY3QueSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogMDtcbiAgICAgICAgbWVzc2FnZS56ID0gKF9jID0gb2JqZWN0LnopICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IDA7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbn07XG5mdW5jdGlvbiBjcmVhdGVCYXNlQ01zZ1JHQkEoKSB7XG4gICAgcmV0dXJuIHsgcjogMCwgZzogMCwgYjogMCwgYTogMCB9O1xufVxuZXhwb3J0cy5DTXNnUkdCQSA9IHtcbiAgICBlbmNvZGUobWVzc2FnZSwgd3JpdGVyID0gbWluaW1hbF8xLldyaXRlci5jcmVhdGUoKSkge1xuICAgICAgICBpZiAobWVzc2FnZS5yICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDgpLmludDMyKG1lc3NhZ2Uucik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UuZyAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigxNikuaW50MzIobWVzc2FnZS5nKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5iICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDI0KS5pbnQzMihtZXNzYWdlLmIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLmEgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMzIpLmludDMyKG1lc3NhZ2UuYSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9LFxuICAgIGRlY29kZShpbnB1dCwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IGlucHV0IGluc3RhbmNlb2YgbWluaW1hbF8xLlJlYWRlciA/IGlucHV0IDogbmV3IG1pbmltYWxfMS5SZWFkZXIoaW5wdXQpO1xuICAgICAgICBsZXQgZW5kID0gbGVuZ3RoID09PSB1bmRlZmluZWQgPyByZWFkZXIubGVuIDogcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDTXNnUkdCQSgpO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuciA9IHJlYWRlci5pbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZyA9IHJlYWRlci5pbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuYiA9IHJlYWRlci5pbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuYSA9IHJlYWRlci5pbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICByZWFkZXIuc2tpcFR5cGUodGFnICYgNyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH0sXG4gICAgZnJvbVBhcnRpYWwob2JqZWN0KSB7XG4gICAgICAgIHZhciBfYSwgX2IsIF9jLCBfZDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDTXNnUkdCQSgpO1xuICAgICAgICBtZXNzYWdlLnIgPSAoX2EgPSBvYmplY3QucikgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMDtcbiAgICAgICAgbWVzc2FnZS5nID0gKF9iID0gb2JqZWN0LmcpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IDA7XG4gICAgICAgIG1lc3NhZ2UuYiA9IChfYyA9IG9iamVjdC5iKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiAwO1xuICAgICAgICBtZXNzYWdlLmEgPSAoX2QgPSBvYmplY3QuYSkgIT09IG51bGwgJiYgX2QgIT09IHZvaWQgMCA/IF9kIDogMDtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxufTtcbmZ1bmN0aW9uIGNyZWF0ZUJhc2VDTkVUTXNnVGljaygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICB0aWNrOiAwLFxuICAgICAgICBob3N0Q29tcHV0YXRpb250aW1lOiAwLFxuICAgICAgICBob3N0Q29tcHV0YXRpb250aW1lU3RkRGV2aWF0aW9uOiAwLFxuICAgICAgICBob3N0RnJhbWVzdGFydHRpbWVTdGREZXZpYXRpb246IDAsXG4gICAgICAgIGhsdHZSZXBsYXlGbGFnczogMFxuICAgIH07XG59XG5leHBvcnRzLkNORVRNc2dUaWNrID0ge1xuICAgIGVuY29kZShtZXNzYWdlLCB3cml0ZXIgPSBtaW5pbWFsXzEuV3JpdGVyLmNyZWF0ZSgpKSB7XG4gICAgICAgIGlmIChtZXNzYWdlLnRpY2sgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoOCkudWludDMyKG1lc3NhZ2UudGljayk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UuaG9zdENvbXB1dGF0aW9udGltZSAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigzMikudWludDMyKG1lc3NhZ2UuaG9zdENvbXB1dGF0aW9udGltZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UuaG9zdENvbXB1dGF0aW9udGltZVN0ZERldmlhdGlvbiAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig0MCkudWludDMyKG1lc3NhZ2UuaG9zdENvbXB1dGF0aW9udGltZVN0ZERldmlhdGlvbik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UuaG9zdEZyYW1lc3RhcnR0aW1lU3RkRGV2aWF0aW9uICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDQ4KS51aW50MzIobWVzc2FnZS5ob3N0RnJhbWVzdGFydHRpbWVTdGREZXZpYXRpb24pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLmhsdHZSZXBsYXlGbGFncyAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig1NikudWludDMyKG1lc3NhZ2UuaGx0dlJlcGxheUZsYWdzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH0sXG4gICAgZGVjb2RlKGlucHV0LCBsZW5ndGgpIHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gaW5wdXQgaW5zdGFuY2VvZiBtaW5pbWFsXzEuUmVhZGVyID8gaW5wdXQgOiBuZXcgbWluaW1hbF8xLlJlYWRlcihpbnB1dCk7XG4gICAgICAgIGxldCBlbmQgPSBsZW5ndGggPT09IHVuZGVmaW5lZCA/IHJlYWRlci5sZW4gOiByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNORVRNc2dUaWNrKCk7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBjb25zdCB0YWcgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKHRhZyA+Pj4gMykge1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS50aWNrID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuaG9zdENvbXB1dGF0aW9udGltZSA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmhvc3RDb21wdXRhdGlvbnRpbWVTdGREZXZpYXRpb24gPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5ob3N0RnJhbWVzdGFydHRpbWVTdGREZXZpYXRpb24gPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNzpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5obHR2UmVwbGF5RmxhZ3MgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJlYWRlci5za2lwVHlwZSh0YWcgJiA3KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfSxcbiAgICBmcm9tUGFydGlhbChvYmplY3QpIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2MsIF9kLCBfZTtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDTkVUTXNnVGljaygpO1xuICAgICAgICBtZXNzYWdlLnRpY2sgPSAoX2EgPSBvYmplY3QudGljaykgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMDtcbiAgICAgICAgbWVzc2FnZS5ob3N0Q29tcHV0YXRpb250aW1lID0gKF9iID0gb2JqZWN0Lmhvc3RDb21wdXRhdGlvbnRpbWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IDA7XG4gICAgICAgIG1lc3NhZ2UuaG9zdENvbXB1dGF0aW9udGltZVN0ZERldmlhdGlvbiA9XG4gICAgICAgICAgICAoX2MgPSBvYmplY3QuaG9zdENvbXB1dGF0aW9udGltZVN0ZERldmlhdGlvbikgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogMDtcbiAgICAgICAgbWVzc2FnZS5ob3N0RnJhbWVzdGFydHRpbWVTdGREZXZpYXRpb24gPVxuICAgICAgICAgICAgKF9kID0gb2JqZWN0Lmhvc3RGcmFtZXN0YXJ0dGltZVN0ZERldmlhdGlvbikgIT09IG51bGwgJiYgX2QgIT09IHZvaWQgMCA/IF9kIDogMDtcbiAgICAgICAgbWVzc2FnZS5obHR2UmVwbGF5RmxhZ3MgPSAoX2UgPSBvYmplY3QuaGx0dlJlcGxheUZsYWdzKSAhPT0gbnVsbCAmJiBfZSAhPT0gdm9pZCAwID8gX2UgOiAwO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG59O1xuZnVuY3Rpb24gY3JlYXRlQmFzZUNORVRNc2dTdHJpbmdDbWQoKSB7XG4gICAgcmV0dXJuIHsgY29tbWFuZDogXCJcIiB9O1xufVxuZXhwb3J0cy5DTkVUTXNnU3RyaW5nQ21kID0ge1xuICAgIGVuY29kZShtZXNzYWdlLCB3cml0ZXIgPSBtaW5pbWFsXzEuV3JpdGVyLmNyZWF0ZSgpKSB7XG4gICAgICAgIGlmIChtZXNzYWdlLmNvbW1hbmQgIT09IFwiXCIpIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMTApLnN0cmluZyhtZXNzYWdlLmNvbW1hbmQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfSxcbiAgICBkZWNvZGUoaW5wdXQsIGxlbmd0aCkge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBpbnB1dCBpbnN0YW5jZW9mIG1pbmltYWxfMS5SZWFkZXIgPyBpbnB1dCA6IG5ldyBtaW5pbWFsXzEuUmVhZGVyKGlucHV0KTtcbiAgICAgICAgbGV0IGVuZCA9IGxlbmd0aCA9PT0gdW5kZWZpbmVkID8gcmVhZGVyLmxlbiA6IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ05FVE1zZ1N0cmluZ0NtZCgpO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuY29tbWFuZCA9IHJlYWRlci5zdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmVhZGVyLnNraXBUeXBlKHRhZyAmIDcpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9LFxuICAgIGZyb21QYXJ0aWFsKG9iamVjdCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ05FVE1zZ1N0cmluZ0NtZCgpO1xuICAgICAgICBtZXNzYWdlLmNvbW1hbmQgPSAoX2EgPSBvYmplY3QuY29tbWFuZCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogXCJcIjtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxufTtcbmZ1bmN0aW9uIGNyZWF0ZUJhc2VDTkVUTXNnU2lnbm9uU3RhdGUoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgc2lnbm9uU3RhdGU6IDAsXG4gICAgICAgIHNwYXduQ291bnQ6IDAsXG4gICAgICAgIG51bVNlcnZlclBsYXllcnM6IDAsXG4gICAgICAgIHBsYXllcnNOZXR3b3JraWRzOiBbXSxcbiAgICAgICAgbWFwTmFtZTogXCJcIlxuICAgIH07XG59XG5leHBvcnRzLkNORVRNc2dTaWdub25TdGF0ZSA9IHtcbiAgICBlbmNvZGUobWVzc2FnZSwgd3JpdGVyID0gbWluaW1hbF8xLldyaXRlci5jcmVhdGUoKSkge1xuICAgICAgICBpZiAobWVzc2FnZS5zaWdub25TdGF0ZSAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig4KS51aW50MzIobWVzc2FnZS5zaWdub25TdGF0ZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2Uuc3Bhd25Db3VudCAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigxNikudWludDMyKG1lc3NhZ2Uuc3Bhd25Db3VudCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UubnVtU2VydmVyUGxheWVycyAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigyNCkudWludDMyKG1lc3NhZ2UubnVtU2VydmVyUGxheWVycyk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCB2IG9mIG1lc3NhZ2UucGxheWVyc05ldHdvcmtpZHMpIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMzQpLnN0cmluZyh2KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5tYXBOYW1lICE9PSBcIlwiKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDQyKS5zdHJpbmcobWVzc2FnZS5tYXBOYW1lKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH0sXG4gICAgZGVjb2RlKGlucHV0LCBsZW5ndGgpIHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gaW5wdXQgaW5zdGFuY2VvZiBtaW5pbWFsXzEuUmVhZGVyID8gaW5wdXQgOiBuZXcgbWluaW1hbF8xLlJlYWRlcihpbnB1dCk7XG4gICAgICAgIGxldCBlbmQgPSBsZW5ndGggPT09IHVuZGVmaW5lZCA/IHJlYWRlci5sZW4gOiByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNORVRNc2dTaWdub25TdGF0ZSgpO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Uuc2lnbm9uU3RhdGUgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5zcGF3bkNvdW50ID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UubnVtU2VydmVyUGxheWVycyA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnBsYXllcnNOZXR3b3JraWRzLnB1c2gocmVhZGVyLnN0cmluZygpKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLm1hcE5hbWUgPSByZWFkZXIuc3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJlYWRlci5za2lwVHlwZSh0YWcgJiA3KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfSxcbiAgICBmcm9tUGFydGlhbChvYmplY3QpIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2MsIF9kLCBfZTtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDTkVUTXNnU2lnbm9uU3RhdGUoKTtcbiAgICAgICAgbWVzc2FnZS5zaWdub25TdGF0ZSA9IChfYSA9IG9iamVjdC5zaWdub25TdGF0ZSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMDtcbiAgICAgICAgbWVzc2FnZS5zcGF3bkNvdW50ID0gKF9iID0gb2JqZWN0LnNwYXduQ291bnQpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IDA7XG4gICAgICAgIG1lc3NhZ2UubnVtU2VydmVyUGxheWVycyA9IChfYyA9IG9iamVjdC5udW1TZXJ2ZXJQbGF5ZXJzKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiAwO1xuICAgICAgICBtZXNzYWdlLnBsYXllcnNOZXR3b3JraWRzID0gKChfZCA9IG9iamVjdC5wbGF5ZXJzTmV0d29ya2lkcykgPT09IG51bGwgfHwgX2QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9kLm1hcChlID0+IGUpKSB8fCBbXTtcbiAgICAgICAgbWVzc2FnZS5tYXBOYW1lID0gKF9lID0gb2JqZWN0Lm1hcE5hbWUpICE9PSBudWxsICYmIF9lICE9PSB2b2lkIDAgPyBfZSA6IFwiXCI7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbn07XG5mdW5jdGlvbiBjcmVhdGVCYXNlQ01zZ0NWYXJzKCkge1xuICAgIHJldHVybiB7IGN2YXJzOiBbXSB9O1xufVxuZXhwb3J0cy5DTXNnQ1ZhcnMgPSB7XG4gICAgZW5jb2RlKG1lc3NhZ2UsIHdyaXRlciA9IG1pbmltYWxfMS5Xcml0ZXIuY3JlYXRlKCkpIHtcbiAgICAgICAgZm9yIChjb25zdCB2IG9mIG1lc3NhZ2UuY3ZhcnMpIHtcbiAgICAgICAgICAgIGV4cG9ydHMuQ01zZ0NWYXJzX0NWYXIuZW5jb2RlKHYsIHdyaXRlci51aW50MzIoMTApLmZvcmsoKSkubGRlbGltKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9LFxuICAgIGRlY29kZShpbnB1dCwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IGlucHV0IGluc3RhbmNlb2YgbWluaW1hbF8xLlJlYWRlciA/IGlucHV0IDogbmV3IG1pbmltYWxfMS5SZWFkZXIoaW5wdXQpO1xuICAgICAgICBsZXQgZW5kID0gbGVuZ3RoID09PSB1bmRlZmluZWQgPyByZWFkZXIubGVuIDogcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDTXNnQ1ZhcnMoKTtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhZyA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgIHN3aXRjaCAodGFnID4+PiAzKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmN2YXJzLnB1c2goZXhwb3J0cy5DTXNnQ1ZhcnNfQ1Zhci5kZWNvZGUocmVhZGVyLCByZWFkZXIudWludDMyKCkpKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmVhZGVyLnNraXBUeXBlKHRhZyAmIDcpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9LFxuICAgIGZyb21QYXJ0aWFsKG9iamVjdCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ01zZ0NWYXJzKCk7XG4gICAgICAgIG1lc3NhZ2UuY3ZhcnMgPSAoKF9hID0gb2JqZWN0LmN2YXJzKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EubWFwKGUgPT4gZXhwb3J0cy5DTXNnQ1ZhcnNfQ1Zhci5mcm9tUGFydGlhbChlKSkpIHx8IFtdO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG59O1xuZnVuY3Rpb24gY3JlYXRlQmFzZUNNc2dDVmFyc19DVmFyKCkge1xuICAgIHJldHVybiB7IG5hbWU6IFwiXCIsIHZhbHVlOiBcIlwiLCBkaWN0aW9uYXJ5TmFtZTogMCB9O1xufVxuZXhwb3J0cy5DTXNnQ1ZhcnNfQ1ZhciA9IHtcbiAgICBlbmNvZGUobWVzc2FnZSwgd3JpdGVyID0gbWluaW1hbF8xLldyaXRlci5jcmVhdGUoKSkge1xuICAgICAgICBpZiAobWVzc2FnZS5uYW1lICE9PSBcIlwiKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDEwKS5zdHJpbmcobWVzc2FnZS5uYW1lKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS52YWx1ZSAhPT0gXCJcIikge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigxOCkuc3RyaW5nKG1lc3NhZ2UudmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLmRpY3Rpb25hcnlOYW1lICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDI0KS51aW50MzIobWVzc2FnZS5kaWN0aW9uYXJ5TmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9LFxuICAgIGRlY29kZShpbnB1dCwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IGlucHV0IGluc3RhbmNlb2YgbWluaW1hbF8xLlJlYWRlciA/IGlucHV0IDogbmV3IG1pbmltYWxfMS5SZWFkZXIoaW5wdXQpO1xuICAgICAgICBsZXQgZW5kID0gbGVuZ3RoID09PSB1bmRlZmluZWQgPyByZWFkZXIubGVuIDogcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDTXNnQ1ZhcnNfQ1ZhcigpO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UubmFtZSA9IHJlYWRlci5zdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnZhbHVlID0gcmVhZGVyLnN0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZGljdGlvbmFyeU5hbWUgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJlYWRlci5za2lwVHlwZSh0YWcgJiA3KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfSxcbiAgICBmcm9tUGFydGlhbChvYmplY3QpIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2M7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ01zZ0NWYXJzX0NWYXIoKTtcbiAgICAgICAgbWVzc2FnZS5uYW1lID0gKF9hID0gb2JqZWN0Lm5hbWUpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IFwiXCI7XG4gICAgICAgIG1lc3NhZ2UudmFsdWUgPSAoX2IgPSBvYmplY3QudmFsdWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IFwiXCI7XG4gICAgICAgIG1lc3NhZ2UuZGljdGlvbmFyeU5hbWUgPSAoX2MgPSBvYmplY3QuZGljdGlvbmFyeU5hbWUpICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IDA7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbn07XG5mdW5jdGlvbiBjcmVhdGVCYXNlQ05FVE1zZ1NldENvblZhcigpIHtcbiAgICByZXR1cm4geyBjb252YXJzOiB1bmRlZmluZWQgfTtcbn1cbmV4cG9ydHMuQ05FVE1zZ1NldENvblZhciA9IHtcbiAgICBlbmNvZGUobWVzc2FnZSwgd3JpdGVyID0gbWluaW1hbF8xLldyaXRlci5jcmVhdGUoKSkge1xuICAgICAgICBpZiAobWVzc2FnZS5jb252YXJzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGV4cG9ydHMuQ01zZ0NWYXJzLmVuY29kZShtZXNzYWdlLmNvbnZhcnMsIHdyaXRlci51aW50MzIoMTApLmZvcmsoKSkubGRlbGltKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9LFxuICAgIGRlY29kZShpbnB1dCwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IGlucHV0IGluc3RhbmNlb2YgbWluaW1hbF8xLlJlYWRlciA/IGlucHV0IDogbmV3IG1pbmltYWxfMS5SZWFkZXIoaW5wdXQpO1xuICAgICAgICBsZXQgZW5kID0gbGVuZ3RoID09PSB1bmRlZmluZWQgPyByZWFkZXIubGVuIDogcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDTkVUTXNnU2V0Q29uVmFyKCk7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBjb25zdCB0YWcgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKHRhZyA+Pj4gMykge1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5jb252YXJzID0gZXhwb3J0cy5DTXNnQ1ZhcnMuZGVjb2RlKHJlYWRlciwgcmVhZGVyLnVpbnQzMigpKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmVhZGVyLnNraXBUeXBlKHRhZyAmIDcpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9LFxuICAgIGZyb21QYXJ0aWFsKG9iamVjdCkge1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNORVRNc2dTZXRDb25WYXIoKTtcbiAgICAgICAgbWVzc2FnZS5jb252YXJzID1cbiAgICAgICAgICAgIG9iamVjdC5jb252YXJzICE9PSB1bmRlZmluZWQgJiYgb2JqZWN0LmNvbnZhcnMgIT09IG51bGxcbiAgICAgICAgICAgICAgICA/IGV4cG9ydHMuQ01zZ0NWYXJzLmZyb21QYXJ0aWFsKG9iamVjdC5jb252YXJzKVxuICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG59O1xuZnVuY3Rpb24gY3JlYXRlQmFzZUNORVRNc2dOT1AoKSB7XG4gICAgcmV0dXJuIHt9O1xufVxuZXhwb3J0cy5DTkVUTXNnTk9QID0ge1xuICAgIGVuY29kZShfLCB3cml0ZXIgPSBtaW5pbWFsXzEuV3JpdGVyLmNyZWF0ZSgpKSB7XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfSxcbiAgICBkZWNvZGUoaW5wdXQsIGxlbmd0aCkge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBpbnB1dCBpbnN0YW5jZW9mIG1pbmltYWxfMS5SZWFkZXIgPyBpbnB1dCA6IG5ldyBtaW5pbWFsXzEuUmVhZGVyKGlucHV0KTtcbiAgICAgICAgbGV0IGVuZCA9IGxlbmd0aCA9PT0gdW5kZWZpbmVkID8gcmVhZGVyLmxlbiA6IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ05FVE1zZ05PUCgpO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICByZWFkZXIuc2tpcFR5cGUodGFnICYgNyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH0sXG4gICAgZnJvbVBhcnRpYWwoXykge1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNORVRNc2dOT1AoKTtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxufTtcbmZ1bmN0aW9uIGNyZWF0ZUJhc2VDTkVUTXNnRGlzY29ubmVjdCgpIHtcbiAgICByZXR1cm4geyB0ZXh0OiBcIlwiIH07XG59XG5leHBvcnRzLkNORVRNc2dEaXNjb25uZWN0ID0ge1xuICAgIGVuY29kZShtZXNzYWdlLCB3cml0ZXIgPSBtaW5pbWFsXzEuV3JpdGVyLmNyZWF0ZSgpKSB7XG4gICAgICAgIGlmIChtZXNzYWdlLnRleHQgIT09IFwiXCIpIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMTApLnN0cmluZyhtZXNzYWdlLnRleHQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfSxcbiAgICBkZWNvZGUoaW5wdXQsIGxlbmd0aCkge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBpbnB1dCBpbnN0YW5jZW9mIG1pbmltYWxfMS5SZWFkZXIgPyBpbnB1dCA6IG5ldyBtaW5pbWFsXzEuUmVhZGVyKGlucHV0KTtcbiAgICAgICAgbGV0IGVuZCA9IGxlbmd0aCA9PT0gdW5kZWZpbmVkID8gcmVhZGVyLmxlbiA6IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ05FVE1zZ0Rpc2Nvbm5lY3QoKTtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhZyA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgIHN3aXRjaCAodGFnID4+PiAzKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnRleHQgPSByZWFkZXIuc3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJlYWRlci5za2lwVHlwZSh0YWcgJiA3KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfSxcbiAgICBmcm9tUGFydGlhbChvYmplY3QpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNORVRNc2dEaXNjb25uZWN0KCk7XG4gICAgICAgIG1lc3NhZ2UudGV4dCA9IChfYSA9IG9iamVjdC50ZXh0KSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBcIlwiO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG59O1xuZnVuY3Rpb24gY3JlYXRlQmFzZUNORVRNc2dGaWxlKCkge1xuICAgIHJldHVybiB7IHRyYW5zZmVySWQ6IDAsIGZpbGVOYW1lOiBcIlwiLCBpc1JlcGxheURlbW9GaWxlOiBmYWxzZSwgZGVueTogZmFsc2UgfTtcbn1cbmV4cG9ydHMuQ05FVE1zZ0ZpbGUgPSB7XG4gICAgZW5jb2RlKG1lc3NhZ2UsIHdyaXRlciA9IG1pbmltYWxfMS5Xcml0ZXIuY3JlYXRlKCkpIHtcbiAgICAgICAgaWYgKG1lc3NhZ2UudHJhbnNmZXJJZCAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig4KS5pbnQzMihtZXNzYWdlLnRyYW5zZmVySWQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLmZpbGVOYW1lICE9PSBcIlwiKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDE4KS5zdHJpbmcobWVzc2FnZS5maWxlTmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UuaXNSZXBsYXlEZW1vRmlsZSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigyNCkuYm9vbChtZXNzYWdlLmlzUmVwbGF5RGVtb0ZpbGUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLmRlbnkgPT09IHRydWUpIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMzIpLmJvb2wobWVzc2FnZS5kZW55KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH0sXG4gICAgZGVjb2RlKGlucHV0LCBsZW5ndGgpIHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gaW5wdXQgaW5zdGFuY2VvZiBtaW5pbWFsXzEuUmVhZGVyID8gaW5wdXQgOiBuZXcgbWluaW1hbF8xLlJlYWRlcihpbnB1dCk7XG4gICAgICAgIGxldCBlbmQgPSBsZW5ndGggPT09IHVuZGVmaW5lZCA/IHJlYWRlci5sZW4gOiByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNORVRNc2dGaWxlKCk7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBjb25zdCB0YWcgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKHRhZyA+Pj4gMykge1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS50cmFuc2ZlcklkID0gcmVhZGVyLmludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5maWxlTmFtZSA9IHJlYWRlci5zdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmlzUmVwbGF5RGVtb0ZpbGUgPSByZWFkZXIuYm9vbCgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZGVueSA9IHJlYWRlci5ib29sKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJlYWRlci5za2lwVHlwZSh0YWcgJiA3KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfSxcbiAgICBmcm9tUGFydGlhbChvYmplY3QpIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2MsIF9kO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNORVRNc2dGaWxlKCk7XG4gICAgICAgIG1lc3NhZ2UudHJhbnNmZXJJZCA9IChfYSA9IG9iamVjdC50cmFuc2ZlcklkKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAwO1xuICAgICAgICBtZXNzYWdlLmZpbGVOYW1lID0gKF9iID0gb2JqZWN0LmZpbGVOYW1lKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBcIlwiO1xuICAgICAgICBtZXNzYWdlLmlzUmVwbGF5RGVtb0ZpbGUgPSAoX2MgPSBvYmplY3QuaXNSZXBsYXlEZW1vRmlsZSkgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogZmFsc2U7XG4gICAgICAgIG1lc3NhZ2UuZGVueSA9IChfZCA9IG9iamVjdC5kZW55KSAhPT0gbnVsbCAmJiBfZCAhPT0gdm9pZCAwID8gX2QgOiBmYWxzZTtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxufTtcbmZ1bmN0aW9uIGNyZWF0ZUJhc2VDTkVUTXNnU3BsaXRTY3JlZW5Vc2VyKCkge1xuICAgIHJldHVybiB7IHNsb3Q6IDAgfTtcbn1cbmV4cG9ydHMuQ05FVE1zZ1NwbGl0U2NyZWVuVXNlciA9IHtcbiAgICBlbmNvZGUobWVzc2FnZSwgd3JpdGVyID0gbWluaW1hbF8xLldyaXRlci5jcmVhdGUoKSkge1xuICAgICAgICBpZiAobWVzc2FnZS5zbG90ICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDgpLmludDMyKG1lc3NhZ2Uuc2xvdCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9LFxuICAgIGRlY29kZShpbnB1dCwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IGlucHV0IGluc3RhbmNlb2YgbWluaW1hbF8xLlJlYWRlciA/IGlucHV0IDogbmV3IG1pbmltYWxfMS5SZWFkZXIoaW5wdXQpO1xuICAgICAgICBsZXQgZW5kID0gbGVuZ3RoID09PSB1bmRlZmluZWQgPyByZWFkZXIubGVuIDogcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDTkVUTXNnU3BsaXRTY3JlZW5Vc2VyKCk7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBjb25zdCB0YWcgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKHRhZyA+Pj4gMykge1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5zbG90ID0gcmVhZGVyLmludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJlYWRlci5za2lwVHlwZSh0YWcgJiA3KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfSxcbiAgICBmcm9tUGFydGlhbChvYmplY3QpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNORVRNc2dTcGxpdFNjcmVlblVzZXIoKTtcbiAgICAgICAgbWVzc2FnZS5zbG90ID0gKF9hID0gb2JqZWN0LnNsb3QpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IDA7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbn07XG5mdW5jdGlvbiBjcmVhdGVCYXNlQ05FVE1zZ1BsYXllckF2YXRhckRhdGEoKSB7XG4gICAgcmV0dXJuIHsgYWNjb3VudGlkOiAwLCByZ2I6IG5ldyBVaW50OEFycmF5KCkgfTtcbn1cbmV4cG9ydHMuQ05FVE1zZ1BsYXllckF2YXRhckRhdGEgPSB7XG4gICAgZW5jb2RlKG1lc3NhZ2UsIHdyaXRlciA9IG1pbmltYWxfMS5Xcml0ZXIuY3JlYXRlKCkpIHtcbiAgICAgICAgaWYgKG1lc3NhZ2UuYWNjb3VudGlkICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDgpLnVpbnQzMihtZXNzYWdlLmFjY291bnRpZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UucmdiLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigxOCkuYnl0ZXMobWVzc2FnZS5yZ2IpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfSxcbiAgICBkZWNvZGUoaW5wdXQsIGxlbmd0aCkge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBpbnB1dCBpbnN0YW5jZW9mIG1pbmltYWxfMS5SZWFkZXIgPyBpbnB1dCA6IG5ldyBtaW5pbWFsXzEuUmVhZGVyKGlucHV0KTtcbiAgICAgICAgbGV0IGVuZCA9IGxlbmd0aCA9PT0gdW5kZWZpbmVkID8gcmVhZGVyLmxlbiA6IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ05FVE1zZ1BsYXllckF2YXRhckRhdGEoKTtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhZyA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgIHN3aXRjaCAodGFnID4+PiAzKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmFjY291bnRpZCA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnJnYiA9IHJlYWRlci5ieXRlcygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICByZWFkZXIuc2tpcFR5cGUodGFnICYgNyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH0sXG4gICAgZnJvbVBhcnRpYWwob2JqZWN0KSB7XG4gICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ05FVE1zZ1BsYXllckF2YXRhckRhdGEoKTtcbiAgICAgICAgbWVzc2FnZS5hY2NvdW50aWQgPSAoX2EgPSBvYmplY3QuYWNjb3VudGlkKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAwO1xuICAgICAgICBtZXNzYWdlLnJnYiA9IChfYiA9IG9iamVjdC5yZ2IpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IG5ldyBVaW50OEFycmF5KCk7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbn07XG5mdW5jdGlvbiBjcmVhdGVCYXNlQ0NMQ01zZ0NsaWVudEluZm8oKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgc2VuZFRhYmxlQ3JjOiAwLFxuICAgICAgICBzZXJ2ZXJDb3VudDogMCxcbiAgICAgICAgaXNIbHR2OiBmYWxzZSxcbiAgICAgICAgaXNSZXBsYXk6IGZhbHNlLFxuICAgICAgICBmcmllbmRzSWQ6IDAsXG4gICAgICAgIGZyaWVuZHNOYW1lOiBcIlwiLFxuICAgICAgICBjdXN0b21GaWxlczogW11cbiAgICB9O1xufVxuZXhwb3J0cy5DQ0xDTXNnQ2xpZW50SW5mbyA9IHtcbiAgICBlbmNvZGUobWVzc2FnZSwgd3JpdGVyID0gbWluaW1hbF8xLldyaXRlci5jcmVhdGUoKSkge1xuICAgICAgICBpZiAobWVzc2FnZS5zZW5kVGFibGVDcmMgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMTMpLmZpeGVkMzIobWVzc2FnZS5zZW5kVGFibGVDcmMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLnNlcnZlckNvdW50ICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDE2KS51aW50MzIobWVzc2FnZS5zZXJ2ZXJDb3VudCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UuaXNIbHR2ID09PSB0cnVlKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDI0KS5ib29sKG1lc3NhZ2UuaXNIbHR2KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5pc1JlcGxheSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigzMikuYm9vbChtZXNzYWdlLmlzUmVwbGF5KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5mcmllbmRzSWQgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoNDApLnVpbnQzMihtZXNzYWdlLmZyaWVuZHNJZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UuZnJpZW5kc05hbWUgIT09IFwiXCIpIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoNTApLnN0cmluZyhtZXNzYWdlLmZyaWVuZHNOYW1lKTtcbiAgICAgICAgfVxuICAgICAgICB3cml0ZXIudWludDMyKDU4KS5mb3JrKCk7XG4gICAgICAgIGZvciAoY29uc3QgdiBvZiBtZXNzYWdlLmN1c3RvbUZpbGVzKSB7XG4gICAgICAgICAgICB3cml0ZXIuZml4ZWQzMih2KTtcbiAgICAgICAgfVxuICAgICAgICB3cml0ZXIubGRlbGltKCk7XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfSxcbiAgICBkZWNvZGUoaW5wdXQsIGxlbmd0aCkge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBpbnB1dCBpbnN0YW5jZW9mIG1pbmltYWxfMS5SZWFkZXIgPyBpbnB1dCA6IG5ldyBtaW5pbWFsXzEuUmVhZGVyKGlucHV0KTtcbiAgICAgICAgbGV0IGVuZCA9IGxlbmd0aCA9PT0gdW5kZWZpbmVkID8gcmVhZGVyLmxlbiA6IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ0NMQ01zZ0NsaWVudEluZm8oKTtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhZyA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgIHN3aXRjaCAodGFnID4+PiAzKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnNlbmRUYWJsZUNyYyA9IHJlYWRlci5maXhlZDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5zZXJ2ZXJDb3VudCA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmlzSGx0diA9IHJlYWRlci5ib29sKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5pc1JlcGxheSA9IHJlYWRlci5ib29sKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5mcmllbmRzSWQgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5mcmllbmRzTmFtZSA9IHJlYWRlci5zdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA3OlxuICAgICAgICAgICAgICAgICAgICBpZiAoKHRhZyAmIDcpID09PSAyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbmQyID0gcmVhZGVyLnVpbnQzMigpICsgcmVhZGVyLnBvcztcbiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kMikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuY3VzdG9tRmlsZXMucHVzaChyZWFkZXIuZml4ZWQzMigpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuY3VzdG9tRmlsZXMucHVzaChyZWFkZXIuZml4ZWQzMigpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICByZWFkZXIuc2tpcFR5cGUodGFnICYgNyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH0sXG4gICAgZnJvbVBhcnRpYWwob2JqZWN0KSB7XG4gICAgICAgIHZhciBfYSwgX2IsIF9jLCBfZCwgX2UsIF9mLCBfZztcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDQ0xDTXNnQ2xpZW50SW5mbygpO1xuICAgICAgICBtZXNzYWdlLnNlbmRUYWJsZUNyYyA9IChfYSA9IG9iamVjdC5zZW5kVGFibGVDcmMpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IDA7XG4gICAgICAgIG1lc3NhZ2Uuc2VydmVyQ291bnQgPSAoX2IgPSBvYmplY3Quc2VydmVyQ291bnQpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IDA7XG4gICAgICAgIG1lc3NhZ2UuaXNIbHR2ID0gKF9jID0gb2JqZWN0LmlzSGx0dikgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogZmFsc2U7XG4gICAgICAgIG1lc3NhZ2UuaXNSZXBsYXkgPSAoX2QgPSBvYmplY3QuaXNSZXBsYXkpICE9PSBudWxsICYmIF9kICE9PSB2b2lkIDAgPyBfZCA6IGZhbHNlO1xuICAgICAgICBtZXNzYWdlLmZyaWVuZHNJZCA9IChfZSA9IG9iamVjdC5mcmllbmRzSWQpICE9PSBudWxsICYmIF9lICE9PSB2b2lkIDAgPyBfZSA6IDA7XG4gICAgICAgIG1lc3NhZ2UuZnJpZW5kc05hbWUgPSAoX2YgPSBvYmplY3QuZnJpZW5kc05hbWUpICE9PSBudWxsICYmIF9mICE9PSB2b2lkIDAgPyBfZiA6IFwiXCI7XG4gICAgICAgIG1lc3NhZ2UuY3VzdG9tRmlsZXMgPSAoKF9nID0gb2JqZWN0LmN1c3RvbUZpbGVzKSA9PT0gbnVsbCB8fCBfZyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2cubWFwKGUgPT4gZSkpIHx8IFtdO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG59O1xuZnVuY3Rpb24gY3JlYXRlQmFzZUNDTENNc2dNb3ZlKCkge1xuICAgIHJldHVybiB7IG51bUJhY2t1cENvbW1hbmRzOiAwLCBudW1OZXdDb21tYW5kczogMCwgZGF0YTogbmV3IFVpbnQ4QXJyYXkoKSB9O1xufVxuZXhwb3J0cy5DQ0xDTXNnTW92ZSA9IHtcbiAgICBlbmNvZGUobWVzc2FnZSwgd3JpdGVyID0gbWluaW1hbF8xLldyaXRlci5jcmVhdGUoKSkge1xuICAgICAgICBpZiAobWVzc2FnZS5udW1CYWNrdXBDb21tYW5kcyAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig4KS51aW50MzIobWVzc2FnZS5udW1CYWNrdXBDb21tYW5kcyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UubnVtTmV3Q29tbWFuZHMgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMTYpLnVpbnQzMihtZXNzYWdlLm51bU5ld0NvbW1hbmRzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5kYXRhLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigyNikuYnl0ZXMobWVzc2FnZS5kYXRhKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH0sXG4gICAgZGVjb2RlKGlucHV0LCBsZW5ndGgpIHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gaW5wdXQgaW5zdGFuY2VvZiBtaW5pbWFsXzEuUmVhZGVyID8gaW5wdXQgOiBuZXcgbWluaW1hbF8xLlJlYWRlcihpbnB1dCk7XG4gICAgICAgIGxldCBlbmQgPSBsZW5ndGggPT09IHVuZGVmaW5lZCA/IHJlYWRlci5sZW4gOiByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNDTENNc2dNb3ZlKCk7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBjb25zdCB0YWcgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKHRhZyA+Pj4gMykge1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5udW1CYWNrdXBDb21tYW5kcyA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLm51bU5ld0NvbW1hbmRzID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZGF0YSA9IHJlYWRlci5ieXRlcygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICByZWFkZXIuc2tpcFR5cGUodGFnICYgNyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH0sXG4gICAgZnJvbVBhcnRpYWwob2JqZWN0KSB7XG4gICAgICAgIHZhciBfYSwgX2IsIF9jO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNDTENNc2dNb3ZlKCk7XG4gICAgICAgIG1lc3NhZ2UubnVtQmFja3VwQ29tbWFuZHMgPSAoX2EgPSBvYmplY3QubnVtQmFja3VwQ29tbWFuZHMpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IDA7XG4gICAgICAgIG1lc3NhZ2UubnVtTmV3Q29tbWFuZHMgPSAoX2IgPSBvYmplY3QubnVtTmV3Q29tbWFuZHMpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IDA7XG4gICAgICAgIG1lc3NhZ2UuZGF0YSA9IChfYyA9IG9iamVjdC5kYXRhKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiBuZXcgVWludDhBcnJheSgpO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG59O1xuZnVuY3Rpb24gY3JlYXRlQmFzZUNDTENNc2dWb2ljZURhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZGF0YTogbmV3IFVpbnQ4QXJyYXkoKSxcbiAgICAgICAgeHVpZDogTG9uZy5VWkVSTyxcbiAgICAgICAgZm9ybWF0OiAwLFxuICAgICAgICBzZXF1ZW5jZUJ5dGVzOiAwLFxuICAgICAgICBzZWN0aW9uTnVtYmVyOiAwLFxuICAgICAgICB1bmNvbXByZXNzZWRTYW1wbGVPZmZzZXQ6IDBcbiAgICB9O1xufVxuZXhwb3J0cy5DQ0xDTXNnVm9pY2VEYXRhID0ge1xuICAgIGVuY29kZShtZXNzYWdlLCB3cml0ZXIgPSBtaW5pbWFsXzEuV3JpdGVyLmNyZWF0ZSgpKSB7XG4gICAgICAgIGlmIChtZXNzYWdlLmRhdGEubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDEwKS5ieXRlcyhtZXNzYWdlLmRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghbWVzc2FnZS54dWlkLmlzWmVybygpKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDE3KS5maXhlZDY0KG1lc3NhZ2UueHVpZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UuZm9ybWF0ICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDI0KS5pbnQzMihtZXNzYWdlLmZvcm1hdCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2Uuc2VxdWVuY2VCeXRlcyAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigzMikuaW50MzIobWVzc2FnZS5zZXF1ZW5jZUJ5dGVzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5zZWN0aW9uTnVtYmVyICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDQwKS51aW50MzIobWVzc2FnZS5zZWN0aW9uTnVtYmVyKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS51bmNvbXByZXNzZWRTYW1wbGVPZmZzZXQgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoNDgpLnVpbnQzMihtZXNzYWdlLnVuY29tcHJlc3NlZFNhbXBsZU9mZnNldCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9LFxuICAgIGRlY29kZShpbnB1dCwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IGlucHV0IGluc3RhbmNlb2YgbWluaW1hbF8xLlJlYWRlciA/IGlucHV0IDogbmV3IG1pbmltYWxfMS5SZWFkZXIoaW5wdXQpO1xuICAgICAgICBsZXQgZW5kID0gbGVuZ3RoID09PSB1bmRlZmluZWQgPyByZWFkZXIubGVuIDogcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDQ0xDTXNnVm9pY2VEYXRhKCk7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBjb25zdCB0YWcgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKHRhZyA+Pj4gMykge1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5kYXRhID0gcmVhZGVyLmJ5dGVzKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS54dWlkID0gcmVhZGVyLmZpeGVkNjQoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmZvcm1hdCA9IHJlYWRlci5pbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Uuc2VxdWVuY2VCeXRlcyA9IHJlYWRlci5pbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Uuc2VjdGlvbk51bWJlciA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnVuY29tcHJlc3NlZFNhbXBsZU9mZnNldCA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmVhZGVyLnNraXBUeXBlKHRhZyAmIDcpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9LFxuICAgIGZyb21QYXJ0aWFsKG9iamVjdCkge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYywgX2QsIF9lO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNDTENNc2dWb2ljZURhdGEoKTtcbiAgICAgICAgbWVzc2FnZS5kYXRhID0gKF9hID0gb2JqZWN0LmRhdGEpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IG5ldyBVaW50OEFycmF5KCk7XG4gICAgICAgIG1lc3NhZ2UueHVpZCA9XG4gICAgICAgICAgICBvYmplY3QueHVpZCAhPT0gdW5kZWZpbmVkICYmIG9iamVjdC54dWlkICE9PSBudWxsXG4gICAgICAgICAgICAgICAgPyBMb25nLmZyb21WYWx1ZShvYmplY3QueHVpZClcbiAgICAgICAgICAgICAgICA6IExvbmcuVVpFUk87XG4gICAgICAgIG1lc3NhZ2UuZm9ybWF0ID0gKF9iID0gb2JqZWN0LmZvcm1hdCkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogMDtcbiAgICAgICAgbWVzc2FnZS5zZXF1ZW5jZUJ5dGVzID0gKF9jID0gb2JqZWN0LnNlcXVlbmNlQnl0ZXMpICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IDA7XG4gICAgICAgIG1lc3NhZ2Uuc2VjdGlvbk51bWJlciA9IChfZCA9IG9iamVjdC5zZWN0aW9uTnVtYmVyKSAhPT0gbnVsbCAmJiBfZCAhPT0gdm9pZCAwID8gX2QgOiAwO1xuICAgICAgICBtZXNzYWdlLnVuY29tcHJlc3NlZFNhbXBsZU9mZnNldCA9IChfZSA9IG9iamVjdC51bmNvbXByZXNzZWRTYW1wbGVPZmZzZXQpICE9PSBudWxsICYmIF9lICE9PSB2b2lkIDAgPyBfZSA6IDA7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbn07XG5mdW5jdGlvbiBjcmVhdGVCYXNlQ0NMQ01zZ0Jhc2VsaW5lQWNrKCkge1xuICAgIHJldHVybiB7IGJhc2VsaW5lVGljazogMCwgYmFzZWxpbmVOcjogMCB9O1xufVxuZXhwb3J0cy5DQ0xDTXNnQmFzZWxpbmVBY2sgPSB7XG4gICAgZW5jb2RlKG1lc3NhZ2UsIHdyaXRlciA9IG1pbmltYWxfMS5Xcml0ZXIuY3JlYXRlKCkpIHtcbiAgICAgICAgaWYgKG1lc3NhZ2UuYmFzZWxpbmVUaWNrICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDgpLmludDMyKG1lc3NhZ2UuYmFzZWxpbmVUaWNrKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5iYXNlbGluZU5yICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDE2KS5pbnQzMihtZXNzYWdlLmJhc2VsaW5lTnIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfSxcbiAgICBkZWNvZGUoaW5wdXQsIGxlbmd0aCkge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBpbnB1dCBpbnN0YW5jZW9mIG1pbmltYWxfMS5SZWFkZXIgPyBpbnB1dCA6IG5ldyBtaW5pbWFsXzEuUmVhZGVyKGlucHV0KTtcbiAgICAgICAgbGV0IGVuZCA9IGxlbmd0aCA9PT0gdW5kZWZpbmVkID8gcmVhZGVyLmxlbiA6IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ0NMQ01zZ0Jhc2VsaW5lQWNrKCk7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBjb25zdCB0YWcgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKHRhZyA+Pj4gMykge1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5iYXNlbGluZVRpY2sgPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmJhc2VsaW5lTnIgPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmVhZGVyLnNraXBUeXBlKHRhZyAmIDcpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9LFxuICAgIGZyb21QYXJ0aWFsKG9iamVjdCkge1xuICAgICAgICB2YXIgX2EsIF9iO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNDTENNc2dCYXNlbGluZUFjaygpO1xuICAgICAgICBtZXNzYWdlLmJhc2VsaW5lVGljayA9IChfYSA9IG9iamVjdC5iYXNlbGluZVRpY2spICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IDA7XG4gICAgICAgIG1lc3NhZ2UuYmFzZWxpbmVOciA9IChfYiA9IG9iamVjdC5iYXNlbGluZU5yKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAwO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG59O1xuZnVuY3Rpb24gY3JlYXRlQmFzZUNDTENNc2dMaXN0ZW5FdmVudHMoKSB7XG4gICAgcmV0dXJuIHsgZXZlbnRNYXNrOiBbXSB9O1xufVxuZXhwb3J0cy5DQ0xDTXNnTGlzdGVuRXZlbnRzID0ge1xuICAgIGVuY29kZShtZXNzYWdlLCB3cml0ZXIgPSBtaW5pbWFsXzEuV3JpdGVyLmNyZWF0ZSgpKSB7XG4gICAgICAgIHdyaXRlci51aW50MzIoMTApLmZvcmsoKTtcbiAgICAgICAgZm9yIChjb25zdCB2IG9mIG1lc3NhZ2UuZXZlbnRNYXNrKSB7XG4gICAgICAgICAgICB3cml0ZXIuZml4ZWQzMih2KTtcbiAgICAgICAgfVxuICAgICAgICB3cml0ZXIubGRlbGltKCk7XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfSxcbiAgICBkZWNvZGUoaW5wdXQsIGxlbmd0aCkge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBpbnB1dCBpbnN0YW5jZW9mIG1pbmltYWxfMS5SZWFkZXIgPyBpbnB1dCA6IG5ldyBtaW5pbWFsXzEuUmVhZGVyKGlucHV0KTtcbiAgICAgICAgbGV0IGVuZCA9IGxlbmd0aCA9PT0gdW5kZWZpbmVkID8gcmVhZGVyLmxlbiA6IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ0NMQ01zZ0xpc3RlbkV2ZW50cygpO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIGlmICgodGFnICYgNykgPT09IDIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuZDIgPSByZWFkZXIudWludDMyKCkgKyByZWFkZXIucG9zO1xuICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5ldmVudE1hc2sucHVzaChyZWFkZXIuZml4ZWQzMigpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZXZlbnRNYXNrLnB1c2gocmVhZGVyLmZpeGVkMzIoKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmVhZGVyLnNraXBUeXBlKHRhZyAmIDcpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9LFxuICAgIGZyb21QYXJ0aWFsKG9iamVjdCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ0NMQ01zZ0xpc3RlbkV2ZW50cygpO1xuICAgICAgICBtZXNzYWdlLmV2ZW50TWFzayA9ICgoX2EgPSBvYmplY3QuZXZlbnRNYXNrKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EubWFwKGUgPT4gZSkpIHx8IFtdO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG59O1xuZnVuY3Rpb24gY3JlYXRlQmFzZUNDTENNc2dSZXNwb25kQ3ZhclZhbHVlKCkge1xuICAgIHJldHVybiB7IGNvb2tpZTogMCwgc3RhdHVzQ29kZTogMCwgbmFtZTogXCJcIiwgdmFsdWU6IFwiXCIgfTtcbn1cbmV4cG9ydHMuQ0NMQ01zZ1Jlc3BvbmRDdmFyVmFsdWUgPSB7XG4gICAgZW5jb2RlKG1lc3NhZ2UsIHdyaXRlciA9IG1pbmltYWxfMS5Xcml0ZXIuY3JlYXRlKCkpIHtcbiAgICAgICAgaWYgKG1lc3NhZ2UuY29va2llICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDgpLmludDMyKG1lc3NhZ2UuY29va2llKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5zdGF0dXNDb2RlICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDE2KS5pbnQzMihtZXNzYWdlLnN0YXR1c0NvZGUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLm5hbWUgIT09IFwiXCIpIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMjYpLnN0cmluZyhtZXNzYWdlLm5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLnZhbHVlICE9PSBcIlwiKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDM0KS5zdHJpbmcobWVzc2FnZS52YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9LFxuICAgIGRlY29kZShpbnB1dCwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IGlucHV0IGluc3RhbmNlb2YgbWluaW1hbF8xLlJlYWRlciA/IGlucHV0IDogbmV3IG1pbmltYWxfMS5SZWFkZXIoaW5wdXQpO1xuICAgICAgICBsZXQgZW5kID0gbGVuZ3RoID09PSB1bmRlZmluZWQgPyByZWFkZXIubGVuIDogcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDQ0xDTXNnUmVzcG9uZEN2YXJWYWx1ZSgpO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuY29va2llID0gcmVhZGVyLmludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5zdGF0dXNDb2RlID0gcmVhZGVyLmludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5uYW1lID0gcmVhZGVyLnN0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudmFsdWUgPSByZWFkZXIuc3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJlYWRlci5za2lwVHlwZSh0YWcgJiA3KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfSxcbiAgICBmcm9tUGFydGlhbChvYmplY3QpIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2MsIF9kO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNDTENNc2dSZXNwb25kQ3ZhclZhbHVlKCk7XG4gICAgICAgIG1lc3NhZ2UuY29va2llID0gKF9hID0gb2JqZWN0LmNvb2tpZSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMDtcbiAgICAgICAgbWVzc2FnZS5zdGF0dXNDb2RlID0gKF9iID0gb2JqZWN0LnN0YXR1c0NvZGUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IDA7XG4gICAgICAgIG1lc3NhZ2UubmFtZSA9IChfYyA9IG9iamVjdC5uYW1lKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiBcIlwiO1xuICAgICAgICBtZXNzYWdlLnZhbHVlID0gKF9kID0gb2JqZWN0LnZhbHVlKSAhPT0gbnVsbCAmJiBfZCAhPT0gdm9pZCAwID8gX2QgOiBcIlwiO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG59O1xuZnVuY3Rpb24gY3JlYXRlQmFzZUNDTENNc2dGaWxlQ1JDQ2hlY2soKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgY29kZVBhdGg6IDAsXG4gICAgICAgIHBhdGg6IFwiXCIsXG4gICAgICAgIGNvZGVGaWxlbmFtZTogMCxcbiAgICAgICAgZmlsZW5hbWU6IFwiXCIsXG4gICAgICAgIGZpbGVGcmFjdGlvbjogMCxcbiAgICAgICAgbWQ1OiBuZXcgVWludDhBcnJheSgpLFxuICAgICAgICBjcmM6IDAsXG4gICAgICAgIGZpbGVIYXNoVHlwZTogMCxcbiAgICAgICAgZmlsZUxlbjogMCxcbiAgICAgICAgcGFja0ZpbGVJZDogMCxcbiAgICAgICAgcGFja0ZpbGVOdW1iZXI6IDBcbiAgICB9O1xufVxuZXhwb3J0cy5DQ0xDTXNnRmlsZUNSQ0NoZWNrID0ge1xuICAgIGVuY29kZShtZXNzYWdlLCB3cml0ZXIgPSBtaW5pbWFsXzEuV3JpdGVyLmNyZWF0ZSgpKSB7XG4gICAgICAgIGlmIChtZXNzYWdlLmNvZGVQYXRoICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDgpLmludDMyKG1lc3NhZ2UuY29kZVBhdGgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLnBhdGggIT09IFwiXCIpIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMTgpLnN0cmluZyhtZXNzYWdlLnBhdGgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLmNvZGVGaWxlbmFtZSAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigyNCkuaW50MzIobWVzc2FnZS5jb2RlRmlsZW5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLmZpbGVuYW1lICE9PSBcIlwiKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDM0KS5zdHJpbmcobWVzc2FnZS5maWxlbmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UuZmlsZUZyYWN0aW9uICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDQwKS5pbnQzMihtZXNzYWdlLmZpbGVGcmFjdGlvbik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UubWQ1Lmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig1MCkuYnl0ZXMobWVzc2FnZS5tZDUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLmNyYyAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig1NikudWludDMyKG1lc3NhZ2UuY3JjKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5maWxlSGFzaFR5cGUgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoNjQpLmludDMyKG1lc3NhZ2UuZmlsZUhhc2hUeXBlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5maWxlTGVuICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDcyKS5pbnQzMihtZXNzYWdlLmZpbGVMZW4pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLnBhY2tGaWxlSWQgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoODApLmludDMyKG1lc3NhZ2UucGFja0ZpbGVJZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UucGFja0ZpbGVOdW1iZXIgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoODgpLmludDMyKG1lc3NhZ2UucGFja0ZpbGVOdW1iZXIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfSxcbiAgICBkZWNvZGUoaW5wdXQsIGxlbmd0aCkge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBpbnB1dCBpbnN0YW5jZW9mIG1pbmltYWxfMS5SZWFkZXIgPyBpbnB1dCA6IG5ldyBtaW5pbWFsXzEuUmVhZGVyKGlucHV0KTtcbiAgICAgICAgbGV0IGVuZCA9IGxlbmd0aCA9PT0gdW5kZWZpbmVkID8gcmVhZGVyLmxlbiA6IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ0NMQ01zZ0ZpbGVDUkNDaGVjaygpO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuY29kZVBhdGggPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnBhdGggPSByZWFkZXIuc3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5jb2RlRmlsZW5hbWUgPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmZpbGVuYW1lID0gcmVhZGVyLnN0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZmlsZUZyYWN0aW9uID0gcmVhZGVyLmludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5tZDUgPSByZWFkZXIuYnl0ZXMoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA3OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmNyYyA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA4OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmZpbGVIYXNoVHlwZSA9IHJlYWRlci5pbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDk6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZmlsZUxlbiA9IHJlYWRlci5pbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDEwOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnBhY2tGaWxlSWQgPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAxMTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5wYWNrRmlsZU51bWJlciA9IHJlYWRlci5pbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICByZWFkZXIuc2tpcFR5cGUodGFnICYgNyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH0sXG4gICAgZnJvbVBhcnRpYWwob2JqZWN0KSB7XG4gICAgICAgIHZhciBfYSwgX2IsIF9jLCBfZCwgX2UsIF9mLCBfZywgX2gsIF9qLCBfaywgX2w7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ0NMQ01zZ0ZpbGVDUkNDaGVjaygpO1xuICAgICAgICBtZXNzYWdlLmNvZGVQYXRoID0gKF9hID0gb2JqZWN0LmNvZGVQYXRoKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAwO1xuICAgICAgICBtZXNzYWdlLnBhdGggPSAoX2IgPSBvYmplY3QucGF0aCkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogXCJcIjtcbiAgICAgICAgbWVzc2FnZS5jb2RlRmlsZW5hbWUgPSAoX2MgPSBvYmplY3QuY29kZUZpbGVuYW1lKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiAwO1xuICAgICAgICBtZXNzYWdlLmZpbGVuYW1lID0gKF9kID0gb2JqZWN0LmZpbGVuYW1lKSAhPT0gbnVsbCAmJiBfZCAhPT0gdm9pZCAwID8gX2QgOiBcIlwiO1xuICAgICAgICBtZXNzYWdlLmZpbGVGcmFjdGlvbiA9IChfZSA9IG9iamVjdC5maWxlRnJhY3Rpb24pICE9PSBudWxsICYmIF9lICE9PSB2b2lkIDAgPyBfZSA6IDA7XG4gICAgICAgIG1lc3NhZ2UubWQ1ID0gKF9mID0gb2JqZWN0Lm1kNSkgIT09IG51bGwgJiYgX2YgIT09IHZvaWQgMCA/IF9mIDogbmV3IFVpbnQ4QXJyYXkoKTtcbiAgICAgICAgbWVzc2FnZS5jcmMgPSAoX2cgPSBvYmplY3QuY3JjKSAhPT0gbnVsbCAmJiBfZyAhPT0gdm9pZCAwID8gX2cgOiAwO1xuICAgICAgICBtZXNzYWdlLmZpbGVIYXNoVHlwZSA9IChfaCA9IG9iamVjdC5maWxlSGFzaFR5cGUpICE9PSBudWxsICYmIF9oICE9PSB2b2lkIDAgPyBfaCA6IDA7XG4gICAgICAgIG1lc3NhZ2UuZmlsZUxlbiA9IChfaiA9IG9iamVjdC5maWxlTGVuKSAhPT0gbnVsbCAmJiBfaiAhPT0gdm9pZCAwID8gX2ogOiAwO1xuICAgICAgICBtZXNzYWdlLnBhY2tGaWxlSWQgPSAoX2sgPSBvYmplY3QucGFja0ZpbGVJZCkgIT09IG51bGwgJiYgX2sgIT09IHZvaWQgMCA/IF9rIDogMDtcbiAgICAgICAgbWVzc2FnZS5wYWNrRmlsZU51bWJlciA9IChfbCA9IG9iamVjdC5wYWNrRmlsZU51bWJlcikgIT09IG51bGwgJiYgX2wgIT09IHZvaWQgMCA/IF9sIDogMDtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxufTtcbmZ1bmN0aW9uIGNyZWF0ZUJhc2VDQ0xDTXNnTG9hZGluZ1Byb2dyZXNzKCkge1xuICAgIHJldHVybiB7IHByb2dyZXNzOiAwIH07XG59XG5leHBvcnRzLkNDTENNc2dMb2FkaW5nUHJvZ3Jlc3MgPSB7XG4gICAgZW5jb2RlKG1lc3NhZ2UsIHdyaXRlciA9IG1pbmltYWxfMS5Xcml0ZXIuY3JlYXRlKCkpIHtcbiAgICAgICAgaWYgKG1lc3NhZ2UucHJvZ3Jlc3MgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoOCkuaW50MzIobWVzc2FnZS5wcm9ncmVzcyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9LFxuICAgIGRlY29kZShpbnB1dCwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IGlucHV0IGluc3RhbmNlb2YgbWluaW1hbF8xLlJlYWRlciA/IGlucHV0IDogbmV3IG1pbmltYWxfMS5SZWFkZXIoaW5wdXQpO1xuICAgICAgICBsZXQgZW5kID0gbGVuZ3RoID09PSB1bmRlZmluZWQgPyByZWFkZXIubGVuIDogcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDQ0xDTXNnTG9hZGluZ1Byb2dyZXNzKCk7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBjb25zdCB0YWcgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKHRhZyA+Pj4gMykge1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5wcm9ncmVzcyA9IHJlYWRlci5pbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICByZWFkZXIuc2tpcFR5cGUodGFnICYgNyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH0sXG4gICAgZnJvbVBhcnRpYWwob2JqZWN0KSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDQ0xDTXNnTG9hZGluZ1Byb2dyZXNzKCk7XG4gICAgICAgIG1lc3NhZ2UucHJvZ3Jlc3MgPSAoX2EgPSBvYmplY3QucHJvZ3Jlc3MpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IDA7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbn07XG5mdW5jdGlvbiBjcmVhdGVCYXNlQ0NMQ01zZ1NwbGl0UGxheWVyQ29ubmVjdCgpIHtcbiAgICByZXR1cm4geyBjb252YXJzOiB1bmRlZmluZWQgfTtcbn1cbmV4cG9ydHMuQ0NMQ01zZ1NwbGl0UGxheWVyQ29ubmVjdCA9IHtcbiAgICBlbmNvZGUobWVzc2FnZSwgd3JpdGVyID0gbWluaW1hbF8xLldyaXRlci5jcmVhdGUoKSkge1xuICAgICAgICBpZiAobWVzc2FnZS5jb252YXJzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGV4cG9ydHMuQ01zZ0NWYXJzLmVuY29kZShtZXNzYWdlLmNvbnZhcnMsIHdyaXRlci51aW50MzIoMTApLmZvcmsoKSkubGRlbGltKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9LFxuICAgIGRlY29kZShpbnB1dCwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IGlucHV0IGluc3RhbmNlb2YgbWluaW1hbF8xLlJlYWRlciA/IGlucHV0IDogbmV3IG1pbmltYWxfMS5SZWFkZXIoaW5wdXQpO1xuICAgICAgICBsZXQgZW5kID0gbGVuZ3RoID09PSB1bmRlZmluZWQgPyByZWFkZXIubGVuIDogcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDQ0xDTXNnU3BsaXRQbGF5ZXJDb25uZWN0KCk7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBjb25zdCB0YWcgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKHRhZyA+Pj4gMykge1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5jb252YXJzID0gZXhwb3J0cy5DTXNnQ1ZhcnMuZGVjb2RlKHJlYWRlciwgcmVhZGVyLnVpbnQzMigpKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmVhZGVyLnNraXBUeXBlKHRhZyAmIDcpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9LFxuICAgIGZyb21QYXJ0aWFsKG9iamVjdCkge1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNDTENNc2dTcGxpdFBsYXllckNvbm5lY3QoKTtcbiAgICAgICAgbWVzc2FnZS5jb252YXJzID1cbiAgICAgICAgICAgIG9iamVjdC5jb252YXJzICE9PSB1bmRlZmluZWQgJiYgb2JqZWN0LmNvbnZhcnMgIT09IG51bGxcbiAgICAgICAgICAgICAgICA/IGV4cG9ydHMuQ01zZ0NWYXJzLmZyb21QYXJ0aWFsKG9iamVjdC5jb252YXJzKVxuICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG59O1xuZnVuY3Rpb24gY3JlYXRlQmFzZUNDTENNc2dDbWRLZXlWYWx1ZXMoKSB7XG4gICAgcmV0dXJuIHsga2V5dmFsdWVzOiBuZXcgVWludDhBcnJheSgpIH07XG59XG5leHBvcnRzLkNDTENNc2dDbWRLZXlWYWx1ZXMgPSB7XG4gICAgZW5jb2RlKG1lc3NhZ2UsIHdyaXRlciA9IG1pbmltYWxfMS5Xcml0ZXIuY3JlYXRlKCkpIHtcbiAgICAgICAgaWYgKG1lc3NhZ2Uua2V5dmFsdWVzLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigxMCkuYnl0ZXMobWVzc2FnZS5rZXl2YWx1ZXMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfSxcbiAgICBkZWNvZGUoaW5wdXQsIGxlbmd0aCkge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBpbnB1dCBpbnN0YW5jZW9mIG1pbmltYWxfMS5SZWFkZXIgPyBpbnB1dCA6IG5ldyBtaW5pbWFsXzEuUmVhZGVyKGlucHV0KTtcbiAgICAgICAgbGV0IGVuZCA9IGxlbmd0aCA9PT0gdW5kZWZpbmVkID8gcmVhZGVyLmxlbiA6IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ0NMQ01zZ0NtZEtleVZhbHVlcygpO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Uua2V5dmFsdWVzID0gcmVhZGVyLmJ5dGVzKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJlYWRlci5za2lwVHlwZSh0YWcgJiA3KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfSxcbiAgICBmcm9tUGFydGlhbChvYmplY3QpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNDTENNc2dDbWRLZXlWYWx1ZXMoKTtcbiAgICAgICAgbWVzc2FnZS5rZXl2YWx1ZXMgPSAoX2EgPSBvYmplY3Qua2V5dmFsdWVzKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBuZXcgVWludDhBcnJheSgpO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG59O1xuZnVuY3Rpb24gY3JlYXRlQmFzZUNTVkNNc2dTZXJ2ZXJJbmZvKCkge1xuICAgIHJldHVybiB7XG4gICAgICAgIHByb3RvY29sOiAwLFxuICAgICAgICBzZXJ2ZXJDb3VudDogMCxcbiAgICAgICAgaXNEZWRpY2F0ZWQ6IGZhbHNlLFxuICAgICAgICBpc09mZmljaWFsVmFsdmVTZXJ2ZXI6IGZhbHNlLFxuICAgICAgICBpc0hsdHY6IGZhbHNlLFxuICAgICAgICBpc1JlcGxheTogZmFsc2UsXG4gICAgICAgIGlzUmVkaXJlY3RpbmdUb1Byb3h5UmVsYXk6IGZhbHNlLFxuICAgICAgICBjT3M6IDAsXG4gICAgICAgIG1hcENyYzogMCxcbiAgICAgICAgY2xpZW50Q3JjOiAwLFxuICAgICAgICBzdHJpbmdUYWJsZUNyYzogMCxcbiAgICAgICAgbWF4Q2xpZW50czogMCxcbiAgICAgICAgbWF4Q2xhc3NlczogMCxcbiAgICAgICAgcGxheWVyU2xvdDogMCxcbiAgICAgICAgdGlja0ludGVydmFsOiAwLFxuICAgICAgICBnYW1lRGlyOiBcIlwiLFxuICAgICAgICBtYXBOYW1lOiBcIlwiLFxuICAgICAgICBtYXBHcm91cE5hbWU6IFwiXCIsXG4gICAgICAgIHNreU5hbWU6IFwiXCIsXG4gICAgICAgIGhvc3ROYW1lOiBcIlwiLFxuICAgICAgICBwdWJsaWNJcDogMCxcbiAgICAgICAgdWdjTWFwSWQ6IExvbmcuVVpFUk9cbiAgICB9O1xufVxuZXhwb3J0cy5DU1ZDTXNnU2VydmVySW5mbyA9IHtcbiAgICBlbmNvZGUobWVzc2FnZSwgd3JpdGVyID0gbWluaW1hbF8xLldyaXRlci5jcmVhdGUoKSkge1xuICAgICAgICBpZiAobWVzc2FnZS5wcm90b2NvbCAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig4KS5pbnQzMihtZXNzYWdlLnByb3RvY29sKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5zZXJ2ZXJDb3VudCAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigxNikuaW50MzIobWVzc2FnZS5zZXJ2ZXJDb3VudCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UuaXNEZWRpY2F0ZWQgPT09IHRydWUpIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMjQpLmJvb2wobWVzc2FnZS5pc0RlZGljYXRlZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UuaXNPZmZpY2lhbFZhbHZlU2VydmVyID09PSB0cnVlKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDMyKS5ib29sKG1lc3NhZ2UuaXNPZmZpY2lhbFZhbHZlU2VydmVyKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5pc0hsdHYgPT09IHRydWUpIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoNDApLmJvb2wobWVzc2FnZS5pc0hsdHYpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLmlzUmVwbGF5ID09PSB0cnVlKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDQ4KS5ib29sKG1lc3NhZ2UuaXNSZXBsYXkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLmlzUmVkaXJlY3RpbmdUb1Byb3h5UmVsYXkgPT09IHRydWUpIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMTY4KS5ib29sKG1lc3NhZ2UuaXNSZWRpcmVjdGluZ1RvUHJveHlSZWxheSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UuY09zICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDU2KS5pbnQzMihtZXNzYWdlLmNPcyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UubWFwQ3JjICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDY5KS5maXhlZDMyKG1lc3NhZ2UubWFwQ3JjKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5jbGllbnRDcmMgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoNzcpLmZpeGVkMzIobWVzc2FnZS5jbGllbnRDcmMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLnN0cmluZ1RhYmxlQ3JjICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDg1KS5maXhlZDMyKG1lc3NhZ2Uuc3RyaW5nVGFibGVDcmMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLm1heENsaWVudHMgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoODgpLmludDMyKG1lc3NhZ2UubWF4Q2xpZW50cyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UubWF4Q2xhc3NlcyAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig5NikuaW50MzIobWVzc2FnZS5tYXhDbGFzc2VzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5wbGF5ZXJTbG90ICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDEwNCkuaW50MzIobWVzc2FnZS5wbGF5ZXJTbG90KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS50aWNrSW50ZXJ2YWwgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMTE3KS5mbG9hdChtZXNzYWdlLnRpY2tJbnRlcnZhbCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UuZ2FtZURpciAhPT0gXCJcIikge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigxMjIpLnN0cmluZyhtZXNzYWdlLmdhbWVEaXIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLm1hcE5hbWUgIT09IFwiXCIpIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMTMwKS5zdHJpbmcobWVzc2FnZS5tYXBOYW1lKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5tYXBHcm91cE5hbWUgIT09IFwiXCIpIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMTM4KS5zdHJpbmcobWVzc2FnZS5tYXBHcm91cE5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLnNreU5hbWUgIT09IFwiXCIpIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMTQ2KS5zdHJpbmcobWVzc2FnZS5za3lOYW1lKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5ob3N0TmFtZSAhPT0gXCJcIikge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigxNTQpLnN0cmluZyhtZXNzYWdlLmhvc3ROYW1lKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5wdWJsaWNJcCAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigxNjApLnVpbnQzMihtZXNzYWdlLnB1YmxpY0lwKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIW1lc3NhZ2UudWdjTWFwSWQuaXNaZXJvKCkpIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMTc2KS51aW50NjQobWVzc2FnZS51Z2NNYXBJZCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9LFxuICAgIGRlY29kZShpbnB1dCwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IGlucHV0IGluc3RhbmNlb2YgbWluaW1hbF8xLlJlYWRlciA/IGlucHV0IDogbmV3IG1pbmltYWxfMS5SZWFkZXIoaW5wdXQpO1xuICAgICAgICBsZXQgZW5kID0gbGVuZ3RoID09PSB1bmRlZmluZWQgPyByZWFkZXIubGVuIDogcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDU1ZDTXNnU2VydmVySW5mbygpO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UucHJvdG9jb2wgPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnNlcnZlckNvdW50ID0gcmVhZGVyLmludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5pc0RlZGljYXRlZCA9IHJlYWRlci5ib29sKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5pc09mZmljaWFsVmFsdmVTZXJ2ZXIgPSByZWFkZXIuYm9vbCgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuaXNIbHR2ID0gcmVhZGVyLmJvb2woKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmlzUmVwbGF5ID0gcmVhZGVyLmJvb2woKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAyMTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5pc1JlZGlyZWN0aW5nVG9Qcm94eVJlbGF5ID0gcmVhZGVyLmJvb2woKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA3OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmNPcyA9IHJlYWRlci5pbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDg6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UubWFwQ3JjID0gcmVhZGVyLmZpeGVkMzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA5OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmNsaWVudENyYyA9IHJlYWRlci5maXhlZDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMTA6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Uuc3RyaW5nVGFibGVDcmMgPSByZWFkZXIuZml4ZWQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDExOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLm1heENsaWVudHMgPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAxMjpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5tYXhDbGFzc2VzID0gcmVhZGVyLmludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMTM6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UucGxheWVyU2xvdCA9IHJlYWRlci5pbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDE0OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnRpY2tJbnRlcnZhbCA9IHJlYWRlci5mbG9hdCgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDE1OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmdhbWVEaXIgPSByZWFkZXIuc3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMTY6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UubWFwTmFtZSA9IHJlYWRlci5zdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAxNzpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5tYXBHcm91cE5hbWUgPSByZWFkZXIuc3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMTg6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Uuc2t5TmFtZSA9IHJlYWRlci5zdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAxOTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5ob3N0TmFtZSA9IHJlYWRlci5zdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAyMDpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5wdWJsaWNJcCA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAyMjpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS51Z2NNYXBJZCA9IHJlYWRlci51aW50NjQoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmVhZGVyLnNraXBUeXBlKHRhZyAmIDcpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9LFxuICAgIGZyb21QYXJ0aWFsKG9iamVjdCkge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYywgX2QsIF9lLCBfZiwgX2csIF9oLCBfaiwgX2ssIF9sLCBfbSwgX28sIF9wLCBfcSwgX3IsIF9zLCBfdCwgX3UsIF92LCBfdztcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDU1ZDTXNnU2VydmVySW5mbygpO1xuICAgICAgICBtZXNzYWdlLnByb3RvY29sID0gKF9hID0gb2JqZWN0LnByb3RvY29sKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAwO1xuICAgICAgICBtZXNzYWdlLnNlcnZlckNvdW50ID0gKF9iID0gb2JqZWN0LnNlcnZlckNvdW50KSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAwO1xuICAgICAgICBtZXNzYWdlLmlzRGVkaWNhdGVkID0gKF9jID0gb2JqZWN0LmlzRGVkaWNhdGVkKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiBmYWxzZTtcbiAgICAgICAgbWVzc2FnZS5pc09mZmljaWFsVmFsdmVTZXJ2ZXIgPSAoX2QgPSBvYmplY3QuaXNPZmZpY2lhbFZhbHZlU2VydmVyKSAhPT0gbnVsbCAmJiBfZCAhPT0gdm9pZCAwID8gX2QgOiBmYWxzZTtcbiAgICAgICAgbWVzc2FnZS5pc0hsdHYgPSAoX2UgPSBvYmplY3QuaXNIbHR2KSAhPT0gbnVsbCAmJiBfZSAhPT0gdm9pZCAwID8gX2UgOiBmYWxzZTtcbiAgICAgICAgbWVzc2FnZS5pc1JlcGxheSA9IChfZiA9IG9iamVjdC5pc1JlcGxheSkgIT09IG51bGwgJiYgX2YgIT09IHZvaWQgMCA/IF9mIDogZmFsc2U7XG4gICAgICAgIG1lc3NhZ2UuaXNSZWRpcmVjdGluZ1RvUHJveHlSZWxheSA9XG4gICAgICAgICAgICAoX2cgPSBvYmplY3QuaXNSZWRpcmVjdGluZ1RvUHJveHlSZWxheSkgIT09IG51bGwgJiYgX2cgIT09IHZvaWQgMCA/IF9nIDogZmFsc2U7XG4gICAgICAgIG1lc3NhZ2UuY09zID0gKF9oID0gb2JqZWN0LmNPcykgIT09IG51bGwgJiYgX2ggIT09IHZvaWQgMCA/IF9oIDogMDtcbiAgICAgICAgbWVzc2FnZS5tYXBDcmMgPSAoX2ogPSBvYmplY3QubWFwQ3JjKSAhPT0gbnVsbCAmJiBfaiAhPT0gdm9pZCAwID8gX2ogOiAwO1xuICAgICAgICBtZXNzYWdlLmNsaWVudENyYyA9IChfayA9IG9iamVjdC5jbGllbnRDcmMpICE9PSBudWxsICYmIF9rICE9PSB2b2lkIDAgPyBfayA6IDA7XG4gICAgICAgIG1lc3NhZ2Uuc3RyaW5nVGFibGVDcmMgPSAoX2wgPSBvYmplY3Quc3RyaW5nVGFibGVDcmMpICE9PSBudWxsICYmIF9sICE9PSB2b2lkIDAgPyBfbCA6IDA7XG4gICAgICAgIG1lc3NhZ2UubWF4Q2xpZW50cyA9IChfbSA9IG9iamVjdC5tYXhDbGllbnRzKSAhPT0gbnVsbCAmJiBfbSAhPT0gdm9pZCAwID8gX20gOiAwO1xuICAgICAgICBtZXNzYWdlLm1heENsYXNzZXMgPSAoX28gPSBvYmplY3QubWF4Q2xhc3NlcykgIT09IG51bGwgJiYgX28gIT09IHZvaWQgMCA/IF9vIDogMDtcbiAgICAgICAgbWVzc2FnZS5wbGF5ZXJTbG90ID0gKF9wID0gb2JqZWN0LnBsYXllclNsb3QpICE9PSBudWxsICYmIF9wICE9PSB2b2lkIDAgPyBfcCA6IDA7XG4gICAgICAgIG1lc3NhZ2UudGlja0ludGVydmFsID0gKF9xID0gb2JqZWN0LnRpY2tJbnRlcnZhbCkgIT09IG51bGwgJiYgX3EgIT09IHZvaWQgMCA/IF9xIDogMDtcbiAgICAgICAgbWVzc2FnZS5nYW1lRGlyID0gKF9yID0gb2JqZWN0LmdhbWVEaXIpICE9PSBudWxsICYmIF9yICE9PSB2b2lkIDAgPyBfciA6IFwiXCI7XG4gICAgICAgIG1lc3NhZ2UubWFwTmFtZSA9IChfcyA9IG9iamVjdC5tYXBOYW1lKSAhPT0gbnVsbCAmJiBfcyAhPT0gdm9pZCAwID8gX3MgOiBcIlwiO1xuICAgICAgICBtZXNzYWdlLm1hcEdyb3VwTmFtZSA9IChfdCA9IG9iamVjdC5tYXBHcm91cE5hbWUpICE9PSBudWxsICYmIF90ICE9PSB2b2lkIDAgPyBfdCA6IFwiXCI7XG4gICAgICAgIG1lc3NhZ2Uuc2t5TmFtZSA9IChfdSA9IG9iamVjdC5za3lOYW1lKSAhPT0gbnVsbCAmJiBfdSAhPT0gdm9pZCAwID8gX3UgOiBcIlwiO1xuICAgICAgICBtZXNzYWdlLmhvc3ROYW1lID0gKF92ID0gb2JqZWN0Lmhvc3ROYW1lKSAhPT0gbnVsbCAmJiBfdiAhPT0gdm9pZCAwID8gX3YgOiBcIlwiO1xuICAgICAgICBtZXNzYWdlLnB1YmxpY0lwID0gKF93ID0gb2JqZWN0LnB1YmxpY0lwKSAhPT0gbnVsbCAmJiBfdyAhPT0gdm9pZCAwID8gX3cgOiAwO1xuICAgICAgICBtZXNzYWdlLnVnY01hcElkID1cbiAgICAgICAgICAgIG9iamVjdC51Z2NNYXBJZCAhPT0gdW5kZWZpbmVkICYmIG9iamVjdC51Z2NNYXBJZCAhPT0gbnVsbFxuICAgICAgICAgICAgICAgID8gTG9uZy5mcm9tVmFsdWUob2JqZWN0LnVnY01hcElkKVxuICAgICAgICAgICAgICAgIDogTG9uZy5VWkVSTztcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxufTtcbmZ1bmN0aW9uIGNyZWF0ZUJhc2VDU1ZDTXNnQ2xhc3NJbmZvKCkge1xuICAgIHJldHVybiB7IGNyZWF0ZU9uQ2xpZW50OiBmYWxzZSwgY2xhc3NlczogW10gfTtcbn1cbmV4cG9ydHMuQ1NWQ01zZ0NsYXNzSW5mbyA9IHtcbiAgICBlbmNvZGUobWVzc2FnZSwgd3JpdGVyID0gbWluaW1hbF8xLldyaXRlci5jcmVhdGUoKSkge1xuICAgICAgICBpZiAobWVzc2FnZS5jcmVhdGVPbkNsaWVudCA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig4KS5ib29sKG1lc3NhZ2UuY3JlYXRlT25DbGllbnQpO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3QgdiBvZiBtZXNzYWdlLmNsYXNzZXMpIHtcbiAgICAgICAgICAgIGV4cG9ydHMuQ1NWQ01zZ0NsYXNzSW5mb19jbGFzc1QuZW5jb2RlKHYsIHdyaXRlci51aW50MzIoMTgpLmZvcmsoKSkubGRlbGltKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9LFxuICAgIGRlY29kZShpbnB1dCwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IGlucHV0IGluc3RhbmNlb2YgbWluaW1hbF8xLlJlYWRlciA/IGlucHV0IDogbmV3IG1pbmltYWxfMS5SZWFkZXIoaW5wdXQpO1xuICAgICAgICBsZXQgZW5kID0gbGVuZ3RoID09PSB1bmRlZmluZWQgPyByZWFkZXIubGVuIDogcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDU1ZDTXNnQ2xhc3NJbmZvKCk7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBjb25zdCB0YWcgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKHRhZyA+Pj4gMykge1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5jcmVhdGVPbkNsaWVudCA9IHJlYWRlci5ib29sKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5jbGFzc2VzLnB1c2goZXhwb3J0cy5DU1ZDTXNnQ2xhc3NJbmZvX2NsYXNzVC5kZWNvZGUocmVhZGVyLCByZWFkZXIudWludDMyKCkpKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmVhZGVyLnNraXBUeXBlKHRhZyAmIDcpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9LFxuICAgIGZyb21QYXJ0aWFsKG9iamVjdCkge1xuICAgICAgICB2YXIgX2EsIF9iO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNTVkNNc2dDbGFzc0luZm8oKTtcbiAgICAgICAgbWVzc2FnZS5jcmVhdGVPbkNsaWVudCA9IChfYSA9IG9iamVjdC5jcmVhdGVPbkNsaWVudCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogZmFsc2U7XG4gICAgICAgIG1lc3NhZ2UuY2xhc3NlcyA9XG4gICAgICAgICAgICAoKF9iID0gb2JqZWN0LmNsYXNzZXMpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5tYXAoZSA9PiBleHBvcnRzLkNTVkNNc2dDbGFzc0luZm9fY2xhc3NULmZyb21QYXJ0aWFsKGUpKSkgfHwgW107XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbn07XG5mdW5jdGlvbiBjcmVhdGVCYXNlQ1NWQ01zZ0NsYXNzSW5mb19jbGFzc1QoKSB7XG4gICAgcmV0dXJuIHsgY2xhc3NJZDogMCwgZGF0YVRhYmxlTmFtZTogXCJcIiwgY2xhc3NOYW1lOiBcIlwiIH07XG59XG5leHBvcnRzLkNTVkNNc2dDbGFzc0luZm9fY2xhc3NUID0ge1xuICAgIGVuY29kZShtZXNzYWdlLCB3cml0ZXIgPSBtaW5pbWFsXzEuV3JpdGVyLmNyZWF0ZSgpKSB7XG4gICAgICAgIGlmIChtZXNzYWdlLmNsYXNzSWQgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoOCkuaW50MzIobWVzc2FnZS5jbGFzc0lkKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5kYXRhVGFibGVOYW1lICE9PSBcIlwiKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDE4KS5zdHJpbmcobWVzc2FnZS5kYXRhVGFibGVOYW1lKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5jbGFzc05hbWUgIT09IFwiXCIpIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMjYpLnN0cmluZyhtZXNzYWdlLmNsYXNzTmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9LFxuICAgIGRlY29kZShpbnB1dCwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IGlucHV0IGluc3RhbmNlb2YgbWluaW1hbF8xLlJlYWRlciA/IGlucHV0IDogbmV3IG1pbmltYWxfMS5SZWFkZXIoaW5wdXQpO1xuICAgICAgICBsZXQgZW5kID0gbGVuZ3RoID09PSB1bmRlZmluZWQgPyByZWFkZXIubGVuIDogcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDU1ZDTXNnQ2xhc3NJbmZvX2NsYXNzVCgpO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuY2xhc3NJZCA9IHJlYWRlci5pbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZGF0YVRhYmxlTmFtZSA9IHJlYWRlci5zdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmNsYXNzTmFtZSA9IHJlYWRlci5zdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmVhZGVyLnNraXBUeXBlKHRhZyAmIDcpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9LFxuICAgIGZyb21QYXJ0aWFsKG9iamVjdCkge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYztcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDU1ZDTXNnQ2xhc3NJbmZvX2NsYXNzVCgpO1xuICAgICAgICBtZXNzYWdlLmNsYXNzSWQgPSAoX2EgPSBvYmplY3QuY2xhc3NJZCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMDtcbiAgICAgICAgbWVzc2FnZS5kYXRhVGFibGVOYW1lID0gKF9iID0gb2JqZWN0LmRhdGFUYWJsZU5hbWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IFwiXCI7XG4gICAgICAgIG1lc3NhZ2UuY2xhc3NOYW1lID0gKF9jID0gb2JqZWN0LmNsYXNzTmFtZSkgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogXCJcIjtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxufTtcbmZ1bmN0aW9uIGNyZWF0ZUJhc2VDU1ZDTXNnU2VuZFRhYmxlKCkge1xuICAgIHJldHVybiB7IGlzRW5kOiBmYWxzZSwgbmV0VGFibGVOYW1lOiBcIlwiLCBuZWVkc0RlY29kZXI6IGZhbHNlLCBwcm9wczogW10gfTtcbn1cbmV4cG9ydHMuQ1NWQ01zZ1NlbmRUYWJsZSA9IHtcbiAgICBlbmNvZGUobWVzc2FnZSwgd3JpdGVyID0gbWluaW1hbF8xLldyaXRlci5jcmVhdGUoKSkge1xuICAgICAgICBpZiAobWVzc2FnZS5pc0VuZCA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig4KS5ib29sKG1lc3NhZ2UuaXNFbmQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLm5ldFRhYmxlTmFtZSAhPT0gXCJcIikge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigxOCkuc3RyaW5nKG1lc3NhZ2UubmV0VGFibGVOYW1lKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5uZWVkc0RlY29kZXIgPT09IHRydWUpIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMjQpLmJvb2wobWVzc2FnZS5uZWVkc0RlY29kZXIpO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3QgdiBvZiBtZXNzYWdlLnByb3BzKSB7XG4gICAgICAgICAgICBleHBvcnRzLkNTVkNNc2dTZW5kVGFibGVfc2VuZHByb3BULmVuY29kZSh2LCB3cml0ZXIudWludDMyKDM0KS5mb3JrKCkpLmxkZWxpbSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfSxcbiAgICBkZWNvZGUoaW5wdXQsIGxlbmd0aCkge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBpbnB1dCBpbnN0YW5jZW9mIG1pbmltYWxfMS5SZWFkZXIgPyBpbnB1dCA6IG5ldyBtaW5pbWFsXzEuUmVhZGVyKGlucHV0KTtcbiAgICAgICAgbGV0IGVuZCA9IGxlbmd0aCA9PT0gdW5kZWZpbmVkID8gcmVhZGVyLmxlbiA6IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ1NWQ01zZ1NlbmRUYWJsZSgpO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuaXNFbmQgPSByZWFkZXIuYm9vbCgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UubmV0VGFibGVOYW1lID0gcmVhZGVyLnN0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UubmVlZHNEZWNvZGVyID0gcmVhZGVyLmJvb2woKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnByb3BzLnB1c2goZXhwb3J0cy5DU1ZDTXNnU2VuZFRhYmxlX3NlbmRwcm9wVC5kZWNvZGUocmVhZGVyLCByZWFkZXIudWludDMyKCkpKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmVhZGVyLnNraXBUeXBlKHRhZyAmIDcpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9LFxuICAgIGZyb21QYXJ0aWFsKG9iamVjdCkge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYywgX2Q7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ1NWQ01zZ1NlbmRUYWJsZSgpO1xuICAgICAgICBtZXNzYWdlLmlzRW5kID0gKF9hID0gb2JqZWN0LmlzRW5kKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBmYWxzZTtcbiAgICAgICAgbWVzc2FnZS5uZXRUYWJsZU5hbWUgPSAoX2IgPSBvYmplY3QubmV0VGFibGVOYW1lKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBcIlwiO1xuICAgICAgICBtZXNzYWdlLm5lZWRzRGVjb2RlciA9IChfYyA9IG9iamVjdC5uZWVkc0RlY29kZXIpICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IGZhbHNlO1xuICAgICAgICBtZXNzYWdlLnByb3BzID1cbiAgICAgICAgICAgICgoX2QgPSBvYmplY3QucHJvcHMpID09PSBudWxsIHx8IF9kID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZC5tYXAoZSA9PiBleHBvcnRzLkNTVkNNc2dTZW5kVGFibGVfc2VuZHByb3BULmZyb21QYXJ0aWFsKGUpKSkgfHwgW107XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbn07XG5mdW5jdGlvbiBjcmVhdGVCYXNlQ1NWQ01zZ1NlbmRUYWJsZV9zZW5kcHJvcFQoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogMCxcbiAgICAgICAgdmFyTmFtZTogXCJcIixcbiAgICAgICAgZmxhZ3M6IDAsXG4gICAgICAgIHByaW9yaXR5OiAwLFxuICAgICAgICBkdE5hbWU6IFwiXCIsXG4gICAgICAgIG51bUVsZW1lbnRzOiAwLFxuICAgICAgICBsb3dWYWx1ZTogMCxcbiAgICAgICAgaGlnaFZhbHVlOiAwLFxuICAgICAgICBudW1CaXRzOiAwXG4gICAgfTtcbn1cbmV4cG9ydHMuQ1NWQ01zZ1NlbmRUYWJsZV9zZW5kcHJvcFQgPSB7XG4gICAgZW5jb2RlKG1lc3NhZ2UsIHdyaXRlciA9IG1pbmltYWxfMS5Xcml0ZXIuY3JlYXRlKCkpIHtcbiAgICAgICAgaWYgKG1lc3NhZ2UudHlwZSAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig4KS5pbnQzMihtZXNzYWdlLnR5cGUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLnZhck5hbWUgIT09IFwiXCIpIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMTgpLnN0cmluZyhtZXNzYWdlLnZhck5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLmZsYWdzICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDI0KS5pbnQzMihtZXNzYWdlLmZsYWdzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5wcmlvcml0eSAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigzMikuaW50MzIobWVzc2FnZS5wcmlvcml0eSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UuZHROYW1lICE9PSBcIlwiKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDQyKS5zdHJpbmcobWVzc2FnZS5kdE5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLm51bUVsZW1lbnRzICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDQ4KS5pbnQzMihtZXNzYWdlLm51bUVsZW1lbnRzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5sb3dWYWx1ZSAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig2MSkuZmxvYXQobWVzc2FnZS5sb3dWYWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UuaGlnaFZhbHVlICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDY5KS5mbG9hdChtZXNzYWdlLmhpZ2hWYWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UubnVtQml0cyAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig3MikuaW50MzIobWVzc2FnZS5udW1CaXRzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH0sXG4gICAgZGVjb2RlKGlucHV0LCBsZW5ndGgpIHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gaW5wdXQgaW5zdGFuY2VvZiBtaW5pbWFsXzEuUmVhZGVyID8gaW5wdXQgOiBuZXcgbWluaW1hbF8xLlJlYWRlcihpbnB1dCk7XG4gICAgICAgIGxldCBlbmQgPSBsZW5ndGggPT09IHVuZGVmaW5lZCA/IHJlYWRlci5sZW4gOiByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNTVkNNc2dTZW5kVGFibGVfc2VuZHByb3BUKCk7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBjb25zdCB0YWcgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKHRhZyA+Pj4gMykge1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS50eXBlID0gcmVhZGVyLmludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS52YXJOYW1lID0gcmVhZGVyLnN0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZmxhZ3MgPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnByaW9yaXR5ID0gcmVhZGVyLmludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5kdE5hbWUgPSByZWFkZXIuc3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5udW1FbGVtZW50cyA9IHJlYWRlci5pbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UubG93VmFsdWUgPSByZWFkZXIuZmxvYXQoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA4OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmhpZ2hWYWx1ZSA9IHJlYWRlci5mbG9hdCgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDk6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UubnVtQml0cyA9IHJlYWRlci5pbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICByZWFkZXIuc2tpcFR5cGUodGFnICYgNyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH0sXG4gICAgZnJvbVBhcnRpYWwob2JqZWN0KSB7XG4gICAgICAgIHZhciBfYSwgX2IsIF9jLCBfZCwgX2UsIF9mLCBfZywgX2gsIF9qO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNTVkNNc2dTZW5kVGFibGVfc2VuZHByb3BUKCk7XG4gICAgICAgIG1lc3NhZ2UudHlwZSA9IChfYSA9IG9iamVjdC50eXBlKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAwO1xuICAgICAgICBtZXNzYWdlLnZhck5hbWUgPSAoX2IgPSBvYmplY3QudmFyTmFtZSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogXCJcIjtcbiAgICAgICAgbWVzc2FnZS5mbGFncyA9IChfYyA9IG9iamVjdC5mbGFncykgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogMDtcbiAgICAgICAgbWVzc2FnZS5wcmlvcml0eSA9IChfZCA9IG9iamVjdC5wcmlvcml0eSkgIT09IG51bGwgJiYgX2QgIT09IHZvaWQgMCA/IF9kIDogMDtcbiAgICAgICAgbWVzc2FnZS5kdE5hbWUgPSAoX2UgPSBvYmplY3QuZHROYW1lKSAhPT0gbnVsbCAmJiBfZSAhPT0gdm9pZCAwID8gX2UgOiBcIlwiO1xuICAgICAgICBtZXNzYWdlLm51bUVsZW1lbnRzID0gKF9mID0gb2JqZWN0Lm51bUVsZW1lbnRzKSAhPT0gbnVsbCAmJiBfZiAhPT0gdm9pZCAwID8gX2YgOiAwO1xuICAgICAgICBtZXNzYWdlLmxvd1ZhbHVlID0gKF9nID0gb2JqZWN0Lmxvd1ZhbHVlKSAhPT0gbnVsbCAmJiBfZyAhPT0gdm9pZCAwID8gX2cgOiAwO1xuICAgICAgICBtZXNzYWdlLmhpZ2hWYWx1ZSA9IChfaCA9IG9iamVjdC5oaWdoVmFsdWUpICE9PSBudWxsICYmIF9oICE9PSB2b2lkIDAgPyBfaCA6IDA7XG4gICAgICAgIG1lc3NhZ2UubnVtQml0cyA9IChfaiA9IG9iamVjdC5udW1CaXRzKSAhPT0gbnVsbCAmJiBfaiAhPT0gdm9pZCAwID8gX2ogOiAwO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG59O1xuZnVuY3Rpb24gY3JlYXRlQmFzZUNTVkNNc2dQcmludCgpIHtcbiAgICByZXR1cm4geyB0ZXh0OiBcIlwiIH07XG59XG5leHBvcnRzLkNTVkNNc2dQcmludCA9IHtcbiAgICBlbmNvZGUobWVzc2FnZSwgd3JpdGVyID0gbWluaW1hbF8xLldyaXRlci5jcmVhdGUoKSkge1xuICAgICAgICBpZiAobWVzc2FnZS50ZXh0ICE9PSBcIlwiKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDEwKS5zdHJpbmcobWVzc2FnZS50ZXh0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH0sXG4gICAgZGVjb2RlKGlucHV0LCBsZW5ndGgpIHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gaW5wdXQgaW5zdGFuY2VvZiBtaW5pbWFsXzEuUmVhZGVyID8gaW5wdXQgOiBuZXcgbWluaW1hbF8xLlJlYWRlcihpbnB1dCk7XG4gICAgICAgIGxldCBlbmQgPSBsZW5ndGggPT09IHVuZGVmaW5lZCA/IHJlYWRlci5sZW4gOiByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNTVkNNc2dQcmludCgpO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudGV4dCA9IHJlYWRlci5zdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmVhZGVyLnNraXBUeXBlKHRhZyAmIDcpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9LFxuICAgIGZyb21QYXJ0aWFsKG9iamVjdCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ1NWQ01zZ1ByaW50KCk7XG4gICAgICAgIG1lc3NhZ2UudGV4dCA9IChfYSA9IG9iamVjdC50ZXh0KSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBcIlwiO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG59O1xuZnVuY3Rpb24gY3JlYXRlQmFzZUNTVkNNc2dTZXRQYXVzZSgpIHtcbiAgICByZXR1cm4geyBwYXVzZWQ6IGZhbHNlIH07XG59XG5leHBvcnRzLkNTVkNNc2dTZXRQYXVzZSA9IHtcbiAgICBlbmNvZGUobWVzc2FnZSwgd3JpdGVyID0gbWluaW1hbF8xLldyaXRlci5jcmVhdGUoKSkge1xuICAgICAgICBpZiAobWVzc2FnZS5wYXVzZWQgPT09IHRydWUpIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoOCkuYm9vbChtZXNzYWdlLnBhdXNlZCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9LFxuICAgIGRlY29kZShpbnB1dCwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IGlucHV0IGluc3RhbmNlb2YgbWluaW1hbF8xLlJlYWRlciA/IGlucHV0IDogbmV3IG1pbmltYWxfMS5SZWFkZXIoaW5wdXQpO1xuICAgICAgICBsZXQgZW5kID0gbGVuZ3RoID09PSB1bmRlZmluZWQgPyByZWFkZXIubGVuIDogcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDU1ZDTXNnU2V0UGF1c2UoKTtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhZyA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgIHN3aXRjaCAodGFnID4+PiAzKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnBhdXNlZCA9IHJlYWRlci5ib29sKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJlYWRlci5za2lwVHlwZSh0YWcgJiA3KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfSxcbiAgICBmcm9tUGFydGlhbChvYmplY3QpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNTVkNNc2dTZXRQYXVzZSgpO1xuICAgICAgICBtZXNzYWdlLnBhdXNlZCA9IChfYSA9IG9iamVjdC5wYXVzZWQpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IGZhbHNlO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG59O1xuZnVuY3Rpb24gY3JlYXRlQmFzZUNTVkNNc2dTZXRWaWV3KCkge1xuICAgIHJldHVybiB7IGVudGl0eUluZGV4OiAwIH07XG59XG5leHBvcnRzLkNTVkNNc2dTZXRWaWV3ID0ge1xuICAgIGVuY29kZShtZXNzYWdlLCB3cml0ZXIgPSBtaW5pbWFsXzEuV3JpdGVyLmNyZWF0ZSgpKSB7XG4gICAgICAgIGlmIChtZXNzYWdlLmVudGl0eUluZGV4ICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDgpLmludDMyKG1lc3NhZ2UuZW50aXR5SW5kZXgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfSxcbiAgICBkZWNvZGUoaW5wdXQsIGxlbmd0aCkge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBpbnB1dCBpbnN0YW5jZW9mIG1pbmltYWxfMS5SZWFkZXIgPyBpbnB1dCA6IG5ldyBtaW5pbWFsXzEuUmVhZGVyKGlucHV0KTtcbiAgICAgICAgbGV0IGVuZCA9IGxlbmd0aCA9PT0gdW5kZWZpbmVkID8gcmVhZGVyLmxlbiA6IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ1NWQ01zZ1NldFZpZXcoKTtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhZyA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgIHN3aXRjaCAodGFnID4+PiAzKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmVudGl0eUluZGV4ID0gcmVhZGVyLmludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJlYWRlci5za2lwVHlwZSh0YWcgJiA3KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfSxcbiAgICBmcm9tUGFydGlhbChvYmplY3QpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNTVkNNc2dTZXRWaWV3KCk7XG4gICAgICAgIG1lc3NhZ2UuZW50aXR5SW5kZXggPSAoX2EgPSBvYmplY3QuZW50aXR5SW5kZXgpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IDA7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbn07XG5mdW5jdGlvbiBjcmVhdGVCYXNlQ1NWQ01zZ0NyZWF0ZVN0cmluZ1RhYmxlKCkge1xuICAgIHJldHVybiB7XG4gICAgICAgIG5hbWU6IFwiXCIsXG4gICAgICAgIG1heEVudHJpZXM6IDAsXG4gICAgICAgIG51bUVudHJpZXM6IDAsXG4gICAgICAgIHVzZXJEYXRhRml4ZWRTaXplOiBmYWxzZSxcbiAgICAgICAgdXNlckRhdGFTaXplOiAwLFxuICAgICAgICB1c2VyRGF0YVNpemVCaXRzOiAwLFxuICAgICAgICBmbGFnczogMCxcbiAgICAgICAgc3RyaW5nRGF0YTogbmV3IFVpbnQ4QXJyYXkoKVxuICAgIH07XG59XG5leHBvcnRzLkNTVkNNc2dDcmVhdGVTdHJpbmdUYWJsZSA9IHtcbiAgICBlbmNvZGUobWVzc2FnZSwgd3JpdGVyID0gbWluaW1hbF8xLldyaXRlci5jcmVhdGUoKSkge1xuICAgICAgICBpZiAobWVzc2FnZS5uYW1lICE9PSBcIlwiKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDEwKS5zdHJpbmcobWVzc2FnZS5uYW1lKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5tYXhFbnRyaWVzICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDE2KS5pbnQzMihtZXNzYWdlLm1heEVudHJpZXMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLm51bUVudHJpZXMgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMjQpLmludDMyKG1lc3NhZ2UubnVtRW50cmllcyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UudXNlckRhdGFGaXhlZFNpemUgPT09IHRydWUpIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMzIpLmJvb2wobWVzc2FnZS51c2VyRGF0YUZpeGVkU2l6ZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UudXNlckRhdGFTaXplICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDQwKS5pbnQzMihtZXNzYWdlLnVzZXJEYXRhU2l6ZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UudXNlckRhdGFTaXplQml0cyAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig0OCkuaW50MzIobWVzc2FnZS51c2VyRGF0YVNpemVCaXRzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5mbGFncyAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig1NikuaW50MzIobWVzc2FnZS5mbGFncyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2Uuc3RyaW5nRGF0YS5sZW5ndGggIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoNjYpLmJ5dGVzKG1lc3NhZ2Uuc3RyaW5nRGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9LFxuICAgIGRlY29kZShpbnB1dCwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IGlucHV0IGluc3RhbmNlb2YgbWluaW1hbF8xLlJlYWRlciA/IGlucHV0IDogbmV3IG1pbmltYWxfMS5SZWFkZXIoaW5wdXQpO1xuICAgICAgICBsZXQgZW5kID0gbGVuZ3RoID09PSB1bmRlZmluZWQgPyByZWFkZXIubGVuIDogcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDU1ZDTXNnQ3JlYXRlU3RyaW5nVGFibGUoKTtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhZyA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgIHN3aXRjaCAodGFnID4+PiAzKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLm5hbWUgPSByZWFkZXIuc3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5tYXhFbnRyaWVzID0gcmVhZGVyLmludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5udW1FbnRyaWVzID0gcmVhZGVyLmludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS51c2VyRGF0YUZpeGVkU2l6ZSA9IHJlYWRlci5ib29sKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS51c2VyRGF0YVNpemUgPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnVzZXJEYXRhU2l6ZUJpdHMgPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA3OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmZsYWdzID0gcmVhZGVyLmludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgODpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5zdHJpbmdEYXRhID0gcmVhZGVyLmJ5dGVzKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJlYWRlci5za2lwVHlwZSh0YWcgJiA3KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfSxcbiAgICBmcm9tUGFydGlhbChvYmplY3QpIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2MsIF9kLCBfZSwgX2YsIF9nLCBfaDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDU1ZDTXNnQ3JlYXRlU3RyaW5nVGFibGUoKTtcbiAgICAgICAgbWVzc2FnZS5uYW1lID0gKF9hID0gb2JqZWN0Lm5hbWUpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IFwiXCI7XG4gICAgICAgIG1lc3NhZ2UubWF4RW50cmllcyA9IChfYiA9IG9iamVjdC5tYXhFbnRyaWVzKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAwO1xuICAgICAgICBtZXNzYWdlLm51bUVudHJpZXMgPSAoX2MgPSBvYmplY3QubnVtRW50cmllcykgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogMDtcbiAgICAgICAgbWVzc2FnZS51c2VyRGF0YUZpeGVkU2l6ZSA9IChfZCA9IG9iamVjdC51c2VyRGF0YUZpeGVkU2l6ZSkgIT09IG51bGwgJiYgX2QgIT09IHZvaWQgMCA/IF9kIDogZmFsc2U7XG4gICAgICAgIG1lc3NhZ2UudXNlckRhdGFTaXplID0gKF9lID0gb2JqZWN0LnVzZXJEYXRhU2l6ZSkgIT09IG51bGwgJiYgX2UgIT09IHZvaWQgMCA/IF9lIDogMDtcbiAgICAgICAgbWVzc2FnZS51c2VyRGF0YVNpemVCaXRzID0gKF9mID0gb2JqZWN0LnVzZXJEYXRhU2l6ZUJpdHMpICE9PSBudWxsICYmIF9mICE9PSB2b2lkIDAgPyBfZiA6IDA7XG4gICAgICAgIG1lc3NhZ2UuZmxhZ3MgPSAoX2cgPSBvYmplY3QuZmxhZ3MpICE9PSBudWxsICYmIF9nICE9PSB2b2lkIDAgPyBfZyA6IDA7XG4gICAgICAgIG1lc3NhZ2Uuc3RyaW5nRGF0YSA9IChfaCA9IG9iamVjdC5zdHJpbmdEYXRhKSAhPT0gbnVsbCAmJiBfaCAhPT0gdm9pZCAwID8gX2ggOiBuZXcgVWludDhBcnJheSgpO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG59O1xuZnVuY3Rpb24gY3JlYXRlQmFzZUNTVkNNc2dVcGRhdGVTdHJpbmdUYWJsZSgpIHtcbiAgICByZXR1cm4geyB0YWJsZUlkOiAwLCBudW1DaGFuZ2VkRW50cmllczogMCwgc3RyaW5nRGF0YTogbmV3IFVpbnQ4QXJyYXkoKSB9O1xufVxuZXhwb3J0cy5DU1ZDTXNnVXBkYXRlU3RyaW5nVGFibGUgPSB7XG4gICAgZW5jb2RlKG1lc3NhZ2UsIHdyaXRlciA9IG1pbmltYWxfMS5Xcml0ZXIuY3JlYXRlKCkpIHtcbiAgICAgICAgaWYgKG1lc3NhZ2UudGFibGVJZCAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig4KS5pbnQzMihtZXNzYWdlLnRhYmxlSWQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLm51bUNoYW5nZWRFbnRyaWVzICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDE2KS5pbnQzMihtZXNzYWdlLm51bUNoYW5nZWRFbnRyaWVzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5zdHJpbmdEYXRhLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigyNikuYnl0ZXMobWVzc2FnZS5zdHJpbmdEYXRhKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH0sXG4gICAgZGVjb2RlKGlucHV0LCBsZW5ndGgpIHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gaW5wdXQgaW5zdGFuY2VvZiBtaW5pbWFsXzEuUmVhZGVyID8gaW5wdXQgOiBuZXcgbWluaW1hbF8xLlJlYWRlcihpbnB1dCk7XG4gICAgICAgIGxldCBlbmQgPSBsZW5ndGggPT09IHVuZGVmaW5lZCA/IHJlYWRlci5sZW4gOiByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNTVkNNc2dVcGRhdGVTdHJpbmdUYWJsZSgpO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudGFibGVJZCA9IHJlYWRlci5pbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UubnVtQ2hhbmdlZEVudHJpZXMgPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnN0cmluZ0RhdGEgPSByZWFkZXIuYnl0ZXMoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmVhZGVyLnNraXBUeXBlKHRhZyAmIDcpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9LFxuICAgIGZyb21QYXJ0aWFsKG9iamVjdCkge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYztcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDU1ZDTXNnVXBkYXRlU3RyaW5nVGFibGUoKTtcbiAgICAgICAgbWVzc2FnZS50YWJsZUlkID0gKF9hID0gb2JqZWN0LnRhYmxlSWQpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IDA7XG4gICAgICAgIG1lc3NhZ2UubnVtQ2hhbmdlZEVudHJpZXMgPSAoX2IgPSBvYmplY3QubnVtQ2hhbmdlZEVudHJpZXMpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IDA7XG4gICAgICAgIG1lc3NhZ2Uuc3RyaW5nRGF0YSA9IChfYyA9IG9iamVjdC5zdHJpbmdEYXRhKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiBuZXcgVWludDhBcnJheSgpO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG59O1xuZnVuY3Rpb24gY3JlYXRlQmFzZUNTVkNNc2dWb2ljZUluaXQoKSB7XG4gICAgcmV0dXJuIHsgcXVhbGl0eTogMCwgY29kZWM6IFwiXCIsIHZlcnNpb246IDAgfTtcbn1cbmV4cG9ydHMuQ1NWQ01zZ1ZvaWNlSW5pdCA9IHtcbiAgICBlbmNvZGUobWVzc2FnZSwgd3JpdGVyID0gbWluaW1hbF8xLldyaXRlci5jcmVhdGUoKSkge1xuICAgICAgICBpZiAobWVzc2FnZS5xdWFsaXR5ICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDgpLmludDMyKG1lc3NhZ2UucXVhbGl0eSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UuY29kZWMgIT09IFwiXCIpIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMTgpLnN0cmluZyhtZXNzYWdlLmNvZGVjKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS52ZXJzaW9uICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDI0KS5pbnQzMihtZXNzYWdlLnZlcnNpb24pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfSxcbiAgICBkZWNvZGUoaW5wdXQsIGxlbmd0aCkge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBpbnB1dCBpbnN0YW5jZW9mIG1pbmltYWxfMS5SZWFkZXIgPyBpbnB1dCA6IG5ldyBtaW5pbWFsXzEuUmVhZGVyKGlucHV0KTtcbiAgICAgICAgbGV0IGVuZCA9IGxlbmd0aCA9PT0gdW5kZWZpbmVkID8gcmVhZGVyLmxlbiA6IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ1NWQ01zZ1ZvaWNlSW5pdCgpO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UucXVhbGl0eSA9IHJlYWRlci5pbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuY29kZWMgPSByZWFkZXIuc3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS52ZXJzaW9uID0gcmVhZGVyLmludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJlYWRlci5za2lwVHlwZSh0YWcgJiA3KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfSxcbiAgICBmcm9tUGFydGlhbChvYmplY3QpIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2M7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ1NWQ01zZ1ZvaWNlSW5pdCgpO1xuICAgICAgICBtZXNzYWdlLnF1YWxpdHkgPSAoX2EgPSBvYmplY3QucXVhbGl0eSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMDtcbiAgICAgICAgbWVzc2FnZS5jb2RlYyA9IChfYiA9IG9iamVjdC5jb2RlYykgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogXCJcIjtcbiAgICAgICAgbWVzc2FnZS52ZXJzaW9uID0gKF9jID0gb2JqZWN0LnZlcnNpb24pICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IDA7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbn07XG5mdW5jdGlvbiBjcmVhdGVCYXNlQ1NWQ01zZ1ZvaWNlRGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBjbGllbnQ6IDAsXG4gICAgICAgIHByb3hpbWl0eTogZmFsc2UsXG4gICAgICAgIHh1aWQ6IExvbmcuVVpFUk8sXG4gICAgICAgIGF1ZGlibGVNYXNrOiAwLFxuICAgICAgICB2b2ljZURhdGE6IG5ldyBVaW50OEFycmF5KCksXG4gICAgICAgIGNhc3RlcjogZmFsc2UsXG4gICAgICAgIGZvcm1hdDogMCxcbiAgICAgICAgc2VxdWVuY2VCeXRlczogMCxcbiAgICAgICAgc2VjdGlvbk51bWJlcjogMCxcbiAgICAgICAgdW5jb21wcmVzc2VkU2FtcGxlT2Zmc2V0OiAwXG4gICAgfTtcbn1cbmV4cG9ydHMuQ1NWQ01zZ1ZvaWNlRGF0YSA9IHtcbiAgICBlbmNvZGUobWVzc2FnZSwgd3JpdGVyID0gbWluaW1hbF8xLldyaXRlci5jcmVhdGUoKSkge1xuICAgICAgICBpZiAobWVzc2FnZS5jbGllbnQgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoOCkuaW50MzIobWVzc2FnZS5jbGllbnQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLnByb3hpbWl0eSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigxNikuYm9vbChtZXNzYWdlLnByb3hpbWl0eSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFtZXNzYWdlLnh1aWQuaXNaZXJvKCkpIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMjUpLmZpeGVkNjQobWVzc2FnZS54dWlkKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5hdWRpYmxlTWFzayAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigzMikuaW50MzIobWVzc2FnZS5hdWRpYmxlTWFzayk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2Uudm9pY2VEYXRhLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig0MikuYnl0ZXMobWVzc2FnZS52b2ljZURhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLmNhc3RlciA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig0OCkuYm9vbChtZXNzYWdlLmNhc3Rlcik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UuZm9ybWF0ICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDU2KS5pbnQzMihtZXNzYWdlLmZvcm1hdCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2Uuc2VxdWVuY2VCeXRlcyAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig2NCkuaW50MzIobWVzc2FnZS5zZXF1ZW5jZUJ5dGVzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5zZWN0aW9uTnVtYmVyICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDcyKS51aW50MzIobWVzc2FnZS5zZWN0aW9uTnVtYmVyKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS51bmNvbXByZXNzZWRTYW1wbGVPZmZzZXQgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoODApLnVpbnQzMihtZXNzYWdlLnVuY29tcHJlc3NlZFNhbXBsZU9mZnNldCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9LFxuICAgIGRlY29kZShpbnB1dCwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IGlucHV0IGluc3RhbmNlb2YgbWluaW1hbF8xLlJlYWRlciA/IGlucHV0IDogbmV3IG1pbmltYWxfMS5SZWFkZXIoaW5wdXQpO1xuICAgICAgICBsZXQgZW5kID0gbGVuZ3RoID09PSB1bmRlZmluZWQgPyByZWFkZXIubGVuIDogcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDU1ZDTXNnVm9pY2VEYXRhKCk7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBjb25zdCB0YWcgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKHRhZyA+Pj4gMykge1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5jbGllbnQgPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnByb3hpbWl0eSA9IHJlYWRlci5ib29sKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS54dWlkID0gcmVhZGVyLmZpeGVkNjQoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmF1ZGlibGVNYXNrID0gcmVhZGVyLmludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS52b2ljZURhdGEgPSByZWFkZXIuYnl0ZXMoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmNhc3RlciA9IHJlYWRlci5ib29sKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNzpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5mb3JtYXQgPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA4OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnNlcXVlbmNlQnl0ZXMgPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA5OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnNlY3Rpb25OdW1iZXIgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMTA6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudW5jb21wcmVzc2VkU2FtcGxlT2Zmc2V0ID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICByZWFkZXIuc2tpcFR5cGUodGFnICYgNyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH0sXG4gICAgZnJvbVBhcnRpYWwob2JqZWN0KSB7XG4gICAgICAgIHZhciBfYSwgX2IsIF9jLCBfZCwgX2UsIF9mLCBfZywgX2gsIF9qO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNTVkNNc2dWb2ljZURhdGEoKTtcbiAgICAgICAgbWVzc2FnZS5jbGllbnQgPSAoX2EgPSBvYmplY3QuY2xpZW50KSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAwO1xuICAgICAgICBtZXNzYWdlLnByb3hpbWl0eSA9IChfYiA9IG9iamVjdC5wcm94aW1pdHkpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IGZhbHNlO1xuICAgICAgICBtZXNzYWdlLnh1aWQgPVxuICAgICAgICAgICAgb2JqZWN0Lnh1aWQgIT09IHVuZGVmaW5lZCAmJiBvYmplY3QueHVpZCAhPT0gbnVsbFxuICAgICAgICAgICAgICAgID8gTG9uZy5mcm9tVmFsdWUob2JqZWN0Lnh1aWQpXG4gICAgICAgICAgICAgICAgOiBMb25nLlVaRVJPO1xuICAgICAgICBtZXNzYWdlLmF1ZGlibGVNYXNrID0gKF9jID0gb2JqZWN0LmF1ZGlibGVNYXNrKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiAwO1xuICAgICAgICBtZXNzYWdlLnZvaWNlRGF0YSA9IChfZCA9IG9iamVjdC52b2ljZURhdGEpICE9PSBudWxsICYmIF9kICE9PSB2b2lkIDAgPyBfZCA6IG5ldyBVaW50OEFycmF5KCk7XG4gICAgICAgIG1lc3NhZ2UuY2FzdGVyID0gKF9lID0gb2JqZWN0LmNhc3RlcikgIT09IG51bGwgJiYgX2UgIT09IHZvaWQgMCA/IF9lIDogZmFsc2U7XG4gICAgICAgIG1lc3NhZ2UuZm9ybWF0ID0gKF9mID0gb2JqZWN0LmZvcm1hdCkgIT09IG51bGwgJiYgX2YgIT09IHZvaWQgMCA/IF9mIDogMDtcbiAgICAgICAgbWVzc2FnZS5zZXF1ZW5jZUJ5dGVzID0gKF9nID0gb2JqZWN0LnNlcXVlbmNlQnl0ZXMpICE9PSBudWxsICYmIF9nICE9PSB2b2lkIDAgPyBfZyA6IDA7XG4gICAgICAgIG1lc3NhZ2Uuc2VjdGlvbk51bWJlciA9IChfaCA9IG9iamVjdC5zZWN0aW9uTnVtYmVyKSAhPT0gbnVsbCAmJiBfaCAhPT0gdm9pZCAwID8gX2ggOiAwO1xuICAgICAgICBtZXNzYWdlLnVuY29tcHJlc3NlZFNhbXBsZU9mZnNldCA9IChfaiA9IG9iamVjdC51bmNvbXByZXNzZWRTYW1wbGVPZmZzZXQpICE9PSBudWxsICYmIF9qICE9PSB2b2lkIDAgPyBfaiA6IDA7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbn07XG5mdW5jdGlvbiBjcmVhdGVCYXNlQ1NWQ01zZ0ZpeEFuZ2xlKCkge1xuICAgIHJldHVybiB7IHJlbGF0aXZlOiBmYWxzZSwgYW5nbGU6IHVuZGVmaW5lZCB9O1xufVxuZXhwb3J0cy5DU1ZDTXNnRml4QW5nbGUgPSB7XG4gICAgZW5jb2RlKG1lc3NhZ2UsIHdyaXRlciA9IG1pbmltYWxfMS5Xcml0ZXIuY3JlYXRlKCkpIHtcbiAgICAgICAgaWYgKG1lc3NhZ2UucmVsYXRpdmUgPT09IHRydWUpIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoOCkuYm9vbChtZXNzYWdlLnJlbGF0aXZlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5hbmdsZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBleHBvcnRzLkNNc2dRQW5nbGUuZW5jb2RlKG1lc3NhZ2UuYW5nbGUsIHdyaXRlci51aW50MzIoMTgpLmZvcmsoKSkubGRlbGltKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9LFxuICAgIGRlY29kZShpbnB1dCwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IGlucHV0IGluc3RhbmNlb2YgbWluaW1hbF8xLlJlYWRlciA/IGlucHV0IDogbmV3IG1pbmltYWxfMS5SZWFkZXIoaW5wdXQpO1xuICAgICAgICBsZXQgZW5kID0gbGVuZ3RoID09PSB1bmRlZmluZWQgPyByZWFkZXIubGVuIDogcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDU1ZDTXNnRml4QW5nbGUoKTtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhZyA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgIHN3aXRjaCAodGFnID4+PiAzKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnJlbGF0aXZlID0gcmVhZGVyLmJvb2woKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmFuZ2xlID0gZXhwb3J0cy5DTXNnUUFuZ2xlLmRlY29kZShyZWFkZXIsIHJlYWRlci51aW50MzIoKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJlYWRlci5za2lwVHlwZSh0YWcgJiA3KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfSxcbiAgICBmcm9tUGFydGlhbChvYmplY3QpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNTVkNNc2dGaXhBbmdsZSgpO1xuICAgICAgICBtZXNzYWdlLnJlbGF0aXZlID0gKF9hID0gb2JqZWN0LnJlbGF0aXZlKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBmYWxzZTtcbiAgICAgICAgbWVzc2FnZS5hbmdsZSA9XG4gICAgICAgICAgICBvYmplY3QuYW5nbGUgIT09IHVuZGVmaW5lZCAmJiBvYmplY3QuYW5nbGUgIT09IG51bGxcbiAgICAgICAgICAgICAgICA/IGV4cG9ydHMuQ01zZ1FBbmdsZS5mcm9tUGFydGlhbChvYmplY3QuYW5nbGUpXG4gICAgICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbn07XG5mdW5jdGlvbiBjcmVhdGVCYXNlQ1NWQ01zZ0Nyb3NzaGFpckFuZ2xlKCkge1xuICAgIHJldHVybiB7IGFuZ2xlOiB1bmRlZmluZWQgfTtcbn1cbmV4cG9ydHMuQ1NWQ01zZ0Nyb3NzaGFpckFuZ2xlID0ge1xuICAgIGVuY29kZShtZXNzYWdlLCB3cml0ZXIgPSBtaW5pbWFsXzEuV3JpdGVyLmNyZWF0ZSgpKSB7XG4gICAgICAgIGlmIChtZXNzYWdlLmFuZ2xlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGV4cG9ydHMuQ01zZ1FBbmdsZS5lbmNvZGUobWVzc2FnZS5hbmdsZSwgd3JpdGVyLnVpbnQzMigxMCkuZm9yaygpKS5sZGVsaW0oKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH0sXG4gICAgZGVjb2RlKGlucHV0LCBsZW5ndGgpIHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gaW5wdXQgaW5zdGFuY2VvZiBtaW5pbWFsXzEuUmVhZGVyID8gaW5wdXQgOiBuZXcgbWluaW1hbF8xLlJlYWRlcihpbnB1dCk7XG4gICAgICAgIGxldCBlbmQgPSBsZW5ndGggPT09IHVuZGVmaW5lZCA/IHJlYWRlci5sZW4gOiByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNTVkNNc2dDcm9zc2hhaXJBbmdsZSgpO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuYW5nbGUgPSBleHBvcnRzLkNNc2dRQW5nbGUuZGVjb2RlKHJlYWRlciwgcmVhZGVyLnVpbnQzMigpKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmVhZGVyLnNraXBUeXBlKHRhZyAmIDcpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9LFxuICAgIGZyb21QYXJ0aWFsKG9iamVjdCkge1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNTVkNNc2dDcm9zc2hhaXJBbmdsZSgpO1xuICAgICAgICBtZXNzYWdlLmFuZ2xlID1cbiAgICAgICAgICAgIG9iamVjdC5hbmdsZSAhPT0gdW5kZWZpbmVkICYmIG9iamVjdC5hbmdsZSAhPT0gbnVsbFxuICAgICAgICAgICAgICAgID8gZXhwb3J0cy5DTXNnUUFuZ2xlLmZyb21QYXJ0aWFsKG9iamVjdC5hbmdsZSlcbiAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxufTtcbmZ1bmN0aW9uIGNyZWF0ZUJhc2VDU1ZDTXNnUHJlZmV0Y2goKSB7XG4gICAgcmV0dXJuIHsgc291bmRJbmRleDogMCB9O1xufVxuZXhwb3J0cy5DU1ZDTXNnUHJlZmV0Y2ggPSB7XG4gICAgZW5jb2RlKG1lc3NhZ2UsIHdyaXRlciA9IG1pbmltYWxfMS5Xcml0ZXIuY3JlYXRlKCkpIHtcbiAgICAgICAgaWYgKG1lc3NhZ2Uuc291bmRJbmRleCAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig4KS5pbnQzMihtZXNzYWdlLnNvdW5kSW5kZXgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfSxcbiAgICBkZWNvZGUoaW5wdXQsIGxlbmd0aCkge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBpbnB1dCBpbnN0YW5jZW9mIG1pbmltYWxfMS5SZWFkZXIgPyBpbnB1dCA6IG5ldyBtaW5pbWFsXzEuUmVhZGVyKGlucHV0KTtcbiAgICAgICAgbGV0IGVuZCA9IGxlbmd0aCA9PT0gdW5kZWZpbmVkID8gcmVhZGVyLmxlbiA6IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ1NWQ01zZ1ByZWZldGNoKCk7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBjb25zdCB0YWcgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKHRhZyA+Pj4gMykge1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5zb3VuZEluZGV4ID0gcmVhZGVyLmludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJlYWRlci5za2lwVHlwZSh0YWcgJiA3KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfSxcbiAgICBmcm9tUGFydGlhbChvYmplY3QpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNTVkNNc2dQcmVmZXRjaCgpO1xuICAgICAgICBtZXNzYWdlLnNvdW5kSW5kZXggPSAoX2EgPSBvYmplY3Quc291bmRJbmRleCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMDtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxufTtcbmZ1bmN0aW9uIGNyZWF0ZUJhc2VDU1ZDTXNnQlNQRGVjYWwoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgcG9zOiB1bmRlZmluZWQsXG4gICAgICAgIGRlY2FsVGV4dHVyZUluZGV4OiAwLFxuICAgICAgICBlbnRpdHlJbmRleDogMCxcbiAgICAgICAgbW9kZWxJbmRleDogMCxcbiAgICAgICAgbG93UHJpb3JpdHk6IGZhbHNlXG4gICAgfTtcbn1cbmV4cG9ydHMuQ1NWQ01zZ0JTUERlY2FsID0ge1xuICAgIGVuY29kZShtZXNzYWdlLCB3cml0ZXIgPSBtaW5pbWFsXzEuV3JpdGVyLmNyZWF0ZSgpKSB7XG4gICAgICAgIGlmIChtZXNzYWdlLnBvcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBleHBvcnRzLkNNc2dWZWN0b3IuZW5jb2RlKG1lc3NhZ2UucG9zLCB3cml0ZXIudWludDMyKDEwKS5mb3JrKCkpLmxkZWxpbSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLmRlY2FsVGV4dHVyZUluZGV4ICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDE2KS5pbnQzMihtZXNzYWdlLmRlY2FsVGV4dHVyZUluZGV4KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5lbnRpdHlJbmRleCAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigyNCkuaW50MzIobWVzc2FnZS5lbnRpdHlJbmRleCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UubW9kZWxJbmRleCAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigzMikuaW50MzIobWVzc2FnZS5tb2RlbEluZGV4KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5sb3dQcmlvcml0eSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig0MCkuYm9vbChtZXNzYWdlLmxvd1ByaW9yaXR5KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH0sXG4gICAgZGVjb2RlKGlucHV0LCBsZW5ndGgpIHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gaW5wdXQgaW5zdGFuY2VvZiBtaW5pbWFsXzEuUmVhZGVyID8gaW5wdXQgOiBuZXcgbWluaW1hbF8xLlJlYWRlcihpbnB1dCk7XG4gICAgICAgIGxldCBlbmQgPSBsZW5ndGggPT09IHVuZGVmaW5lZCA/IHJlYWRlci5sZW4gOiByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNTVkNNc2dCU1BEZWNhbCgpO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UucG9zID0gZXhwb3J0cy5DTXNnVmVjdG9yLmRlY29kZShyZWFkZXIsIHJlYWRlci51aW50MzIoKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5kZWNhbFRleHR1cmVJbmRleCA9IHJlYWRlci5pbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZW50aXR5SW5kZXggPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLm1vZGVsSW5kZXggPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmxvd1ByaW9yaXR5ID0gcmVhZGVyLmJvb2woKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmVhZGVyLnNraXBUeXBlKHRhZyAmIDcpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9LFxuICAgIGZyb21QYXJ0aWFsKG9iamVjdCkge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYywgX2Q7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ1NWQ01zZ0JTUERlY2FsKCk7XG4gICAgICAgIG1lc3NhZ2UucG9zID1cbiAgICAgICAgICAgIG9iamVjdC5wb3MgIT09IHVuZGVmaW5lZCAmJiBvYmplY3QucG9zICE9PSBudWxsXG4gICAgICAgICAgICAgICAgPyBleHBvcnRzLkNNc2dWZWN0b3IuZnJvbVBhcnRpYWwob2JqZWN0LnBvcylcbiAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgICAgbWVzc2FnZS5kZWNhbFRleHR1cmVJbmRleCA9IChfYSA9IG9iamVjdC5kZWNhbFRleHR1cmVJbmRleCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMDtcbiAgICAgICAgbWVzc2FnZS5lbnRpdHlJbmRleCA9IChfYiA9IG9iamVjdC5lbnRpdHlJbmRleCkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogMDtcbiAgICAgICAgbWVzc2FnZS5tb2RlbEluZGV4ID0gKF9jID0gb2JqZWN0Lm1vZGVsSW5kZXgpICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IDA7XG4gICAgICAgIG1lc3NhZ2UubG93UHJpb3JpdHkgPSAoX2QgPSBvYmplY3QubG93UHJpb3JpdHkpICE9PSBudWxsICYmIF9kICE9PSB2b2lkIDAgPyBfZCA6IGZhbHNlO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG59O1xuZnVuY3Rpb24gY3JlYXRlQmFzZUNTVkNNc2dTcGxpdFNjcmVlbigpIHtcbiAgICByZXR1cm4geyB0eXBlOiAwLCBzbG90OiAwLCBwbGF5ZXJJbmRleDogMCB9O1xufVxuZXhwb3J0cy5DU1ZDTXNnU3BsaXRTY3JlZW4gPSB7XG4gICAgZW5jb2RlKG1lc3NhZ2UsIHdyaXRlciA9IG1pbmltYWxfMS5Xcml0ZXIuY3JlYXRlKCkpIHtcbiAgICAgICAgaWYgKG1lc3NhZ2UudHlwZSAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig4KS5pbnQzMihtZXNzYWdlLnR5cGUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLnNsb3QgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMTYpLmludDMyKG1lc3NhZ2Uuc2xvdCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UucGxheWVySW5kZXggIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMjQpLmludDMyKG1lc3NhZ2UucGxheWVySW5kZXgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfSxcbiAgICBkZWNvZGUoaW5wdXQsIGxlbmd0aCkge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBpbnB1dCBpbnN0YW5jZW9mIG1pbmltYWxfMS5SZWFkZXIgPyBpbnB1dCA6IG5ldyBtaW5pbWFsXzEuUmVhZGVyKGlucHV0KTtcbiAgICAgICAgbGV0IGVuZCA9IGxlbmd0aCA9PT0gdW5kZWZpbmVkID8gcmVhZGVyLmxlbiA6IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ1NWQ01zZ1NwbGl0U2NyZWVuKCk7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBjb25zdCB0YWcgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKHRhZyA+Pj4gMykge1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS50eXBlID0gcmVhZGVyLmludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5zbG90ID0gcmVhZGVyLmludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5wbGF5ZXJJbmRleCA9IHJlYWRlci5pbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICByZWFkZXIuc2tpcFR5cGUodGFnICYgNyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH0sXG4gICAgZnJvbVBhcnRpYWwob2JqZWN0KSB7XG4gICAgICAgIHZhciBfYSwgX2IsIF9jO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNTVkNNc2dTcGxpdFNjcmVlbigpO1xuICAgICAgICBtZXNzYWdlLnR5cGUgPSAoX2EgPSBvYmplY3QudHlwZSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMDtcbiAgICAgICAgbWVzc2FnZS5zbG90ID0gKF9iID0gb2JqZWN0LnNsb3QpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IDA7XG4gICAgICAgIG1lc3NhZ2UucGxheWVySW5kZXggPSAoX2MgPSBvYmplY3QucGxheWVySW5kZXgpICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IDA7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbn07XG5mdW5jdGlvbiBjcmVhdGVCYXNlQ1NWQ01zZ0dldEN2YXJWYWx1ZSgpIHtcbiAgICByZXR1cm4geyBjb29raWU6IDAsIGN2YXJOYW1lOiBcIlwiIH07XG59XG5leHBvcnRzLkNTVkNNc2dHZXRDdmFyVmFsdWUgPSB7XG4gICAgZW5jb2RlKG1lc3NhZ2UsIHdyaXRlciA9IG1pbmltYWxfMS5Xcml0ZXIuY3JlYXRlKCkpIHtcbiAgICAgICAgaWYgKG1lc3NhZ2UuY29va2llICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDgpLmludDMyKG1lc3NhZ2UuY29va2llKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5jdmFyTmFtZSAhPT0gXCJcIikge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigxOCkuc3RyaW5nKG1lc3NhZ2UuY3Zhck5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfSxcbiAgICBkZWNvZGUoaW5wdXQsIGxlbmd0aCkge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBpbnB1dCBpbnN0YW5jZW9mIG1pbmltYWxfMS5SZWFkZXIgPyBpbnB1dCA6IG5ldyBtaW5pbWFsXzEuUmVhZGVyKGlucHV0KTtcbiAgICAgICAgbGV0IGVuZCA9IGxlbmd0aCA9PT0gdW5kZWZpbmVkID8gcmVhZGVyLmxlbiA6IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ1NWQ01zZ0dldEN2YXJWYWx1ZSgpO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuY29va2llID0gcmVhZGVyLmludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5jdmFyTmFtZSA9IHJlYWRlci5zdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmVhZGVyLnNraXBUeXBlKHRhZyAmIDcpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9LFxuICAgIGZyb21QYXJ0aWFsKG9iamVjdCkge1xuICAgICAgICB2YXIgX2EsIF9iO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNTVkNNc2dHZXRDdmFyVmFsdWUoKTtcbiAgICAgICAgbWVzc2FnZS5jb29raWUgPSAoX2EgPSBvYmplY3QuY29va2llKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAwO1xuICAgICAgICBtZXNzYWdlLmN2YXJOYW1lID0gKF9iID0gb2JqZWN0LmN2YXJOYW1lKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBcIlwiO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG59O1xuZnVuY3Rpb24gY3JlYXRlQmFzZUNTVkNNc2dNZW51KCkge1xuICAgIHJldHVybiB7IGRpYWxvZ1R5cGU6IDAsIG1lbnVLZXlWYWx1ZXM6IG5ldyBVaW50OEFycmF5KCkgfTtcbn1cbmV4cG9ydHMuQ1NWQ01zZ01lbnUgPSB7XG4gICAgZW5jb2RlKG1lc3NhZ2UsIHdyaXRlciA9IG1pbmltYWxfMS5Xcml0ZXIuY3JlYXRlKCkpIHtcbiAgICAgICAgaWYgKG1lc3NhZ2UuZGlhbG9nVHlwZSAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig4KS5pbnQzMihtZXNzYWdlLmRpYWxvZ1R5cGUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLm1lbnVLZXlWYWx1ZXMubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDE4KS5ieXRlcyhtZXNzYWdlLm1lbnVLZXlWYWx1ZXMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfSxcbiAgICBkZWNvZGUoaW5wdXQsIGxlbmd0aCkge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBpbnB1dCBpbnN0YW5jZW9mIG1pbmltYWxfMS5SZWFkZXIgPyBpbnB1dCA6IG5ldyBtaW5pbWFsXzEuUmVhZGVyKGlucHV0KTtcbiAgICAgICAgbGV0IGVuZCA9IGxlbmd0aCA9PT0gdW5kZWZpbmVkID8gcmVhZGVyLmxlbiA6IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ1NWQ01zZ01lbnUoKTtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhZyA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgIHN3aXRjaCAodGFnID4+PiAzKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmRpYWxvZ1R5cGUgPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLm1lbnVLZXlWYWx1ZXMgPSByZWFkZXIuYnl0ZXMoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmVhZGVyLnNraXBUeXBlKHRhZyAmIDcpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9LFxuICAgIGZyb21QYXJ0aWFsKG9iamVjdCkge1xuICAgICAgICB2YXIgX2EsIF9iO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNTVkNNc2dNZW51KCk7XG4gICAgICAgIG1lc3NhZ2UuZGlhbG9nVHlwZSA9IChfYSA9IG9iamVjdC5kaWFsb2dUeXBlKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAwO1xuICAgICAgICBtZXNzYWdlLm1lbnVLZXlWYWx1ZXMgPSAoX2IgPSBvYmplY3QubWVudUtleVZhbHVlcykgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogbmV3IFVpbnQ4QXJyYXkoKTtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxufTtcbmZ1bmN0aW9uIGNyZWF0ZUJhc2VDU1ZDTXNnVXNlck1lc3NhZ2UoKSB7XG4gICAgcmV0dXJuIHsgbXNnVHlwZTogMCwgbXNnRGF0YTogbmV3IFVpbnQ4QXJyYXkoKSwgcGFzc3Rocm91Z2g6IDAgfTtcbn1cbmV4cG9ydHMuQ1NWQ01zZ1VzZXJNZXNzYWdlID0ge1xuICAgIGVuY29kZShtZXNzYWdlLCB3cml0ZXIgPSBtaW5pbWFsXzEuV3JpdGVyLmNyZWF0ZSgpKSB7XG4gICAgICAgIGlmIChtZXNzYWdlLm1zZ1R5cGUgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoOCkuaW50MzIobWVzc2FnZS5tc2dUeXBlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5tc2dEYXRhLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigxOCkuYnl0ZXMobWVzc2FnZS5tc2dEYXRhKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5wYXNzdGhyb3VnaCAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigyNCkuaW50MzIobWVzc2FnZS5wYXNzdGhyb3VnaCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9LFxuICAgIGRlY29kZShpbnB1dCwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IGlucHV0IGluc3RhbmNlb2YgbWluaW1hbF8xLlJlYWRlciA/IGlucHV0IDogbmV3IG1pbmltYWxfMS5SZWFkZXIoaW5wdXQpO1xuICAgICAgICBsZXQgZW5kID0gbGVuZ3RoID09PSB1bmRlZmluZWQgPyByZWFkZXIubGVuIDogcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDU1ZDTXNnVXNlck1lc3NhZ2UoKTtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhZyA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgIHN3aXRjaCAodGFnID4+PiAzKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLm1zZ1R5cGUgPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLm1zZ0RhdGEgPSByZWFkZXIuYnl0ZXMoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnBhc3N0aHJvdWdoID0gcmVhZGVyLmludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJlYWRlci5za2lwVHlwZSh0YWcgJiA3KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfSxcbiAgICBmcm9tUGFydGlhbChvYmplY3QpIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2M7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ1NWQ01zZ1VzZXJNZXNzYWdlKCk7XG4gICAgICAgIG1lc3NhZ2UubXNnVHlwZSA9IChfYSA9IG9iamVjdC5tc2dUeXBlKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAwO1xuICAgICAgICBtZXNzYWdlLm1zZ0RhdGEgPSAoX2IgPSBvYmplY3QubXNnRGF0YSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogbmV3IFVpbnQ4QXJyYXkoKTtcbiAgICAgICAgbWVzc2FnZS5wYXNzdGhyb3VnaCA9IChfYyA9IG9iamVjdC5wYXNzdGhyb3VnaCkgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogMDtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxufTtcbmZ1bmN0aW9uIGNyZWF0ZUJhc2VDU1ZDTXNnUGFpbnRtYXBEYXRhKCkge1xuICAgIHJldHVybiB7IHBhaW50bWFwOiBuZXcgVWludDhBcnJheSgpIH07XG59XG5leHBvcnRzLkNTVkNNc2dQYWludG1hcERhdGEgPSB7XG4gICAgZW5jb2RlKG1lc3NhZ2UsIHdyaXRlciA9IG1pbmltYWxfMS5Xcml0ZXIuY3JlYXRlKCkpIHtcbiAgICAgICAgaWYgKG1lc3NhZ2UucGFpbnRtYXAubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDEwKS5ieXRlcyhtZXNzYWdlLnBhaW50bWFwKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH0sXG4gICAgZGVjb2RlKGlucHV0LCBsZW5ndGgpIHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gaW5wdXQgaW5zdGFuY2VvZiBtaW5pbWFsXzEuUmVhZGVyID8gaW5wdXQgOiBuZXcgbWluaW1hbF8xLlJlYWRlcihpbnB1dCk7XG4gICAgICAgIGxldCBlbmQgPSBsZW5ndGggPT09IHVuZGVmaW5lZCA/IHJlYWRlci5sZW4gOiByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNTVkNNc2dQYWludG1hcERhdGEoKTtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhZyA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgIHN3aXRjaCAodGFnID4+PiAzKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnBhaW50bWFwID0gcmVhZGVyLmJ5dGVzKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJlYWRlci5za2lwVHlwZSh0YWcgJiA3KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfSxcbiAgICBmcm9tUGFydGlhbChvYmplY3QpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNTVkNNc2dQYWludG1hcERhdGEoKTtcbiAgICAgICAgbWVzc2FnZS5wYWludG1hcCA9IChfYSA9IG9iamVjdC5wYWludG1hcCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogbmV3IFVpbnQ4QXJyYXkoKTtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxufTtcbmZ1bmN0aW9uIGNyZWF0ZUJhc2VDU1ZDTXNnR2FtZUV2ZW50KCkge1xuICAgIHJldHVybiB7IGV2ZW50TmFtZTogXCJcIiwgZXZlbnRpZDogMCwga2V5czogW10sIHBhc3N0aHJvdWdoOiAwIH07XG59XG5leHBvcnRzLkNTVkNNc2dHYW1lRXZlbnQgPSB7XG4gICAgZW5jb2RlKG1lc3NhZ2UsIHdyaXRlciA9IG1pbmltYWxfMS5Xcml0ZXIuY3JlYXRlKCkpIHtcbiAgICAgICAgaWYgKG1lc3NhZ2UuZXZlbnROYW1lICE9PSBcIlwiKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDEwKS5zdHJpbmcobWVzc2FnZS5ldmVudE5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLmV2ZW50aWQgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMTYpLmludDMyKG1lc3NhZ2UuZXZlbnRpZCk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCB2IG9mIG1lc3NhZ2Uua2V5cykge1xuICAgICAgICAgICAgZXhwb3J0cy5DU1ZDTXNnR2FtZUV2ZW50X2tleVQuZW5jb2RlKHYsIHdyaXRlci51aW50MzIoMjYpLmZvcmsoKSkubGRlbGltKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UucGFzc3Rocm91Z2ggIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMzIpLmludDMyKG1lc3NhZ2UucGFzc3Rocm91Z2gpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfSxcbiAgICBkZWNvZGUoaW5wdXQsIGxlbmd0aCkge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBpbnB1dCBpbnN0YW5jZW9mIG1pbmltYWxfMS5SZWFkZXIgPyBpbnB1dCA6IG5ldyBtaW5pbWFsXzEuUmVhZGVyKGlucHV0KTtcbiAgICAgICAgbGV0IGVuZCA9IGxlbmd0aCA9PT0gdW5kZWZpbmVkID8gcmVhZGVyLmxlbiA6IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ1NWQ01zZ0dhbWVFdmVudCgpO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZXZlbnROYW1lID0gcmVhZGVyLnN0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZXZlbnRpZCA9IHJlYWRlci5pbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Uua2V5cy5wdXNoKGV4cG9ydHMuQ1NWQ01zZ0dhbWVFdmVudF9rZXlULmRlY29kZShyZWFkZXIsIHJlYWRlci51aW50MzIoKSkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UucGFzc3Rocm91Z2ggPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmVhZGVyLnNraXBUeXBlKHRhZyAmIDcpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9LFxuICAgIGZyb21QYXJ0aWFsKG9iamVjdCkge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYywgX2Q7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ1NWQ01zZ0dhbWVFdmVudCgpO1xuICAgICAgICBtZXNzYWdlLmV2ZW50TmFtZSA9IChfYSA9IG9iamVjdC5ldmVudE5hbWUpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IFwiXCI7XG4gICAgICAgIG1lc3NhZ2UuZXZlbnRpZCA9IChfYiA9IG9iamVjdC5ldmVudGlkKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAwO1xuICAgICAgICBtZXNzYWdlLmtleXMgPVxuICAgICAgICAgICAgKChfYyA9IG9iamVjdC5rZXlzKSA9PT0gbnVsbCB8fCBfYyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2MubWFwKGUgPT4gZXhwb3J0cy5DU1ZDTXNnR2FtZUV2ZW50X2tleVQuZnJvbVBhcnRpYWwoZSkpKSB8fCBbXTtcbiAgICAgICAgbWVzc2FnZS5wYXNzdGhyb3VnaCA9IChfZCA9IG9iamVjdC5wYXNzdGhyb3VnaCkgIT09IG51bGwgJiYgX2QgIT09IHZvaWQgMCA/IF9kIDogMDtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxufTtcbmZ1bmN0aW9uIGNyZWF0ZUJhc2VDU1ZDTXNnR2FtZUV2ZW50X2tleVQoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogMCxcbiAgICAgICAgdmFsU3RyaW5nOiBcIlwiLFxuICAgICAgICB2YWxGbG9hdDogMCxcbiAgICAgICAgdmFsTG9uZzogMCxcbiAgICAgICAgdmFsU2hvcnQ6IDAsXG4gICAgICAgIHZhbEJ5dGU6IDAsXG4gICAgICAgIHZhbEJvb2w6IGZhbHNlLFxuICAgICAgICB2YWxVaW50NjQ6IExvbmcuVVpFUk8sXG4gICAgICAgIHZhbFdzdHJpbmc6IG5ldyBVaW50OEFycmF5KClcbiAgICB9O1xufVxuZXhwb3J0cy5DU1ZDTXNnR2FtZUV2ZW50X2tleVQgPSB7XG4gICAgZW5jb2RlKG1lc3NhZ2UsIHdyaXRlciA9IG1pbmltYWxfMS5Xcml0ZXIuY3JlYXRlKCkpIHtcbiAgICAgICAgaWYgKG1lc3NhZ2UudHlwZSAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig4KS5pbnQzMihtZXNzYWdlLnR5cGUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLnZhbFN0cmluZyAhPT0gXCJcIikge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigxOCkuc3RyaW5nKG1lc3NhZ2UudmFsU3RyaW5nKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS52YWxGbG9hdCAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigyOSkuZmxvYXQobWVzc2FnZS52YWxGbG9hdCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UudmFsTG9uZyAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigzMikuaW50MzIobWVzc2FnZS52YWxMb25nKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS52YWxTaG9ydCAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig0MCkuaW50MzIobWVzc2FnZS52YWxTaG9ydCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UudmFsQnl0ZSAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig0OCkuaW50MzIobWVzc2FnZS52YWxCeXRlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS52YWxCb29sID09PSB0cnVlKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDU2KS5ib29sKG1lc3NhZ2UudmFsQm9vbCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFtZXNzYWdlLnZhbFVpbnQ2NC5pc1plcm8oKSkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig2NCkudWludDY0KG1lc3NhZ2UudmFsVWludDY0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS52YWxXc3RyaW5nLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig3NCkuYnl0ZXMobWVzc2FnZS52YWxXc3RyaW5nKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH0sXG4gICAgZGVjb2RlKGlucHV0LCBsZW5ndGgpIHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gaW5wdXQgaW5zdGFuY2VvZiBtaW5pbWFsXzEuUmVhZGVyID8gaW5wdXQgOiBuZXcgbWluaW1hbF8xLlJlYWRlcihpbnB1dCk7XG4gICAgICAgIGxldCBlbmQgPSBsZW5ndGggPT09IHVuZGVmaW5lZCA/IHJlYWRlci5sZW4gOiByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNTVkNNc2dHYW1lRXZlbnRfa2V5VCgpO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudHlwZSA9IHJlYWRlci5pbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudmFsU3RyaW5nID0gcmVhZGVyLnN0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudmFsRmxvYXQgPSByZWFkZXIuZmxvYXQoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnZhbExvbmcgPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnZhbFNob3J0ID0gcmVhZGVyLmludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS52YWxCeXRlID0gcmVhZGVyLmludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNzpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS52YWxCb29sID0gcmVhZGVyLmJvb2woKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA4OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnZhbFVpbnQ2NCA9IHJlYWRlci51aW50NjQoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA5OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnZhbFdzdHJpbmcgPSByZWFkZXIuYnl0ZXMoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmVhZGVyLnNraXBUeXBlKHRhZyAmIDcpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9LFxuICAgIGZyb21QYXJ0aWFsKG9iamVjdCkge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYywgX2QsIF9lLCBfZiwgX2csIF9oO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNTVkNNc2dHYW1lRXZlbnRfa2V5VCgpO1xuICAgICAgICBtZXNzYWdlLnR5cGUgPSAoX2EgPSBvYmplY3QudHlwZSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMDtcbiAgICAgICAgbWVzc2FnZS52YWxTdHJpbmcgPSAoX2IgPSBvYmplY3QudmFsU3RyaW5nKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBcIlwiO1xuICAgICAgICBtZXNzYWdlLnZhbEZsb2F0ID0gKF9jID0gb2JqZWN0LnZhbEZsb2F0KSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiAwO1xuICAgICAgICBtZXNzYWdlLnZhbExvbmcgPSAoX2QgPSBvYmplY3QudmFsTG9uZykgIT09IG51bGwgJiYgX2QgIT09IHZvaWQgMCA/IF9kIDogMDtcbiAgICAgICAgbWVzc2FnZS52YWxTaG9ydCA9IChfZSA9IG9iamVjdC52YWxTaG9ydCkgIT09IG51bGwgJiYgX2UgIT09IHZvaWQgMCA/IF9lIDogMDtcbiAgICAgICAgbWVzc2FnZS52YWxCeXRlID0gKF9mID0gb2JqZWN0LnZhbEJ5dGUpICE9PSBudWxsICYmIF9mICE9PSB2b2lkIDAgPyBfZiA6IDA7XG4gICAgICAgIG1lc3NhZ2UudmFsQm9vbCA9IChfZyA9IG9iamVjdC52YWxCb29sKSAhPT0gbnVsbCAmJiBfZyAhPT0gdm9pZCAwID8gX2cgOiBmYWxzZTtcbiAgICAgICAgbWVzc2FnZS52YWxVaW50NjQgPVxuICAgICAgICAgICAgb2JqZWN0LnZhbFVpbnQ2NCAhPT0gdW5kZWZpbmVkICYmIG9iamVjdC52YWxVaW50NjQgIT09IG51bGxcbiAgICAgICAgICAgICAgICA/IExvbmcuZnJvbVZhbHVlKG9iamVjdC52YWxVaW50NjQpXG4gICAgICAgICAgICAgICAgOiBMb25nLlVaRVJPO1xuICAgICAgICBtZXNzYWdlLnZhbFdzdHJpbmcgPSAoX2ggPSBvYmplY3QudmFsV3N0cmluZykgIT09IG51bGwgJiYgX2ggIT09IHZvaWQgMCA/IF9oIDogbmV3IFVpbnQ4QXJyYXkoKTtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxufTtcbmZ1bmN0aW9uIGNyZWF0ZUJhc2VDU1ZDTXNnR2FtZUV2ZW50TGlzdCgpIHtcbiAgICByZXR1cm4geyBkZXNjcmlwdG9yczogW10gfTtcbn1cbmV4cG9ydHMuQ1NWQ01zZ0dhbWVFdmVudExpc3QgPSB7XG4gICAgZW5jb2RlKG1lc3NhZ2UsIHdyaXRlciA9IG1pbmltYWxfMS5Xcml0ZXIuY3JlYXRlKCkpIHtcbiAgICAgICAgZm9yIChjb25zdCB2IG9mIG1lc3NhZ2UuZGVzY3JpcHRvcnMpIHtcbiAgICAgICAgICAgIGV4cG9ydHMuQ1NWQ01zZ0dhbWVFdmVudExpc3RfZGVzY3JpcHRvclQuZW5jb2RlKHYsIHdyaXRlci51aW50MzIoMTApLmZvcmsoKSkubGRlbGltKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9LFxuICAgIGRlY29kZShpbnB1dCwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IGlucHV0IGluc3RhbmNlb2YgbWluaW1hbF8xLlJlYWRlciA/IGlucHV0IDogbmV3IG1pbmltYWxfMS5SZWFkZXIoaW5wdXQpO1xuICAgICAgICBsZXQgZW5kID0gbGVuZ3RoID09PSB1bmRlZmluZWQgPyByZWFkZXIubGVuIDogcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDU1ZDTXNnR2FtZUV2ZW50TGlzdCgpO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZGVzY3JpcHRvcnMucHVzaChleHBvcnRzLkNTVkNNc2dHYW1lRXZlbnRMaXN0X2Rlc2NyaXB0b3JULmRlY29kZShyZWFkZXIsIHJlYWRlci51aW50MzIoKSkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICByZWFkZXIuc2tpcFR5cGUodGFnICYgNyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH0sXG4gICAgZnJvbVBhcnRpYWwob2JqZWN0KSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDU1ZDTXNnR2FtZUV2ZW50TGlzdCgpO1xuICAgICAgICBtZXNzYWdlLmRlc2NyaXB0b3JzID1cbiAgICAgICAgICAgICgoX2EgPSBvYmplY3QuZGVzY3JpcHRvcnMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5tYXAoZSA9PiBleHBvcnRzLkNTVkNNc2dHYW1lRXZlbnRMaXN0X2Rlc2NyaXB0b3JULmZyb21QYXJ0aWFsKGUpKSkgfHwgW107XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbn07XG5mdW5jdGlvbiBjcmVhdGVCYXNlQ1NWQ01zZ0dhbWVFdmVudExpc3Rfa2V5VCgpIHtcbiAgICByZXR1cm4geyB0eXBlOiAwLCBuYW1lOiBcIlwiIH07XG59XG5leHBvcnRzLkNTVkNNc2dHYW1lRXZlbnRMaXN0X2tleVQgPSB7XG4gICAgZW5jb2RlKG1lc3NhZ2UsIHdyaXRlciA9IG1pbmltYWxfMS5Xcml0ZXIuY3JlYXRlKCkpIHtcbiAgICAgICAgaWYgKG1lc3NhZ2UudHlwZSAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig4KS5pbnQzMihtZXNzYWdlLnR5cGUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLm5hbWUgIT09IFwiXCIpIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMTgpLnN0cmluZyhtZXNzYWdlLm5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfSxcbiAgICBkZWNvZGUoaW5wdXQsIGxlbmd0aCkge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBpbnB1dCBpbnN0YW5jZW9mIG1pbmltYWxfMS5SZWFkZXIgPyBpbnB1dCA6IG5ldyBtaW5pbWFsXzEuUmVhZGVyKGlucHV0KTtcbiAgICAgICAgbGV0IGVuZCA9IGxlbmd0aCA9PT0gdW5kZWZpbmVkID8gcmVhZGVyLmxlbiA6IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ1NWQ01zZ0dhbWVFdmVudExpc3Rfa2V5VCgpO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudHlwZSA9IHJlYWRlci5pbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UubmFtZSA9IHJlYWRlci5zdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmVhZGVyLnNraXBUeXBlKHRhZyAmIDcpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9LFxuICAgIGZyb21QYXJ0aWFsKG9iamVjdCkge1xuICAgICAgICB2YXIgX2EsIF9iO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNTVkNNc2dHYW1lRXZlbnRMaXN0X2tleVQoKTtcbiAgICAgICAgbWVzc2FnZS50eXBlID0gKF9hID0gb2JqZWN0LnR5cGUpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IDA7XG4gICAgICAgIG1lc3NhZ2UubmFtZSA9IChfYiA9IG9iamVjdC5uYW1lKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBcIlwiO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG59O1xuZnVuY3Rpb24gY3JlYXRlQmFzZUNTVkNNc2dHYW1lRXZlbnRMaXN0X2Rlc2NyaXB0b3JUKCkge1xuICAgIHJldHVybiB7IGV2ZW50aWQ6IDAsIG5hbWU6IFwiXCIsIGtleXM6IFtdIH07XG59XG5leHBvcnRzLkNTVkNNc2dHYW1lRXZlbnRMaXN0X2Rlc2NyaXB0b3JUID0ge1xuICAgIGVuY29kZShtZXNzYWdlLCB3cml0ZXIgPSBtaW5pbWFsXzEuV3JpdGVyLmNyZWF0ZSgpKSB7XG4gICAgICAgIGlmIChtZXNzYWdlLmV2ZW50aWQgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoOCkuaW50MzIobWVzc2FnZS5ldmVudGlkKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5uYW1lICE9PSBcIlwiKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDE4KS5zdHJpbmcobWVzc2FnZS5uYW1lKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IHYgb2YgbWVzc2FnZS5rZXlzKSB7XG4gICAgICAgICAgICBleHBvcnRzLkNTVkNNc2dHYW1lRXZlbnRMaXN0X2tleVQuZW5jb2RlKHYsIHdyaXRlci51aW50MzIoMjYpLmZvcmsoKSkubGRlbGltKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9LFxuICAgIGRlY29kZShpbnB1dCwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IGlucHV0IGluc3RhbmNlb2YgbWluaW1hbF8xLlJlYWRlciA/IGlucHV0IDogbmV3IG1pbmltYWxfMS5SZWFkZXIoaW5wdXQpO1xuICAgICAgICBsZXQgZW5kID0gbGVuZ3RoID09PSB1bmRlZmluZWQgPyByZWFkZXIubGVuIDogcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDU1ZDTXNnR2FtZUV2ZW50TGlzdF9kZXNjcmlwdG9yVCgpO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZXZlbnRpZCA9IHJlYWRlci5pbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UubmFtZSA9IHJlYWRlci5zdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmtleXMucHVzaChleHBvcnRzLkNTVkNNc2dHYW1lRXZlbnRMaXN0X2tleVQuZGVjb2RlKHJlYWRlciwgcmVhZGVyLnVpbnQzMigpKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJlYWRlci5za2lwVHlwZSh0YWcgJiA3KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfSxcbiAgICBmcm9tUGFydGlhbChvYmplY3QpIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2M7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ1NWQ01zZ0dhbWVFdmVudExpc3RfZGVzY3JpcHRvclQoKTtcbiAgICAgICAgbWVzc2FnZS5ldmVudGlkID0gKF9hID0gb2JqZWN0LmV2ZW50aWQpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IDA7XG4gICAgICAgIG1lc3NhZ2UubmFtZSA9IChfYiA9IG9iamVjdC5uYW1lKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBcIlwiO1xuICAgICAgICBtZXNzYWdlLmtleXMgPVxuICAgICAgICAgICAgKChfYyA9IG9iamVjdC5rZXlzKSA9PT0gbnVsbCB8fCBfYyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2MubWFwKGUgPT4gZXhwb3J0cy5DU1ZDTXNnR2FtZUV2ZW50TGlzdF9rZXlULmZyb21QYXJ0aWFsKGUpKSkgfHwgW107XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbn07XG5mdW5jdGlvbiBjcmVhdGVCYXNlQ1NWQ01zZ1RlbXBFbnRpdGllcygpIHtcbiAgICByZXR1cm4geyByZWxpYWJsZTogZmFsc2UsIG51bUVudHJpZXM6IDAsIGVudGl0eURhdGE6IG5ldyBVaW50OEFycmF5KCkgfTtcbn1cbmV4cG9ydHMuQ1NWQ01zZ1RlbXBFbnRpdGllcyA9IHtcbiAgICBlbmNvZGUobWVzc2FnZSwgd3JpdGVyID0gbWluaW1hbF8xLldyaXRlci5jcmVhdGUoKSkge1xuICAgICAgICBpZiAobWVzc2FnZS5yZWxpYWJsZSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig4KS5ib29sKG1lc3NhZ2UucmVsaWFibGUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLm51bUVudHJpZXMgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMTYpLmludDMyKG1lc3NhZ2UubnVtRW50cmllcyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UuZW50aXR5RGF0YS5sZW5ndGggIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMjYpLmJ5dGVzKG1lc3NhZ2UuZW50aXR5RGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9LFxuICAgIGRlY29kZShpbnB1dCwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IGlucHV0IGluc3RhbmNlb2YgbWluaW1hbF8xLlJlYWRlciA/IGlucHV0IDogbmV3IG1pbmltYWxfMS5SZWFkZXIoaW5wdXQpO1xuICAgICAgICBsZXQgZW5kID0gbGVuZ3RoID09PSB1bmRlZmluZWQgPyByZWFkZXIubGVuIDogcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDU1ZDTXNnVGVtcEVudGl0aWVzKCk7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBjb25zdCB0YWcgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKHRhZyA+Pj4gMykge1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5yZWxpYWJsZSA9IHJlYWRlci5ib29sKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5udW1FbnRyaWVzID0gcmVhZGVyLmludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5lbnRpdHlEYXRhID0gcmVhZGVyLmJ5dGVzKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJlYWRlci5za2lwVHlwZSh0YWcgJiA3KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfSxcbiAgICBmcm9tUGFydGlhbChvYmplY3QpIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2M7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ1NWQ01zZ1RlbXBFbnRpdGllcygpO1xuICAgICAgICBtZXNzYWdlLnJlbGlhYmxlID0gKF9hID0gb2JqZWN0LnJlbGlhYmxlKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBmYWxzZTtcbiAgICAgICAgbWVzc2FnZS5udW1FbnRyaWVzID0gKF9iID0gb2JqZWN0Lm51bUVudHJpZXMpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IDA7XG4gICAgICAgIG1lc3NhZ2UuZW50aXR5RGF0YSA9IChfYyA9IG9iamVjdC5lbnRpdHlEYXRhKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiBuZXcgVWludDhBcnJheSgpO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG59O1xuZnVuY3Rpb24gY3JlYXRlQmFzZUNTVkNNc2dQYWNrZXRFbnRpdGllcygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBtYXhFbnRyaWVzOiAwLFxuICAgICAgICB1cGRhdGVkRW50cmllczogMCxcbiAgICAgICAgaXNEZWx0YTogZmFsc2UsXG4gICAgICAgIHVwZGF0ZUJhc2VsaW5lOiBmYWxzZSxcbiAgICAgICAgYmFzZWxpbmU6IDAsXG4gICAgICAgIGRlbHRhRnJvbTogMCxcbiAgICAgICAgZW50aXR5RGF0YTogbmV3IFVpbnQ4QXJyYXkoKVxuICAgIH07XG59XG5leHBvcnRzLkNTVkNNc2dQYWNrZXRFbnRpdGllcyA9IHtcbiAgICBlbmNvZGUobWVzc2FnZSwgd3JpdGVyID0gbWluaW1hbF8xLldyaXRlci5jcmVhdGUoKSkge1xuICAgICAgICBpZiAobWVzc2FnZS5tYXhFbnRyaWVzICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDgpLmludDMyKG1lc3NhZ2UubWF4RW50cmllcyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UudXBkYXRlZEVudHJpZXMgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMTYpLmludDMyKG1lc3NhZ2UudXBkYXRlZEVudHJpZXMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLmlzRGVsdGEgPT09IHRydWUpIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMjQpLmJvb2wobWVzc2FnZS5pc0RlbHRhKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS51cGRhdGVCYXNlbGluZSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigzMikuYm9vbChtZXNzYWdlLnVwZGF0ZUJhc2VsaW5lKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5iYXNlbGluZSAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig0MCkuaW50MzIobWVzc2FnZS5iYXNlbGluZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UuZGVsdGFGcm9tICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDQ4KS5pbnQzMihtZXNzYWdlLmRlbHRhRnJvbSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UuZW50aXR5RGF0YS5sZW5ndGggIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoNTgpLmJ5dGVzKG1lc3NhZ2UuZW50aXR5RGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9LFxuICAgIGRlY29kZShpbnB1dCwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IGlucHV0IGluc3RhbmNlb2YgbWluaW1hbF8xLlJlYWRlciA/IGlucHV0IDogbmV3IG1pbmltYWxfMS5SZWFkZXIoaW5wdXQpO1xuICAgICAgICBsZXQgZW5kID0gbGVuZ3RoID09PSB1bmRlZmluZWQgPyByZWFkZXIubGVuIDogcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDU1ZDTXNnUGFja2V0RW50aXRpZXMoKTtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhZyA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgIHN3aXRjaCAodGFnID4+PiAzKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLm1heEVudHJpZXMgPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnVwZGF0ZWRFbnRyaWVzID0gcmVhZGVyLmludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5pc0RlbHRhID0gcmVhZGVyLmJvb2woKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnVwZGF0ZUJhc2VsaW5lID0gcmVhZGVyLmJvb2woKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmJhc2VsaW5lID0gcmVhZGVyLmludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5kZWx0YUZyb20gPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA3OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmVudGl0eURhdGEgPSByZWFkZXIuYnl0ZXMoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmVhZGVyLnNraXBUeXBlKHRhZyAmIDcpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9LFxuICAgIGZyb21QYXJ0aWFsKG9iamVjdCkge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYywgX2QsIF9lLCBfZiwgX2c7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ1NWQ01zZ1BhY2tldEVudGl0aWVzKCk7XG4gICAgICAgIG1lc3NhZ2UubWF4RW50cmllcyA9IChfYSA9IG9iamVjdC5tYXhFbnRyaWVzKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAwO1xuICAgICAgICBtZXNzYWdlLnVwZGF0ZWRFbnRyaWVzID0gKF9iID0gb2JqZWN0LnVwZGF0ZWRFbnRyaWVzKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAwO1xuICAgICAgICBtZXNzYWdlLmlzRGVsdGEgPSAoX2MgPSBvYmplY3QuaXNEZWx0YSkgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogZmFsc2U7XG4gICAgICAgIG1lc3NhZ2UudXBkYXRlQmFzZWxpbmUgPSAoX2QgPSBvYmplY3QudXBkYXRlQmFzZWxpbmUpICE9PSBudWxsICYmIF9kICE9PSB2b2lkIDAgPyBfZCA6IGZhbHNlO1xuICAgICAgICBtZXNzYWdlLmJhc2VsaW5lID0gKF9lID0gb2JqZWN0LmJhc2VsaW5lKSAhPT0gbnVsbCAmJiBfZSAhPT0gdm9pZCAwID8gX2UgOiAwO1xuICAgICAgICBtZXNzYWdlLmRlbHRhRnJvbSA9IChfZiA9IG9iamVjdC5kZWx0YUZyb20pICE9PSBudWxsICYmIF9mICE9PSB2b2lkIDAgPyBfZiA6IDA7XG4gICAgICAgIG1lc3NhZ2UuZW50aXR5RGF0YSA9IChfZyA9IG9iamVjdC5lbnRpdHlEYXRhKSAhPT0gbnVsbCAmJiBfZyAhPT0gdm9pZCAwID8gX2cgOiBuZXcgVWludDhBcnJheSgpO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG59O1xuZnVuY3Rpb24gY3JlYXRlQmFzZUNTVkNNc2dTb3VuZHMoKSB7XG4gICAgcmV0dXJuIHsgcmVsaWFibGVTb3VuZDogZmFsc2UsIHNvdW5kczogW10gfTtcbn1cbmV4cG9ydHMuQ1NWQ01zZ1NvdW5kcyA9IHtcbiAgICBlbmNvZGUobWVzc2FnZSwgd3JpdGVyID0gbWluaW1hbF8xLldyaXRlci5jcmVhdGUoKSkge1xuICAgICAgICBpZiAobWVzc2FnZS5yZWxpYWJsZVNvdW5kID09PSB0cnVlKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDgpLmJvb2wobWVzc2FnZS5yZWxpYWJsZVNvdW5kKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IHYgb2YgbWVzc2FnZS5zb3VuZHMpIHtcbiAgICAgICAgICAgIGV4cG9ydHMuQ1NWQ01zZ1NvdW5kc19zb3VuZGRhdGFULmVuY29kZSh2LCB3cml0ZXIudWludDMyKDE4KS5mb3JrKCkpLmxkZWxpbSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfSxcbiAgICBkZWNvZGUoaW5wdXQsIGxlbmd0aCkge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBpbnB1dCBpbnN0YW5jZW9mIG1pbmltYWxfMS5SZWFkZXIgPyBpbnB1dCA6IG5ldyBtaW5pbWFsXzEuUmVhZGVyKGlucHV0KTtcbiAgICAgICAgbGV0IGVuZCA9IGxlbmd0aCA9PT0gdW5kZWZpbmVkID8gcmVhZGVyLmxlbiA6IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ1NWQ01zZ1NvdW5kcygpO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UucmVsaWFibGVTb3VuZCA9IHJlYWRlci5ib29sKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5zb3VuZHMucHVzaChleHBvcnRzLkNTVkNNc2dTb3VuZHNfc291bmRkYXRhVC5kZWNvZGUocmVhZGVyLCByZWFkZXIudWludDMyKCkpKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmVhZGVyLnNraXBUeXBlKHRhZyAmIDcpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9LFxuICAgIGZyb21QYXJ0aWFsKG9iamVjdCkge1xuICAgICAgICB2YXIgX2EsIF9iO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNTVkNNc2dTb3VuZHMoKTtcbiAgICAgICAgbWVzc2FnZS5yZWxpYWJsZVNvdW5kID0gKF9hID0gb2JqZWN0LnJlbGlhYmxlU291bmQpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IGZhbHNlO1xuICAgICAgICBtZXNzYWdlLnNvdW5kcyA9XG4gICAgICAgICAgICAoKF9iID0gb2JqZWN0LnNvdW5kcykgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLm1hcChlID0+IGV4cG9ydHMuQ1NWQ01zZ1NvdW5kc19zb3VuZGRhdGFULmZyb21QYXJ0aWFsKGUpKSkgfHwgW107XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbn07XG5mdW5jdGlvbiBjcmVhdGVCYXNlQ1NWQ01zZ1NvdW5kc19zb3VuZGRhdGFUKCkge1xuICAgIHJldHVybiB7XG4gICAgICAgIG9yaWdpblg6IDAsXG4gICAgICAgIG9yaWdpblk6IDAsXG4gICAgICAgIG9yaWdpblo6IDAsXG4gICAgICAgIHZvbHVtZTogMCxcbiAgICAgICAgZGVsYXlWYWx1ZTogMCxcbiAgICAgICAgc2VxdWVuY2VOdW1iZXI6IDAsXG4gICAgICAgIGVudGl0eUluZGV4OiAwLFxuICAgICAgICBjaGFubmVsOiAwLFxuICAgICAgICBwaXRjaDogMCxcbiAgICAgICAgZmxhZ3M6IDAsXG4gICAgICAgIHNvdW5kTnVtOiAwLFxuICAgICAgICBzb3VuZE51bUhhbmRsZTogMCxcbiAgICAgICAgc3BlYWtlckVudGl0eTogMCxcbiAgICAgICAgcmFuZG9tU2VlZDogMCxcbiAgICAgICAgc291bmRMZXZlbDogMCxcbiAgICAgICAgaXNTZW50ZW5jZTogZmFsc2UsXG4gICAgICAgIGlzQW1iaWVudDogZmFsc2VcbiAgICB9O1xufVxuZXhwb3J0cy5DU1ZDTXNnU291bmRzX3NvdW5kZGF0YVQgPSB7XG4gICAgZW5jb2RlKG1lc3NhZ2UsIHdyaXRlciA9IG1pbmltYWxfMS5Xcml0ZXIuY3JlYXRlKCkpIHtcbiAgICAgICAgaWYgKG1lc3NhZ2Uub3JpZ2luWCAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig4KS5zaW50MzIobWVzc2FnZS5vcmlnaW5YKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5vcmlnaW5ZICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDE2KS5zaW50MzIobWVzc2FnZS5vcmlnaW5ZKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5vcmlnaW5aICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDI0KS5zaW50MzIobWVzc2FnZS5vcmlnaW5aKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS52b2x1bWUgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMzIpLnVpbnQzMihtZXNzYWdlLnZvbHVtZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UuZGVsYXlWYWx1ZSAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig0NSkuZmxvYXQobWVzc2FnZS5kZWxheVZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5zZXF1ZW5jZU51bWJlciAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig0OCkuaW50MzIobWVzc2FnZS5zZXF1ZW5jZU51bWJlcik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UuZW50aXR5SW5kZXggIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoNTYpLmludDMyKG1lc3NhZ2UuZW50aXR5SW5kZXgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLmNoYW5uZWwgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoNjQpLmludDMyKG1lc3NhZ2UuY2hhbm5lbCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UucGl0Y2ggIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoNzIpLmludDMyKG1lc3NhZ2UucGl0Y2gpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLmZsYWdzICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDgwKS5pbnQzMihtZXNzYWdlLmZsYWdzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5zb3VuZE51bSAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig4OCkudWludDMyKG1lc3NhZ2Uuc291bmROdW0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLnNvdW5kTnVtSGFuZGxlICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDEwMSkuZml4ZWQzMihtZXNzYWdlLnNvdW5kTnVtSGFuZGxlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5zcGVha2VyRW50aXR5ICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDEwNCkuaW50MzIobWVzc2FnZS5zcGVha2VyRW50aXR5KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5yYW5kb21TZWVkICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDExMikuaW50MzIobWVzc2FnZS5yYW5kb21TZWVkKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5zb3VuZExldmVsICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDEyMCkuaW50MzIobWVzc2FnZS5zb3VuZExldmVsKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5pc1NlbnRlbmNlID09PSB0cnVlKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDEyOCkuYm9vbChtZXNzYWdlLmlzU2VudGVuY2UpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLmlzQW1iaWVudCA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigxMzYpLmJvb2wobWVzc2FnZS5pc0FtYmllbnQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfSxcbiAgICBkZWNvZGUoaW5wdXQsIGxlbmd0aCkge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBpbnB1dCBpbnN0YW5jZW9mIG1pbmltYWxfMS5SZWFkZXIgPyBpbnB1dCA6IG5ldyBtaW5pbWFsXzEuUmVhZGVyKGlucHV0KTtcbiAgICAgICAgbGV0IGVuZCA9IGxlbmd0aCA9PT0gdW5kZWZpbmVkID8gcmVhZGVyLmxlbiA6IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ1NWQ01zZ1NvdW5kc19zb3VuZGRhdGFUKCk7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBjb25zdCB0YWcgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKHRhZyA+Pj4gMykge1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5vcmlnaW5YID0gcmVhZGVyLnNpbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Uub3JpZ2luWSA9IHJlYWRlci5zaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLm9yaWdpblogPSByZWFkZXIuc2ludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS52b2x1bWUgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5kZWxheVZhbHVlID0gcmVhZGVyLmZsb2F0KCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5zZXF1ZW5jZU51bWJlciA9IHJlYWRlci5pbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZW50aXR5SW5kZXggPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA4OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmNoYW5uZWwgPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA5OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnBpdGNoID0gcmVhZGVyLmludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMTA6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZmxhZ3MgPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAxMTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5zb3VuZE51bSA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAxMjpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5zb3VuZE51bUhhbmRsZSA9IHJlYWRlci5maXhlZDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMTM6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Uuc3BlYWtlckVudGl0eSA9IHJlYWRlci5pbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDE0OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnJhbmRvbVNlZWQgPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAxNTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5zb3VuZExldmVsID0gcmVhZGVyLmludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMTY6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuaXNTZW50ZW5jZSA9IHJlYWRlci5ib29sKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMTc6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuaXNBbWJpZW50ID0gcmVhZGVyLmJvb2woKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmVhZGVyLnNraXBUeXBlKHRhZyAmIDcpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9LFxuICAgIGZyb21QYXJ0aWFsKG9iamVjdCkge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYywgX2QsIF9lLCBfZiwgX2csIF9oLCBfaiwgX2ssIF9sLCBfbSwgX28sIF9wLCBfcSwgX3IsIF9zO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNTVkNNc2dTb3VuZHNfc291bmRkYXRhVCgpO1xuICAgICAgICBtZXNzYWdlLm9yaWdpblggPSAoX2EgPSBvYmplY3Qub3JpZ2luWCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMDtcbiAgICAgICAgbWVzc2FnZS5vcmlnaW5ZID0gKF9iID0gb2JqZWN0Lm9yaWdpblkpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IDA7XG4gICAgICAgIG1lc3NhZ2Uub3JpZ2luWiA9IChfYyA9IG9iamVjdC5vcmlnaW5aKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiAwO1xuICAgICAgICBtZXNzYWdlLnZvbHVtZSA9IChfZCA9IG9iamVjdC52b2x1bWUpICE9PSBudWxsICYmIF9kICE9PSB2b2lkIDAgPyBfZCA6IDA7XG4gICAgICAgIG1lc3NhZ2UuZGVsYXlWYWx1ZSA9IChfZSA9IG9iamVjdC5kZWxheVZhbHVlKSAhPT0gbnVsbCAmJiBfZSAhPT0gdm9pZCAwID8gX2UgOiAwO1xuICAgICAgICBtZXNzYWdlLnNlcXVlbmNlTnVtYmVyID0gKF9mID0gb2JqZWN0LnNlcXVlbmNlTnVtYmVyKSAhPT0gbnVsbCAmJiBfZiAhPT0gdm9pZCAwID8gX2YgOiAwO1xuICAgICAgICBtZXNzYWdlLmVudGl0eUluZGV4ID0gKF9nID0gb2JqZWN0LmVudGl0eUluZGV4KSAhPT0gbnVsbCAmJiBfZyAhPT0gdm9pZCAwID8gX2cgOiAwO1xuICAgICAgICBtZXNzYWdlLmNoYW5uZWwgPSAoX2ggPSBvYmplY3QuY2hhbm5lbCkgIT09IG51bGwgJiYgX2ggIT09IHZvaWQgMCA/IF9oIDogMDtcbiAgICAgICAgbWVzc2FnZS5waXRjaCA9IChfaiA9IG9iamVjdC5waXRjaCkgIT09IG51bGwgJiYgX2ogIT09IHZvaWQgMCA/IF9qIDogMDtcbiAgICAgICAgbWVzc2FnZS5mbGFncyA9IChfayA9IG9iamVjdC5mbGFncykgIT09IG51bGwgJiYgX2sgIT09IHZvaWQgMCA/IF9rIDogMDtcbiAgICAgICAgbWVzc2FnZS5zb3VuZE51bSA9IChfbCA9IG9iamVjdC5zb3VuZE51bSkgIT09IG51bGwgJiYgX2wgIT09IHZvaWQgMCA/IF9sIDogMDtcbiAgICAgICAgbWVzc2FnZS5zb3VuZE51bUhhbmRsZSA9IChfbSA9IG9iamVjdC5zb3VuZE51bUhhbmRsZSkgIT09IG51bGwgJiYgX20gIT09IHZvaWQgMCA/IF9tIDogMDtcbiAgICAgICAgbWVzc2FnZS5zcGVha2VyRW50aXR5ID0gKF9vID0gb2JqZWN0LnNwZWFrZXJFbnRpdHkpICE9PSBudWxsICYmIF9vICE9PSB2b2lkIDAgPyBfbyA6IDA7XG4gICAgICAgIG1lc3NhZ2UucmFuZG9tU2VlZCA9IChfcCA9IG9iamVjdC5yYW5kb21TZWVkKSAhPT0gbnVsbCAmJiBfcCAhPT0gdm9pZCAwID8gX3AgOiAwO1xuICAgICAgICBtZXNzYWdlLnNvdW5kTGV2ZWwgPSAoX3EgPSBvYmplY3Quc291bmRMZXZlbCkgIT09IG51bGwgJiYgX3EgIT09IHZvaWQgMCA/IF9xIDogMDtcbiAgICAgICAgbWVzc2FnZS5pc1NlbnRlbmNlID0gKF9yID0gb2JqZWN0LmlzU2VudGVuY2UpICE9PSBudWxsICYmIF9yICE9PSB2b2lkIDAgPyBfciA6IGZhbHNlO1xuICAgICAgICBtZXNzYWdlLmlzQW1iaWVudCA9IChfcyA9IG9iamVjdC5pc0FtYmllbnQpICE9PSBudWxsICYmIF9zICE9PSB2b2lkIDAgPyBfcyA6IGZhbHNlO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG59O1xuZnVuY3Rpb24gY3JlYXRlQmFzZUNTVkNNc2dFbnRpdHlNc2coKSB7XG4gICAgcmV0dXJuIHsgZW50SW5kZXg6IDAsIGNsYXNzSWQ6IDAsIGVudERhdGE6IG5ldyBVaW50OEFycmF5KCkgfTtcbn1cbmV4cG9ydHMuQ1NWQ01zZ0VudGl0eU1zZyA9IHtcbiAgICBlbmNvZGUobWVzc2FnZSwgd3JpdGVyID0gbWluaW1hbF8xLldyaXRlci5jcmVhdGUoKSkge1xuICAgICAgICBpZiAobWVzc2FnZS5lbnRJbmRleCAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig4KS5pbnQzMihtZXNzYWdlLmVudEluZGV4KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5jbGFzc0lkICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDE2KS5pbnQzMihtZXNzYWdlLmNsYXNzSWQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLmVudERhdGEubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDI2KS5ieXRlcyhtZXNzYWdlLmVudERhdGEpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfSxcbiAgICBkZWNvZGUoaW5wdXQsIGxlbmd0aCkge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBpbnB1dCBpbnN0YW5jZW9mIG1pbmltYWxfMS5SZWFkZXIgPyBpbnB1dCA6IG5ldyBtaW5pbWFsXzEuUmVhZGVyKGlucHV0KTtcbiAgICAgICAgbGV0IGVuZCA9IGxlbmd0aCA9PT0gdW5kZWZpbmVkID8gcmVhZGVyLmxlbiA6IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQ1NWQ01zZ0VudGl0eU1zZygpO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZW50SW5kZXggPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmNsYXNzSWQgPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmVudERhdGEgPSByZWFkZXIuYnl0ZXMoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmVhZGVyLnNraXBUeXBlKHRhZyAmIDcpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9LFxuICAgIGZyb21QYXJ0aWFsKG9iamVjdCkge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYztcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDU1ZDTXNnRW50aXR5TXNnKCk7XG4gICAgICAgIG1lc3NhZ2UuZW50SW5kZXggPSAoX2EgPSBvYmplY3QuZW50SW5kZXgpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IDA7XG4gICAgICAgIG1lc3NhZ2UuY2xhc3NJZCA9IChfYiA9IG9iamVjdC5jbGFzc0lkKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAwO1xuICAgICAgICBtZXNzYWdlLmVudERhdGEgPSAoX2MgPSBvYmplY3QuZW50RGF0YSkgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogbmV3IFVpbnQ4QXJyYXkoKTtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxufTtcbmZ1bmN0aW9uIGNyZWF0ZUJhc2VDU1ZDTXNnQ21kS2V5VmFsdWVzKCkge1xuICAgIHJldHVybiB7IGtleXZhbHVlczogbmV3IFVpbnQ4QXJyYXkoKSB9O1xufVxuZXhwb3J0cy5DU1ZDTXNnQ21kS2V5VmFsdWVzID0ge1xuICAgIGVuY29kZShtZXNzYWdlLCB3cml0ZXIgPSBtaW5pbWFsXzEuV3JpdGVyLmNyZWF0ZSgpKSB7XG4gICAgICAgIGlmIChtZXNzYWdlLmtleXZhbHVlcy5sZW5ndGggIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMTApLmJ5dGVzKG1lc3NhZ2Uua2V5dmFsdWVzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH0sXG4gICAgZGVjb2RlKGlucHV0LCBsZW5ndGgpIHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gaW5wdXQgaW5zdGFuY2VvZiBtaW5pbWFsXzEuUmVhZGVyID8gaW5wdXQgOiBuZXcgbWluaW1hbF8xLlJlYWRlcihpbnB1dCk7XG4gICAgICAgIGxldCBlbmQgPSBsZW5ndGggPT09IHVuZGVmaW5lZCA/IHJlYWRlci5sZW4gOiByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNTVkNNc2dDbWRLZXlWYWx1ZXMoKTtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhZyA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgIHN3aXRjaCAodGFnID4+PiAzKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmtleXZhbHVlcyA9IHJlYWRlci5ieXRlcygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICByZWFkZXIuc2tpcFR5cGUodGFnICYgNyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH0sXG4gICAgZnJvbVBhcnRpYWwob2JqZWN0KSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDU1ZDTXNnQ21kS2V5VmFsdWVzKCk7XG4gICAgICAgIG1lc3NhZ2Uua2V5dmFsdWVzID0gKF9hID0gb2JqZWN0LmtleXZhbHVlcykgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogbmV3IFVpbnQ4QXJyYXkoKTtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxufTtcbmZ1bmN0aW9uIGNyZWF0ZUJhc2VDU1ZDTXNnRW5jcnlwdGVkRGF0YSgpIHtcbiAgICByZXR1cm4geyBlbmNyeXB0ZWQ6IG5ldyBVaW50OEFycmF5KCksIGtleVR5cGU6IDAgfTtcbn1cbmV4cG9ydHMuQ1NWQ01zZ0VuY3J5cHRlZERhdGEgPSB7XG4gICAgZW5jb2RlKG1lc3NhZ2UsIHdyaXRlciA9IG1pbmltYWxfMS5Xcml0ZXIuY3JlYXRlKCkpIHtcbiAgICAgICAgaWYgKG1lc3NhZ2UuZW5jcnlwdGVkLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigxMCkuYnl0ZXMobWVzc2FnZS5lbmNyeXB0ZWQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLmtleVR5cGUgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMTYpLmludDMyKG1lc3NhZ2Uua2V5VHlwZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9LFxuICAgIGRlY29kZShpbnB1dCwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IGlucHV0IGluc3RhbmNlb2YgbWluaW1hbF8xLlJlYWRlciA/IGlucHV0IDogbmV3IG1pbmltYWxfMS5SZWFkZXIoaW5wdXQpO1xuICAgICAgICBsZXQgZW5kID0gbGVuZ3RoID09PSB1bmRlZmluZWQgPyByZWFkZXIubGVuIDogcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDU1ZDTXNnRW5jcnlwdGVkRGF0YSgpO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZW5jcnlwdGVkID0gcmVhZGVyLmJ5dGVzKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5rZXlUeXBlID0gcmVhZGVyLmludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJlYWRlci5za2lwVHlwZSh0YWcgJiA3KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfSxcbiAgICBmcm9tUGFydGlhbChvYmplY3QpIHtcbiAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDU1ZDTXNnRW5jcnlwdGVkRGF0YSgpO1xuICAgICAgICBtZXNzYWdlLmVuY3J5cHRlZCA9IChfYSA9IG9iamVjdC5lbmNyeXB0ZWQpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IG5ldyBVaW50OEFycmF5KCk7XG4gICAgICAgIG1lc3NhZ2Uua2V5VHlwZSA9IChfYiA9IG9iamVjdC5rZXlUeXBlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAwO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG59O1xuZnVuY3Rpb24gY3JlYXRlQmFzZUNTVkNNc2dIbHR2UmVwbGF5KCkge1xuICAgIHJldHVybiB7XG4gICAgICAgIGRlbGF5OiAwLFxuICAgICAgICBwcmltYXJ5VGFyZ2V0OiAwLFxuICAgICAgICByZXBsYXlTdG9wQXQ6IDAsXG4gICAgICAgIHJlcGxheVN0YXJ0QXQ6IDAsXG4gICAgICAgIHJlcGxheVNsb3dkb3duQmVnaW46IDAsXG4gICAgICAgIHJlcGxheVNsb3dkb3duRW5kOiAwLFxuICAgICAgICByZXBsYXlTbG93ZG93blJhdGU6IDBcbiAgICB9O1xufVxuZXhwb3J0cy5DU1ZDTXNnSGx0dlJlcGxheSA9IHtcbiAgICBlbmNvZGUobWVzc2FnZSwgd3JpdGVyID0gbWluaW1hbF8xLldyaXRlci5jcmVhdGUoKSkge1xuICAgICAgICBpZiAobWVzc2FnZS5kZWxheSAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig4KS5pbnQzMihtZXNzYWdlLmRlbGF5KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5wcmltYXJ5VGFyZ2V0ICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDE2KS5pbnQzMihtZXNzYWdlLnByaW1hcnlUYXJnZXQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLnJlcGxheVN0b3BBdCAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigyNCkuaW50MzIobWVzc2FnZS5yZXBsYXlTdG9wQXQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLnJlcGxheVN0YXJ0QXQgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMzIpLmludDMyKG1lc3NhZ2UucmVwbGF5U3RhcnRBdCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UucmVwbGF5U2xvd2Rvd25CZWdpbiAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig0MCkuaW50MzIobWVzc2FnZS5yZXBsYXlTbG93ZG93bkJlZ2luKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5yZXBsYXlTbG93ZG93bkVuZCAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMig0OCkuaW50MzIobWVzc2FnZS5yZXBsYXlTbG93ZG93bkVuZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UucmVwbGF5U2xvd2Rvd25SYXRlICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDYxKS5mbG9hdChtZXNzYWdlLnJlcGxheVNsb3dkb3duUmF0ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9LFxuICAgIGRlY29kZShpbnB1dCwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IGlucHV0IGluc3RhbmNlb2YgbWluaW1hbF8xLlJlYWRlciA/IGlucHV0IDogbmV3IG1pbmltYWxfMS5SZWFkZXIoaW5wdXQpO1xuICAgICAgICBsZXQgZW5kID0gbGVuZ3RoID09PSB1bmRlZmluZWQgPyByZWFkZXIubGVuIDogcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDU1ZDTXNnSGx0dlJlcGxheSgpO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZGVsYXkgPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnByaW1hcnlUYXJnZXQgPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnJlcGxheVN0b3BBdCA9IHJlYWRlci5pbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UucmVwbGF5U3RhcnRBdCA9IHJlYWRlci5pbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UucmVwbGF5U2xvd2Rvd25CZWdpbiA9IHJlYWRlci5pbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UucmVwbGF5U2xvd2Rvd25FbmQgPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA3OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnJlcGxheVNsb3dkb3duUmF0ZSA9IHJlYWRlci5mbG9hdCgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICByZWFkZXIuc2tpcFR5cGUodGFnICYgNyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH0sXG4gICAgZnJvbVBhcnRpYWwob2JqZWN0KSB7XG4gICAgICAgIHZhciBfYSwgX2IsIF9jLCBfZCwgX2UsIF9mLCBfZztcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDU1ZDTXNnSGx0dlJlcGxheSgpO1xuICAgICAgICBtZXNzYWdlLmRlbGF5ID0gKF9hID0gb2JqZWN0LmRlbGF5KSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAwO1xuICAgICAgICBtZXNzYWdlLnByaW1hcnlUYXJnZXQgPSAoX2IgPSBvYmplY3QucHJpbWFyeVRhcmdldCkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogMDtcbiAgICAgICAgbWVzc2FnZS5yZXBsYXlTdG9wQXQgPSAoX2MgPSBvYmplY3QucmVwbGF5U3RvcEF0KSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiAwO1xuICAgICAgICBtZXNzYWdlLnJlcGxheVN0YXJ0QXQgPSAoX2QgPSBvYmplY3QucmVwbGF5U3RhcnRBdCkgIT09IG51bGwgJiYgX2QgIT09IHZvaWQgMCA/IF9kIDogMDtcbiAgICAgICAgbWVzc2FnZS5yZXBsYXlTbG93ZG93bkJlZ2luID0gKF9lID0gb2JqZWN0LnJlcGxheVNsb3dkb3duQmVnaW4pICE9PSBudWxsICYmIF9lICE9PSB2b2lkIDAgPyBfZSA6IDA7XG4gICAgICAgIG1lc3NhZ2UucmVwbGF5U2xvd2Rvd25FbmQgPSAoX2YgPSBvYmplY3QucmVwbGF5U2xvd2Rvd25FbmQpICE9PSBudWxsICYmIF9mICE9PSB2b2lkIDAgPyBfZiA6IDA7XG4gICAgICAgIG1lc3NhZ2UucmVwbGF5U2xvd2Rvd25SYXRlID0gKF9nID0gb2JqZWN0LnJlcGxheVNsb3dkb3duUmF0ZSkgIT09IG51bGwgJiYgX2cgIT09IHZvaWQgMCA/IF9nIDogMDtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxufTtcbmZ1bmN0aW9uIGNyZWF0ZUJhc2VDQ0xDTXNnSGx0dlJlcGxheSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICByZXF1ZXN0OiAwLFxuICAgICAgICBzbG93ZG93bkxlbmd0aDogMCxcbiAgICAgICAgc2xvd2Rvd25SYXRlOiAwLFxuICAgICAgICBwcmltYXJ5VGFyZ2V0RW50SW5kZXg6IDAsXG4gICAgICAgIGV2ZW50VGltZTogMFxuICAgIH07XG59XG5leHBvcnRzLkNDTENNc2dIbHR2UmVwbGF5ID0ge1xuICAgIGVuY29kZShtZXNzYWdlLCB3cml0ZXIgPSBtaW5pbWFsXzEuV3JpdGVyLmNyZWF0ZSgpKSB7XG4gICAgICAgIGlmIChtZXNzYWdlLnJlcXVlc3QgIT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoOCkuaW50MzIobWVzc2FnZS5yZXF1ZXN0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5zbG93ZG93bkxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGVyLnVpbnQzMigyMSkuZmxvYXQobWVzc2FnZS5zbG93ZG93bkxlbmd0aCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2Uuc2xvd2Rvd25SYXRlICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDI5KS5mbG9hdChtZXNzYWdlLnNsb3dkb3duUmF0ZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UucHJpbWFyeVRhcmdldEVudEluZGV4ICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDMyKS5pbnQzMihtZXNzYWdlLnByaW1hcnlUYXJnZXRFbnRJbmRleCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UuZXZlbnRUaW1lICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0ZXIudWludDMyKDQ1KS5mbG9hdChtZXNzYWdlLmV2ZW50VGltZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9LFxuICAgIGRlY29kZShpbnB1dCwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IGlucHV0IGluc3RhbmNlb2YgbWluaW1hbF8xLlJlYWRlciA/IGlucHV0IDogbmV3IG1pbmltYWxfMS5SZWFkZXIoaW5wdXQpO1xuICAgICAgICBsZXQgZW5kID0gbGVuZ3RoID09PSB1bmRlZmluZWQgPyByZWFkZXIubGVuIDogcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDQ0xDTXNnSGx0dlJlcGxheSgpO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UucmVxdWVzdCA9IHJlYWRlci5pbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Uuc2xvd2Rvd25MZW5ndGggPSByZWFkZXIuZmxvYXQoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnNsb3dkb3duUmF0ZSA9IHJlYWRlci5mbG9hdCgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UucHJpbWFyeVRhcmdldEVudEluZGV4ID0gcmVhZGVyLmludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5ldmVudFRpbWUgPSByZWFkZXIuZmxvYXQoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmVhZGVyLnNraXBUeXBlKHRhZyAmIDcpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9LFxuICAgIGZyb21QYXJ0aWFsKG9iamVjdCkge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYywgX2QsIF9lO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUNDTENNc2dIbHR2UmVwbGF5KCk7XG4gICAgICAgIG1lc3NhZ2UucmVxdWVzdCA9IChfYSA9IG9iamVjdC5yZXF1ZXN0KSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAwO1xuICAgICAgICBtZXNzYWdlLnNsb3dkb3duTGVuZ3RoID0gKF9iID0gb2JqZWN0LnNsb3dkb3duTGVuZ3RoKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAwO1xuICAgICAgICBtZXNzYWdlLnNsb3dkb3duUmF0ZSA9IChfYyA9IG9iamVjdC5zbG93ZG93blJhdGUpICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IDA7XG4gICAgICAgIG1lc3NhZ2UucHJpbWFyeVRhcmdldEVudEluZGV4ID0gKF9kID0gb2JqZWN0LnByaW1hcnlUYXJnZXRFbnRJbmRleCkgIT09IG51bGwgJiYgX2QgIT09IHZvaWQgMCA/IF9kIDogMDtcbiAgICAgICAgbWVzc2FnZS5ldmVudFRpbWUgPSAoX2UgPSBvYmplY3QuZXZlbnRUaW1lKSAhPT0gbnVsbCAmJiBfZSAhPT0gdm9pZCAwID8gX2UgOiAwO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG59O1xuZnVuY3Rpb24gY3JlYXRlQmFzZUNTVkNNc2dCcm9hZGNhc3RDb21tYW5kKCkge1xuICAgIHJldHVybiB7IGNtZDogXCJcIiB9O1xufVxuZXhwb3J0cy5DU1ZDTXNnQnJvYWRjYXN0Q29tbWFuZCA9IHtcbiAgICBlbmNvZGUobWVzc2FnZSwgd3JpdGVyID0gbWluaW1hbF8xLldyaXRlci5jcmVhdGUoKSkge1xuICAgICAgICBpZiAobWVzc2FnZS5jbWQgIT09IFwiXCIpIHtcbiAgICAgICAgICAgIHdyaXRlci51aW50MzIoMTApLnN0cmluZyhtZXNzYWdlLmNtZCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9LFxuICAgIGRlY29kZShpbnB1dCwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IGlucHV0IGluc3RhbmNlb2YgbWluaW1hbF8xLlJlYWRlciA/IGlucHV0IDogbmV3IG1pbmltYWxfMS5SZWFkZXIoaW5wdXQpO1xuICAgICAgICBsZXQgZW5kID0gbGVuZ3RoID09PSB1bmRlZmluZWQgPyByZWFkZXIubGVuIDogcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDU1ZDTXNnQnJvYWRjYXN0Q29tbWFuZCgpO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgY29uc3QgdGFnID0gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgc3dpdGNoICh0YWcgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuY21kID0gcmVhZGVyLnN0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICByZWFkZXIuc2tpcFR5cGUodGFnICYgNyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH0sXG4gICAgZnJvbVBhcnRpYWwob2JqZWN0KSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VDU1ZDTXNnQnJvYWRjYXN0Q29tbWFuZCgpO1xuICAgICAgICBtZXNzYWdlLmNtZCA9IChfYSA9IG9iamVjdC5jbWQpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IFwiXCI7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbn07XG4vLyBJZiB5b3UgZ2V0IGEgY29tcGlsZS1lcnJvciBhYm91dCAnQ29uc3RydWN0b3I8TG9uZz4gYW5kIC4uLiBoYXZlIG5vIG92ZXJsYXAnLFxuLy8gYWRkICctLXRzX3Byb3RvX29wdD1lc01vZHVsZUludGVyb3A9dHJ1ZScgYXMgYSBmbGFnIHdoZW4gY2FsbGluZyAncHJvdG9jJy5cbmlmIChtaW5pbWFsXzEudXRpbC5Mb25nICE9PSBMb25nKSB7XG4gICAgbWluaW1hbF8xLnV0aWwuTG9uZyA9IExvbmc7XG4gICAgKDAsIG1pbmltYWxfMS5jb25maWd1cmUpKCk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1uZXRtZXNzYWdlcy5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuZGVjb2RlU2hhcmVDb2RlID0gdm9pZCAwO1xuY29uc3QgYmlnSW50ID0gcmVxdWlyZShcImJpZy1pbnRlZ2VyXCIpO1xuY29uc3QgRElDVElPTkFSWSA9IFwiQUJDREVGR0hKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmhpamttbm9wcXJzdHV2d3h5ejIzNDU2Nzg5XCI7XG5mdW5jdGlvbiBkZWNvZGVTaGFyZUNvZGUoc2hhcmVDb2RlKSB7XG4gICAgaWYgKCEvXkNTR08oLVtcXHddezV9KXs1fSQvLmV4ZWMoc2hhcmVDb2RlKSlcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIHNoYXJlIGNvZGU6ICR7c2hhcmVDb2RlfWApO1xuICAgIGNvbnN0IGNvZGUgPSBzaGFyZUNvZGUuc3Vic3RyaW5nKDUpLnJlcGxhY2UoLy0vZywgXCJcIik7XG4gICAgbGV0IGJpZyA9IGJpZ0ludC56ZXJvO1xuICAgIGZvciAobGV0IGkgPSBjb2RlLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgIGJpZyA9IGJpZy5tdWx0aXBseShESUNUSU9OQVJZLmxlbmd0aCkucGx1cyhESUNUSU9OQVJZLmluZGV4T2YoY29kZVtpXSkpO1xuICAgIH1cbiAgICBjb25zdCBhcnJheSA9IGJpZy50b0FycmF5KDI1NikudmFsdWU7XG4gICAgaWYgKGFycmF5Lmxlbmd0aCA9PT0gMTgpIHtcbiAgICAgICAgYXJyYXkudW5zaGlmdCgwKTtcbiAgICB9XG4gICAgcmV0dXJuIGFycmF5O1xufVxuZXhwb3J0cy5kZWNvZGVTaGFyZUNvZGUgPSBkZWNvZGVTaGFyZUNvZGU7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zaGFyZWNvZGUuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLlN0cmluZ1RhYmxlcyA9IHZvaWQgMDtcbmNvbnN0IGFzc2VydCA9IHJlcXVpcmUoXCJhc3NlcnRcIik7XG5jb25zdCBCeXRlQnVmZmVyID0gcmVxdWlyZShcImJ5dGVidWZmZXJcIik7XG5jb25zdCBldmVudHNfMSA9IHJlcXVpcmUoXCJldmVudHNcIik7XG5jb25zdCBMb25nID0gcmVxdWlyZShcImxvbmdcIik7XG5jb25zdCBhc3NlcnRfZXhpc3RzXzEgPSByZXF1aXJlKFwiLi9hc3NlcnQtZXhpc3RzXCIpO1xuY29uc3QgY29uc3RzID0gcmVxdWlyZShcIi4vY29uc3RzXCIpO1xuY29uc3QgY29uc3RzXzEgPSByZXF1aXJlKFwiLi9jb25zdHNcIik7XG5jb25zdCBiaXRidWZmZXJfMSA9IHJlcXVpcmUoXCIuL2V4dC9iaXRidWZmZXJcIik7XG5mdW5jdGlvbiBwYXJzZVVzZXJJbmZvRGF0YShidWYpIHtcbiAgICBjb25zdCBieXRlYnVmID0gQnl0ZUJ1ZmZlci53cmFwKGJ1ZiwgQnl0ZUJ1ZmZlci5CSUdfRU5ESUFOKTtcbiAgICBieXRlYnVmLnNraXAoOCk7XG4gICAgY29uc3QgaGkgPSBieXRlYnVmLnJlYWRVaW50MzIoKTtcbiAgICBjb25zdCBsbyA9IGJ5dGVidWYucmVhZFVpbnQzMigpO1xuICAgIGNvbnN0IHh1aWQgPSBMb25nLmZyb21CaXRzKGxvLCBoaSk7XG4gICAgY29uc3QgbmFtZSA9IGJ5dGVidWZcbiAgICAgICAgLnJlYWRTdHJpbmcoY29uc3RzXzEuTUFYX1BMQVlFUl9OQU1FX0xFTkdUSCwgQnl0ZUJ1ZmZlci5NRVRSSUNTX0JZVEVTKVxuICAgICAgICAuc3BsaXQoXCJcXDBcIiwgMilbMF07XG4gICAgY29uc3QgdXNlcklkID0gYnl0ZWJ1Zi5yZWFkVWludDMyKCk7XG4gICAgY29uc3QgZ3VpZCA9IGJ5dGVidWZcbiAgICAgICAgLnJlYWRTdHJpbmcoY29uc3RzXzEuU0lHTkVEX0dVSURfTEVOICsgMSwgQnl0ZUJ1ZmZlci5NRVRSSUNTX0JZVEVTKVxuICAgICAgICAuc3BsaXQoXCJcXDBcIiwgMilbMF07XG4gICAgYnl0ZWJ1Zi5za2lwKDMpO1xuICAgIGNvbnN0IGZyaWVuZHNJZCA9IGJ5dGVidWYucmVhZFVpbnQzMigpO1xuICAgIGNvbnN0IGZyaWVuZHNOYW1lID0gYnl0ZWJ1ZlxuICAgICAgICAucmVhZFN0cmluZyhjb25zdHNfMS5NQVhfUExBWUVSX05BTUVfTEVOR1RILCBCeXRlQnVmZmVyLk1FVFJJQ1NfQllURVMpXG4gICAgICAgIC5zcGxpdChcIlxcMFwiLCAyKVswXTtcbiAgICBjb25zdCBmYWtlUGxheWVyID0gYnl0ZWJ1Zi5yZWFkQnl0ZSgpICE9PSAwO1xuICAgIGJ5dGVidWYuc2tpcCgzKTtcbiAgICBjb25zdCBpc0hsdHYgPSBieXRlYnVmLnJlYWRCeXRlKCkgIT09IDA7XG4gICAgYnl0ZWJ1Zi5za2lwKDMpO1xuICAgIHJldHVybiB7XG4gICAgICAgIHh1aWQsXG4gICAgICAgIG5hbWUsXG4gICAgICAgIHVzZXJJZCxcbiAgICAgICAgZ3VpZCxcbiAgICAgICAgZnJpZW5kc0lkLFxuICAgICAgICBmcmllbmRzTmFtZSxcbiAgICAgICAgZmFrZVBsYXllcixcbiAgICAgICAgaXNIbHR2XG4gICAgfTtcbn1cbi8qKlxuICogSGFuZGxlcyBzdHJpbmcgdGFibGVzIGZvciBhIGRlbW8gZmlsZS5cbiAqL1xuY2xhc3MgU3RyaW5nVGFibGVzIGV4dGVuZHMgZXZlbnRzXzEuRXZlbnRFbWl0dGVyIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy50YWJsZXMgPSBbXTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZXIgZGF0YSBoYW5kbGVycy4gVHJhbnNmb3JtIHJhdyBidWZmZXIgaW50byBhbnkgb3RoZXIgdmFsdWUuXG4gICAgICAgICAqIEJ5IGRlZmF1bHQsIGB1c2VyaW5mb2AgdXNlciBkYXRhIGlzIHRyYW5zZm9ybWVkIHRvIHtAbGluayBQbGF5ZXJJbmZvfVxuICAgICAgICAgKiBvYmplY3RzLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy51c2VyRGF0YUNhbGxiYWNrcyA9IHtcbiAgICAgICAgICAgIHVzZXJpbmZvOiBwYXJzZVVzZXJJbmZvRGF0YVxuICAgICAgICB9O1xuICAgIH1cbiAgICBsaXN0ZW4obWVzc2FnZUV2ZW50cykge1xuICAgICAgICBtZXNzYWdlRXZlbnRzLm9uKFwic3ZjX1VwZGF0ZVN0cmluZ1RhYmxlXCIsIHRoaXMuX2hhbmRsZVVwZGF0ZVN0cmluZ1RhYmxlLmJpbmQodGhpcykpO1xuICAgICAgICBtZXNzYWdlRXZlbnRzLm9uKFwic3ZjX0NyZWF0ZVN0cmluZ1RhYmxlXCIsIHRoaXMuX2hhbmRsZUNyZWF0ZVN0cmluZ1RhYmxlLmJpbmQodGhpcykpO1xuICAgIH1cbiAgICBmaW5kVGFibGVCeU5hbWUobmFtZSkge1xuICAgICAgICByZXR1cm4gdGhpcy50YWJsZXMuZmluZCh0YWJsZSA9PiB0YWJsZS5uYW1lID09PSBuYW1lKTtcbiAgICB9XG4gICAgaGFuZGxlU3RyaW5nVGFibGVzKGJpdGJ1Zikge1xuICAgICAgICBjb25zdCBudW1UYWJsZXMgPSBiaXRidWYucmVhZFVJbnQ4KCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtVGFibGVzOyArK2kpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhYmxlTmFtZSA9IGJpdGJ1Zi5yZWFkQ1N0cmluZygpO1xuICAgICAgICAgICAgdGhpcy5faGFuZGxlU3RyaW5nVGFibGUodGFibGVOYW1lLCBiaXRidWYpO1xuICAgICAgICB9XG4gICAgfVxuICAgIF9oYW5kbGVTdHJpbmdUYWJsZShuYW1lLCBiaXRidWYpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBjb25zdCB1c2VyRGF0YUNhbGxiYWNrID0gdGhpcy51c2VyRGF0YUNhbGxiYWNrc1tuYW1lXTtcbiAgICAgICAgY29uc3QgdGFibGUgPSAoMCwgYXNzZXJ0X2V4aXN0c18xLmRlZmF1bHQpKHRoaXMuZmluZFRhYmxlQnlOYW1lKG5hbWUpKTtcbiAgICAgICAgY29uc3QgbnVtRW50cmllcyA9IGJpdGJ1Zi5yZWFkVUludDE2KCk7XG4gICAgICAgIGZvciAobGV0IGVudHJ5SW5kZXggPSAwOyBlbnRyeUluZGV4IDwgbnVtRW50cmllczsgKytlbnRyeUluZGV4KSB7XG4gICAgICAgICAgICBjb25zdCBlbnRyeSA9IGJpdGJ1Zi5yZWFkQ1N0cmluZygpO1xuICAgICAgICAgICAgbGV0IHVzZXJEYXRhID0gbnVsbDtcbiAgICAgICAgICAgIC8vIGhhcyB1c2VyIGRhdGE/XG4gICAgICAgICAgICBpZiAoYml0YnVmLnJlYWRPbmVCaXQoKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHVzZXJEYXRhU2l6ZSA9IGJpdGJ1Zi5yZWFkVUludDE2KCk7XG4gICAgICAgICAgICAgICAgY29uc3QgdXNlckRhdGFCdWYgPSBiaXRidWYucmVhZEJ5dGVzKHVzZXJEYXRhU2l6ZSk7XG4gICAgICAgICAgICAgICAgdXNlckRhdGEgPVxuICAgICAgICAgICAgICAgICAgICB1c2VyRGF0YUNhbGxiYWNrID09PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICAgICAgICAgID8gdXNlckRhdGFCdWZcbiAgICAgICAgICAgICAgICAgICAgICAgIDogdXNlckRhdGFDYWxsYmFjayh1c2VyRGF0YUJ1Zik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBvbGRVc2VyRGF0YSA9IChfYSA9IHRhYmxlLmVudHJpZXNbZW50cnlJbmRleF0pID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS51c2VyRGF0YTtcbiAgICAgICAgICAgIHRhYmxlLmVudHJpZXNbZW50cnlJbmRleF0gPSB7IGVudHJ5LCB1c2VyRGF0YSB9O1xuICAgICAgICAgICAgdGhpcy5lbWl0KFwidXBkYXRlXCIsIHtcbiAgICAgICAgICAgICAgICB0YWJsZSxcbiAgICAgICAgICAgICAgICBlbnRyeUluZGV4LFxuICAgICAgICAgICAgICAgIGVudHJ5LFxuICAgICAgICAgICAgICAgIHVzZXJEYXRhLFxuICAgICAgICAgICAgICAgIG9sZFVzZXJEYXRhXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBwYXJzZSBjbGllbnQtc2lkZSBlbnRyaWVzXG4gICAgICAgIGlmIChiaXRidWYucmVhZE9uZUJpdCgpKSB7XG4gICAgICAgICAgICBjb25zdCBudW1TdHJpbmdzID0gYml0YnVmLnJlYWRVSW50MTYoKTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtU3RyaW5nczsgKytpKSB7XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgICAgIGNvbnN0IGVudHJ5ID0gYml0YnVmLnJlYWRDU3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgbGV0IHVzZXJEYXRhID0gbnVsbDtcbiAgICAgICAgICAgICAgICBpZiAoYml0YnVmLnJlYWRPbmVCaXQoKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB1c2VyRGF0YVNpemUgPSBiaXRidWYucmVhZFVJbnQxNigpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB1c2VyRGF0YUJ1ZiA9IGJpdGJ1Zi5yZWFkQnl0ZXModXNlckRhdGFTaXplKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgICAgICAgICB1c2VyRGF0YSA9XG4gICAgICAgICAgICAgICAgICAgICAgICB1c2VyRGF0YUNhbGxiYWNrID09PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHVzZXJEYXRhQnVmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB1c2VyRGF0YUNhbGxiYWNrKHVzZXJEYXRhQnVmKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gVE9ETzogZG8gc29tZXRoaW5nIHdpdGggY2xpZW50LXNpZGUgZW50cmllc1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIHRhYmxlIGlzIHJlYWR5XG4gICAgICAgIHRoaXMuZW1pdChcInBvc3RjcmVhdGVcIiwgdGFibGUpO1xuICAgIH1cbiAgICBfcGFyc2VTdHJpbmdUYWJsZVVwZGF0ZShiaXRidWYsIHRhYmxlLCBlbnRyaWVzKSB7XG4gICAgICAgIGNvbnN0IGhpc3RvcnkgPSBbXTtcbiAgICAgICAgY29uc3QgZW50cnlCaXRzID0gTWF0aC5jZWlsKE1hdGgubG9nMih0YWJsZS5tYXhFbnRyaWVzKSk7XG4gICAgICAgIGNvbnN0IHVzZXJEYXRhQ2FsbGJhY2sgPSB0aGlzLnVzZXJEYXRhQ2FsbGJhY2tzW3RhYmxlLm5hbWVdO1xuICAgICAgICBhc3NlcnQoIWJpdGJ1Zi5yZWFkT25lQml0KCksIFwiZGljdGlvbmFyeSBlbmNvZGluZyB1bnN1cHBvcnRlZFwiKTtcbiAgICAgICAgbGV0IGVudHJ5SW5kZXggPSAtMTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbnRyaWVzOyArK2kpIHtcbiAgICAgICAgICAgIGVudHJ5SW5kZXggKz0gMTtcbiAgICAgICAgICAgIGlmICghYml0YnVmLnJlYWRPbmVCaXQoKSkge1xuICAgICAgICAgICAgICAgIGVudHJ5SW5kZXggPSBiaXRidWYucmVhZFVCaXRzKGVudHJ5Qml0cyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhc3NlcnQoZW50cnlJbmRleCA+PSAwICYmIGVudHJ5SW5kZXggPCB0YWJsZS5tYXhFbnRyaWVzLCBcImJvZ3VzIHN0cmluZyBpbmRleFwiKTtcbiAgICAgICAgICAgIGNvbnN0IGV4aXN0aW5nRW50cnkgPSB0YWJsZS5lbnRyaWVzW2VudHJ5SW5kZXhdO1xuICAgICAgICAgICAgbGV0IGVudHJ5ID0gbnVsbDtcbiAgICAgICAgICAgIC8vIGhhcyB0aGUgZW50cnkgY2hhbmdlZD9cbiAgICAgICAgICAgIGlmIChiaXRidWYucmVhZE9uZUJpdCgpKSB7XG4gICAgICAgICAgICAgICAgLy8gc3Vic3RyaW5nIGNoZWNrXG4gICAgICAgICAgICAgICAgaWYgKGJpdGJ1Zi5yZWFkT25lQml0KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSBiaXRidWYucmVhZFVCaXRzKDUpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBieXRlc1RvQ29weSA9IGJpdGJ1Zi5yZWFkVUJpdHMoY29uc3RzLlNVQlNUUklOR19CSVRTKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFzdCA9IGhpc3RvcnlbaW5kZXhdO1xuICAgICAgICAgICAgICAgICAgICBpZiAobGFzdCA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJzdHJpbmcgdGFibGUgZW50cnkgaXMgZGVsdGEgZnJvbSBub24gZXhpc3RlbnQgZW50cnlcIik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3ViU3RyID0gbGFzdC5zbGljZSgwLCBieXRlc1RvQ29weSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHN1ZmZpeCA9IGJpdGJ1Zi5yZWFkQ1N0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBlbnRyeSA9IHN1YlN0ciArIHN1ZmZpeDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGVudHJ5ID0gYml0YnVmLnJlYWRDU3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gSWYgdGhlIHN0cmluZyBpdHNlbGYgaGFzbid0IGNoYW5nZWQsIHRoaXMgZW50cnkgbXVzdCBhbHJlYWR5IGV4aXN0XG4gICAgICAgICAgICAgICAgZW50cnkgPSAoMCwgYXNzZXJ0X2V4aXN0c18xLmRlZmF1bHQpKGV4aXN0aW5nRW50cnkpLmVudHJ5O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gcmVhZCBpbiB0aGUgdXNlciBkYXRhXG4gICAgICAgICAgICBsZXQgdXNlckRhdGEgPSBudWxsO1xuICAgICAgICAgICAgaWYgKGJpdGJ1Zi5yZWFkT25lQml0KCkpIHtcbiAgICAgICAgICAgICAgICAvLyBkb24ndCByZWFkIHRoZSBsZW5ndGgsIGl0J3MgZml4ZWQgbGVuZ3RoIGFuZCB0aGUgbGVuZ3RoIHdhcyBuZXR3b3JrZWQgZG93biBhbHJlYWR5XG4gICAgICAgICAgICAgICAgaWYgKHRhYmxlLnVzZXJEYXRhRml4ZWRTaXplKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHVzZXJEYXRhQXJyYXkgPSBbYml0YnVmLnJlYWRVQml0cyh0YWJsZS51c2VyRGF0YVNpemVCaXRzKV07XG4gICAgICAgICAgICAgICAgICAgIHVzZXJEYXRhID0gQnVmZmVyLmZyb20odXNlckRhdGFBcnJheSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBieXRlcyA9IGJpdGJ1Zi5yZWFkVUJpdHMoY29uc3RzLk1BWF9VU0VSREFUQV9CSVRTKTtcbiAgICAgICAgICAgICAgICAgICAgdXNlckRhdGEgPSBiaXRidWYucmVhZEJ5dGVzKGJ5dGVzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHVzZXJEYXRhQ2FsbGJhY2sgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICB1c2VyRGF0YSA9IHVzZXJEYXRhQ2FsbGJhY2sodXNlckRhdGEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHVzZXJEYXRhID0gZXhpc3RpbmdFbnRyeSA9PT0gbnVsbCB8fCBleGlzdGluZ0VudHJ5ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBleGlzdGluZ0VudHJ5LnVzZXJEYXRhO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3Qgb2xkVXNlckRhdGEgPSBleGlzdGluZ0VudHJ5ID09PSBudWxsIHx8IGV4aXN0aW5nRW50cnkgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGV4aXN0aW5nRW50cnkudXNlckRhdGE7XG4gICAgICAgICAgICB0YWJsZS5lbnRyaWVzW2VudHJ5SW5kZXhdID0geyBlbnRyeSwgdXNlckRhdGEgfTtcbiAgICAgICAgICAgIC8vIGFkZCB0byBoaXN0b3J5XG4gICAgICAgICAgICBpZiAoaGlzdG9yeS5sZW5ndGggPiAzMSkge1xuICAgICAgICAgICAgICAgIGhpc3Rvcnkuc2hpZnQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGhpc3RvcnkucHVzaChlbnRyeSk7XG4gICAgICAgICAgICB0aGlzLmVtaXQoXCJ1cGRhdGVcIiwge1xuICAgICAgICAgICAgICAgIHRhYmxlLFxuICAgICAgICAgICAgICAgIGVudHJ5SW5kZXgsXG4gICAgICAgICAgICAgICAgZW50cnksXG4gICAgICAgICAgICAgICAgdXNlckRhdGEsXG4gICAgICAgICAgICAgICAgb2xkVXNlckRhdGFcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIF9oYW5kbGVDcmVhdGVTdHJpbmdUYWJsZShtc2cpIHtcbiAgICAgICAgY29uc3QgYml0YnVmID0gYml0YnVmZmVyXzEuQml0U3RyZWFtLmZyb20obXNnLnN0cmluZ0RhdGEpO1xuICAgICAgICAvLyB0YWJsZSBzaG91bGRuJ3QgYWxyZWFkeSBleGlzdFxuICAgICAgICBhc3NlcnQodGhpcy5maW5kVGFibGVCeU5hbWUobXNnLm5hbWUpID09PSB1bmRlZmluZWQsIFwidGFibGUgYWxyZWFkeSBleGlzdHNcIik7XG4gICAgICAgIGFzc2VydChtc2cudXNlckRhdGFTaXplID09PSBNYXRoLmNlaWwobXNnLnVzZXJEYXRhU2l6ZUJpdHMgLyA4KSwgXCJpbnZhbGlkIHVzZXIgZGF0YSBieXRlIHNpemVcIik7XG4gICAgICAgIGFzc2VydChtc2cudXNlckRhdGFTaXplQml0cyA8PSAzMiwgXCJ1c2VyZGF0YSB2YWx1ZSB0b28gbGFyZ2VcIik7XG4gICAgICAgIC8vIGNyZWF0ZSBhbiBlbXB0eSB0YWJsZVxuICAgICAgICBjb25zdCB0YWJsZSA9IHtcbiAgICAgICAgICAgIG5hbWU6IG1zZy5uYW1lLFxuICAgICAgICAgICAgZW50cmllczogW10sXG4gICAgICAgICAgICB1c2VyRGF0YVNpemVCaXRzOiBtc2cudXNlckRhdGFTaXplQml0cyxcbiAgICAgICAgICAgIHVzZXJEYXRhRml4ZWRTaXplOiBtc2cudXNlckRhdGFGaXhlZFNpemUsXG4gICAgICAgICAgICBtYXhFbnRyaWVzOiBtc2cubWF4RW50cmllc1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLmVtaXQoXCJjcmVhdGVcIiwgdGFibGUpO1xuICAgICAgICB0aGlzLl9wYXJzZVN0cmluZ1RhYmxlVXBkYXRlKGJpdGJ1ZiwgdGFibGUsIG1zZy5udW1FbnRyaWVzKTtcbiAgICAgICAgdGhpcy50YWJsZXMucHVzaCh0YWJsZSk7XG4gICAgfVxuICAgIF9oYW5kbGVVcGRhdGVTdHJpbmdUYWJsZShtc2cpIHtcbiAgICAgICAgY29uc3QgYml0YnVmID0gYml0YnVmZmVyXzEuQml0U3RyZWFtLmZyb20obXNnLnN0cmluZ0RhdGEpO1xuICAgICAgICBjb25zdCB0YWJsZSA9ICgwLCBhc3NlcnRfZXhpc3RzXzEuZGVmYXVsdCkodGhpcy50YWJsZXNbbXNnLnRhYmxlSWRdLCBcImJhZCB0YWJsZSBpbmRleFwiKTtcbiAgICAgICAgdGhpcy5fcGFyc2VTdHJpbmdUYWJsZVVwZGF0ZShiaXRidWYsIHRhYmxlLCBtc2cubnVtQ2hhbmdlZEVudHJpZXMpO1xuICAgIH1cbn1cbmV4cG9ydHMuU3RyaW5nVGFibGVzID0gU3RyaW5nVGFibGVzO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c3RyaW5ndGFibGVzLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuY29uc3QgYXNzZXJ0ID0gcmVxdWlyZShcImFzc2VydFwiKTtcbmNvbnN0IHByb2plY3RpbGVfMSA9IHJlcXVpcmUoXCIuLi9lbnRpdGllcy9wcm9qZWN0aWxlXCIpO1xuY29uc3Qgc3VwcGxlbWVudCA9IHtcbiAgICBlbWl0czogW1wiZ3JlbmFkZVRyYWplY3RvcnlcIl0sXG4gICAgc2V0dXA6IGZ1bmN0aW9uIGdyZW5hZGVUcmFqZWN0b3J5KGRlbW8pIHtcbiAgICAgICAgY29uc3QgdHJhamVjdG9yaWVzID0gbmV3IE1hcCgpO1xuICAgICAgICBmdW5jdGlvbiBvbkVudGl0eUNyZWF0ZShldmVudCkge1xuICAgICAgICAgICAgLy8gV2Ugb25seSBjYXJlIGFib3V0IGdyZW5hZGUgcHJvamVjdGlsZXNcbiAgICAgICAgICAgIGlmICghKGV2ZW50LmVudGl0eSBpbnN0YW5jZW9mIHByb2plY3RpbGVfMS5Qcm9qZWN0aWxlKSlcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICBhc3NlcnQoIXRyYWplY3Rvcmllcy5oYXMoZXZlbnQuZW50aXR5LmluZGV4KSk7XG4gICAgICAgICAgICB0cmFqZWN0b3JpZXMuc2V0KGV2ZW50LmVudGl0eS5pbmRleCwgW2V2ZW50LmVudGl0eS5wb3NpdGlvbl0pO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIG9uRW50aXR5UmVtb3ZlKGV2ZW50KSB7XG4gICAgICAgICAgICAvLyBJZiBhIHByb2plY3RpbGUgd2FzIHRocm93biBqdXN0IGJlZm9yZSByb3VuZCBlbmQsXG4gICAgICAgICAgICAvLyBpdCB3b3VsZCBiZSBkZWxldGVkIGJlZm9yZSBkZXRvbmF0aW5nLlxuICAgICAgICAgICAgdHJhamVjdG9yaWVzLmRlbGV0ZShldmVudC5pbmRleCk7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gb25FbnRpdHlDaGFuZ2UoZXZlbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gZXZlbnQuZW50aXR5LmluZGV4O1xuICAgICAgICAgICAgaWYgKCF0cmFqZWN0b3JpZXMuaGFzKGluZGV4KSlcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICBjb25zdCBwcm9qZWN0aWxlID0gZXZlbnQuZW50aXR5O1xuICAgICAgICAgICAgZm9yIChjb25zdCBjaGFuZ2Ugb2YgZXZlbnQuY2hhbmdlcykge1xuICAgICAgICAgICAgICAgIGlmIChjaGFuZ2UudmFyTmFtZSAhPT0gXCJtX25Cb3VuY2VzXCIpXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNvbnN0IG9sZFZhbHVlID0gKGNoYW5nZS5vbGRWYWx1ZSB8fCAwKTtcbiAgICAgICAgICAgICAgICBjb25zdCBuZXdWYWx1ZSA9IGNoYW5nZS5uZXdWYWx1ZTtcbiAgICAgICAgICAgICAgICBpZiAobmV3VmFsdWUgPiBvbGRWYWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICB0cmFqZWN0b3JpZXMuZ2V0KGluZGV4KS5wdXNoKHByb2plY3RpbGUucG9zaXRpb24pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBvbkdyZW5hZGVEZXRvbmF0ZUV2ZW50KGV2ZW50KSB7XG4gICAgICAgICAgICBjb25zdCBwcm9qZWN0aWxlID0gZXZlbnQuZW50aXR5O1xuICAgICAgICAgICAgLy8gdG9kbzogd2hlbiBjb3VsZCB0aGlzIGJlIG51bGw/XG4gICAgICAgICAgICBjb25zdCB0cmFqZWN0b3J5ID0gdHJhamVjdG9yaWVzLmdldChldmVudC5lbnRpdHlpZCk7XG4gICAgICAgICAgICB0cmFqZWN0b3J5LnB1c2gocHJvamVjdGlsZS5wb3NpdGlvbik7XG4gICAgICAgICAgICBkZW1vLmVtaXQoXCJncmVuYWRlVHJhamVjdG9yeVwiLCB7XG4gICAgICAgICAgICAgICAgcHJvamVjdGlsZSxcbiAgICAgICAgICAgICAgICB0aHJvd2VyOiBldmVudC5wbGF5ZXIsXG4gICAgICAgICAgICAgICAgdHJhamVjdG9yeVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gb25Nb2xvdG92RGV0b25hdGUoeyBwcm9qZWN0aWxlLCB0aHJvd2VyIH0pIHtcbiAgICAgICAgICAgIC8vIHRvZG86IHdoZW4gY291bGQgdGhpcyBiZSBudWxsP1xuICAgICAgICAgICAgY29uc3QgdHJhamVjdG9yeSA9IHRyYWplY3Rvcmllcy5nZXQocHJvamVjdGlsZS5pbmRleCk7XG4gICAgICAgICAgICB0cmFqZWN0b3J5LnB1c2gocHJvamVjdGlsZS5wb3NpdGlvbik7XG4gICAgICAgICAgICBkZW1vLmVtaXQoXCJncmVuYWRlVHJhamVjdG9yeVwiLCB7XG4gICAgICAgICAgICAgICAgcHJvamVjdGlsZSxcbiAgICAgICAgICAgICAgICB0aHJvd2VyLFxuICAgICAgICAgICAgICAgIHRyYWplY3RvcnlcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGRlbW8ub24oXCJtb2xvdG92RGV0b25hdGVcIiwgb25Nb2xvdG92RGV0b25hdGUpO1xuICAgICAgICBkZW1vLmVudGl0aWVzLm9uKFwiY3JlYXRlXCIsIG9uRW50aXR5Q3JlYXRlKTtcbiAgICAgICAgZGVtby5lbnRpdGllcy5vbihcImNoYW5nZVwiLCBvbkVudGl0eUNoYW5nZSk7XG4gICAgICAgIGRlbW8uZW50aXRpZXMub24oXCJyZW1vdmVcIiwgb25FbnRpdHlSZW1vdmUpO1xuICAgICAgICBkZW1vLmdhbWVFdmVudHMub24oXCJkZWNveV9kZXRvbmF0ZVwiLCBvbkdyZW5hZGVEZXRvbmF0ZUV2ZW50KTtcbiAgICAgICAgZGVtby5nYW1lRXZlbnRzLm9uKFwiZmxhc2hiYW5nX2RldG9uYXRlXCIsIG9uR3JlbmFkZURldG9uYXRlRXZlbnQpO1xuICAgICAgICBkZW1vLmdhbWVFdmVudHMub24oXCJoZWdyZW5hZGVfZGV0b25hdGVcIiwgb25HcmVuYWRlRGV0b25hdGVFdmVudCk7XG4gICAgICAgIGRlbW8uZ2FtZUV2ZW50cy5vbihcInNtb2tlZ3JlbmFkZV9kZXRvbmF0ZVwiLCBvbkdyZW5hZGVEZXRvbmF0ZUV2ZW50KTtcbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgIGRlbW8ub2ZmKFwibW9sb3RvdkRldG9uYXRlXCIsIG9uTW9sb3RvdkRldG9uYXRlKTtcbiAgICAgICAgICAgIGRlbW8uZW50aXRpZXMub2ZmKFwiY3JlYXRlXCIsIG9uRW50aXR5Q3JlYXRlKTtcbiAgICAgICAgICAgIGRlbW8uZW50aXRpZXMub2ZmKFwiY2hhbmdlXCIsIG9uRW50aXR5Q2hhbmdlKTtcbiAgICAgICAgICAgIGRlbW8uZW50aXRpZXMub2ZmKFwicmVtb3ZlXCIsIG9uRW50aXR5UmVtb3ZlKTtcbiAgICAgICAgICAgIGRlbW8uZ2FtZUV2ZW50cy5vZmYoXCJkZWNveV9kZXRvbmF0ZVwiLCBvbkdyZW5hZGVEZXRvbmF0ZUV2ZW50KTtcbiAgICAgICAgICAgIGRlbW8uZ2FtZUV2ZW50cy5vZmYoXCJmbGFzaGJhbmdfZGV0b25hdGVcIiwgb25HcmVuYWRlRGV0b25hdGVFdmVudCk7XG4gICAgICAgICAgICBkZW1vLmdhbWVFdmVudHMub2ZmKFwiaGVncmVuYWRlX2RldG9uYXRlXCIsIG9uR3JlbmFkZURldG9uYXRlRXZlbnQpO1xuICAgICAgICAgICAgZGVtby5nYW1lRXZlbnRzLm9mZihcInNtb2tlZ3JlbmFkZV9kZXRvbmF0ZVwiLCBvbkdyZW5hZGVEZXRvbmF0ZUV2ZW50KTtcbiAgICAgICAgfTtcbiAgICB9XG59O1xuZXhwb3J0cy5kZWZhdWx0ID0gc3VwcGxlbWVudDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWdyZW5hZGV0cmFqZWN0b3J5LmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuY29uc3QgcGxheWVyXzEgPSByZXF1aXJlKFwiLi4vZW50aXRpZXMvcGxheWVyXCIpO1xuY29uc3QgaXRlbWRlZnNfMSA9IHJlcXVpcmUoXCIuLi9lbnRpdGllcy9pdGVtZGVmc1wiKTtcbmNvbnN0IGVxdWlwbWVudElkTWFwID0ge1xuICAgIFwiNTBcIjogXCJLZXZsYXJcIixcbiAgICBcIjUxXCI6IFwiQXNzYXVsdCBTdWl0XCIsXG4gICAgXCI1NVwiOiBcIkRlZnVzZXJcIlxufTtcbmNvbnN0IHN1cHBsZW1lbnQgPSB7XG4gICAgZW1pdHM6IFtcIml0ZW1QdXJjaGFzZVwiXSxcbiAgICBzZXR1cDogZnVuY3Rpb24gcHVyY2hhc2UoZGVtbykge1xuICAgICAgICBsZXQgcGVuZGluZ1B1cmNoYXNlcyA9IFtdO1xuICAgICAgICAvLyBXYWl0IHVudGlsIHRpY2sgZW5kIHRvIGZpbmQgdGhlIGVudGl0eS5cbiAgICAgICAgLy8gbV9pV2VhcG9uUHVyY2hhc2VzVGhpc1JvdW5kIGlzIGFsd2F5cyB1cGRhdGVkIGJlZm9yZSB0aGUgd2VhcG9uIGVudGl0eSBpcyBjcmVhdGVkLlxuICAgICAgICBmdW5jdGlvbiBvblRpY2tFbmQoKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHBlbmRpbmcgb2YgcGVuZGluZ1B1cmNoYXNlcykge1xuICAgICAgICAgICAgICAgIC8vIFNvbWUgaXRlbXMgd29uJ3QgaGF2ZSBhbiBlbnRpdHkgcmVwcmVzZW50YXRpb24sIGUuZy4ga2V2bGFyLlxuICAgICAgICAgICAgICAgIGxldCB3ZWFwb24gPSBwZW5kaW5nLnBsYXllci53ZWFwb25zLmZpbmQodyA9PiB3Lml0ZW1JbmRleCA9PT0gcGVuZGluZy53ZWFwb25JZCk7XG4gICAgICAgICAgICAgICAgLy8gdG9kbzogd2h5IGRvZXMgbW9sb3RvdiBuZWVkIHJlbWFwcGluZyB0byBpbmNlbmRpYXJ5P1xuICAgICAgICAgICAgICAgIGlmICghd2VhcG9uICYmIHBlbmRpbmcud2VhcG9uSWQgPT09IDQ2KSB7XG4gICAgICAgICAgICAgICAgICAgIHdlYXBvbiA9IHBlbmRpbmcucGxheWVyLndlYXBvbnMuZmluZCh3ID0+IHcuaXRlbUluZGV4ID09PSA0OCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGRlbW8uZW1pdChcIml0ZW1QdXJjaGFzZVwiLCB7IC4uLnBlbmRpbmcsIHdlYXBvbiB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHBlbmRpbmdQdXJjaGFzZXMgPSBbXTtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBvbkVudGl0eUNoYW5nZShlKSB7XG4gICAgICAgICAgICB2YXIgX2E7XG4gICAgICAgICAgICBpZiAoIShlLmVudGl0eSBpbnN0YW5jZW9mIHBsYXllcl8xLlBsYXllcikpXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgLy8gUEVSRjogYWRkIGFiaWxpdHkgdG8gbGlzdGVuIG9uIHNwZWNpZmljIHRhYmxlc1xuICAgICAgICAgICAgZm9yIChjb25zdCBjaGFuZ2Ugb2YgZS5jaGFuZ2VzKSB7XG4gICAgICAgICAgICAgICAgaWYgKGNoYW5nZS50YWJsZU5hbWUgIT09IFwibV9pV2VhcG9uUHVyY2hhc2VzVGhpc1JvdW5kXCIpXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNvbnN0IHdlYXBvbklkID0gcGFyc2VJbnQoY2hhbmdlLnZhck5hbWUsIDEwKTtcbiAgICAgICAgICAgICAgICBjb25zdCBvbGRWYWx1ZSA9IChjaGFuZ2Uub2xkVmFsdWUgfHwgMCk7XG4gICAgICAgICAgICAgICAgY29uc3QgbmV3VmFsdWUgPSBjaGFuZ2UubmV3VmFsdWU7XG4gICAgICAgICAgICAgICAgY29uc3QgY291bnQgPSBuZXdWYWx1ZSAtIG9sZFZhbHVlO1xuICAgICAgICAgICAgICAgIGlmIChjb3VudCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgcGVuZGluZ1B1cmNoYXNlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllcjogZS5lbnRpdHksXG4gICAgICAgICAgICAgICAgICAgICAgICB3ZWFwb25JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1OYW1lOiAoKF9hID0gaXRlbWRlZnNfMS5pdGVtRGVmaW5pdGlvbkluZGV4TWFwW3dlYXBvbklkXSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLml0ZW1OYW1lKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVxdWlwbWVudElkTWFwW3dlYXBvbklkXSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiVW5rbm93blwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgY291bnQsXG4gICAgICAgICAgICAgICAgICAgICAgICB3ZWFwb246IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZGVtby5vbihcInRpY2tlbmRcIiwgb25UaWNrRW5kKTtcbiAgICAgICAgZGVtby5lbnRpdGllcy5vbihcImNoYW5nZVwiLCBvbkVudGl0eUNoYW5nZSk7XG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICBkZW1vLm9mZihcInRpY2tlbmRcIiwgb25UaWNrRW5kKTtcbiAgICAgICAgICAgIGRlbW8uZW50aXRpZXMub2ZmKFwiY2hhbmdlXCIsIG9uRW50aXR5Q2hhbmdlKTtcbiAgICAgICAgfTtcbiAgICB9XG59O1xuZXhwb3J0cy5kZWZhdWx0ID0gc3VwcGxlbWVudDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWl0ZW1wdXJjaGFzZS5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmNvbnN0IGNvbnN0c18xID0gcmVxdWlyZShcIi4uL2NvbnN0c1wiKTtcbmNvbnN0IG1vbG90b3ZMb29wID0gMTA1MTM1MzYzNDsgLy8gbXVybXVyaGFzaC52MihcIm1vbG90b3YubG9vcFwiLCAxMTQ2MDQ5NjAxKVxuY29uc3Qgc3VwcGxlbWVudCA9IHtcbiAgICBlbWl0czogW1wibW9sb3RvdkRldG9uYXRlXCJdLFxuICAgIHNldHVwOiBmdW5jdGlvbiBtb2xvdG92RGV0b25hdGUoZGVtbykge1xuICAgICAgICBpZiAoZGVtby5jdXJyZW50VGljayA+PSAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJtb2xvdG92RGV0b25hdGUgZXZlbnQgbGlzdGVuZXJzIG11c3QgYmUgYWRkZWQgYmVmb3JlIHBhcnNpbmcgc3RhcnRzLlwiKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBGaW5kIHRoZSBpbmRleCBvZiB0aGUgZmlyZSBsb29wIHNvdW5kLlxuICAgICAgICAvLyBUaGlzIGlzIGVtaXR0ZWQgd2hlbiB0aGUgZ3JlbmFkZSBpcyB0aHJvd24sIGFuZCB0aGVuIHN0b3BwZWQgd2hlbiBpdCBkZXRvbmF0ZXMuXG4gICAgICAgIGxldCBmaXJlTG9vcFNvdW5kSW5kZXggPSAtMTtcbiAgICAgICAgZnVuY3Rpb24gb25TdHJpbmdUYWJsZVVwZGF0ZShlKSB7XG4gICAgICAgICAgICBpZiAoZS50YWJsZS5uYW1lID09PSBcInNvdW5kcHJlY2FjaGVcIikge1xuICAgICAgICAgICAgICAgIGlmIChlLmVudHJ5ID09PSBcIndlYXBvbnMvbW9sb3Rvdi9maXJlX2xvb3BfMS53YXZcIikge1xuICAgICAgICAgICAgICAgICAgICBmaXJlTG9vcFNvdW5kSW5kZXggPSBlLmVudHJ5SW5kZXg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIENhY2hlIHRoZSBtb2xvdG92IHByb2plY3RpbGUgY2xhc3MuXG4gICAgICAgIC8vIE5vdGUgdGhhdCB0aGlzIGVudGl0eSBpcyBzaGFyZWQgYmV0d2VlbiBtb2xvdG92IGFuZCBpbmNlbmRpYXJ5IGdyZW5hZGVzLlxuICAgICAgICBsZXQgbW9sb3RvdlByb2plY3RpbGVDbGFzcyA9IC0xO1xuICAgICAgICBmdW5jdGlvbiBvbkRhdGFUYWJsZXNSZWFkeSgpIHtcbiAgICAgICAgICAgIG1vbG90b3ZQcm9qZWN0aWxlQ2xhc3MgPSBkZW1vLmVudGl0aWVzLnNlcnZlckNsYXNzZXMuZmluZEluZGV4KHNjID0+IHNjLm5hbWUgPT09IFwiQ01vbG90b3ZQcm9qZWN0aWxlXCIpO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIG9uU291bmQoZSkge1xuICAgICAgICAgICAgaWYgKGZpcmVMb29wU291bmRJbmRleCA8IDAgfHwgbW9sb3RvdlByb2plY3RpbGVDbGFzcyA8IDApXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgZm9yIChjb25zdCBzb3VuZCBvZiBlLnNvdW5kcykge1xuICAgICAgICAgICAgICAgIC8vIFdlIG9ubHkgY2FyZSBhYm91dCB0aGUgZmlyZSBsb29wIHNvdW5kXG4gICAgICAgICAgICAgICAgaWYgKHNvdW5kLnNvdW5kTnVtSGFuZGxlID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzb3VuZC5zb3VuZE51bSAhPT0gZmlyZUxvb3BTb3VuZEluZGV4KVxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyB0b2RvOiBuZXZlciBhY3R1YWxseSBzZWUgdGhpc1xuICAgICAgICAgICAgICAgICAgICBpZiAoc291bmQuc291bmROdW1IYW5kbGUgIT09IG1vbG90b3ZMb29wKVxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIFRoZSBsb29wIHNvdW5kIHN0YXJ0cyB3aGVuIHRoZSBncmVuYWRlIGlzIHRocm93bixcbiAgICAgICAgICAgICAgICAvLyBhbmQgaXMgc3RvcHBlZCBvbiBkZXRvbmF0aW9uLlxuICAgICAgICAgICAgICAgIGlmICgoc291bmQuZmxhZ3MgJiBjb25zdHNfMS5TTkRfU1RPUCkgPT09IDApXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNvbnN0IHByb2plY3RpbGUgPSBkZW1vLmVudGl0aWVzLmVudGl0aWVzLmdldChzb3VuZC5lbnRpdHlJbmRleCk7XG4gICAgICAgICAgICAgICAgaWYgKCFwcm9qZWN0aWxlKVxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAvLyBUaGlzIHNvdW5kIGlzIGFsc28gc3RvcHBlZCBvbiB0aGUgcmVzdWx0aW5nIGluZmVybm9cbiAgICAgICAgICAgICAgICAvLyAoaS5lLiB0aGUgZmxhbWVzIHByb2R1Y2VkIGJ5IGEgZGV0b25hdGVkIGZpcmUgZ3JlbmFkZSkuXG4gICAgICAgICAgICAgICAgaWYgKHByb2plY3RpbGUuY2xhc3NJZCA9PT0gbW9sb3RvdlByb2plY3RpbGVDbGFzcykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0aHJvd2VyID0gcHJvamVjdGlsZS5vd25lcjtcbiAgICAgICAgICAgICAgICAgICAgZGVtby5lbWl0KFwibW9sb3RvdkRldG9uYXRlXCIsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93ZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9qZWN0aWxlXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBkZW1vLnN0cmluZ1RhYmxlcy5vbihcInVwZGF0ZVwiLCBvblN0cmluZ1RhYmxlVXBkYXRlKTtcbiAgICAgICAgZGVtby5lbnRpdGllcy5vbihcImRhdGF0YWJsZXNyZWFkeVwiLCBvbkRhdGFUYWJsZXNSZWFkeSk7XG4gICAgICAgIGRlbW8ub24oXCJzdmNfU291bmRzXCIsIG9uU291bmQpO1xuICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgZGVtby5zdHJpbmdUYWJsZXMub2ZmKFwidXBkYXRlXCIsIG9uU3RyaW5nVGFibGVVcGRhdGUpO1xuICAgICAgICAgICAgZGVtby5lbnRpdGllcy5vZmYoXCJkYXRhdGFibGVzcmVhZHlcIiwgb25EYXRhVGFibGVzUmVhZHkpO1xuICAgICAgICAgICAgZGVtby5vZmYoXCJzdmNfU291bmRzXCIsIG9uU291bmQpO1xuICAgICAgICB9O1xuICAgIH1cbn07XG5leHBvcnRzLmRlZmF1bHQgPSBzdXBwbGVtZW50O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bW9sb3RvdmRldG9uYXRlLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5Vc2VyTWVzc2FnZXMgPSB2b2lkIDA7XG5jb25zdCBhc3NlcnQgPSByZXF1aXJlKFwiYXNzZXJ0XCIpO1xuY29uc3QgZXZlbnRzXzEgPSByZXF1aXJlKFwiZXZlbnRzXCIpO1xuY29uc3QgdXNlcm1lc3NhZ2V0eXBlc18xID0gcmVxdWlyZShcIi4vdXNlcm1lc3NhZ2V0eXBlc1wiKTtcbi8qKlxuICogSGFuZGxlcyB1c2VyIG1lc3NhZ2VzIGZvciBhIGRlbW8gZmlsZS5cbiAqL1xuY2xhc3MgVXNlck1lc3NhZ2VzIGV4dGVuZHMgZXZlbnRzXzEuRXZlbnRFbWl0dGVyIHtcbiAgICBsaXN0ZW4oZGVtbykge1xuICAgICAgICBkZW1vLm9uKFwic3ZjX1VzZXJNZXNzYWdlXCIsIHRoaXMuX2hhbmRsZVVzZXJNZXNzYWdlLmJpbmQodGhpcykpO1xuICAgIH1cbiAgICBfaGFuZGxlVXNlck1lc3NhZ2UobXNnKSB7XG4gICAgICAgIGNvbnN0IHVtID0gdXNlcm1lc3NhZ2V0eXBlc18xLnVzZXJNZXNzYWdlc1ttc2cubXNnVHlwZV07XG4gICAgICAgIGlmICghdW0pIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5saXN0ZW5lckNvdW50KHVtLm5hbWUpIHx8IHRoaXMubGlzdGVuZXJDb3VudChcIm1lc3NhZ2VcIikpIHtcbiAgICAgICAgICAgIGNvbnN0IG1zZ0luc3QgPSB1bS5jbGFzcy5kZWNvZGUobXNnLm1zZ0RhdGEpO1xuICAgICAgICAgICAgYXNzZXJ0KG1zZ0luc3QsIFwidW5hYmxlIHRvIGRlY29kZSB1c2VyIG1lc3NhZ2VcIik7XG4gICAgICAgICAgICB0aGlzLmVtaXQodW0ubmFtZSwgbXNnSW5zdCk7XG4gICAgICAgICAgICB0aGlzLmVtaXQoXCJtZXNzYWdlXCIsIHtcbiAgICAgICAgICAgICAgICBuYW1lOiB1bS5uYW1lLFxuICAgICAgICAgICAgICAgIG1zZzogbXNnSW5zdFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5leHBvcnRzLlVzZXJNZXNzYWdlcyA9IFVzZXJNZXNzYWdlcztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXVzZXJtZXNzYWdlcy5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbi8vIERPIE5PVCBNT0RJRlkhXG4vLyBBdXRvLWdlbmVyYXRlZCBieSAuL2dlbmVyYXRvcnMvdXNlcm1lc3NhZ2V0eXBlcy50c1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy51c2VyTWVzc2FnZXMgPSB2b2lkIDA7XG5jb25zdCB1bSA9IHJlcXVpcmUoXCIuL3Byb3RvYnVmcy9jc3RyaWtlMTVfdXNlcm1lc3NhZ2VzXCIpO1xuZXhwb3J0cy51c2VyTWVzc2FnZXMgPSBbXTtcbmV4cG9ydHMudXNlck1lc3NhZ2VzW3VtLkVDc3RyaWtlMTVVc2VyTWVzc2FnZXMuQ1NfVU1fVkdVSU1lbnVdID0ge1xuICAgIG5hbWU6IFwiVkdVSU1lbnVcIixcbiAgICBjbGFzczogdW0uQ0NTVXNyTXNnVkdVSU1lbnVcbn07XG5leHBvcnRzLnVzZXJNZXNzYWdlc1t1bS5FQ3N0cmlrZTE1VXNlck1lc3NhZ2VzLkNTX1VNX0dlaWdlcl0gPSB7XG4gICAgbmFtZTogXCJHZWlnZXJcIixcbiAgICBjbGFzczogdW0uQ0NTVXNyTXNnR2VpZ2VyXG59O1xuZXhwb3J0cy51c2VyTWVzc2FnZXNbdW0uRUNzdHJpa2UxNVVzZXJNZXNzYWdlcy5DU19VTV9UcmFpbl0gPSB7XG4gICAgbmFtZTogXCJUcmFpblwiLFxuICAgIGNsYXNzOiB1bS5DQ1NVc3JNc2dUcmFpblxufTtcbmV4cG9ydHMudXNlck1lc3NhZ2VzW3VtLkVDc3RyaWtlMTVVc2VyTWVzc2FnZXMuQ1NfVU1fSHVkVGV4dF0gPSB7XG4gICAgbmFtZTogXCJIdWRUZXh0XCIsXG4gICAgY2xhc3M6IHVtLkNDU1Vzck1zZ0h1ZFRleHRcbn07XG5leHBvcnRzLnVzZXJNZXNzYWdlc1t1bS5FQ3N0cmlrZTE1VXNlck1lc3NhZ2VzLkNTX1VNX1NheVRleHRdID0ge1xuICAgIG5hbWU6IFwiU2F5VGV4dFwiLFxuICAgIGNsYXNzOiB1bS5DQ1NVc3JNc2dTYXlUZXh0XG59O1xuZXhwb3J0cy51c2VyTWVzc2FnZXNbdW0uRUNzdHJpa2UxNVVzZXJNZXNzYWdlcy5DU19VTV9TYXlUZXh0Ml0gPSB7XG4gICAgbmFtZTogXCJTYXlUZXh0MlwiLFxuICAgIGNsYXNzOiB1bS5DQ1NVc3JNc2dTYXlUZXh0MlxufTtcbmV4cG9ydHMudXNlck1lc3NhZ2VzW3VtLkVDc3RyaWtlMTVVc2VyTWVzc2FnZXMuQ1NfVU1fVGV4dE1zZ10gPSB7XG4gICAgbmFtZTogXCJUZXh0TXNnXCIsXG4gICAgY2xhc3M6IHVtLkNDU1Vzck1zZ1RleHRNc2dcbn07XG5leHBvcnRzLnVzZXJNZXNzYWdlc1t1bS5FQ3N0cmlrZTE1VXNlck1lc3NhZ2VzLkNTX1VNX0h1ZE1zZ10gPSB7XG4gICAgbmFtZTogXCJIdWRNc2dcIixcbiAgICBjbGFzczogdW0uQ0NTVXNyTXNnSHVkTXNnXG59O1xuZXhwb3J0cy51c2VyTWVzc2FnZXNbdW0uRUNzdHJpa2UxNVVzZXJNZXNzYWdlcy5DU19VTV9SZXNldEh1ZF0gPSB7XG4gICAgbmFtZTogXCJSZXNldEh1ZFwiLFxuICAgIGNsYXNzOiB1bS5DQ1NVc3JNc2dSZXNldEh1ZFxufTtcbmV4cG9ydHMudXNlck1lc3NhZ2VzW3VtLkVDc3RyaWtlMTVVc2VyTWVzc2FnZXMuQ1NfVU1fR2FtZVRpdGxlXSA9IHtcbiAgICBuYW1lOiBcIkdhbWVUaXRsZVwiLFxuICAgIGNsYXNzOiB1bS5DQ1NVc3JNc2dHYW1lVGl0bGVcbn07XG5leHBvcnRzLnVzZXJNZXNzYWdlc1t1bS5FQ3N0cmlrZTE1VXNlck1lc3NhZ2VzLkNTX1VNX1NoYWtlXSA9IHtcbiAgICBuYW1lOiBcIlNoYWtlXCIsXG4gICAgY2xhc3M6IHVtLkNDU1Vzck1zZ1NoYWtlXG59O1xuZXhwb3J0cy51c2VyTWVzc2FnZXNbdW0uRUNzdHJpa2UxNVVzZXJNZXNzYWdlcy5DU19VTV9GYWRlXSA9IHtcbiAgICBuYW1lOiBcIkZhZGVcIixcbiAgICBjbGFzczogdW0uQ0NTVXNyTXNnRmFkZVxufTtcbmV4cG9ydHMudXNlck1lc3NhZ2VzW3VtLkVDc3RyaWtlMTVVc2VyTWVzc2FnZXMuQ1NfVU1fUnVtYmxlXSA9IHtcbiAgICBuYW1lOiBcIlJ1bWJsZVwiLFxuICAgIGNsYXNzOiB1bS5DQ1NVc3JNc2dSdW1ibGVcbn07XG5leHBvcnRzLnVzZXJNZXNzYWdlc1t1bS5FQ3N0cmlrZTE1VXNlck1lc3NhZ2VzLkNTX1VNX0Nsb3NlQ2FwdGlvbl0gPSB7XG4gICAgbmFtZTogXCJDbG9zZUNhcHRpb25cIixcbiAgICBjbGFzczogdW0uQ0NTVXNyTXNnQ2xvc2VDYXB0aW9uXG59O1xuZXhwb3J0cy51c2VyTWVzc2FnZXNbdW0uRUNzdHJpa2UxNVVzZXJNZXNzYWdlcy5DU19VTV9DbG9zZUNhcHRpb25EaXJlY3RdID0ge1xuICAgIG5hbWU6IFwiQ2xvc2VDYXB0aW9uRGlyZWN0XCIsXG4gICAgY2xhc3M6IHVtLkNDU1Vzck1zZ0Nsb3NlQ2FwdGlvbkRpcmVjdFxufTtcbmV4cG9ydHMudXNlck1lc3NhZ2VzW3VtLkVDc3RyaWtlMTVVc2VyTWVzc2FnZXMuQ1NfVU1fU2VuZEF1ZGlvXSA9IHtcbiAgICBuYW1lOiBcIlNlbmRBdWRpb1wiLFxuICAgIGNsYXNzOiB1bS5DQ1NVc3JNc2dTZW5kQXVkaW9cbn07XG5leHBvcnRzLnVzZXJNZXNzYWdlc1t1bS5FQ3N0cmlrZTE1VXNlck1lc3NhZ2VzLkNTX1VNX1Jhd0F1ZGlvXSA9IHtcbiAgICBuYW1lOiBcIlJhd0F1ZGlvXCIsXG4gICAgY2xhc3M6IHVtLkNDU1Vzck1zZ1Jhd0F1ZGlvXG59O1xuZXhwb3J0cy51c2VyTWVzc2FnZXNbdW0uRUNzdHJpa2UxNVVzZXJNZXNzYWdlcy5DU19VTV9Wb2ljZU1hc2tdID0ge1xuICAgIG5hbWU6IFwiVm9pY2VNYXNrXCIsXG4gICAgY2xhc3M6IHVtLkNDU1Vzck1zZ1ZvaWNlTWFza1xufTtcbmV4cG9ydHMudXNlck1lc3NhZ2VzW3VtLkVDc3RyaWtlMTVVc2VyTWVzc2FnZXMuQ1NfVU1fUmVxdWVzdFN0YXRlXSA9IHtcbiAgICBuYW1lOiBcIlJlcXVlc3RTdGF0ZVwiLFxuICAgIGNsYXNzOiB1bS5DQ1NVc3JNc2dSZXF1ZXN0U3RhdGVcbn07XG5leHBvcnRzLnVzZXJNZXNzYWdlc1t1bS5FQ3N0cmlrZTE1VXNlck1lc3NhZ2VzLkNTX1VNX0RhbWFnZV0gPSB7XG4gICAgbmFtZTogXCJEYW1hZ2VcIixcbiAgICBjbGFzczogdW0uQ0NTVXNyTXNnRGFtYWdlXG59O1xuZXhwb3J0cy51c2VyTWVzc2FnZXNbdW0uRUNzdHJpa2UxNVVzZXJNZXNzYWdlcy5DU19VTV9SYWRpb1RleHRdID0ge1xuICAgIG5hbWU6IFwiUmFkaW9UZXh0XCIsXG4gICAgY2xhc3M6IHVtLkNDU1Vzck1zZ1JhZGlvVGV4dFxufTtcbmV4cG9ydHMudXNlck1lc3NhZ2VzW3VtLkVDc3RyaWtlMTVVc2VyTWVzc2FnZXMuQ1NfVU1fSGludFRleHRdID0ge1xuICAgIG5hbWU6IFwiSGludFRleHRcIixcbiAgICBjbGFzczogdW0uQ0NTVXNyTXNnSGludFRleHRcbn07XG5leHBvcnRzLnVzZXJNZXNzYWdlc1t1bS5FQ3N0cmlrZTE1VXNlck1lc3NhZ2VzLkNTX1VNX0tleUhpbnRUZXh0XSA9IHtcbiAgICBuYW1lOiBcIktleUhpbnRUZXh0XCIsXG4gICAgY2xhc3M6IHVtLkNDU1Vzck1zZ0tleUhpbnRUZXh0XG59O1xuZXhwb3J0cy51c2VyTWVzc2FnZXNbdW0uRUNzdHJpa2UxNVVzZXJNZXNzYWdlcy5DU19VTV9Qcm9jZXNzU3BvdHRlZEVudGl0eVVwZGF0ZV0gPSB7XG4gICAgbmFtZTogXCJQcm9jZXNzU3BvdHRlZEVudGl0eVVwZGF0ZVwiLFxuICAgIGNsYXNzOiB1bS5DQ1NVc3JNc2dQcm9jZXNzU3BvdHRlZEVudGl0eVVwZGF0ZVxufTtcbmV4cG9ydHMudXNlck1lc3NhZ2VzW3VtLkVDc3RyaWtlMTVVc2VyTWVzc2FnZXMuQ1NfVU1fUmVsb2FkRWZmZWN0XSA9IHtcbiAgICBuYW1lOiBcIlJlbG9hZEVmZmVjdFwiLFxuICAgIGNsYXNzOiB1bS5DQ1NVc3JNc2dSZWxvYWRFZmZlY3Rcbn07XG5leHBvcnRzLnVzZXJNZXNzYWdlc1t1bS5FQ3N0cmlrZTE1VXNlck1lc3NhZ2VzLkNTX1VNX0FkanVzdE1vbmV5XSA9IHtcbiAgICBuYW1lOiBcIkFkanVzdE1vbmV5XCIsXG4gICAgY2xhc3M6IHVtLkNDU1Vzck1zZ0FkanVzdE1vbmV5XG59O1xuZXhwb3J0cy51c2VyTWVzc2FnZXNbdW0uRUNzdHJpa2UxNVVzZXJNZXNzYWdlcy5DU19VTV9TdG9wU3BlY3RhdG9yTW9kZV0gPSB7XG4gICAgbmFtZTogXCJTdG9wU3BlY3RhdG9yTW9kZVwiLFxuICAgIGNsYXNzOiB1bS5DQ1NVc3JNc2dTdG9wU3BlY3RhdG9yTW9kZVxufTtcbmV4cG9ydHMudXNlck1lc3NhZ2VzW3VtLkVDc3RyaWtlMTVVc2VyTWVzc2FnZXMuQ1NfVU1fS2lsbENhbV0gPSB7XG4gICAgbmFtZTogXCJLaWxsQ2FtXCIsXG4gICAgY2xhc3M6IHVtLkNDU1Vzck1zZ0tpbGxDYW1cbn07XG5leHBvcnRzLnVzZXJNZXNzYWdlc1t1bS5FQ3N0cmlrZTE1VXNlck1lc3NhZ2VzLkNTX1VNX0Rlc2lyZWRUaW1lc2NhbGVdID0ge1xuICAgIG5hbWU6IFwiRGVzaXJlZFRpbWVzY2FsZVwiLFxuICAgIGNsYXNzOiB1bS5DQ1NVc3JNc2dEZXNpcmVkVGltZXNjYWxlXG59O1xuZXhwb3J0cy51c2VyTWVzc2FnZXNbdW0uRUNzdHJpa2UxNVVzZXJNZXNzYWdlcy5DU19VTV9DdXJyZW50VGltZXNjYWxlXSA9IHtcbiAgICBuYW1lOiBcIkN1cnJlbnRUaW1lc2NhbGVcIixcbiAgICBjbGFzczogdW0uQ0NTVXNyTXNnQ3VycmVudFRpbWVzY2FsZVxufTtcbmV4cG9ydHMudXNlck1lc3NhZ2VzW3VtLkVDc3RyaWtlMTVVc2VyTWVzc2FnZXMuQ1NfVU1fQWNoaWV2ZW1lbnRFdmVudF0gPSB7XG4gICAgbmFtZTogXCJBY2hpZXZlbWVudEV2ZW50XCIsXG4gICAgY2xhc3M6IHVtLkNDU1Vzck1zZ0FjaGlldmVtZW50RXZlbnRcbn07XG5leHBvcnRzLnVzZXJNZXNzYWdlc1t1bS5FQ3N0cmlrZTE1VXNlck1lc3NhZ2VzLkNTX1VNX01hdGNoRW5kQ29uZGl0aW9uc10gPSB7XG4gICAgbmFtZTogXCJNYXRjaEVuZENvbmRpdGlvbnNcIixcbiAgICBjbGFzczogdW0uQ0NTVXNyTXNnTWF0Y2hFbmRDb25kaXRpb25zXG59O1xuZXhwb3J0cy51c2VyTWVzc2FnZXNbdW0uRUNzdHJpa2UxNVVzZXJNZXNzYWdlcy5DU19VTV9EaXNjb25uZWN0VG9Mb2JieV0gPSB7XG4gICAgbmFtZTogXCJEaXNjb25uZWN0VG9Mb2JieVwiLFxuICAgIGNsYXNzOiB1bS5DQ1NVc3JNc2dEaXNjb25uZWN0VG9Mb2JieVxufTtcbmV4cG9ydHMudXNlck1lc3NhZ2VzW3VtLkVDc3RyaWtlMTVVc2VyTWVzc2FnZXMuQ1NfVU1fUGxheWVyU3RhdHNVcGRhdGVdID0ge1xuICAgIG5hbWU6IFwiUGxheWVyU3RhdHNVcGRhdGVcIixcbiAgICBjbGFzczogdW0uQ0NTVXNyTXNnUGxheWVyU3RhdHNVcGRhdGVcbn07XG5leHBvcnRzLnVzZXJNZXNzYWdlc1t1bS5FQ3N0cmlrZTE1VXNlck1lc3NhZ2VzLkNTX1VNX0Rpc3BsYXlJbnZlbnRvcnldID0ge1xuICAgIG5hbWU6IFwiRGlzcGxheUludmVudG9yeVwiLFxuICAgIGNsYXNzOiB1bS5DQ1NVc3JNc2dEaXNwbGF5SW52ZW50b3J5XG59O1xuZXhwb3J0cy51c2VyTWVzc2FnZXNbdW0uRUNzdHJpa2UxNVVzZXJNZXNzYWdlcy5DU19VTV9XYXJtdXBIYXNFbmRlZF0gPSB7XG4gICAgbmFtZTogXCJXYXJtdXBIYXNFbmRlZFwiLFxuICAgIGNsYXNzOiB1bS5DQ1NVc3JNc2dXYXJtdXBIYXNFbmRlZFxufTtcbmV4cG9ydHMudXNlck1lc3NhZ2VzW3VtLkVDc3RyaWtlMTVVc2VyTWVzc2FnZXMuQ1NfVU1fQ2xpZW50SW5mb10gPSB7XG4gICAgbmFtZTogXCJDbGllbnRJbmZvXCIsXG4gICAgY2xhc3M6IHVtLkNDU1Vzck1zZ0NsaWVudEluZm9cbn07XG5leHBvcnRzLnVzZXJNZXNzYWdlc1t1bS5FQ3N0cmlrZTE1VXNlck1lc3NhZ2VzLkNTX1VNX1hSYW5rR2V0XSA9IHtcbiAgICBuYW1lOiBcIlhSYW5rR2V0XCIsXG4gICAgY2xhc3M6IHVtLkNDU1Vzck1zZ1hSYW5rR2V0XG59O1xuZXhwb3J0cy51c2VyTWVzc2FnZXNbdW0uRUNzdHJpa2UxNVVzZXJNZXNzYWdlcy5DU19VTV9YUmFua1VwZF0gPSB7XG4gICAgbmFtZTogXCJYUmFua1VwZFwiLFxuICAgIGNsYXNzOiB1bS5DQ1NVc3JNc2dYUmFua1VwZFxufTtcbmV4cG9ydHMudXNlck1lc3NhZ2VzW3VtLkVDc3RyaWtlMTVVc2VyTWVzc2FnZXMuQ1NfVU1fQ2FsbFZvdGVGYWlsZWRdID0ge1xuICAgIG5hbWU6IFwiQ2FsbFZvdGVGYWlsZWRcIixcbiAgICBjbGFzczogdW0uQ0NTVXNyTXNnQ2FsbFZvdGVGYWlsZWRcbn07XG5leHBvcnRzLnVzZXJNZXNzYWdlc1t1bS5FQ3N0cmlrZTE1VXNlck1lc3NhZ2VzLkNTX1VNX1ZvdGVTdGFydF0gPSB7XG4gICAgbmFtZTogXCJWb3RlU3RhcnRcIixcbiAgICBjbGFzczogdW0uQ0NTVXNyTXNnVm90ZVN0YXJ0XG59O1xuZXhwb3J0cy51c2VyTWVzc2FnZXNbdW0uRUNzdHJpa2UxNVVzZXJNZXNzYWdlcy5DU19VTV9Wb3RlUGFzc10gPSB7XG4gICAgbmFtZTogXCJWb3RlUGFzc1wiLFxuICAgIGNsYXNzOiB1bS5DQ1NVc3JNc2dWb3RlUGFzc1xufTtcbmV4cG9ydHMudXNlck1lc3NhZ2VzW3VtLkVDc3RyaWtlMTVVc2VyTWVzc2FnZXMuQ1NfVU1fVm90ZUZhaWxlZF0gPSB7XG4gICAgbmFtZTogXCJWb3RlRmFpbGVkXCIsXG4gICAgY2xhc3M6IHVtLkNDU1Vzck1zZ1ZvdGVGYWlsZWRcbn07XG5leHBvcnRzLnVzZXJNZXNzYWdlc1t1bS5FQ3N0cmlrZTE1VXNlck1lc3NhZ2VzLkNTX1VNX1ZvdGVTZXR1cF0gPSB7XG4gICAgbmFtZTogXCJWb3RlU2V0dXBcIixcbiAgICBjbGFzczogdW0uQ0NTVXNyTXNnVm90ZVNldHVwXG59O1xuZXhwb3J0cy51c2VyTWVzc2FnZXNbdW0uRUNzdHJpa2UxNVVzZXJNZXNzYWdlcy5DU19VTV9TZXJ2ZXJSYW5rUmV2ZWFsQWxsXSA9IHtcbiAgICBuYW1lOiBcIlNlcnZlclJhbmtSZXZlYWxBbGxcIixcbiAgICBjbGFzczogdW0uQ0NTVXNyTXNnU2VydmVyUmFua1JldmVhbEFsbFxufTtcbmV4cG9ydHMudXNlck1lc3NhZ2VzW3VtLkVDc3RyaWtlMTVVc2VyTWVzc2FnZXMuQ1NfVU1fU2VuZExhc3RLaWxsZXJEYW1hZ2VUb0NsaWVudF0gPSB7XG4gICAgbmFtZTogXCJTZW5kTGFzdEtpbGxlckRhbWFnZVRvQ2xpZW50XCIsXG4gICAgY2xhc3M6IHVtLkNDU1Vzck1zZ1NlbmRMYXN0S2lsbGVyRGFtYWdlVG9DbGllbnRcbn07XG5leHBvcnRzLnVzZXJNZXNzYWdlc1t1bS5FQ3N0cmlrZTE1VXNlck1lc3NhZ2VzLkNTX1VNX1NlcnZlclJhbmtVcGRhdGVdID0ge1xuICAgIG5hbWU6IFwiU2VydmVyUmFua1VwZGF0ZVwiLFxuICAgIGNsYXNzOiB1bS5DQ1NVc3JNc2dTZXJ2ZXJSYW5rVXBkYXRlXG59O1xuZXhwb3J0cy51c2VyTWVzc2FnZXNbdW0uRUNzdHJpa2UxNVVzZXJNZXNzYWdlcy5DU19VTV9JdGVtUGlja3VwXSA9IHtcbiAgICBuYW1lOiBcIkl0ZW1QaWNrdXBcIixcbiAgICBjbGFzczogdW0uQ0NTVXNyTXNnSXRlbVBpY2t1cFxufTtcbmV4cG9ydHMudXNlck1lc3NhZ2VzW3VtLkVDc3RyaWtlMTVVc2VyTWVzc2FnZXMuQ1NfVU1fU2hvd01lbnVdID0ge1xuICAgIG5hbWU6IFwiU2hvd01lbnVcIixcbiAgICBjbGFzczogdW0uQ0NTVXNyTXNnU2hvd01lbnVcbn07XG5leHBvcnRzLnVzZXJNZXNzYWdlc1t1bS5FQ3N0cmlrZTE1VXNlck1lc3NhZ2VzLkNTX1VNX0JhclRpbWVdID0ge1xuICAgIG5hbWU6IFwiQmFyVGltZVwiLFxuICAgIGNsYXNzOiB1bS5DQ1NVc3JNc2dCYXJUaW1lXG59O1xuZXhwb3J0cy51c2VyTWVzc2FnZXNbdW0uRUNzdHJpa2UxNVVzZXJNZXNzYWdlcy5DU19VTV9BbW1vRGVuaWVkXSA9IHtcbiAgICBuYW1lOiBcIkFtbW9EZW5pZWRcIixcbiAgICBjbGFzczogdW0uQ0NTVXNyTXNnQW1tb0RlbmllZFxufTtcbmV4cG9ydHMudXNlck1lc3NhZ2VzW3VtLkVDc3RyaWtlMTVVc2VyTWVzc2FnZXMuQ1NfVU1fTWFya0FjaGlldmVtZW50XSA9IHtcbiAgICBuYW1lOiBcIk1hcmtBY2hpZXZlbWVudFwiLFxuICAgIGNsYXNzOiB1bS5DQ1NVc3JNc2dNYXJrQWNoaWV2ZW1lbnRcbn07XG5leHBvcnRzLnVzZXJNZXNzYWdlc1t1bS5FQ3N0cmlrZTE1VXNlck1lc3NhZ2VzLkNTX1VNX01hdGNoU3RhdHNVcGRhdGVdID0ge1xuICAgIG5hbWU6IFwiTWF0Y2hTdGF0c1VwZGF0ZVwiLFxuICAgIGNsYXNzOiB1bS5DQ1NVc3JNc2dNYXRjaFN0YXRzVXBkYXRlXG59O1xuZXhwb3J0cy51c2VyTWVzc2FnZXNbdW0uRUNzdHJpa2UxNVVzZXJNZXNzYWdlcy5DU19VTV9JdGVtRHJvcF0gPSB7XG4gICAgbmFtZTogXCJJdGVtRHJvcFwiLFxuICAgIGNsYXNzOiB1bS5DQ1NVc3JNc2dJdGVtRHJvcFxufTtcbmV4cG9ydHMudXNlck1lc3NhZ2VzW3VtLkVDc3RyaWtlMTVVc2VyTWVzc2FnZXMuQ1NfVU1fR2xvd1Byb3BUdXJuT2ZmXSA9IHtcbiAgICBuYW1lOiBcIkdsb3dQcm9wVHVybk9mZlwiLFxuICAgIGNsYXNzOiB1bS5DQ1NVc3JNc2dHbG93UHJvcFR1cm5PZmZcbn07XG5leHBvcnRzLnVzZXJNZXNzYWdlc1t1bS5FQ3N0cmlrZTE1VXNlck1lc3NhZ2VzLkNTX1VNX1NlbmRQbGF5ZXJJdGVtRHJvcHNdID0ge1xuICAgIG5hbWU6IFwiU2VuZFBsYXllckl0ZW1Ecm9wc1wiLFxuICAgIGNsYXNzOiB1bS5DQ1NVc3JNc2dTZW5kUGxheWVySXRlbURyb3BzXG59O1xuZXhwb3J0cy51c2VyTWVzc2FnZXNbdW0uRUNzdHJpa2UxNVVzZXJNZXNzYWdlcy5DU19VTV9Sb3VuZEJhY2t1cEZpbGVuYW1lc10gPSB7XG4gICAgbmFtZTogXCJSb3VuZEJhY2t1cEZpbGVuYW1lc1wiLFxuICAgIGNsYXNzOiB1bS5DQ1NVc3JNc2dSb3VuZEJhY2t1cEZpbGVuYW1lc1xufTtcbmV4cG9ydHMudXNlck1lc3NhZ2VzW3VtLkVDc3RyaWtlMTVVc2VyTWVzc2FnZXMuQ1NfVU1fU2VuZFBsYXllckl0ZW1Gb3VuZF0gPSB7XG4gICAgbmFtZTogXCJTZW5kUGxheWVySXRlbUZvdW5kXCIsXG4gICAgY2xhc3M6IHVtLkNDU1Vzck1zZ1NlbmRQbGF5ZXJJdGVtRm91bmRcbn07XG5leHBvcnRzLnVzZXJNZXNzYWdlc1t1bS5FQ3N0cmlrZTE1VXNlck1lc3NhZ2VzLkNTX1VNX1JlcG9ydEhpdF0gPSB7XG4gICAgbmFtZTogXCJSZXBvcnRIaXRcIixcbiAgICBjbGFzczogdW0uQ0NTVXNyTXNnUmVwb3J0SGl0XG59O1xuZXhwb3J0cy51c2VyTWVzc2FnZXNbdW0uRUNzdHJpa2UxNVVzZXJNZXNzYWdlcy5DU19VTV9YcFVwZGF0ZV0gPSB7XG4gICAgbmFtZTogXCJYcFVwZGF0ZVwiLFxuICAgIGNsYXNzOiB1bS5DQ1NVc3JNc2dYcFVwZGF0ZVxufTtcbmV4cG9ydHMudXNlck1lc3NhZ2VzW3VtLkVDc3RyaWtlMTVVc2VyTWVzc2FnZXMuQ1NfVU1fUXVlc3RQcm9ncmVzc10gPSB7XG4gICAgbmFtZTogXCJRdWVzdFByb2dyZXNzXCIsXG4gICAgY2xhc3M6IHVtLkNDU1Vzck1zZ1F1ZXN0UHJvZ3Jlc3Ncbn07XG5leHBvcnRzLnVzZXJNZXNzYWdlc1t1bS5FQ3N0cmlrZTE1VXNlck1lc3NhZ2VzLkNTX1VNX1Njb3JlTGVhZGVyYm9hcmREYXRhXSA9IHtcbiAgICBuYW1lOiBcIlNjb3JlTGVhZGVyYm9hcmREYXRhXCIsXG4gICAgY2xhc3M6IHVtLkNDU1Vzck1zZ1Njb3JlTGVhZGVyYm9hcmREYXRhXG59O1xuZXhwb3J0cy51c2VyTWVzc2FnZXNbdW0uRUNzdHJpa2UxNVVzZXJNZXNzYWdlcy5DU19VTV9QbGF5ZXJEZWNhbERpZ2l0YWxTaWduYXR1cmVdID0ge1xuICAgIG5hbWU6IFwiUGxheWVyRGVjYWxEaWdpdGFsU2lnbmF0dXJlXCIsXG4gICAgY2xhc3M6IHVtLkNDU1Vzck1zZ1BsYXllckRlY2FsRGlnaXRhbFNpZ25hdHVyZVxufTtcbmV4cG9ydHMudXNlck1lc3NhZ2VzW3VtLkVDc3RyaWtlMTVVc2VyTWVzc2FnZXMuQ1NfVU1fV2VhcG9uU291bmRdID0ge1xuICAgIG5hbWU6IFwiV2VhcG9uU291bmRcIixcbiAgICBjbGFzczogdW0uQ0NTVXNyTXNnV2VhcG9uU291bmRcbn07XG5leHBvcnRzLnVzZXJNZXNzYWdlc1t1bS5FQ3N0cmlrZTE1VXNlck1lc3NhZ2VzLkNTX1VNX1VwZGF0ZVNjcmVlbkhlYWx0aEJhcl0gPSB7XG4gICAgbmFtZTogXCJVcGRhdGVTY3JlZW5IZWFsdGhCYXJcIixcbiAgICBjbGFzczogdW0uQ0NTVXNyTXNnVXBkYXRlU2NyZWVuSGVhbHRoQmFyXG59O1xuZXhwb3J0cy51c2VyTWVzc2FnZXNbdW0uRUNzdHJpa2UxNVVzZXJNZXNzYWdlcy5DU19VTV9FbnRpdHlPdXRsaW5lSGlnaGxpZ2h0XSA9IHtcbiAgICBuYW1lOiBcIkVudGl0eU91dGxpbmVIaWdobGlnaHRcIixcbiAgICBjbGFzczogdW0uQ0NTVXNyTXNnRW50aXR5T3V0bGluZUhpZ2hsaWdodFxufTtcbmV4cG9ydHMudXNlck1lc3NhZ2VzW3VtLkVDc3RyaWtlMTVVc2VyTWVzc2FnZXMuQ1NfVU1fU1NVSV0gPSB7XG4gICAgbmFtZTogXCJTU1VJXCIsXG4gICAgY2xhc3M6IHVtLkNDU1Vzck1zZ1NTVUlcbn07XG5leHBvcnRzLnVzZXJNZXNzYWdlc1t1bS5FQ3N0cmlrZTE1VXNlck1lc3NhZ2VzLkNTX1VNX1N1cnZpdmFsU3RhdHNdID0ge1xuICAgIG5hbWU6IFwiU3Vydml2YWxTdGF0c1wiLFxuICAgIGNsYXNzOiB1bS5DQ1NVc3JNc2dTdXJ2aXZhbFN0YXRzXG59O1xuZXhwb3J0cy51c2VyTWVzc2FnZXNbdW0uRUNzdHJpa2UxNVVzZXJNZXNzYWdlcy5DU19VTV9FbmRPZk1hdGNoQWxsUGxheWVyc0RhdGFdID0ge1xuICAgIG5hbWU6IFwiRW5kT2ZNYXRjaEFsbFBsYXllcnNEYXRhXCIsXG4gICAgY2xhc3M6IHVtLkNDU1Vzck1zZ0VuZE9mTWF0Y2hBbGxQbGF5ZXJzRGF0YVxufTtcbmV4cG9ydHMudXNlck1lc3NhZ2VzW3VtLkVDc3RyaWtlMTVVc2VyTWVzc2FnZXMuQ1NfVU1fUm91bmRJbXBhY3RTY29yZURhdGFdID0ge1xuICAgIG5hbWU6IFwiUm91bmRJbXBhY3RTY29yZURhdGFcIixcbiAgICBjbGFzczogdW0uQ0NTVXNyTXNnUm91bmRJbXBhY3RTY29yZURhdGFcbn07XG5leHBvcnRzLnVzZXJNZXNzYWdlc1t1bS5FQ3N0cmlrZTE1VXNlck1lc3NhZ2VzLkNTX1VNX0N1cnJlbnRSb3VuZE9kZHNdID0ge1xuICAgIG5hbWU6IFwiQ3VycmVudFJvdW5kT2Rkc1wiLFxuICAgIGNsYXNzOiB1bS5DQ1NVc3JNc2dDdXJyZW50Um91bmRPZGRzXG59O1xuZXhwb3J0cy51c2VyTWVzc2FnZXNbdW0uRUNzdHJpa2UxNVVzZXJNZXNzYWdlcy5DU19VTV9EZWVwU3RhdHNdID0ge1xuICAgIG5hbWU6IFwiRGVlcFN0YXRzXCIsXG4gICAgY2xhc3M6IHVtLkNDU1Vzck1zZ0RlZXBTdGF0c1xufTtcbmV4cG9ydHMudXNlck1lc3NhZ2VzW3VtLkVDc3RyaWtlMTVVc2VyTWVzc2FnZXMuQ1NfVU1fVXRpbE1zZ10gPSB7XG4gICAgbmFtZTogXCJVdGlsTXNnXCIsXG4gICAgY2xhc3M6IHVtLkNDU1Vzck1zZ1V0aWxNc2dcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD11c2VybWVzc2FnZXR5cGVzLmpzLm1hcCIsInZhciBBd2FpdFZhbHVlID0gcmVxdWlyZShcIi4vQXdhaXRWYWx1ZS5qc1wiKTtcblxuZnVuY3Rpb24gQXN5bmNHZW5lcmF0b3IoZ2VuKSB7XG4gIHZhciBmcm9udCwgYmFjaztcblxuICBmdW5jdGlvbiBzZW5kKGtleSwgYXJnKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIHZhciByZXF1ZXN0ID0ge1xuICAgICAgICBrZXk6IGtleSxcbiAgICAgICAgYXJnOiBhcmcsXG4gICAgICAgIHJlc29sdmU6IHJlc29sdmUsXG4gICAgICAgIHJlamVjdDogcmVqZWN0LFxuICAgICAgICBuZXh0OiBudWxsXG4gICAgICB9O1xuXG4gICAgICBpZiAoYmFjaykge1xuICAgICAgICBiYWNrID0gYmFjay5uZXh0ID0gcmVxdWVzdDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZyb250ID0gYmFjayA9IHJlcXVlc3Q7XG4gICAgICAgIHJlc3VtZShrZXksIGFyZyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiByZXN1bWUoa2V5LCBhcmcpIHtcbiAgICB0cnkge1xuICAgICAgdmFyIHJlc3VsdCA9IGdlbltrZXldKGFyZyk7XG4gICAgICB2YXIgdmFsdWUgPSByZXN1bHQudmFsdWU7XG4gICAgICB2YXIgd3JhcHBlZEF3YWl0ID0gdmFsdWUgaW5zdGFuY2VvZiBBd2FpdFZhbHVlO1xuICAgICAgUHJvbWlzZS5yZXNvbHZlKHdyYXBwZWRBd2FpdCA/IHZhbHVlLndyYXBwZWQgOiB2YWx1ZSkudGhlbihmdW5jdGlvbiAoYXJnKSB7XG4gICAgICAgIGlmICh3cmFwcGVkQXdhaXQpIHtcbiAgICAgICAgICByZXN1bWUoa2V5ID09PSBcInJldHVyblwiID8gXCJyZXR1cm5cIiA6IFwibmV4dFwiLCBhcmcpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHNldHRsZShyZXN1bHQuZG9uZSA/IFwicmV0dXJuXCIgOiBcIm5vcm1hbFwiLCBhcmcpO1xuICAgICAgfSwgZnVuY3Rpb24gKGVycikge1xuICAgICAgICByZXN1bWUoXCJ0aHJvd1wiLCBlcnIpO1xuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBzZXR0bGUoXCJ0aHJvd1wiLCBlcnIpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHNldHRsZSh0eXBlLCB2YWx1ZSkge1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSBcInJldHVyblwiOlxuICAgICAgICBmcm9udC5yZXNvbHZlKHtcbiAgICAgICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICAgICAgZG9uZTogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgXCJ0aHJvd1wiOlxuICAgICAgICBmcm9udC5yZWplY3QodmFsdWUpO1xuICAgICAgICBicmVhaztcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgZnJvbnQucmVzb2x2ZSh7XG4gICAgICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgICAgIGRvbmU6IGZhbHNlXG4gICAgICAgIH0pO1xuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICBmcm9udCA9IGZyb250Lm5leHQ7XG5cbiAgICBpZiAoZnJvbnQpIHtcbiAgICAgIHJlc3VtZShmcm9udC5rZXksIGZyb250LmFyZyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGJhY2sgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHRoaXMuX2ludm9rZSA9IHNlbmQ7XG5cbiAgaWYgKHR5cGVvZiBnZW5bXCJyZXR1cm5cIl0gIT09IFwiZnVuY3Rpb25cIikge1xuICAgIHRoaXNbXCJyZXR1cm5cIl0gPSB1bmRlZmluZWQ7XG4gIH1cbn1cblxuQXN5bmNHZW5lcmF0b3IucHJvdG90eXBlW3R5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBTeW1ib2wuYXN5bmNJdGVyYXRvciB8fCBcIkBAYXN5bmNJdGVyYXRvclwiXSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5Bc3luY0dlbmVyYXRvci5wcm90b3R5cGUubmV4dCA9IGZ1bmN0aW9uIChhcmcpIHtcbiAgcmV0dXJuIHRoaXMuX2ludm9rZShcIm5leHRcIiwgYXJnKTtcbn07XG5cbkFzeW5jR2VuZXJhdG9yLnByb3RvdHlwZVtcInRocm93XCJdID0gZnVuY3Rpb24gKGFyZykge1xuICByZXR1cm4gdGhpcy5faW52b2tlKFwidGhyb3dcIiwgYXJnKTtcbn07XG5cbkFzeW5jR2VuZXJhdG9yLnByb3RvdHlwZVtcInJldHVyblwiXSA9IGZ1bmN0aW9uIChhcmcpIHtcbiAgcmV0dXJuIHRoaXMuX2ludm9rZShcInJldHVyblwiLCBhcmcpO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBBc3luY0dlbmVyYXRvciwgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1vZHVsZS5leHBvcnRzOyIsImZ1bmN0aW9uIF9Bd2FpdFZhbHVlKHZhbHVlKSB7XG4gIHRoaXMud3JhcHBlZCA9IHZhbHVlO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF9Bd2FpdFZhbHVlLCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZSwgbW9kdWxlLmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gbW9kdWxlLmV4cG9ydHM7IiwiZnVuY3Rpb24gX2FycmF5TGlrZVRvQXJyYXkoYXJyLCBsZW4pIHtcbiAgaWYgKGxlbiA9PSBudWxsIHx8IGxlbiA+IGFyci5sZW5ndGgpIGxlbiA9IGFyci5sZW5ndGg7XG5cbiAgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkobGVuKTsgaSA8IGxlbjsgaSsrKSB7XG4gICAgYXJyMltpXSA9IGFycltpXTtcbiAgfVxuXG4gIHJldHVybiBhcnIyO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF9hcnJheUxpa2VUb0FycmF5LCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZSwgbW9kdWxlLmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gbW9kdWxlLmV4cG9ydHM7IiwiZnVuY3Rpb24gX2FycmF5V2l0aEhvbGVzKGFycikge1xuICBpZiAoQXJyYXkuaXNBcnJheShhcnIpKSByZXR1cm4gYXJyO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF9hcnJheVdpdGhIb2xlcywgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1vZHVsZS5leHBvcnRzOyIsInZhciBhcnJheUxpa2VUb0FycmF5ID0gcmVxdWlyZShcIi4vYXJyYXlMaWtlVG9BcnJheS5qc1wiKTtcblxuZnVuY3Rpb24gX2FycmF5V2l0aG91dEhvbGVzKGFycikge1xuICBpZiAoQXJyYXkuaXNBcnJheShhcnIpKSByZXR1cm4gYXJyYXlMaWtlVG9BcnJheShhcnIpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF9hcnJheVdpdGhvdXRIb2xlcywgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1vZHVsZS5leHBvcnRzOyIsImZ1bmN0aW9uIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoc2VsZikge1xuICBpZiAoc2VsZiA9PT0gdm9pZCAwKSB7XG4gICAgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFwidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkXCIpO1xuICB9XG5cbiAgcmV0dXJuIHNlbGY7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX2Fzc2VydFRoaXNJbml0aWFsaXplZCwgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1vZHVsZS5leHBvcnRzOyIsImZ1bmN0aW9uIF9hc3luY0dlbmVyYXRvckRlbGVnYXRlKGlubmVyLCBhd2FpdFdyYXApIHtcbiAgdmFyIGl0ZXIgPSB7fSxcbiAgICAgIHdhaXRpbmcgPSBmYWxzZTtcblxuICBmdW5jdGlvbiBwdW1wKGtleSwgdmFsdWUpIHtcbiAgICB3YWl0aW5nID0gdHJ1ZTtcbiAgICB2YWx1ZSA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgICByZXNvbHZlKGlubmVyW2tleV0odmFsdWUpKTtcbiAgICB9KTtcbiAgICByZXR1cm4ge1xuICAgICAgZG9uZTogZmFsc2UsXG4gICAgICB2YWx1ZTogYXdhaXRXcmFwKHZhbHVlKVxuICAgIH07XG4gIH1cblxuICA7XG5cbiAgaXRlclt0eXBlb2YgU3ltYm9sICE9PSBcInVuZGVmaW5lZFwiICYmIFN5bWJvbC5pdGVyYXRvciB8fCBcIkBAaXRlcmF0b3JcIl0gPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgaXRlci5uZXh0ID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgaWYgKHdhaXRpbmcpIHtcbiAgICAgIHdhaXRpbmcgPSBmYWxzZTtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gcHVtcChcIm5leHRcIiwgdmFsdWUpO1xuICB9O1xuXG4gIGlmICh0eXBlb2YgaW5uZXJbXCJ0aHJvd1wiXSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgaXRlcltcInRocm93XCJdID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICBpZiAod2FpdGluZykge1xuICAgICAgICB3YWl0aW5nID0gZmFsc2U7XG4gICAgICAgIHRocm93IHZhbHVlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcHVtcChcInRocm93XCIsIHZhbHVlKTtcbiAgICB9O1xuICB9XG5cbiAgaWYgKHR5cGVvZiBpbm5lcltcInJldHVyblwiXSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgaXRlcltcInJldHVyblwiXSA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgaWYgKHdhaXRpbmcpIHtcbiAgICAgICAgd2FpdGluZyA9IGZhbHNlO1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBwdW1wKFwicmV0dXJuXCIsIHZhbHVlKTtcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIGl0ZXI7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX2FzeW5jR2VuZXJhdG9yRGVsZWdhdGUsIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlLCBtb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0czsiLCJmdW5jdGlvbiBfYXN5bmNJdGVyYXRvcihpdGVyYWJsZSkge1xuICB2YXIgbWV0aG9kLFxuICAgICAgYXN5bmMsXG4gICAgICBzeW5jLFxuICAgICAgcmV0cnkgPSAyO1xuXG4gIGZvciAoXCJ1bmRlZmluZWRcIiAhPSB0eXBlb2YgU3ltYm9sICYmIChhc3luYyA9IFN5bWJvbC5hc3luY0l0ZXJhdG9yLCBzeW5jID0gU3ltYm9sLml0ZXJhdG9yKTsgcmV0cnktLTspIHtcbiAgICBpZiAoYXN5bmMgJiYgbnVsbCAhPSAobWV0aG9kID0gaXRlcmFibGVbYXN5bmNdKSkgcmV0dXJuIG1ldGhvZC5jYWxsKGl0ZXJhYmxlKTtcbiAgICBpZiAoc3luYyAmJiBudWxsICE9IChtZXRob2QgPSBpdGVyYWJsZVtzeW5jXSkpIHJldHVybiBuZXcgQXN5bmNGcm9tU3luY0l0ZXJhdG9yKG1ldGhvZC5jYWxsKGl0ZXJhYmxlKSk7XG4gICAgYXN5bmMgPSBcIkBAYXN5bmNJdGVyYXRvclwiLCBzeW5jID0gXCJAQGl0ZXJhdG9yXCI7XG4gIH1cblxuICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiT2JqZWN0IGlzIG5vdCBhc3luYyBpdGVyYWJsZVwiKTtcbn1cblxuZnVuY3Rpb24gQXN5bmNGcm9tU3luY0l0ZXJhdG9yKHMpIHtcbiAgZnVuY3Rpb24gQXN5bmNGcm9tU3luY0l0ZXJhdG9yQ29udGludWF0aW9uKHIpIHtcbiAgICBpZiAoT2JqZWN0KHIpICE9PSByKSByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IFR5cGVFcnJvcihyICsgXCIgaXMgbm90IGFuIG9iamVjdC5cIikpO1xuICAgIHZhciBkb25lID0gci5kb25lO1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoci52YWx1ZSkudGhlbihmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgICAgZG9uZTogZG9uZVxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBBc3luY0Zyb21TeW5jSXRlcmF0b3IgPSBmdW5jdGlvbiBBc3luY0Zyb21TeW5jSXRlcmF0b3Iocykge1xuICAgIHRoaXMucyA9IHMsIHRoaXMubiA9IHMubmV4dDtcbiAgfSwgQXN5bmNGcm9tU3luY0l0ZXJhdG9yLnByb3RvdHlwZSA9IHtcbiAgICBzOiBudWxsLFxuICAgIG46IG51bGwsXG4gICAgbmV4dDogZnVuY3Rpb24gbmV4dCgpIHtcbiAgICAgIHJldHVybiBBc3luY0Zyb21TeW5jSXRlcmF0b3JDb250aW51YXRpb24odGhpcy5uLmFwcGx5KHRoaXMucywgYXJndW1lbnRzKSk7XG4gICAgfSxcbiAgICBcInJldHVyblwiOiBmdW5jdGlvbiBfcmV0dXJuKHZhbHVlKSB7XG4gICAgICB2YXIgcmV0ID0gdGhpcy5zW1wicmV0dXJuXCJdO1xuICAgICAgcmV0dXJuIHZvaWQgMCA9PT0gcmV0ID8gUHJvbWlzZS5yZXNvbHZlKHtcbiAgICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgICBkb25lOiAhMFxuICAgICAgfSkgOiBBc3luY0Zyb21TeW5jSXRlcmF0b3JDb250aW51YXRpb24ocmV0LmFwcGx5KHRoaXMucywgYXJndW1lbnRzKSk7XG4gICAgfSxcbiAgICBcInRocm93XCI6IGZ1bmN0aW9uIF90aHJvdyh2YWx1ZSkge1xuICAgICAgdmFyIHRociA9IHRoaXMuc1tcInJldHVyblwiXTtcbiAgICAgIHJldHVybiB2b2lkIDAgPT09IHRociA/IFByb21pc2UucmVqZWN0KHZhbHVlKSA6IEFzeW5jRnJvbVN5bmNJdGVyYXRvckNvbnRpbnVhdGlvbih0aHIuYXBwbHkodGhpcy5zLCBhcmd1bWVudHMpKTtcbiAgICB9XG4gIH0sIG5ldyBBc3luY0Zyb21TeW5jSXRlcmF0b3Iocyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX2FzeW5jSXRlcmF0b3IsIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlLCBtb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0czsiLCJmdW5jdGlvbiBhc3luY0dlbmVyYXRvclN0ZXAoZ2VuLCByZXNvbHZlLCByZWplY3QsIF9uZXh0LCBfdGhyb3csIGtleSwgYXJnKSB7XG4gIHRyeSB7XG4gICAgdmFyIGluZm8gPSBnZW5ba2V5XShhcmcpO1xuICAgIHZhciB2YWx1ZSA9IGluZm8udmFsdWU7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmVqZWN0KGVycm9yKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoaW5mby5kb25lKSB7XG4gICAgcmVzb2x2ZSh2YWx1ZSk7XG4gIH0gZWxzZSB7XG4gICAgUHJvbWlzZS5yZXNvbHZlKHZhbHVlKS50aGVuKF9uZXh0LCBfdGhyb3cpO1xuICB9XG59XG5cbmZ1bmN0aW9uIF9hc3luY1RvR2VuZXJhdG9yKGZuKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzLFxuICAgICAgICBhcmdzID0gYXJndW1lbnRzO1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICB2YXIgZ2VuID0gZm4uYXBwbHkoc2VsZiwgYXJncyk7XG5cbiAgICAgIGZ1bmN0aW9uIF9uZXh0KHZhbHVlKSB7XG4gICAgICAgIGFzeW5jR2VuZXJhdG9yU3RlcChnZW4sIHJlc29sdmUsIHJlamVjdCwgX25leHQsIF90aHJvdywgXCJuZXh0XCIsIHZhbHVlKTtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gX3Rocm93KGVycikge1xuICAgICAgICBhc3luY0dlbmVyYXRvclN0ZXAoZ2VuLCByZXNvbHZlLCByZWplY3QsIF9uZXh0LCBfdGhyb3csIFwidGhyb3dcIiwgZXJyKTtcbiAgICAgIH1cblxuICAgICAgX25leHQodW5kZWZpbmVkKTtcbiAgICB9KTtcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBfYXN5bmNUb0dlbmVyYXRvciwgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1vZHVsZS5leHBvcnRzOyIsInZhciBBd2FpdFZhbHVlID0gcmVxdWlyZShcIi4vQXdhaXRWYWx1ZS5qc1wiKTtcblxuZnVuY3Rpb24gX2F3YWl0QXN5bmNHZW5lcmF0b3IodmFsdWUpIHtcbiAgcmV0dXJuIG5ldyBBd2FpdFZhbHVlKHZhbHVlKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBfYXdhaXRBc3luY0dlbmVyYXRvciwgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1vZHVsZS5leHBvcnRzOyIsImZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHtcbiAgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpO1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX2NsYXNzQ2FsbENoZWNrLCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZSwgbW9kdWxlLmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gbW9kdWxlLmV4cG9ydHM7IiwidmFyIHNldFByb3RvdHlwZU9mID0gcmVxdWlyZShcIi4vc2V0UHJvdG90eXBlT2YuanNcIik7XG5cbnZhciBpc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QgPSByZXF1aXJlKFwiLi9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QuanNcIik7XG5cbmZ1bmN0aW9uIF9jb25zdHJ1Y3QoUGFyZW50LCBhcmdzLCBDbGFzcykge1xuICBpZiAoaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCkpIHtcbiAgICBtb2R1bGUuZXhwb3J0cyA9IF9jb25zdHJ1Y3QgPSBSZWZsZWN0LmNvbnN0cnVjdCwgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1vZHVsZS5leHBvcnRzO1xuICB9IGVsc2Uge1xuICAgIG1vZHVsZS5leHBvcnRzID0gX2NvbnN0cnVjdCA9IGZ1bmN0aW9uIF9jb25zdHJ1Y3QoUGFyZW50LCBhcmdzLCBDbGFzcykge1xuICAgICAgdmFyIGEgPSBbbnVsbF07XG4gICAgICBhLnB1c2guYXBwbHkoYSwgYXJncyk7XG4gICAgICB2YXIgQ29uc3RydWN0b3IgPSBGdW5jdGlvbi5iaW5kLmFwcGx5KFBhcmVudCwgYSk7XG4gICAgICB2YXIgaW5zdGFuY2UgPSBuZXcgQ29uc3RydWN0b3IoKTtcbiAgICAgIGlmIChDbGFzcykgc2V0UHJvdG90eXBlT2YoaW5zdGFuY2UsIENsYXNzLnByb3RvdHlwZSk7XG4gICAgICByZXR1cm4gaW5zdGFuY2U7XG4gICAgfSwgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1vZHVsZS5leHBvcnRzO1xuICB9XG5cbiAgcmV0dXJuIF9jb25zdHJ1Y3QuYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBfY29uc3RydWN0LCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZSwgbW9kdWxlLmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gbW9kdWxlLmV4cG9ydHM7IiwiZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTtcbiAgICBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7XG4gICAgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlO1xuICAgIGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpO1xuICB9XG59XG5cbmZ1bmN0aW9uIF9jcmVhdGVDbGFzcyhDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHtcbiAgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7XG4gIGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KENvbnN0cnVjdG9yLCBcInByb3RvdHlwZVwiLCB7XG4gICAgd3JpdGFibGU6IGZhbHNlXG4gIH0pO1xuICByZXR1cm4gQ29uc3RydWN0b3I7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX2NyZWF0ZUNsYXNzLCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZSwgbW9kdWxlLmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gbW9kdWxlLmV4cG9ydHM7IiwiZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkge1xuICBpZiAoa2V5IGluIG9iaikge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwge1xuICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgb2JqW2tleV0gPSB2YWx1ZTtcbiAgfVxuXG4gIHJldHVybiBvYmo7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX2RlZmluZVByb3BlcnR5LCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZSwgbW9kdWxlLmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gbW9kdWxlLmV4cG9ydHM7IiwidmFyIHN1cGVyUHJvcEJhc2UgPSByZXF1aXJlKFwiLi9zdXBlclByb3BCYXNlLmpzXCIpO1xuXG5mdW5jdGlvbiBfZ2V0KCkge1xuICBpZiAodHlwZW9mIFJlZmxlY3QgIT09IFwidW5kZWZpbmVkXCIgJiYgUmVmbGVjdC5nZXQpIHtcbiAgICBtb2R1bGUuZXhwb3J0cyA9IF9nZXQgPSBSZWZsZWN0LmdldCwgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1vZHVsZS5leHBvcnRzO1xuICB9IGVsc2Uge1xuICAgIG1vZHVsZS5leHBvcnRzID0gX2dldCA9IGZ1bmN0aW9uIF9nZXQodGFyZ2V0LCBwcm9wZXJ0eSwgcmVjZWl2ZXIpIHtcbiAgICAgIHZhciBiYXNlID0gc3VwZXJQcm9wQmFzZSh0YXJnZXQsIHByb3BlcnR5KTtcbiAgICAgIGlmICghYmFzZSkgcmV0dXJuO1xuICAgICAgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGJhc2UsIHByb3BlcnR5KTtcblxuICAgICAgaWYgKGRlc2MuZ2V0KSB7XG4gICAgICAgIHJldHVybiBkZXNjLmdldC5jYWxsKGFyZ3VtZW50cy5sZW5ndGggPCAzID8gdGFyZ2V0IDogcmVjZWl2ZXIpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZGVzYy52YWx1ZTtcbiAgICB9LCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZSwgbW9kdWxlLmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gbW9kdWxlLmV4cG9ydHM7XG4gIH1cblxuICByZXR1cm4gX2dldC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF9nZXQsIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlLCBtb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0czsiLCJmdW5jdGlvbiBfZ2V0UHJvdG90eXBlT2Yobykge1xuICBtb2R1bGUuZXhwb3J0cyA9IF9nZXRQcm90b3R5cGVPZiA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5nZXRQcm90b3R5cGVPZiA6IGZ1bmN0aW9uIF9nZXRQcm90b3R5cGVPZihvKSB7XG4gICAgcmV0dXJuIG8uX19wcm90b19fIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZihvKTtcbiAgfSwgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1vZHVsZS5leHBvcnRzO1xuICByZXR1cm4gX2dldFByb3RvdHlwZU9mKG8pO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF9nZXRQcm90b3R5cGVPZiwgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1vZHVsZS5leHBvcnRzOyIsInZhciBzZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoXCIuL3NldFByb3RvdHlwZU9mLmpzXCIpO1xuXG5mdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHtcbiAgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSBcImZ1bmN0aW9uXCIgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvblwiKTtcbiAgfVxuXG4gIHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwge1xuICAgIGNvbnN0cnVjdG9yOiB7XG4gICAgICB2YWx1ZTogc3ViQ2xhc3MsXG4gICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH1cbiAgfSk7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzdWJDbGFzcywgXCJwcm90b3R5cGVcIiwge1xuICAgIHdyaXRhYmxlOiBmYWxzZVxuICB9KTtcbiAgaWYgKHN1cGVyQ2xhc3MpIHNldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBfaW5oZXJpdHMsIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlLCBtb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0czsiLCJmdW5jdGlvbiBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCkge1xuICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwidW5kZWZpbmVkXCIgfHwgIVJlZmxlY3QuY29uc3RydWN0KSByZXR1cm4gZmFsc2U7XG4gIGlmIChSZWZsZWN0LmNvbnN0cnVjdC5zaGFtKSByZXR1cm4gZmFsc2U7XG4gIGlmICh0eXBlb2YgUHJveHkgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIHRydWU7XG5cbiAgdHJ5IHtcbiAgICBCb29sZWFuLnByb3RvdHlwZS52YWx1ZU9mLmNhbGwoUmVmbGVjdC5jb25zdHJ1Y3QoQm9vbGVhbiwgW10sIGZ1bmN0aW9uICgpIHt9KSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0LCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZSwgbW9kdWxlLmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gbW9kdWxlLmV4cG9ydHM7IiwiZnVuY3Rpb24gX2l0ZXJhYmxlVG9BcnJheShpdGVyKSB7XG4gIGlmICh0eXBlb2YgU3ltYm9sICE9PSBcInVuZGVmaW5lZFwiICYmIGl0ZXJbU3ltYm9sLml0ZXJhdG9yXSAhPSBudWxsIHx8IGl0ZXJbXCJAQGl0ZXJhdG9yXCJdICE9IG51bGwpIHJldHVybiBBcnJheS5mcm9tKGl0ZXIpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF9pdGVyYWJsZVRvQXJyYXksIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlLCBtb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0czsiLCJmdW5jdGlvbiBfaXRlcmFibGVUb0FycmF5TGltaXQoYXJyLCBpKSB7XG4gIHZhciBfaSA9IGFyciA9PSBudWxsID8gbnVsbCA6IHR5cGVvZiBTeW1ib2wgIT09IFwidW5kZWZpbmVkXCIgJiYgYXJyW1N5bWJvbC5pdGVyYXRvcl0gfHwgYXJyW1wiQEBpdGVyYXRvclwiXTtcblxuICBpZiAoX2kgPT0gbnVsbCkgcmV0dXJuO1xuICB2YXIgX2FyciA9IFtdO1xuICB2YXIgX24gPSB0cnVlO1xuICB2YXIgX2QgPSBmYWxzZTtcblxuICB2YXIgX3MsIF9lO1xuXG4gIHRyeSB7XG4gICAgZm9yIChfaSA9IF9pLmNhbGwoYXJyKTsgIShfbiA9IChfcyA9IF9pLm5leHQoKSkuZG9uZSk7IF9uID0gdHJ1ZSkge1xuICAgICAgX2Fyci5wdXNoKF9zLnZhbHVlKTtcblxuICAgICAgaWYgKGkgJiYgX2Fyci5sZW5ndGggPT09IGkpIGJyZWFrO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgX2QgPSB0cnVlO1xuICAgIF9lID0gZXJyO1xuICB9IGZpbmFsbHkge1xuICAgIHRyeSB7XG4gICAgICBpZiAoIV9uICYmIF9pW1wicmV0dXJuXCJdICE9IG51bGwpIF9pW1wicmV0dXJuXCJdKCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGlmIChfZCkgdGhyb3cgX2U7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIF9hcnI7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX2l0ZXJhYmxlVG9BcnJheUxpbWl0LCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZSwgbW9kdWxlLmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gbW9kdWxlLmV4cG9ydHM7IiwiZnVuY3Rpb24gX25vbkl0ZXJhYmxlUmVzdCgpIHtcbiAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBkZXN0cnVjdHVyZSBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBfbm9uSXRlcmFibGVSZXN0LCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZSwgbW9kdWxlLmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gbW9kdWxlLmV4cG9ydHM7IiwiZnVuY3Rpb24gX25vbkl0ZXJhYmxlU3ByZWFkKCkge1xuICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIHNwcmVhZCBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBfbm9uSXRlcmFibGVTcHJlYWQsIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlLCBtb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0czsiLCJ2YXIgX3R5cGVvZiA9IHJlcXVpcmUoXCIuL3R5cGVvZi5qc1wiKVtcImRlZmF1bHRcIl07XG5cbnZhciBhc3NlcnRUaGlzSW5pdGlhbGl6ZWQgPSByZXF1aXJlKFwiLi9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQuanNcIik7XG5cbmZ1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHNlbGYsIGNhbGwpIHtcbiAgaWYgKGNhbGwgJiYgKF90eXBlb2YoY2FsbCkgPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGNhbGwgPT09IFwiZnVuY3Rpb25cIikpIHtcbiAgICByZXR1cm4gY2FsbDtcbiAgfSBlbHNlIGlmIChjYWxsICE9PSB2b2lkIDApIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiRGVyaXZlZCBjb25zdHJ1Y3RvcnMgbWF5IG9ubHkgcmV0dXJuIG9iamVjdCBvciB1bmRlZmluZWRcIik7XG4gIH1cblxuICByZXR1cm4gYXNzZXJ0VGhpc0luaXRpYWxpemVkKHNlbGYpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuLCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZSwgbW9kdWxlLmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gbW9kdWxlLmV4cG9ydHM7IiwiZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKG8sIHApIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSBfc2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHwgZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKG8sIHApIHtcbiAgICBvLl9fcHJvdG9fXyA9IHA7XG4gICAgcmV0dXJuIG87XG4gIH0sIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlLCBtb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0cztcbiAgcmV0dXJuIF9zZXRQcm90b3R5cGVPZihvLCBwKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBfc2V0UHJvdG90eXBlT2YsIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlLCBtb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0czsiLCJ2YXIgYXJyYXlXaXRoSG9sZXMgPSByZXF1aXJlKFwiLi9hcnJheVdpdGhIb2xlcy5qc1wiKTtcblxudmFyIGl0ZXJhYmxlVG9BcnJheUxpbWl0ID0gcmVxdWlyZShcIi4vaXRlcmFibGVUb0FycmF5TGltaXQuanNcIik7XG5cbnZhciB1bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSA9IHJlcXVpcmUoXCIuL3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5LmpzXCIpO1xuXG52YXIgbm9uSXRlcmFibGVSZXN0ID0gcmVxdWlyZShcIi4vbm9uSXRlcmFibGVSZXN0LmpzXCIpO1xuXG5mdW5jdGlvbiBfc2xpY2VkVG9BcnJheShhcnIsIGkpIHtcbiAgcmV0dXJuIGFycmF5V2l0aEhvbGVzKGFycikgfHwgaXRlcmFibGVUb0FycmF5TGltaXQoYXJyLCBpKSB8fCB1bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShhcnIsIGkpIHx8IG5vbkl0ZXJhYmxlUmVzdCgpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF9zbGljZWRUb0FycmF5LCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZSwgbW9kdWxlLmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gbW9kdWxlLmV4cG9ydHM7IiwidmFyIGdldFByb3RvdHlwZU9mID0gcmVxdWlyZShcIi4vZ2V0UHJvdG90eXBlT2YuanNcIik7XG5cbmZ1bmN0aW9uIF9zdXBlclByb3BCYXNlKG9iamVjdCwgcHJvcGVydHkpIHtcbiAgd2hpbGUgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSkpIHtcbiAgICBvYmplY3QgPSBnZXRQcm90b3R5cGVPZihvYmplY3QpO1xuICAgIGlmIChvYmplY3QgPT09IG51bGwpIGJyZWFrO1xuICB9XG5cbiAgcmV0dXJuIG9iamVjdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBfc3VwZXJQcm9wQmFzZSwgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1vZHVsZS5leHBvcnRzOyIsInZhciBhcnJheVdpdGhvdXRIb2xlcyA9IHJlcXVpcmUoXCIuL2FycmF5V2l0aG91dEhvbGVzLmpzXCIpO1xuXG52YXIgaXRlcmFibGVUb0FycmF5ID0gcmVxdWlyZShcIi4vaXRlcmFibGVUb0FycmF5LmpzXCIpO1xuXG52YXIgdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkgPSByZXF1aXJlKFwiLi91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheS5qc1wiKTtcblxudmFyIG5vbkl0ZXJhYmxlU3ByZWFkID0gcmVxdWlyZShcIi4vbm9uSXRlcmFibGVTcHJlYWQuanNcIik7XG5cbmZ1bmN0aW9uIF90b0NvbnN1bWFibGVBcnJheShhcnIpIHtcbiAgcmV0dXJuIGFycmF5V2l0aG91dEhvbGVzKGFycikgfHwgaXRlcmFibGVUb0FycmF5KGFycikgfHwgdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkoYXJyKSB8fCBub25JdGVyYWJsZVNwcmVhZCgpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF90b0NvbnN1bWFibGVBcnJheSwgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1vZHVsZS5leHBvcnRzOyIsImZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7XG4gIFwiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2ZcIjtcblxuICByZXR1cm4gKG1vZHVsZS5leHBvcnRzID0gX3R5cGVvZiA9IFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgU3ltYm9sICYmIFwic3ltYm9sXCIgPT0gdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA/IGZ1bmN0aW9uIChvYmopIHtcbiAgICByZXR1cm4gdHlwZW9mIG9iajtcbiAgfSA6IGZ1bmN0aW9uIChvYmopIHtcbiAgICByZXR1cm4gb2JqICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgU3ltYm9sICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2Ygb2JqO1xuICB9LCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZSwgbW9kdWxlLmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gbW9kdWxlLmV4cG9ydHMpLCBfdHlwZW9mKG9iaik7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX3R5cGVvZiwgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1vZHVsZS5leHBvcnRzOyIsInZhciBhcnJheUxpa2VUb0FycmF5ID0gcmVxdWlyZShcIi4vYXJyYXlMaWtlVG9BcnJheS5qc1wiKTtcblxuZnVuY3Rpb24gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8sIG1pbkxlbikge1xuICBpZiAoIW8pIHJldHVybjtcbiAgaWYgKHR5cGVvZiBvID09PSBcInN0cmluZ1wiKSByZXR1cm4gYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pO1xuICB2YXIgbiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKS5zbGljZSg4LCAtMSk7XG4gIGlmIChuID09PSBcIk9iamVjdFwiICYmIG8uY29uc3RydWN0b3IpIG4gPSBvLmNvbnN0cnVjdG9yLm5hbWU7XG4gIGlmIChuID09PSBcIk1hcFwiIHx8IG4gPT09IFwiU2V0XCIpIHJldHVybiBBcnJheS5mcm9tKG8pO1xuICBpZiAobiA9PT0gXCJBcmd1bWVudHNcIiB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSkgcmV0dXJuIGFycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXksIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlLCBtb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0czsiLCJ2YXIgQXN5bmNHZW5lcmF0b3IgPSByZXF1aXJlKFwiLi9Bc3luY0dlbmVyYXRvci5qc1wiKTtcblxuZnVuY3Rpb24gX3dyYXBBc3luY0dlbmVyYXRvcihmbikge1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBuZXcgQXN5bmNHZW5lcmF0b3IoZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKSk7XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX3dyYXBBc3luY0dlbmVyYXRvciwgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1vZHVsZS5leHBvcnRzOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcInJlZ2VuZXJhdG9yLXJ1bnRpbWVcIik7XG4iLCJcInVzZSBzdHJpY3RcIjtcclxubW9kdWxlLmV4cG9ydHMgPSBhc1Byb21pc2U7XHJcblxyXG4vKipcclxuICogQ2FsbGJhY2sgYXMgdXNlZCBieSB7QGxpbmsgdXRpbC5hc1Byb21pc2V9LlxyXG4gKiBAdHlwZWRlZiBhc1Byb21pc2VDYWxsYmFja1xyXG4gKiBAdHlwZSB7ZnVuY3Rpb259XHJcbiAqIEBwYXJhbSB7RXJyb3J8bnVsbH0gZXJyb3IgRXJyb3IsIGlmIGFueVxyXG4gKiBAcGFyYW0gey4uLip9IHBhcmFtcyBBZGRpdGlvbmFsIGFyZ3VtZW50c1xyXG4gKiBAcmV0dXJucyB7dW5kZWZpbmVkfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIGEgcHJvbWlzZSBmcm9tIGEgbm9kZS1zdHlsZSBjYWxsYmFjayBmdW5jdGlvbi5cclxuICogQG1lbWJlcm9mIHV0aWxcclxuICogQHBhcmFtIHthc1Byb21pc2VDYWxsYmFja30gZm4gRnVuY3Rpb24gdG8gY2FsbFxyXG4gKiBAcGFyYW0geyp9IGN0eCBGdW5jdGlvbiBjb250ZXh0XHJcbiAqIEBwYXJhbSB7Li4uKn0gcGFyYW1zIEZ1bmN0aW9uIGFyZ3VtZW50c1xyXG4gKiBAcmV0dXJucyB7UHJvbWlzZTwqPn0gUHJvbWlzaWZpZWQgZnVuY3Rpb25cclxuICovXHJcbmZ1bmN0aW9uIGFzUHJvbWlzZShmbiwgY3R4LyosIHZhcmFyZ3MgKi8pIHtcclxuICAgIHZhciBwYXJhbXMgID0gbmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGggLSAxKSxcclxuICAgICAgICBvZmZzZXQgID0gMCxcclxuICAgICAgICBpbmRleCAgID0gMixcclxuICAgICAgICBwZW5kaW5nID0gdHJ1ZTtcclxuICAgIHdoaWxlIChpbmRleCA8IGFyZ3VtZW50cy5sZW5ndGgpXHJcbiAgICAgICAgcGFyYW1zW29mZnNldCsrXSA9IGFyZ3VtZW50c1tpbmRleCsrXTtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiBleGVjdXRvcihyZXNvbHZlLCByZWplY3QpIHtcclxuICAgICAgICBwYXJhbXNbb2Zmc2V0XSA9IGZ1bmN0aW9uIGNhbGxiYWNrKGVyci8qLCB2YXJhcmdzICovKSB7XHJcbiAgICAgICAgICAgIGlmIChwZW5kaW5nKSB7XHJcbiAgICAgICAgICAgICAgICBwZW5kaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBpZiAoZXJyKVxyXG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnIpO1xyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHBhcmFtcyA9IG5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoIC0gMSksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKG9mZnNldCA8IHBhcmFtcy5sZW5ndGgpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtc1tvZmZzZXQrK10gPSBhcmd1bWVudHNbb2Zmc2V0XTtcclxuICAgICAgICAgICAgICAgICAgICByZXNvbHZlLmFwcGx5KG51bGwsIHBhcmFtcyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGZuLmFwcGx5KGN0eCB8fCBudWxsLCBwYXJhbXMpO1xyXG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICAgICAgICBpZiAocGVuZGluZykge1xyXG4gICAgICAgICAgICAgICAgcGVuZGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgcmVqZWN0KGVycik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9KTtcclxufVxyXG4iLCJcInVzZSBzdHJpY3RcIjtcclxuXHJcbi8qKlxyXG4gKiBBIG1pbmltYWwgYmFzZTY0IGltcGxlbWVudGF0aW9uIGZvciBudW1iZXIgYXJyYXlzLlxyXG4gKiBAbWVtYmVyb2YgdXRpbFxyXG4gKiBAbmFtZXNwYWNlXHJcbiAqL1xyXG52YXIgYmFzZTY0ID0gZXhwb3J0cztcclxuXHJcbi8qKlxyXG4gKiBDYWxjdWxhdGVzIHRoZSBieXRlIGxlbmd0aCBvZiBhIGJhc2U2NCBlbmNvZGVkIHN0cmluZy5cclxuICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBCYXNlNjQgZW5jb2RlZCBzdHJpbmdcclxuICogQHJldHVybnMge251bWJlcn0gQnl0ZSBsZW5ndGhcclxuICovXHJcbmJhc2U2NC5sZW5ndGggPSBmdW5jdGlvbiBsZW5ndGgoc3RyaW5nKSB7XHJcbiAgICB2YXIgcCA9IHN0cmluZy5sZW5ndGg7XHJcbiAgICBpZiAoIXApXHJcbiAgICAgICAgcmV0dXJuIDA7XHJcbiAgICB2YXIgbiA9IDA7XHJcbiAgICB3aGlsZSAoLS1wICUgNCA+IDEgJiYgc3RyaW5nLmNoYXJBdChwKSA9PT0gXCI9XCIpXHJcbiAgICAgICAgKytuO1xyXG4gICAgcmV0dXJuIE1hdGguY2VpbChzdHJpbmcubGVuZ3RoICogMykgLyA0IC0gbjtcclxufTtcclxuXHJcbi8vIEJhc2U2NCBlbmNvZGluZyB0YWJsZVxyXG52YXIgYjY0ID0gbmV3IEFycmF5KDY0KTtcclxuXHJcbi8vIEJhc2U2NCBkZWNvZGluZyB0YWJsZVxyXG52YXIgczY0ID0gbmV3IEFycmF5KDEyMyk7XHJcblxyXG4vLyA2NS4uOTAsIDk3Li4xMjIsIDQ4Li41NywgNDMsIDQ3XHJcbmZvciAodmFyIGkgPSAwOyBpIDwgNjQ7KVxyXG4gICAgczY0W2I2NFtpXSA9IGkgPCAyNiA/IGkgKyA2NSA6IGkgPCA1MiA/IGkgKyA3MSA6IGkgPCA2MiA/IGkgLSA0IDogaSAtIDU5IHwgNDNdID0gaSsrO1xyXG5cclxuLyoqXHJcbiAqIEVuY29kZXMgYSBidWZmZXIgdG8gYSBiYXNlNjQgZW5jb2RlZCBzdHJpbmcuXHJcbiAqIEBwYXJhbSB7VWludDhBcnJheX0gYnVmZmVyIFNvdXJjZSBidWZmZXJcclxuICogQHBhcmFtIHtudW1iZXJ9IHN0YXJ0IFNvdXJjZSBzdGFydFxyXG4gKiBAcGFyYW0ge251bWJlcn0gZW5kIFNvdXJjZSBlbmRcclxuICogQHJldHVybnMge3N0cmluZ30gQmFzZTY0IGVuY29kZWQgc3RyaW5nXHJcbiAqL1xyXG5iYXNlNjQuZW5jb2RlID0gZnVuY3Rpb24gZW5jb2RlKGJ1ZmZlciwgc3RhcnQsIGVuZCkge1xyXG4gICAgdmFyIHBhcnRzID0gbnVsbCxcclxuICAgICAgICBjaHVuayA9IFtdO1xyXG4gICAgdmFyIGkgPSAwLCAvLyBvdXRwdXQgaW5kZXhcclxuICAgICAgICBqID0gMCwgLy8gZ290byBpbmRleFxyXG4gICAgICAgIHQ7ICAgICAvLyB0ZW1wb3JhcnlcclxuICAgIHdoaWxlIChzdGFydCA8IGVuZCkge1xyXG4gICAgICAgIHZhciBiID0gYnVmZmVyW3N0YXJ0KytdO1xyXG4gICAgICAgIHN3aXRjaCAoaikge1xyXG4gICAgICAgICAgICBjYXNlIDA6XHJcbiAgICAgICAgICAgICAgICBjaHVua1tpKytdID0gYjY0W2IgPj4gMl07XHJcbiAgICAgICAgICAgICAgICB0ID0gKGIgJiAzKSA8PCA0O1xyXG4gICAgICAgICAgICAgICAgaiA9IDE7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSAxOlxyXG4gICAgICAgICAgICAgICAgY2h1bmtbaSsrXSA9IGI2NFt0IHwgYiA+PiA0XTtcclxuICAgICAgICAgICAgICAgIHQgPSAoYiAmIDE1KSA8PCAyO1xyXG4gICAgICAgICAgICAgICAgaiA9IDI7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSAyOlxyXG4gICAgICAgICAgICAgICAgY2h1bmtbaSsrXSA9IGI2NFt0IHwgYiA+PiA2XTtcclxuICAgICAgICAgICAgICAgIGNodW5rW2krK10gPSBiNjRbYiAmIDYzXTtcclxuICAgICAgICAgICAgICAgIGogPSAwO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChpID4gODE5MSkge1xyXG4gICAgICAgICAgICAocGFydHMgfHwgKHBhcnRzID0gW10pKS5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLCBjaHVuaykpO1xyXG4gICAgICAgICAgICBpID0gMDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAoaikge1xyXG4gICAgICAgIGNodW5rW2krK10gPSBiNjRbdF07XHJcbiAgICAgICAgY2h1bmtbaSsrXSA9IDYxO1xyXG4gICAgICAgIGlmIChqID09PSAxKVxyXG4gICAgICAgICAgICBjaHVua1tpKytdID0gNjE7XHJcbiAgICB9XHJcbiAgICBpZiAocGFydHMpIHtcclxuICAgICAgICBpZiAoaSlcclxuICAgICAgICAgICAgcGFydHMucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZywgY2h1bmsuc2xpY2UoMCwgaSkpKTtcclxuICAgICAgICByZXR1cm4gcGFydHMuam9pbihcIlwiKTtcclxuICAgIH1cclxuICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZywgY2h1bmsuc2xpY2UoMCwgaSkpO1xyXG59O1xyXG5cclxudmFyIGludmFsaWRFbmNvZGluZyA9IFwiaW52YWxpZCBlbmNvZGluZ1wiO1xyXG5cclxuLyoqXHJcbiAqIERlY29kZXMgYSBiYXNlNjQgZW5jb2RlZCBzdHJpbmcgdG8gYSBidWZmZXIuXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgU291cmNlIHN0cmluZ1xyXG4gKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IGJ1ZmZlciBEZXN0aW5hdGlvbiBidWZmZXJcclxuICogQHBhcmFtIHtudW1iZXJ9IG9mZnNldCBEZXN0aW5hdGlvbiBvZmZzZXRcclxuICogQHJldHVybnMge251bWJlcn0gTnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW5cclxuICogQHRocm93cyB7RXJyb3J9IElmIGVuY29kaW5nIGlzIGludmFsaWRcclxuICovXHJcbmJhc2U2NC5kZWNvZGUgPSBmdW5jdGlvbiBkZWNvZGUoc3RyaW5nLCBidWZmZXIsIG9mZnNldCkge1xyXG4gICAgdmFyIHN0YXJ0ID0gb2Zmc2V0O1xyXG4gICAgdmFyIGogPSAwLCAvLyBnb3RvIGluZGV4XHJcbiAgICAgICAgdDsgICAgIC8vIHRlbXBvcmFyeVxyXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHJpbmcubGVuZ3RoOykge1xyXG4gICAgICAgIHZhciBjID0gc3RyaW5nLmNoYXJDb2RlQXQoaSsrKTtcclxuICAgICAgICBpZiAoYyA9PT0gNjEgJiYgaiA+IDEpXHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGlmICgoYyA9IHM2NFtjXSkgPT09IHVuZGVmaW5lZClcclxuICAgICAgICAgICAgdGhyb3cgRXJyb3IoaW52YWxpZEVuY29kaW5nKTtcclxuICAgICAgICBzd2l0Y2ggKGopIHtcclxuICAgICAgICAgICAgY2FzZSAwOlxyXG4gICAgICAgICAgICAgICAgdCA9IGM7XHJcbiAgICAgICAgICAgICAgICBqID0gMTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIDE6XHJcbiAgICAgICAgICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gdCA8PCAyIHwgKGMgJiA0OCkgPj4gNDtcclxuICAgICAgICAgICAgICAgIHQgPSBjO1xyXG4gICAgICAgICAgICAgICAgaiA9IDI7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSAyOlxyXG4gICAgICAgICAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9ICh0ICYgMTUpIDw8IDQgfCAoYyAmIDYwKSA+PiAyO1xyXG4gICAgICAgICAgICAgICAgdCA9IGM7XHJcbiAgICAgICAgICAgICAgICBqID0gMztcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIDM6XHJcbiAgICAgICAgICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gKHQgJiAzKSA8PCA2IHwgYztcclxuICAgICAgICAgICAgICAgIGogPSAwO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKGogPT09IDEpXHJcbiAgICAgICAgdGhyb3cgRXJyb3IoaW52YWxpZEVuY29kaW5nKTtcclxuICAgIHJldHVybiBvZmZzZXQgLSBzdGFydDtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBUZXN0cyBpZiB0aGUgc3BlY2lmaWVkIHN0cmluZyBhcHBlYXJzIHRvIGJlIGJhc2U2NCBlbmNvZGVkLlxyXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIFN0cmluZyB0byB0ZXN0XHJcbiAqIEByZXR1cm5zIHtib29sZWFufSBgdHJ1ZWAgaWYgcHJvYmFibHkgYmFzZTY0IGVuY29kZWQsIG90aGVyd2lzZSBmYWxzZVxyXG4gKi9cclxuYmFzZTY0LnRlc3QgPSBmdW5jdGlvbiB0ZXN0KHN0cmluZykge1xyXG4gICAgcmV0dXJuIC9eKD86W0EtWmEtejAtOSsvXXs0fSkqKD86W0EtWmEtejAtOSsvXXsyfT09fFtBLVphLXowLTkrL117M309KT8kLy50ZXN0KHN0cmluZyk7XHJcbn07XHJcbiIsIlwidXNlIHN0cmljdFwiO1xyXG5tb2R1bGUuZXhwb3J0cyA9IEV2ZW50RW1pdHRlcjtcclxuXHJcbi8qKlxyXG4gKiBDb25zdHJ1Y3RzIGEgbmV3IGV2ZW50IGVtaXR0ZXIgaW5zdGFuY2UuXHJcbiAqIEBjbGFzc2Rlc2MgQSBtaW5pbWFsIGV2ZW50IGVtaXR0ZXIuXHJcbiAqIEBtZW1iZXJvZiB1dGlsXHJcbiAqIEBjb25zdHJ1Y3RvclxyXG4gKi9cclxuZnVuY3Rpb24gRXZlbnRFbWl0dGVyKCkge1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVnaXN0ZXJlZCBsaXN0ZW5lcnMuXHJcbiAgICAgKiBAdHlwZSB7T2JqZWN0LjxzdHJpbmcsKj59XHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICovXHJcbiAgICB0aGlzLl9saXN0ZW5lcnMgPSB7fTtcclxufVxyXG5cclxuLyoqXHJcbiAqIFJlZ2lzdGVycyBhbiBldmVudCBsaXN0ZW5lci5cclxuICogQHBhcmFtIHtzdHJpbmd9IGV2dCBFdmVudCBuYW1lXHJcbiAqIEBwYXJhbSB7ZnVuY3Rpb259IGZuIExpc3RlbmVyXHJcbiAqIEBwYXJhbSB7Kn0gW2N0eF0gTGlzdGVuZXIgY29udGV4dFxyXG4gKiBAcmV0dXJucyB7dXRpbC5FdmVudEVtaXR0ZXJ9IGB0aGlzYFxyXG4gKi9cclxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5vbiA9IGZ1bmN0aW9uIG9uKGV2dCwgZm4sIGN0eCkge1xyXG4gICAgKHRoaXMuX2xpc3RlbmVyc1tldnRdIHx8ICh0aGlzLl9saXN0ZW5lcnNbZXZ0XSA9IFtdKSkucHVzaCh7XHJcbiAgICAgICAgZm4gIDogZm4sXHJcbiAgICAgICAgY3R4IDogY3R4IHx8IHRoaXNcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIHRoaXM7XHJcbn07XHJcblxyXG4vKipcclxuICogUmVtb3ZlcyBhbiBldmVudCBsaXN0ZW5lciBvciBhbnkgbWF0Y2hpbmcgbGlzdGVuZXJzIGlmIGFyZ3VtZW50cyBhcmUgb21pdHRlZC5cclxuICogQHBhcmFtIHtzdHJpbmd9IFtldnRdIEV2ZW50IG5hbWUuIFJlbW92ZXMgYWxsIGxpc3RlbmVycyBpZiBvbWl0dGVkLlxyXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBbZm5dIExpc3RlbmVyIHRvIHJlbW92ZS4gUmVtb3ZlcyBhbGwgbGlzdGVuZXJzIG9mIGBldnRgIGlmIG9taXR0ZWQuXHJcbiAqIEByZXR1cm5zIHt1dGlsLkV2ZW50RW1pdHRlcn0gYHRoaXNgXHJcbiAqL1xyXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLm9mZiA9IGZ1bmN0aW9uIG9mZihldnQsIGZuKSB7XHJcbiAgICBpZiAoZXZ0ID09PSB1bmRlZmluZWQpXHJcbiAgICAgICAgdGhpcy5fbGlzdGVuZXJzID0ge307XHJcbiAgICBlbHNlIHtcclxuICAgICAgICBpZiAoZm4gPT09IHVuZGVmaW5lZClcclxuICAgICAgICAgICAgdGhpcy5fbGlzdGVuZXJzW2V2dF0gPSBbXTtcclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdmFyIGxpc3RlbmVycyA9IHRoaXMuX2xpc3RlbmVyc1tldnRdO1xyXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7KVxyXG4gICAgICAgICAgICAgICAgaWYgKGxpc3RlbmVyc1tpXS5mbiA9PT0gZm4pXHJcbiAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXJzLnNwbGljZShpLCAxKTtcclxuICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgICAgICArK2k7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXM7XHJcbn07XHJcblxyXG4vKipcclxuICogRW1pdHMgYW4gZXZlbnQgYnkgY2FsbGluZyBpdHMgbGlzdGVuZXJzIHdpdGggdGhlIHNwZWNpZmllZCBhcmd1bWVudHMuXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBldnQgRXZlbnQgbmFtZVxyXG4gKiBAcGFyYW0gey4uLip9IGFyZ3MgQXJndW1lbnRzXHJcbiAqIEByZXR1cm5zIHt1dGlsLkV2ZW50RW1pdHRlcn0gYHRoaXNgXHJcbiAqL1xyXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmVtaXQgPSBmdW5jdGlvbiBlbWl0KGV2dCkge1xyXG4gICAgdmFyIGxpc3RlbmVycyA9IHRoaXMuX2xpc3RlbmVyc1tldnRdO1xyXG4gICAgaWYgKGxpc3RlbmVycykge1xyXG4gICAgICAgIHZhciBhcmdzID0gW10sXHJcbiAgICAgICAgICAgIGkgPSAxO1xyXG4gICAgICAgIGZvciAoOyBpIDwgYXJndW1lbnRzLmxlbmd0aDspXHJcbiAgICAgICAgICAgIGFyZ3MucHVzaChhcmd1bWVudHNbaSsrXSk7XHJcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7KVxyXG4gICAgICAgICAgICBsaXN0ZW5lcnNbaV0uZm4uYXBwbHkobGlzdGVuZXJzW2krK10uY3R4LCBhcmdzKTtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzO1xyXG59O1xyXG4iLCJcInVzZSBzdHJpY3RcIjtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gZmFjdG9yeShmYWN0b3J5KTtcclxuXHJcbi8qKlxyXG4gKiBSZWFkcyAvIHdyaXRlcyBmbG9hdHMgLyBkb3VibGVzIGZyb20gLyB0byBidWZmZXJzLlxyXG4gKiBAbmFtZSB1dGlsLmZsb2F0XHJcbiAqIEBuYW1lc3BhY2VcclxuICovXHJcblxyXG4vKipcclxuICogV3JpdGVzIGEgMzIgYml0IGZsb2F0IHRvIGEgYnVmZmVyIHVzaW5nIGxpdHRsZSBlbmRpYW4gYnl0ZSBvcmRlci5cclxuICogQG5hbWUgdXRpbC5mbG9hdC53cml0ZUZsb2F0TEVcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB2YWwgVmFsdWUgdG8gd3JpdGVcclxuICogQHBhcmFtIHtVaW50OEFycmF5fSBidWYgVGFyZ2V0IGJ1ZmZlclxyXG4gKiBAcGFyYW0ge251bWJlcn0gcG9zIFRhcmdldCBidWZmZXIgb2Zmc2V0XHJcbiAqIEByZXR1cm5zIHt1bmRlZmluZWR9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFdyaXRlcyBhIDMyIGJpdCBmbG9hdCB0byBhIGJ1ZmZlciB1c2luZyBiaWcgZW5kaWFuIGJ5dGUgb3JkZXIuXHJcbiAqIEBuYW1lIHV0aWwuZmxvYXQud3JpdGVGbG9hdEJFXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge251bWJlcn0gdmFsIFZhbHVlIHRvIHdyaXRlXHJcbiAqIEBwYXJhbSB7VWludDhBcnJheX0gYnVmIFRhcmdldCBidWZmZXJcclxuICogQHBhcmFtIHtudW1iZXJ9IHBvcyBUYXJnZXQgYnVmZmVyIG9mZnNldFxyXG4gKiBAcmV0dXJucyB7dW5kZWZpbmVkfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBSZWFkcyBhIDMyIGJpdCBmbG9hdCBmcm9tIGEgYnVmZmVyIHVzaW5nIGxpdHRsZSBlbmRpYW4gYnl0ZSBvcmRlci5cclxuICogQG5hbWUgdXRpbC5mbG9hdC5yZWFkRmxvYXRMRVxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHtVaW50OEFycmF5fSBidWYgU291cmNlIGJ1ZmZlclxyXG4gKiBAcGFyYW0ge251bWJlcn0gcG9zIFNvdXJjZSBidWZmZXIgb2Zmc2V0XHJcbiAqIEByZXR1cm5zIHtudW1iZXJ9IFZhbHVlIHJlYWRcclxuICovXHJcblxyXG4vKipcclxuICogUmVhZHMgYSAzMiBiaXQgZmxvYXQgZnJvbSBhIGJ1ZmZlciB1c2luZyBiaWcgZW5kaWFuIGJ5dGUgb3JkZXIuXHJcbiAqIEBuYW1lIHV0aWwuZmxvYXQucmVhZEZsb2F0QkVcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7VWludDhBcnJheX0gYnVmIFNvdXJjZSBidWZmZXJcclxuICogQHBhcmFtIHtudW1iZXJ9IHBvcyBTb3VyY2UgYnVmZmVyIG9mZnNldFxyXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBWYWx1ZSByZWFkXHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFdyaXRlcyBhIDY0IGJpdCBkb3VibGUgdG8gYSBidWZmZXIgdXNpbmcgbGl0dGxlIGVuZGlhbiBieXRlIG9yZGVyLlxyXG4gKiBAbmFtZSB1dGlsLmZsb2F0LndyaXRlRG91YmxlTEVcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB2YWwgVmFsdWUgdG8gd3JpdGVcclxuICogQHBhcmFtIHtVaW50OEFycmF5fSBidWYgVGFyZ2V0IGJ1ZmZlclxyXG4gKiBAcGFyYW0ge251bWJlcn0gcG9zIFRhcmdldCBidWZmZXIgb2Zmc2V0XHJcbiAqIEByZXR1cm5zIHt1bmRlZmluZWR9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFdyaXRlcyBhIDY0IGJpdCBkb3VibGUgdG8gYSBidWZmZXIgdXNpbmcgYmlnIGVuZGlhbiBieXRlIG9yZGVyLlxyXG4gKiBAbmFtZSB1dGlsLmZsb2F0LndyaXRlRG91YmxlQkVcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB2YWwgVmFsdWUgdG8gd3JpdGVcclxuICogQHBhcmFtIHtVaW50OEFycmF5fSBidWYgVGFyZ2V0IGJ1ZmZlclxyXG4gKiBAcGFyYW0ge251bWJlcn0gcG9zIFRhcmdldCBidWZmZXIgb2Zmc2V0XHJcbiAqIEByZXR1cm5zIHt1bmRlZmluZWR9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFJlYWRzIGEgNjQgYml0IGRvdWJsZSBmcm9tIGEgYnVmZmVyIHVzaW5nIGxpdHRsZSBlbmRpYW4gYnl0ZSBvcmRlci5cclxuICogQG5hbWUgdXRpbC5mbG9hdC5yZWFkRG91YmxlTEVcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7VWludDhBcnJheX0gYnVmIFNvdXJjZSBidWZmZXJcclxuICogQHBhcmFtIHtudW1iZXJ9IHBvcyBTb3VyY2UgYnVmZmVyIG9mZnNldFxyXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBWYWx1ZSByZWFkXHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFJlYWRzIGEgNjQgYml0IGRvdWJsZSBmcm9tIGEgYnVmZmVyIHVzaW5nIGJpZyBlbmRpYW4gYnl0ZSBvcmRlci5cclxuICogQG5hbWUgdXRpbC5mbG9hdC5yZWFkRG91YmxlQkVcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7VWludDhBcnJheX0gYnVmIFNvdXJjZSBidWZmZXJcclxuICogQHBhcmFtIHtudW1iZXJ9IHBvcyBTb3VyY2UgYnVmZmVyIG9mZnNldFxyXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBWYWx1ZSByZWFkXHJcbiAqL1xyXG5cclxuLy8gRmFjdG9yeSBmdW5jdGlvbiBmb3IgdGhlIHB1cnBvc2Ugb2Ygbm9kZS1iYXNlZCB0ZXN0aW5nIGluIG1vZGlmaWVkIGdsb2JhbCBlbnZpcm9ubWVudHNcclxuZnVuY3Rpb24gZmFjdG9yeShleHBvcnRzKSB7XHJcblxyXG4gICAgLy8gZmxvYXQ6IHR5cGVkIGFycmF5XHJcbiAgICBpZiAodHlwZW9mIEZsb2F0MzJBcnJheSAhPT0gXCJ1bmRlZmluZWRcIikgKGZ1bmN0aW9uKCkge1xyXG5cclxuICAgICAgICB2YXIgZjMyID0gbmV3IEZsb2F0MzJBcnJheShbIC0wIF0pLFxyXG4gICAgICAgICAgICBmOGIgPSBuZXcgVWludDhBcnJheShmMzIuYnVmZmVyKSxcclxuICAgICAgICAgICAgbGUgID0gZjhiWzNdID09PSAxMjg7XHJcblxyXG4gICAgICAgIGZ1bmN0aW9uIHdyaXRlRmxvYXRfZjMyX2NweSh2YWwsIGJ1ZiwgcG9zKSB7XHJcbiAgICAgICAgICAgIGYzMlswXSA9IHZhbDtcclxuICAgICAgICAgICAgYnVmW3BvcyAgICBdID0gZjhiWzBdO1xyXG4gICAgICAgICAgICBidWZbcG9zICsgMV0gPSBmOGJbMV07XHJcbiAgICAgICAgICAgIGJ1Zltwb3MgKyAyXSA9IGY4YlsyXTtcclxuICAgICAgICAgICAgYnVmW3BvcyArIDNdID0gZjhiWzNdO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZnVuY3Rpb24gd3JpdGVGbG9hdF9mMzJfcmV2KHZhbCwgYnVmLCBwb3MpIHtcclxuICAgICAgICAgICAgZjMyWzBdID0gdmFsO1xyXG4gICAgICAgICAgICBidWZbcG9zICAgIF0gPSBmOGJbM107XHJcbiAgICAgICAgICAgIGJ1Zltwb3MgKyAxXSA9IGY4YlsyXTtcclxuICAgICAgICAgICAgYnVmW3BvcyArIDJdID0gZjhiWzFdO1xyXG4gICAgICAgICAgICBidWZbcG9zICsgM10gPSBmOGJbMF07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xyXG4gICAgICAgIGV4cG9ydHMud3JpdGVGbG9hdExFID0gbGUgPyB3cml0ZUZsb2F0X2YzMl9jcHkgOiB3cml0ZUZsb2F0X2YzMl9yZXY7XHJcbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cclxuICAgICAgICBleHBvcnRzLndyaXRlRmxvYXRCRSA9IGxlID8gd3JpdGVGbG9hdF9mMzJfcmV2IDogd3JpdGVGbG9hdF9mMzJfY3B5O1xyXG5cclxuICAgICAgICBmdW5jdGlvbiByZWFkRmxvYXRfZjMyX2NweShidWYsIHBvcykge1xyXG4gICAgICAgICAgICBmOGJbMF0gPSBidWZbcG9zICAgIF07XHJcbiAgICAgICAgICAgIGY4YlsxXSA9IGJ1Zltwb3MgKyAxXTtcclxuICAgICAgICAgICAgZjhiWzJdID0gYnVmW3BvcyArIDJdO1xyXG4gICAgICAgICAgICBmOGJbM10gPSBidWZbcG9zICsgM107XHJcbiAgICAgICAgICAgIHJldHVybiBmMzJbMF07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmdW5jdGlvbiByZWFkRmxvYXRfZjMyX3JldihidWYsIHBvcykge1xyXG4gICAgICAgICAgICBmOGJbM10gPSBidWZbcG9zICAgIF07XHJcbiAgICAgICAgICAgIGY4YlsyXSA9IGJ1Zltwb3MgKyAxXTtcclxuICAgICAgICAgICAgZjhiWzFdID0gYnVmW3BvcyArIDJdO1xyXG4gICAgICAgICAgICBmOGJbMF0gPSBidWZbcG9zICsgM107XHJcbiAgICAgICAgICAgIHJldHVybiBmMzJbMF07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xyXG4gICAgICAgIGV4cG9ydHMucmVhZEZsb2F0TEUgPSBsZSA/IHJlYWRGbG9hdF9mMzJfY3B5IDogcmVhZEZsb2F0X2YzMl9yZXY7XHJcbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cclxuICAgICAgICBleHBvcnRzLnJlYWRGbG9hdEJFID0gbGUgPyByZWFkRmxvYXRfZjMyX3JldiA6IHJlYWRGbG9hdF9mMzJfY3B5O1xyXG5cclxuICAgIC8vIGZsb2F0OiBpZWVlNzU0XHJcbiAgICB9KSgpOyBlbHNlIChmdW5jdGlvbigpIHtcclxuXHJcbiAgICAgICAgZnVuY3Rpb24gd3JpdGVGbG9hdF9pZWVlNzU0KHdyaXRlVWludCwgdmFsLCBidWYsIHBvcykge1xyXG4gICAgICAgICAgICB2YXIgc2lnbiA9IHZhbCA8IDAgPyAxIDogMDtcclxuICAgICAgICAgICAgaWYgKHNpZ24pXHJcbiAgICAgICAgICAgICAgICB2YWwgPSAtdmFsO1xyXG4gICAgICAgICAgICBpZiAodmFsID09PSAwKVxyXG4gICAgICAgICAgICAgICAgd3JpdGVVaW50KDEgLyB2YWwgPiAwID8gLyogcG9zaXRpdmUgKi8gMCA6IC8qIG5lZ2F0aXZlIDAgKi8gMjE0NzQ4MzY0OCwgYnVmLCBwb3MpO1xyXG4gICAgICAgICAgICBlbHNlIGlmIChpc05hTih2YWwpKVxyXG4gICAgICAgICAgICAgICAgd3JpdGVVaW50KDIxNDMyODkzNDQsIGJ1ZiwgcG9zKTtcclxuICAgICAgICAgICAgZWxzZSBpZiAodmFsID4gMy40MDI4MjM0NjYzODUyODg2ZSszOCkgLy8gKy1JbmZpbml0eVxyXG4gICAgICAgICAgICAgICAgd3JpdGVVaW50KChzaWduIDw8IDMxIHwgMjEzOTA5NTA0MCkgPj4+IDAsIGJ1ZiwgcG9zKTtcclxuICAgICAgICAgICAgZWxzZSBpZiAodmFsIDwgMS4xNzU0OTQzNTA4MjIyODc1ZS0zOCkgLy8gZGVub3JtYWxcclxuICAgICAgICAgICAgICAgIHdyaXRlVWludCgoc2lnbiA8PCAzMSB8IE1hdGgucm91bmQodmFsIC8gMS40MDEyOTg0NjQzMjQ4MTdlLTQ1KSkgPj4+IDAsIGJ1ZiwgcG9zKTtcclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgZXhwb25lbnQgPSBNYXRoLmZsb29yKE1hdGgubG9nKHZhbCkgLyBNYXRoLkxOMiksXHJcbiAgICAgICAgICAgICAgICAgICAgbWFudGlzc2EgPSBNYXRoLnJvdW5kKHZhbCAqIE1hdGgucG93KDIsIC1leHBvbmVudCkgKiA4Mzg4NjA4KSAmIDgzODg2MDc7XHJcbiAgICAgICAgICAgICAgICB3cml0ZVVpbnQoKHNpZ24gPDwgMzEgfCBleHBvbmVudCArIDEyNyA8PCAyMyB8IG1hbnRpc3NhKSA+Pj4gMCwgYnVmLCBwb3MpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBleHBvcnRzLndyaXRlRmxvYXRMRSA9IHdyaXRlRmxvYXRfaWVlZTc1NC5iaW5kKG51bGwsIHdyaXRlVWludExFKTtcclxuICAgICAgICBleHBvcnRzLndyaXRlRmxvYXRCRSA9IHdyaXRlRmxvYXRfaWVlZTc1NC5iaW5kKG51bGwsIHdyaXRlVWludEJFKTtcclxuXHJcbiAgICAgICAgZnVuY3Rpb24gcmVhZEZsb2F0X2llZWU3NTQocmVhZFVpbnQsIGJ1ZiwgcG9zKSB7XHJcbiAgICAgICAgICAgIHZhciB1aW50ID0gcmVhZFVpbnQoYnVmLCBwb3MpLFxyXG4gICAgICAgICAgICAgICAgc2lnbiA9ICh1aW50ID4+IDMxKSAqIDIgKyAxLFxyXG4gICAgICAgICAgICAgICAgZXhwb25lbnQgPSB1aW50ID4+PiAyMyAmIDI1NSxcclxuICAgICAgICAgICAgICAgIG1hbnRpc3NhID0gdWludCAmIDgzODg2MDc7XHJcbiAgICAgICAgICAgIHJldHVybiBleHBvbmVudCA9PT0gMjU1XHJcbiAgICAgICAgICAgICAgICA/IG1hbnRpc3NhXHJcbiAgICAgICAgICAgICAgICA/IE5hTlxyXG4gICAgICAgICAgICAgICAgOiBzaWduICogSW5maW5pdHlcclxuICAgICAgICAgICAgICAgIDogZXhwb25lbnQgPT09IDAgLy8gZGVub3JtYWxcclxuICAgICAgICAgICAgICAgID8gc2lnbiAqIDEuNDAxMjk4NDY0MzI0ODE3ZS00NSAqIG1hbnRpc3NhXHJcbiAgICAgICAgICAgICAgICA6IHNpZ24gKiBNYXRoLnBvdygyLCBleHBvbmVudCAtIDE1MCkgKiAobWFudGlzc2EgKyA4Mzg4NjA4KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGV4cG9ydHMucmVhZEZsb2F0TEUgPSByZWFkRmxvYXRfaWVlZTc1NC5iaW5kKG51bGwsIHJlYWRVaW50TEUpO1xyXG4gICAgICAgIGV4cG9ydHMucmVhZEZsb2F0QkUgPSByZWFkRmxvYXRfaWVlZTc1NC5iaW5kKG51bGwsIHJlYWRVaW50QkUpO1xyXG5cclxuICAgIH0pKCk7XHJcblxyXG4gICAgLy8gZG91YmxlOiB0eXBlZCBhcnJheVxyXG4gICAgaWYgKHR5cGVvZiBGbG9hdDY0QXJyYXkgIT09IFwidW5kZWZpbmVkXCIpIChmdW5jdGlvbigpIHtcclxuXHJcbiAgICAgICAgdmFyIGY2NCA9IG5ldyBGbG9hdDY0QXJyYXkoWy0wXSksXHJcbiAgICAgICAgICAgIGY4YiA9IG5ldyBVaW50OEFycmF5KGY2NC5idWZmZXIpLFxyXG4gICAgICAgICAgICBsZSAgPSBmOGJbN10gPT09IDEyODtcclxuXHJcbiAgICAgICAgZnVuY3Rpb24gd3JpdGVEb3VibGVfZjY0X2NweSh2YWwsIGJ1ZiwgcG9zKSB7XHJcbiAgICAgICAgICAgIGY2NFswXSA9IHZhbDtcclxuICAgICAgICAgICAgYnVmW3BvcyAgICBdID0gZjhiWzBdO1xyXG4gICAgICAgICAgICBidWZbcG9zICsgMV0gPSBmOGJbMV07XHJcbiAgICAgICAgICAgIGJ1Zltwb3MgKyAyXSA9IGY4YlsyXTtcclxuICAgICAgICAgICAgYnVmW3BvcyArIDNdID0gZjhiWzNdO1xyXG4gICAgICAgICAgICBidWZbcG9zICsgNF0gPSBmOGJbNF07XHJcbiAgICAgICAgICAgIGJ1Zltwb3MgKyA1XSA9IGY4Yls1XTtcclxuICAgICAgICAgICAgYnVmW3BvcyArIDZdID0gZjhiWzZdO1xyXG4gICAgICAgICAgICBidWZbcG9zICsgN10gPSBmOGJbN107XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmdW5jdGlvbiB3cml0ZURvdWJsZV9mNjRfcmV2KHZhbCwgYnVmLCBwb3MpIHtcclxuICAgICAgICAgICAgZjY0WzBdID0gdmFsO1xyXG4gICAgICAgICAgICBidWZbcG9zICAgIF0gPSBmOGJbN107XHJcbiAgICAgICAgICAgIGJ1Zltwb3MgKyAxXSA9IGY4Yls2XTtcclxuICAgICAgICAgICAgYnVmW3BvcyArIDJdID0gZjhiWzVdO1xyXG4gICAgICAgICAgICBidWZbcG9zICsgM10gPSBmOGJbNF07XHJcbiAgICAgICAgICAgIGJ1Zltwb3MgKyA0XSA9IGY4YlszXTtcclxuICAgICAgICAgICAgYnVmW3BvcyArIDVdID0gZjhiWzJdO1xyXG4gICAgICAgICAgICBidWZbcG9zICsgNl0gPSBmOGJbMV07XHJcbiAgICAgICAgICAgIGJ1Zltwb3MgKyA3XSA9IGY4YlswXTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXHJcbiAgICAgICAgZXhwb3J0cy53cml0ZURvdWJsZUxFID0gbGUgPyB3cml0ZURvdWJsZV9mNjRfY3B5IDogd3JpdGVEb3VibGVfZjY0X3JldjtcclxuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xyXG4gICAgICAgIGV4cG9ydHMud3JpdGVEb3VibGVCRSA9IGxlID8gd3JpdGVEb3VibGVfZjY0X3JldiA6IHdyaXRlRG91YmxlX2Y2NF9jcHk7XHJcblxyXG4gICAgICAgIGZ1bmN0aW9uIHJlYWREb3VibGVfZjY0X2NweShidWYsIHBvcykge1xyXG4gICAgICAgICAgICBmOGJbMF0gPSBidWZbcG9zICAgIF07XHJcbiAgICAgICAgICAgIGY4YlsxXSA9IGJ1Zltwb3MgKyAxXTtcclxuICAgICAgICAgICAgZjhiWzJdID0gYnVmW3BvcyArIDJdO1xyXG4gICAgICAgICAgICBmOGJbM10gPSBidWZbcG9zICsgM107XHJcbiAgICAgICAgICAgIGY4Yls0XSA9IGJ1Zltwb3MgKyA0XTtcclxuICAgICAgICAgICAgZjhiWzVdID0gYnVmW3BvcyArIDVdO1xyXG4gICAgICAgICAgICBmOGJbNl0gPSBidWZbcG9zICsgNl07XHJcbiAgICAgICAgICAgIGY4Yls3XSA9IGJ1Zltwb3MgKyA3XTtcclxuICAgICAgICAgICAgcmV0dXJuIGY2NFswXTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZ1bmN0aW9uIHJlYWREb3VibGVfZjY0X3JldihidWYsIHBvcykge1xyXG4gICAgICAgICAgICBmOGJbN10gPSBidWZbcG9zICAgIF07XHJcbiAgICAgICAgICAgIGY4Yls2XSA9IGJ1Zltwb3MgKyAxXTtcclxuICAgICAgICAgICAgZjhiWzVdID0gYnVmW3BvcyArIDJdO1xyXG4gICAgICAgICAgICBmOGJbNF0gPSBidWZbcG9zICsgM107XHJcbiAgICAgICAgICAgIGY4YlszXSA9IGJ1Zltwb3MgKyA0XTtcclxuICAgICAgICAgICAgZjhiWzJdID0gYnVmW3BvcyArIDVdO1xyXG4gICAgICAgICAgICBmOGJbMV0gPSBidWZbcG9zICsgNl07XHJcbiAgICAgICAgICAgIGY4YlswXSA9IGJ1Zltwb3MgKyA3XTtcclxuICAgICAgICAgICAgcmV0dXJuIGY2NFswXTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXHJcbiAgICAgICAgZXhwb3J0cy5yZWFkRG91YmxlTEUgPSBsZSA/IHJlYWREb3VibGVfZjY0X2NweSA6IHJlYWREb3VibGVfZjY0X3JldjtcclxuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xyXG4gICAgICAgIGV4cG9ydHMucmVhZERvdWJsZUJFID0gbGUgPyByZWFkRG91YmxlX2Y2NF9yZXYgOiByZWFkRG91YmxlX2Y2NF9jcHk7XHJcblxyXG4gICAgLy8gZG91YmxlOiBpZWVlNzU0XHJcbiAgICB9KSgpOyBlbHNlIChmdW5jdGlvbigpIHtcclxuXHJcbiAgICAgICAgZnVuY3Rpb24gd3JpdGVEb3VibGVfaWVlZTc1NCh3cml0ZVVpbnQsIG9mZjAsIG9mZjEsIHZhbCwgYnVmLCBwb3MpIHtcclxuICAgICAgICAgICAgdmFyIHNpZ24gPSB2YWwgPCAwID8gMSA6IDA7XHJcbiAgICAgICAgICAgIGlmIChzaWduKVxyXG4gICAgICAgICAgICAgICAgdmFsID0gLXZhbDtcclxuICAgICAgICAgICAgaWYgKHZhbCA9PT0gMCkge1xyXG4gICAgICAgICAgICAgICAgd3JpdGVVaW50KDAsIGJ1ZiwgcG9zICsgb2ZmMCk7XHJcbiAgICAgICAgICAgICAgICB3cml0ZVVpbnQoMSAvIHZhbCA+IDAgPyAvKiBwb3NpdGl2ZSAqLyAwIDogLyogbmVnYXRpdmUgMCAqLyAyMTQ3NDgzNjQ4LCBidWYsIHBvcyArIG9mZjEpO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGlzTmFOKHZhbCkpIHtcclxuICAgICAgICAgICAgICAgIHdyaXRlVWludCgwLCBidWYsIHBvcyArIG9mZjApO1xyXG4gICAgICAgICAgICAgICAgd3JpdGVVaW50KDIxNDY5NTkzNjAsIGJ1ZiwgcG9zICsgb2ZmMSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsID4gMS43OTc2OTMxMzQ4NjIzMTU3ZSszMDgpIHsgLy8gKy1JbmZpbml0eVxyXG4gICAgICAgICAgICAgICAgd3JpdGVVaW50KDAsIGJ1ZiwgcG9zICsgb2ZmMCk7XHJcbiAgICAgICAgICAgICAgICB3cml0ZVVpbnQoKHNpZ24gPDwgMzEgfCAyMTQ2NDM1MDcyKSA+Pj4gMCwgYnVmLCBwb3MgKyBvZmYxKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHZhciBtYW50aXNzYTtcclxuICAgICAgICAgICAgICAgIGlmICh2YWwgPCAyLjIyNTA3Mzg1ODUwNzIwMTRlLTMwOCkgeyAvLyBkZW5vcm1hbFxyXG4gICAgICAgICAgICAgICAgICAgIG1hbnRpc3NhID0gdmFsIC8gNWUtMzI0O1xyXG4gICAgICAgICAgICAgICAgICAgIHdyaXRlVWludChtYW50aXNzYSA+Pj4gMCwgYnVmLCBwb3MgKyBvZmYwKTtcclxuICAgICAgICAgICAgICAgICAgICB3cml0ZVVpbnQoKHNpZ24gPDwgMzEgfCBtYW50aXNzYSAvIDQyOTQ5NjcyOTYpID4+PiAwLCBidWYsIHBvcyArIG9mZjEpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgZXhwb25lbnQgPSBNYXRoLmZsb29yKE1hdGgubG9nKHZhbCkgLyBNYXRoLkxOMik7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGV4cG9uZW50ID09PSAxMDI0KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBleHBvbmVudCA9IDEwMjM7XHJcbiAgICAgICAgICAgICAgICAgICAgbWFudGlzc2EgPSB2YWwgKiBNYXRoLnBvdygyLCAtZXhwb25lbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgIHdyaXRlVWludChtYW50aXNzYSAqIDQ1MDM1OTk2MjczNzA0OTYgPj4+IDAsIGJ1ZiwgcG9zICsgb2ZmMCk7XHJcbiAgICAgICAgICAgICAgICAgICAgd3JpdGVVaW50KChzaWduIDw8IDMxIHwgZXhwb25lbnQgKyAxMDIzIDw8IDIwIHwgbWFudGlzc2EgKiAxMDQ4NTc2ICYgMTA0ODU3NSkgPj4+IDAsIGJ1ZiwgcG9zICsgb2ZmMSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGV4cG9ydHMud3JpdGVEb3VibGVMRSA9IHdyaXRlRG91YmxlX2llZWU3NTQuYmluZChudWxsLCB3cml0ZVVpbnRMRSwgMCwgNCk7XHJcbiAgICAgICAgZXhwb3J0cy53cml0ZURvdWJsZUJFID0gd3JpdGVEb3VibGVfaWVlZTc1NC5iaW5kKG51bGwsIHdyaXRlVWludEJFLCA0LCAwKTtcclxuXHJcbiAgICAgICAgZnVuY3Rpb24gcmVhZERvdWJsZV9pZWVlNzU0KHJlYWRVaW50LCBvZmYwLCBvZmYxLCBidWYsIHBvcykge1xyXG4gICAgICAgICAgICB2YXIgbG8gPSByZWFkVWludChidWYsIHBvcyArIG9mZjApLFxyXG4gICAgICAgICAgICAgICAgaGkgPSByZWFkVWludChidWYsIHBvcyArIG9mZjEpO1xyXG4gICAgICAgICAgICB2YXIgc2lnbiA9IChoaSA+PiAzMSkgKiAyICsgMSxcclxuICAgICAgICAgICAgICAgIGV4cG9uZW50ID0gaGkgPj4+IDIwICYgMjA0NyxcclxuICAgICAgICAgICAgICAgIG1hbnRpc3NhID0gNDI5NDk2NzI5NiAqIChoaSAmIDEwNDg1NzUpICsgbG87XHJcbiAgICAgICAgICAgIHJldHVybiBleHBvbmVudCA9PT0gMjA0N1xyXG4gICAgICAgICAgICAgICAgPyBtYW50aXNzYVxyXG4gICAgICAgICAgICAgICAgPyBOYU5cclxuICAgICAgICAgICAgICAgIDogc2lnbiAqIEluZmluaXR5XHJcbiAgICAgICAgICAgICAgICA6IGV4cG9uZW50ID09PSAwIC8vIGRlbm9ybWFsXHJcbiAgICAgICAgICAgICAgICA/IHNpZ24gKiA1ZS0zMjQgKiBtYW50aXNzYVxyXG4gICAgICAgICAgICAgICAgOiBzaWduICogTWF0aC5wb3coMiwgZXhwb25lbnQgLSAxMDc1KSAqIChtYW50aXNzYSArIDQ1MDM1OTk2MjczNzA0OTYpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZXhwb3J0cy5yZWFkRG91YmxlTEUgPSByZWFkRG91YmxlX2llZWU3NTQuYmluZChudWxsLCByZWFkVWludExFLCAwLCA0KTtcclxuICAgICAgICBleHBvcnRzLnJlYWREb3VibGVCRSA9IHJlYWREb3VibGVfaWVlZTc1NC5iaW5kKG51bGwsIHJlYWRVaW50QkUsIDQsIDApO1xyXG5cclxuICAgIH0pKCk7XHJcblxyXG4gICAgcmV0dXJuIGV4cG9ydHM7XHJcbn1cclxuXHJcbi8vIHVpbnQgaGVscGVyc1xyXG5cclxuZnVuY3Rpb24gd3JpdGVVaW50TEUodmFsLCBidWYsIHBvcykge1xyXG4gICAgYnVmW3BvcyAgICBdID0gIHZhbCAgICAgICAgJiAyNTU7XHJcbiAgICBidWZbcG9zICsgMV0gPSAgdmFsID4+PiA4ICAmIDI1NTtcclxuICAgIGJ1Zltwb3MgKyAyXSA9ICB2YWwgPj4+IDE2ICYgMjU1O1xyXG4gICAgYnVmW3BvcyArIDNdID0gIHZhbCA+Pj4gMjQ7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHdyaXRlVWludEJFKHZhbCwgYnVmLCBwb3MpIHtcclxuICAgIGJ1Zltwb3MgICAgXSA9ICB2YWwgPj4+IDI0O1xyXG4gICAgYnVmW3BvcyArIDFdID0gIHZhbCA+Pj4gMTYgJiAyNTU7XHJcbiAgICBidWZbcG9zICsgMl0gPSAgdmFsID4+PiA4ICAmIDI1NTtcclxuICAgIGJ1Zltwb3MgKyAzXSA9ICB2YWwgICAgICAgICYgMjU1O1xyXG59XHJcblxyXG5mdW5jdGlvbiByZWFkVWludExFKGJ1ZiwgcG9zKSB7XHJcbiAgICByZXR1cm4gKGJ1Zltwb3MgICAgXVxyXG4gICAgICAgICAgfCBidWZbcG9zICsgMV0gPDwgOFxyXG4gICAgICAgICAgfCBidWZbcG9zICsgMl0gPDwgMTZcclxuICAgICAgICAgIHwgYnVmW3BvcyArIDNdIDw8IDI0KSA+Pj4gMDtcclxufVxyXG5cclxuZnVuY3Rpb24gcmVhZFVpbnRCRShidWYsIHBvcykge1xyXG4gICAgcmV0dXJuIChidWZbcG9zICAgIF0gPDwgMjRcclxuICAgICAgICAgIHwgYnVmW3BvcyArIDFdIDw8IDE2XHJcbiAgICAgICAgICB8IGJ1Zltwb3MgKyAyXSA8PCA4XHJcbiAgICAgICAgICB8IGJ1Zltwb3MgKyAzXSkgPj4+IDA7XHJcbn1cclxuIiwiXCJ1c2Ugc3RyaWN0XCI7XHJcbm1vZHVsZS5leHBvcnRzID0gaW5xdWlyZTtcclxuXHJcbi8qKlxyXG4gKiBSZXF1aXJlcyBhIG1vZHVsZSBvbmx5IGlmIGF2YWlsYWJsZS5cclxuICogQG1lbWJlcm9mIHV0aWxcclxuICogQHBhcmFtIHtzdHJpbmd9IG1vZHVsZU5hbWUgTW9kdWxlIHRvIHJlcXVpcmVcclxuICogQHJldHVybnMgez9PYmplY3R9IFJlcXVpcmVkIG1vZHVsZSBpZiBhdmFpbGFibGUgYW5kIG5vdCBlbXB0eSwgb3RoZXJ3aXNlIGBudWxsYFxyXG4gKi9cclxuZnVuY3Rpb24gaW5xdWlyZShtb2R1bGVOYW1lKSB7XHJcbiAgICB0cnkge1xyXG4gICAgICAgIHZhciBtb2QgPSBldmFsKFwicXVpcmVcIi5yZXBsYWNlKC9eLyxcInJlXCIpKShtb2R1bGVOYW1lKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1ldmFsXHJcbiAgICAgICAgaWYgKG1vZCAmJiAobW9kLmxlbmd0aCB8fCBPYmplY3Qua2V5cyhtb2QpLmxlbmd0aCkpXHJcbiAgICAgICAgICAgIHJldHVybiBtb2Q7XHJcbiAgICB9IGNhdGNoIChlKSB7fSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWVtcHR5XHJcbiAgICByZXR1cm4gbnVsbDtcclxufVxyXG4iLCJcInVzZSBzdHJpY3RcIjtcclxubW9kdWxlLmV4cG9ydHMgPSBwb29sO1xyXG5cclxuLyoqXHJcbiAqIEFuIGFsbG9jYXRvciBhcyB1c2VkIGJ5IHtAbGluayB1dGlsLnBvb2x9LlxyXG4gKiBAdHlwZWRlZiBQb29sQWxsb2NhdG9yXHJcbiAqIEB0eXBlIHtmdW5jdGlvbn1cclxuICogQHBhcmFtIHtudW1iZXJ9IHNpemUgQnVmZmVyIHNpemVcclxuICogQHJldHVybnMge1VpbnQ4QXJyYXl9IEJ1ZmZlclxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBBIHNsaWNlciBhcyB1c2VkIGJ5IHtAbGluayB1dGlsLnBvb2x9LlxyXG4gKiBAdHlwZWRlZiBQb29sU2xpY2VyXHJcbiAqIEB0eXBlIHtmdW5jdGlvbn1cclxuICogQHBhcmFtIHtudW1iZXJ9IHN0YXJ0IFN0YXJ0IG9mZnNldFxyXG4gKiBAcGFyYW0ge251bWJlcn0gZW5kIEVuZCBvZmZzZXRcclxuICogQHJldHVybnMge1VpbnQ4QXJyYXl9IEJ1ZmZlciBzbGljZVxyXG4gKiBAdGhpcyB7VWludDhBcnJheX1cclxuICovXHJcblxyXG4vKipcclxuICogQSBnZW5lcmFsIHB1cnBvc2UgYnVmZmVyIHBvb2wuXHJcbiAqIEBtZW1iZXJvZiB1dGlsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge1Bvb2xBbGxvY2F0b3J9IGFsbG9jIEFsbG9jYXRvclxyXG4gKiBAcGFyYW0ge1Bvb2xTbGljZXJ9IHNsaWNlIFNsaWNlclxyXG4gKiBAcGFyYW0ge251bWJlcn0gW3NpemU9ODE5Ml0gU2xhYiBzaXplXHJcbiAqIEByZXR1cm5zIHtQb29sQWxsb2NhdG9yfSBQb29sZWQgYWxsb2NhdG9yXHJcbiAqL1xyXG5mdW5jdGlvbiBwb29sKGFsbG9jLCBzbGljZSwgc2l6ZSkge1xyXG4gICAgdmFyIFNJWkUgICA9IHNpemUgfHwgODE5MjtcclxuICAgIHZhciBNQVggICAgPSBTSVpFID4+PiAxO1xyXG4gICAgdmFyIHNsYWIgICA9IG51bGw7XHJcbiAgICB2YXIgb2Zmc2V0ID0gU0laRTtcclxuICAgIHJldHVybiBmdW5jdGlvbiBwb29sX2FsbG9jKHNpemUpIHtcclxuICAgICAgICBpZiAoc2l6ZSA8IDEgfHwgc2l6ZSA+IE1BWClcclxuICAgICAgICAgICAgcmV0dXJuIGFsbG9jKHNpemUpO1xyXG4gICAgICAgIGlmIChvZmZzZXQgKyBzaXplID4gU0laRSkge1xyXG4gICAgICAgICAgICBzbGFiID0gYWxsb2MoU0laRSk7XHJcbiAgICAgICAgICAgIG9mZnNldCA9IDA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciBidWYgPSBzbGljZS5jYWxsKHNsYWIsIG9mZnNldCwgb2Zmc2V0ICs9IHNpemUpO1xyXG4gICAgICAgIGlmIChvZmZzZXQgJiA3KSAvLyBhbGlnbiB0byAzMiBiaXRcclxuICAgICAgICAgICAgb2Zmc2V0ID0gKG9mZnNldCB8IDcpICsgMTtcclxuICAgICAgICByZXR1cm4gYnVmO1xyXG4gICAgfTtcclxufVxyXG4iLCJcInVzZSBzdHJpY3RcIjtcclxuXHJcbi8qKlxyXG4gKiBBIG1pbmltYWwgVVRGOCBpbXBsZW1lbnRhdGlvbiBmb3IgbnVtYmVyIGFycmF5cy5cclxuICogQG1lbWJlcm9mIHV0aWxcclxuICogQG5hbWVzcGFjZVxyXG4gKi9cclxudmFyIHV0ZjggPSBleHBvcnRzO1xyXG5cclxuLyoqXHJcbiAqIENhbGN1bGF0ZXMgdGhlIFVURjggYnl0ZSBsZW5ndGggb2YgYSBzdHJpbmcuXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgU3RyaW5nXHJcbiAqIEByZXR1cm5zIHtudW1iZXJ9IEJ5dGUgbGVuZ3RoXHJcbiAqL1xyXG51dGY4Lmxlbmd0aCA9IGZ1bmN0aW9uIHV0ZjhfbGVuZ3RoKHN0cmluZykge1xyXG4gICAgdmFyIGxlbiA9IDAsXHJcbiAgICAgICAgYyA9IDA7XHJcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN0cmluZy5sZW5ndGg7ICsraSkge1xyXG4gICAgICAgIGMgPSBzdHJpbmcuY2hhckNvZGVBdChpKTtcclxuICAgICAgICBpZiAoYyA8IDEyOClcclxuICAgICAgICAgICAgbGVuICs9IDE7XHJcbiAgICAgICAgZWxzZSBpZiAoYyA8IDIwNDgpXHJcbiAgICAgICAgICAgIGxlbiArPSAyO1xyXG4gICAgICAgIGVsc2UgaWYgKChjICYgMHhGQzAwKSA9PT0gMHhEODAwICYmIChzdHJpbmcuY2hhckNvZGVBdChpICsgMSkgJiAweEZDMDApID09PSAweERDMDApIHtcclxuICAgICAgICAgICAgKytpO1xyXG4gICAgICAgICAgICBsZW4gKz0gNDtcclxuICAgICAgICB9IGVsc2VcclxuICAgICAgICAgICAgbGVuICs9IDM7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbGVuO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIFJlYWRzIFVURjggYnl0ZXMgYXMgYSBzdHJpbmcuXHJcbiAqIEBwYXJhbSB7VWludDhBcnJheX0gYnVmZmVyIFNvdXJjZSBidWZmZXJcclxuICogQHBhcmFtIHtudW1iZXJ9IHN0YXJ0IFNvdXJjZSBzdGFydFxyXG4gKiBAcGFyYW0ge251bWJlcn0gZW5kIFNvdXJjZSBlbmRcclxuICogQHJldHVybnMge3N0cmluZ30gU3RyaW5nIHJlYWRcclxuICovXHJcbnV0ZjgucmVhZCA9IGZ1bmN0aW9uIHV0ZjhfcmVhZChidWZmZXIsIHN0YXJ0LCBlbmQpIHtcclxuICAgIHZhciBsZW4gPSBlbmQgLSBzdGFydDtcclxuICAgIGlmIChsZW4gPCAxKVxyXG4gICAgICAgIHJldHVybiBcIlwiO1xyXG4gICAgdmFyIHBhcnRzID0gbnVsbCxcclxuICAgICAgICBjaHVuayA9IFtdLFxyXG4gICAgICAgIGkgPSAwLCAvLyBjaGFyIG9mZnNldFxyXG4gICAgICAgIHQ7ICAgICAvLyB0ZW1wb3JhcnlcclxuICAgIHdoaWxlIChzdGFydCA8IGVuZCkge1xyXG4gICAgICAgIHQgPSBidWZmZXJbc3RhcnQrK107XHJcbiAgICAgICAgaWYgKHQgPCAxMjgpXHJcbiAgICAgICAgICAgIGNodW5rW2krK10gPSB0O1xyXG4gICAgICAgIGVsc2UgaWYgKHQgPiAxOTEgJiYgdCA8IDIyNClcclxuICAgICAgICAgICAgY2h1bmtbaSsrXSA9ICh0ICYgMzEpIDw8IDYgfCBidWZmZXJbc3RhcnQrK10gJiA2MztcclxuICAgICAgICBlbHNlIGlmICh0ID4gMjM5ICYmIHQgPCAzNjUpIHtcclxuICAgICAgICAgICAgdCA9ICgodCAmIDcpIDw8IDE4IHwgKGJ1ZmZlcltzdGFydCsrXSAmIDYzKSA8PCAxMiB8IChidWZmZXJbc3RhcnQrK10gJiA2MykgPDwgNiB8IGJ1ZmZlcltzdGFydCsrXSAmIDYzKSAtIDB4MTAwMDA7XHJcbiAgICAgICAgICAgIGNodW5rW2krK10gPSAweEQ4MDAgKyAodCA+PiAxMCk7XHJcbiAgICAgICAgICAgIGNodW5rW2krK10gPSAweERDMDAgKyAodCAmIDEwMjMpO1xyXG4gICAgICAgIH0gZWxzZVxyXG4gICAgICAgICAgICBjaHVua1tpKytdID0gKHQgJiAxNSkgPDwgMTIgfCAoYnVmZmVyW3N0YXJ0KytdICYgNjMpIDw8IDYgfCBidWZmZXJbc3RhcnQrK10gJiA2MztcclxuICAgICAgICBpZiAoaSA+IDgxOTEpIHtcclxuICAgICAgICAgICAgKHBhcnRzIHx8IChwYXJ0cyA9IFtdKSkucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZywgY2h1bmspKTtcclxuICAgICAgICAgICAgaSA9IDA7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKHBhcnRzKSB7XHJcbiAgICAgICAgaWYgKGkpXHJcbiAgICAgICAgICAgIHBhcnRzLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsIGNodW5rLnNsaWNlKDAsIGkpKSk7XHJcbiAgICAgICAgcmV0dXJuIHBhcnRzLmpvaW4oXCJcIik7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsIGNodW5rLnNsaWNlKDAsIGkpKTtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBXcml0ZXMgYSBzdHJpbmcgYXMgVVRGOCBieXRlcy5cclxuICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBTb3VyY2Ugc3RyaW5nXHJcbiAqIEBwYXJhbSB7VWludDhBcnJheX0gYnVmZmVyIERlc3RpbmF0aW9uIGJ1ZmZlclxyXG4gKiBAcGFyYW0ge251bWJlcn0gb2Zmc2V0IERlc3RpbmF0aW9uIG9mZnNldFxyXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBCeXRlcyB3cml0dGVuXHJcbiAqL1xyXG51dGY4LndyaXRlID0gZnVuY3Rpb24gdXRmOF93cml0ZShzdHJpbmcsIGJ1ZmZlciwgb2Zmc2V0KSB7XHJcbiAgICB2YXIgc3RhcnQgPSBvZmZzZXQsXHJcbiAgICAgICAgYzEsIC8vIGNoYXJhY3RlciAxXHJcbiAgICAgICAgYzI7IC8vIGNoYXJhY3RlciAyXHJcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN0cmluZy5sZW5ndGg7ICsraSkge1xyXG4gICAgICAgIGMxID0gc3RyaW5nLmNoYXJDb2RlQXQoaSk7XHJcbiAgICAgICAgaWYgKGMxIDwgMTI4KSB7XHJcbiAgICAgICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBjMTtcclxuICAgICAgICB9IGVsc2UgaWYgKGMxIDwgMjA0OCkge1xyXG4gICAgICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gYzEgPj4gNiAgICAgICB8IDE5MjtcclxuICAgICAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IGMxICAgICAgICYgNjMgfCAxMjg7XHJcbiAgICAgICAgfSBlbHNlIGlmICgoYzEgJiAweEZDMDApID09PSAweEQ4MDAgJiYgKChjMiA9IHN0cmluZy5jaGFyQ29kZUF0KGkgKyAxKSkgJiAweEZDMDApID09PSAweERDMDApIHtcclxuICAgICAgICAgICAgYzEgPSAweDEwMDAwICsgKChjMSAmIDB4MDNGRikgPDwgMTApICsgKGMyICYgMHgwM0ZGKTtcclxuICAgICAgICAgICAgKytpO1xyXG4gICAgICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gYzEgPj4gMTggICAgICB8IDI0MDtcclxuICAgICAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IGMxID4+IDEyICYgNjMgfCAxMjg7XHJcbiAgICAgICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBjMSA+PiA2ICAmIDYzIHwgMTI4O1xyXG4gICAgICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gYzEgICAgICAgJiA2MyB8IDEyODtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gYzEgPj4gMTIgICAgICB8IDIyNDtcclxuICAgICAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IGMxID4+IDYgICYgNjMgfCAxMjg7XHJcbiAgICAgICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBjMSAgICAgICAmIDYzIHwgMTI4O1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBvZmZzZXQgLSBzdGFydDtcclxufTtcclxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgb2JqZWN0QXNzaWduID0gcmVxdWlyZSgnb2JqZWN0LWFzc2lnbicpO1xuXG4vLyBjb21wYXJlIGFuZCBpc0J1ZmZlciB0YWtlbiBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9mZXJvc3MvYnVmZmVyL2Jsb2IvNjgwZTllNWU0ODhmMjJhYWMyNzU5OWE1N2RjODQ0YTYzMTU5MjhkZC9pbmRleC5qc1xuLy8gb3JpZ2luYWwgbm90aWNlOlxuXG4vKiFcbiAqIFRoZSBidWZmZXIgbW9kdWxlIGZyb20gbm9kZS5qcywgZm9yIHRoZSBicm93c2VyLlxuICpcbiAqIEBhdXRob3IgICBGZXJvc3MgQWJvdWtoYWRpamVoIDxmZXJvc3NAZmVyb3NzLm9yZz4gPGh0dHA6Ly9mZXJvc3Mub3JnPlxuICogQGxpY2Vuc2UgIE1JVFxuICovXG5mdW5jdGlvbiBjb21wYXJlKGEsIGIpIHtcbiAgaWYgKGEgPT09IGIpIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIHZhciB4ID0gYS5sZW5ndGg7XG4gIHZhciB5ID0gYi5sZW5ndGg7XG5cbiAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IE1hdGgubWluKHgsIHkpOyBpIDwgbGVuOyArK2kpIHtcbiAgICBpZiAoYVtpXSAhPT0gYltpXSkge1xuICAgICAgeCA9IGFbaV07XG4gICAgICB5ID0gYltpXTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIGlmICh4IDwgeSkge1xuICAgIHJldHVybiAtMTtcbiAgfVxuICBpZiAoeSA8IHgpIHtcbiAgICByZXR1cm4gMTtcbiAgfVxuICByZXR1cm4gMDtcbn1cbmZ1bmN0aW9uIGlzQnVmZmVyKGIpIHtcbiAgaWYgKGdsb2JhbC5CdWZmZXIgJiYgdHlwZW9mIGdsb2JhbC5CdWZmZXIuaXNCdWZmZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gZ2xvYmFsLkJ1ZmZlci5pc0J1ZmZlcihiKTtcbiAgfVxuICByZXR1cm4gISEoYiAhPSBudWxsICYmIGIuX2lzQnVmZmVyKTtcbn1cblxuLy8gYmFzZWQgb24gbm9kZSBhc3NlcnQsIG9yaWdpbmFsIG5vdGljZTpcbi8vIE5COiBUaGUgVVJMIHRvIHRoZSBDb21tb25KUyBzcGVjIGlzIGtlcHQganVzdCBmb3IgdHJhZGl0aW9uLlxuLy8gICAgIG5vZGUtYXNzZXJ0IGhhcyBldm9sdmVkIGEgbG90IHNpbmNlIHRoZW4sIGJvdGggaW4gQVBJIGFuZCBiZWhhdmlvci5cblxuLy8gaHR0cDovL3dpa2kuY29tbW9uanMub3JnL3dpa2kvVW5pdF9UZXN0aW5nLzEuMFxuLy9cbi8vIFRISVMgSVMgTk9UIFRFU1RFRCBOT1IgTElLRUxZIFRPIFdPUksgT1VUU0lERSBWOCFcbi8vXG4vLyBPcmlnaW5hbGx5IGZyb20gbmFyd2hhbC5qcyAoaHR0cDovL25hcndoYWxqcy5vcmcpXG4vLyBDb3B5cmlnaHQgKGMpIDIwMDkgVGhvbWFzIFJvYmluc29uIDwyODBub3J0aC5jb20+XG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuLy8gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgJ1NvZnR3YXJlJyksIHRvXG4vLyBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZVxuLy8gcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yXG4vLyBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuLy8gZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuLy8gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICdBUyBJUycsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1Jcbi8vIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuLy8gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4vLyBBVVRIT1JTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTlxuLy8gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTlxuLy8gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbnZhciB1dGlsID0gcmVxdWlyZSgndXRpbC8nKTtcbnZhciBoYXNPd24gPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xudmFyIHBTbGljZSA9IEFycmF5LnByb3RvdHlwZS5zbGljZTtcbnZhciBmdW5jdGlvbnNIYXZlTmFtZXMgPSAoZnVuY3Rpb24gKCkge1xuICByZXR1cm4gZnVuY3Rpb24gZm9vKCkge30ubmFtZSA9PT0gJ2Zvbyc7XG59KCkpO1xuZnVuY3Rpb24gcFRvU3RyaW5nIChvYmopIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmopO1xufVxuZnVuY3Rpb24gaXNWaWV3KGFycmJ1Zikge1xuICBpZiAoaXNCdWZmZXIoYXJyYnVmKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAodHlwZW9mIGdsb2JhbC5BcnJheUJ1ZmZlciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAodHlwZW9mIEFycmF5QnVmZmVyLmlzVmlldyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBBcnJheUJ1ZmZlci5pc1ZpZXcoYXJyYnVmKTtcbiAgfVxuICBpZiAoIWFycmJ1Zikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoYXJyYnVmIGluc3RhbmNlb2YgRGF0YVZpZXcpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBpZiAoYXJyYnVmLmJ1ZmZlciAmJiBhcnJidWYuYnVmZmVyIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG4vLyAxLiBUaGUgYXNzZXJ0IG1vZHVsZSBwcm92aWRlcyBmdW5jdGlvbnMgdGhhdCB0aHJvd1xuLy8gQXNzZXJ0aW9uRXJyb3IncyB3aGVuIHBhcnRpY3VsYXIgY29uZGl0aW9ucyBhcmUgbm90IG1ldC4gVGhlXG4vLyBhc3NlcnQgbW9kdWxlIG11c3QgY29uZm9ybSB0byB0aGUgZm9sbG93aW5nIGludGVyZmFjZS5cblxudmFyIGFzc2VydCA9IG1vZHVsZS5leHBvcnRzID0gb2s7XG5cbi8vIDIuIFRoZSBBc3NlcnRpb25FcnJvciBpcyBkZWZpbmVkIGluIGFzc2VydC5cbi8vIG5ldyBhc3NlcnQuQXNzZXJ0aW9uRXJyb3IoeyBtZXNzYWdlOiBtZXNzYWdlLFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdHVhbDogYWN0dWFsLFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkOiBleHBlY3RlZCB9KVxuXG52YXIgcmVnZXggPSAvXFxzKmZ1bmN0aW9uXFxzKyhbXlxcKFxcc10qKVxccyovO1xuLy8gYmFzZWQgb24gaHR0cHM6Ly9naXRodWIuY29tL2xqaGFyYi9mdW5jdGlvbi5wcm90b3R5cGUubmFtZS9ibG9iL2FkZWVlZWM4YmZjYzYwNjhiMTg3ZDdkOWZiM2Q1YmIxZDNhMzA4OTkvaW1wbGVtZW50YXRpb24uanNcbmZ1bmN0aW9uIGdldE5hbWUoZnVuYykge1xuICBpZiAoIXV0aWwuaXNGdW5jdGlvbihmdW5jKSkge1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoZnVuY3Rpb25zSGF2ZU5hbWVzKSB7XG4gICAgcmV0dXJuIGZ1bmMubmFtZTtcbiAgfVxuICB2YXIgc3RyID0gZnVuYy50b1N0cmluZygpO1xuICB2YXIgbWF0Y2ggPSBzdHIubWF0Y2gocmVnZXgpO1xuICByZXR1cm4gbWF0Y2ggJiYgbWF0Y2hbMV07XG59XG5hc3NlcnQuQXNzZXJ0aW9uRXJyb3IgPSBmdW5jdGlvbiBBc3NlcnRpb25FcnJvcihvcHRpb25zKSB7XG4gIHRoaXMubmFtZSA9ICdBc3NlcnRpb25FcnJvcic7XG4gIHRoaXMuYWN0dWFsID0gb3B0aW9ucy5hY3R1YWw7XG4gIHRoaXMuZXhwZWN0ZWQgPSBvcHRpb25zLmV4cGVjdGVkO1xuICB0aGlzLm9wZXJhdG9yID0gb3B0aW9ucy5vcGVyYXRvcjtcbiAgaWYgKG9wdGlvbnMubWVzc2FnZSkge1xuICAgIHRoaXMubWVzc2FnZSA9IG9wdGlvbnMubWVzc2FnZTtcbiAgICB0aGlzLmdlbmVyYXRlZE1lc3NhZ2UgPSBmYWxzZTtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLm1lc3NhZ2UgPSBnZXRNZXNzYWdlKHRoaXMpO1xuICAgIHRoaXMuZ2VuZXJhdGVkTWVzc2FnZSA9IHRydWU7XG4gIH1cbiAgdmFyIHN0YWNrU3RhcnRGdW5jdGlvbiA9IG9wdGlvbnMuc3RhY2tTdGFydEZ1bmN0aW9uIHx8IGZhaWw7XG4gIGlmIChFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSkge1xuICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIHN0YWNrU3RhcnRGdW5jdGlvbik7XG4gIH0gZWxzZSB7XG4gICAgLy8gbm9uIHY4IGJyb3dzZXJzIHNvIHdlIGNhbiBoYXZlIGEgc3RhY2t0cmFjZVxuICAgIHZhciBlcnIgPSBuZXcgRXJyb3IoKTtcbiAgICBpZiAoZXJyLnN0YWNrKSB7XG4gICAgICB2YXIgb3V0ID0gZXJyLnN0YWNrO1xuXG4gICAgICAvLyB0cnkgdG8gc3RyaXAgdXNlbGVzcyBmcmFtZXNcbiAgICAgIHZhciBmbl9uYW1lID0gZ2V0TmFtZShzdGFja1N0YXJ0RnVuY3Rpb24pO1xuICAgICAgdmFyIGlkeCA9IG91dC5pbmRleE9mKCdcXG4nICsgZm5fbmFtZSk7XG4gICAgICBpZiAoaWR4ID49IDApIHtcbiAgICAgICAgLy8gb25jZSB3ZSBoYXZlIGxvY2F0ZWQgdGhlIGZ1bmN0aW9uIGZyYW1lXG4gICAgICAgIC8vIHdlIG5lZWQgdG8gc3RyaXAgb3V0IGV2ZXJ5dGhpbmcgYmVmb3JlIGl0IChhbmQgaXRzIGxpbmUpXG4gICAgICAgIHZhciBuZXh0X2xpbmUgPSBvdXQuaW5kZXhPZignXFxuJywgaWR4ICsgMSk7XG4gICAgICAgIG91dCA9IG91dC5zdWJzdHJpbmcobmV4dF9saW5lICsgMSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuc3RhY2sgPSBvdXQ7XG4gICAgfVxuICB9XG59O1xuXG4vLyBhc3NlcnQuQXNzZXJ0aW9uRXJyb3IgaW5zdGFuY2VvZiBFcnJvclxudXRpbC5pbmhlcml0cyhhc3NlcnQuQXNzZXJ0aW9uRXJyb3IsIEVycm9yKTtcblxuZnVuY3Rpb24gdHJ1bmNhdGUocywgbikge1xuICBpZiAodHlwZW9mIHMgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHMubGVuZ3RoIDwgbiA/IHMgOiBzLnNsaWNlKDAsIG4pO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBzO1xuICB9XG59XG5mdW5jdGlvbiBpbnNwZWN0KHNvbWV0aGluZykge1xuICBpZiAoZnVuY3Rpb25zSGF2ZU5hbWVzIHx8ICF1dGlsLmlzRnVuY3Rpb24oc29tZXRoaW5nKSkge1xuICAgIHJldHVybiB1dGlsLmluc3BlY3Qoc29tZXRoaW5nKTtcbiAgfVxuICB2YXIgcmF3bmFtZSA9IGdldE5hbWUoc29tZXRoaW5nKTtcbiAgdmFyIG5hbWUgPSByYXduYW1lID8gJzogJyArIHJhd25hbWUgOiAnJztcbiAgcmV0dXJuICdbRnVuY3Rpb24nICsgIG5hbWUgKyAnXSc7XG59XG5mdW5jdGlvbiBnZXRNZXNzYWdlKHNlbGYpIHtcbiAgcmV0dXJuIHRydW5jYXRlKGluc3BlY3Qoc2VsZi5hY3R1YWwpLCAxMjgpICsgJyAnICtcbiAgICAgICAgIHNlbGYub3BlcmF0b3IgKyAnICcgK1xuICAgICAgICAgdHJ1bmNhdGUoaW5zcGVjdChzZWxmLmV4cGVjdGVkKSwgMTI4KTtcbn1cblxuLy8gQXQgcHJlc2VudCBvbmx5IHRoZSB0aHJlZSBrZXlzIG1lbnRpb25lZCBhYm92ZSBhcmUgdXNlZCBhbmRcbi8vIHVuZGVyc3Rvb2QgYnkgdGhlIHNwZWMuIEltcGxlbWVudGF0aW9ucyBvciBzdWIgbW9kdWxlcyBjYW4gcGFzc1xuLy8gb3RoZXIga2V5cyB0byB0aGUgQXNzZXJ0aW9uRXJyb3IncyBjb25zdHJ1Y3RvciAtIHRoZXkgd2lsbCBiZVxuLy8gaWdub3JlZC5cblxuLy8gMy4gQWxsIG9mIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIG11c3QgdGhyb3cgYW4gQXNzZXJ0aW9uRXJyb3Jcbi8vIHdoZW4gYSBjb3JyZXNwb25kaW5nIGNvbmRpdGlvbiBpcyBub3QgbWV0LCB3aXRoIGEgbWVzc2FnZSB0aGF0XG4vLyBtYXkgYmUgdW5kZWZpbmVkIGlmIG5vdCBwcm92aWRlZC4gIEFsbCBhc3NlcnRpb24gbWV0aG9kcyBwcm92aWRlXG4vLyBib3RoIHRoZSBhY3R1YWwgYW5kIGV4cGVjdGVkIHZhbHVlcyB0byB0aGUgYXNzZXJ0aW9uIGVycm9yIGZvclxuLy8gZGlzcGxheSBwdXJwb3Nlcy5cblxuZnVuY3Rpb24gZmFpbChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlLCBvcGVyYXRvciwgc3RhY2tTdGFydEZ1bmN0aW9uKSB7XG4gIHRocm93IG5ldyBhc3NlcnQuQXNzZXJ0aW9uRXJyb3Ioe1xuICAgIG1lc3NhZ2U6IG1lc3NhZ2UsXG4gICAgYWN0dWFsOiBhY3R1YWwsXG4gICAgZXhwZWN0ZWQ6IGV4cGVjdGVkLFxuICAgIG9wZXJhdG9yOiBvcGVyYXRvcixcbiAgICBzdGFja1N0YXJ0RnVuY3Rpb246IHN0YWNrU3RhcnRGdW5jdGlvblxuICB9KTtcbn1cblxuLy8gRVhURU5TSU9OISBhbGxvd3MgZm9yIHdlbGwgYmVoYXZlZCBlcnJvcnMgZGVmaW5lZCBlbHNld2hlcmUuXG5hc3NlcnQuZmFpbCA9IGZhaWw7XG5cbi8vIDQuIFB1cmUgYXNzZXJ0aW9uIHRlc3RzIHdoZXRoZXIgYSB2YWx1ZSBpcyB0cnV0aHksIGFzIGRldGVybWluZWRcbi8vIGJ5ICEhZ3VhcmQuXG4vLyBhc3NlcnQub2soZ3VhcmQsIG1lc3NhZ2Vfb3B0KTtcbi8vIFRoaXMgc3RhdGVtZW50IGlzIGVxdWl2YWxlbnQgdG8gYXNzZXJ0LmVxdWFsKHRydWUsICEhZ3VhcmQsXG4vLyBtZXNzYWdlX29wdCk7LiBUbyB0ZXN0IHN0cmljdGx5IGZvciB0aGUgdmFsdWUgdHJ1ZSwgdXNlXG4vLyBhc3NlcnQuc3RyaWN0RXF1YWwodHJ1ZSwgZ3VhcmQsIG1lc3NhZ2Vfb3B0KTsuXG5cbmZ1bmN0aW9uIG9rKHZhbHVlLCBtZXNzYWdlKSB7XG4gIGlmICghdmFsdWUpIGZhaWwodmFsdWUsIHRydWUsIG1lc3NhZ2UsICc9PScsIGFzc2VydC5vayk7XG59XG5hc3NlcnQub2sgPSBvaztcblxuLy8gNS4gVGhlIGVxdWFsaXR5IGFzc2VydGlvbiB0ZXN0cyBzaGFsbG93LCBjb2VyY2l2ZSBlcXVhbGl0eSB3aXRoXG4vLyA9PS5cbi8vIGFzc2VydC5lcXVhbChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlX29wdCk7XG5cbmFzc2VydC5lcXVhbCA9IGZ1bmN0aW9uIGVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UpIHtcbiAgaWYgKGFjdHVhbCAhPSBleHBlY3RlZCkgZmFpbChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlLCAnPT0nLCBhc3NlcnQuZXF1YWwpO1xufTtcblxuLy8gNi4gVGhlIG5vbi1lcXVhbGl0eSBhc3NlcnRpb24gdGVzdHMgZm9yIHdoZXRoZXIgdHdvIG9iamVjdHMgYXJlIG5vdCBlcXVhbFxuLy8gd2l0aCAhPSBhc3NlcnQubm90RXF1YWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZV9vcHQpO1xuXG5hc3NlcnQubm90RXF1YWwgPSBmdW5jdGlvbiBub3RFcXVhbChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlKSB7XG4gIGlmIChhY3R1YWwgPT0gZXhwZWN0ZWQpIHtcbiAgICBmYWlsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UsICchPScsIGFzc2VydC5ub3RFcXVhbCk7XG4gIH1cbn07XG5cbi8vIDcuIFRoZSBlcXVpdmFsZW5jZSBhc3NlcnRpb24gdGVzdHMgYSBkZWVwIGVxdWFsaXR5IHJlbGF0aW9uLlxuLy8gYXNzZXJ0LmRlZXBFcXVhbChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlX29wdCk7XG5cbmFzc2VydC5kZWVwRXF1YWwgPSBmdW5jdGlvbiBkZWVwRXF1YWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSkge1xuICBpZiAoIV9kZWVwRXF1YWwoYWN0dWFsLCBleHBlY3RlZCwgZmFsc2UpKSB7XG4gICAgZmFpbChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlLCAnZGVlcEVxdWFsJywgYXNzZXJ0LmRlZXBFcXVhbCk7XG4gIH1cbn07XG5cbmFzc2VydC5kZWVwU3RyaWN0RXF1YWwgPSBmdW5jdGlvbiBkZWVwU3RyaWN0RXF1YWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSkge1xuICBpZiAoIV9kZWVwRXF1YWwoYWN0dWFsLCBleHBlY3RlZCwgdHJ1ZSkpIHtcbiAgICBmYWlsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UsICdkZWVwU3RyaWN0RXF1YWwnLCBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKTtcbiAgfVxufTtcblxuZnVuY3Rpb24gX2RlZXBFcXVhbChhY3R1YWwsIGV4cGVjdGVkLCBzdHJpY3QsIG1lbW9zKSB7XG4gIC8vIDcuMS4gQWxsIGlkZW50aWNhbCB2YWx1ZXMgYXJlIGVxdWl2YWxlbnQsIGFzIGRldGVybWluZWQgYnkgPT09LlxuICBpZiAoYWN0dWFsID09PSBleHBlY3RlZCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9IGVsc2UgaWYgKGlzQnVmZmVyKGFjdHVhbCkgJiYgaXNCdWZmZXIoZXhwZWN0ZWQpKSB7XG4gICAgcmV0dXJuIGNvbXBhcmUoYWN0dWFsLCBleHBlY3RlZCkgPT09IDA7XG5cbiAgLy8gNy4yLiBJZiB0aGUgZXhwZWN0ZWQgdmFsdWUgaXMgYSBEYXRlIG9iamVjdCwgdGhlIGFjdHVhbCB2YWx1ZSBpc1xuICAvLyBlcXVpdmFsZW50IGlmIGl0IGlzIGFsc28gYSBEYXRlIG9iamVjdCB0aGF0IHJlZmVycyB0byB0aGUgc2FtZSB0aW1lLlxuICB9IGVsc2UgaWYgKHV0aWwuaXNEYXRlKGFjdHVhbCkgJiYgdXRpbC5pc0RhdGUoZXhwZWN0ZWQpKSB7XG4gICAgcmV0dXJuIGFjdHVhbC5nZXRUaW1lKCkgPT09IGV4cGVjdGVkLmdldFRpbWUoKTtcblxuICAvLyA3LjMgSWYgdGhlIGV4cGVjdGVkIHZhbHVlIGlzIGEgUmVnRXhwIG9iamVjdCwgdGhlIGFjdHVhbCB2YWx1ZSBpc1xuICAvLyBlcXVpdmFsZW50IGlmIGl0IGlzIGFsc28gYSBSZWdFeHAgb2JqZWN0IHdpdGggdGhlIHNhbWUgc291cmNlIGFuZFxuICAvLyBwcm9wZXJ0aWVzIChgZ2xvYmFsYCwgYG11bHRpbGluZWAsIGBsYXN0SW5kZXhgLCBgaWdub3JlQ2FzZWApLlxuICB9IGVsc2UgaWYgKHV0aWwuaXNSZWdFeHAoYWN0dWFsKSAmJiB1dGlsLmlzUmVnRXhwKGV4cGVjdGVkKSkge1xuICAgIHJldHVybiBhY3R1YWwuc291cmNlID09PSBleHBlY3RlZC5zb3VyY2UgJiZcbiAgICAgICAgICAgYWN0dWFsLmdsb2JhbCA9PT0gZXhwZWN0ZWQuZ2xvYmFsICYmXG4gICAgICAgICAgIGFjdHVhbC5tdWx0aWxpbmUgPT09IGV4cGVjdGVkLm11bHRpbGluZSAmJlxuICAgICAgICAgICBhY3R1YWwubGFzdEluZGV4ID09PSBleHBlY3RlZC5sYXN0SW5kZXggJiZcbiAgICAgICAgICAgYWN0dWFsLmlnbm9yZUNhc2UgPT09IGV4cGVjdGVkLmlnbm9yZUNhc2U7XG5cbiAgLy8gNy40LiBPdGhlciBwYWlycyB0aGF0IGRvIG5vdCBib3RoIHBhc3MgdHlwZW9mIHZhbHVlID09ICdvYmplY3QnLFxuICAvLyBlcXVpdmFsZW5jZSBpcyBkZXRlcm1pbmVkIGJ5ID09LlxuICB9IGVsc2UgaWYgKChhY3R1YWwgPT09IG51bGwgfHwgdHlwZW9mIGFjdHVhbCAhPT0gJ29iamVjdCcpICYmXG4gICAgICAgICAgICAgKGV4cGVjdGVkID09PSBudWxsIHx8IHR5cGVvZiBleHBlY3RlZCAhPT0gJ29iamVjdCcpKSB7XG4gICAgcmV0dXJuIHN0cmljdCA/IGFjdHVhbCA9PT0gZXhwZWN0ZWQgOiBhY3R1YWwgPT0gZXhwZWN0ZWQ7XG5cbiAgLy8gSWYgYm90aCB2YWx1ZXMgYXJlIGluc3RhbmNlcyBvZiB0eXBlZCBhcnJheXMsIHdyYXAgdGhlaXIgdW5kZXJseWluZ1xuICAvLyBBcnJheUJ1ZmZlcnMgaW4gYSBCdWZmZXIgZWFjaCB0byBpbmNyZWFzZSBwZXJmb3JtYW5jZVxuICAvLyBUaGlzIG9wdGltaXphdGlvbiByZXF1aXJlcyB0aGUgYXJyYXlzIHRvIGhhdmUgdGhlIHNhbWUgdHlwZSBhcyBjaGVja2VkIGJ5XG4gIC8vIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcgKGFrYSBwVG9TdHJpbmcpLiBOZXZlciBwZXJmb3JtIGJpbmFyeVxuICAvLyBjb21wYXJpc29ucyBmb3IgRmxvYXQqQXJyYXlzLCB0aG91Z2gsIHNpbmNlIGUuZy4gKzAgPT09IC0wIGJ1dCB0aGVpclxuICAvLyBiaXQgcGF0dGVybnMgYXJlIG5vdCBpZGVudGljYWwuXG4gIH0gZWxzZSBpZiAoaXNWaWV3KGFjdHVhbCkgJiYgaXNWaWV3KGV4cGVjdGVkKSAmJlxuICAgICAgICAgICAgIHBUb1N0cmluZyhhY3R1YWwpID09PSBwVG9TdHJpbmcoZXhwZWN0ZWQpICYmXG4gICAgICAgICAgICAgIShhY3R1YWwgaW5zdGFuY2VvZiBGbG9hdDMyQXJyYXkgfHxcbiAgICAgICAgICAgICAgIGFjdHVhbCBpbnN0YW5jZW9mIEZsb2F0NjRBcnJheSkpIHtcbiAgICByZXR1cm4gY29tcGFyZShuZXcgVWludDhBcnJheShhY3R1YWwuYnVmZmVyKSxcbiAgICAgICAgICAgICAgICAgICBuZXcgVWludDhBcnJheShleHBlY3RlZC5idWZmZXIpKSA9PT0gMDtcblxuICAvLyA3LjUgRm9yIGFsbCBvdGhlciBPYmplY3QgcGFpcnMsIGluY2x1ZGluZyBBcnJheSBvYmplY3RzLCBlcXVpdmFsZW5jZSBpc1xuICAvLyBkZXRlcm1pbmVkIGJ5IGhhdmluZyB0aGUgc2FtZSBudW1iZXIgb2Ygb3duZWQgcHJvcGVydGllcyAoYXMgdmVyaWZpZWRcbiAgLy8gd2l0aCBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwpLCB0aGUgc2FtZSBzZXQgb2Yga2V5c1xuICAvLyAoYWx0aG91Z2ggbm90IG5lY2Vzc2FyaWx5IHRoZSBzYW1lIG9yZGVyKSwgZXF1aXZhbGVudCB2YWx1ZXMgZm9yIGV2ZXJ5XG4gIC8vIGNvcnJlc3BvbmRpbmcga2V5LCBhbmQgYW4gaWRlbnRpY2FsICdwcm90b3R5cGUnIHByb3BlcnR5LiBOb3RlOiB0aGlzXG4gIC8vIGFjY291bnRzIGZvciBib3RoIG5hbWVkIGFuZCBpbmRleGVkIHByb3BlcnRpZXMgb24gQXJyYXlzLlxuICB9IGVsc2UgaWYgKGlzQnVmZmVyKGFjdHVhbCkgIT09IGlzQnVmZmVyKGV4cGVjdGVkKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSBlbHNlIHtcbiAgICBtZW1vcyA9IG1lbW9zIHx8IHthY3R1YWw6IFtdLCBleHBlY3RlZDogW119O1xuXG4gICAgdmFyIGFjdHVhbEluZGV4ID0gbWVtb3MuYWN0dWFsLmluZGV4T2YoYWN0dWFsKTtcbiAgICBpZiAoYWN0dWFsSW5kZXggIT09IC0xKSB7XG4gICAgICBpZiAoYWN0dWFsSW5kZXggPT09IG1lbW9zLmV4cGVjdGVkLmluZGV4T2YoZXhwZWN0ZWQpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIG1lbW9zLmFjdHVhbC5wdXNoKGFjdHVhbCk7XG4gICAgbWVtb3MuZXhwZWN0ZWQucHVzaChleHBlY3RlZCk7XG5cbiAgICByZXR1cm4gb2JqRXF1aXYoYWN0dWFsLCBleHBlY3RlZCwgc3RyaWN0LCBtZW1vcyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNBcmd1bWVudHMob2JqZWN0KSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqZWN0KSA9PSAnW29iamVjdCBBcmd1bWVudHNdJztcbn1cblxuZnVuY3Rpb24gb2JqRXF1aXYoYSwgYiwgc3RyaWN0LCBhY3R1YWxWaXNpdGVkT2JqZWN0cykge1xuICBpZiAoYSA9PT0gbnVsbCB8fCBhID09PSB1bmRlZmluZWQgfHwgYiA9PT0gbnVsbCB8fCBiID09PSB1bmRlZmluZWQpXG4gICAgcmV0dXJuIGZhbHNlO1xuICAvLyBpZiBvbmUgaXMgYSBwcmltaXRpdmUsIHRoZSBvdGhlciBtdXN0IGJlIHNhbWVcbiAgaWYgKHV0aWwuaXNQcmltaXRpdmUoYSkgfHwgdXRpbC5pc1ByaW1pdGl2ZShiKSlcbiAgICByZXR1cm4gYSA9PT0gYjtcbiAgaWYgKHN0cmljdCAmJiBPYmplY3QuZ2V0UHJvdG90eXBlT2YoYSkgIT09IE9iamVjdC5nZXRQcm90b3R5cGVPZihiKSlcbiAgICByZXR1cm4gZmFsc2U7XG4gIHZhciBhSXNBcmdzID0gaXNBcmd1bWVudHMoYSk7XG4gIHZhciBiSXNBcmdzID0gaXNBcmd1bWVudHMoYik7XG4gIGlmICgoYUlzQXJncyAmJiAhYklzQXJncykgfHwgKCFhSXNBcmdzICYmIGJJc0FyZ3MpKVxuICAgIHJldHVybiBmYWxzZTtcbiAgaWYgKGFJc0FyZ3MpIHtcbiAgICBhID0gcFNsaWNlLmNhbGwoYSk7XG4gICAgYiA9IHBTbGljZS5jYWxsKGIpO1xuICAgIHJldHVybiBfZGVlcEVxdWFsKGEsIGIsIHN0cmljdCk7XG4gIH1cbiAgdmFyIGthID0gb2JqZWN0S2V5cyhhKTtcbiAgdmFyIGtiID0gb2JqZWN0S2V5cyhiKTtcbiAgdmFyIGtleSwgaTtcbiAgLy8gaGF2aW5nIHRoZSBzYW1lIG51bWJlciBvZiBvd25lZCBwcm9wZXJ0aWVzIChrZXlzIGluY29ycG9yYXRlc1xuICAvLyBoYXNPd25Qcm9wZXJ0eSlcbiAgaWYgKGthLmxlbmd0aCAhPT0ga2IubGVuZ3RoKVxuICAgIHJldHVybiBmYWxzZTtcbiAgLy90aGUgc2FtZSBzZXQgb2Yga2V5cyAoYWx0aG91Z2ggbm90IG5lY2Vzc2FyaWx5IHRoZSBzYW1lIG9yZGVyKSxcbiAga2Euc29ydCgpO1xuICBrYi5zb3J0KCk7XG4gIC8vfn5+Y2hlYXAga2V5IHRlc3RcbiAgZm9yIChpID0ga2EubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICBpZiAoa2FbaV0gIT09IGtiW2ldKVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIC8vZXF1aXZhbGVudCB2YWx1ZXMgZm9yIGV2ZXJ5IGNvcnJlc3BvbmRpbmcga2V5LCBhbmRcbiAgLy9+fn5wb3NzaWJseSBleHBlbnNpdmUgZGVlcCB0ZXN0XG4gIGZvciAoaSA9IGthLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAga2V5ID0ga2FbaV07XG4gICAgaWYgKCFfZGVlcEVxdWFsKGFba2V5XSwgYltrZXldLCBzdHJpY3QsIGFjdHVhbFZpc2l0ZWRPYmplY3RzKSlcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLy8gOC4gVGhlIG5vbi1lcXVpdmFsZW5jZSBhc3NlcnRpb24gdGVzdHMgZm9yIGFueSBkZWVwIGluZXF1YWxpdHkuXG4vLyBhc3NlcnQubm90RGVlcEVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2Vfb3B0KTtcblxuYXNzZXJ0Lm5vdERlZXBFcXVhbCA9IGZ1bmN0aW9uIG5vdERlZXBFcXVhbChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlKSB7XG4gIGlmIChfZGVlcEVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQsIGZhbHNlKSkge1xuICAgIGZhaWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSwgJ25vdERlZXBFcXVhbCcsIGFzc2VydC5ub3REZWVwRXF1YWwpO1xuICB9XG59O1xuXG5hc3NlcnQubm90RGVlcFN0cmljdEVxdWFsID0gbm90RGVlcFN0cmljdEVxdWFsO1xuZnVuY3Rpb24gbm90RGVlcFN0cmljdEVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UpIHtcbiAgaWYgKF9kZWVwRXF1YWwoYWN0dWFsLCBleHBlY3RlZCwgdHJ1ZSkpIHtcbiAgICBmYWlsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UsICdub3REZWVwU3RyaWN0RXF1YWwnLCBub3REZWVwU3RyaWN0RXF1YWwpO1xuICB9XG59XG5cblxuLy8gOS4gVGhlIHN0cmljdCBlcXVhbGl0eSBhc3NlcnRpb24gdGVzdHMgc3RyaWN0IGVxdWFsaXR5LCBhcyBkZXRlcm1pbmVkIGJ5ID09PS5cbi8vIGFzc2VydC5zdHJpY3RFcXVhbChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlX29wdCk7XG5cbmFzc2VydC5zdHJpY3RFcXVhbCA9IGZ1bmN0aW9uIHN0cmljdEVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UpIHtcbiAgaWYgKGFjdHVhbCAhPT0gZXhwZWN0ZWQpIHtcbiAgICBmYWlsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UsICc9PT0nLCBhc3NlcnQuc3RyaWN0RXF1YWwpO1xuICB9XG59O1xuXG4vLyAxMC4gVGhlIHN0cmljdCBub24tZXF1YWxpdHkgYXNzZXJ0aW9uIHRlc3RzIGZvciBzdHJpY3QgaW5lcXVhbGl0eSwgYXNcbi8vIGRldGVybWluZWQgYnkgIT09LiAgYXNzZXJ0Lm5vdFN0cmljdEVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2Vfb3B0KTtcblxuYXNzZXJ0Lm5vdFN0cmljdEVxdWFsID0gZnVuY3Rpb24gbm90U3RyaWN0RXF1YWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSkge1xuICBpZiAoYWN0dWFsID09PSBleHBlY3RlZCkge1xuICAgIGZhaWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSwgJyE9PScsIGFzc2VydC5ub3RTdHJpY3RFcXVhbCk7XG4gIH1cbn07XG5cbmZ1bmN0aW9uIGV4cGVjdGVkRXhjZXB0aW9uKGFjdHVhbCwgZXhwZWN0ZWQpIHtcbiAgaWYgKCFhY3R1YWwgfHwgIWV4cGVjdGVkKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChleHBlY3RlZCkgPT0gJ1tvYmplY3QgUmVnRXhwXScpIHtcbiAgICByZXR1cm4gZXhwZWN0ZWQudGVzdChhY3R1YWwpO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBpZiAoYWN0dWFsIGluc3RhbmNlb2YgZXhwZWN0ZWQpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIC8vIElnbm9yZS4gIFRoZSBpbnN0YW5jZW9mIGNoZWNrIGRvZXNuJ3Qgd29yayBmb3IgYXJyb3cgZnVuY3Rpb25zLlxuICB9XG5cbiAgaWYgKEVycm9yLmlzUHJvdG90eXBlT2YoZXhwZWN0ZWQpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIGV4cGVjdGVkLmNhbGwoe30sIGFjdHVhbCkgPT09IHRydWU7XG59XG5cbmZ1bmN0aW9uIF90cnlCbG9jayhibG9jaykge1xuICB2YXIgZXJyb3I7XG4gIHRyeSB7XG4gICAgYmxvY2soKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGVycm9yID0gZTtcbiAgfVxuICByZXR1cm4gZXJyb3I7XG59XG5cbmZ1bmN0aW9uIF90aHJvd3Moc2hvdWxkVGhyb3csIGJsb2NrLCBleHBlY3RlZCwgbWVzc2FnZSkge1xuICB2YXIgYWN0dWFsO1xuXG4gIGlmICh0eXBlb2YgYmxvY2sgIT09ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcImJsb2NrXCIgYXJndW1lbnQgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XG4gIH1cblxuICBpZiAodHlwZW9mIGV4cGVjdGVkID09PSAnc3RyaW5nJykge1xuICAgIG1lc3NhZ2UgPSBleHBlY3RlZDtcbiAgICBleHBlY3RlZCA9IG51bGw7XG4gIH1cblxuICBhY3R1YWwgPSBfdHJ5QmxvY2soYmxvY2spO1xuXG4gIG1lc3NhZ2UgPSAoZXhwZWN0ZWQgJiYgZXhwZWN0ZWQubmFtZSA/ICcgKCcgKyBleHBlY3RlZC5uYW1lICsgJykuJyA6ICcuJykgK1xuICAgICAgICAgICAgKG1lc3NhZ2UgPyAnICcgKyBtZXNzYWdlIDogJy4nKTtcblxuICBpZiAoc2hvdWxkVGhyb3cgJiYgIWFjdHVhbCkge1xuICAgIGZhaWwoYWN0dWFsLCBleHBlY3RlZCwgJ01pc3NpbmcgZXhwZWN0ZWQgZXhjZXB0aW9uJyArIG1lc3NhZ2UpO1xuICB9XG5cbiAgdmFyIHVzZXJQcm92aWRlZE1lc3NhZ2UgPSB0eXBlb2YgbWVzc2FnZSA9PT0gJ3N0cmluZyc7XG4gIHZhciBpc1Vud2FudGVkRXhjZXB0aW9uID0gIXNob3VsZFRocm93ICYmIHV0aWwuaXNFcnJvcihhY3R1YWwpO1xuICB2YXIgaXNVbmV4cGVjdGVkRXhjZXB0aW9uID0gIXNob3VsZFRocm93ICYmIGFjdHVhbCAmJiAhZXhwZWN0ZWQ7XG5cbiAgaWYgKChpc1Vud2FudGVkRXhjZXB0aW9uICYmXG4gICAgICB1c2VyUHJvdmlkZWRNZXNzYWdlICYmXG4gICAgICBleHBlY3RlZEV4Y2VwdGlvbihhY3R1YWwsIGV4cGVjdGVkKSkgfHxcbiAgICAgIGlzVW5leHBlY3RlZEV4Y2VwdGlvbikge1xuICAgIGZhaWwoYWN0dWFsLCBleHBlY3RlZCwgJ0dvdCB1bndhbnRlZCBleGNlcHRpb24nICsgbWVzc2FnZSk7XG4gIH1cblxuICBpZiAoKHNob3VsZFRocm93ICYmIGFjdHVhbCAmJiBleHBlY3RlZCAmJlxuICAgICAgIWV4cGVjdGVkRXhjZXB0aW9uKGFjdHVhbCwgZXhwZWN0ZWQpKSB8fCAoIXNob3VsZFRocm93ICYmIGFjdHVhbCkpIHtcbiAgICB0aHJvdyBhY3R1YWw7XG4gIH1cbn1cblxuLy8gMTEuIEV4cGVjdGVkIHRvIHRocm93IGFuIGVycm9yOlxuLy8gYXNzZXJ0LnRocm93cyhibG9jaywgRXJyb3Jfb3B0LCBtZXNzYWdlX29wdCk7XG5cbmFzc2VydC50aHJvd3MgPSBmdW5jdGlvbihibG9jaywgLypvcHRpb25hbCovZXJyb3IsIC8qb3B0aW9uYWwqL21lc3NhZ2UpIHtcbiAgX3Rocm93cyh0cnVlLCBibG9jaywgZXJyb3IsIG1lc3NhZ2UpO1xufTtcblxuLy8gRVhURU5TSU9OISBUaGlzIGlzIGFubm95aW5nIHRvIHdyaXRlIG91dHNpZGUgdGhpcyBtb2R1bGUuXG5hc3NlcnQuZG9lc05vdFRocm93ID0gZnVuY3Rpb24oYmxvY2ssIC8qb3B0aW9uYWwqL2Vycm9yLCAvKm9wdGlvbmFsKi9tZXNzYWdlKSB7XG4gIF90aHJvd3MoZmFsc2UsIGJsb2NrLCBlcnJvciwgbWVzc2FnZSk7XG59O1xuXG5hc3NlcnQuaWZFcnJvciA9IGZ1bmN0aW9uKGVycikgeyBpZiAoZXJyKSB0aHJvdyBlcnI7IH07XG5cbi8vIEV4cG9zZSBhIHN0cmljdCBvbmx5IHZhcmlhbnQgb2YgYXNzZXJ0XG5mdW5jdGlvbiBzdHJpY3QodmFsdWUsIG1lc3NhZ2UpIHtcbiAgaWYgKCF2YWx1ZSkgZmFpbCh2YWx1ZSwgdHJ1ZSwgbWVzc2FnZSwgJz09Jywgc3RyaWN0KTtcbn1cbmFzc2VydC5zdHJpY3QgPSBvYmplY3RBc3NpZ24oc3RyaWN0LCBhc3NlcnQsIHtcbiAgZXF1YWw6IGFzc2VydC5zdHJpY3RFcXVhbCxcbiAgZGVlcEVxdWFsOiBhc3NlcnQuZGVlcFN0cmljdEVxdWFsLFxuICBub3RFcXVhbDogYXNzZXJ0Lm5vdFN0cmljdEVxdWFsLFxuICBub3REZWVwRXF1YWw6IGFzc2VydC5ub3REZWVwU3RyaWN0RXF1YWxcbn0pO1xuYXNzZXJ0LnN0cmljdC5zdHJpY3QgPSBhc3NlcnQuc3RyaWN0O1xuXG52YXIgb2JqZWN0S2V5cyA9IE9iamVjdC5rZXlzIHx8IGZ1bmN0aW9uIChvYmopIHtcbiAgdmFyIGtleXMgPSBbXTtcbiAgZm9yICh2YXIga2V5IGluIG9iaikge1xuICAgIGlmIChoYXNPd24uY2FsbChvYmosIGtleSkpIGtleXMucHVzaChrZXkpO1xuICB9XG4gIHJldHVybiBrZXlzO1xufTtcbiIsImlmICh0eXBlb2YgT2JqZWN0LmNyZWF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAvLyBpbXBsZW1lbnRhdGlvbiBmcm9tIHN0YW5kYXJkIG5vZGUuanMgJ3V0aWwnIG1vZHVsZVxuICBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGluaGVyaXRzKGN0b3IsIHN1cGVyQ3Rvcikge1xuICAgIGN0b3Iuc3VwZXJfID0gc3VwZXJDdG9yXG4gICAgY3Rvci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ3Rvci5wcm90b3R5cGUsIHtcbiAgICAgIGNvbnN0cnVjdG9yOiB7XG4gICAgICAgIHZhbHVlOiBjdG9yLFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgfVxuICAgIH0pO1xuICB9O1xufSBlbHNlIHtcbiAgLy8gb2xkIHNjaG9vbCBzaGltIGZvciBvbGQgYnJvd3NlcnNcbiAgbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpbmhlcml0cyhjdG9yLCBzdXBlckN0b3IpIHtcbiAgICBjdG9yLnN1cGVyXyA9IHN1cGVyQ3RvclxuICAgIHZhciBUZW1wQ3RvciA9IGZ1bmN0aW9uICgpIHt9XG4gICAgVGVtcEN0b3IucHJvdG90eXBlID0gc3VwZXJDdG9yLnByb3RvdHlwZVxuICAgIGN0b3IucHJvdG90eXBlID0gbmV3IFRlbXBDdG9yKClcbiAgICBjdG9yLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IGN0b3JcbiAgfVxufVxuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpc0J1ZmZlcihhcmcpIHtcbiAgcmV0dXJuIGFyZyAmJiB0eXBlb2YgYXJnID09PSAnb2JqZWN0J1xuICAgICYmIHR5cGVvZiBhcmcuY29weSA9PT0gJ2Z1bmN0aW9uJ1xuICAgICYmIHR5cGVvZiBhcmcuZmlsbCA9PT0gJ2Z1bmN0aW9uJ1xuICAgICYmIHR5cGVvZiBhcmcucmVhZFVJbnQ4ID09PSAnZnVuY3Rpb24nO1xufSIsIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG52YXIgZm9ybWF0UmVnRXhwID0gLyVbc2RqJV0vZztcbmV4cG9ydHMuZm9ybWF0ID0gZnVuY3Rpb24oZikge1xuICBpZiAoIWlzU3RyaW5nKGYpKSB7XG4gICAgdmFyIG9iamVjdHMgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgb2JqZWN0cy5wdXNoKGluc3BlY3QoYXJndW1lbnRzW2ldKSk7XG4gICAgfVxuICAgIHJldHVybiBvYmplY3RzLmpvaW4oJyAnKTtcbiAgfVxuXG4gIHZhciBpID0gMTtcbiAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7XG4gIHZhciBsZW4gPSBhcmdzLmxlbmd0aDtcbiAgdmFyIHN0ciA9IFN0cmluZyhmKS5yZXBsYWNlKGZvcm1hdFJlZ0V4cCwgZnVuY3Rpb24oeCkge1xuICAgIGlmICh4ID09PSAnJSUnKSByZXR1cm4gJyUnO1xuICAgIGlmIChpID49IGxlbikgcmV0dXJuIHg7XG4gICAgc3dpdGNoICh4KSB7XG4gICAgICBjYXNlICclcyc6IHJldHVybiBTdHJpbmcoYXJnc1tpKytdKTtcbiAgICAgIGNhc2UgJyVkJzogcmV0dXJuIE51bWJlcihhcmdzW2krK10pO1xuICAgICAgY2FzZSAnJWonOlxuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShhcmdzW2krK10pO1xuICAgICAgICB9IGNhdGNoIChfKSB7XG4gICAgICAgICAgcmV0dXJuICdbQ2lyY3VsYXJdJztcbiAgICAgICAgfVxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHg7XG4gICAgfVxuICB9KTtcbiAgZm9yICh2YXIgeCA9IGFyZ3NbaV07IGkgPCBsZW47IHggPSBhcmdzWysraV0pIHtcbiAgICBpZiAoaXNOdWxsKHgpIHx8ICFpc09iamVjdCh4KSkge1xuICAgICAgc3RyICs9ICcgJyArIHg7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0ciArPSAnICcgKyBpbnNwZWN0KHgpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gc3RyO1xufTtcblxuXG4vLyBNYXJrIHRoYXQgYSBtZXRob2Qgc2hvdWxkIG5vdCBiZSB1c2VkLlxuLy8gUmV0dXJucyBhIG1vZGlmaWVkIGZ1bmN0aW9uIHdoaWNoIHdhcm5zIG9uY2UgYnkgZGVmYXVsdC5cbi8vIElmIC0tbm8tZGVwcmVjYXRpb24gaXMgc2V0LCB0aGVuIGl0IGlzIGEgbm8tb3AuXG5leHBvcnRzLmRlcHJlY2F0ZSA9IGZ1bmN0aW9uKGZuLCBtc2cpIHtcbiAgLy8gQWxsb3cgZm9yIGRlcHJlY2F0aW5nIHRoaW5ncyBpbiB0aGUgcHJvY2VzcyBvZiBzdGFydGluZyB1cC5cbiAgaWYgKGlzVW5kZWZpbmVkKGdsb2JhbC5wcm9jZXNzKSkge1xuICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBleHBvcnRzLmRlcHJlY2F0ZShmbiwgbXNnKS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH07XG4gIH1cblxuICBpZiAocHJvY2Vzcy5ub0RlcHJlY2F0aW9uID09PSB0cnVlKSB7XG4gICAgcmV0dXJuIGZuO1xuICB9XG5cbiAgdmFyIHdhcm5lZCA9IGZhbHNlO1xuICBmdW5jdGlvbiBkZXByZWNhdGVkKCkge1xuICAgIGlmICghd2FybmVkKSB7XG4gICAgICBpZiAocHJvY2Vzcy50aHJvd0RlcHJlY2F0aW9uKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihtc2cpO1xuICAgICAgfSBlbHNlIGlmIChwcm9jZXNzLnRyYWNlRGVwcmVjYXRpb24pIHtcbiAgICAgICAgY29uc29sZS50cmFjZShtc2cpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihtc2cpO1xuICAgICAgfVxuICAgICAgd2FybmVkID0gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH1cblxuICByZXR1cm4gZGVwcmVjYXRlZDtcbn07XG5cblxudmFyIGRlYnVncyA9IHt9O1xudmFyIGRlYnVnRW52aXJvbjtcbmV4cG9ydHMuZGVidWdsb2cgPSBmdW5jdGlvbihzZXQpIHtcbiAgaWYgKGlzVW5kZWZpbmVkKGRlYnVnRW52aXJvbikpXG4gICAgZGVidWdFbnZpcm9uID0gcHJvY2Vzcy5lbnYuTk9ERV9ERUJVRyB8fCAnJztcbiAgc2V0ID0gc2V0LnRvVXBwZXJDYXNlKCk7XG4gIGlmICghZGVidWdzW3NldF0pIHtcbiAgICBpZiAobmV3IFJlZ0V4cCgnXFxcXGInICsgc2V0ICsgJ1xcXFxiJywgJ2knKS50ZXN0KGRlYnVnRW52aXJvbikpIHtcbiAgICAgIHZhciBwaWQgPSBwcm9jZXNzLnBpZDtcbiAgICAgIGRlYnVnc1tzZXRdID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBtc2cgPSBleHBvcnRzLmZvcm1hdC5hcHBseShleHBvcnRzLCBhcmd1bWVudHMpO1xuICAgICAgICBjb25zb2xlLmVycm9yKCclcyAlZDogJXMnLCBzZXQsIHBpZCwgbXNnKTtcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlYnVnc1tzZXRdID0gZnVuY3Rpb24oKSB7fTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGRlYnVnc1tzZXRdO1xufTtcblxuXG4vKipcbiAqIEVjaG9zIHRoZSB2YWx1ZSBvZiBhIHZhbHVlLiBUcnlzIHRvIHByaW50IHRoZSB2YWx1ZSBvdXRcbiAqIGluIHRoZSBiZXN0IHdheSBwb3NzaWJsZSBnaXZlbiB0aGUgZGlmZmVyZW50IHR5cGVzLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmogVGhlIG9iamVjdCB0byBwcmludCBvdXQuXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0cyBPcHRpb25hbCBvcHRpb25zIG9iamVjdCB0aGF0IGFsdGVycyB0aGUgb3V0cHV0LlxuICovXG4vKiBsZWdhY3k6IG9iaiwgc2hvd0hpZGRlbiwgZGVwdGgsIGNvbG9ycyovXG5mdW5jdGlvbiBpbnNwZWN0KG9iaiwgb3B0cykge1xuICAvLyBkZWZhdWx0IG9wdGlvbnNcbiAgdmFyIGN0eCA9IHtcbiAgICBzZWVuOiBbXSxcbiAgICBzdHlsaXplOiBzdHlsaXplTm9Db2xvclxuICB9O1xuICAvLyBsZWdhY3kuLi5cbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPj0gMykgY3R4LmRlcHRoID0gYXJndW1lbnRzWzJdO1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+PSA0KSBjdHguY29sb3JzID0gYXJndW1lbnRzWzNdO1xuICBpZiAoaXNCb29sZWFuKG9wdHMpKSB7XG4gICAgLy8gbGVnYWN5Li4uXG4gICAgY3R4LnNob3dIaWRkZW4gPSBvcHRzO1xuICB9IGVsc2UgaWYgKG9wdHMpIHtcbiAgICAvLyBnb3QgYW4gXCJvcHRpb25zXCIgb2JqZWN0XG4gICAgZXhwb3J0cy5fZXh0ZW5kKGN0eCwgb3B0cyk7XG4gIH1cbiAgLy8gc2V0IGRlZmF1bHQgb3B0aW9uc1xuICBpZiAoaXNVbmRlZmluZWQoY3R4LnNob3dIaWRkZW4pKSBjdHguc2hvd0hpZGRlbiA9IGZhbHNlO1xuICBpZiAoaXNVbmRlZmluZWQoY3R4LmRlcHRoKSkgY3R4LmRlcHRoID0gMjtcbiAgaWYgKGlzVW5kZWZpbmVkKGN0eC5jb2xvcnMpKSBjdHguY29sb3JzID0gZmFsc2U7XG4gIGlmIChpc1VuZGVmaW5lZChjdHguY3VzdG9tSW5zcGVjdCkpIGN0eC5jdXN0b21JbnNwZWN0ID0gdHJ1ZTtcbiAgaWYgKGN0eC5jb2xvcnMpIGN0eC5zdHlsaXplID0gc3R5bGl6ZVdpdGhDb2xvcjtcbiAgcmV0dXJuIGZvcm1hdFZhbHVlKGN0eCwgb2JqLCBjdHguZGVwdGgpO1xufVxuZXhwb3J0cy5pbnNwZWN0ID0gaW5zcGVjdDtcblxuXG4vLyBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0FOU0lfZXNjYXBlX2NvZGUjZ3JhcGhpY3Ncbmluc3BlY3QuY29sb3JzID0ge1xuICAnYm9sZCcgOiBbMSwgMjJdLFxuICAnaXRhbGljJyA6IFszLCAyM10sXG4gICd1bmRlcmxpbmUnIDogWzQsIDI0XSxcbiAgJ2ludmVyc2UnIDogWzcsIDI3XSxcbiAgJ3doaXRlJyA6IFszNywgMzldLFxuICAnZ3JleScgOiBbOTAsIDM5XSxcbiAgJ2JsYWNrJyA6IFszMCwgMzldLFxuICAnYmx1ZScgOiBbMzQsIDM5XSxcbiAgJ2N5YW4nIDogWzM2LCAzOV0sXG4gICdncmVlbicgOiBbMzIsIDM5XSxcbiAgJ21hZ2VudGEnIDogWzM1LCAzOV0sXG4gICdyZWQnIDogWzMxLCAzOV0sXG4gICd5ZWxsb3cnIDogWzMzLCAzOV1cbn07XG5cbi8vIERvbid0IHVzZSAnYmx1ZScgbm90IHZpc2libGUgb24gY21kLmV4ZVxuaW5zcGVjdC5zdHlsZXMgPSB7XG4gICdzcGVjaWFsJzogJ2N5YW4nLFxuICAnbnVtYmVyJzogJ3llbGxvdycsXG4gICdib29sZWFuJzogJ3llbGxvdycsXG4gICd1bmRlZmluZWQnOiAnZ3JleScsXG4gICdudWxsJzogJ2JvbGQnLFxuICAnc3RyaW5nJzogJ2dyZWVuJyxcbiAgJ2RhdGUnOiAnbWFnZW50YScsXG4gIC8vIFwibmFtZVwiOiBpbnRlbnRpb25hbGx5IG5vdCBzdHlsaW5nXG4gICdyZWdleHAnOiAncmVkJ1xufTtcblxuXG5mdW5jdGlvbiBzdHlsaXplV2l0aENvbG9yKHN0ciwgc3R5bGVUeXBlKSB7XG4gIHZhciBzdHlsZSA9IGluc3BlY3Quc3R5bGVzW3N0eWxlVHlwZV07XG5cbiAgaWYgKHN0eWxlKSB7XG4gICAgcmV0dXJuICdcXHUwMDFiWycgKyBpbnNwZWN0LmNvbG9yc1tzdHlsZV1bMF0gKyAnbScgKyBzdHIgK1xuICAgICAgICAgICAnXFx1MDAxYlsnICsgaW5zcGVjdC5jb2xvcnNbc3R5bGVdWzFdICsgJ20nO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBzdHI7XG4gIH1cbn1cblxuXG5mdW5jdGlvbiBzdHlsaXplTm9Db2xvcihzdHIsIHN0eWxlVHlwZSkge1xuICByZXR1cm4gc3RyO1xufVxuXG5cbmZ1bmN0aW9uIGFycmF5VG9IYXNoKGFycmF5KSB7XG4gIHZhciBoYXNoID0ge307XG5cbiAgYXJyYXkuZm9yRWFjaChmdW5jdGlvbih2YWwsIGlkeCkge1xuICAgIGhhc2hbdmFsXSA9IHRydWU7XG4gIH0pO1xuXG4gIHJldHVybiBoYXNoO1xufVxuXG5cbmZ1bmN0aW9uIGZvcm1hdFZhbHVlKGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcykge1xuICAvLyBQcm92aWRlIGEgaG9vayBmb3IgdXNlci1zcGVjaWZpZWQgaW5zcGVjdCBmdW5jdGlvbnMuXG4gIC8vIENoZWNrIHRoYXQgdmFsdWUgaXMgYW4gb2JqZWN0IHdpdGggYW4gaW5zcGVjdCBmdW5jdGlvbiBvbiBpdFxuICBpZiAoY3R4LmN1c3RvbUluc3BlY3QgJiZcbiAgICAgIHZhbHVlICYmXG4gICAgICBpc0Z1bmN0aW9uKHZhbHVlLmluc3BlY3QpICYmXG4gICAgICAvLyBGaWx0ZXIgb3V0IHRoZSB1dGlsIG1vZHVsZSwgaXQncyBpbnNwZWN0IGZ1bmN0aW9uIGlzIHNwZWNpYWxcbiAgICAgIHZhbHVlLmluc3BlY3QgIT09IGV4cG9ydHMuaW5zcGVjdCAmJlxuICAgICAgLy8gQWxzbyBmaWx0ZXIgb3V0IGFueSBwcm90b3R5cGUgb2JqZWN0cyB1c2luZyB0aGUgY2lyY3VsYXIgY2hlY2suXG4gICAgICAhKHZhbHVlLmNvbnN0cnVjdG9yICYmIHZhbHVlLmNvbnN0cnVjdG9yLnByb3RvdHlwZSA9PT0gdmFsdWUpKSB7XG4gICAgdmFyIHJldCA9IHZhbHVlLmluc3BlY3QocmVjdXJzZVRpbWVzLCBjdHgpO1xuICAgIGlmICghaXNTdHJpbmcocmV0KSkge1xuICAgICAgcmV0ID0gZm9ybWF0VmFsdWUoY3R4LCByZXQsIHJlY3Vyc2VUaW1lcyk7XG4gICAgfVxuICAgIHJldHVybiByZXQ7XG4gIH1cblxuICAvLyBQcmltaXRpdmUgdHlwZXMgY2Fubm90IGhhdmUgcHJvcGVydGllc1xuICB2YXIgcHJpbWl0aXZlID0gZm9ybWF0UHJpbWl0aXZlKGN0eCwgdmFsdWUpO1xuICBpZiAocHJpbWl0aXZlKSB7XG4gICAgcmV0dXJuIHByaW1pdGl2ZTtcbiAgfVxuXG4gIC8vIExvb2sgdXAgdGhlIGtleXMgb2YgdGhlIG9iamVjdC5cbiAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyh2YWx1ZSk7XG4gIHZhciB2aXNpYmxlS2V5cyA9IGFycmF5VG9IYXNoKGtleXMpO1xuXG4gIGlmIChjdHguc2hvd0hpZGRlbikge1xuICAgIGtleXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh2YWx1ZSk7XG4gIH1cblxuICAvLyBJRSBkb2Vzbid0IG1ha2UgZXJyb3IgZmllbGRzIG5vbi1lbnVtZXJhYmxlXG4gIC8vIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9pZS9kd3c1MnNidCh2PXZzLjk0KS5hc3B4XG4gIGlmIChpc0Vycm9yKHZhbHVlKVxuICAgICAgJiYgKGtleXMuaW5kZXhPZignbWVzc2FnZScpID49IDAgfHwga2V5cy5pbmRleE9mKCdkZXNjcmlwdGlvbicpID49IDApKSB7XG4gICAgcmV0dXJuIGZvcm1hdEVycm9yKHZhbHVlKTtcbiAgfVxuXG4gIC8vIFNvbWUgdHlwZSBvZiBvYmplY3Qgd2l0aG91dCBwcm9wZXJ0aWVzIGNhbiBiZSBzaG9ydGN1dHRlZC5cbiAgaWYgKGtleXMubGVuZ3RoID09PSAwKSB7XG4gICAgaWYgKGlzRnVuY3Rpb24odmFsdWUpKSB7XG4gICAgICB2YXIgbmFtZSA9IHZhbHVlLm5hbWUgPyAnOiAnICsgdmFsdWUubmFtZSA6ICcnO1xuICAgICAgcmV0dXJuIGN0eC5zdHlsaXplKCdbRnVuY3Rpb24nICsgbmFtZSArICddJywgJ3NwZWNpYWwnKTtcbiAgICB9XG4gICAgaWYgKGlzUmVnRXhwKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIGN0eC5zdHlsaXplKFJlZ0V4cC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSksICdyZWdleHAnKTtcbiAgICB9XG4gICAgaWYgKGlzRGF0ZSh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBjdHguc3R5bGl6ZShEYXRlLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKSwgJ2RhdGUnKTtcbiAgICB9XG4gICAgaWYgKGlzRXJyb3IodmFsdWUpKSB7XG4gICAgICByZXR1cm4gZm9ybWF0RXJyb3IodmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIHZhciBiYXNlID0gJycsIGFycmF5ID0gZmFsc2UsIGJyYWNlcyA9IFsneycsICd9J107XG5cbiAgLy8gTWFrZSBBcnJheSBzYXkgdGhhdCB0aGV5IGFyZSBBcnJheVxuICBpZiAoaXNBcnJheSh2YWx1ZSkpIHtcbiAgICBhcnJheSA9IHRydWU7XG4gICAgYnJhY2VzID0gWydbJywgJ10nXTtcbiAgfVxuXG4gIC8vIE1ha2UgZnVuY3Rpb25zIHNheSB0aGF0IHRoZXkgYXJlIGZ1bmN0aW9uc1xuICBpZiAoaXNGdW5jdGlvbih2YWx1ZSkpIHtcbiAgICB2YXIgbiA9IHZhbHVlLm5hbWUgPyAnOiAnICsgdmFsdWUubmFtZSA6ICcnO1xuICAgIGJhc2UgPSAnIFtGdW5jdGlvbicgKyBuICsgJ10nO1xuICB9XG5cbiAgLy8gTWFrZSBSZWdFeHBzIHNheSB0aGF0IHRoZXkgYXJlIFJlZ0V4cHNcbiAgaWYgKGlzUmVnRXhwKHZhbHVlKSkge1xuICAgIGJhc2UgPSAnICcgKyBSZWdFeHAucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpO1xuICB9XG5cbiAgLy8gTWFrZSBkYXRlcyB3aXRoIHByb3BlcnRpZXMgZmlyc3Qgc2F5IHRoZSBkYXRlXG4gIGlmIChpc0RhdGUodmFsdWUpKSB7XG4gICAgYmFzZSA9ICcgJyArIERhdGUucHJvdG90eXBlLnRvVVRDU3RyaW5nLmNhbGwodmFsdWUpO1xuICB9XG5cbiAgLy8gTWFrZSBlcnJvciB3aXRoIG1lc3NhZ2UgZmlyc3Qgc2F5IHRoZSBlcnJvclxuICBpZiAoaXNFcnJvcih2YWx1ZSkpIHtcbiAgICBiYXNlID0gJyAnICsgZm9ybWF0RXJyb3IodmFsdWUpO1xuICB9XG5cbiAgaWYgKGtleXMubGVuZ3RoID09PSAwICYmICghYXJyYXkgfHwgdmFsdWUubGVuZ3RoID09IDApKSB7XG4gICAgcmV0dXJuIGJyYWNlc1swXSArIGJhc2UgKyBicmFjZXNbMV07XG4gIH1cblxuICBpZiAocmVjdXJzZVRpbWVzIDwgMCkge1xuICAgIGlmIChpc1JlZ0V4cCh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBjdHguc3R5bGl6ZShSZWdFeHAucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpLCAncmVnZXhwJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBjdHguc3R5bGl6ZSgnW09iamVjdF0nLCAnc3BlY2lhbCcpO1xuICAgIH1cbiAgfVxuXG4gIGN0eC5zZWVuLnB1c2godmFsdWUpO1xuXG4gIHZhciBvdXRwdXQ7XG4gIGlmIChhcnJheSkge1xuICAgIG91dHB1dCA9IGZvcm1hdEFycmF5KGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcywgdmlzaWJsZUtleXMsIGtleXMpO1xuICB9IGVsc2Uge1xuICAgIG91dHB1dCA9IGtleXMubWFwKGZ1bmN0aW9uKGtleSkge1xuICAgICAgcmV0dXJuIGZvcm1hdFByb3BlcnR5KGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcywgdmlzaWJsZUtleXMsIGtleSwgYXJyYXkpO1xuICAgIH0pO1xuICB9XG5cbiAgY3R4LnNlZW4ucG9wKCk7XG5cbiAgcmV0dXJuIHJlZHVjZVRvU2luZ2xlU3RyaW5nKG91dHB1dCwgYmFzZSwgYnJhY2VzKTtcbn1cblxuXG5mdW5jdGlvbiBmb3JtYXRQcmltaXRpdmUoY3R4LCB2YWx1ZSkge1xuICBpZiAoaXNVbmRlZmluZWQodmFsdWUpKVxuICAgIHJldHVybiBjdHguc3R5bGl6ZSgndW5kZWZpbmVkJywgJ3VuZGVmaW5lZCcpO1xuICBpZiAoaXNTdHJpbmcodmFsdWUpKSB7XG4gICAgdmFyIHNpbXBsZSA9ICdcXCcnICsgSlNPTi5zdHJpbmdpZnkodmFsdWUpLnJlcGxhY2UoL15cInxcIiQvZywgJycpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvJy9nLCBcIlxcXFwnXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvXFxcXFwiL2csICdcIicpICsgJ1xcJyc7XG4gICAgcmV0dXJuIGN0eC5zdHlsaXplKHNpbXBsZSwgJ3N0cmluZycpO1xuICB9XG4gIGlmIChpc051bWJlcih2YWx1ZSkpXG4gICAgcmV0dXJuIGN0eC5zdHlsaXplKCcnICsgdmFsdWUsICdudW1iZXInKTtcbiAgaWYgKGlzQm9vbGVhbih2YWx1ZSkpXG4gICAgcmV0dXJuIGN0eC5zdHlsaXplKCcnICsgdmFsdWUsICdib29sZWFuJyk7XG4gIC8vIEZvciBzb21lIHJlYXNvbiB0eXBlb2YgbnVsbCBpcyBcIm9iamVjdFwiLCBzbyBzcGVjaWFsIGNhc2UgaGVyZS5cbiAgaWYgKGlzTnVsbCh2YWx1ZSkpXG4gICAgcmV0dXJuIGN0eC5zdHlsaXplKCdudWxsJywgJ251bGwnKTtcbn1cblxuXG5mdW5jdGlvbiBmb3JtYXRFcnJvcih2YWx1ZSkge1xuICByZXR1cm4gJ1snICsgRXJyb3IucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpICsgJ10nO1xufVxuXG5cbmZ1bmN0aW9uIGZvcm1hdEFycmF5KGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcywgdmlzaWJsZUtleXMsIGtleXMpIHtcbiAgdmFyIG91dHB1dCA9IFtdO1xuICBmb3IgKHZhciBpID0gMCwgbCA9IHZhbHVlLmxlbmd0aDsgaSA8IGw7ICsraSkge1xuICAgIGlmIChoYXNPd25Qcm9wZXJ0eSh2YWx1ZSwgU3RyaW5nKGkpKSkge1xuICAgICAgb3V0cHV0LnB1c2goZm9ybWF0UHJvcGVydHkoY3R4LCB2YWx1ZSwgcmVjdXJzZVRpbWVzLCB2aXNpYmxlS2V5cyxcbiAgICAgICAgICBTdHJpbmcoaSksIHRydWUpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgb3V0cHV0LnB1c2goJycpO1xuICAgIH1cbiAgfVxuICBrZXlzLmZvckVhY2goZnVuY3Rpb24oa2V5KSB7XG4gICAgaWYgKCFrZXkubWF0Y2goL15cXGQrJC8pKSB7XG4gICAgICBvdXRwdXQucHVzaChmb3JtYXRQcm9wZXJ0eShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMsIHZpc2libGVLZXlzLFxuICAgICAgICAgIGtleSwgdHJ1ZSkpO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBvdXRwdXQ7XG59XG5cblxuZnVuY3Rpb24gZm9ybWF0UHJvcGVydHkoY3R4LCB2YWx1ZSwgcmVjdXJzZVRpbWVzLCB2aXNpYmxlS2V5cywga2V5LCBhcnJheSkge1xuICB2YXIgbmFtZSwgc3RyLCBkZXNjO1xuICBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih2YWx1ZSwga2V5KSB8fCB7IHZhbHVlOiB2YWx1ZVtrZXldIH07XG4gIGlmIChkZXNjLmdldCkge1xuICAgIGlmIChkZXNjLnNldCkge1xuICAgICAgc3RyID0gY3R4LnN0eWxpemUoJ1tHZXR0ZXIvU2V0dGVyXScsICdzcGVjaWFsJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0ciA9IGN0eC5zdHlsaXplKCdbR2V0dGVyXScsICdzcGVjaWFsJyk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmIChkZXNjLnNldCkge1xuICAgICAgc3RyID0gY3R4LnN0eWxpemUoJ1tTZXR0ZXJdJywgJ3NwZWNpYWwnKTtcbiAgICB9XG4gIH1cbiAgaWYgKCFoYXNPd25Qcm9wZXJ0eSh2aXNpYmxlS2V5cywga2V5KSkge1xuICAgIG5hbWUgPSAnWycgKyBrZXkgKyAnXSc7XG4gIH1cbiAgaWYgKCFzdHIpIHtcbiAgICBpZiAoY3R4LnNlZW4uaW5kZXhPZihkZXNjLnZhbHVlKSA8IDApIHtcbiAgICAgIGlmIChpc051bGwocmVjdXJzZVRpbWVzKSkge1xuICAgICAgICBzdHIgPSBmb3JtYXRWYWx1ZShjdHgsIGRlc2MudmFsdWUsIG51bGwpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RyID0gZm9ybWF0VmFsdWUoY3R4LCBkZXNjLnZhbHVlLCByZWN1cnNlVGltZXMgLSAxKTtcbiAgICAgIH1cbiAgICAgIGlmIChzdHIuaW5kZXhPZignXFxuJykgPiAtMSkge1xuICAgICAgICBpZiAoYXJyYXkpIHtcbiAgICAgICAgICBzdHIgPSBzdHIuc3BsaXQoJ1xcbicpLm1hcChmdW5jdGlvbihsaW5lKSB7XG4gICAgICAgICAgICByZXR1cm4gJyAgJyArIGxpbmU7XG4gICAgICAgICAgfSkuam9pbignXFxuJykuc3Vic3RyKDIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN0ciA9ICdcXG4nICsgc3RyLnNwbGl0KCdcXG4nKS5tYXAoZnVuY3Rpb24obGluZSkge1xuICAgICAgICAgICAgcmV0dXJuICcgICAnICsgbGluZTtcbiAgICAgICAgICB9KS5qb2luKCdcXG4nKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBzdHIgPSBjdHguc3R5bGl6ZSgnW0NpcmN1bGFyXScsICdzcGVjaWFsJyk7XG4gICAgfVxuICB9XG4gIGlmIChpc1VuZGVmaW5lZChuYW1lKSkge1xuICAgIGlmIChhcnJheSAmJiBrZXkubWF0Y2goL15cXGQrJC8pKSB7XG4gICAgICByZXR1cm4gc3RyO1xuICAgIH1cbiAgICBuYW1lID0gSlNPTi5zdHJpbmdpZnkoJycgKyBrZXkpO1xuICAgIGlmIChuYW1lLm1hdGNoKC9eXCIoW2EtekEtWl9dW2EtekEtWl8wLTldKilcIiQvKSkge1xuICAgICAgbmFtZSA9IG5hbWUuc3Vic3RyKDEsIG5hbWUubGVuZ3RoIC0gMik7XG4gICAgICBuYW1lID0gY3R4LnN0eWxpemUobmFtZSwgJ25hbWUnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbmFtZSA9IG5hbWUucmVwbGFjZSgvJy9nLCBcIlxcXFwnXCIpXG4gICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9cXFxcXCIvZywgJ1wiJylcbiAgICAgICAgICAgICAgICAgLnJlcGxhY2UoLyheXCJ8XCIkKS9nLCBcIidcIik7XG4gICAgICBuYW1lID0gY3R4LnN0eWxpemUobmFtZSwgJ3N0cmluZycpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuYW1lICsgJzogJyArIHN0cjtcbn1cblxuXG5mdW5jdGlvbiByZWR1Y2VUb1NpbmdsZVN0cmluZyhvdXRwdXQsIGJhc2UsIGJyYWNlcykge1xuICB2YXIgbnVtTGluZXNFc3QgPSAwO1xuICB2YXIgbGVuZ3RoID0gb3V0cHV0LnJlZHVjZShmdW5jdGlvbihwcmV2LCBjdXIpIHtcbiAgICBudW1MaW5lc0VzdCsrO1xuICAgIGlmIChjdXIuaW5kZXhPZignXFxuJykgPj0gMCkgbnVtTGluZXNFc3QrKztcbiAgICByZXR1cm4gcHJldiArIGN1ci5yZXBsYWNlKC9cXHUwMDFiXFxbXFxkXFxkP20vZywgJycpLmxlbmd0aCArIDE7XG4gIH0sIDApO1xuXG4gIGlmIChsZW5ndGggPiA2MCkge1xuICAgIHJldHVybiBicmFjZXNbMF0gK1xuICAgICAgICAgICAoYmFzZSA9PT0gJycgPyAnJyA6IGJhc2UgKyAnXFxuICcpICtcbiAgICAgICAgICAgJyAnICtcbiAgICAgICAgICAgb3V0cHV0LmpvaW4oJyxcXG4gICcpICtcbiAgICAgICAgICAgJyAnICtcbiAgICAgICAgICAgYnJhY2VzWzFdO1xuICB9XG5cbiAgcmV0dXJuIGJyYWNlc1swXSArIGJhc2UgKyAnICcgKyBvdXRwdXQuam9pbignLCAnKSArICcgJyArIGJyYWNlc1sxXTtcbn1cblxuXG4vLyBOT1RFOiBUaGVzZSB0eXBlIGNoZWNraW5nIGZ1bmN0aW9ucyBpbnRlbnRpb25hbGx5IGRvbid0IHVzZSBgaW5zdGFuY2VvZmBcbi8vIGJlY2F1c2UgaXQgaXMgZnJhZ2lsZSBhbmQgY2FuIGJlIGVhc2lseSBmYWtlZCB3aXRoIGBPYmplY3QuY3JlYXRlKClgLlxuZnVuY3Rpb24gaXNBcnJheShhcikge1xuICByZXR1cm4gQXJyYXkuaXNBcnJheShhcik7XG59XG5leHBvcnRzLmlzQXJyYXkgPSBpc0FycmF5O1xuXG5mdW5jdGlvbiBpc0Jvb2xlYW4oYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnYm9vbGVhbic7XG59XG5leHBvcnRzLmlzQm9vbGVhbiA9IGlzQm9vbGVhbjtcblxuZnVuY3Rpb24gaXNOdWxsKGFyZykge1xuICByZXR1cm4gYXJnID09PSBudWxsO1xufVxuZXhwb3J0cy5pc051bGwgPSBpc051bGw7XG5cbmZ1bmN0aW9uIGlzTnVsbE9yVW5kZWZpbmVkKGFyZykge1xuICByZXR1cm4gYXJnID09IG51bGw7XG59XG5leHBvcnRzLmlzTnVsbE9yVW5kZWZpbmVkID0gaXNOdWxsT3JVbmRlZmluZWQ7XG5cbmZ1bmN0aW9uIGlzTnVtYmVyKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ251bWJlcic7XG59XG5leHBvcnRzLmlzTnVtYmVyID0gaXNOdW1iZXI7XG5cbmZ1bmN0aW9uIGlzU3RyaW5nKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ3N0cmluZyc7XG59XG5leHBvcnRzLmlzU3RyaW5nID0gaXNTdHJpbmc7XG5cbmZ1bmN0aW9uIGlzU3ltYm9sKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ3N5bWJvbCc7XG59XG5leHBvcnRzLmlzU3ltYm9sID0gaXNTeW1ib2w7XG5cbmZ1bmN0aW9uIGlzVW5kZWZpbmVkKGFyZykge1xuICByZXR1cm4gYXJnID09PSB2b2lkIDA7XG59XG5leHBvcnRzLmlzVW5kZWZpbmVkID0gaXNVbmRlZmluZWQ7XG5cbmZ1bmN0aW9uIGlzUmVnRXhwKHJlKSB7XG4gIHJldHVybiBpc09iamVjdChyZSkgJiYgb2JqZWN0VG9TdHJpbmcocmUpID09PSAnW29iamVjdCBSZWdFeHBdJztcbn1cbmV4cG9ydHMuaXNSZWdFeHAgPSBpc1JlZ0V4cDtcblxuZnVuY3Rpb24gaXNPYmplY3QoYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnb2JqZWN0JyAmJiBhcmcgIT09IG51bGw7XG59XG5leHBvcnRzLmlzT2JqZWN0ID0gaXNPYmplY3Q7XG5cbmZ1bmN0aW9uIGlzRGF0ZShkKSB7XG4gIHJldHVybiBpc09iamVjdChkKSAmJiBvYmplY3RUb1N0cmluZyhkKSA9PT0gJ1tvYmplY3QgRGF0ZV0nO1xufVxuZXhwb3J0cy5pc0RhdGUgPSBpc0RhdGU7XG5cbmZ1bmN0aW9uIGlzRXJyb3IoZSkge1xuICByZXR1cm4gaXNPYmplY3QoZSkgJiZcbiAgICAgIChvYmplY3RUb1N0cmluZyhlKSA9PT0gJ1tvYmplY3QgRXJyb3JdJyB8fCBlIGluc3RhbmNlb2YgRXJyb3IpO1xufVxuZXhwb3J0cy5pc0Vycm9yID0gaXNFcnJvcjtcblxuZnVuY3Rpb24gaXNGdW5jdGlvbihhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdmdW5jdGlvbic7XG59XG5leHBvcnRzLmlzRnVuY3Rpb24gPSBpc0Z1bmN0aW9uO1xuXG5mdW5jdGlvbiBpc1ByaW1pdGl2ZShhcmcpIHtcbiAgcmV0dXJuIGFyZyA9PT0gbnVsbCB8fFxuICAgICAgICAgdHlwZW9mIGFyZyA9PT0gJ2Jvb2xlYW4nIHx8XG4gICAgICAgICB0eXBlb2YgYXJnID09PSAnbnVtYmVyJyB8fFxuICAgICAgICAgdHlwZW9mIGFyZyA9PT0gJ3N0cmluZycgfHxcbiAgICAgICAgIHR5cGVvZiBhcmcgPT09ICdzeW1ib2wnIHx8ICAvLyBFUzYgc3ltYm9sXG4gICAgICAgICB0eXBlb2YgYXJnID09PSAndW5kZWZpbmVkJztcbn1cbmV4cG9ydHMuaXNQcmltaXRpdmUgPSBpc1ByaW1pdGl2ZTtcblxuZXhwb3J0cy5pc0J1ZmZlciA9IHJlcXVpcmUoJy4vc3VwcG9ydC9pc0J1ZmZlcicpO1xuXG5mdW5jdGlvbiBvYmplY3RUb1N0cmluZyhvKSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobyk7XG59XG5cblxuZnVuY3Rpb24gcGFkKG4pIHtcbiAgcmV0dXJuIG4gPCAxMCA/ICcwJyArIG4udG9TdHJpbmcoMTApIDogbi50b1N0cmluZygxMCk7XG59XG5cblxudmFyIG1vbnRocyA9IFsnSmFuJywgJ0ZlYicsICdNYXInLCAnQXByJywgJ01heScsICdKdW4nLCAnSnVsJywgJ0F1ZycsICdTZXAnLFxuICAgICAgICAgICAgICAnT2N0JywgJ05vdicsICdEZWMnXTtcblxuLy8gMjYgRmViIDE2OjE5OjM0XG5mdW5jdGlvbiB0aW1lc3RhbXAoKSB7XG4gIHZhciBkID0gbmV3IERhdGUoKTtcbiAgdmFyIHRpbWUgPSBbcGFkKGQuZ2V0SG91cnMoKSksXG4gICAgICAgICAgICAgIHBhZChkLmdldE1pbnV0ZXMoKSksXG4gICAgICAgICAgICAgIHBhZChkLmdldFNlY29uZHMoKSldLmpvaW4oJzonKTtcbiAgcmV0dXJuIFtkLmdldERhdGUoKSwgbW9udGhzW2QuZ2V0TW9udGgoKV0sIHRpbWVdLmpvaW4oJyAnKTtcbn1cblxuXG4vLyBsb2cgaXMganVzdCBhIHRoaW4gd3JhcHBlciB0byBjb25zb2xlLmxvZyB0aGF0IHByZXBlbmRzIGEgdGltZXN0YW1wXG5leHBvcnRzLmxvZyA9IGZ1bmN0aW9uKCkge1xuICBjb25zb2xlLmxvZygnJXMgLSAlcycsIHRpbWVzdGFtcCgpLCBleHBvcnRzLmZvcm1hdC5hcHBseShleHBvcnRzLCBhcmd1bWVudHMpKTtcbn07XG5cblxuLyoqXG4gKiBJbmhlcml0IHRoZSBwcm90b3R5cGUgbWV0aG9kcyBmcm9tIG9uZSBjb25zdHJ1Y3RvciBpbnRvIGFub3RoZXIuXG4gKlxuICogVGhlIEZ1bmN0aW9uLnByb3RvdHlwZS5pbmhlcml0cyBmcm9tIGxhbmcuanMgcmV3cml0dGVuIGFzIGEgc3RhbmRhbG9uZVxuICogZnVuY3Rpb24gKG5vdCBvbiBGdW5jdGlvbi5wcm90b3R5cGUpLiBOT1RFOiBJZiB0aGlzIGZpbGUgaXMgdG8gYmUgbG9hZGVkXG4gKiBkdXJpbmcgYm9vdHN0cmFwcGluZyB0aGlzIGZ1bmN0aW9uIG5lZWRzIHRvIGJlIHJld3JpdHRlbiB1c2luZyBzb21lIG5hdGl2ZVxuICogZnVuY3Rpb25zIGFzIHByb3RvdHlwZSBzZXR1cCB1c2luZyBub3JtYWwgSmF2YVNjcmlwdCBkb2VzIG5vdCB3b3JrIGFzXG4gKiBleHBlY3RlZCBkdXJpbmcgYm9vdHN0cmFwcGluZyAoc2VlIG1pcnJvci5qcyBpbiByMTE0OTAzKS5cbiAqXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBjdG9yIENvbnN0cnVjdG9yIGZ1bmN0aW9uIHdoaWNoIG5lZWRzIHRvIGluaGVyaXQgdGhlXG4gKiAgICAgcHJvdG90eXBlLlxuICogQHBhcmFtIHtmdW5jdGlvbn0gc3VwZXJDdG9yIENvbnN0cnVjdG9yIGZ1bmN0aW9uIHRvIGluaGVyaXQgcHJvdG90eXBlIGZyb20uXG4gKi9cbmV4cG9ydHMuaW5oZXJpdHMgPSByZXF1aXJlKCdpbmhlcml0cycpO1xuXG5leHBvcnRzLl9leHRlbmQgPSBmdW5jdGlvbihvcmlnaW4sIGFkZCkge1xuICAvLyBEb24ndCBkbyBhbnl0aGluZyBpZiBhZGQgaXNuJ3QgYW4gb2JqZWN0XG4gIGlmICghYWRkIHx8ICFpc09iamVjdChhZGQpKSByZXR1cm4gb3JpZ2luO1xuXG4gIHZhciBrZXlzID0gT2JqZWN0LmtleXMoYWRkKTtcbiAgdmFyIGkgPSBrZXlzLmxlbmd0aDtcbiAgd2hpbGUgKGktLSkge1xuICAgIG9yaWdpbltrZXlzW2ldXSA9IGFkZFtrZXlzW2ldXTtcbiAgfVxuICByZXR1cm4gb3JpZ2luO1xufTtcblxuZnVuY3Rpb24gaGFzT3duUHJvcGVydHkob2JqLCBwcm9wKSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKTtcbn1cbiIsIid1c2Ugc3RyaWN0J1xuXG5leHBvcnRzLmJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoXG5leHBvcnRzLnRvQnl0ZUFycmF5ID0gdG9CeXRlQXJyYXlcbmV4cG9ydHMuZnJvbUJ5dGVBcnJheSA9IGZyb21CeXRlQXJyYXlcblxudmFyIGxvb2t1cCA9IFtdXG52YXIgcmV2TG9va3VwID0gW11cbnZhciBBcnIgPSB0eXBlb2YgVWludDhBcnJheSAhPT0gJ3VuZGVmaW5lZCcgPyBVaW50OEFycmF5IDogQXJyYXlcblxudmFyIGNvZGUgPSAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLydcbmZvciAodmFyIGkgPSAwLCBsZW4gPSBjb2RlLmxlbmd0aDsgaSA8IGxlbjsgKytpKSB7XG4gIGxvb2t1cFtpXSA9IGNvZGVbaV1cbiAgcmV2TG9va3VwW2NvZGUuY2hhckNvZGVBdChpKV0gPSBpXG59XG5cbi8vIFN1cHBvcnQgZGVjb2RpbmcgVVJMLXNhZmUgYmFzZTY0IHN0cmluZ3MsIGFzIE5vZGUuanMgZG9lcy5cbi8vIFNlZTogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQmFzZTY0I1VSTF9hcHBsaWNhdGlvbnNcbnJldkxvb2t1cFsnLScuY2hhckNvZGVBdCgwKV0gPSA2MlxucmV2TG9va3VwWydfJy5jaGFyQ29kZUF0KDApXSA9IDYzXG5cbmZ1bmN0aW9uIGdldExlbnMgKGI2NCkge1xuICB2YXIgbGVuID0gYjY0Lmxlbmd0aFxuXG4gIGlmIChsZW4gJSA0ID4gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBzdHJpbmcuIExlbmd0aCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCcpXG4gIH1cblxuICAvLyBUcmltIG9mZiBleHRyYSBieXRlcyBhZnRlciBwbGFjZWhvbGRlciBieXRlcyBhcmUgZm91bmRcbiAgLy8gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vYmVhdGdhbW1pdC9iYXNlNjQtanMvaXNzdWVzLzQyXG4gIHZhciB2YWxpZExlbiA9IGI2NC5pbmRleE9mKCc9JylcbiAgaWYgKHZhbGlkTGVuID09PSAtMSkgdmFsaWRMZW4gPSBsZW5cblxuICB2YXIgcGxhY2VIb2xkZXJzTGVuID0gdmFsaWRMZW4gPT09IGxlblxuICAgID8gMFxuICAgIDogNCAtICh2YWxpZExlbiAlIDQpXG5cbiAgcmV0dXJuIFt2YWxpZExlbiwgcGxhY2VIb2xkZXJzTGVuXVxufVxuXG4vLyBiYXNlNjQgaXMgNC8zICsgdXAgdG8gdHdvIGNoYXJhY3RlcnMgb2YgdGhlIG9yaWdpbmFsIGRhdGFcbmZ1bmN0aW9uIGJ5dGVMZW5ndGggKGI2NCkge1xuICB2YXIgbGVucyA9IGdldExlbnMoYjY0KVxuICB2YXIgdmFsaWRMZW4gPSBsZW5zWzBdXG4gIHZhciBwbGFjZUhvbGRlcnNMZW4gPSBsZW5zWzFdXG4gIHJldHVybiAoKHZhbGlkTGVuICsgcGxhY2VIb2xkZXJzTGVuKSAqIDMgLyA0KSAtIHBsYWNlSG9sZGVyc0xlblxufVxuXG5mdW5jdGlvbiBfYnl0ZUxlbmd0aCAoYjY0LCB2YWxpZExlbiwgcGxhY2VIb2xkZXJzTGVuKSB7XG4gIHJldHVybiAoKHZhbGlkTGVuICsgcGxhY2VIb2xkZXJzTGVuKSAqIDMgLyA0KSAtIHBsYWNlSG9sZGVyc0xlblxufVxuXG5mdW5jdGlvbiB0b0J5dGVBcnJheSAoYjY0KSB7XG4gIHZhciB0bXBcbiAgdmFyIGxlbnMgPSBnZXRMZW5zKGI2NClcbiAgdmFyIHZhbGlkTGVuID0gbGVuc1swXVxuICB2YXIgcGxhY2VIb2xkZXJzTGVuID0gbGVuc1sxXVxuXG4gIHZhciBhcnIgPSBuZXcgQXJyKF9ieXRlTGVuZ3RoKGI2NCwgdmFsaWRMZW4sIHBsYWNlSG9sZGVyc0xlbikpXG5cbiAgdmFyIGN1ckJ5dGUgPSAwXG5cbiAgLy8gaWYgdGhlcmUgYXJlIHBsYWNlaG9sZGVycywgb25seSBnZXQgdXAgdG8gdGhlIGxhc3QgY29tcGxldGUgNCBjaGFyc1xuICB2YXIgbGVuID0gcGxhY2VIb2xkZXJzTGVuID4gMFxuICAgID8gdmFsaWRMZW4gLSA0XG4gICAgOiB2YWxpZExlblxuXG4gIHZhciBpXG4gIGZvciAoaSA9IDA7IGkgPCBsZW47IGkgKz0gNCkge1xuICAgIHRtcCA9XG4gICAgICAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkpXSA8PCAxOCkgfFxuICAgICAgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMSldIDw8IDEyKSB8XG4gICAgICAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkgKyAyKV0gPDwgNikgfFxuICAgICAgcmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkgKyAzKV1cbiAgICBhcnJbY3VyQnl0ZSsrXSA9ICh0bXAgPj4gMTYpICYgMHhGRlxuICAgIGFycltjdXJCeXRlKytdID0gKHRtcCA+PiA4KSAmIDB4RkZcbiAgICBhcnJbY3VyQnl0ZSsrXSA9IHRtcCAmIDB4RkZcbiAgfVxuXG4gIGlmIChwbGFjZUhvbGRlcnNMZW4gPT09IDIpIHtcbiAgICB0bXAgPVxuICAgICAgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpKV0gPDwgMikgfFxuICAgICAgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMSldID4+IDQpXG4gICAgYXJyW2N1ckJ5dGUrK10gPSB0bXAgJiAweEZGXG4gIH1cblxuICBpZiAocGxhY2VIb2xkZXJzTGVuID09PSAxKSB7XG4gICAgdG1wID1cbiAgICAgIChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSldIDw8IDEwKSB8XG4gICAgICAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkgKyAxKV0gPDwgNCkgfFxuICAgICAgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMildID4+IDIpXG4gICAgYXJyW2N1ckJ5dGUrK10gPSAodG1wID4+IDgpICYgMHhGRlxuICAgIGFycltjdXJCeXRlKytdID0gdG1wICYgMHhGRlxuICB9XG5cbiAgcmV0dXJuIGFyclxufVxuXG5mdW5jdGlvbiB0cmlwbGV0VG9CYXNlNjQgKG51bSkge1xuICByZXR1cm4gbG9va3VwW251bSA+PiAxOCAmIDB4M0ZdICtcbiAgICBsb29rdXBbbnVtID4+IDEyICYgMHgzRl0gK1xuICAgIGxvb2t1cFtudW0gPj4gNiAmIDB4M0ZdICtcbiAgICBsb29rdXBbbnVtICYgMHgzRl1cbn1cblxuZnVuY3Rpb24gZW5jb2RlQ2h1bmsgKHVpbnQ4LCBzdGFydCwgZW5kKSB7XG4gIHZhciB0bXBcbiAgdmFyIG91dHB1dCA9IFtdXG4gIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgaSArPSAzKSB7XG4gICAgdG1wID1cbiAgICAgICgodWludDhbaV0gPDwgMTYpICYgMHhGRjAwMDApICtcbiAgICAgICgodWludDhbaSArIDFdIDw8IDgpICYgMHhGRjAwKSArXG4gICAgICAodWludDhbaSArIDJdICYgMHhGRilcbiAgICBvdXRwdXQucHVzaCh0cmlwbGV0VG9CYXNlNjQodG1wKSlcbiAgfVxuICByZXR1cm4gb3V0cHV0LmpvaW4oJycpXG59XG5cbmZ1bmN0aW9uIGZyb21CeXRlQXJyYXkgKHVpbnQ4KSB7XG4gIHZhciB0bXBcbiAgdmFyIGxlbiA9IHVpbnQ4Lmxlbmd0aFxuICB2YXIgZXh0cmFCeXRlcyA9IGxlbiAlIDMgLy8gaWYgd2UgaGF2ZSAxIGJ5dGUgbGVmdCwgcGFkIDIgYnl0ZXNcbiAgdmFyIHBhcnRzID0gW11cbiAgdmFyIG1heENodW5rTGVuZ3RoID0gMTYzODMgLy8gbXVzdCBiZSBtdWx0aXBsZSBvZiAzXG5cbiAgLy8gZ28gdGhyb3VnaCB0aGUgYXJyYXkgZXZlcnkgdGhyZWUgYnl0ZXMsIHdlJ2xsIGRlYWwgd2l0aCB0cmFpbGluZyBzdHVmZiBsYXRlclxuICBmb3IgKHZhciBpID0gMCwgbGVuMiA9IGxlbiAtIGV4dHJhQnl0ZXM7IGkgPCBsZW4yOyBpICs9IG1heENodW5rTGVuZ3RoKSB7XG4gICAgcGFydHMucHVzaChlbmNvZGVDaHVuayh1aW50OCwgaSwgKGkgKyBtYXhDaHVua0xlbmd0aCkgPiBsZW4yID8gbGVuMiA6IChpICsgbWF4Q2h1bmtMZW5ndGgpKSlcbiAgfVxuXG4gIC8vIHBhZCB0aGUgZW5kIHdpdGggemVyb3MsIGJ1dCBtYWtlIHN1cmUgdG8gbm90IGZvcmdldCB0aGUgZXh0cmEgYnl0ZXNcbiAgaWYgKGV4dHJhQnl0ZXMgPT09IDEpIHtcbiAgICB0bXAgPSB1aW50OFtsZW4gLSAxXVxuICAgIHBhcnRzLnB1c2goXG4gICAgICBsb29rdXBbdG1wID4+IDJdICtcbiAgICAgIGxvb2t1cFsodG1wIDw8IDQpICYgMHgzRl0gK1xuICAgICAgJz09J1xuICAgIClcbiAgfSBlbHNlIGlmIChleHRyYUJ5dGVzID09PSAyKSB7XG4gICAgdG1wID0gKHVpbnQ4W2xlbiAtIDJdIDw8IDgpICsgdWludDhbbGVuIC0gMV1cbiAgICBwYXJ0cy5wdXNoKFxuICAgICAgbG9va3VwW3RtcCA+PiAxMF0gK1xuICAgICAgbG9va3VwWyh0bXAgPj4gNCkgJiAweDNGXSArXG4gICAgICBsb29rdXBbKHRtcCA8PCAyKSAmIDB4M0ZdICtcbiAgICAgICc9J1xuICAgIClcbiAgfVxuXG4gIHJldHVybiBwYXJ0cy5qb2luKCcnKVxufVxuIiwidmFyIGJpZ0ludCA9IChmdW5jdGlvbiAodW5kZWZpbmVkKSB7XHJcbiAgICBcInVzZSBzdHJpY3RcIjtcclxuXHJcbiAgICB2YXIgQkFTRSA9IDFlNyxcclxuICAgICAgICBMT0dfQkFTRSA9IDcsXHJcbiAgICAgICAgTUFYX0lOVCA9IDkwMDcxOTkyNTQ3NDA5OTIsXHJcbiAgICAgICAgTUFYX0lOVF9BUlIgPSBzbWFsbFRvQXJyYXkoTUFYX0lOVCksXHJcbiAgICAgICAgREVGQVVMVF9BTFBIQUJFVCA9IFwiMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6XCI7XHJcblxyXG4gICAgdmFyIHN1cHBvcnRzTmF0aXZlQmlnSW50ID0gdHlwZW9mIEJpZ0ludCA9PT0gXCJmdW5jdGlvblwiO1xyXG5cclxuICAgIGZ1bmN0aW9uIEludGVnZXIodiwgcmFkaXgsIGFscGhhYmV0LCBjYXNlU2Vuc2l0aXZlKSB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiB2ID09PSBcInVuZGVmaW5lZFwiKSByZXR1cm4gSW50ZWdlclswXTtcclxuICAgICAgICBpZiAodHlwZW9mIHJhZGl4ICE9PSBcInVuZGVmaW5lZFwiKSByZXR1cm4gK3JhZGl4ID09PSAxMCAmJiAhYWxwaGFiZXQgPyBwYXJzZVZhbHVlKHYpIDogcGFyc2VCYXNlKHYsIHJhZGl4LCBhbHBoYWJldCwgY2FzZVNlbnNpdGl2ZSk7XHJcbiAgICAgICAgcmV0dXJuIHBhcnNlVmFsdWUodik7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gQmlnSW50ZWdlcih2YWx1ZSwgc2lnbikge1xyXG4gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcclxuICAgICAgICB0aGlzLnNpZ24gPSBzaWduO1xyXG4gICAgICAgIHRoaXMuaXNTbWFsbCA9IGZhbHNlO1xyXG4gICAgfVxyXG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEludGVnZXIucHJvdG90eXBlKTtcclxuXHJcbiAgICBmdW5jdGlvbiBTbWFsbEludGVnZXIodmFsdWUpIHtcclxuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XHJcbiAgICAgICAgdGhpcy5zaWduID0gdmFsdWUgPCAwO1xyXG4gICAgICAgIHRoaXMuaXNTbWFsbCA9IHRydWU7XHJcbiAgICB9XHJcbiAgICBTbWFsbEludGVnZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShJbnRlZ2VyLnByb3RvdHlwZSk7XHJcblxyXG4gICAgZnVuY3Rpb24gTmF0aXZlQmlnSW50KHZhbHVlKSB7XHJcbiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xyXG4gICAgfVxyXG4gICAgTmF0aXZlQmlnSW50LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoSW50ZWdlci5wcm90b3R5cGUpO1xyXG5cclxuICAgIGZ1bmN0aW9uIGlzUHJlY2lzZShuKSB7XHJcbiAgICAgICAgcmV0dXJuIC1NQVhfSU5UIDwgbiAmJiBuIDwgTUFYX0lOVDtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBzbWFsbFRvQXJyYXkobikgeyAvLyBGb3IgcGVyZm9ybWFuY2UgcmVhc29ucyBkb2Vzbid0IHJlZmVyZW5jZSBCQVNFLCBuZWVkIHRvIGNoYW5nZSB0aGlzIGZ1bmN0aW9uIGlmIEJBU0UgY2hhbmdlc1xyXG4gICAgICAgIGlmIChuIDwgMWU3KVxyXG4gICAgICAgICAgICByZXR1cm4gW25dO1xyXG4gICAgICAgIGlmIChuIDwgMWUxNClcclxuICAgICAgICAgICAgcmV0dXJuIFtuICUgMWU3LCBNYXRoLmZsb29yKG4gLyAxZTcpXTtcclxuICAgICAgICByZXR1cm4gW24gJSAxZTcsIE1hdGguZmxvb3IobiAvIDFlNykgJSAxZTcsIE1hdGguZmxvb3IobiAvIDFlMTQpXTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBhcnJheVRvU21hbGwoYXJyKSB7IC8vIElmIEJBU0UgY2hhbmdlcyB0aGlzIGZ1bmN0aW9uIG1heSBuZWVkIHRvIGNoYW5nZVxyXG4gICAgICAgIHRyaW0oYXJyKTtcclxuICAgICAgICB2YXIgbGVuZ3RoID0gYXJyLmxlbmd0aDtcclxuICAgICAgICBpZiAobGVuZ3RoIDwgNCAmJiBjb21wYXJlQWJzKGFyciwgTUFYX0lOVF9BUlIpIDwgMCkge1xyXG4gICAgICAgICAgICBzd2l0Y2ggKGxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgY2FzZSAwOiByZXR1cm4gMDtcclxuICAgICAgICAgICAgICAgIGNhc2UgMTogcmV0dXJuIGFyclswXTtcclxuICAgICAgICAgICAgICAgIGNhc2UgMjogcmV0dXJuIGFyclswXSArIGFyclsxXSAqIEJBU0U7XHJcbiAgICAgICAgICAgICAgICBkZWZhdWx0OiByZXR1cm4gYXJyWzBdICsgKGFyclsxXSArIGFyclsyXSAqIEJBU0UpICogQkFTRTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gYXJyO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIHRyaW0odikge1xyXG4gICAgICAgIHZhciBpID0gdi5sZW5ndGg7XHJcbiAgICAgICAgd2hpbGUgKHZbLS1pXSA9PT0gMCk7XHJcbiAgICAgICAgdi5sZW5ndGggPSBpICsgMTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBjcmVhdGVBcnJheShsZW5ndGgpIHsgLy8gZnVuY3Rpb24gc2hhbWVsZXNzbHkgc3RvbGVuIGZyb20gWWFmZmxlJ3MgbGlicmFyeSBodHRwczovL2dpdGh1Yi5jb20vWWFmZmxlL0JpZ0ludGVnZXJcclxuICAgICAgICB2YXIgeCA9IG5ldyBBcnJheShsZW5ndGgpO1xyXG4gICAgICAgIHZhciBpID0gLTE7XHJcbiAgICAgICAgd2hpbGUgKCsraSA8IGxlbmd0aCkge1xyXG4gICAgICAgICAgICB4W2ldID0gMDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHg7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gdHJ1bmNhdGUobikge1xyXG4gICAgICAgIGlmIChuID4gMCkgcmV0dXJuIE1hdGguZmxvb3Iobik7XHJcbiAgICAgICAgcmV0dXJuIE1hdGguY2VpbChuKTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBhZGQoYSwgYikgeyAvLyBhc3N1bWVzIGEgYW5kIGIgYXJlIGFycmF5cyB3aXRoIGEubGVuZ3RoID49IGIubGVuZ3RoXHJcbiAgICAgICAgdmFyIGxfYSA9IGEubGVuZ3RoLFxyXG4gICAgICAgICAgICBsX2IgPSBiLmxlbmd0aCxcclxuICAgICAgICAgICAgciA9IG5ldyBBcnJheShsX2EpLFxyXG4gICAgICAgICAgICBjYXJyeSA9IDAsXHJcbiAgICAgICAgICAgIGJhc2UgPSBCQVNFLFxyXG4gICAgICAgICAgICBzdW0sIGk7XHJcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGxfYjsgaSsrKSB7XHJcbiAgICAgICAgICAgIHN1bSA9IGFbaV0gKyBiW2ldICsgY2Fycnk7XHJcbiAgICAgICAgICAgIGNhcnJ5ID0gc3VtID49IGJhc2UgPyAxIDogMDtcclxuICAgICAgICAgICAgcltpXSA9IHN1bSAtIGNhcnJ5ICogYmFzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgd2hpbGUgKGkgPCBsX2EpIHtcclxuICAgICAgICAgICAgc3VtID0gYVtpXSArIGNhcnJ5O1xyXG4gICAgICAgICAgICBjYXJyeSA9IHN1bSA9PT0gYmFzZSA/IDEgOiAwO1xyXG4gICAgICAgICAgICByW2krK10gPSBzdW0gLSBjYXJyeSAqIGJhc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChjYXJyeSA+IDApIHIucHVzaChjYXJyeSk7XHJcbiAgICAgICAgcmV0dXJuIHI7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gYWRkQW55KGEsIGIpIHtcclxuICAgICAgICBpZiAoYS5sZW5ndGggPj0gYi5sZW5ndGgpIHJldHVybiBhZGQoYSwgYik7XHJcbiAgICAgICAgcmV0dXJuIGFkZChiLCBhKTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBhZGRTbWFsbChhLCBjYXJyeSkgeyAvLyBhc3N1bWVzIGEgaXMgYXJyYXksIGNhcnJ5IGlzIG51bWJlciB3aXRoIDAgPD0gY2FycnkgPCBNQVhfSU5UXHJcbiAgICAgICAgdmFyIGwgPSBhLmxlbmd0aCxcclxuICAgICAgICAgICAgciA9IG5ldyBBcnJheShsKSxcclxuICAgICAgICAgICAgYmFzZSA9IEJBU0UsXHJcbiAgICAgICAgICAgIHN1bSwgaTtcclxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHN1bSA9IGFbaV0gLSBiYXNlICsgY2Fycnk7XHJcbiAgICAgICAgICAgIGNhcnJ5ID0gTWF0aC5mbG9vcihzdW0gLyBiYXNlKTtcclxuICAgICAgICAgICAgcltpXSA9IHN1bSAtIGNhcnJ5ICogYmFzZTtcclxuICAgICAgICAgICAgY2FycnkgKz0gMTtcclxuICAgICAgICB9XHJcbiAgICAgICAgd2hpbGUgKGNhcnJ5ID4gMCkge1xyXG4gICAgICAgICAgICByW2krK10gPSBjYXJyeSAlIGJhc2U7XHJcbiAgICAgICAgICAgIGNhcnJ5ID0gTWF0aC5mbG9vcihjYXJyeSAvIGJhc2UpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcjtcclxuICAgIH1cclxuXHJcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiAodikge1xyXG4gICAgICAgIHZhciBuID0gcGFyc2VWYWx1ZSh2KTtcclxuICAgICAgICBpZiAodGhpcy5zaWduICE9PSBuLnNpZ24pIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3VidHJhY3Qobi5uZWdhdGUoKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciBhID0gdGhpcy52YWx1ZSwgYiA9IG4udmFsdWU7XHJcbiAgICAgICAgaWYgKG4uaXNTbWFsbCkge1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3IEJpZ0ludGVnZXIoYWRkU21hbGwoYSwgTWF0aC5hYnMoYikpLCB0aGlzLnNpZ24pO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbmV3IEJpZ0ludGVnZXIoYWRkQW55KGEsIGIpLCB0aGlzLnNpZ24pO1xyXG4gICAgfTtcclxuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLnBsdXMgPSBCaWdJbnRlZ2VyLnByb3RvdHlwZS5hZGQ7XHJcblxyXG4gICAgU21hbGxJbnRlZ2VyLnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiAodikge1xyXG4gICAgICAgIHZhciBuID0gcGFyc2VWYWx1ZSh2KTtcclxuICAgICAgICB2YXIgYSA9IHRoaXMudmFsdWU7XHJcbiAgICAgICAgaWYgKGEgPCAwICE9PSBuLnNpZ24pIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3VidHJhY3Qobi5uZWdhdGUoKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciBiID0gbi52YWx1ZTtcclxuICAgICAgICBpZiAobi5pc1NtYWxsKSB7XHJcbiAgICAgICAgICAgIGlmIChpc1ByZWNpc2UoYSArIGIpKSByZXR1cm4gbmV3IFNtYWxsSW50ZWdlcihhICsgYik7XHJcbiAgICAgICAgICAgIGIgPSBzbWFsbFRvQXJyYXkoTWF0aC5hYnMoYikpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbmV3IEJpZ0ludGVnZXIoYWRkU21hbGwoYiwgTWF0aC5hYnMoYSkpLCBhIDwgMCk7XHJcbiAgICB9O1xyXG4gICAgU21hbGxJbnRlZ2VyLnByb3RvdHlwZS5wbHVzID0gU21hbGxJbnRlZ2VyLnByb3RvdHlwZS5hZGQ7XHJcblxyXG4gICAgTmF0aXZlQmlnSW50LnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiAodikge1xyXG4gICAgICAgIHJldHVybiBuZXcgTmF0aXZlQmlnSW50KHRoaXMudmFsdWUgKyBwYXJzZVZhbHVlKHYpLnZhbHVlKTtcclxuICAgIH1cclxuICAgIE5hdGl2ZUJpZ0ludC5wcm90b3R5cGUucGx1cyA9IE5hdGl2ZUJpZ0ludC5wcm90b3R5cGUuYWRkO1xyXG5cclxuICAgIGZ1bmN0aW9uIHN1YnRyYWN0KGEsIGIpIHsgLy8gYXNzdW1lcyBhIGFuZCBiIGFyZSBhcnJheXMgd2l0aCBhID49IGJcclxuICAgICAgICB2YXIgYV9sID0gYS5sZW5ndGgsXHJcbiAgICAgICAgICAgIGJfbCA9IGIubGVuZ3RoLFxyXG4gICAgICAgICAgICByID0gbmV3IEFycmF5KGFfbCksXHJcbiAgICAgICAgICAgIGJvcnJvdyA9IDAsXHJcbiAgICAgICAgICAgIGJhc2UgPSBCQVNFLFxyXG4gICAgICAgICAgICBpLCBkaWZmZXJlbmNlO1xyXG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBiX2w7IGkrKykge1xyXG4gICAgICAgICAgICBkaWZmZXJlbmNlID0gYVtpXSAtIGJvcnJvdyAtIGJbaV07XHJcbiAgICAgICAgICAgIGlmIChkaWZmZXJlbmNlIDwgMCkge1xyXG4gICAgICAgICAgICAgICAgZGlmZmVyZW5jZSArPSBiYXNlO1xyXG4gICAgICAgICAgICAgICAgYm9ycm93ID0gMTtcclxuICAgICAgICAgICAgfSBlbHNlIGJvcnJvdyA9IDA7XHJcbiAgICAgICAgICAgIHJbaV0gPSBkaWZmZXJlbmNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmb3IgKGkgPSBiX2w7IGkgPCBhX2w7IGkrKykge1xyXG4gICAgICAgICAgICBkaWZmZXJlbmNlID0gYVtpXSAtIGJvcnJvdztcclxuICAgICAgICAgICAgaWYgKGRpZmZlcmVuY2UgPCAwKSBkaWZmZXJlbmNlICs9IGJhc2U7XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcltpKytdID0gZGlmZmVyZW5jZTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJbaV0gPSBkaWZmZXJlbmNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmb3IgKDsgaSA8IGFfbDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHJbaV0gPSBhW2ldO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0cmltKHIpO1xyXG4gICAgICAgIHJldHVybiByO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIHN1YnRyYWN0QW55KGEsIGIsIHNpZ24pIHtcclxuICAgICAgICB2YXIgdmFsdWU7XHJcbiAgICAgICAgaWYgKGNvbXBhcmVBYnMoYSwgYikgPj0gMCkge1xyXG4gICAgICAgICAgICB2YWx1ZSA9IHN1YnRyYWN0KGEsIGIpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHZhbHVlID0gc3VidHJhY3QoYiwgYSk7XHJcbiAgICAgICAgICAgIHNpZ24gPSAhc2lnbjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFsdWUgPSBhcnJheVRvU21hbGwodmFsdWUpO1xyXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIpIHtcclxuICAgICAgICAgICAgaWYgKHNpZ24pIHZhbHVlID0gLXZhbHVlO1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3IFNtYWxsSW50ZWdlcih2YWx1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBuZXcgQmlnSW50ZWdlcih2YWx1ZSwgc2lnbik7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gc3VidHJhY3RTbWFsbChhLCBiLCBzaWduKSB7IC8vIGFzc3VtZXMgYSBpcyBhcnJheSwgYiBpcyBudW1iZXIgd2l0aCAwIDw9IGIgPCBNQVhfSU5UXHJcbiAgICAgICAgdmFyIGwgPSBhLmxlbmd0aCxcclxuICAgICAgICAgICAgciA9IG5ldyBBcnJheShsKSxcclxuICAgICAgICAgICAgY2FycnkgPSAtYixcclxuICAgICAgICAgICAgYmFzZSA9IEJBU0UsXHJcbiAgICAgICAgICAgIGksIGRpZmZlcmVuY2U7XHJcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGw7IGkrKykge1xyXG4gICAgICAgICAgICBkaWZmZXJlbmNlID0gYVtpXSArIGNhcnJ5O1xyXG4gICAgICAgICAgICBjYXJyeSA9IE1hdGguZmxvb3IoZGlmZmVyZW5jZSAvIGJhc2UpO1xyXG4gICAgICAgICAgICBkaWZmZXJlbmNlICU9IGJhc2U7XHJcbiAgICAgICAgICAgIHJbaV0gPSBkaWZmZXJlbmNlIDwgMCA/IGRpZmZlcmVuY2UgKyBiYXNlIDogZGlmZmVyZW5jZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgciA9IGFycmF5VG9TbWFsbChyKTtcclxuICAgICAgICBpZiAodHlwZW9mIHIgPT09IFwibnVtYmVyXCIpIHtcclxuICAgICAgICAgICAgaWYgKHNpZ24pIHIgPSAtcjtcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBTbWFsbEludGVnZXIocik7XHJcbiAgICAgICAgfSByZXR1cm4gbmV3IEJpZ0ludGVnZXIociwgc2lnbik7XHJcbiAgICB9XHJcblxyXG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUuc3VidHJhY3QgPSBmdW5jdGlvbiAodikge1xyXG4gICAgICAgIHZhciBuID0gcGFyc2VWYWx1ZSh2KTtcclxuICAgICAgICBpZiAodGhpcy5zaWduICE9PSBuLnNpZ24pIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYWRkKG4ubmVnYXRlKCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgYSA9IHRoaXMudmFsdWUsIGIgPSBuLnZhbHVlO1xyXG4gICAgICAgIGlmIChuLmlzU21hbGwpXHJcbiAgICAgICAgICAgIHJldHVybiBzdWJ0cmFjdFNtYWxsKGEsIE1hdGguYWJzKGIpLCB0aGlzLnNpZ24pO1xyXG4gICAgICAgIHJldHVybiBzdWJ0cmFjdEFueShhLCBiLCB0aGlzLnNpZ24pO1xyXG4gICAgfTtcclxuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLm1pbnVzID0gQmlnSW50ZWdlci5wcm90b3R5cGUuc3VidHJhY3Q7XHJcblxyXG4gICAgU21hbGxJbnRlZ2VyLnByb3RvdHlwZS5zdWJ0cmFjdCA9IGZ1bmN0aW9uICh2KSB7XHJcbiAgICAgICAgdmFyIG4gPSBwYXJzZVZhbHVlKHYpO1xyXG4gICAgICAgIHZhciBhID0gdGhpcy52YWx1ZTtcclxuICAgICAgICBpZiAoYSA8IDAgIT09IG4uc2lnbikge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5hZGQobi5uZWdhdGUoKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciBiID0gbi52YWx1ZTtcclxuICAgICAgICBpZiAobi5pc1NtYWxsKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgU21hbGxJbnRlZ2VyKGEgLSBiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHN1YnRyYWN0U21hbGwoYiwgTWF0aC5hYnMoYSksIGEgPj0gMCk7XHJcbiAgICB9O1xyXG4gICAgU21hbGxJbnRlZ2VyLnByb3RvdHlwZS5taW51cyA9IFNtYWxsSW50ZWdlci5wcm90b3R5cGUuc3VidHJhY3Q7XHJcblxyXG4gICAgTmF0aXZlQmlnSW50LnByb3RvdHlwZS5zdWJ0cmFjdCA9IGZ1bmN0aW9uICh2KSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBOYXRpdmVCaWdJbnQodGhpcy52YWx1ZSAtIHBhcnNlVmFsdWUodikudmFsdWUpO1xyXG4gICAgfVxyXG4gICAgTmF0aXZlQmlnSW50LnByb3RvdHlwZS5taW51cyA9IE5hdGl2ZUJpZ0ludC5wcm90b3R5cGUuc3VidHJhY3Q7XHJcblxyXG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUubmVnYXRlID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHJldHVybiBuZXcgQmlnSW50ZWdlcih0aGlzLnZhbHVlLCAhdGhpcy5zaWduKTtcclxuICAgIH07XHJcbiAgICBTbWFsbEludGVnZXIucHJvdG90eXBlLm5lZ2F0ZSA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICB2YXIgc2lnbiA9IHRoaXMuc2lnbjtcclxuICAgICAgICB2YXIgc21hbGwgPSBuZXcgU21hbGxJbnRlZ2VyKC10aGlzLnZhbHVlKTtcclxuICAgICAgICBzbWFsbC5zaWduID0gIXNpZ247XHJcbiAgICAgICAgcmV0dXJuIHNtYWxsO1xyXG4gICAgfTtcclxuICAgIE5hdGl2ZUJpZ0ludC5wcm90b3R5cGUubmVnYXRlID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHJldHVybiBuZXcgTmF0aXZlQmlnSW50KC10aGlzLnZhbHVlKTtcclxuICAgIH1cclxuXHJcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5hYnMgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBCaWdJbnRlZ2VyKHRoaXMudmFsdWUsIGZhbHNlKTtcclxuICAgIH07XHJcbiAgICBTbWFsbEludGVnZXIucHJvdG90eXBlLmFicyA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICByZXR1cm4gbmV3IFNtYWxsSW50ZWdlcihNYXRoLmFicyh0aGlzLnZhbHVlKSk7XHJcbiAgICB9O1xyXG4gICAgTmF0aXZlQmlnSW50LnByb3RvdHlwZS5hYnMgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBOYXRpdmVCaWdJbnQodGhpcy52YWx1ZSA+PSAwID8gdGhpcy52YWx1ZSA6IC10aGlzLnZhbHVlKTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgZnVuY3Rpb24gbXVsdGlwbHlMb25nKGEsIGIpIHtcclxuICAgICAgICB2YXIgYV9sID0gYS5sZW5ndGgsXHJcbiAgICAgICAgICAgIGJfbCA9IGIubGVuZ3RoLFxyXG4gICAgICAgICAgICBsID0gYV9sICsgYl9sLFxyXG4gICAgICAgICAgICByID0gY3JlYXRlQXJyYXkobCksXHJcbiAgICAgICAgICAgIGJhc2UgPSBCQVNFLFxyXG4gICAgICAgICAgICBwcm9kdWN0LCBjYXJyeSwgaSwgYV9pLCBiX2o7XHJcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGFfbDsgKytpKSB7XHJcbiAgICAgICAgICAgIGFfaSA9IGFbaV07XHJcbiAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgYl9sOyArK2opIHtcclxuICAgICAgICAgICAgICAgIGJfaiA9IGJbal07XHJcbiAgICAgICAgICAgICAgICBwcm9kdWN0ID0gYV9pICogYl9qICsgcltpICsgal07XHJcbiAgICAgICAgICAgICAgICBjYXJyeSA9IE1hdGguZmxvb3IocHJvZHVjdCAvIGJhc2UpO1xyXG4gICAgICAgICAgICAgICAgcltpICsgal0gPSBwcm9kdWN0IC0gY2FycnkgKiBiYXNlO1xyXG4gICAgICAgICAgICAgICAgcltpICsgaiArIDFdICs9IGNhcnJ5O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRyaW0ocik7XHJcbiAgICAgICAgcmV0dXJuIHI7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gbXVsdGlwbHlTbWFsbChhLCBiKSB7IC8vIGFzc3VtZXMgYSBpcyBhcnJheSwgYiBpcyBudW1iZXIgd2l0aCB8YnwgPCBCQVNFXHJcbiAgICAgICAgdmFyIGwgPSBhLmxlbmd0aCxcclxuICAgICAgICAgICAgciA9IG5ldyBBcnJheShsKSxcclxuICAgICAgICAgICAgYmFzZSA9IEJBU0UsXHJcbiAgICAgICAgICAgIGNhcnJ5ID0gMCxcclxuICAgICAgICAgICAgcHJvZHVjdCwgaTtcclxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHByb2R1Y3QgPSBhW2ldICogYiArIGNhcnJ5O1xyXG4gICAgICAgICAgICBjYXJyeSA9IE1hdGguZmxvb3IocHJvZHVjdCAvIGJhc2UpO1xyXG4gICAgICAgICAgICByW2ldID0gcHJvZHVjdCAtIGNhcnJ5ICogYmFzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgd2hpbGUgKGNhcnJ5ID4gMCkge1xyXG4gICAgICAgICAgICByW2krK10gPSBjYXJyeSAlIGJhc2U7XHJcbiAgICAgICAgICAgIGNhcnJ5ID0gTWF0aC5mbG9vcihjYXJyeSAvIGJhc2UpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcjtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBzaGlmdExlZnQoeCwgbikge1xyXG4gICAgICAgIHZhciByID0gW107XHJcbiAgICAgICAgd2hpbGUgKG4tLSA+IDApIHIucHVzaCgwKTtcclxuICAgICAgICByZXR1cm4gci5jb25jYXQoeCk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gbXVsdGlwbHlLYXJhdHN1YmEoeCwgeSkge1xyXG4gICAgICAgIHZhciBuID0gTWF0aC5tYXgoeC5sZW5ndGgsIHkubGVuZ3RoKTtcclxuXHJcbiAgICAgICAgaWYgKG4gPD0gMzApIHJldHVybiBtdWx0aXBseUxvbmcoeCwgeSk7XHJcbiAgICAgICAgbiA9IE1hdGguY2VpbChuIC8gMik7XHJcblxyXG4gICAgICAgIHZhciBiID0geC5zbGljZShuKSxcclxuICAgICAgICAgICAgYSA9IHguc2xpY2UoMCwgbiksXHJcbiAgICAgICAgICAgIGQgPSB5LnNsaWNlKG4pLFxyXG4gICAgICAgICAgICBjID0geS5zbGljZSgwLCBuKTtcclxuXHJcbiAgICAgICAgdmFyIGFjID0gbXVsdGlwbHlLYXJhdHN1YmEoYSwgYyksXHJcbiAgICAgICAgICAgIGJkID0gbXVsdGlwbHlLYXJhdHN1YmEoYiwgZCksXHJcbiAgICAgICAgICAgIGFiY2QgPSBtdWx0aXBseUthcmF0c3ViYShhZGRBbnkoYSwgYiksIGFkZEFueShjLCBkKSk7XHJcblxyXG4gICAgICAgIHZhciBwcm9kdWN0ID0gYWRkQW55KGFkZEFueShhYywgc2hpZnRMZWZ0KHN1YnRyYWN0KHN1YnRyYWN0KGFiY2QsIGFjKSwgYmQpLCBuKSksIHNoaWZ0TGVmdChiZCwgMiAqIG4pKTtcclxuICAgICAgICB0cmltKHByb2R1Y3QpO1xyXG4gICAgICAgIHJldHVybiBwcm9kdWN0O1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb24gaXMgZGVyaXZlZCBmcm9tIGEgc3VyZmFjZSBmaXQgb2YgYSBncmFwaCBwbG90dGluZyB0aGUgcGVyZm9ybWFuY2UgZGlmZmVyZW5jZVxyXG4gICAgLy8gYmV0d2VlbiBsb25nIG11bHRpcGxpY2F0aW9uIGFuZCBrYXJhdHN1YmEgbXVsdGlwbGljYXRpb24gdmVyc3VzIHRoZSBsZW5ndGhzIG9mIHRoZSB0d28gYXJyYXlzLlxyXG4gICAgZnVuY3Rpb24gdXNlS2FyYXRzdWJhKGwxLCBsMikge1xyXG4gICAgICAgIHJldHVybiAtMC4wMTIgKiBsMSAtIDAuMDEyICogbDIgKyAwLjAwMDAxNSAqIGwxICogbDIgPiAwO1xyXG4gICAgfVxyXG5cclxuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLm11bHRpcGx5ID0gZnVuY3Rpb24gKHYpIHtcclxuICAgICAgICB2YXIgbiA9IHBhcnNlVmFsdWUodiksXHJcbiAgICAgICAgICAgIGEgPSB0aGlzLnZhbHVlLCBiID0gbi52YWx1ZSxcclxuICAgICAgICAgICAgc2lnbiA9IHRoaXMuc2lnbiAhPT0gbi5zaWduLFxyXG4gICAgICAgICAgICBhYnM7XHJcbiAgICAgICAgaWYgKG4uaXNTbWFsbCkge1xyXG4gICAgICAgICAgICBpZiAoYiA9PT0gMCkgcmV0dXJuIEludGVnZXJbMF07XHJcbiAgICAgICAgICAgIGlmIChiID09PSAxKSByZXR1cm4gdGhpcztcclxuICAgICAgICAgICAgaWYgKGIgPT09IC0xKSByZXR1cm4gdGhpcy5uZWdhdGUoKTtcclxuICAgICAgICAgICAgYWJzID0gTWF0aC5hYnMoYik7XHJcbiAgICAgICAgICAgIGlmIChhYnMgPCBCQVNFKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEJpZ0ludGVnZXIobXVsdGlwbHlTbWFsbChhLCBhYnMpLCBzaWduKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBiID0gc21hbGxUb0FycmF5KGFicyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh1c2VLYXJhdHN1YmEoYS5sZW5ndGgsIGIubGVuZ3RoKSkgLy8gS2FyYXRzdWJhIGlzIG9ubHkgZmFzdGVyIGZvciBjZXJ0YWluIGFycmF5IHNpemVzXHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgQmlnSW50ZWdlcihtdWx0aXBseUthcmF0c3ViYShhLCBiKSwgc2lnbik7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBCaWdJbnRlZ2VyKG11bHRpcGx5TG9uZyhhLCBiKSwgc2lnbik7XHJcbiAgICB9O1xyXG5cclxuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLnRpbWVzID0gQmlnSW50ZWdlci5wcm90b3R5cGUubXVsdGlwbHk7XHJcblxyXG4gICAgZnVuY3Rpb24gbXVsdGlwbHlTbWFsbEFuZEFycmF5KGEsIGIsIHNpZ24pIHsgLy8gYSA+PSAwXHJcbiAgICAgICAgaWYgKGEgPCBCQVNFKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgQmlnSW50ZWdlcihtdWx0aXBseVNtYWxsKGIsIGEpLCBzaWduKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG5ldyBCaWdJbnRlZ2VyKG11bHRpcGx5TG9uZyhiLCBzbWFsbFRvQXJyYXkoYSkpLCBzaWduKTtcclxuICAgIH1cclxuICAgIFNtYWxsSW50ZWdlci5wcm90b3R5cGUuX211bHRpcGx5QnlTbWFsbCA9IGZ1bmN0aW9uIChhKSB7XHJcbiAgICAgICAgaWYgKGlzUHJlY2lzZShhLnZhbHVlICogdGhpcy52YWx1ZSkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBTbWFsbEludGVnZXIoYS52YWx1ZSAqIHRoaXMudmFsdWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbXVsdGlwbHlTbWFsbEFuZEFycmF5KE1hdGguYWJzKGEudmFsdWUpLCBzbWFsbFRvQXJyYXkoTWF0aC5hYnModGhpcy52YWx1ZSkpLCB0aGlzLnNpZ24gIT09IGEuc2lnbik7XHJcbiAgICB9O1xyXG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUuX211bHRpcGx5QnlTbWFsbCA9IGZ1bmN0aW9uIChhKSB7XHJcbiAgICAgICAgaWYgKGEudmFsdWUgPT09IDApIHJldHVybiBJbnRlZ2VyWzBdO1xyXG4gICAgICAgIGlmIChhLnZhbHVlID09PSAxKSByZXR1cm4gdGhpcztcclxuICAgICAgICBpZiAoYS52YWx1ZSA9PT0gLTEpIHJldHVybiB0aGlzLm5lZ2F0ZSgpO1xyXG4gICAgICAgIHJldHVybiBtdWx0aXBseVNtYWxsQW5kQXJyYXkoTWF0aC5hYnMoYS52YWx1ZSksIHRoaXMudmFsdWUsIHRoaXMuc2lnbiAhPT0gYS5zaWduKTtcclxuICAgIH07XHJcbiAgICBTbWFsbEludGVnZXIucHJvdG90eXBlLm11bHRpcGx5ID0gZnVuY3Rpb24gKHYpIHtcclxuICAgICAgICByZXR1cm4gcGFyc2VWYWx1ZSh2KS5fbXVsdGlwbHlCeVNtYWxsKHRoaXMpO1xyXG4gICAgfTtcclxuICAgIFNtYWxsSW50ZWdlci5wcm90b3R5cGUudGltZXMgPSBTbWFsbEludGVnZXIucHJvdG90eXBlLm11bHRpcGx5O1xyXG5cclxuICAgIE5hdGl2ZUJpZ0ludC5wcm90b3R5cGUubXVsdGlwbHkgPSBmdW5jdGlvbiAodikge1xyXG4gICAgICAgIHJldHVybiBuZXcgTmF0aXZlQmlnSW50KHRoaXMudmFsdWUgKiBwYXJzZVZhbHVlKHYpLnZhbHVlKTtcclxuICAgIH1cclxuICAgIE5hdGl2ZUJpZ0ludC5wcm90b3R5cGUudGltZXMgPSBOYXRpdmVCaWdJbnQucHJvdG90eXBlLm11bHRpcGx5O1xyXG5cclxuICAgIGZ1bmN0aW9uIHNxdWFyZShhKSB7XHJcbiAgICAgICAgLy9jb25zb2xlLmFzc2VydCgyICogQkFTRSAqIEJBU0UgPCBNQVhfSU5UKTtcclxuICAgICAgICB2YXIgbCA9IGEubGVuZ3RoLFxyXG4gICAgICAgICAgICByID0gY3JlYXRlQXJyYXkobCArIGwpLFxyXG4gICAgICAgICAgICBiYXNlID0gQkFTRSxcclxuICAgICAgICAgICAgcHJvZHVjdCwgY2FycnksIGksIGFfaSwgYV9qO1xyXG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBsOyBpKyspIHtcclxuICAgICAgICAgICAgYV9pID0gYVtpXTtcclxuICAgICAgICAgICAgY2FycnkgPSAwIC0gYV9pICogYV9pO1xyXG4gICAgICAgICAgICBmb3IgKHZhciBqID0gaTsgaiA8IGw7IGorKykge1xyXG4gICAgICAgICAgICAgICAgYV9qID0gYVtqXTtcclxuICAgICAgICAgICAgICAgIHByb2R1Y3QgPSAyICogKGFfaSAqIGFfaikgKyByW2kgKyBqXSArIGNhcnJ5O1xyXG4gICAgICAgICAgICAgICAgY2FycnkgPSBNYXRoLmZsb29yKHByb2R1Y3QgLyBiYXNlKTtcclxuICAgICAgICAgICAgICAgIHJbaSArIGpdID0gcHJvZHVjdCAtIGNhcnJ5ICogYmFzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByW2kgKyBsXSA9IGNhcnJ5O1xyXG4gICAgICAgIH1cclxuICAgICAgICB0cmltKHIpO1xyXG4gICAgICAgIHJldHVybiByO1xyXG4gICAgfVxyXG5cclxuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLnNxdWFyZSA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICByZXR1cm4gbmV3IEJpZ0ludGVnZXIoc3F1YXJlKHRoaXMudmFsdWUpLCBmYWxzZSk7XHJcbiAgICB9O1xyXG5cclxuICAgIFNtYWxsSW50ZWdlci5wcm90b3R5cGUuc3F1YXJlID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHZhciB2YWx1ZSA9IHRoaXMudmFsdWUgKiB0aGlzLnZhbHVlO1xyXG4gICAgICAgIGlmIChpc1ByZWNpc2UodmFsdWUpKSByZXR1cm4gbmV3IFNtYWxsSW50ZWdlcih2YWx1ZSk7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBCaWdJbnRlZ2VyKHNxdWFyZShzbWFsbFRvQXJyYXkoTWF0aC5hYnModGhpcy52YWx1ZSkpKSwgZmFsc2UpO1xyXG4gICAgfTtcclxuXHJcbiAgICBOYXRpdmVCaWdJbnQucHJvdG90eXBlLnNxdWFyZSA9IGZ1bmN0aW9uICh2KSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBOYXRpdmVCaWdJbnQodGhpcy52YWx1ZSAqIHRoaXMudmFsdWUpO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGRpdk1vZDEoYSwgYikgeyAvLyBMZWZ0IG92ZXIgZnJvbSBwcmV2aW91cyB2ZXJzaW9uLiBQZXJmb3JtcyBmYXN0ZXIgdGhhbiBkaXZNb2QyIG9uIHNtYWxsZXIgaW5wdXQgc2l6ZXMuXHJcbiAgICAgICAgdmFyIGFfbCA9IGEubGVuZ3RoLFxyXG4gICAgICAgICAgICBiX2wgPSBiLmxlbmd0aCxcclxuICAgICAgICAgICAgYmFzZSA9IEJBU0UsXHJcbiAgICAgICAgICAgIHJlc3VsdCA9IGNyZWF0ZUFycmF5KGIubGVuZ3RoKSxcclxuICAgICAgICAgICAgZGl2aXNvck1vc3RTaWduaWZpY2FudERpZ2l0ID0gYltiX2wgLSAxXSxcclxuICAgICAgICAgICAgLy8gbm9ybWFsaXphdGlvblxyXG4gICAgICAgICAgICBsYW1iZGEgPSBNYXRoLmNlaWwoYmFzZSAvICgyICogZGl2aXNvck1vc3RTaWduaWZpY2FudERpZ2l0KSksXHJcbiAgICAgICAgICAgIHJlbWFpbmRlciA9IG11bHRpcGx5U21hbGwoYSwgbGFtYmRhKSxcclxuICAgICAgICAgICAgZGl2aXNvciA9IG11bHRpcGx5U21hbGwoYiwgbGFtYmRhKSxcclxuICAgICAgICAgICAgcXVvdGllbnREaWdpdCwgc2hpZnQsIGNhcnJ5LCBib3Jyb3csIGksIGwsIHE7XHJcbiAgICAgICAgaWYgKHJlbWFpbmRlci5sZW5ndGggPD0gYV9sKSByZW1haW5kZXIucHVzaCgwKTtcclxuICAgICAgICBkaXZpc29yLnB1c2goMCk7XHJcbiAgICAgICAgZGl2aXNvck1vc3RTaWduaWZpY2FudERpZ2l0ID0gZGl2aXNvcltiX2wgLSAxXTtcclxuICAgICAgICBmb3IgKHNoaWZ0ID0gYV9sIC0gYl9sOyBzaGlmdCA+PSAwOyBzaGlmdC0tKSB7XHJcbiAgICAgICAgICAgIHF1b3RpZW50RGlnaXQgPSBiYXNlIC0gMTtcclxuICAgICAgICAgICAgaWYgKHJlbWFpbmRlcltzaGlmdCArIGJfbF0gIT09IGRpdmlzb3JNb3N0U2lnbmlmaWNhbnREaWdpdCkge1xyXG4gICAgICAgICAgICAgICAgcXVvdGllbnREaWdpdCA9IE1hdGguZmxvb3IoKHJlbWFpbmRlcltzaGlmdCArIGJfbF0gKiBiYXNlICsgcmVtYWluZGVyW3NoaWZ0ICsgYl9sIC0gMV0pIC8gZGl2aXNvck1vc3RTaWduaWZpY2FudERpZ2l0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvLyBxdW90aWVudERpZ2l0IDw9IGJhc2UgLSAxXHJcbiAgICAgICAgICAgIGNhcnJ5ID0gMDtcclxuICAgICAgICAgICAgYm9ycm93ID0gMDtcclxuICAgICAgICAgICAgbCA9IGRpdmlzb3IubGVuZ3RoO1xyXG4gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBjYXJyeSArPSBxdW90aWVudERpZ2l0ICogZGl2aXNvcltpXTtcclxuICAgICAgICAgICAgICAgIHEgPSBNYXRoLmZsb29yKGNhcnJ5IC8gYmFzZSk7XHJcbiAgICAgICAgICAgICAgICBib3Jyb3cgKz0gcmVtYWluZGVyW3NoaWZ0ICsgaV0gLSAoY2FycnkgLSBxICogYmFzZSk7XHJcbiAgICAgICAgICAgICAgICBjYXJyeSA9IHE7XHJcbiAgICAgICAgICAgICAgICBpZiAoYm9ycm93IDwgMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlbWFpbmRlcltzaGlmdCArIGldID0gYm9ycm93ICsgYmFzZTtcclxuICAgICAgICAgICAgICAgICAgICBib3Jyb3cgPSAtMTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVtYWluZGVyW3NoaWZ0ICsgaV0gPSBib3Jyb3c7XHJcbiAgICAgICAgICAgICAgICAgICAgYm9ycm93ID0gMDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB3aGlsZSAoYm9ycm93ICE9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICBxdW90aWVudERpZ2l0IC09IDE7XHJcbiAgICAgICAgICAgICAgICBjYXJyeSA9IDA7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FycnkgKz0gcmVtYWluZGVyW3NoaWZ0ICsgaV0gLSBiYXNlICsgZGl2aXNvcltpXTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoY2FycnkgPCAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlbWFpbmRlcltzaGlmdCArIGldID0gY2FycnkgKyBiYXNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXJyeSA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVtYWluZGVyW3NoaWZ0ICsgaV0gPSBjYXJyeTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2FycnkgPSAxO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGJvcnJvdyArPSBjYXJyeTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXN1bHRbc2hpZnRdID0gcXVvdGllbnREaWdpdDtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gZGVub3JtYWxpemF0aW9uXHJcbiAgICAgICAgcmVtYWluZGVyID0gZGl2TW9kU21hbGwocmVtYWluZGVyLCBsYW1iZGEpWzBdO1xyXG4gICAgICAgIHJldHVybiBbYXJyYXlUb1NtYWxsKHJlc3VsdCksIGFycmF5VG9TbWFsbChyZW1haW5kZXIpXTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBkaXZNb2QyKGEsIGIpIHsgLy8gSW1wbGVtZW50YXRpb24gaWRlYSBzaGFtZWxlc3NseSBzdG9sZW4gZnJvbSBTaWxlbnQgTWF0dCdzIGxpYnJhcnkgaHR0cDovL3NpbGVudG1hdHQuY29tL2JpZ2ludGVnZXIvXHJcbiAgICAgICAgLy8gUGVyZm9ybXMgZmFzdGVyIHRoYW4gZGl2TW9kMSBvbiBsYXJnZXIgaW5wdXQgc2l6ZXMuXHJcbiAgICAgICAgdmFyIGFfbCA9IGEubGVuZ3RoLFxyXG4gICAgICAgICAgICBiX2wgPSBiLmxlbmd0aCxcclxuICAgICAgICAgICAgcmVzdWx0ID0gW10sXHJcbiAgICAgICAgICAgIHBhcnQgPSBbXSxcclxuICAgICAgICAgICAgYmFzZSA9IEJBU0UsXHJcbiAgICAgICAgICAgIGd1ZXNzLCB4bGVuLCBoaWdoeCwgaGlnaHksIGNoZWNrO1xyXG4gICAgICAgIHdoaWxlIChhX2wpIHtcclxuICAgICAgICAgICAgcGFydC51bnNoaWZ0KGFbLS1hX2xdKTtcclxuICAgICAgICAgICAgdHJpbShwYXJ0KTtcclxuICAgICAgICAgICAgaWYgKGNvbXBhcmVBYnMocGFydCwgYikgPCAwKSB7XHJcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaCgwKTtcclxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHhsZW4gPSBwYXJ0Lmxlbmd0aDtcclxuICAgICAgICAgICAgaGlnaHggPSBwYXJ0W3hsZW4gLSAxXSAqIGJhc2UgKyBwYXJ0W3hsZW4gLSAyXTtcclxuICAgICAgICAgICAgaGlnaHkgPSBiW2JfbCAtIDFdICogYmFzZSArIGJbYl9sIC0gMl07XHJcbiAgICAgICAgICAgIGlmICh4bGVuID4gYl9sKSB7XHJcbiAgICAgICAgICAgICAgICBoaWdoeCA9IChoaWdoeCArIDEpICogYmFzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBndWVzcyA9IE1hdGguY2VpbChoaWdoeCAvIGhpZ2h5KTtcclxuICAgICAgICAgICAgZG8ge1xyXG4gICAgICAgICAgICAgICAgY2hlY2sgPSBtdWx0aXBseVNtYWxsKGIsIGd1ZXNzKTtcclxuICAgICAgICAgICAgICAgIGlmIChjb21wYXJlQWJzKGNoZWNrLCBwYXJ0KSA8PSAwKSBicmVhaztcclxuICAgICAgICAgICAgICAgIGd1ZXNzLS07XHJcbiAgICAgICAgICAgIH0gd2hpbGUgKGd1ZXNzKTtcclxuICAgICAgICAgICAgcmVzdWx0LnB1c2goZ3Vlc3MpO1xyXG4gICAgICAgICAgICBwYXJ0ID0gc3VidHJhY3QocGFydCwgY2hlY2spO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXN1bHQucmV2ZXJzZSgpO1xyXG4gICAgICAgIHJldHVybiBbYXJyYXlUb1NtYWxsKHJlc3VsdCksIGFycmF5VG9TbWFsbChwYXJ0KV07XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gZGl2TW9kU21hbGwodmFsdWUsIGxhbWJkYSkge1xyXG4gICAgICAgIHZhciBsZW5ndGggPSB2YWx1ZS5sZW5ndGgsXHJcbiAgICAgICAgICAgIHF1b3RpZW50ID0gY3JlYXRlQXJyYXkobGVuZ3RoKSxcclxuICAgICAgICAgICAgYmFzZSA9IEJBU0UsXHJcbiAgICAgICAgICAgIGksIHEsIHJlbWFpbmRlciwgZGl2aXNvcjtcclxuICAgICAgICByZW1haW5kZXIgPSAwO1xyXG4gICAgICAgIGZvciAoaSA9IGxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XHJcbiAgICAgICAgICAgIGRpdmlzb3IgPSByZW1haW5kZXIgKiBiYXNlICsgdmFsdWVbaV07XHJcbiAgICAgICAgICAgIHEgPSB0cnVuY2F0ZShkaXZpc29yIC8gbGFtYmRhKTtcclxuICAgICAgICAgICAgcmVtYWluZGVyID0gZGl2aXNvciAtIHEgKiBsYW1iZGE7XHJcbiAgICAgICAgICAgIHF1b3RpZW50W2ldID0gcSB8IDA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBbcXVvdGllbnQsIHJlbWFpbmRlciB8IDBdO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGRpdk1vZEFueShzZWxmLCB2KSB7XHJcbiAgICAgICAgdmFyIHZhbHVlLCBuID0gcGFyc2VWYWx1ZSh2KTtcclxuICAgICAgICBpZiAoc3VwcG9ydHNOYXRpdmVCaWdJbnQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFtuZXcgTmF0aXZlQmlnSW50KHNlbGYudmFsdWUgLyBuLnZhbHVlKSwgbmV3IE5hdGl2ZUJpZ0ludChzZWxmLnZhbHVlICUgbi52YWx1ZSldO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgYSA9IHNlbGYudmFsdWUsIGIgPSBuLnZhbHVlO1xyXG4gICAgICAgIHZhciBxdW90aWVudDtcclxuICAgICAgICBpZiAoYiA9PT0gMCkgdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IGRpdmlkZSBieSB6ZXJvXCIpO1xyXG4gICAgICAgIGlmIChzZWxmLmlzU21hbGwpIHtcclxuICAgICAgICAgICAgaWYgKG4uaXNTbWFsbCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFtuZXcgU21hbGxJbnRlZ2VyKHRydW5jYXRlKGEgLyBiKSksIG5ldyBTbWFsbEludGVnZXIoYSAlIGIpXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gW0ludGVnZXJbMF0sIHNlbGZdO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobi5pc1NtYWxsKSB7XHJcbiAgICAgICAgICAgIGlmIChiID09PSAxKSByZXR1cm4gW3NlbGYsIEludGVnZXJbMF1dO1xyXG4gICAgICAgICAgICBpZiAoYiA9PSAtMSkgcmV0dXJuIFtzZWxmLm5lZ2F0ZSgpLCBJbnRlZ2VyWzBdXTtcclxuICAgICAgICAgICAgdmFyIGFicyA9IE1hdGguYWJzKGIpO1xyXG4gICAgICAgICAgICBpZiAoYWJzIDwgQkFTRSkge1xyXG4gICAgICAgICAgICAgICAgdmFsdWUgPSBkaXZNb2RTbWFsbChhLCBhYnMpO1xyXG4gICAgICAgICAgICAgICAgcXVvdGllbnQgPSBhcnJheVRvU21hbGwodmFsdWVbMF0pO1xyXG4gICAgICAgICAgICAgICAgdmFyIHJlbWFpbmRlciA9IHZhbHVlWzFdO1xyXG4gICAgICAgICAgICAgICAgaWYgKHNlbGYuc2lnbikgcmVtYWluZGVyID0gLXJlbWFpbmRlcjtcclxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcXVvdGllbnQgPT09IFwibnVtYmVyXCIpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5zaWduICE9PSBuLnNpZ24pIHF1b3RpZW50ID0gLXF1b3RpZW50O1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbbmV3IFNtYWxsSW50ZWdlcihxdW90aWVudCksIG5ldyBTbWFsbEludGVnZXIocmVtYWluZGVyKV07XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gW25ldyBCaWdJbnRlZ2VyKHF1b3RpZW50LCBzZWxmLnNpZ24gIT09IG4uc2lnbiksIG5ldyBTbWFsbEludGVnZXIocmVtYWluZGVyKV07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYiA9IHNtYWxsVG9BcnJheShhYnMpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgY29tcGFyaXNvbiA9IGNvbXBhcmVBYnMoYSwgYik7XHJcbiAgICAgICAgaWYgKGNvbXBhcmlzb24gPT09IC0xKSByZXR1cm4gW0ludGVnZXJbMF0sIHNlbGZdO1xyXG4gICAgICAgIGlmIChjb21wYXJpc29uID09PSAwKSByZXR1cm4gW0ludGVnZXJbc2VsZi5zaWduID09PSBuLnNpZ24gPyAxIDogLTFdLCBJbnRlZ2VyWzBdXTtcclxuXHJcbiAgICAgICAgLy8gZGl2TW9kMSBpcyBmYXN0ZXIgb24gc21hbGxlciBpbnB1dCBzaXplc1xyXG4gICAgICAgIGlmIChhLmxlbmd0aCArIGIubGVuZ3RoIDw9IDIwMClcclxuICAgICAgICAgICAgdmFsdWUgPSBkaXZNb2QxKGEsIGIpO1xyXG4gICAgICAgIGVsc2UgdmFsdWUgPSBkaXZNb2QyKGEsIGIpO1xyXG5cclxuICAgICAgICBxdW90aWVudCA9IHZhbHVlWzBdO1xyXG4gICAgICAgIHZhciBxU2lnbiA9IHNlbGYuc2lnbiAhPT0gbi5zaWduLFxyXG4gICAgICAgICAgICBtb2QgPSB2YWx1ZVsxXSxcclxuICAgICAgICAgICAgbVNpZ24gPSBzZWxmLnNpZ247XHJcbiAgICAgICAgaWYgKHR5cGVvZiBxdW90aWVudCA9PT0gXCJudW1iZXJcIikge1xyXG4gICAgICAgICAgICBpZiAocVNpZ24pIHF1b3RpZW50ID0gLXF1b3RpZW50O1xyXG4gICAgICAgICAgICBxdW90aWVudCA9IG5ldyBTbWFsbEludGVnZXIocXVvdGllbnQpO1xyXG4gICAgICAgIH0gZWxzZSBxdW90aWVudCA9IG5ldyBCaWdJbnRlZ2VyKHF1b3RpZW50LCBxU2lnbik7XHJcbiAgICAgICAgaWYgKHR5cGVvZiBtb2QgPT09IFwibnVtYmVyXCIpIHtcclxuICAgICAgICAgICAgaWYgKG1TaWduKSBtb2QgPSAtbW9kO1xyXG4gICAgICAgICAgICBtb2QgPSBuZXcgU21hbGxJbnRlZ2VyKG1vZCk7XHJcbiAgICAgICAgfSBlbHNlIG1vZCA9IG5ldyBCaWdJbnRlZ2VyKG1vZCwgbVNpZ24pO1xyXG4gICAgICAgIHJldHVybiBbcXVvdGllbnQsIG1vZF07XHJcbiAgICB9XHJcblxyXG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUuZGl2bW9kID0gZnVuY3Rpb24gKHYpIHtcclxuICAgICAgICB2YXIgcmVzdWx0ID0gZGl2TW9kQW55KHRoaXMsIHYpO1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIHF1b3RpZW50OiByZXN1bHRbMF0sXHJcbiAgICAgICAgICAgIHJlbWFpbmRlcjogcmVzdWx0WzFdXHJcbiAgICAgICAgfTtcclxuICAgIH07XHJcbiAgICBOYXRpdmVCaWdJbnQucHJvdG90eXBlLmRpdm1vZCA9IFNtYWxsSW50ZWdlci5wcm90b3R5cGUuZGl2bW9kID0gQmlnSW50ZWdlci5wcm90b3R5cGUuZGl2bW9kO1xyXG5cclxuXHJcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5kaXZpZGUgPSBmdW5jdGlvbiAodikge1xyXG4gICAgICAgIHJldHVybiBkaXZNb2RBbnkodGhpcywgdilbMF07XHJcbiAgICB9O1xyXG4gICAgTmF0aXZlQmlnSW50LnByb3RvdHlwZS5vdmVyID0gTmF0aXZlQmlnSW50LnByb3RvdHlwZS5kaXZpZGUgPSBmdW5jdGlvbiAodikge1xyXG4gICAgICAgIHJldHVybiBuZXcgTmF0aXZlQmlnSW50KHRoaXMudmFsdWUgLyBwYXJzZVZhbHVlKHYpLnZhbHVlKTtcclxuICAgIH07XHJcbiAgICBTbWFsbEludGVnZXIucHJvdG90eXBlLm92ZXIgPSBTbWFsbEludGVnZXIucHJvdG90eXBlLmRpdmlkZSA9IEJpZ0ludGVnZXIucHJvdG90eXBlLm92ZXIgPSBCaWdJbnRlZ2VyLnByb3RvdHlwZS5kaXZpZGU7XHJcblxyXG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUubW9kID0gZnVuY3Rpb24gKHYpIHtcclxuICAgICAgICByZXR1cm4gZGl2TW9kQW55KHRoaXMsIHYpWzFdO1xyXG4gICAgfTtcclxuICAgIE5hdGl2ZUJpZ0ludC5wcm90b3R5cGUubW9kID0gTmF0aXZlQmlnSW50LnByb3RvdHlwZS5yZW1haW5kZXIgPSBmdW5jdGlvbiAodikge1xyXG4gICAgICAgIHJldHVybiBuZXcgTmF0aXZlQmlnSW50KHRoaXMudmFsdWUgJSBwYXJzZVZhbHVlKHYpLnZhbHVlKTtcclxuICAgIH07XHJcbiAgICBTbWFsbEludGVnZXIucHJvdG90eXBlLnJlbWFpbmRlciA9IFNtYWxsSW50ZWdlci5wcm90b3R5cGUubW9kID0gQmlnSW50ZWdlci5wcm90b3R5cGUucmVtYWluZGVyID0gQmlnSW50ZWdlci5wcm90b3R5cGUubW9kO1xyXG5cclxuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLnBvdyA9IGZ1bmN0aW9uICh2KSB7XHJcbiAgICAgICAgdmFyIG4gPSBwYXJzZVZhbHVlKHYpLFxyXG4gICAgICAgICAgICBhID0gdGhpcy52YWx1ZSxcclxuICAgICAgICAgICAgYiA9IG4udmFsdWUsXHJcbiAgICAgICAgICAgIHZhbHVlLCB4LCB5O1xyXG4gICAgICAgIGlmIChiID09PSAwKSByZXR1cm4gSW50ZWdlclsxXTtcclxuICAgICAgICBpZiAoYSA9PT0gMCkgcmV0dXJuIEludGVnZXJbMF07XHJcbiAgICAgICAgaWYgKGEgPT09IDEpIHJldHVybiBJbnRlZ2VyWzFdO1xyXG4gICAgICAgIGlmIChhID09PSAtMSkgcmV0dXJuIG4uaXNFdmVuKCkgPyBJbnRlZ2VyWzFdIDogSW50ZWdlclstMV07XHJcbiAgICAgICAgaWYgKG4uc2lnbikge1xyXG4gICAgICAgICAgICByZXR1cm4gSW50ZWdlclswXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFuLmlzU21hbGwpIHRocm93IG5ldyBFcnJvcihcIlRoZSBleHBvbmVudCBcIiArIG4udG9TdHJpbmcoKSArIFwiIGlzIHRvbyBsYXJnZS5cIik7XHJcbiAgICAgICAgaWYgKHRoaXMuaXNTbWFsbCkge1xyXG4gICAgICAgICAgICBpZiAoaXNQcmVjaXNlKHZhbHVlID0gTWF0aC5wb3coYSwgYikpKVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTbWFsbEludGVnZXIodHJ1bmNhdGUodmFsdWUpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgeCA9IHRoaXM7XHJcbiAgICAgICAgeSA9IEludGVnZXJbMV07XHJcbiAgICAgICAgd2hpbGUgKHRydWUpIHtcclxuICAgICAgICAgICAgaWYgKGIgJiAxID09PSAxKSB7XHJcbiAgICAgICAgICAgICAgICB5ID0geS50aW1lcyh4KTtcclxuICAgICAgICAgICAgICAgIC0tYjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoYiA9PT0gMCkgYnJlYWs7XHJcbiAgICAgICAgICAgIGIgLz0gMjtcclxuICAgICAgICAgICAgeCA9IHguc3F1YXJlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB5O1xyXG4gICAgfTtcclxuICAgIFNtYWxsSW50ZWdlci5wcm90b3R5cGUucG93ID0gQmlnSW50ZWdlci5wcm90b3R5cGUucG93O1xyXG5cclxuICAgIE5hdGl2ZUJpZ0ludC5wcm90b3R5cGUucG93ID0gZnVuY3Rpb24gKHYpIHtcclxuICAgICAgICB2YXIgbiA9IHBhcnNlVmFsdWUodik7XHJcbiAgICAgICAgdmFyIGEgPSB0aGlzLnZhbHVlLCBiID0gbi52YWx1ZTtcclxuICAgICAgICB2YXIgXzAgPSBCaWdJbnQoMCksIF8xID0gQmlnSW50KDEpLCBfMiA9IEJpZ0ludCgyKTtcclxuICAgICAgICBpZiAoYiA9PT0gXzApIHJldHVybiBJbnRlZ2VyWzFdO1xyXG4gICAgICAgIGlmIChhID09PSBfMCkgcmV0dXJuIEludGVnZXJbMF07XHJcbiAgICAgICAgaWYgKGEgPT09IF8xKSByZXR1cm4gSW50ZWdlclsxXTtcclxuICAgICAgICBpZiAoYSA9PT0gQmlnSW50KC0xKSkgcmV0dXJuIG4uaXNFdmVuKCkgPyBJbnRlZ2VyWzFdIDogSW50ZWdlclstMV07XHJcbiAgICAgICAgaWYgKG4uaXNOZWdhdGl2ZSgpKSByZXR1cm4gbmV3IE5hdGl2ZUJpZ0ludChfMCk7XHJcbiAgICAgICAgdmFyIHggPSB0aGlzO1xyXG4gICAgICAgIHZhciB5ID0gSW50ZWdlclsxXTtcclxuICAgICAgICB3aGlsZSAodHJ1ZSkge1xyXG4gICAgICAgICAgICBpZiAoKGIgJiBfMSkgPT09IF8xKSB7XHJcbiAgICAgICAgICAgICAgICB5ID0geS50aW1lcyh4KTtcclxuICAgICAgICAgICAgICAgIC0tYjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoYiA9PT0gXzApIGJyZWFrO1xyXG4gICAgICAgICAgICBiIC89IF8yO1xyXG4gICAgICAgICAgICB4ID0geC5zcXVhcmUoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHk7XHJcbiAgICB9XHJcblxyXG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUubW9kUG93ID0gZnVuY3Rpb24gKGV4cCwgbW9kKSB7XHJcbiAgICAgICAgZXhwID0gcGFyc2VWYWx1ZShleHApO1xyXG4gICAgICAgIG1vZCA9IHBhcnNlVmFsdWUobW9kKTtcclxuICAgICAgICBpZiAobW9kLmlzWmVybygpKSB0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgdGFrZSBtb2RQb3cgd2l0aCBtb2R1bHVzIDBcIik7XHJcbiAgICAgICAgdmFyIHIgPSBJbnRlZ2VyWzFdLFxyXG4gICAgICAgICAgICBiYXNlID0gdGhpcy5tb2QobW9kKTtcclxuICAgICAgICBpZiAoZXhwLmlzTmVnYXRpdmUoKSkge1xyXG4gICAgICAgICAgICBleHAgPSBleHAubXVsdGlwbHkoSW50ZWdlclstMV0pO1xyXG4gICAgICAgICAgICBiYXNlID0gYmFzZS5tb2RJbnYobW9kKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgd2hpbGUgKGV4cC5pc1Bvc2l0aXZlKCkpIHtcclxuICAgICAgICAgICAgaWYgKGJhc2UuaXNaZXJvKCkpIHJldHVybiBJbnRlZ2VyWzBdO1xyXG4gICAgICAgICAgICBpZiAoZXhwLmlzT2RkKCkpIHIgPSByLm11bHRpcGx5KGJhc2UpLm1vZChtb2QpO1xyXG4gICAgICAgICAgICBleHAgPSBleHAuZGl2aWRlKDIpO1xyXG4gICAgICAgICAgICBiYXNlID0gYmFzZS5zcXVhcmUoKS5tb2QobW9kKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHI7XHJcbiAgICB9O1xyXG4gICAgTmF0aXZlQmlnSW50LnByb3RvdHlwZS5tb2RQb3cgPSBTbWFsbEludGVnZXIucHJvdG90eXBlLm1vZFBvdyA9IEJpZ0ludGVnZXIucHJvdG90eXBlLm1vZFBvdztcclxuXHJcbiAgICBmdW5jdGlvbiBjb21wYXJlQWJzKGEsIGIpIHtcclxuICAgICAgICBpZiAoYS5sZW5ndGggIT09IGIubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBhLmxlbmd0aCA+IGIubGVuZ3RoID8gMSA6IC0xO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmb3IgKHZhciBpID0gYS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xyXG4gICAgICAgICAgICBpZiAoYVtpXSAhPT0gYltpXSkgcmV0dXJuIGFbaV0gPiBiW2ldID8gMSA6IC0xO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gMDtcclxuICAgIH1cclxuXHJcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5jb21wYXJlQWJzID0gZnVuY3Rpb24gKHYpIHtcclxuICAgICAgICB2YXIgbiA9IHBhcnNlVmFsdWUodiksXHJcbiAgICAgICAgICAgIGEgPSB0aGlzLnZhbHVlLFxyXG4gICAgICAgICAgICBiID0gbi52YWx1ZTtcclxuICAgICAgICBpZiAobi5pc1NtYWxsKSByZXR1cm4gMTtcclxuICAgICAgICByZXR1cm4gY29tcGFyZUFicyhhLCBiKTtcclxuICAgIH07XHJcbiAgICBTbWFsbEludGVnZXIucHJvdG90eXBlLmNvbXBhcmVBYnMgPSBmdW5jdGlvbiAodikge1xyXG4gICAgICAgIHZhciBuID0gcGFyc2VWYWx1ZSh2KSxcclxuICAgICAgICAgICAgYSA9IE1hdGguYWJzKHRoaXMudmFsdWUpLFxyXG4gICAgICAgICAgICBiID0gbi52YWx1ZTtcclxuICAgICAgICBpZiAobi5pc1NtYWxsKSB7XHJcbiAgICAgICAgICAgIGIgPSBNYXRoLmFicyhiKTtcclxuICAgICAgICAgICAgcmV0dXJuIGEgPT09IGIgPyAwIDogYSA+IGIgPyAxIDogLTE7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiAtMTtcclxuICAgIH07XHJcbiAgICBOYXRpdmVCaWdJbnQucHJvdG90eXBlLmNvbXBhcmVBYnMgPSBmdW5jdGlvbiAodikge1xyXG4gICAgICAgIHZhciBhID0gdGhpcy52YWx1ZTtcclxuICAgICAgICB2YXIgYiA9IHBhcnNlVmFsdWUodikudmFsdWU7XHJcbiAgICAgICAgYSA9IGEgPj0gMCA/IGEgOiAtYTtcclxuICAgICAgICBiID0gYiA+PSAwID8gYiA6IC1iO1xyXG4gICAgICAgIHJldHVybiBhID09PSBiID8gMCA6IGEgPiBiID8gMSA6IC0xO1xyXG4gICAgfVxyXG5cclxuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLmNvbXBhcmUgPSBmdW5jdGlvbiAodikge1xyXG4gICAgICAgIC8vIFNlZSBkaXNjdXNzaW9uIGFib3V0IGNvbXBhcmlzb24gd2l0aCBJbmZpbml0eTpcclxuICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vcGV0ZXJvbHNvbi9CaWdJbnRlZ2VyLmpzL2lzc3Vlcy82MVxyXG4gICAgICAgIGlmICh2ID09PSBJbmZpbml0eSkge1xyXG4gICAgICAgICAgICByZXR1cm4gLTE7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh2ID09PSAtSW5maW5pdHkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIDE7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2YXIgbiA9IHBhcnNlVmFsdWUodiksXHJcbiAgICAgICAgICAgIGEgPSB0aGlzLnZhbHVlLFxyXG4gICAgICAgICAgICBiID0gbi52YWx1ZTtcclxuICAgICAgICBpZiAodGhpcy5zaWduICE9PSBuLnNpZ24pIHtcclxuICAgICAgICAgICAgcmV0dXJuIG4uc2lnbiA/IDEgOiAtMTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKG4uaXNTbWFsbCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zaWduID8gLTEgOiAxO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gY29tcGFyZUFicyhhLCBiKSAqICh0aGlzLnNpZ24gPyAtMSA6IDEpO1xyXG4gICAgfTtcclxuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLmNvbXBhcmVUbyA9IEJpZ0ludGVnZXIucHJvdG90eXBlLmNvbXBhcmU7XHJcblxyXG4gICAgU21hbGxJbnRlZ2VyLnByb3RvdHlwZS5jb21wYXJlID0gZnVuY3Rpb24gKHYpIHtcclxuICAgICAgICBpZiAodiA9PT0gSW5maW5pdHkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIC0xO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodiA9PT0gLUluZmluaXR5KSB7XHJcbiAgICAgICAgICAgIHJldHVybiAxO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIG4gPSBwYXJzZVZhbHVlKHYpLFxyXG4gICAgICAgICAgICBhID0gdGhpcy52YWx1ZSxcclxuICAgICAgICAgICAgYiA9IG4udmFsdWU7XHJcbiAgICAgICAgaWYgKG4uaXNTbWFsbCkge1xyXG4gICAgICAgICAgICByZXR1cm4gYSA9PSBiID8gMCA6IGEgPiBiID8gMSA6IC0xO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoYSA8IDAgIT09IG4uc2lnbikge1xyXG4gICAgICAgICAgICByZXR1cm4gYSA8IDAgPyAtMSA6IDE7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBhIDwgMCA/IDEgOiAtMTtcclxuICAgIH07XHJcbiAgICBTbWFsbEludGVnZXIucHJvdG90eXBlLmNvbXBhcmVUbyA9IFNtYWxsSW50ZWdlci5wcm90b3R5cGUuY29tcGFyZTtcclxuXHJcbiAgICBOYXRpdmVCaWdJbnQucHJvdG90eXBlLmNvbXBhcmUgPSBmdW5jdGlvbiAodikge1xyXG4gICAgICAgIGlmICh2ID09PSBJbmZpbml0eSkge1xyXG4gICAgICAgICAgICByZXR1cm4gLTE7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh2ID09PSAtSW5maW5pdHkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIDE7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciBhID0gdGhpcy52YWx1ZTtcclxuICAgICAgICB2YXIgYiA9IHBhcnNlVmFsdWUodikudmFsdWU7XHJcbiAgICAgICAgcmV0dXJuIGEgPT09IGIgPyAwIDogYSA+IGIgPyAxIDogLTE7XHJcbiAgICB9XHJcbiAgICBOYXRpdmVCaWdJbnQucHJvdG90eXBlLmNvbXBhcmVUbyA9IE5hdGl2ZUJpZ0ludC5wcm90b3R5cGUuY29tcGFyZTtcclxuXHJcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5lcXVhbHMgPSBmdW5jdGlvbiAodikge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmNvbXBhcmUodikgPT09IDA7XHJcbiAgICB9O1xyXG4gICAgTmF0aXZlQmlnSW50LnByb3RvdHlwZS5lcSA9IE5hdGl2ZUJpZ0ludC5wcm90b3R5cGUuZXF1YWxzID0gU21hbGxJbnRlZ2VyLnByb3RvdHlwZS5lcSA9IFNtYWxsSW50ZWdlci5wcm90b3R5cGUuZXF1YWxzID0gQmlnSW50ZWdlci5wcm90b3R5cGUuZXEgPSBCaWdJbnRlZ2VyLnByb3RvdHlwZS5lcXVhbHM7XHJcblxyXG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUubm90RXF1YWxzID0gZnVuY3Rpb24gKHYpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5jb21wYXJlKHYpICE9PSAwO1xyXG4gICAgfTtcclxuICAgIE5hdGl2ZUJpZ0ludC5wcm90b3R5cGUubmVxID0gTmF0aXZlQmlnSW50LnByb3RvdHlwZS5ub3RFcXVhbHMgPSBTbWFsbEludGVnZXIucHJvdG90eXBlLm5lcSA9IFNtYWxsSW50ZWdlci5wcm90b3R5cGUubm90RXF1YWxzID0gQmlnSW50ZWdlci5wcm90b3R5cGUubmVxID0gQmlnSW50ZWdlci5wcm90b3R5cGUubm90RXF1YWxzO1xyXG5cclxuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLmdyZWF0ZXIgPSBmdW5jdGlvbiAodikge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmNvbXBhcmUodikgPiAwO1xyXG4gICAgfTtcclxuICAgIE5hdGl2ZUJpZ0ludC5wcm90b3R5cGUuZ3QgPSBOYXRpdmVCaWdJbnQucHJvdG90eXBlLmdyZWF0ZXIgPSBTbWFsbEludGVnZXIucHJvdG90eXBlLmd0ID0gU21hbGxJbnRlZ2VyLnByb3RvdHlwZS5ncmVhdGVyID0gQmlnSW50ZWdlci5wcm90b3R5cGUuZ3QgPSBCaWdJbnRlZ2VyLnByb3RvdHlwZS5ncmVhdGVyO1xyXG5cclxuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLmxlc3NlciA9IGZ1bmN0aW9uICh2KSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY29tcGFyZSh2KSA8IDA7XHJcbiAgICB9O1xyXG4gICAgTmF0aXZlQmlnSW50LnByb3RvdHlwZS5sdCA9IE5hdGl2ZUJpZ0ludC5wcm90b3R5cGUubGVzc2VyID0gU21hbGxJbnRlZ2VyLnByb3RvdHlwZS5sdCA9IFNtYWxsSW50ZWdlci5wcm90b3R5cGUubGVzc2VyID0gQmlnSW50ZWdlci5wcm90b3R5cGUubHQgPSBCaWdJbnRlZ2VyLnByb3RvdHlwZS5sZXNzZXI7XHJcblxyXG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUuZ3JlYXRlck9yRXF1YWxzID0gZnVuY3Rpb24gKHYpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5jb21wYXJlKHYpID49IDA7XHJcbiAgICB9O1xyXG4gICAgTmF0aXZlQmlnSW50LnByb3RvdHlwZS5nZXEgPSBOYXRpdmVCaWdJbnQucHJvdG90eXBlLmdyZWF0ZXJPckVxdWFscyA9IFNtYWxsSW50ZWdlci5wcm90b3R5cGUuZ2VxID0gU21hbGxJbnRlZ2VyLnByb3RvdHlwZS5ncmVhdGVyT3JFcXVhbHMgPSBCaWdJbnRlZ2VyLnByb3RvdHlwZS5nZXEgPSBCaWdJbnRlZ2VyLnByb3RvdHlwZS5ncmVhdGVyT3JFcXVhbHM7XHJcblxyXG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUubGVzc2VyT3JFcXVhbHMgPSBmdW5jdGlvbiAodikge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmNvbXBhcmUodikgPD0gMDtcclxuICAgIH07XHJcbiAgICBOYXRpdmVCaWdJbnQucHJvdG90eXBlLmxlcSA9IE5hdGl2ZUJpZ0ludC5wcm90b3R5cGUubGVzc2VyT3JFcXVhbHMgPSBTbWFsbEludGVnZXIucHJvdG90eXBlLmxlcSA9IFNtYWxsSW50ZWdlci5wcm90b3R5cGUubGVzc2VyT3JFcXVhbHMgPSBCaWdJbnRlZ2VyLnByb3RvdHlwZS5sZXEgPSBCaWdJbnRlZ2VyLnByb3RvdHlwZS5sZXNzZXJPckVxdWFscztcclxuXHJcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5pc0V2ZW4gPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgcmV0dXJuICh0aGlzLnZhbHVlWzBdICYgMSkgPT09IDA7XHJcbiAgICB9O1xyXG4gICAgU21hbGxJbnRlZ2VyLnByb3RvdHlwZS5pc0V2ZW4gPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgcmV0dXJuICh0aGlzLnZhbHVlICYgMSkgPT09IDA7XHJcbiAgICB9O1xyXG4gICAgTmF0aXZlQmlnSW50LnByb3RvdHlwZS5pc0V2ZW4gPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgcmV0dXJuICh0aGlzLnZhbHVlICYgQmlnSW50KDEpKSA9PT0gQmlnSW50KDApO1xyXG4gICAgfVxyXG5cclxuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLmlzT2RkID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHJldHVybiAodGhpcy52YWx1ZVswXSAmIDEpID09PSAxO1xyXG4gICAgfTtcclxuICAgIFNtYWxsSW50ZWdlci5wcm90b3R5cGUuaXNPZGQgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgcmV0dXJuICh0aGlzLnZhbHVlICYgMSkgPT09IDE7XHJcbiAgICB9O1xyXG4gICAgTmF0aXZlQmlnSW50LnByb3RvdHlwZS5pc09kZCA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICByZXR1cm4gKHRoaXMudmFsdWUgJiBCaWdJbnQoMSkpID09PSBCaWdJbnQoMSk7XHJcbiAgICB9XHJcblxyXG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUuaXNQb3NpdGl2ZSA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICByZXR1cm4gIXRoaXMuc2lnbjtcclxuICAgIH07XHJcbiAgICBTbWFsbEludGVnZXIucHJvdG90eXBlLmlzUG9zaXRpdmUgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudmFsdWUgPiAwO1xyXG4gICAgfTtcclxuICAgIE5hdGl2ZUJpZ0ludC5wcm90b3R5cGUuaXNQb3NpdGl2ZSA9IFNtYWxsSW50ZWdlci5wcm90b3R5cGUuaXNQb3NpdGl2ZTtcclxuXHJcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5pc05lZ2F0aXZlID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnNpZ247XHJcbiAgICB9O1xyXG4gICAgU21hbGxJbnRlZ2VyLnByb3RvdHlwZS5pc05lZ2F0aXZlID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnZhbHVlIDwgMDtcclxuICAgIH07XHJcbiAgICBOYXRpdmVCaWdJbnQucHJvdG90eXBlLmlzTmVnYXRpdmUgPSBTbWFsbEludGVnZXIucHJvdG90eXBlLmlzTmVnYXRpdmU7XHJcblxyXG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUuaXNVbml0ID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH07XHJcbiAgICBTbWFsbEludGVnZXIucHJvdG90eXBlLmlzVW5pdCA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICByZXR1cm4gTWF0aC5hYnModGhpcy52YWx1ZSkgPT09IDE7XHJcbiAgICB9O1xyXG4gICAgTmF0aXZlQmlnSW50LnByb3RvdHlwZS5pc1VuaXQgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuYWJzKCkudmFsdWUgPT09IEJpZ0ludCgxKTtcclxuICAgIH1cclxuXHJcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5pc1plcm8gPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfTtcclxuICAgIFNtYWxsSW50ZWdlci5wcm90b3R5cGUuaXNaZXJvID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnZhbHVlID09PSAwO1xyXG4gICAgfTtcclxuICAgIE5hdGl2ZUJpZ0ludC5wcm90b3R5cGUuaXNaZXJvID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnZhbHVlID09PSBCaWdJbnQoMCk7XHJcbiAgICB9XHJcblxyXG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUuaXNEaXZpc2libGVCeSA9IGZ1bmN0aW9uICh2KSB7XHJcbiAgICAgICAgdmFyIG4gPSBwYXJzZVZhbHVlKHYpO1xyXG4gICAgICAgIGlmIChuLmlzWmVybygpKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgaWYgKG4uaXNVbml0KCkpIHJldHVybiB0cnVlO1xyXG4gICAgICAgIGlmIChuLmNvbXBhcmVBYnMoMikgPT09IDApIHJldHVybiB0aGlzLmlzRXZlbigpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLm1vZChuKS5pc1plcm8oKTtcclxuICAgIH07XHJcbiAgICBOYXRpdmVCaWdJbnQucHJvdG90eXBlLmlzRGl2aXNpYmxlQnkgPSBTbWFsbEludGVnZXIucHJvdG90eXBlLmlzRGl2aXNpYmxlQnkgPSBCaWdJbnRlZ2VyLnByb3RvdHlwZS5pc0RpdmlzaWJsZUJ5O1xyXG5cclxuICAgIGZ1bmN0aW9uIGlzQmFzaWNQcmltZSh2KSB7XHJcbiAgICAgICAgdmFyIG4gPSB2LmFicygpO1xyXG4gICAgICAgIGlmIChuLmlzVW5pdCgpKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgaWYgKG4uZXF1YWxzKDIpIHx8IG4uZXF1YWxzKDMpIHx8IG4uZXF1YWxzKDUpKSByZXR1cm4gdHJ1ZTtcclxuICAgICAgICBpZiAobi5pc0V2ZW4oKSB8fCBuLmlzRGl2aXNpYmxlQnkoMykgfHwgbi5pc0RpdmlzaWJsZUJ5KDUpKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgaWYgKG4ubGVzc2VyKDQ5KSkgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgLy8gd2UgZG9uJ3Qga25vdyBpZiBpdCdzIHByaW1lOiBsZXQgdGhlIG90aGVyIGZ1bmN0aW9ucyBmaWd1cmUgaXQgb3V0XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gbWlsbGVyUmFiaW5UZXN0KG4sIGEpIHtcclxuICAgICAgICB2YXIgblByZXYgPSBuLnByZXYoKSxcclxuICAgICAgICAgICAgYiA9IG5QcmV2LFxyXG4gICAgICAgICAgICByID0gMCxcclxuICAgICAgICAgICAgZCwgdCwgaSwgeDtcclxuICAgICAgICB3aGlsZSAoYi5pc0V2ZW4oKSkgYiA9IGIuZGl2aWRlKDIpLCByKys7XHJcbiAgICAgICAgbmV4dDogZm9yIChpID0gMDsgaSA8IGEubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKG4ubGVzc2VyKGFbaV0pKSBjb250aW51ZTtcclxuICAgICAgICAgICAgeCA9IGJpZ0ludChhW2ldKS5tb2RQb3coYiwgbik7XHJcbiAgICAgICAgICAgIGlmICh4LmlzVW5pdCgpIHx8IHguZXF1YWxzKG5QcmV2KSkgY29udGludWU7XHJcbiAgICAgICAgICAgIGZvciAoZCA9IHIgLSAxOyBkICE9IDA7IGQtLSkge1xyXG4gICAgICAgICAgICAgICAgeCA9IHguc3F1YXJlKCkubW9kKG4pO1xyXG4gICAgICAgICAgICAgICAgaWYgKHguaXNVbml0KCkpIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgICAgIGlmICh4LmVxdWFscyhuUHJldikpIGNvbnRpbnVlIG5leHQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBTZXQgXCJzdHJpY3RcIiB0byB0cnVlIHRvIGZvcmNlIEdSSC1zdXBwb3J0ZWQgbG93ZXIgYm91bmQgb2YgMipsb2coTileMlxyXG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUuaXNQcmltZSA9IGZ1bmN0aW9uIChzdHJpY3QpIHtcclxuICAgICAgICB2YXIgaXNQcmltZSA9IGlzQmFzaWNQcmltZSh0aGlzKTtcclxuICAgICAgICBpZiAoaXNQcmltZSAhPT0gdW5kZWZpbmVkKSByZXR1cm4gaXNQcmltZTtcclxuICAgICAgICB2YXIgbiA9IHRoaXMuYWJzKCk7XHJcbiAgICAgICAgdmFyIGJpdHMgPSBuLmJpdExlbmd0aCgpO1xyXG4gICAgICAgIGlmIChiaXRzIDw9IDY0KVxyXG4gICAgICAgICAgICByZXR1cm4gbWlsbGVyUmFiaW5UZXN0KG4sIFsyLCAzLCA1LCA3LCAxMSwgMTMsIDE3LCAxOSwgMjMsIDI5LCAzMSwgMzddKTtcclxuICAgICAgICB2YXIgbG9nTiA9IE1hdGgubG9nKDIpICogYml0cy50b0pTTnVtYmVyKCk7XHJcbiAgICAgICAgdmFyIHQgPSBNYXRoLmNlaWwoKHN0cmljdCA9PT0gdHJ1ZSkgPyAoMiAqIE1hdGgucG93KGxvZ04sIDIpKSA6IGxvZ04pO1xyXG4gICAgICAgIGZvciAodmFyIGEgPSBbXSwgaSA9IDA7IGkgPCB0OyBpKyspIHtcclxuICAgICAgICAgICAgYS5wdXNoKGJpZ0ludChpICsgMikpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbWlsbGVyUmFiaW5UZXN0KG4sIGEpO1xyXG4gICAgfTtcclxuICAgIE5hdGl2ZUJpZ0ludC5wcm90b3R5cGUuaXNQcmltZSA9IFNtYWxsSW50ZWdlci5wcm90b3R5cGUuaXNQcmltZSA9IEJpZ0ludGVnZXIucHJvdG90eXBlLmlzUHJpbWU7XHJcblxyXG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUuaXNQcm9iYWJsZVByaW1lID0gZnVuY3Rpb24gKGl0ZXJhdGlvbnMsIHJuZykge1xyXG4gICAgICAgIHZhciBpc1ByaW1lID0gaXNCYXNpY1ByaW1lKHRoaXMpO1xyXG4gICAgICAgIGlmIChpc1ByaW1lICE9PSB1bmRlZmluZWQpIHJldHVybiBpc1ByaW1lO1xyXG4gICAgICAgIHZhciBuID0gdGhpcy5hYnMoKTtcclxuICAgICAgICB2YXIgdCA9IGl0ZXJhdGlvbnMgPT09IHVuZGVmaW5lZCA/IDUgOiBpdGVyYXRpb25zO1xyXG4gICAgICAgIGZvciAodmFyIGEgPSBbXSwgaSA9IDA7IGkgPCB0OyBpKyspIHtcclxuICAgICAgICAgICAgYS5wdXNoKGJpZ0ludC5yYW5kQmV0d2VlbigyLCBuLm1pbnVzKDIpLCBybmcpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG1pbGxlclJhYmluVGVzdChuLCBhKTtcclxuICAgIH07XHJcbiAgICBOYXRpdmVCaWdJbnQucHJvdG90eXBlLmlzUHJvYmFibGVQcmltZSA9IFNtYWxsSW50ZWdlci5wcm90b3R5cGUuaXNQcm9iYWJsZVByaW1lID0gQmlnSW50ZWdlci5wcm90b3R5cGUuaXNQcm9iYWJsZVByaW1lO1xyXG5cclxuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLm1vZEludiA9IGZ1bmN0aW9uIChuKSB7XHJcbiAgICAgICAgdmFyIHQgPSBiaWdJbnQuemVybywgbmV3VCA9IGJpZ0ludC5vbmUsIHIgPSBwYXJzZVZhbHVlKG4pLCBuZXdSID0gdGhpcy5hYnMoKSwgcSwgbGFzdFQsIGxhc3RSO1xyXG4gICAgICAgIHdoaWxlICghbmV3Ui5pc1plcm8oKSkge1xyXG4gICAgICAgICAgICBxID0gci5kaXZpZGUobmV3Uik7XHJcbiAgICAgICAgICAgIGxhc3RUID0gdDtcclxuICAgICAgICAgICAgbGFzdFIgPSByO1xyXG4gICAgICAgICAgICB0ID0gbmV3VDtcclxuICAgICAgICAgICAgciA9IG5ld1I7XHJcbiAgICAgICAgICAgIG5ld1QgPSBsYXN0VC5zdWJ0cmFjdChxLm11bHRpcGx5KG5ld1QpKTtcclxuICAgICAgICAgICAgbmV3UiA9IGxhc3RSLnN1YnRyYWN0KHEubXVsdGlwbHkobmV3UikpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIXIuaXNVbml0KCkpIHRocm93IG5ldyBFcnJvcih0aGlzLnRvU3RyaW5nKCkgKyBcIiBhbmQgXCIgKyBuLnRvU3RyaW5nKCkgKyBcIiBhcmUgbm90IGNvLXByaW1lXCIpO1xyXG4gICAgICAgIGlmICh0LmNvbXBhcmUoMCkgPT09IC0xKSB7XHJcbiAgICAgICAgICAgIHQgPSB0LmFkZChuKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuaXNOZWdhdGl2ZSgpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0Lm5lZ2F0ZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdDtcclxuICAgIH07XHJcblxyXG4gICAgTmF0aXZlQmlnSW50LnByb3RvdHlwZS5tb2RJbnYgPSBTbWFsbEludGVnZXIucHJvdG90eXBlLm1vZEludiA9IEJpZ0ludGVnZXIucHJvdG90eXBlLm1vZEludjtcclxuXHJcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5uZXh0ID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHZhciB2YWx1ZSA9IHRoaXMudmFsdWU7XHJcbiAgICAgICAgaWYgKHRoaXMuc2lnbikge1xyXG4gICAgICAgICAgICByZXR1cm4gc3VidHJhY3RTbWFsbCh2YWx1ZSwgMSwgdGhpcy5zaWduKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG5ldyBCaWdJbnRlZ2VyKGFkZFNtYWxsKHZhbHVlLCAxKSwgdGhpcy5zaWduKTtcclxuICAgIH07XHJcbiAgICBTbWFsbEludGVnZXIucHJvdG90eXBlLm5leHQgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgdmFyIHZhbHVlID0gdGhpcy52YWx1ZTtcclxuICAgICAgICBpZiAodmFsdWUgKyAxIDwgTUFYX0lOVCkgcmV0dXJuIG5ldyBTbWFsbEludGVnZXIodmFsdWUgKyAxKTtcclxuICAgICAgICByZXR1cm4gbmV3IEJpZ0ludGVnZXIoTUFYX0lOVF9BUlIsIGZhbHNlKTtcclxuICAgIH07XHJcbiAgICBOYXRpdmVCaWdJbnQucHJvdG90eXBlLm5leHQgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBOYXRpdmVCaWdJbnQodGhpcy52YWx1ZSArIEJpZ0ludCgxKSk7XHJcbiAgICB9XHJcblxyXG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUucHJldiA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICB2YXIgdmFsdWUgPSB0aGlzLnZhbHVlO1xyXG4gICAgICAgIGlmICh0aGlzLnNpZ24pIHtcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBCaWdJbnRlZ2VyKGFkZFNtYWxsKHZhbHVlLCAxKSwgdHJ1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBzdWJ0cmFjdFNtYWxsKHZhbHVlLCAxLCB0aGlzLnNpZ24pO1xyXG4gICAgfTtcclxuICAgIFNtYWxsSW50ZWdlci5wcm90b3R5cGUucHJldiA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICB2YXIgdmFsdWUgPSB0aGlzLnZhbHVlO1xyXG4gICAgICAgIGlmICh2YWx1ZSAtIDEgPiAtTUFYX0lOVCkgcmV0dXJuIG5ldyBTbWFsbEludGVnZXIodmFsdWUgLSAxKTtcclxuICAgICAgICByZXR1cm4gbmV3IEJpZ0ludGVnZXIoTUFYX0lOVF9BUlIsIHRydWUpO1xyXG4gICAgfTtcclxuICAgIE5hdGl2ZUJpZ0ludC5wcm90b3R5cGUucHJldiA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICByZXR1cm4gbmV3IE5hdGl2ZUJpZ0ludCh0aGlzLnZhbHVlIC0gQmlnSW50KDEpKTtcclxuICAgIH1cclxuXHJcbiAgICB2YXIgcG93ZXJzT2ZUd28gPSBbMV07XHJcbiAgICB3aGlsZSAoMiAqIHBvd2Vyc09mVHdvW3Bvd2Vyc09mVHdvLmxlbmd0aCAtIDFdIDw9IEJBU0UpIHBvd2Vyc09mVHdvLnB1c2goMiAqIHBvd2Vyc09mVHdvW3Bvd2Vyc09mVHdvLmxlbmd0aCAtIDFdKTtcclxuICAgIHZhciBwb3dlcnMyTGVuZ3RoID0gcG93ZXJzT2ZUd28ubGVuZ3RoLCBoaWdoZXN0UG93ZXIyID0gcG93ZXJzT2ZUd29bcG93ZXJzMkxlbmd0aCAtIDFdO1xyXG5cclxuICAgIGZ1bmN0aW9uIHNoaWZ0X2lzU21hbGwobikge1xyXG4gICAgICAgIHJldHVybiBNYXRoLmFicyhuKSA8PSBCQVNFO1xyXG4gICAgfVxyXG5cclxuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLnNoaWZ0TGVmdCA9IGZ1bmN0aW9uICh2KSB7XHJcbiAgICAgICAgdmFyIG4gPSBwYXJzZVZhbHVlKHYpLnRvSlNOdW1iZXIoKTtcclxuICAgICAgICBpZiAoIXNoaWZ0X2lzU21hbGwobikpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFN0cmluZyhuKSArIFwiIGlzIHRvbyBsYXJnZSBmb3Igc2hpZnRpbmcuXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobiA8IDApIHJldHVybiB0aGlzLnNoaWZ0UmlnaHQoLW4pO1xyXG4gICAgICAgIHZhciByZXN1bHQgPSB0aGlzO1xyXG4gICAgICAgIGlmIChyZXN1bHQuaXNaZXJvKCkpIHJldHVybiByZXN1bHQ7XHJcbiAgICAgICAgd2hpbGUgKG4gPj0gcG93ZXJzMkxlbmd0aCkge1xyXG4gICAgICAgICAgICByZXN1bHQgPSByZXN1bHQubXVsdGlwbHkoaGlnaGVzdFBvd2VyMik7XHJcbiAgICAgICAgICAgIG4gLT0gcG93ZXJzMkxlbmd0aCAtIDE7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXN1bHQubXVsdGlwbHkocG93ZXJzT2ZUd29bbl0pO1xyXG4gICAgfTtcclxuICAgIE5hdGl2ZUJpZ0ludC5wcm90b3R5cGUuc2hpZnRMZWZ0ID0gU21hbGxJbnRlZ2VyLnByb3RvdHlwZS5zaGlmdExlZnQgPSBCaWdJbnRlZ2VyLnByb3RvdHlwZS5zaGlmdExlZnQ7XHJcblxyXG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUuc2hpZnRSaWdodCA9IGZ1bmN0aW9uICh2KSB7XHJcbiAgICAgICAgdmFyIHJlbVF1bztcclxuICAgICAgICB2YXIgbiA9IHBhcnNlVmFsdWUodikudG9KU051bWJlcigpO1xyXG4gICAgICAgIGlmICghc2hpZnRfaXNTbWFsbChuKSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoU3RyaW5nKG4pICsgXCIgaXMgdG9vIGxhcmdlIGZvciBzaGlmdGluZy5cIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChuIDwgMCkgcmV0dXJuIHRoaXMuc2hpZnRMZWZ0KC1uKTtcclxuICAgICAgICB2YXIgcmVzdWx0ID0gdGhpcztcclxuICAgICAgICB3aGlsZSAobiA+PSBwb3dlcnMyTGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIGlmIChyZXN1bHQuaXNaZXJvKCkgfHwgKHJlc3VsdC5pc05lZ2F0aXZlKCkgJiYgcmVzdWx0LmlzVW5pdCgpKSkgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgICAgICAgcmVtUXVvID0gZGl2TW9kQW55KHJlc3VsdCwgaGlnaGVzdFBvd2VyMik7XHJcbiAgICAgICAgICAgIHJlc3VsdCA9IHJlbVF1b1sxXS5pc05lZ2F0aXZlKCkgPyByZW1RdW9bMF0ucHJldigpIDogcmVtUXVvWzBdO1xyXG4gICAgICAgICAgICBuIC09IHBvd2VyczJMZW5ndGggLSAxO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZW1RdW8gPSBkaXZNb2RBbnkocmVzdWx0LCBwb3dlcnNPZlR3b1tuXSk7XHJcbiAgICAgICAgcmV0dXJuIHJlbVF1b1sxXS5pc05lZ2F0aXZlKCkgPyByZW1RdW9bMF0ucHJldigpIDogcmVtUXVvWzBdO1xyXG4gICAgfTtcclxuICAgIE5hdGl2ZUJpZ0ludC5wcm90b3R5cGUuc2hpZnRSaWdodCA9IFNtYWxsSW50ZWdlci5wcm90b3R5cGUuc2hpZnRSaWdodCA9IEJpZ0ludGVnZXIucHJvdG90eXBlLnNoaWZ0UmlnaHQ7XHJcblxyXG4gICAgZnVuY3Rpb24gYml0d2lzZSh4LCB5LCBmbikge1xyXG4gICAgICAgIHkgPSBwYXJzZVZhbHVlKHkpO1xyXG4gICAgICAgIHZhciB4U2lnbiA9IHguaXNOZWdhdGl2ZSgpLCB5U2lnbiA9IHkuaXNOZWdhdGl2ZSgpO1xyXG4gICAgICAgIHZhciB4UmVtID0geFNpZ24gPyB4Lm5vdCgpIDogeCxcclxuICAgICAgICAgICAgeVJlbSA9IHlTaWduID8geS5ub3QoKSA6IHk7XHJcbiAgICAgICAgdmFyIHhEaWdpdCA9IDAsIHlEaWdpdCA9IDA7XHJcbiAgICAgICAgdmFyIHhEaXZNb2QgPSBudWxsLCB5RGl2TW9kID0gbnVsbDtcclxuICAgICAgICB2YXIgcmVzdWx0ID0gW107XHJcbiAgICAgICAgd2hpbGUgKCF4UmVtLmlzWmVybygpIHx8ICF5UmVtLmlzWmVybygpKSB7XHJcbiAgICAgICAgICAgIHhEaXZNb2QgPSBkaXZNb2RBbnkoeFJlbSwgaGlnaGVzdFBvd2VyMik7XHJcbiAgICAgICAgICAgIHhEaWdpdCA9IHhEaXZNb2RbMV0udG9KU051bWJlcigpO1xyXG4gICAgICAgICAgICBpZiAoeFNpZ24pIHtcclxuICAgICAgICAgICAgICAgIHhEaWdpdCA9IGhpZ2hlc3RQb3dlcjIgLSAxIC0geERpZ2l0OyAvLyB0d28ncyBjb21wbGVtZW50IGZvciBuZWdhdGl2ZSBudW1iZXJzXHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHlEaXZNb2QgPSBkaXZNb2RBbnkoeVJlbSwgaGlnaGVzdFBvd2VyMik7XHJcbiAgICAgICAgICAgIHlEaWdpdCA9IHlEaXZNb2RbMV0udG9KU051bWJlcigpO1xyXG4gICAgICAgICAgICBpZiAoeVNpZ24pIHtcclxuICAgICAgICAgICAgICAgIHlEaWdpdCA9IGhpZ2hlc3RQb3dlcjIgLSAxIC0geURpZ2l0OyAvLyB0d28ncyBjb21wbGVtZW50IGZvciBuZWdhdGl2ZSBudW1iZXJzXHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHhSZW0gPSB4RGl2TW9kWzBdO1xyXG4gICAgICAgICAgICB5UmVtID0geURpdk1vZFswXTtcclxuICAgICAgICAgICAgcmVzdWx0LnB1c2goZm4oeERpZ2l0LCB5RGlnaXQpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIHN1bSA9IGZuKHhTaWduID8gMSA6IDAsIHlTaWduID8gMSA6IDApICE9PSAwID8gYmlnSW50KC0xKSA6IGJpZ0ludCgwKTtcclxuICAgICAgICBmb3IgKHZhciBpID0gcmVzdWx0Lmxlbmd0aCAtIDE7IGkgPj0gMDsgaSAtPSAxKSB7XHJcbiAgICAgICAgICAgIHN1bSA9IHN1bS5tdWx0aXBseShoaWdoZXN0UG93ZXIyKS5hZGQoYmlnSW50KHJlc3VsdFtpXSkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gc3VtO1xyXG4gICAgfVxyXG5cclxuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLm5vdCA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5uZWdhdGUoKS5wcmV2KCk7XHJcbiAgICB9O1xyXG4gICAgTmF0aXZlQmlnSW50LnByb3RvdHlwZS5ub3QgPSBTbWFsbEludGVnZXIucHJvdG90eXBlLm5vdCA9IEJpZ0ludGVnZXIucHJvdG90eXBlLm5vdDtcclxuXHJcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5hbmQgPSBmdW5jdGlvbiAobikge1xyXG4gICAgICAgIHJldHVybiBiaXR3aXNlKHRoaXMsIG4sIGZ1bmN0aW9uIChhLCBiKSB7IHJldHVybiBhICYgYjsgfSk7XHJcbiAgICB9O1xyXG4gICAgTmF0aXZlQmlnSW50LnByb3RvdHlwZS5hbmQgPSBTbWFsbEludGVnZXIucHJvdG90eXBlLmFuZCA9IEJpZ0ludGVnZXIucHJvdG90eXBlLmFuZDtcclxuXHJcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5vciA9IGZ1bmN0aW9uIChuKSB7XHJcbiAgICAgICAgcmV0dXJuIGJpdHdpc2UodGhpcywgbiwgZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuIGEgfCBiOyB9KTtcclxuICAgIH07XHJcbiAgICBOYXRpdmVCaWdJbnQucHJvdG90eXBlLm9yID0gU21hbGxJbnRlZ2VyLnByb3RvdHlwZS5vciA9IEJpZ0ludGVnZXIucHJvdG90eXBlLm9yO1xyXG5cclxuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLnhvciA9IGZ1bmN0aW9uIChuKSB7XHJcbiAgICAgICAgcmV0dXJuIGJpdHdpc2UodGhpcywgbiwgZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuIGEgXiBiOyB9KTtcclxuICAgIH07XHJcbiAgICBOYXRpdmVCaWdJbnQucHJvdG90eXBlLnhvciA9IFNtYWxsSW50ZWdlci5wcm90b3R5cGUueG9yID0gQmlnSW50ZWdlci5wcm90b3R5cGUueG9yO1xyXG5cclxuICAgIHZhciBMT0JNQVNLX0kgPSAxIDw8IDMwLCBMT0JNQVNLX0JJID0gKEJBU0UgJiAtQkFTRSkgKiAoQkFTRSAmIC1CQVNFKSB8IExPQk1BU0tfSTtcclxuICAgIGZ1bmN0aW9uIHJvdWdoTE9CKG4pIHsgLy8gZ2V0IGxvd2VzdE9uZUJpdCAocm91Z2gpXHJcbiAgICAgICAgLy8gU21hbGxJbnRlZ2VyOiByZXR1cm4gTWluKGxvd2VzdE9uZUJpdChuKSwgMSA8PCAzMClcclxuICAgICAgICAvLyBCaWdJbnRlZ2VyOiByZXR1cm4gTWluKGxvd2VzdE9uZUJpdChuKSwgMSA8PCAxNCkgW0JBU0U9MWU3XVxyXG4gICAgICAgIHZhciB2ID0gbi52YWx1ZSxcclxuICAgICAgICAgICAgeCA9IHR5cGVvZiB2ID09PSBcIm51bWJlclwiID8gdiB8IExPQk1BU0tfSSA6XHJcbiAgICAgICAgICAgICAgICB0eXBlb2YgdiA9PT0gXCJiaWdpbnRcIiA/IHYgfCBCaWdJbnQoTE9CTUFTS19JKSA6XHJcbiAgICAgICAgICAgICAgICAgICAgdlswXSArIHZbMV0gKiBCQVNFIHwgTE9CTUFTS19CSTtcclxuICAgICAgICByZXR1cm4geCAmIC14O1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGludGVnZXJMb2dhcml0aG0odmFsdWUsIGJhc2UpIHtcclxuICAgICAgICBpZiAoYmFzZS5jb21wYXJlVG8odmFsdWUpIDw9IDApIHtcclxuICAgICAgICAgICAgdmFyIHRtcCA9IGludGVnZXJMb2dhcml0aG0odmFsdWUsIGJhc2Uuc3F1YXJlKGJhc2UpKTtcclxuICAgICAgICAgICAgdmFyIHAgPSB0bXAucDtcclxuICAgICAgICAgICAgdmFyIGUgPSB0bXAuZTtcclxuICAgICAgICAgICAgdmFyIHQgPSBwLm11bHRpcGx5KGJhc2UpO1xyXG4gICAgICAgICAgICByZXR1cm4gdC5jb21wYXJlVG8odmFsdWUpIDw9IDAgPyB7IHA6IHQsIGU6IGUgKiAyICsgMSB9IDogeyBwOiBwLCBlOiBlICogMiB9O1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4geyBwOiBiaWdJbnQoMSksIGU6IDAgfTtcclxuICAgIH1cclxuXHJcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5iaXRMZW5ndGggPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgdmFyIG4gPSB0aGlzO1xyXG4gICAgICAgIGlmIChuLmNvbXBhcmVUbyhiaWdJbnQoMCkpIDwgMCkge1xyXG4gICAgICAgICAgICBuID0gbi5uZWdhdGUoKS5zdWJ0cmFjdChiaWdJbnQoMSkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobi5jb21wYXJlVG8oYmlnSW50KDApKSA9PT0gMCkge1xyXG4gICAgICAgICAgICByZXR1cm4gYmlnSW50KDApO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gYmlnSW50KGludGVnZXJMb2dhcml0aG0obiwgYmlnSW50KDIpKS5lKS5hZGQoYmlnSW50KDEpKTtcclxuICAgIH1cclxuICAgIE5hdGl2ZUJpZ0ludC5wcm90b3R5cGUuYml0TGVuZ3RoID0gU21hbGxJbnRlZ2VyLnByb3RvdHlwZS5iaXRMZW5ndGggPSBCaWdJbnRlZ2VyLnByb3RvdHlwZS5iaXRMZW5ndGg7XHJcblxyXG4gICAgZnVuY3Rpb24gbWF4KGEsIGIpIHtcclxuICAgICAgICBhID0gcGFyc2VWYWx1ZShhKTtcclxuICAgICAgICBiID0gcGFyc2VWYWx1ZShiKTtcclxuICAgICAgICByZXR1cm4gYS5ncmVhdGVyKGIpID8gYSA6IGI7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBtaW4oYSwgYikge1xyXG4gICAgICAgIGEgPSBwYXJzZVZhbHVlKGEpO1xyXG4gICAgICAgIGIgPSBwYXJzZVZhbHVlKGIpO1xyXG4gICAgICAgIHJldHVybiBhLmxlc3NlcihiKSA/IGEgOiBiO1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gZ2NkKGEsIGIpIHtcclxuICAgICAgICBhID0gcGFyc2VWYWx1ZShhKS5hYnMoKTtcclxuICAgICAgICBiID0gcGFyc2VWYWx1ZShiKS5hYnMoKTtcclxuICAgICAgICBpZiAoYS5lcXVhbHMoYikpIHJldHVybiBhO1xyXG4gICAgICAgIGlmIChhLmlzWmVybygpKSByZXR1cm4gYjtcclxuICAgICAgICBpZiAoYi5pc1plcm8oKSkgcmV0dXJuIGE7XHJcbiAgICAgICAgdmFyIGMgPSBJbnRlZ2VyWzFdLCBkLCB0O1xyXG4gICAgICAgIHdoaWxlIChhLmlzRXZlbigpICYmIGIuaXNFdmVuKCkpIHtcclxuICAgICAgICAgICAgZCA9IG1pbihyb3VnaExPQihhKSwgcm91Z2hMT0IoYikpO1xyXG4gICAgICAgICAgICBhID0gYS5kaXZpZGUoZCk7XHJcbiAgICAgICAgICAgIGIgPSBiLmRpdmlkZShkKTtcclxuICAgICAgICAgICAgYyA9IGMubXVsdGlwbHkoZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHdoaWxlIChhLmlzRXZlbigpKSB7XHJcbiAgICAgICAgICAgIGEgPSBhLmRpdmlkZShyb3VnaExPQihhKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGRvIHtcclxuICAgICAgICAgICAgd2hpbGUgKGIuaXNFdmVuKCkpIHtcclxuICAgICAgICAgICAgICAgIGIgPSBiLmRpdmlkZShyb3VnaExPQihiKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKGEuZ3JlYXRlcihiKSkge1xyXG4gICAgICAgICAgICAgICAgdCA9IGI7IGIgPSBhOyBhID0gdDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBiID0gYi5zdWJ0cmFjdChhKTtcclxuICAgICAgICB9IHdoaWxlICghYi5pc1plcm8oKSk7XHJcbiAgICAgICAgcmV0dXJuIGMuaXNVbml0KCkgPyBhIDogYS5tdWx0aXBseShjKTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIGxjbShhLCBiKSB7XHJcbiAgICAgICAgYSA9IHBhcnNlVmFsdWUoYSkuYWJzKCk7XHJcbiAgICAgICAgYiA9IHBhcnNlVmFsdWUoYikuYWJzKCk7XHJcbiAgICAgICAgcmV0dXJuIGEuZGl2aWRlKGdjZChhLCBiKSkubXVsdGlwbHkoYik7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiByYW5kQmV0d2VlbihhLCBiLCBybmcpIHtcclxuICAgICAgICBhID0gcGFyc2VWYWx1ZShhKTtcclxuICAgICAgICBiID0gcGFyc2VWYWx1ZShiKTtcclxuICAgICAgICB2YXIgdXNlZFJORyA9IHJuZyB8fCBNYXRoLnJhbmRvbTtcclxuICAgICAgICB2YXIgbG93ID0gbWluKGEsIGIpLCBoaWdoID0gbWF4KGEsIGIpO1xyXG4gICAgICAgIHZhciByYW5nZSA9IGhpZ2guc3VidHJhY3QobG93KS5hZGQoMSk7XHJcbiAgICAgICAgaWYgKHJhbmdlLmlzU21hbGwpIHJldHVybiBsb3cuYWRkKE1hdGguZmxvb3IodXNlZFJORygpICogcmFuZ2UpKTtcclxuICAgICAgICB2YXIgZGlnaXRzID0gdG9CYXNlKHJhbmdlLCBCQVNFKS52YWx1ZTtcclxuICAgICAgICB2YXIgcmVzdWx0ID0gW10sIHJlc3RyaWN0ZWQgPSB0cnVlO1xyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGlnaXRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHZhciB0b3AgPSByZXN0cmljdGVkID8gZGlnaXRzW2ldICsgKGkgKyAxIDwgZGlnaXRzLmxlbmd0aCA/IGRpZ2l0c1tpICsgMV0gLyBCQVNFIDogMCkgOiBCQVNFO1xyXG4gICAgICAgICAgICB2YXIgZGlnaXQgPSB0cnVuY2F0ZSh1c2VkUk5HKCkgKiB0b3ApO1xyXG4gICAgICAgICAgICByZXN1bHQucHVzaChkaWdpdCk7XHJcbiAgICAgICAgICAgIGlmIChkaWdpdCA8IGRpZ2l0c1tpXSkgcmVzdHJpY3RlZCA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbG93LmFkZChJbnRlZ2VyLmZyb21BcnJheShyZXN1bHQsIEJBU0UsIGZhbHNlKSk7XHJcbiAgICB9XHJcblxyXG4gICAgdmFyIHBhcnNlQmFzZSA9IGZ1bmN0aW9uICh0ZXh0LCBiYXNlLCBhbHBoYWJldCwgY2FzZVNlbnNpdGl2ZSkge1xyXG4gICAgICAgIGFscGhhYmV0ID0gYWxwaGFiZXQgfHwgREVGQVVMVF9BTFBIQUJFVDtcclxuICAgICAgICB0ZXh0ID0gU3RyaW5nKHRleHQpO1xyXG4gICAgICAgIGlmICghY2FzZVNlbnNpdGl2ZSkge1xyXG4gICAgICAgICAgICB0ZXh0ID0gdGV4dC50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICAgICAgICBhbHBoYWJldCA9IGFscGhhYmV0LnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciBsZW5ndGggPSB0ZXh0Lmxlbmd0aDtcclxuICAgICAgICB2YXIgaTtcclxuICAgICAgICB2YXIgYWJzQmFzZSA9IE1hdGguYWJzKGJhc2UpO1xyXG4gICAgICAgIHZhciBhbHBoYWJldFZhbHVlcyA9IHt9O1xyXG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBhbHBoYWJldC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBhbHBoYWJldFZhbHVlc1thbHBoYWJldFtpXV0gPSBpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgdmFyIGMgPSB0ZXh0W2ldO1xyXG4gICAgICAgICAgICBpZiAoYyA9PT0gXCItXCIpIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICBpZiAoYyBpbiBhbHBoYWJldFZhbHVlcykge1xyXG4gICAgICAgICAgICAgICAgaWYgKGFscGhhYmV0VmFsdWVzW2NdID49IGFic0Jhc2UpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoYyA9PT0gXCIxXCIgJiYgYWJzQmFzZSA9PT0gMSkgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGMgKyBcIiBpcyBub3QgYSB2YWxpZCBkaWdpdCBpbiBiYXNlIFwiICsgYmFzZSArIFwiLlwiKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBiYXNlID0gcGFyc2VWYWx1ZShiYXNlKTtcclxuICAgICAgICB2YXIgZGlnaXRzID0gW107XHJcbiAgICAgICAgdmFyIGlzTmVnYXRpdmUgPSB0ZXh0WzBdID09PSBcIi1cIjtcclxuICAgICAgICBmb3IgKGkgPSBpc05lZ2F0aXZlID8gMSA6IDA7IGkgPCB0ZXh0Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHZhciBjID0gdGV4dFtpXTtcclxuICAgICAgICAgICAgaWYgKGMgaW4gYWxwaGFiZXRWYWx1ZXMpIGRpZ2l0cy5wdXNoKHBhcnNlVmFsdWUoYWxwaGFiZXRWYWx1ZXNbY10pKTtcclxuICAgICAgICAgICAgZWxzZSBpZiAoYyA9PT0gXCI8XCIpIHtcclxuICAgICAgICAgICAgICAgIHZhciBzdGFydCA9IGk7XHJcbiAgICAgICAgICAgICAgICBkbyB7IGkrKzsgfSB3aGlsZSAodGV4dFtpXSAhPT0gXCI+XCIgJiYgaSA8IHRleHQubGVuZ3RoKTtcclxuICAgICAgICAgICAgICAgIGRpZ2l0cy5wdXNoKHBhcnNlVmFsdWUodGV4dC5zbGljZShzdGFydCArIDEsIGkpKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB0aHJvdyBuZXcgRXJyb3IoYyArIFwiIGlzIG5vdCBhIHZhbGlkIGNoYXJhY3RlclwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHBhcnNlQmFzZUZyb21BcnJheShkaWdpdHMsIGJhc2UsIGlzTmVnYXRpdmUpO1xyXG4gICAgfTtcclxuXHJcbiAgICBmdW5jdGlvbiBwYXJzZUJhc2VGcm9tQXJyYXkoZGlnaXRzLCBiYXNlLCBpc05lZ2F0aXZlKSB7XHJcbiAgICAgICAgdmFyIHZhbCA9IEludGVnZXJbMF0sIHBvdyA9IEludGVnZXJbMV0sIGk7XHJcbiAgICAgICAgZm9yIChpID0gZGlnaXRzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XHJcbiAgICAgICAgICAgIHZhbCA9IHZhbC5hZGQoZGlnaXRzW2ldLnRpbWVzKHBvdykpO1xyXG4gICAgICAgICAgICBwb3cgPSBwb3cudGltZXMoYmFzZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBpc05lZ2F0aXZlID8gdmFsLm5lZ2F0ZSgpIDogdmFsO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIHN0cmluZ2lmeShkaWdpdCwgYWxwaGFiZXQpIHtcclxuICAgICAgICBhbHBoYWJldCA9IGFscGhhYmV0IHx8IERFRkFVTFRfQUxQSEFCRVQ7XHJcbiAgICAgICAgaWYgKGRpZ2l0IDwgYWxwaGFiZXQubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBhbHBoYWJldFtkaWdpdF07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBcIjxcIiArIGRpZ2l0ICsgXCI+XCI7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gdG9CYXNlKG4sIGJhc2UpIHtcclxuICAgICAgICBiYXNlID0gYmlnSW50KGJhc2UpO1xyXG4gICAgICAgIGlmIChiYXNlLmlzWmVybygpKSB7XHJcbiAgICAgICAgICAgIGlmIChuLmlzWmVybygpKSByZXR1cm4geyB2YWx1ZTogWzBdLCBpc05lZ2F0aXZlOiBmYWxzZSB9O1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgY29udmVydCBub256ZXJvIG51bWJlcnMgdG8gYmFzZSAwLlwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGJhc2UuZXF1YWxzKC0xKSkge1xyXG4gICAgICAgICAgICBpZiAobi5pc1plcm8oKSkgcmV0dXJuIHsgdmFsdWU6IFswXSwgaXNOZWdhdGl2ZTogZmFsc2UgfTtcclxuICAgICAgICAgICAgaWYgKG4uaXNOZWdhdGl2ZSgpKVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogW10uY29uY2F0LmFwcGx5KFtdLCBBcnJheS5hcHBseShudWxsLCBBcnJheSgtbi50b0pTTnVtYmVyKCkpKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAubWFwKEFycmF5LnByb3RvdHlwZS52YWx1ZU9mLCBbMSwgMF0pXHJcbiAgICAgICAgICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgICAgICAgICBpc05lZ2F0aXZlOiBmYWxzZVxyXG4gICAgICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIHZhciBhcnIgPSBBcnJheS5hcHBseShudWxsLCBBcnJheShuLnRvSlNOdW1iZXIoKSAtIDEpKVxyXG4gICAgICAgICAgICAgICAgLm1hcChBcnJheS5wcm90b3R5cGUudmFsdWVPZiwgWzAsIDFdKTtcclxuICAgICAgICAgICAgYXJyLnVuc2hpZnQoWzFdKTtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIHZhbHVlOiBbXS5jb25jYXQuYXBwbHkoW10sIGFyciksXHJcbiAgICAgICAgICAgICAgICBpc05lZ2F0aXZlOiBmYWxzZVxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIG5lZyA9IGZhbHNlO1xyXG4gICAgICAgIGlmIChuLmlzTmVnYXRpdmUoKSAmJiBiYXNlLmlzUG9zaXRpdmUoKSkge1xyXG4gICAgICAgICAgICBuZWcgPSB0cnVlO1xyXG4gICAgICAgICAgICBuID0gbi5hYnMoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGJhc2UuaXNVbml0KCkpIHtcclxuICAgICAgICAgICAgaWYgKG4uaXNaZXJvKCkpIHJldHVybiB7IHZhbHVlOiBbMF0sIGlzTmVnYXRpdmU6IGZhbHNlIH07XHJcblxyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgdmFsdWU6IEFycmF5LmFwcGx5KG51bGwsIEFycmF5KG4udG9KU051bWJlcigpKSlcclxuICAgICAgICAgICAgICAgICAgICAubWFwKE51bWJlci5wcm90b3R5cGUudmFsdWVPZiwgMSksXHJcbiAgICAgICAgICAgICAgICBpc05lZ2F0aXZlOiBuZWdcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIG91dCA9IFtdO1xyXG4gICAgICAgIHZhciBsZWZ0ID0gbiwgZGl2bW9kO1xyXG4gICAgICAgIHdoaWxlIChsZWZ0LmlzTmVnYXRpdmUoKSB8fCBsZWZ0LmNvbXBhcmVBYnMoYmFzZSkgPj0gMCkge1xyXG4gICAgICAgICAgICBkaXZtb2QgPSBsZWZ0LmRpdm1vZChiYXNlKTtcclxuICAgICAgICAgICAgbGVmdCA9IGRpdm1vZC5xdW90aWVudDtcclxuICAgICAgICAgICAgdmFyIGRpZ2l0ID0gZGl2bW9kLnJlbWFpbmRlcjtcclxuICAgICAgICAgICAgaWYgKGRpZ2l0LmlzTmVnYXRpdmUoKSkge1xyXG4gICAgICAgICAgICAgICAgZGlnaXQgPSBiYXNlLm1pbnVzKGRpZ2l0KS5hYnMoKTtcclxuICAgICAgICAgICAgICAgIGxlZnQgPSBsZWZ0Lm5leHQoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBvdXQucHVzaChkaWdpdC50b0pTTnVtYmVyKCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBvdXQucHVzaChsZWZ0LnRvSlNOdW1iZXIoKSk7XHJcbiAgICAgICAgcmV0dXJuIHsgdmFsdWU6IG91dC5yZXZlcnNlKCksIGlzTmVnYXRpdmU6IG5lZyB9O1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIHRvQmFzZVN0cmluZyhuLCBiYXNlLCBhbHBoYWJldCkge1xyXG4gICAgICAgIHZhciBhcnIgPSB0b0Jhc2UobiwgYmFzZSk7XHJcbiAgICAgICAgcmV0dXJuIChhcnIuaXNOZWdhdGl2ZSA/IFwiLVwiIDogXCJcIikgKyBhcnIudmFsdWUubWFwKGZ1bmN0aW9uICh4KSB7XHJcbiAgICAgICAgICAgIHJldHVybiBzdHJpbmdpZnkoeCwgYWxwaGFiZXQpO1xyXG4gICAgICAgIH0pLmpvaW4oJycpO1xyXG4gICAgfVxyXG5cclxuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLnRvQXJyYXkgPSBmdW5jdGlvbiAocmFkaXgpIHtcclxuICAgICAgICByZXR1cm4gdG9CYXNlKHRoaXMsIHJhZGl4KTtcclxuICAgIH07XHJcblxyXG4gICAgU21hbGxJbnRlZ2VyLnByb3RvdHlwZS50b0FycmF5ID0gZnVuY3Rpb24gKHJhZGl4KSB7XHJcbiAgICAgICAgcmV0dXJuIHRvQmFzZSh0aGlzLCByYWRpeCk7XHJcbiAgICB9O1xyXG5cclxuICAgIE5hdGl2ZUJpZ0ludC5wcm90b3R5cGUudG9BcnJheSA9IGZ1bmN0aW9uIChyYWRpeCkge1xyXG4gICAgICAgIHJldHVybiB0b0Jhc2UodGhpcywgcmFkaXgpO1xyXG4gICAgfTtcclxuXHJcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uIChyYWRpeCwgYWxwaGFiZXQpIHtcclxuICAgICAgICBpZiAocmFkaXggPT09IHVuZGVmaW5lZCkgcmFkaXggPSAxMDtcclxuICAgICAgICBpZiAocmFkaXggIT09IDEwKSByZXR1cm4gdG9CYXNlU3RyaW5nKHRoaXMsIHJhZGl4LCBhbHBoYWJldCk7XHJcbiAgICAgICAgdmFyIHYgPSB0aGlzLnZhbHVlLCBsID0gdi5sZW5ndGgsIHN0ciA9IFN0cmluZyh2Wy0tbF0pLCB6ZXJvcyA9IFwiMDAwMDAwMFwiLCBkaWdpdDtcclxuICAgICAgICB3aGlsZSAoLS1sID49IDApIHtcclxuICAgICAgICAgICAgZGlnaXQgPSBTdHJpbmcodltsXSk7XHJcbiAgICAgICAgICAgIHN0ciArPSB6ZXJvcy5zbGljZShkaWdpdC5sZW5ndGgpICsgZGlnaXQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciBzaWduID0gdGhpcy5zaWduID8gXCItXCIgOiBcIlwiO1xyXG4gICAgICAgIHJldHVybiBzaWduICsgc3RyO1xyXG4gICAgfTtcclxuXHJcbiAgICBTbWFsbEludGVnZXIucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKHJhZGl4LCBhbHBoYWJldCkge1xyXG4gICAgICAgIGlmIChyYWRpeCA9PT0gdW5kZWZpbmVkKSByYWRpeCA9IDEwO1xyXG4gICAgICAgIGlmIChyYWRpeCAhPSAxMCkgcmV0dXJuIHRvQmFzZVN0cmluZyh0aGlzLCByYWRpeCwgYWxwaGFiZXQpO1xyXG4gICAgICAgIHJldHVybiBTdHJpbmcodGhpcy52YWx1ZSk7XHJcbiAgICB9O1xyXG5cclxuICAgIE5hdGl2ZUJpZ0ludC5wcm90b3R5cGUudG9TdHJpbmcgPSBTbWFsbEludGVnZXIucHJvdG90eXBlLnRvU3RyaW5nO1xyXG5cclxuICAgIE5hdGl2ZUJpZ0ludC5wcm90b3R5cGUudG9KU09OID0gQmlnSW50ZWdlci5wcm90b3R5cGUudG9KU09OID0gU21hbGxJbnRlZ2VyLnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLnRvU3RyaW5nKCk7IH1cclxuXHJcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS52YWx1ZU9mID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHJldHVybiBwYXJzZUludCh0aGlzLnRvU3RyaW5nKCksIDEwKTtcclxuICAgIH07XHJcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS50b0pTTnVtYmVyID0gQmlnSW50ZWdlci5wcm90b3R5cGUudmFsdWVPZjtcclxuXHJcbiAgICBTbWFsbEludGVnZXIucHJvdG90eXBlLnZhbHVlT2YgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudmFsdWU7XHJcbiAgICB9O1xyXG4gICAgU21hbGxJbnRlZ2VyLnByb3RvdHlwZS50b0pTTnVtYmVyID0gU21hbGxJbnRlZ2VyLnByb3RvdHlwZS52YWx1ZU9mO1xyXG4gICAgTmF0aXZlQmlnSW50LnByb3RvdHlwZS52YWx1ZU9mID0gTmF0aXZlQmlnSW50LnByb3RvdHlwZS50b0pTTnVtYmVyID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHJldHVybiBwYXJzZUludCh0aGlzLnRvU3RyaW5nKCksIDEwKTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBwYXJzZVN0cmluZ1ZhbHVlKHYpIHtcclxuICAgICAgICBpZiAoaXNQcmVjaXNlKCt2KSkge1xyXG4gICAgICAgICAgICB2YXIgeCA9ICt2O1xyXG4gICAgICAgICAgICBpZiAoeCA9PT0gdHJ1bmNhdGUoeCkpXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gc3VwcG9ydHNOYXRpdmVCaWdJbnQgPyBuZXcgTmF0aXZlQmlnSW50KEJpZ0ludCh4KSkgOiBuZXcgU21hbGxJbnRlZ2VyKHgpO1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGludGVnZXI6IFwiICsgdik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciBzaWduID0gdlswXSA9PT0gXCItXCI7XHJcbiAgICAgICAgaWYgKHNpZ24pIHYgPSB2LnNsaWNlKDEpO1xyXG4gICAgICAgIHZhciBzcGxpdCA9IHYuc3BsaXQoL2UvaSk7XHJcbiAgICAgICAgaWYgKHNwbGl0Lmxlbmd0aCA+IDIpIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgaW50ZWdlcjogXCIgKyBzcGxpdC5qb2luKFwiZVwiKSk7XHJcbiAgICAgICAgaWYgKHNwbGl0Lmxlbmd0aCA9PT0gMikge1xyXG4gICAgICAgICAgICB2YXIgZXhwID0gc3BsaXRbMV07XHJcbiAgICAgICAgICAgIGlmIChleHBbMF0gPT09IFwiK1wiKSBleHAgPSBleHAuc2xpY2UoMSk7XHJcbiAgICAgICAgICAgIGV4cCA9ICtleHA7XHJcbiAgICAgICAgICAgIGlmIChleHAgIT09IHRydW5jYXRlKGV4cCkgfHwgIWlzUHJlY2lzZShleHApKSB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGludGVnZXI6IFwiICsgZXhwICsgXCIgaXMgbm90IGEgdmFsaWQgZXhwb25lbnQuXCIpO1xyXG4gICAgICAgICAgICB2YXIgdGV4dCA9IHNwbGl0WzBdO1xyXG4gICAgICAgICAgICB2YXIgZGVjaW1hbFBsYWNlID0gdGV4dC5pbmRleE9mKFwiLlwiKTtcclxuICAgICAgICAgICAgaWYgKGRlY2ltYWxQbGFjZSA+PSAwKSB7XHJcbiAgICAgICAgICAgICAgICBleHAgLT0gdGV4dC5sZW5ndGggLSBkZWNpbWFsUGxhY2UgLSAxO1xyXG4gICAgICAgICAgICAgICAgdGV4dCA9IHRleHQuc2xpY2UoMCwgZGVjaW1hbFBsYWNlKSArIHRleHQuc2xpY2UoZGVjaW1hbFBsYWNlICsgMSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKGV4cCA8IDApIHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBpbmNsdWRlIG5lZ2F0aXZlIGV4cG9uZW50IHBhcnQgZm9yIGludGVnZXJzXCIpO1xyXG4gICAgICAgICAgICB0ZXh0ICs9IChuZXcgQXJyYXkoZXhwICsgMSkpLmpvaW4oXCIwXCIpO1xyXG4gICAgICAgICAgICB2ID0gdGV4dDtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIGlzVmFsaWQgPSAvXihbMC05XVswLTldKikkLy50ZXN0KHYpO1xyXG4gICAgICAgIGlmICghaXNWYWxpZCkgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBpbnRlZ2VyOiBcIiArIHYpO1xyXG4gICAgICAgIGlmIChzdXBwb3J0c05hdGl2ZUJpZ0ludCkge1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3IE5hdGl2ZUJpZ0ludChCaWdJbnQoc2lnbiA/IFwiLVwiICsgdiA6IHYpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIHIgPSBbXSwgbWF4ID0gdi5sZW5ndGgsIGwgPSBMT0dfQkFTRSwgbWluID0gbWF4IC0gbDtcclxuICAgICAgICB3aGlsZSAobWF4ID4gMCkge1xyXG4gICAgICAgICAgICByLnB1c2goK3Yuc2xpY2UobWluLCBtYXgpKTtcclxuICAgICAgICAgICAgbWluIC09IGw7XHJcbiAgICAgICAgICAgIGlmIChtaW4gPCAwKSBtaW4gPSAwO1xyXG4gICAgICAgICAgICBtYXggLT0gbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgdHJpbShyKTtcclxuICAgICAgICByZXR1cm4gbmV3IEJpZ0ludGVnZXIociwgc2lnbik7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gcGFyc2VOdW1iZXJWYWx1ZSh2KSB7XHJcbiAgICAgICAgaWYgKHN1cHBvcnRzTmF0aXZlQmlnSW50KSB7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgTmF0aXZlQmlnSW50KEJpZ0ludCh2KSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChpc1ByZWNpc2UodikpIHtcclxuICAgICAgICAgICAgaWYgKHYgIT09IHRydW5jYXRlKHYpKSB0aHJvdyBuZXcgRXJyb3IodiArIFwiIGlzIG5vdCBhbiBpbnRlZ2VyLlwiKTtcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBTbWFsbEludGVnZXIodik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBwYXJzZVN0cmluZ1ZhbHVlKHYudG9TdHJpbmcoKSk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gcGFyc2VWYWx1ZSh2KSB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiB2ID09PSBcIm51bWJlclwiKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBwYXJzZU51bWJlclZhbHVlKHYpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodHlwZW9mIHYgPT09IFwic3RyaW5nXCIpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHBhcnNlU3RyaW5nVmFsdWUodik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0eXBlb2YgdiA9PT0gXCJiaWdpbnRcIikge1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3IE5hdGl2ZUJpZ0ludCh2KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHY7XHJcbiAgICB9XHJcbiAgICAvLyBQcmUtZGVmaW5lIG51bWJlcnMgaW4gcmFuZ2UgWy05OTksOTk5XVxyXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCAxMDAwOyBpKyspIHtcclxuICAgICAgICBJbnRlZ2VyW2ldID0gcGFyc2VWYWx1ZShpKTtcclxuICAgICAgICBpZiAoaSA+IDApIEludGVnZXJbLWldID0gcGFyc2VWYWx1ZSgtaSk7XHJcbiAgICB9XHJcbiAgICAvLyBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxyXG4gICAgSW50ZWdlci5vbmUgPSBJbnRlZ2VyWzFdO1xyXG4gICAgSW50ZWdlci56ZXJvID0gSW50ZWdlclswXTtcclxuICAgIEludGVnZXIubWludXNPbmUgPSBJbnRlZ2VyWy0xXTtcclxuICAgIEludGVnZXIubWF4ID0gbWF4O1xyXG4gICAgSW50ZWdlci5taW4gPSBtaW47XHJcbiAgICBJbnRlZ2VyLmdjZCA9IGdjZDtcclxuICAgIEludGVnZXIubGNtID0gbGNtO1xyXG4gICAgSW50ZWdlci5pc0luc3RhbmNlID0gZnVuY3Rpb24gKHgpIHsgcmV0dXJuIHggaW5zdGFuY2VvZiBCaWdJbnRlZ2VyIHx8IHggaW5zdGFuY2VvZiBTbWFsbEludGVnZXIgfHwgeCBpbnN0YW5jZW9mIE5hdGl2ZUJpZ0ludDsgfTtcclxuICAgIEludGVnZXIucmFuZEJldHdlZW4gPSByYW5kQmV0d2VlbjtcclxuXHJcbiAgICBJbnRlZ2VyLmZyb21BcnJheSA9IGZ1bmN0aW9uIChkaWdpdHMsIGJhc2UsIGlzTmVnYXRpdmUpIHtcclxuICAgICAgICByZXR1cm4gcGFyc2VCYXNlRnJvbUFycmF5KGRpZ2l0cy5tYXAocGFyc2VWYWx1ZSksIHBhcnNlVmFsdWUoYmFzZSB8fCAxMCksIGlzTmVnYXRpdmUpO1xyXG4gICAgfTtcclxuXHJcbiAgICByZXR1cm4gSW50ZWdlcjtcclxufSkoKTtcclxuXHJcbi8vIE5vZGUuanMgY2hlY2tcclxuaWYgKHR5cGVvZiBtb2R1bGUgIT09IFwidW5kZWZpbmVkXCIgJiYgbW9kdWxlLmhhc093blByb3BlcnR5KFwiZXhwb3J0c1wiKSkge1xyXG4gICAgbW9kdWxlLmV4cG9ydHMgPSBiaWdJbnQ7XHJcbn1cclxuXHJcbi8vYW1kIGNoZWNrXHJcbmlmICh0eXBlb2YgZGVmaW5lID09PSBcImZ1bmN0aW9uXCIgJiYgZGVmaW5lLmFtZCkge1xyXG4gICAgZGVmaW5lKCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgcmV0dXJuIGJpZ0ludDtcclxuICAgIH0pO1xyXG59XHJcbiIsIihmdW5jdGlvbiAocm9vdCkge1xuXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICpcbiAqIEJpdFZpZXdcbiAqXG4gKiBCaXRWaWV3IHByb3ZpZGVzIGEgc2ltaWxhciBpbnRlcmZhY2UgdG8gdGhlIHN0YW5kYXJkXG4gKiBEYXRhVmlldywgYnV0IHdpdGggc3VwcG9ydCBmb3IgYml0LWxldmVsIHJlYWRzIC8gd3JpdGVzLlxuICpcbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xudmFyIEJpdFZpZXcgPSBmdW5jdGlvbiAoc291cmNlLCBieXRlT2Zmc2V0LCBieXRlTGVuZ3RoKSB7XG5cdHZhciBpc0J1ZmZlciA9IHNvdXJjZSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyIHx8XG5cdFx0KHR5cGVvZiBCdWZmZXIgIT09ICd1bmRlZmluZWQnICYmIHNvdXJjZSBpbnN0YW5jZW9mIEJ1ZmZlcik7XG5cblx0aWYgKCFpc0J1ZmZlcikge1xuXHRcdHRocm93IG5ldyBFcnJvcignTXVzdCBzcGVjaWZ5IGEgdmFsaWQgQXJyYXlCdWZmZXIgb3IgQnVmZmVyLicpO1xuXHR9XG5cblx0Ynl0ZU9mZnNldCA9IGJ5dGVPZmZzZXQgfHwgMDtcblx0Ynl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggfHwgc291cmNlLmJ5dGVMZW5ndGggLyogQXJyYXlCdWZmZXIgKi8gfHwgc291cmNlLmxlbmd0aCAvKiBCdWZmZXIgKi87XG5cblx0dGhpcy5fYnVmZmVyID0gc291cmNlO1xuXHR0aGlzLl92aWV3ID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5fYnVmZmVyLCBieXRlT2Zmc2V0LCBieXRlTGVuZ3RoKTtcbn07XG5cbi8vIFVzZWQgdG8gbWFzc2FnZSBmcCB2YWx1ZXMgc28gd2UgY2FuIG9wZXJhdGUgb24gdGhlbVxuLy8gYXQgdGhlIGJpdCBsZXZlbC5cbkJpdFZpZXcuX3NjcmF0Y2ggPSBuZXcgRGF0YVZpZXcobmV3IEFycmF5QnVmZmVyKDgpKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KEJpdFZpZXcucHJvdG90eXBlLCAnYnVmZmVyJywge1xuXHRnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuX2J1ZmZlcjsgfSxcblx0ZW51bWVyYWJsZTogdHJ1ZSxcblx0Y29uZmlndXJhYmxlOiBmYWxzZVxufSk7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShCaXRWaWV3LnByb3RvdHlwZSwgJ2J5dGVMZW5ndGgnLCB7XG5cdGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fdmlldy5sZW5ndGg7IH0sXG5cdGVudW1lcmFibGU6IHRydWUsXG5cdGNvbmZpZ3VyYWJsZTogZmFsc2Vcbn0pO1xuXG5CaXRWaWV3LnByb3RvdHlwZS5fZ2V0Qml0ID0gZnVuY3Rpb24gKG9mZnNldCkge1xuXHRyZXR1cm4gdGhpcy5fdmlld1tvZmZzZXQgPj4gM10gPj4gKG9mZnNldCAmIDcpICYgMHgxO1xufTtcblxuQml0Vmlldy5wcm90b3R5cGUuX3NldEJpdCA9IGZ1bmN0aW9uIChvZmZzZXQsIG9uKSB7XG5cdGlmIChvbikge1xuXHRcdHRoaXMuX3ZpZXdbb2Zmc2V0ID4+IDNdIHw9IDEgPDwgKG9mZnNldCAmIDcpO1xuXHR9IGVsc2Uge1xuXHRcdHRoaXMuX3ZpZXdbb2Zmc2V0ID4+IDNdICY9IH4oMSA8PCAob2Zmc2V0ICYgNykpO1xuXHR9XG59O1xuXG5CaXRWaWV3LnByb3RvdHlwZS5nZXRCaXRzID0gZnVuY3Rpb24gKG9mZnNldCwgYml0cywgc2lnbmVkKSB7XG5cdHZhciBhdmFpbGFibGUgPSAodGhpcy5fdmlldy5sZW5ndGggKiA4IC0gb2Zmc2V0KTtcblxuXHRpZiAoYml0cyA+IGF2YWlsYWJsZSkge1xuXHRcdHRocm93IG5ldyBFcnJvcignQ2Fubm90IGdldCAnICsgYml0cyArICcgYml0KHMpIGZyb20gb2Zmc2V0ICcgKyBvZmZzZXQgKyAnLCAnICsgYXZhaWxhYmxlICsgJyBhdmFpbGFibGUnKTtcblx0fVxuXG5cdHZhciB2YWx1ZSA9IDA7XG5cdGZvciAodmFyIGkgPSAwOyBpIDwgYml0czspIHtcblx0XHR2YXIgcmVhZDtcblxuXHRcdC8vIFJlYWQgYW4gZW50aXJlIGJ5dGUgaWYgd2UgY2FuLlxuXHRcdGlmICgoYml0cyAtIGkpID49IDggJiYgKChvZmZzZXQgJiA3KSA9PT0gMCkpIHtcblx0XHRcdHZhbHVlIHw9ICh0aGlzLl92aWV3W29mZnNldCA+PiAzXSA8PCBpKTtcblx0XHRcdHJlYWQgPSA4O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR2YWx1ZSB8PSAodGhpcy5fZ2V0Qml0KG9mZnNldCkgPDwgaSk7XG5cdFx0XHRyZWFkID0gMTtcblx0XHR9XG5cblx0XHRvZmZzZXQgKz0gcmVhZDtcblx0XHRpICs9IHJlYWQ7XG5cdH1cblxuXHRpZiAoc2lnbmVkKSB7XG5cdFx0Ly8gSWYgd2UncmUgbm90IHdvcmtpbmcgd2l0aCBhIGZ1bGwgMzIgYml0cywgY2hlY2sgdGhlXG5cdFx0Ly8gaW1hZ2luYXJ5IE1TQiBmb3IgdGhpcyBiaXQgY291bnQgYW5kIGNvbnZlcnQgdG8gYVxuXHRcdC8vIHZhbGlkIDMyLWJpdCBzaWduZWQgdmFsdWUgaWYgc2V0LlxuXHRcdGlmIChiaXRzICE9PSAzMiAmJiB2YWx1ZSAmICgxIDw8IChiaXRzIC0gMSkpKSB7XG5cdFx0XHR2YWx1ZSB8PSAtMSBeICgoMSA8PCBiaXRzKSAtIDEpO1xuXHRcdH1cblxuXHRcdHJldHVybiB2YWx1ZTtcblx0fVxuXG5cdHJldHVybiB2YWx1ZSA+Pj4gMDtcbn07XG5cbkJpdFZpZXcucHJvdG90eXBlLnNldEJpdHMgPSBmdW5jdGlvbiAob2Zmc2V0LCB2YWx1ZSwgYml0cykge1xuXHR2YXIgYXZhaWxhYmxlID0gKHRoaXMuX3ZpZXcubGVuZ3RoICogOCAtIG9mZnNldCk7XG5cblx0aWYgKGJpdHMgPiBhdmFpbGFibGUpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBzZXQgJyArIGJpdHMgKyAnIGJpdChzKSBmcm9tIG9mZnNldCAnICsgb2Zmc2V0ICsgJywgJyArIGF2YWlsYWJsZSArICcgYXZhaWxhYmxlJyk7XG5cdH1cblxuXHRmb3IgKHZhciBpID0gMDsgaSA8IGJpdHM7KSB7XG5cdFx0dmFyIHdyb3RlO1xuXG5cdFx0Ly8gV3JpdGUgYW4gZW50aXJlIGJ5dGUgaWYgd2UgY2FuLlxuXHRcdGlmICgoYml0cyAtIGkpID49IDggJiYgKChvZmZzZXQgJiA3KSA9PT0gMCkpIHtcblx0XHRcdHRoaXMuX3ZpZXdbb2Zmc2V0ID4+IDNdID0gdmFsdWUgJiAweEZGO1xuXHRcdFx0d3JvdGUgPSA4O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLl9zZXRCaXQob2Zmc2V0LCB2YWx1ZSAmIDB4MSk7XG5cdFx0XHR3cm90ZSA9IDE7XG5cdFx0fVxuXG5cdFx0dmFsdWUgPSAodmFsdWUgPj4gd3JvdGUpO1xuXG5cdFx0b2Zmc2V0ICs9IHdyb3RlO1xuXHRcdGkgKz0gd3JvdGU7XG5cdH1cbn07XG5cbkJpdFZpZXcucHJvdG90eXBlLmdldEludDggPSBmdW5jdGlvbiAob2Zmc2V0KSB7XG5cdHJldHVybiB0aGlzLmdldEJpdHMob2Zmc2V0LCA4LCB0cnVlKTtcbn07XG5CaXRWaWV3LnByb3RvdHlwZS5nZXRVaW50OCA9IGZ1bmN0aW9uIChvZmZzZXQpIHtcblx0cmV0dXJuIHRoaXMuZ2V0Qml0cyhvZmZzZXQsIDgsIGZhbHNlKTtcbn07XG5CaXRWaWV3LnByb3RvdHlwZS5nZXRJbnQxNiA9IGZ1bmN0aW9uIChvZmZzZXQpIHtcblx0cmV0dXJuIHRoaXMuZ2V0Qml0cyhvZmZzZXQsIDE2LCB0cnVlKTtcbn07XG5CaXRWaWV3LnByb3RvdHlwZS5nZXRVaW50MTYgPSBmdW5jdGlvbiAob2Zmc2V0KSB7XG5cdHJldHVybiB0aGlzLmdldEJpdHMob2Zmc2V0LCAxNiwgZmFsc2UpO1xufTtcbkJpdFZpZXcucHJvdG90eXBlLmdldEludDMyID0gZnVuY3Rpb24gKG9mZnNldCkge1xuXHRyZXR1cm4gdGhpcy5nZXRCaXRzKG9mZnNldCwgMzIsIHRydWUpO1xufTtcbkJpdFZpZXcucHJvdG90eXBlLmdldFVpbnQzMiA9IGZ1bmN0aW9uIChvZmZzZXQpIHtcblx0cmV0dXJuIHRoaXMuZ2V0Qml0cyhvZmZzZXQsIDMyLCBmYWxzZSk7XG59O1xuQml0Vmlldy5wcm90b3R5cGUuZ2V0RmxvYXQzMiA9IGZ1bmN0aW9uIChvZmZzZXQpIHtcblx0Qml0Vmlldy5fc2NyYXRjaC5zZXRVaW50MzIoMCwgdGhpcy5nZXRVaW50MzIob2Zmc2V0KSk7XG5cdHJldHVybiBCaXRWaWV3Ll9zY3JhdGNoLmdldEZsb2F0MzIoMCk7XG59O1xuQml0Vmlldy5wcm90b3R5cGUuZ2V0RmxvYXQ2NCA9IGZ1bmN0aW9uIChvZmZzZXQpIHtcblx0Qml0Vmlldy5fc2NyYXRjaC5zZXRVaW50MzIoMCwgdGhpcy5nZXRVaW50MzIob2Zmc2V0KSk7XG5cdC8vIERhdGFWaWV3IG9mZnNldCBpcyBpbiBieXRlcy5cblx0Qml0Vmlldy5fc2NyYXRjaC5zZXRVaW50MzIoNCwgdGhpcy5nZXRVaW50MzIob2Zmc2V0KzMyKSk7XG5cdHJldHVybiBCaXRWaWV3Ll9zY3JhdGNoLmdldEZsb2F0NjQoMCk7XG59O1xuXG5CaXRWaWV3LnByb3RvdHlwZS5zZXRJbnQ4ICA9XG5CaXRWaWV3LnByb3RvdHlwZS5zZXRVaW50OCA9IGZ1bmN0aW9uIChvZmZzZXQsIHZhbHVlKSB7XG5cdHRoaXMuc2V0Qml0cyhvZmZzZXQsIHZhbHVlLCA4KTtcbn07XG5CaXRWaWV3LnByb3RvdHlwZS5zZXRJbnQxNiAgPVxuQml0Vmlldy5wcm90b3R5cGUuc2V0VWludDE2ID0gZnVuY3Rpb24gKG9mZnNldCwgdmFsdWUpIHtcblx0dGhpcy5zZXRCaXRzKG9mZnNldCwgdmFsdWUsIDE2KTtcbn07XG5CaXRWaWV3LnByb3RvdHlwZS5zZXRJbnQzMiAgPVxuQml0Vmlldy5wcm90b3R5cGUuc2V0VWludDMyID0gZnVuY3Rpb24gKG9mZnNldCwgdmFsdWUpIHtcblx0dGhpcy5zZXRCaXRzKG9mZnNldCwgdmFsdWUsIDMyKTtcbn07XG5CaXRWaWV3LnByb3RvdHlwZS5zZXRGbG9hdDMyID0gZnVuY3Rpb24gKG9mZnNldCwgdmFsdWUpIHtcblx0Qml0Vmlldy5fc2NyYXRjaC5zZXRGbG9hdDMyKDAsIHZhbHVlKTtcblx0dGhpcy5zZXRCaXRzKG9mZnNldCwgQml0Vmlldy5fc2NyYXRjaC5nZXRVaW50MzIoMCksIDMyKTtcbn07XG5CaXRWaWV3LnByb3RvdHlwZS5zZXRGbG9hdDY0ID0gZnVuY3Rpb24gKG9mZnNldCwgdmFsdWUpIHtcblx0Qml0Vmlldy5fc2NyYXRjaC5zZXRGbG9hdDY0KDAsIHZhbHVlKTtcblx0dGhpcy5zZXRCaXRzKG9mZnNldCwgQml0Vmlldy5fc2NyYXRjaC5nZXRVaW50MzIoMCksIDMyKTtcblx0dGhpcy5zZXRCaXRzKG9mZnNldCszMiwgQml0Vmlldy5fc2NyYXRjaC5nZXRVaW50MzIoNCksIDMyKTtcbn07XG5cbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gKlxuICogQml0U3RyZWFtXG4gKlxuICogU21hbGwgd3JhcHBlciBmb3IgYSBCaXRWaWV3IHRvIG1haW50YWluIHlvdXIgcG9zaXRpb24sXG4gKiBhcyB3ZWxsIGFzIHRvIGhhbmRsZSByZWFkaW5nIC8gd3JpdGluZyBvZiBzdHJpbmcgZGF0YVxuICogdG8gdGhlIHVuZGVybHlpbmcgYnVmZmVyLlxuICpcbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xudmFyIHJlYWRlciA9IGZ1bmN0aW9uIChuYW1lLCBzaXplKSB7XG5cdHJldHVybiBmdW5jdGlvbiAoKSB7XG5cdFx0dmFyIHZhbCA9IHRoaXMuX3ZpZXdbbmFtZV0odGhpcy5faW5kZXgpO1xuXHRcdHRoaXMuX2luZGV4ICs9IHNpemU7XG5cdFx0cmV0dXJuIHZhbDtcblx0fTtcbn07XG5cbnZhciB3cml0ZXIgPSBmdW5jdGlvbiAobmFtZSwgc2l6ZSkge1xuXHRyZXR1cm4gZnVuY3Rpb24gKHZhbHVlKSB7XG5cdFx0dGhpcy5fdmlld1tuYW1lXSh0aGlzLl9pbmRleCwgdmFsdWUpO1xuXHRcdHRoaXMuX2luZGV4ICs9IHNpemU7XG5cdH07XG59O1xuXG5mdW5jdGlvbiByZWFkQVNDSUlTdHJpbmcoc3RyZWFtLCBieXRlcykge1xuXHR2YXIgaSA9IDA7XG5cdHZhciBjaGFycyA9IFtdO1xuXHR2YXIgYXBwZW5kID0gdHJ1ZTtcblxuXHQvLyBSZWFkIHdoaWxlIHdlIHN0aWxsIGhhdmUgc3BhY2UgYXZhaWxhYmxlLCBvciB1bnRpbCB3ZSd2ZVxuXHQvLyBoaXQgdGhlIGZpeGVkIGJ5dGUgbGVuZ3RoIHBhc3NlZCBpbi5cblx0d2hpbGUgKCFieXRlcyB8fCAoYnl0ZXMgJiYgaSA8IGJ5dGVzKSkge1xuXHRcdHZhciBjID0gc3RyZWFtLnJlYWRVaW50OCgpO1xuXG5cdFx0Ly8gU3RvcCBhcHBlbmRpbmcgY2hhcnMgb25jZSB3ZSBoaXQgMHgwMFxuXHRcdGlmIChjID09PSAweDAwKSB7XG5cdFx0XHRhcHBlbmQgPSBmYWxzZTtcblxuXHRcdFx0Ly8gSWYgd2UgZG9uJ3QgaGF2ZSBhIGZpeGVkIGxlbmd0aCB0byByZWFkLCBicmVhayBvdXQgbm93LlxuXHRcdFx0aWYgKCFieXRlcykge1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoYXBwZW5kKSB7XG5cdFx0XHRjaGFycy5wdXNoKGMpO1xuXHRcdH1cblxuXHRcdGkrKztcblx0fVxuXG5cdC8vIENvbnZlcnQgY2hhciBjb2RlIGFycmF5IGJhY2sgdG8gc3RyaW5nLlxuXHRyZXR1cm4gY2hhcnMubWFwKGZ1bmN0aW9uICh4KSB7XG5cdFx0cmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoeCk7XG5cdH0pLmpvaW4oJycpO1xufVxuXG5mdW5jdGlvbiB3cml0ZUFTQ0lJU3RyaW5nKHN0cmVhbSwgc3RyaW5nLCBieXRlcykge1xuXHR2YXIgbGVuZ3RoID0gYnl0ZXMgfHwgc3RyaW5nLmxlbmd0aCArIDE7ICAvLyArIDEgZm9yIE5VTExcblxuXHRmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG5cdFx0c3RyZWFtLndyaXRlVWludDgoaSA8IHN0cmluZy5sZW5ndGggPyBzdHJpbmcuY2hhckNvZGVBdChpKSA6IDB4MDApO1xuXHR9XG59XG5cbnZhciBCaXRTdHJlYW0gPSBmdW5jdGlvbiAoc291cmNlLCBieXRlT2Zmc2V0LCBieXRlTGVuZ3RoKSB7XG5cdHZhciBpc0J1ZmZlciA9IHNvdXJjZSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyIHx8XG5cdFx0KHR5cGVvZiBCdWZmZXIgIT09ICd1bmRlZmluZWQnICYmIHNvdXJjZSBpbnN0YW5jZW9mIEJ1ZmZlcik7XG5cblx0aWYgKCEoc291cmNlIGluc3RhbmNlb2YgQml0VmlldykgJiYgIWlzQnVmZmVyKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKCdNdXN0IHNwZWNpZnkgYSB2YWxpZCBCaXRWaWV3LCBBcnJheUJ1ZmZlciBvciBCdWZmZXInKTtcblx0fVxuXG5cdGlmIChpc0J1ZmZlcikge1xuXHRcdHRoaXMuX3ZpZXcgPSBuZXcgQml0Vmlldyhzb3VyY2UsIGJ5dGVPZmZzZXQsIGJ5dGVMZW5ndGgpO1xuXHR9IGVsc2Uge1xuXHRcdHRoaXMuX3ZpZXcgPSBzb3VyY2U7XG5cdH1cblxuXHR0aGlzLl9pbmRleCA9IDA7XG59O1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoQml0U3RyZWFtLnByb3RvdHlwZSwgJ2J5dGVJbmRleCcsIHtcblx0Ly8gQ2VpbCB0aGUgcmV0dXJuZWQgdmFsdWUsIG92ZXIgY29tcGVuc2F0aW5nIGZvciB0aGUgYW1vdW50IG9mXG5cdC8vIGJpdHMgd3JpdHRlbiB0byB0aGUgc3RyZWFtLlxuXHRnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIE1hdGguY2VpbCh0aGlzLl9pbmRleCAvIDgpOyB9LFxuXHRzZXQ6IGZ1bmN0aW9uICh2YWwpIHsgdGhpcy5faW5kZXggPSB2YWwgKiA4OyB9LFxuXHRlbnVtZXJhYmxlOiB0cnVlLFxuXHRjb25maWd1cmFibGU6IHRydWVcbn0pO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoQml0U3RyZWFtLnByb3RvdHlwZSwgJ2J1ZmZlcicsIHtcblx0Z2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl92aWV3LmJ1ZmZlcjsgfSxcblx0ZW51bWVyYWJsZTogdHJ1ZSxcblx0Y29uZmlndXJhYmxlOiBmYWxzZVxufSk7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShCaXRTdHJlYW0ucHJvdG90eXBlLCAndmlldycsIHtcblx0Z2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl92aWV3OyB9LFxuXHRlbnVtZXJhYmxlOiB0cnVlLFxuXHRjb25maWd1cmFibGU6IGZhbHNlXG59KTtcblxuQml0U3RyZWFtLnByb3RvdHlwZS5yZWFkQml0cyA9IGZ1bmN0aW9uIChiaXRzLCBzaWduZWQpIHtcblx0dmFyIHZhbCA9IHRoaXMuX3ZpZXcuZ2V0Qml0cyh0aGlzLl9pbmRleCwgYml0cywgc2lnbmVkKTtcblx0dGhpcy5faW5kZXggKz0gYml0cztcblx0cmV0dXJuIHZhbDtcbn07XG5cbkJpdFN0cmVhbS5wcm90b3R5cGUud3JpdGVCaXRzID0gZnVuY3Rpb24gKHZhbHVlLCBiaXRzKSB7XG5cdHRoaXMuX3ZpZXcuc2V0Qml0cyh0aGlzLl9pbmRleCwgdmFsdWUsIGJpdHMpO1xuXHR0aGlzLl9pbmRleCArPSBiaXRzO1xufTtcblxuQml0U3RyZWFtLnByb3RvdHlwZS5yZWFkSW50OCA9IHJlYWRlcignZ2V0SW50OCcsIDgpO1xuQml0U3RyZWFtLnByb3RvdHlwZS5yZWFkVWludDggPSByZWFkZXIoJ2dldFVpbnQ4JywgOCk7XG5CaXRTdHJlYW0ucHJvdG90eXBlLnJlYWRJbnQxNiA9IHJlYWRlcignZ2V0SW50MTYnLCAxNik7XG5CaXRTdHJlYW0ucHJvdG90eXBlLnJlYWRVaW50MTYgPSByZWFkZXIoJ2dldFVpbnQxNicsIDE2KTtcbkJpdFN0cmVhbS5wcm90b3R5cGUucmVhZEludDMyID0gcmVhZGVyKCdnZXRJbnQzMicsIDMyKTtcbkJpdFN0cmVhbS5wcm90b3R5cGUucmVhZFVpbnQzMiA9IHJlYWRlcignZ2V0VWludDMyJywgMzIpO1xuQml0U3RyZWFtLnByb3RvdHlwZS5yZWFkRmxvYXQzMiA9IHJlYWRlcignZ2V0RmxvYXQzMicsIDMyKTtcbkJpdFN0cmVhbS5wcm90b3R5cGUucmVhZEZsb2F0NjQgPSByZWFkZXIoJ2dldEZsb2F0NjQnLCA2NCk7XG5cbkJpdFN0cmVhbS5wcm90b3R5cGUud3JpdGVJbnQ4ID0gd3JpdGVyKCdzZXRJbnQ4JywgOCk7XG5CaXRTdHJlYW0ucHJvdG90eXBlLndyaXRlVWludDggPSB3cml0ZXIoJ3NldFVpbnQ4JywgOCk7XG5CaXRTdHJlYW0ucHJvdG90eXBlLndyaXRlSW50MTYgPSB3cml0ZXIoJ3NldEludDE2JywgMTYpO1xuQml0U3RyZWFtLnByb3RvdHlwZS53cml0ZVVpbnQxNiA9IHdyaXRlcignc2V0VWludDE2JywgMTYpO1xuQml0U3RyZWFtLnByb3RvdHlwZS53cml0ZUludDMyID0gd3JpdGVyKCdzZXRJbnQzMicsIDMyKTtcbkJpdFN0cmVhbS5wcm90b3R5cGUud3JpdGVVaW50MzIgPSB3cml0ZXIoJ3NldFVpbnQzMicsIDMyKTtcbkJpdFN0cmVhbS5wcm90b3R5cGUud3JpdGVGbG9hdDMyID0gd3JpdGVyKCdzZXRGbG9hdDMyJywgMzIpO1xuQml0U3RyZWFtLnByb3RvdHlwZS53cml0ZUZsb2F0NjQgPSB3cml0ZXIoJ3NldEZsb2F0NjQnLCA2NCk7XG5cbkJpdFN0cmVhbS5wcm90b3R5cGUucmVhZEFTQ0lJU3RyaW5nID0gZnVuY3Rpb24gKGJ5dGVzKSB7XG5cdHJldHVybiByZWFkQVNDSUlTdHJpbmcodGhpcywgYnl0ZXMpO1xufTtcblxuQml0U3RyZWFtLnByb3RvdHlwZS53cml0ZUFTQ0lJU3RyaW5nID0gZnVuY3Rpb24gKHN0cmluZywgYnl0ZXMpIHtcblx0d3JpdGVBU0NJSVN0cmluZyh0aGlzLCBzdHJpbmcsIGJ5dGVzKTtcbn07XG5cbi8vIEFNRCAvIFJlcXVpcmVKU1xuaWYgKHR5cGVvZiBkZWZpbmUgIT09ICd1bmRlZmluZWQnICYmIGRlZmluZS5hbWQpIHtcblx0ZGVmaW5lKGZ1bmN0aW9uICgpIHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0Qml0VmlldzogQml0Vmlldyxcblx0XHRcdEJpdFN0cmVhbTogQml0U3RyZWFtXG5cdFx0fTtcblx0fSk7XG59XG4vLyBOb2RlLmpzXG5lbHNlIGlmICh0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyAmJiBtb2R1bGUuZXhwb3J0cykge1xuXHRtb2R1bGUuZXhwb3J0cyA9IHtcblx0XHRCaXRWaWV3OiBCaXRWaWV3LFxuXHRcdEJpdFN0cmVhbTogQml0U3RyZWFtXG5cdH07XG59XG5cbn0odGhpcykpOyIsIiIsIi8qIVxuICogVGhlIGJ1ZmZlciBtb2R1bGUgZnJvbSBub2RlLmpzLCBmb3IgdGhlIGJyb3dzZXIuXG4gKlxuICogQGF1dGhvciAgIEZlcm9zcyBBYm91a2hhZGlqZWggPGh0dHBzOi8vZmVyb3NzLm9yZz5cbiAqIEBsaWNlbnNlICBNSVRcbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbm8tcHJvdG8gKi9cblxuJ3VzZSBzdHJpY3QnXG5cbnZhciBiYXNlNjQgPSByZXF1aXJlKCdiYXNlNjQtanMnKVxudmFyIGllZWU3NTQgPSByZXF1aXJlKCdpZWVlNzU0JylcblxuZXhwb3J0cy5CdWZmZXIgPSBCdWZmZXJcbmV4cG9ydHMuU2xvd0J1ZmZlciA9IFNsb3dCdWZmZXJcbmV4cG9ydHMuSU5TUEVDVF9NQVhfQllURVMgPSA1MFxuXG52YXIgS19NQVhfTEVOR1RIID0gMHg3ZmZmZmZmZlxuZXhwb3J0cy5rTWF4TGVuZ3RoID0gS19NQVhfTEVOR1RIXG5cbi8qKlxuICogSWYgYEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUYDpcbiAqICAgPT09IHRydWUgICAgVXNlIFVpbnQ4QXJyYXkgaW1wbGVtZW50YXRpb24gKGZhc3Rlc3QpXG4gKiAgID09PSBmYWxzZSAgIFByaW50IHdhcm5pbmcgYW5kIHJlY29tbWVuZCB1c2luZyBgYnVmZmVyYCB2NC54IHdoaWNoIGhhcyBhbiBPYmplY3RcbiAqICAgICAgICAgICAgICAgaW1wbGVtZW50YXRpb24gKG1vc3QgY29tcGF0aWJsZSwgZXZlbiBJRTYpXG4gKlxuICogQnJvd3NlcnMgdGhhdCBzdXBwb3J0IHR5cGVkIGFycmF5cyBhcmUgSUUgMTArLCBGaXJlZm94IDQrLCBDaHJvbWUgNyssIFNhZmFyaSA1LjErLFxuICogT3BlcmEgMTEuNissIGlPUyA0LjIrLlxuICpcbiAqIFdlIHJlcG9ydCB0aGF0IHRoZSBicm93c2VyIGRvZXMgbm90IHN1cHBvcnQgdHlwZWQgYXJyYXlzIGlmIHRoZSBhcmUgbm90IHN1YmNsYXNzYWJsZVxuICogdXNpbmcgX19wcm90b19fLiBGaXJlZm94IDQtMjkgbGFja3Mgc3VwcG9ydCBmb3IgYWRkaW5nIG5ldyBwcm9wZXJ0aWVzIHRvIGBVaW50OEFycmF5YFxuICogKFNlZTogaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njk1NDM4KS4gSUUgMTAgbGFja3Mgc3VwcG9ydFxuICogZm9yIF9fcHJvdG9fXyBhbmQgaGFzIGEgYnVnZ3kgdHlwZWQgYXJyYXkgaW1wbGVtZW50YXRpb24uXG4gKi9cbkJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUID0gdHlwZWRBcnJheVN1cHBvcnQoKVxuXG5pZiAoIUJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUICYmIHR5cGVvZiBjb25zb2xlICE9PSAndW5kZWZpbmVkJyAmJlxuICAgIHR5cGVvZiBjb25zb2xlLmVycm9yID09PSAnZnVuY3Rpb24nKSB7XG4gIGNvbnNvbGUuZXJyb3IoXG4gICAgJ1RoaXMgYnJvd3NlciBsYWNrcyB0eXBlZCBhcnJheSAoVWludDhBcnJheSkgc3VwcG9ydCB3aGljaCBpcyByZXF1aXJlZCBieSAnICtcbiAgICAnYGJ1ZmZlcmAgdjUueC4gVXNlIGBidWZmZXJgIHY0LnggaWYgeW91IHJlcXVpcmUgb2xkIGJyb3dzZXIgc3VwcG9ydC4nXG4gIClcbn1cblxuZnVuY3Rpb24gdHlwZWRBcnJheVN1cHBvcnQgKCkge1xuICAvLyBDYW4gdHlwZWQgYXJyYXkgaW5zdGFuY2VzIGNhbiBiZSBhdWdtZW50ZWQ/XG4gIHRyeSB7XG4gICAgdmFyIGFyciA9IG5ldyBVaW50OEFycmF5KDEpXG4gICAgYXJyLl9fcHJvdG9fXyA9IHsgX19wcm90b19fOiBVaW50OEFycmF5LnByb3RvdHlwZSwgZm9vOiBmdW5jdGlvbiAoKSB7IHJldHVybiA0MiB9IH1cbiAgICByZXR1cm4gYXJyLmZvbygpID09PSA0MlxuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbn1cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KEJ1ZmZlci5wcm90b3R5cGUsICdwYXJlbnQnLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gKCkge1xuICAgIGlmICghQnVmZmVyLmlzQnVmZmVyKHRoaXMpKSByZXR1cm4gdW5kZWZpbmVkXG4gICAgcmV0dXJuIHRoaXMuYnVmZmVyXG4gIH1cbn0pXG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShCdWZmZXIucHJvdG90eXBlLCAnb2Zmc2V0Jywge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcih0aGlzKSkgcmV0dXJuIHVuZGVmaW5lZFxuICAgIHJldHVybiB0aGlzLmJ5dGVPZmZzZXRcbiAgfVxufSlcblxuZnVuY3Rpb24gY3JlYXRlQnVmZmVyIChsZW5ndGgpIHtcbiAgaWYgKGxlbmd0aCA+IEtfTUFYX0xFTkdUSCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdUaGUgdmFsdWUgXCInICsgbGVuZ3RoICsgJ1wiIGlzIGludmFsaWQgZm9yIG9wdGlvbiBcInNpemVcIicpXG4gIH1cbiAgLy8gUmV0dXJuIGFuIGF1Z21lbnRlZCBgVWludDhBcnJheWAgaW5zdGFuY2VcbiAgdmFyIGJ1ZiA9IG5ldyBVaW50OEFycmF5KGxlbmd0aClcbiAgYnVmLl9fcHJvdG9fXyA9IEJ1ZmZlci5wcm90b3R5cGVcbiAgcmV0dXJuIGJ1ZlxufVxuXG4vKipcbiAqIFRoZSBCdWZmZXIgY29uc3RydWN0b3IgcmV0dXJucyBpbnN0YW5jZXMgb2YgYFVpbnQ4QXJyYXlgIHRoYXQgaGF2ZSB0aGVpclxuICogcHJvdG90eXBlIGNoYW5nZWQgdG8gYEJ1ZmZlci5wcm90b3R5cGVgLiBGdXJ0aGVybW9yZSwgYEJ1ZmZlcmAgaXMgYSBzdWJjbGFzcyBvZlxuICogYFVpbnQ4QXJyYXlgLCBzbyB0aGUgcmV0dXJuZWQgaW5zdGFuY2VzIHdpbGwgaGF2ZSBhbGwgdGhlIG5vZGUgYEJ1ZmZlcmAgbWV0aG9kc1xuICogYW5kIHRoZSBgVWludDhBcnJheWAgbWV0aG9kcy4gU3F1YXJlIGJyYWNrZXQgbm90YXRpb24gd29ya3MgYXMgZXhwZWN0ZWQgLS0gaXRcbiAqIHJldHVybnMgYSBzaW5nbGUgb2N0ZXQuXG4gKlxuICogVGhlIGBVaW50OEFycmF5YCBwcm90b3R5cGUgcmVtYWlucyB1bm1vZGlmaWVkLlxuICovXG5cbmZ1bmN0aW9uIEJ1ZmZlciAoYXJnLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpIHtcbiAgLy8gQ29tbW9uIGNhc2UuXG4gIGlmICh0eXBlb2YgYXJnID09PSAnbnVtYmVyJykge1xuICAgIGlmICh0eXBlb2YgZW5jb2RpbmdPck9mZnNldCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICdUaGUgXCJzdHJpbmdcIiBhcmd1bWVudCBtdXN0IGJlIG9mIHR5cGUgc3RyaW5nLiBSZWNlaXZlZCB0eXBlIG51bWJlcidcbiAgICAgIClcbiAgICB9XG4gICAgcmV0dXJuIGFsbG9jVW5zYWZlKGFyZylcbiAgfVxuICByZXR1cm4gZnJvbShhcmcsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbn1cblxuLy8gRml4IHN1YmFycmF5KCkgaW4gRVMyMDE2LiBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9mZXJvc3MvYnVmZmVyL3B1bGwvOTdcbmlmICh0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wuc3BlY2llcyAhPSBudWxsICYmXG4gICAgQnVmZmVyW1N5bWJvbC5zcGVjaWVzXSA9PT0gQnVmZmVyKSB7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShCdWZmZXIsIFN5bWJvbC5zcGVjaWVzLCB7XG4gICAgdmFsdWU6IG51bGwsXG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgIHdyaXRhYmxlOiBmYWxzZVxuICB9KVxufVxuXG5CdWZmZXIucG9vbFNpemUgPSA4MTkyIC8vIG5vdCB1c2VkIGJ5IHRoaXMgaW1wbGVtZW50YXRpb25cblxuZnVuY3Rpb24gZnJvbSAodmFsdWUsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aCkge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBmcm9tU3RyaW5nKHZhbHVlLCBlbmNvZGluZ09yT2Zmc2V0KVxuICB9XG5cbiAgaWYgKEFycmF5QnVmZmVyLmlzVmlldyh2YWx1ZSkpIHtcbiAgICByZXR1cm4gZnJvbUFycmF5TGlrZSh2YWx1ZSlcbiAgfVxuXG4gIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgdGhyb3cgVHlwZUVycm9yKFxuICAgICAgJ1RoZSBmaXJzdCBhcmd1bWVudCBtdXN0IGJlIG9uZSBvZiB0eXBlIHN0cmluZywgQnVmZmVyLCBBcnJheUJ1ZmZlciwgQXJyYXksICcgK1xuICAgICAgJ29yIEFycmF5LWxpa2UgT2JqZWN0LiBSZWNlaXZlZCB0eXBlICcgKyAodHlwZW9mIHZhbHVlKVxuICAgIClcbiAgfVxuXG4gIGlmIChpc0luc3RhbmNlKHZhbHVlLCBBcnJheUJ1ZmZlcikgfHxcbiAgICAgICh2YWx1ZSAmJiBpc0luc3RhbmNlKHZhbHVlLmJ1ZmZlciwgQXJyYXlCdWZmZXIpKSkge1xuICAgIHJldHVybiBmcm9tQXJyYXlCdWZmZXIodmFsdWUsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbiAgfVxuXG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICdUaGUgXCJ2YWx1ZVwiIGFyZ3VtZW50IG11c3Qgbm90IGJlIG9mIHR5cGUgbnVtYmVyLiBSZWNlaXZlZCB0eXBlIG51bWJlcidcbiAgICApXG4gIH1cblxuICB2YXIgdmFsdWVPZiA9IHZhbHVlLnZhbHVlT2YgJiYgdmFsdWUudmFsdWVPZigpXG4gIGlmICh2YWx1ZU9mICE9IG51bGwgJiYgdmFsdWVPZiAhPT0gdmFsdWUpIHtcbiAgICByZXR1cm4gQnVmZmVyLmZyb20odmFsdWVPZiwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKVxuICB9XG5cbiAgdmFyIGIgPSBmcm9tT2JqZWN0KHZhbHVlKVxuICBpZiAoYikgcmV0dXJuIGJcblxuICBpZiAodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvUHJpbWl0aXZlICE9IG51bGwgJiZcbiAgICAgIHR5cGVvZiB2YWx1ZVtTeW1ib2wudG9QcmltaXRpdmVdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIEJ1ZmZlci5mcm9tKFxuICAgICAgdmFsdWVbU3ltYm9sLnRvUHJpbWl0aXZlXSgnc3RyaW5nJyksIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aFxuICAgIClcbiAgfVxuXG4gIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgJ1RoZSBmaXJzdCBhcmd1bWVudCBtdXN0IGJlIG9uZSBvZiB0eXBlIHN0cmluZywgQnVmZmVyLCBBcnJheUJ1ZmZlciwgQXJyYXksICcgK1xuICAgICdvciBBcnJheS1saWtlIE9iamVjdC4gUmVjZWl2ZWQgdHlwZSAnICsgKHR5cGVvZiB2YWx1ZSlcbiAgKVxufVxuXG4vKipcbiAqIEZ1bmN0aW9uYWxseSBlcXVpdmFsZW50IHRvIEJ1ZmZlcihhcmcsIGVuY29kaW5nKSBidXQgdGhyb3dzIGEgVHlwZUVycm9yXG4gKiBpZiB2YWx1ZSBpcyBhIG51bWJlci5cbiAqIEJ1ZmZlci5mcm9tKHN0clssIGVuY29kaW5nXSlcbiAqIEJ1ZmZlci5mcm9tKGFycmF5KVxuICogQnVmZmVyLmZyb20oYnVmZmVyKVxuICogQnVmZmVyLmZyb20oYXJyYXlCdWZmZXJbLCBieXRlT2Zmc2V0WywgbGVuZ3RoXV0pXG4gKiovXG5CdWZmZXIuZnJvbSA9IGZ1bmN0aW9uICh2YWx1ZSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBmcm9tKHZhbHVlLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpXG59XG5cbi8vIE5vdGU6IENoYW5nZSBwcm90b3R5cGUgKmFmdGVyKiBCdWZmZXIuZnJvbSBpcyBkZWZpbmVkIHRvIHdvcmthcm91bmQgQ2hyb21lIGJ1Zzpcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mZXJvc3MvYnVmZmVyL3B1bGwvMTQ4XG5CdWZmZXIucHJvdG90eXBlLl9fcHJvdG9fXyA9IFVpbnQ4QXJyYXkucHJvdG90eXBlXG5CdWZmZXIuX19wcm90b19fID0gVWludDhBcnJheVxuXG5mdW5jdGlvbiBhc3NlcnRTaXplIChzaXplKSB7XG4gIGlmICh0eXBlb2Ygc2l6ZSAhPT0gJ251bWJlcicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcInNpemVcIiBhcmd1bWVudCBtdXN0IGJlIG9mIHR5cGUgbnVtYmVyJylcbiAgfSBlbHNlIGlmIChzaXplIDwgMCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdUaGUgdmFsdWUgXCInICsgc2l6ZSArICdcIiBpcyBpbnZhbGlkIGZvciBvcHRpb24gXCJzaXplXCInKVxuICB9XG59XG5cbmZ1bmN0aW9uIGFsbG9jIChzaXplLCBmaWxsLCBlbmNvZGluZykge1xuICBhc3NlcnRTaXplKHNpemUpXG4gIGlmIChzaXplIDw9IDApIHtcbiAgICByZXR1cm4gY3JlYXRlQnVmZmVyKHNpemUpXG4gIH1cbiAgaWYgKGZpbGwgIT09IHVuZGVmaW5lZCkge1xuICAgIC8vIE9ubHkgcGF5IGF0dGVudGlvbiB0byBlbmNvZGluZyBpZiBpdCdzIGEgc3RyaW5nLiBUaGlzXG4gICAgLy8gcHJldmVudHMgYWNjaWRlbnRhbGx5IHNlbmRpbmcgaW4gYSBudW1iZXIgdGhhdCB3b3VsZFxuICAgIC8vIGJlIGludGVycHJldHRlZCBhcyBhIHN0YXJ0IG9mZnNldC5cbiAgICByZXR1cm4gdHlwZW9mIGVuY29kaW5nID09PSAnc3RyaW5nJ1xuICAgICAgPyBjcmVhdGVCdWZmZXIoc2l6ZSkuZmlsbChmaWxsLCBlbmNvZGluZylcbiAgICAgIDogY3JlYXRlQnVmZmVyKHNpemUpLmZpbGwoZmlsbClcbiAgfVxuICByZXR1cm4gY3JlYXRlQnVmZmVyKHNpemUpXG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBmaWxsZWQgQnVmZmVyIGluc3RhbmNlLlxuICogYWxsb2Moc2l6ZVssIGZpbGxbLCBlbmNvZGluZ11dKVxuICoqL1xuQnVmZmVyLmFsbG9jID0gZnVuY3Rpb24gKHNpemUsIGZpbGwsIGVuY29kaW5nKSB7XG4gIHJldHVybiBhbGxvYyhzaXplLCBmaWxsLCBlbmNvZGluZylcbn1cblxuZnVuY3Rpb24gYWxsb2NVbnNhZmUgKHNpemUpIHtcbiAgYXNzZXJ0U2l6ZShzaXplKVxuICByZXR1cm4gY3JlYXRlQnVmZmVyKHNpemUgPCAwID8gMCA6IGNoZWNrZWQoc2l6ZSkgfCAwKVxufVxuXG4vKipcbiAqIEVxdWl2YWxlbnQgdG8gQnVmZmVyKG51bSksIGJ5IGRlZmF1bHQgY3JlYXRlcyBhIG5vbi16ZXJvLWZpbGxlZCBCdWZmZXIgaW5zdGFuY2UuXG4gKiAqL1xuQnVmZmVyLmFsbG9jVW5zYWZlID0gZnVuY3Rpb24gKHNpemUpIHtcbiAgcmV0dXJuIGFsbG9jVW5zYWZlKHNpemUpXG59XG4vKipcbiAqIEVxdWl2YWxlbnQgdG8gU2xvd0J1ZmZlcihudW0pLCBieSBkZWZhdWx0IGNyZWF0ZXMgYSBub24temVyby1maWxsZWQgQnVmZmVyIGluc3RhbmNlLlxuICovXG5CdWZmZXIuYWxsb2NVbnNhZmVTbG93ID0gZnVuY3Rpb24gKHNpemUpIHtcbiAgcmV0dXJuIGFsbG9jVW5zYWZlKHNpemUpXG59XG5cbmZ1bmN0aW9uIGZyb21TdHJpbmcgKHN0cmluZywgZW5jb2RpbmcpIHtcbiAgaWYgKHR5cGVvZiBlbmNvZGluZyAhPT0gJ3N0cmluZycgfHwgZW5jb2RpbmcgPT09ICcnKSB7XG4gICAgZW5jb2RpbmcgPSAndXRmOCdcbiAgfVxuXG4gIGlmICghQnVmZmVyLmlzRW5jb2RpbmcoZW5jb2RpbmcpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVW5rbm93biBlbmNvZGluZzogJyArIGVuY29kaW5nKVxuICB9XG5cbiAgdmFyIGxlbmd0aCA9IGJ5dGVMZW5ndGgoc3RyaW5nLCBlbmNvZGluZykgfCAwXG4gIHZhciBidWYgPSBjcmVhdGVCdWZmZXIobGVuZ3RoKVxuXG4gIHZhciBhY3R1YWwgPSBidWYud3JpdGUoc3RyaW5nLCBlbmNvZGluZylcblxuICBpZiAoYWN0dWFsICE9PSBsZW5ndGgpIHtcbiAgICAvLyBXcml0aW5nIGEgaGV4IHN0cmluZywgZm9yIGV4YW1wbGUsIHRoYXQgY29udGFpbnMgaW52YWxpZCBjaGFyYWN0ZXJzIHdpbGxcbiAgICAvLyBjYXVzZSBldmVyeXRoaW5nIGFmdGVyIHRoZSBmaXJzdCBpbnZhbGlkIGNoYXJhY3RlciB0byBiZSBpZ25vcmVkLiAoZS5nLlxuICAgIC8vICdhYnh4Y2QnIHdpbGwgYmUgdHJlYXRlZCBhcyAnYWInKVxuICAgIGJ1ZiA9IGJ1Zi5zbGljZSgwLCBhY3R1YWwpXG4gIH1cblxuICByZXR1cm4gYnVmXG59XG5cbmZ1bmN0aW9uIGZyb21BcnJheUxpa2UgKGFycmF5KSB7XG4gIHZhciBsZW5ndGggPSBhcnJheS5sZW5ndGggPCAwID8gMCA6IGNoZWNrZWQoYXJyYXkubGVuZ3RoKSB8IDBcbiAgdmFyIGJ1ZiA9IGNyZWF0ZUJ1ZmZlcihsZW5ndGgpXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpICs9IDEpIHtcbiAgICBidWZbaV0gPSBhcnJheVtpXSAmIDI1NVxuICB9XG4gIHJldHVybiBidWZcbn1cblxuZnVuY3Rpb24gZnJvbUFycmF5QnVmZmVyIChhcnJheSwgYnl0ZU9mZnNldCwgbGVuZ3RoKSB7XG4gIGlmIChieXRlT2Zmc2V0IDwgMCB8fCBhcnJheS5ieXRlTGVuZ3RoIDwgYnl0ZU9mZnNldCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdcIm9mZnNldFwiIGlzIG91dHNpZGUgb2YgYnVmZmVyIGJvdW5kcycpXG4gIH1cblxuICBpZiAoYXJyYXkuYnl0ZUxlbmd0aCA8IGJ5dGVPZmZzZXQgKyAobGVuZ3RoIHx8IDApKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1wibGVuZ3RoXCIgaXMgb3V0c2lkZSBvZiBidWZmZXIgYm91bmRzJylcbiAgfVxuXG4gIHZhciBidWZcbiAgaWYgKGJ5dGVPZmZzZXQgPT09IHVuZGVmaW5lZCAmJiBsZW5ndGggPT09IHVuZGVmaW5lZCkge1xuICAgIGJ1ZiA9IG5ldyBVaW50OEFycmF5KGFycmF5KVxuICB9IGVsc2UgaWYgKGxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgYnVmID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXksIGJ5dGVPZmZzZXQpXG4gIH0gZWxzZSB7XG4gICAgYnVmID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXksIGJ5dGVPZmZzZXQsIGxlbmd0aClcbiAgfVxuXG4gIC8vIFJldHVybiBhbiBhdWdtZW50ZWQgYFVpbnQ4QXJyYXlgIGluc3RhbmNlXG4gIGJ1Zi5fX3Byb3RvX18gPSBCdWZmZXIucHJvdG90eXBlXG4gIHJldHVybiBidWZcbn1cblxuZnVuY3Rpb24gZnJvbU9iamVjdCAob2JqKSB7XG4gIGlmIChCdWZmZXIuaXNCdWZmZXIob2JqKSkge1xuICAgIHZhciBsZW4gPSBjaGVja2VkKG9iai5sZW5ndGgpIHwgMFxuICAgIHZhciBidWYgPSBjcmVhdGVCdWZmZXIobGVuKVxuXG4gICAgaWYgKGJ1Zi5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBidWZcbiAgICB9XG5cbiAgICBvYmouY29weShidWYsIDAsIDAsIGxlbilcbiAgICByZXR1cm4gYnVmXG4gIH1cblxuICBpZiAob2JqLmxlbmd0aCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKHR5cGVvZiBvYmoubGVuZ3RoICE9PSAnbnVtYmVyJyB8fCBudW1iZXJJc05hTihvYmoubGVuZ3RoKSkge1xuICAgICAgcmV0dXJuIGNyZWF0ZUJ1ZmZlcigwKVxuICAgIH1cbiAgICByZXR1cm4gZnJvbUFycmF5TGlrZShvYmopXG4gIH1cblxuICBpZiAob2JqLnR5cGUgPT09ICdCdWZmZXInICYmIEFycmF5LmlzQXJyYXkob2JqLmRhdGEpKSB7XG4gICAgcmV0dXJuIGZyb21BcnJheUxpa2Uob2JqLmRhdGEpXG4gIH1cbn1cblxuZnVuY3Rpb24gY2hlY2tlZCAobGVuZ3RoKSB7XG4gIC8vIE5vdGU6IGNhbm5vdCB1c2UgYGxlbmd0aCA8IEtfTUFYX0xFTkdUSGAgaGVyZSBiZWNhdXNlIHRoYXQgZmFpbHMgd2hlblxuICAvLyBsZW5ndGggaXMgTmFOICh3aGljaCBpcyBvdGhlcndpc2UgY29lcmNlZCB0byB6ZXJvLilcbiAgaWYgKGxlbmd0aCA+PSBLX01BWF9MRU5HVEgpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignQXR0ZW1wdCB0byBhbGxvY2F0ZSBCdWZmZXIgbGFyZ2VyIHRoYW4gbWF4aW11bSAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAnc2l6ZTogMHgnICsgS19NQVhfTEVOR1RILnRvU3RyaW5nKDE2KSArICcgYnl0ZXMnKVxuICB9XG4gIHJldHVybiBsZW5ndGggfCAwXG59XG5cbmZ1bmN0aW9uIFNsb3dCdWZmZXIgKGxlbmd0aCkge1xuICBpZiAoK2xlbmd0aCAhPSBsZW5ndGgpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBlcWVxZXFcbiAgICBsZW5ndGggPSAwXG4gIH1cbiAgcmV0dXJuIEJ1ZmZlci5hbGxvYygrbGVuZ3RoKVxufVxuXG5CdWZmZXIuaXNCdWZmZXIgPSBmdW5jdGlvbiBpc0J1ZmZlciAoYikge1xuICByZXR1cm4gYiAhPSBudWxsICYmIGIuX2lzQnVmZmVyID09PSB0cnVlICYmXG4gICAgYiAhPT0gQnVmZmVyLnByb3RvdHlwZSAvLyBzbyBCdWZmZXIuaXNCdWZmZXIoQnVmZmVyLnByb3RvdHlwZSkgd2lsbCBiZSBmYWxzZVxufVxuXG5CdWZmZXIuY29tcGFyZSA9IGZ1bmN0aW9uIGNvbXBhcmUgKGEsIGIpIHtcbiAgaWYgKGlzSW5zdGFuY2UoYSwgVWludDhBcnJheSkpIGEgPSBCdWZmZXIuZnJvbShhLCBhLm9mZnNldCwgYS5ieXRlTGVuZ3RoKVxuICBpZiAoaXNJbnN0YW5jZShiLCBVaW50OEFycmF5KSkgYiA9IEJ1ZmZlci5mcm9tKGIsIGIub2Zmc2V0LCBiLmJ5dGVMZW5ndGgpXG4gIGlmICghQnVmZmVyLmlzQnVmZmVyKGEpIHx8ICFCdWZmZXIuaXNCdWZmZXIoYikpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgJ1RoZSBcImJ1ZjFcIiwgXCJidWYyXCIgYXJndW1lbnRzIG11c3QgYmUgb25lIG9mIHR5cGUgQnVmZmVyIG9yIFVpbnQ4QXJyYXknXG4gICAgKVxuICB9XG5cbiAgaWYgKGEgPT09IGIpIHJldHVybiAwXG5cbiAgdmFyIHggPSBhLmxlbmd0aFxuICB2YXIgeSA9IGIubGVuZ3RoXG5cbiAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IE1hdGgubWluKHgsIHkpOyBpIDwgbGVuOyArK2kpIHtcbiAgICBpZiAoYVtpXSAhPT0gYltpXSkge1xuICAgICAgeCA9IGFbaV1cbiAgICAgIHkgPSBiW2ldXG4gICAgICBicmVha1xuICAgIH1cbiAgfVxuXG4gIGlmICh4IDwgeSkgcmV0dXJuIC0xXG4gIGlmICh5IDwgeCkgcmV0dXJuIDFcbiAgcmV0dXJuIDBcbn1cblxuQnVmZmVyLmlzRW5jb2RpbmcgPSBmdW5jdGlvbiBpc0VuY29kaW5nIChlbmNvZGluZykge1xuICBzd2l0Y2ggKFN0cmluZyhlbmNvZGluZykudG9Mb3dlckNhc2UoKSkge1xuICAgIGNhc2UgJ2hleCc6XG4gICAgY2FzZSAndXRmOCc6XG4gICAgY2FzZSAndXRmLTgnOlxuICAgIGNhc2UgJ2FzY2lpJzpcbiAgICBjYXNlICdsYXRpbjEnOlxuICAgIGNhc2UgJ2JpbmFyeSc6XG4gICAgY2FzZSAnYmFzZTY0JzpcbiAgICBjYXNlICd1Y3MyJzpcbiAgICBjYXNlICd1Y3MtMic6XG4gICAgY2FzZSAndXRmMTZsZSc6XG4gICAgY2FzZSAndXRmLTE2bGUnOlxuICAgICAgcmV0dXJuIHRydWVcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZhbHNlXG4gIH1cbn1cblxuQnVmZmVyLmNvbmNhdCA9IGZ1bmN0aW9uIGNvbmNhdCAobGlzdCwgbGVuZ3RoKSB7XG4gIGlmICghQXJyYXkuaXNBcnJheShsaXN0KSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wibGlzdFwiIGFyZ3VtZW50IG11c3QgYmUgYW4gQXJyYXkgb2YgQnVmZmVycycpXG4gIH1cblxuICBpZiAobGlzdC5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gQnVmZmVyLmFsbG9jKDApXG4gIH1cblxuICB2YXIgaVxuICBpZiAobGVuZ3RoID09PSB1bmRlZmluZWQpIHtcbiAgICBsZW5ndGggPSAwXG4gICAgZm9yIChpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyArK2kpIHtcbiAgICAgIGxlbmd0aCArPSBsaXN0W2ldLmxlbmd0aFxuICAgIH1cbiAgfVxuXG4gIHZhciBidWZmZXIgPSBCdWZmZXIuYWxsb2NVbnNhZmUobGVuZ3RoKVxuICB2YXIgcG9zID0gMFxuICBmb3IgKGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7ICsraSkge1xuICAgIHZhciBidWYgPSBsaXN0W2ldXG4gICAgaWYgKGlzSW5zdGFuY2UoYnVmLCBVaW50OEFycmF5KSkge1xuICAgICAgYnVmID0gQnVmZmVyLmZyb20oYnVmKVxuICAgIH1cbiAgICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihidWYpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcImxpc3RcIiBhcmd1bWVudCBtdXN0IGJlIGFuIEFycmF5IG9mIEJ1ZmZlcnMnKVxuICAgIH1cbiAgICBidWYuY29weShidWZmZXIsIHBvcylcbiAgICBwb3MgKz0gYnVmLmxlbmd0aFxuICB9XG4gIHJldHVybiBidWZmZXJcbn1cblxuZnVuY3Rpb24gYnl0ZUxlbmd0aCAoc3RyaW5nLCBlbmNvZGluZykge1xuICBpZiAoQnVmZmVyLmlzQnVmZmVyKHN0cmluZykpIHtcbiAgICByZXR1cm4gc3RyaW5nLmxlbmd0aFxuICB9XG4gIGlmIChBcnJheUJ1ZmZlci5pc1ZpZXcoc3RyaW5nKSB8fCBpc0luc3RhbmNlKHN0cmluZywgQXJyYXlCdWZmZXIpKSB7XG4gICAgcmV0dXJuIHN0cmluZy5ieXRlTGVuZ3RoXG4gIH1cbiAgaWYgKHR5cGVvZiBzdHJpbmcgIT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICdUaGUgXCJzdHJpbmdcIiBhcmd1bWVudCBtdXN0IGJlIG9uZSBvZiB0eXBlIHN0cmluZywgQnVmZmVyLCBvciBBcnJheUJ1ZmZlci4gJyArXG4gICAgICAnUmVjZWl2ZWQgdHlwZSAnICsgdHlwZW9mIHN0cmluZ1xuICAgIClcbiAgfVxuXG4gIHZhciBsZW4gPSBzdHJpbmcubGVuZ3RoXG4gIHZhciBtdXN0TWF0Y2ggPSAoYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdID09PSB0cnVlKVxuICBpZiAoIW11c3RNYXRjaCAmJiBsZW4gPT09IDApIHJldHVybiAwXG5cbiAgLy8gVXNlIGEgZm9yIGxvb3AgdG8gYXZvaWQgcmVjdXJzaW9uXG4gIHZhciBsb3dlcmVkQ2FzZSA9IGZhbHNlXG4gIGZvciAoOzspIHtcbiAgICBzd2l0Y2ggKGVuY29kaW5nKSB7XG4gICAgICBjYXNlICdhc2NpaSc6XG4gICAgICBjYXNlICdsYXRpbjEnOlxuICAgICAgY2FzZSAnYmluYXJ5JzpcbiAgICAgICAgcmV0dXJuIGxlblxuICAgICAgY2FzZSAndXRmOCc6XG4gICAgICBjYXNlICd1dGYtOCc6XG4gICAgICAgIHJldHVybiB1dGY4VG9CeXRlcyhzdHJpbmcpLmxlbmd0aFxuICAgICAgY2FzZSAndWNzMic6XG4gICAgICBjYXNlICd1Y3MtMic6XG4gICAgICBjYXNlICd1dGYxNmxlJzpcbiAgICAgIGNhc2UgJ3V0Zi0xNmxlJzpcbiAgICAgICAgcmV0dXJuIGxlbiAqIDJcbiAgICAgIGNhc2UgJ2hleCc6XG4gICAgICAgIHJldHVybiBsZW4gPj4+IDFcbiAgICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgICAgIHJldHVybiBiYXNlNjRUb0J5dGVzKHN0cmluZykubGVuZ3RoXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpZiAobG93ZXJlZENhc2UpIHtcbiAgICAgICAgICByZXR1cm4gbXVzdE1hdGNoID8gLTEgOiB1dGY4VG9CeXRlcyhzdHJpbmcpLmxlbmd0aCAvLyBhc3N1bWUgdXRmOFxuICAgICAgICB9XG4gICAgICAgIGVuY29kaW5nID0gKCcnICsgZW5jb2RpbmcpLnRvTG93ZXJDYXNlKClcbiAgICAgICAgbG93ZXJlZENhc2UgPSB0cnVlXG4gICAgfVxuICB9XG59XG5CdWZmZXIuYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGhcblxuZnVuY3Rpb24gc2xvd1RvU3RyaW5nIChlbmNvZGluZywgc3RhcnQsIGVuZCkge1xuICB2YXIgbG93ZXJlZENhc2UgPSBmYWxzZVxuXG4gIC8vIE5vIG5lZWQgdG8gdmVyaWZ5IHRoYXQgXCJ0aGlzLmxlbmd0aCA8PSBNQVhfVUlOVDMyXCIgc2luY2UgaXQncyBhIHJlYWQtb25seVxuICAvLyBwcm9wZXJ0eSBvZiBhIHR5cGVkIGFycmF5LlxuXG4gIC8vIFRoaXMgYmVoYXZlcyBuZWl0aGVyIGxpa2UgU3RyaW5nIG5vciBVaW50OEFycmF5IGluIHRoYXQgd2Ugc2V0IHN0YXJ0L2VuZFxuICAvLyB0byB0aGVpciB1cHBlci9sb3dlciBib3VuZHMgaWYgdGhlIHZhbHVlIHBhc3NlZCBpcyBvdXQgb2YgcmFuZ2UuXG4gIC8vIHVuZGVmaW5lZCBpcyBoYW5kbGVkIHNwZWNpYWxseSBhcyBwZXIgRUNNQS0yNjIgNnRoIEVkaXRpb24sXG4gIC8vIFNlY3Rpb24gMTMuMy4zLjcgUnVudGltZSBTZW1hbnRpY3M6IEtleWVkQmluZGluZ0luaXRpYWxpemF0aW9uLlxuICBpZiAoc3RhcnQgPT09IHVuZGVmaW5lZCB8fCBzdGFydCA8IDApIHtcbiAgICBzdGFydCA9IDBcbiAgfVxuICAvLyBSZXR1cm4gZWFybHkgaWYgc3RhcnQgPiB0aGlzLmxlbmd0aC4gRG9uZSBoZXJlIHRvIHByZXZlbnQgcG90ZW50aWFsIHVpbnQzMlxuICAvLyBjb2VyY2lvbiBmYWlsIGJlbG93LlxuICBpZiAoc3RhcnQgPiB0aGlzLmxlbmd0aCkge1xuICAgIHJldHVybiAnJ1xuICB9XG5cbiAgaWYgKGVuZCA9PT0gdW5kZWZpbmVkIHx8IGVuZCA+IHRoaXMubGVuZ3RoKSB7XG4gICAgZW5kID0gdGhpcy5sZW5ndGhcbiAgfVxuXG4gIGlmIChlbmQgPD0gMCkge1xuICAgIHJldHVybiAnJ1xuICB9XG5cbiAgLy8gRm9yY2UgY29lcnNpb24gdG8gdWludDMyLiBUaGlzIHdpbGwgYWxzbyBjb2VyY2UgZmFsc2V5L05hTiB2YWx1ZXMgdG8gMC5cbiAgZW5kID4+Pj0gMFxuICBzdGFydCA+Pj49IDBcblxuICBpZiAoZW5kIDw9IHN0YXJ0KSB7XG4gICAgcmV0dXJuICcnXG4gIH1cblxuICBpZiAoIWVuY29kaW5nKSBlbmNvZGluZyA9ICd1dGY4J1xuXG4gIHdoaWxlICh0cnVlKSB7XG4gICAgc3dpdGNoIChlbmNvZGluZykge1xuICAgICAgY2FzZSAnaGV4JzpcbiAgICAgICAgcmV0dXJuIGhleFNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGNhc2UgJ3V0ZjgnOlxuICAgICAgY2FzZSAndXRmLTgnOlxuICAgICAgICByZXR1cm4gdXRmOFNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGNhc2UgJ2FzY2lpJzpcbiAgICAgICAgcmV0dXJuIGFzY2lpU2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgY2FzZSAnbGF0aW4xJzpcbiAgICAgIGNhc2UgJ2JpbmFyeSc6XG4gICAgICAgIHJldHVybiBsYXRpbjFTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBjYXNlICdiYXNlNjQnOlxuICAgICAgICByZXR1cm4gYmFzZTY0U2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgY2FzZSAndWNzMic6XG4gICAgICBjYXNlICd1Y3MtMic6XG4gICAgICBjYXNlICd1dGYxNmxlJzpcbiAgICAgIGNhc2UgJ3V0Zi0xNmxlJzpcbiAgICAgICAgcmV0dXJuIHV0ZjE2bGVTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpZiAobG93ZXJlZENhc2UpIHRocm93IG5ldyBUeXBlRXJyb3IoJ1Vua25vd24gZW5jb2Rpbmc6ICcgKyBlbmNvZGluZylcbiAgICAgICAgZW5jb2RpbmcgPSAoZW5jb2RpbmcgKyAnJykudG9Mb3dlckNhc2UoKVxuICAgICAgICBsb3dlcmVkQ2FzZSA9IHRydWVcbiAgICB9XG4gIH1cbn1cblxuLy8gVGhpcyBwcm9wZXJ0eSBpcyB1c2VkIGJ5IGBCdWZmZXIuaXNCdWZmZXJgIChhbmQgdGhlIGBpcy1idWZmZXJgIG5wbSBwYWNrYWdlKVxuLy8gdG8gZGV0ZWN0IGEgQnVmZmVyIGluc3RhbmNlLiBJdCdzIG5vdCBwb3NzaWJsZSB0byB1c2UgYGluc3RhbmNlb2YgQnVmZmVyYFxuLy8gcmVsaWFibHkgaW4gYSBicm93c2VyaWZ5IGNvbnRleHQgYmVjYXVzZSB0aGVyZSBjb3VsZCBiZSBtdWx0aXBsZSBkaWZmZXJlbnRcbi8vIGNvcGllcyBvZiB0aGUgJ2J1ZmZlcicgcGFja2FnZSBpbiB1c2UuIFRoaXMgbWV0aG9kIHdvcmtzIGV2ZW4gZm9yIEJ1ZmZlclxuLy8gaW5zdGFuY2VzIHRoYXQgd2VyZSBjcmVhdGVkIGZyb20gYW5vdGhlciBjb3B5IG9mIHRoZSBgYnVmZmVyYCBwYWNrYWdlLlxuLy8gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vZmVyb3NzL2J1ZmZlci9pc3N1ZXMvMTU0XG5CdWZmZXIucHJvdG90eXBlLl9pc0J1ZmZlciA9IHRydWVcblxuZnVuY3Rpb24gc3dhcCAoYiwgbiwgbSkge1xuICB2YXIgaSA9IGJbbl1cbiAgYltuXSA9IGJbbV1cbiAgYlttXSA9IGlcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5zd2FwMTYgPSBmdW5jdGlvbiBzd2FwMTYgKCkge1xuICB2YXIgbGVuID0gdGhpcy5sZW5ndGhcbiAgaWYgKGxlbiAlIDIgIT09IDApIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LWJpdHMnKVxuICB9XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpICs9IDIpIHtcbiAgICBzd2FwKHRoaXMsIGksIGkgKyAxKVxuICB9XG4gIHJldHVybiB0aGlzXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuc3dhcDMyID0gZnVuY3Rpb24gc3dhcDMyICgpIHtcbiAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoXG4gIGlmIChsZW4gJSA0ICE9PSAwKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0J1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAzMi1iaXRzJylcbiAgfVxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSArPSA0KSB7XG4gICAgc3dhcCh0aGlzLCBpLCBpICsgMylcbiAgICBzd2FwKHRoaXMsIGkgKyAxLCBpICsgMilcbiAgfVxuICByZXR1cm4gdGhpc1xufVxuXG5CdWZmZXIucHJvdG90eXBlLnN3YXA2NCA9IGZ1bmN0aW9uIHN3YXA2NCAoKSB7XG4gIHZhciBsZW4gPSB0aGlzLmxlbmd0aFxuICBpZiAobGVuICUgOCAhPT0gMCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNjQtYml0cycpXG4gIH1cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkgKz0gOCkge1xuICAgIHN3YXAodGhpcywgaSwgaSArIDcpXG4gICAgc3dhcCh0aGlzLCBpICsgMSwgaSArIDYpXG4gICAgc3dhcCh0aGlzLCBpICsgMiwgaSArIDUpXG4gICAgc3dhcCh0aGlzLCBpICsgMywgaSArIDQpXG4gIH1cbiAgcmV0dXJuIHRoaXNcbn1cblxuQnVmZmVyLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nICgpIHtcbiAgdmFyIGxlbmd0aCA9IHRoaXMubGVuZ3RoXG4gIGlmIChsZW5ndGggPT09IDApIHJldHVybiAnJ1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHV0ZjhTbGljZSh0aGlzLCAwLCBsZW5ndGgpXG4gIHJldHVybiBzbG93VG9TdHJpbmcuYXBwbHkodGhpcywgYXJndW1lbnRzKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnRvTG9jYWxlU3RyaW5nID0gQnVmZmVyLnByb3RvdHlwZS50b1N0cmluZ1xuXG5CdWZmZXIucHJvdG90eXBlLmVxdWFscyA9IGZ1bmN0aW9uIGVxdWFscyAoYikge1xuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihiKSkgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlcicpXG4gIGlmICh0aGlzID09PSBiKSByZXR1cm4gdHJ1ZVxuICByZXR1cm4gQnVmZmVyLmNvbXBhcmUodGhpcywgYikgPT09IDBcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5pbnNwZWN0ID0gZnVuY3Rpb24gaW5zcGVjdCAoKSB7XG4gIHZhciBzdHIgPSAnJ1xuICB2YXIgbWF4ID0gZXhwb3J0cy5JTlNQRUNUX01BWF9CWVRFU1xuICBzdHIgPSB0aGlzLnRvU3RyaW5nKCdoZXgnLCAwLCBtYXgpLnJlcGxhY2UoLyguezJ9KS9nLCAnJDEgJykudHJpbSgpXG4gIGlmICh0aGlzLmxlbmd0aCA+IG1heCkgc3RyICs9ICcgLi4uICdcbiAgcmV0dXJuICc8QnVmZmVyICcgKyBzdHIgKyAnPidcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5jb21wYXJlID0gZnVuY3Rpb24gY29tcGFyZSAodGFyZ2V0LCBzdGFydCwgZW5kLCB0aGlzU3RhcnQsIHRoaXNFbmQpIHtcbiAgaWYgKGlzSW5zdGFuY2UodGFyZ2V0LCBVaW50OEFycmF5KSkge1xuICAgIHRhcmdldCA9IEJ1ZmZlci5mcm9tKHRhcmdldCwgdGFyZ2V0Lm9mZnNldCwgdGFyZ2V0LmJ5dGVMZW5ndGgpXG4gIH1cbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIodGFyZ2V0KSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAnVGhlIFwidGFyZ2V0XCIgYXJndW1lbnQgbXVzdCBiZSBvbmUgb2YgdHlwZSBCdWZmZXIgb3IgVWludDhBcnJheS4gJyArXG4gICAgICAnUmVjZWl2ZWQgdHlwZSAnICsgKHR5cGVvZiB0YXJnZXQpXG4gICAgKVxuICB9XG5cbiAgaWYgKHN0YXJ0ID09PSB1bmRlZmluZWQpIHtcbiAgICBzdGFydCA9IDBcbiAgfVxuICBpZiAoZW5kID09PSB1bmRlZmluZWQpIHtcbiAgICBlbmQgPSB0YXJnZXQgPyB0YXJnZXQubGVuZ3RoIDogMFxuICB9XG4gIGlmICh0aGlzU3RhcnQgPT09IHVuZGVmaW5lZCkge1xuICAgIHRoaXNTdGFydCA9IDBcbiAgfVxuICBpZiAodGhpc0VuZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhpc0VuZCA9IHRoaXMubGVuZ3RoXG4gIH1cblxuICBpZiAoc3RhcnQgPCAwIHx8IGVuZCA+IHRhcmdldC5sZW5ndGggfHwgdGhpc1N0YXJ0IDwgMCB8fCB0aGlzRW5kID4gdGhpcy5sZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignb3V0IG9mIHJhbmdlIGluZGV4JylcbiAgfVxuXG4gIGlmICh0aGlzU3RhcnQgPj0gdGhpc0VuZCAmJiBzdGFydCA+PSBlbmQpIHtcbiAgICByZXR1cm4gMFxuICB9XG4gIGlmICh0aGlzU3RhcnQgPj0gdGhpc0VuZCkge1xuICAgIHJldHVybiAtMVxuICB9XG4gIGlmIChzdGFydCA+PSBlbmQpIHtcbiAgICByZXR1cm4gMVxuICB9XG5cbiAgc3RhcnQgPj4+PSAwXG4gIGVuZCA+Pj49IDBcbiAgdGhpc1N0YXJ0ID4+Pj0gMFxuICB0aGlzRW5kID4+Pj0gMFxuXG4gIGlmICh0aGlzID09PSB0YXJnZXQpIHJldHVybiAwXG5cbiAgdmFyIHggPSB0aGlzRW5kIC0gdGhpc1N0YXJ0XG4gIHZhciB5ID0gZW5kIC0gc3RhcnRcbiAgdmFyIGxlbiA9IE1hdGgubWluKHgsIHkpXG5cbiAgdmFyIHRoaXNDb3B5ID0gdGhpcy5zbGljZSh0aGlzU3RhcnQsIHRoaXNFbmQpXG4gIHZhciB0YXJnZXRDb3B5ID0gdGFyZ2V0LnNsaWNlKHN0YXJ0LCBlbmQpXG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47ICsraSkge1xuICAgIGlmICh0aGlzQ29weVtpXSAhPT0gdGFyZ2V0Q29weVtpXSkge1xuICAgICAgeCA9IHRoaXNDb3B5W2ldXG4gICAgICB5ID0gdGFyZ2V0Q29weVtpXVxuICAgICAgYnJlYWtcbiAgICB9XG4gIH1cblxuICBpZiAoeCA8IHkpIHJldHVybiAtMVxuICBpZiAoeSA8IHgpIHJldHVybiAxXG4gIHJldHVybiAwXG59XG5cbi8vIEZpbmRzIGVpdGhlciB0aGUgZmlyc3QgaW5kZXggb2YgYHZhbGAgaW4gYGJ1ZmZlcmAgYXQgb2Zmc2V0ID49IGBieXRlT2Zmc2V0YCxcbi8vIE9SIHRoZSBsYXN0IGluZGV4IG9mIGB2YWxgIGluIGBidWZmZXJgIGF0IG9mZnNldCA8PSBgYnl0ZU9mZnNldGAuXG4vL1xuLy8gQXJndW1lbnRzOlxuLy8gLSBidWZmZXIgLSBhIEJ1ZmZlciB0byBzZWFyY2hcbi8vIC0gdmFsIC0gYSBzdHJpbmcsIEJ1ZmZlciwgb3IgbnVtYmVyXG4vLyAtIGJ5dGVPZmZzZXQgLSBhbiBpbmRleCBpbnRvIGBidWZmZXJgOyB3aWxsIGJlIGNsYW1wZWQgdG8gYW4gaW50MzJcbi8vIC0gZW5jb2RpbmcgLSBhbiBvcHRpb25hbCBlbmNvZGluZywgcmVsZXZhbnQgaXMgdmFsIGlzIGEgc3RyaW5nXG4vLyAtIGRpciAtIHRydWUgZm9yIGluZGV4T2YsIGZhbHNlIGZvciBsYXN0SW5kZXhPZlxuZnVuY3Rpb24gYmlkaXJlY3Rpb25hbEluZGV4T2YgKGJ1ZmZlciwgdmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZywgZGlyKSB7XG4gIC8vIEVtcHR5IGJ1ZmZlciBtZWFucyBubyBtYXRjaFxuICBpZiAoYnVmZmVyLmxlbmd0aCA9PT0gMCkgcmV0dXJuIC0xXG5cbiAgLy8gTm9ybWFsaXplIGJ5dGVPZmZzZXRcbiAgaWYgKHR5cGVvZiBieXRlT2Zmc2V0ID09PSAnc3RyaW5nJykge1xuICAgIGVuY29kaW5nID0gYnl0ZU9mZnNldFxuICAgIGJ5dGVPZmZzZXQgPSAwXG4gIH0gZWxzZSBpZiAoYnl0ZU9mZnNldCA+IDB4N2ZmZmZmZmYpIHtcbiAgICBieXRlT2Zmc2V0ID0gMHg3ZmZmZmZmZlxuICB9IGVsc2UgaWYgKGJ5dGVPZmZzZXQgPCAtMHg4MDAwMDAwMCkge1xuICAgIGJ5dGVPZmZzZXQgPSAtMHg4MDAwMDAwMFxuICB9XG4gIGJ5dGVPZmZzZXQgPSArYnl0ZU9mZnNldCAvLyBDb2VyY2UgdG8gTnVtYmVyLlxuICBpZiAobnVtYmVySXNOYU4oYnl0ZU9mZnNldCkpIHtcbiAgICAvLyBieXRlT2Zmc2V0OiBpdCBpdCdzIHVuZGVmaW5lZCwgbnVsbCwgTmFOLCBcImZvb1wiLCBldGMsIHNlYXJjaCB3aG9sZSBidWZmZXJcbiAgICBieXRlT2Zmc2V0ID0gZGlyID8gMCA6IChidWZmZXIubGVuZ3RoIC0gMSlcbiAgfVxuXG4gIC8vIE5vcm1hbGl6ZSBieXRlT2Zmc2V0OiBuZWdhdGl2ZSBvZmZzZXRzIHN0YXJ0IGZyb20gdGhlIGVuZCBvZiB0aGUgYnVmZmVyXG4gIGlmIChieXRlT2Zmc2V0IDwgMCkgYnl0ZU9mZnNldCA9IGJ1ZmZlci5sZW5ndGggKyBieXRlT2Zmc2V0XG4gIGlmIChieXRlT2Zmc2V0ID49IGJ1ZmZlci5sZW5ndGgpIHtcbiAgICBpZiAoZGlyKSByZXR1cm4gLTFcbiAgICBlbHNlIGJ5dGVPZmZzZXQgPSBidWZmZXIubGVuZ3RoIC0gMVxuICB9IGVsc2UgaWYgKGJ5dGVPZmZzZXQgPCAwKSB7XG4gICAgaWYgKGRpcikgYnl0ZU9mZnNldCA9IDBcbiAgICBlbHNlIHJldHVybiAtMVxuICB9XG5cbiAgLy8gTm9ybWFsaXplIHZhbFxuICBpZiAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycpIHtcbiAgICB2YWwgPSBCdWZmZXIuZnJvbSh2YWwsIGVuY29kaW5nKVxuICB9XG5cbiAgLy8gRmluYWxseSwgc2VhcmNoIGVpdGhlciBpbmRleE9mIChpZiBkaXIgaXMgdHJ1ZSkgb3IgbGFzdEluZGV4T2ZcbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcih2YWwpKSB7XG4gICAgLy8gU3BlY2lhbCBjYXNlOiBsb29raW5nIGZvciBlbXB0eSBzdHJpbmcvYnVmZmVyIGFsd2F5cyBmYWlsc1xuICAgIGlmICh2YWwubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gLTFcbiAgICB9XG4gICAgcmV0dXJuIGFycmF5SW5kZXhPZihidWZmZXIsIHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIGRpcilcbiAgfSBlbHNlIGlmICh0eXBlb2YgdmFsID09PSAnbnVtYmVyJykge1xuICAgIHZhbCA9IHZhbCAmIDB4RkYgLy8gU2VhcmNoIGZvciBhIGJ5dGUgdmFsdWUgWzAtMjU1XVxuICAgIGlmICh0eXBlb2YgVWludDhBcnJheS5wcm90b3R5cGUuaW5kZXhPZiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaWYgKGRpcikge1xuICAgICAgICByZXR1cm4gVWludDhBcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKGJ1ZmZlciwgdmFsLCBieXRlT2Zmc2V0KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIFVpbnQ4QXJyYXkucHJvdG90eXBlLmxhc3RJbmRleE9mLmNhbGwoYnVmZmVyLCB2YWwsIGJ5dGVPZmZzZXQpXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBhcnJheUluZGV4T2YoYnVmZmVyLCBbIHZhbCBdLCBieXRlT2Zmc2V0LCBlbmNvZGluZywgZGlyKVxuICB9XG5cbiAgdGhyb3cgbmV3IFR5cGVFcnJvcigndmFsIG11c3QgYmUgc3RyaW5nLCBudW1iZXIgb3IgQnVmZmVyJylcbn1cblxuZnVuY3Rpb24gYXJyYXlJbmRleE9mIChhcnIsIHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIGRpcikge1xuICB2YXIgaW5kZXhTaXplID0gMVxuICB2YXIgYXJyTGVuZ3RoID0gYXJyLmxlbmd0aFxuICB2YXIgdmFsTGVuZ3RoID0gdmFsLmxlbmd0aFxuXG4gIGlmIChlbmNvZGluZyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgZW5jb2RpbmcgPSBTdHJpbmcoZW5jb2RpbmcpLnRvTG93ZXJDYXNlKClcbiAgICBpZiAoZW5jb2RpbmcgPT09ICd1Y3MyJyB8fCBlbmNvZGluZyA9PT0gJ3Vjcy0yJyB8fFxuICAgICAgICBlbmNvZGluZyA9PT0gJ3V0ZjE2bGUnIHx8IGVuY29kaW5nID09PSAndXRmLTE2bGUnKSB7XG4gICAgICBpZiAoYXJyLmxlbmd0aCA8IDIgfHwgdmFsLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgcmV0dXJuIC0xXG4gICAgICB9XG4gICAgICBpbmRleFNpemUgPSAyXG4gICAgICBhcnJMZW5ndGggLz0gMlxuICAgICAgdmFsTGVuZ3RoIC89IDJcbiAgICAgIGJ5dGVPZmZzZXQgLz0gMlxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHJlYWQgKGJ1ZiwgaSkge1xuICAgIGlmIChpbmRleFNpemUgPT09IDEpIHtcbiAgICAgIHJldHVybiBidWZbaV1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGJ1Zi5yZWFkVUludDE2QkUoaSAqIGluZGV4U2l6ZSlcbiAgICB9XG4gIH1cblxuICB2YXIgaVxuICBpZiAoZGlyKSB7XG4gICAgdmFyIGZvdW5kSW5kZXggPSAtMVxuICAgIGZvciAoaSA9IGJ5dGVPZmZzZXQ7IGkgPCBhcnJMZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHJlYWQoYXJyLCBpKSA9PT0gcmVhZCh2YWwsIGZvdW5kSW5kZXggPT09IC0xID8gMCA6IGkgLSBmb3VuZEluZGV4KSkge1xuICAgICAgICBpZiAoZm91bmRJbmRleCA9PT0gLTEpIGZvdW5kSW5kZXggPSBpXG4gICAgICAgIGlmIChpIC0gZm91bmRJbmRleCArIDEgPT09IHZhbExlbmd0aCkgcmV0dXJuIGZvdW5kSW5kZXggKiBpbmRleFNpemVcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChmb3VuZEluZGV4ICE9PSAtMSkgaSAtPSBpIC0gZm91bmRJbmRleFxuICAgICAgICBmb3VuZEluZGV4ID0gLTFcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaWYgKGJ5dGVPZmZzZXQgKyB2YWxMZW5ndGggPiBhcnJMZW5ndGgpIGJ5dGVPZmZzZXQgPSBhcnJMZW5ndGggLSB2YWxMZW5ndGhcbiAgICBmb3IgKGkgPSBieXRlT2Zmc2V0OyBpID49IDA7IGktLSkge1xuICAgICAgdmFyIGZvdW5kID0gdHJ1ZVxuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCB2YWxMZW5ndGg7IGorKykge1xuICAgICAgICBpZiAocmVhZChhcnIsIGkgKyBqKSAhPT0gcmVhZCh2YWwsIGopKSB7XG4gICAgICAgICAgZm91bmQgPSBmYWxzZVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChmb3VuZCkgcmV0dXJuIGlcbiAgICB9XG4gIH1cblxuICByZXR1cm4gLTFcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5pbmNsdWRlcyA9IGZ1bmN0aW9uIGluY2x1ZGVzICh2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nKSB7XG4gIHJldHVybiB0aGlzLmluZGV4T2YodmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZykgIT09IC0xXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuaW5kZXhPZiA9IGZ1bmN0aW9uIGluZGV4T2YgKHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcpIHtcbiAgcmV0dXJuIGJpZGlyZWN0aW9uYWxJbmRleE9mKHRoaXMsIHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIHRydWUpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUubGFzdEluZGV4T2YgPSBmdW5jdGlvbiBsYXN0SW5kZXhPZiAodmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZykge1xuICByZXR1cm4gYmlkaXJlY3Rpb25hbEluZGV4T2YodGhpcywgdmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZywgZmFsc2UpXG59XG5cbmZ1bmN0aW9uIGhleFdyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgb2Zmc2V0ID0gTnVtYmVyKG9mZnNldCkgfHwgMFxuICB2YXIgcmVtYWluaW5nID0gYnVmLmxlbmd0aCAtIG9mZnNldFxuICBpZiAoIWxlbmd0aCkge1xuICAgIGxlbmd0aCA9IHJlbWFpbmluZ1xuICB9IGVsc2Uge1xuICAgIGxlbmd0aCA9IE51bWJlcihsZW5ndGgpXG4gICAgaWYgKGxlbmd0aCA+IHJlbWFpbmluZykge1xuICAgICAgbGVuZ3RoID0gcmVtYWluaW5nXG4gICAgfVxuICB9XG5cbiAgdmFyIHN0ckxlbiA9IHN0cmluZy5sZW5ndGhcblxuICBpZiAobGVuZ3RoID4gc3RyTGVuIC8gMikge1xuICAgIGxlbmd0aCA9IHN0ckxlbiAvIDJcbiAgfVxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7XG4gICAgdmFyIHBhcnNlZCA9IHBhcnNlSW50KHN0cmluZy5zdWJzdHIoaSAqIDIsIDIpLCAxNilcbiAgICBpZiAobnVtYmVySXNOYU4ocGFyc2VkKSkgcmV0dXJuIGlcbiAgICBidWZbb2Zmc2V0ICsgaV0gPSBwYXJzZWRcbiAgfVxuICByZXR1cm4gaVxufVxuXG5mdW5jdGlvbiB1dGY4V3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gYmxpdEJ1ZmZlcih1dGY4VG9CeXRlcyhzdHJpbmcsIGJ1Zi5sZW5ndGggLSBvZmZzZXQpLCBidWYsIG9mZnNldCwgbGVuZ3RoKVxufVxuXG5mdW5jdGlvbiBhc2NpaVdyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGJsaXRCdWZmZXIoYXNjaWlUb0J5dGVzKHN0cmluZyksIGJ1Ziwgb2Zmc2V0LCBsZW5ndGgpXG59XG5cbmZ1bmN0aW9uIGxhdGluMVdyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGFzY2lpV3JpdGUoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxufVxuXG5mdW5jdGlvbiBiYXNlNjRXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBibGl0QnVmZmVyKGJhc2U2NFRvQnl0ZXMoc3RyaW5nKSwgYnVmLCBvZmZzZXQsIGxlbmd0aClcbn1cblxuZnVuY3Rpb24gdWNzMldyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGJsaXRCdWZmZXIodXRmMTZsZVRvQnl0ZXMoc3RyaW5nLCBidWYubGVuZ3RoIC0gb2Zmc2V0KSwgYnVmLCBvZmZzZXQsIGxlbmd0aClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uIHdyaXRlIChzdHJpbmcsIG9mZnNldCwgbGVuZ3RoLCBlbmNvZGluZykge1xuICAvLyBCdWZmZXIjd3JpdGUoc3RyaW5nKVxuICBpZiAob2Zmc2V0ID09PSB1bmRlZmluZWQpIHtcbiAgICBlbmNvZGluZyA9ICd1dGY4J1xuICAgIGxlbmd0aCA9IHRoaXMubGVuZ3RoXG4gICAgb2Zmc2V0ID0gMFxuICAvLyBCdWZmZXIjd3JpdGUoc3RyaW5nLCBlbmNvZGluZylcbiAgfSBlbHNlIGlmIChsZW5ndGggPT09IHVuZGVmaW5lZCAmJiB0eXBlb2Ygb2Zmc2V0ID09PSAnc3RyaW5nJykge1xuICAgIGVuY29kaW5nID0gb2Zmc2V0XG4gICAgbGVuZ3RoID0gdGhpcy5sZW5ndGhcbiAgICBvZmZzZXQgPSAwXG4gIC8vIEJ1ZmZlciN3cml0ZShzdHJpbmcsIG9mZnNldFssIGxlbmd0aF1bLCBlbmNvZGluZ10pXG4gIH0gZWxzZSBpZiAoaXNGaW5pdGUob2Zmc2V0KSkge1xuICAgIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICAgIGlmIChpc0Zpbml0ZShsZW5ndGgpKSB7XG4gICAgICBsZW5ndGggPSBsZW5ndGggPj4+IDBcbiAgICAgIGlmIChlbmNvZGluZyA9PT0gdW5kZWZpbmVkKSBlbmNvZGluZyA9ICd1dGY4J1xuICAgIH0gZWxzZSB7XG4gICAgICBlbmNvZGluZyA9IGxlbmd0aFxuICAgICAgbGVuZ3RoID0gdW5kZWZpbmVkXG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICdCdWZmZXIud3JpdGUoc3RyaW5nLCBlbmNvZGluZywgb2Zmc2V0WywgbGVuZ3RoXSkgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZCdcbiAgICApXG4gIH1cblxuICB2YXIgcmVtYWluaW5nID0gdGhpcy5sZW5ndGggLSBvZmZzZXRcbiAgaWYgKGxlbmd0aCA9PT0gdW5kZWZpbmVkIHx8IGxlbmd0aCA+IHJlbWFpbmluZykgbGVuZ3RoID0gcmVtYWluaW5nXG5cbiAgaWYgKChzdHJpbmcubGVuZ3RoID4gMCAmJiAobGVuZ3RoIDwgMCB8fCBvZmZzZXQgPCAwKSkgfHwgb2Zmc2V0ID4gdGhpcy5sZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignQXR0ZW1wdCB0byB3cml0ZSBvdXRzaWRlIGJ1ZmZlciBib3VuZHMnKVxuICB9XG5cbiAgaWYgKCFlbmNvZGluZykgZW5jb2RpbmcgPSAndXRmOCdcblxuICB2YXIgbG93ZXJlZENhc2UgPSBmYWxzZVxuICBmb3IgKDs7KSB7XG4gICAgc3dpdGNoIChlbmNvZGluZykge1xuICAgICAgY2FzZSAnaGV4JzpcbiAgICAgICAgcmV0dXJuIGhleFdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGNhc2UgJ3V0ZjgnOlxuICAgICAgY2FzZSAndXRmLTgnOlxuICAgICAgICByZXR1cm4gdXRmOFdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGNhc2UgJ2FzY2lpJzpcbiAgICAgICAgcmV0dXJuIGFzY2lpV3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgY2FzZSAnbGF0aW4xJzpcbiAgICAgIGNhc2UgJ2JpbmFyeSc6XG4gICAgICAgIHJldHVybiBsYXRpbjFXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBjYXNlICdiYXNlNjQnOlxuICAgICAgICAvLyBXYXJuaW5nOiBtYXhMZW5ndGggbm90IHRha2VuIGludG8gYWNjb3VudCBpbiBiYXNlNjRXcml0ZVxuICAgICAgICByZXR1cm4gYmFzZTY0V3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgY2FzZSAndWNzMic6XG4gICAgICBjYXNlICd1Y3MtMic6XG4gICAgICBjYXNlICd1dGYxNmxlJzpcbiAgICAgIGNhc2UgJ3V0Zi0xNmxlJzpcbiAgICAgICAgcmV0dXJuIHVjczJXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpZiAobG93ZXJlZENhc2UpIHRocm93IG5ldyBUeXBlRXJyb3IoJ1Vua25vd24gZW5jb2Rpbmc6ICcgKyBlbmNvZGluZylcbiAgICAgICAgZW5jb2RpbmcgPSAoJycgKyBlbmNvZGluZykudG9Mb3dlckNhc2UoKVxuICAgICAgICBsb3dlcmVkQ2FzZSA9IHRydWVcbiAgICB9XG4gIH1cbn1cblxuQnVmZmVyLnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbiB0b0pTT04gKCkge1xuICByZXR1cm4ge1xuICAgIHR5cGU6ICdCdWZmZXInLFxuICAgIGRhdGE6IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHRoaXMuX2FyciB8fCB0aGlzLCAwKVxuICB9XG59XG5cbmZ1bmN0aW9uIGJhc2U2NFNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgaWYgKHN0YXJ0ID09PSAwICYmIGVuZCA9PT0gYnVmLmxlbmd0aCkge1xuICAgIHJldHVybiBiYXNlNjQuZnJvbUJ5dGVBcnJheShidWYpXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGJhc2U2NC5mcm9tQnl0ZUFycmF5KGJ1Zi5zbGljZShzdGFydCwgZW5kKSlcbiAgfVxufVxuXG5mdW5jdGlvbiB1dGY4U2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICBlbmQgPSBNYXRoLm1pbihidWYubGVuZ3RoLCBlbmQpXG4gIHZhciByZXMgPSBbXVxuXG4gIHZhciBpID0gc3RhcnRcbiAgd2hpbGUgKGkgPCBlbmQpIHtcbiAgICB2YXIgZmlyc3RCeXRlID0gYnVmW2ldXG4gICAgdmFyIGNvZGVQb2ludCA9IG51bGxcbiAgICB2YXIgYnl0ZXNQZXJTZXF1ZW5jZSA9IChmaXJzdEJ5dGUgPiAweEVGKSA/IDRcbiAgICAgIDogKGZpcnN0Qnl0ZSA+IDB4REYpID8gM1xuICAgICAgICA6IChmaXJzdEJ5dGUgPiAweEJGKSA/IDJcbiAgICAgICAgICA6IDFcblxuICAgIGlmIChpICsgYnl0ZXNQZXJTZXF1ZW5jZSA8PSBlbmQpIHtcbiAgICAgIHZhciBzZWNvbmRCeXRlLCB0aGlyZEJ5dGUsIGZvdXJ0aEJ5dGUsIHRlbXBDb2RlUG9pbnRcblxuICAgICAgc3dpdGNoIChieXRlc1BlclNlcXVlbmNlKSB7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICBpZiAoZmlyc3RCeXRlIDwgMHg4MCkge1xuICAgICAgICAgICAgY29kZVBvaW50ID0gZmlyc3RCeXRlXG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgICBzZWNvbmRCeXRlID0gYnVmW2kgKyAxXVxuICAgICAgICAgIGlmICgoc2Vjb25kQnl0ZSAmIDB4QzApID09PSAweDgwKSB7XG4gICAgICAgICAgICB0ZW1wQ29kZVBvaW50ID0gKGZpcnN0Qnl0ZSAmIDB4MUYpIDw8IDB4NiB8IChzZWNvbmRCeXRlICYgMHgzRilcbiAgICAgICAgICAgIGlmICh0ZW1wQ29kZVBvaW50ID4gMHg3Rikge1xuICAgICAgICAgICAgICBjb2RlUG9pbnQgPSB0ZW1wQ29kZVBvaW50XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgICBzZWNvbmRCeXRlID0gYnVmW2kgKyAxXVxuICAgICAgICAgIHRoaXJkQnl0ZSA9IGJ1ZltpICsgMl1cbiAgICAgICAgICBpZiAoKHNlY29uZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCAmJiAodGhpcmRCeXRlICYgMHhDMCkgPT09IDB4ODApIHtcbiAgICAgICAgICAgIHRlbXBDb2RlUG9pbnQgPSAoZmlyc3RCeXRlICYgMHhGKSA8PCAweEMgfCAoc2Vjb25kQnl0ZSAmIDB4M0YpIDw8IDB4NiB8ICh0aGlyZEJ5dGUgJiAweDNGKVxuICAgICAgICAgICAgaWYgKHRlbXBDb2RlUG9pbnQgPiAweDdGRiAmJiAodGVtcENvZGVQb2ludCA8IDB4RDgwMCB8fCB0ZW1wQ29kZVBvaW50ID4gMHhERkZGKSkge1xuICAgICAgICAgICAgICBjb2RlUG9pbnQgPSB0ZW1wQ29kZVBvaW50XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgNDpcbiAgICAgICAgICBzZWNvbmRCeXRlID0gYnVmW2kgKyAxXVxuICAgICAgICAgIHRoaXJkQnl0ZSA9IGJ1ZltpICsgMl1cbiAgICAgICAgICBmb3VydGhCeXRlID0gYnVmW2kgKyAzXVxuICAgICAgICAgIGlmICgoc2Vjb25kQnl0ZSAmIDB4QzApID09PSAweDgwICYmICh0aGlyZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCAmJiAoZm91cnRoQnl0ZSAmIDB4QzApID09PSAweDgwKSB7XG4gICAgICAgICAgICB0ZW1wQ29kZVBvaW50ID0gKGZpcnN0Qnl0ZSAmIDB4RikgPDwgMHgxMiB8IChzZWNvbmRCeXRlICYgMHgzRikgPDwgMHhDIHwgKHRoaXJkQnl0ZSAmIDB4M0YpIDw8IDB4NiB8IChmb3VydGhCeXRlICYgMHgzRilcbiAgICAgICAgICAgIGlmICh0ZW1wQ29kZVBvaW50ID4gMHhGRkZGICYmIHRlbXBDb2RlUG9pbnQgPCAweDExMDAwMCkge1xuICAgICAgICAgICAgICBjb2RlUG9pbnQgPSB0ZW1wQ29kZVBvaW50XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjb2RlUG9pbnQgPT09IG51bGwpIHtcbiAgICAgIC8vIHdlIGRpZCBub3QgZ2VuZXJhdGUgYSB2YWxpZCBjb2RlUG9pbnQgc28gaW5zZXJ0IGFcbiAgICAgIC8vIHJlcGxhY2VtZW50IGNoYXIgKFUrRkZGRCkgYW5kIGFkdmFuY2Ugb25seSAxIGJ5dGVcbiAgICAgIGNvZGVQb2ludCA9IDB4RkZGRFxuICAgICAgYnl0ZXNQZXJTZXF1ZW5jZSA9IDFcbiAgICB9IGVsc2UgaWYgKGNvZGVQb2ludCA+IDB4RkZGRikge1xuICAgICAgLy8gZW5jb2RlIHRvIHV0ZjE2IChzdXJyb2dhdGUgcGFpciBkYW5jZSlcbiAgICAgIGNvZGVQb2ludCAtPSAweDEwMDAwXG4gICAgICByZXMucHVzaChjb2RlUG9pbnQgPj4+IDEwICYgMHgzRkYgfCAweEQ4MDApXG4gICAgICBjb2RlUG9pbnQgPSAweERDMDAgfCBjb2RlUG9pbnQgJiAweDNGRlxuICAgIH1cblxuICAgIHJlcy5wdXNoKGNvZGVQb2ludClcbiAgICBpICs9IGJ5dGVzUGVyU2VxdWVuY2VcbiAgfVxuXG4gIHJldHVybiBkZWNvZGVDb2RlUG9pbnRzQXJyYXkocmVzKVxufVxuXG4vLyBCYXNlZCBvbiBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8yMjc0NzI3Mi82ODA3NDIsIHRoZSBicm93c2VyIHdpdGhcbi8vIHRoZSBsb3dlc3QgbGltaXQgaXMgQ2hyb21lLCB3aXRoIDB4MTAwMDAgYXJncy5cbi8vIFdlIGdvIDEgbWFnbml0dWRlIGxlc3MsIGZvciBzYWZldHlcbnZhciBNQVhfQVJHVU1FTlRTX0xFTkdUSCA9IDB4MTAwMFxuXG5mdW5jdGlvbiBkZWNvZGVDb2RlUG9pbnRzQXJyYXkgKGNvZGVQb2ludHMpIHtcbiAgdmFyIGxlbiA9IGNvZGVQb2ludHMubGVuZ3RoXG4gIGlmIChsZW4gPD0gTUFYX0FSR1VNRU5UU19MRU5HVEgpIHtcbiAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsIGNvZGVQb2ludHMpIC8vIGF2b2lkIGV4dHJhIHNsaWNlKClcbiAgfVxuXG4gIC8vIERlY29kZSBpbiBjaHVua3MgdG8gYXZvaWQgXCJjYWxsIHN0YWNrIHNpemUgZXhjZWVkZWRcIi5cbiAgdmFyIHJlcyA9ICcnXG4gIHZhciBpID0gMFxuICB3aGlsZSAoaSA8IGxlbikge1xuICAgIHJlcyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFxuICAgICAgU3RyaW5nLFxuICAgICAgY29kZVBvaW50cy5zbGljZShpLCBpICs9IE1BWF9BUkdVTUVOVFNfTEVOR1RIKVxuICAgIClcbiAgfVxuICByZXR1cm4gcmVzXG59XG5cbmZ1bmN0aW9uIGFzY2lpU2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICB2YXIgcmV0ID0gJydcbiAgZW5kID0gTWF0aC5taW4oYnVmLmxlbmd0aCwgZW5kKVxuXG4gIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgKytpKSB7XG4gICAgcmV0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYnVmW2ldICYgMHg3RilcbiAgfVxuICByZXR1cm4gcmV0XG59XG5cbmZ1bmN0aW9uIGxhdGluMVNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIHJldCA9ICcnXG4gIGVuZCA9IE1hdGgubWluKGJ1Zi5sZW5ndGgsIGVuZClcblxuICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7ICsraSkge1xuICAgIHJldCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ1ZltpXSlcbiAgfVxuICByZXR1cm4gcmV0XG59XG5cbmZ1bmN0aW9uIGhleFNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIGxlbiA9IGJ1Zi5sZW5ndGhcblxuICBpZiAoIXN0YXJ0IHx8IHN0YXJ0IDwgMCkgc3RhcnQgPSAwXG4gIGlmICghZW5kIHx8IGVuZCA8IDAgfHwgZW5kID4gbGVuKSBlbmQgPSBsZW5cblxuICB2YXIgb3V0ID0gJydcbiAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyArK2kpIHtcbiAgICBvdXQgKz0gdG9IZXgoYnVmW2ldKVxuICB9XG4gIHJldHVybiBvdXRcbn1cblxuZnVuY3Rpb24gdXRmMTZsZVNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIGJ5dGVzID0gYnVmLnNsaWNlKHN0YXJ0LCBlbmQpXG4gIHZhciByZXMgPSAnJ1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGJ5dGVzLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgcmVzICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYnl0ZXNbaV0gKyAoYnl0ZXNbaSArIDFdICogMjU2KSlcbiAgfVxuICByZXR1cm4gcmVzXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuc2xpY2UgPSBmdW5jdGlvbiBzbGljZSAoc3RhcnQsIGVuZCkge1xuICB2YXIgbGVuID0gdGhpcy5sZW5ndGhcbiAgc3RhcnQgPSB+fnN0YXJ0XG4gIGVuZCA9IGVuZCA9PT0gdW5kZWZpbmVkID8gbGVuIDogfn5lbmRcblxuICBpZiAoc3RhcnQgPCAwKSB7XG4gICAgc3RhcnQgKz0gbGVuXG4gICAgaWYgKHN0YXJ0IDwgMCkgc3RhcnQgPSAwXG4gIH0gZWxzZSBpZiAoc3RhcnQgPiBsZW4pIHtcbiAgICBzdGFydCA9IGxlblxuICB9XG5cbiAgaWYgKGVuZCA8IDApIHtcbiAgICBlbmQgKz0gbGVuXG4gICAgaWYgKGVuZCA8IDApIGVuZCA9IDBcbiAgfSBlbHNlIGlmIChlbmQgPiBsZW4pIHtcbiAgICBlbmQgPSBsZW5cbiAgfVxuXG4gIGlmIChlbmQgPCBzdGFydCkgZW5kID0gc3RhcnRcblxuICB2YXIgbmV3QnVmID0gdGhpcy5zdWJhcnJheShzdGFydCwgZW5kKVxuICAvLyBSZXR1cm4gYW4gYXVnbWVudGVkIGBVaW50OEFycmF5YCBpbnN0YW5jZVxuICBuZXdCdWYuX19wcm90b19fID0gQnVmZmVyLnByb3RvdHlwZVxuICByZXR1cm4gbmV3QnVmXG59XG5cbi8qXG4gKiBOZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IGJ1ZmZlciBpc24ndCB0cnlpbmcgdG8gd3JpdGUgb3V0IG9mIGJvdW5kcy5cbiAqL1xuZnVuY3Rpb24gY2hlY2tPZmZzZXQgKG9mZnNldCwgZXh0LCBsZW5ndGgpIHtcbiAgaWYgKChvZmZzZXQgJSAxKSAhPT0gMCB8fCBvZmZzZXQgPCAwKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignb2Zmc2V0IGlzIG5vdCB1aW50JylcbiAgaWYgKG9mZnNldCArIGV4dCA+IGxlbmd0aCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1RyeWluZyB0byBhY2Nlc3MgYmV5b25kIGJ1ZmZlciBsZW5ndGgnKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50TEUgPSBmdW5jdGlvbiByZWFkVUludExFIChvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIGJ5dGVMZW5ndGgsIHRoaXMubGVuZ3RoKVxuXG4gIHZhciB2YWwgPSB0aGlzW29mZnNldF1cbiAgdmFyIG11bCA9IDFcbiAgdmFyIGkgPSAwXG4gIHdoaWxlICgrK2kgPCBieXRlTGVuZ3RoICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdmFsICs9IHRoaXNbb2Zmc2V0ICsgaV0gKiBtdWxcbiAgfVxuXG4gIHJldHVybiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludEJFID0gZnVuY3Rpb24gcmVhZFVJbnRCRSAob2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIGNoZWNrT2Zmc2V0KG9mZnNldCwgYnl0ZUxlbmd0aCwgdGhpcy5sZW5ndGgpXG4gIH1cblxuICB2YXIgdmFsID0gdGhpc1tvZmZzZXQgKyAtLWJ5dGVMZW5ndGhdXG4gIHZhciBtdWwgPSAxXG4gIHdoaWxlIChieXRlTGVuZ3RoID4gMCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHZhbCArPSB0aGlzW29mZnNldCArIC0tYnl0ZUxlbmd0aF0gKiBtdWxcbiAgfVxuXG4gIHJldHVybiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDggPSBmdW5jdGlvbiByZWFkVUludDggKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMSwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiB0aGlzW29mZnNldF1cbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDE2TEUgPSBmdW5jdGlvbiByZWFkVUludDE2TEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMiwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiB0aGlzW29mZnNldF0gfCAodGhpc1tvZmZzZXQgKyAxXSA8PCA4KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50MTZCRSA9IGZ1bmN0aW9uIHJlYWRVSW50MTZCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAyLCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuICh0aGlzW29mZnNldF0gPDwgOCkgfCB0aGlzW29mZnNldCArIDFdXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQzMkxFID0gZnVuY3Rpb24gcmVhZFVJbnQzMkxFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuXG4gIHJldHVybiAoKHRoaXNbb2Zmc2V0XSkgfFxuICAgICAgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgOCkgfFxuICAgICAgKHRoaXNbb2Zmc2V0ICsgMl0gPDwgMTYpKSArXG4gICAgICAodGhpc1tvZmZzZXQgKyAzXSAqIDB4MTAwMDAwMClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDMyQkUgPSBmdW5jdGlvbiByZWFkVUludDMyQkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG5cbiAgcmV0dXJuICh0aGlzW29mZnNldF0gKiAweDEwMDAwMDApICtcbiAgICAoKHRoaXNbb2Zmc2V0ICsgMV0gPDwgMTYpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAyXSA8PCA4KSB8XG4gICAgdGhpc1tvZmZzZXQgKyAzXSlcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50TEUgPSBmdW5jdGlvbiByZWFkSW50TEUgKG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgYnl0ZUxlbmd0aCwgdGhpcy5sZW5ndGgpXG5cbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0XVxuICB2YXIgbXVsID0gMVxuICB2YXIgaSA9IDBcbiAgd2hpbGUgKCsraSA8IGJ5dGVMZW5ndGggJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB2YWwgKz0gdGhpc1tvZmZzZXQgKyBpXSAqIG11bFxuICB9XG4gIG11bCAqPSAweDgwXG5cbiAgaWYgKHZhbCA+PSBtdWwpIHZhbCAtPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aClcblxuICByZXR1cm4gdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludEJFID0gZnVuY3Rpb24gcmVhZEludEJFIChvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIGJ5dGVMZW5ndGgsIHRoaXMubGVuZ3RoKVxuXG4gIHZhciBpID0gYnl0ZUxlbmd0aFxuICB2YXIgbXVsID0gMVxuICB2YXIgdmFsID0gdGhpc1tvZmZzZXQgKyAtLWldXG4gIHdoaWxlIChpID4gMCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHZhbCArPSB0aGlzW29mZnNldCArIC0taV0gKiBtdWxcbiAgfVxuICBtdWwgKj0gMHg4MFxuXG4gIGlmICh2YWwgPj0gbXVsKSB2YWwgLT0gTWF0aC5wb3coMiwgOCAqIGJ5dGVMZW5ndGgpXG5cbiAgcmV0dXJuIHZhbFxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnQ4ID0gZnVuY3Rpb24gcmVhZEludDggKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMSwgdGhpcy5sZW5ndGgpXG4gIGlmICghKHRoaXNbb2Zmc2V0XSAmIDB4ODApKSByZXR1cm4gKHRoaXNbb2Zmc2V0XSlcbiAgcmV0dXJuICgoMHhmZiAtIHRoaXNbb2Zmc2V0XSArIDEpICogLTEpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDE2TEUgPSBmdW5jdGlvbiByZWFkSW50MTZMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAyLCB0aGlzLmxlbmd0aClcbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0XSB8ICh0aGlzW29mZnNldCArIDFdIDw8IDgpXG4gIHJldHVybiAodmFsICYgMHg4MDAwKSA/IHZhbCB8IDB4RkZGRjAwMDAgOiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50MTZCRSA9IGZ1bmN0aW9uIHJlYWRJbnQxNkJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDIsIHRoaXMubGVuZ3RoKVxuICB2YXIgdmFsID0gdGhpc1tvZmZzZXQgKyAxXSB8ICh0aGlzW29mZnNldF0gPDwgOClcbiAgcmV0dXJuICh2YWwgJiAweDgwMDApID8gdmFsIHwgMHhGRkZGMDAwMCA6IHZhbFxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnQzMkxFID0gZnVuY3Rpb24gcmVhZEludDMyTEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG5cbiAgcmV0dXJuICh0aGlzW29mZnNldF0pIHxcbiAgICAodGhpc1tvZmZzZXQgKyAxXSA8PCA4KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgMl0gPDwgMTYpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAzXSA8PCAyNClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50MzJCRSA9IGZ1bmN0aW9uIHJlYWRJbnQzMkJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuXG4gIHJldHVybiAodGhpc1tvZmZzZXRdIDw8IDI0KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgMTYpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAyXSA8PCA4KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgM10pXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEZsb2F0TEUgPSBmdW5jdGlvbiByZWFkRmxvYXRMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIGllZWU3NTQucmVhZCh0aGlzLCBvZmZzZXQsIHRydWUsIDIzLCA0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRGbG9hdEJFID0gZnVuY3Rpb24gcmVhZEZsb2F0QkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiBpZWVlNzU0LnJlYWQodGhpcywgb2Zmc2V0LCBmYWxzZSwgMjMsIDQpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZERvdWJsZUxFID0gZnVuY3Rpb24gcmVhZERvdWJsZUxFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDgsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gaWVlZTc1NC5yZWFkKHRoaXMsIG9mZnNldCwgdHJ1ZSwgNTIsIDgpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZERvdWJsZUJFID0gZnVuY3Rpb24gcmVhZERvdWJsZUJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDgsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gaWVlZTc1NC5yZWFkKHRoaXMsIG9mZnNldCwgZmFsc2UsIDUyLCA4KVxufVxuXG5mdW5jdGlvbiBjaGVja0ludCAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBleHQsIG1heCwgbWluKSB7XG4gIGlmICghQnVmZmVyLmlzQnVmZmVyKGJ1ZikpIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wiYnVmZmVyXCIgYXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlciBpbnN0YW5jZScpXG4gIGlmICh2YWx1ZSA+IG1heCB8fCB2YWx1ZSA8IG1pbikgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1widmFsdWVcIiBhcmd1bWVudCBpcyBvdXQgb2YgYm91bmRzJylcbiAgaWYgKG9mZnNldCArIGV4dCA+IGJ1Zi5sZW5ndGgpIHRocm93IG5ldyBSYW5nZUVycm9yKCdJbmRleCBvdXQgb2YgcmFuZ2UnKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludExFID0gZnVuY3Rpb24gd3JpdGVVSW50TEUgKHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgdmFyIG1heEJ5dGVzID0gTWF0aC5wb3coMiwgOCAqIGJ5dGVMZW5ndGgpIC0gMVxuICAgIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG1heEJ5dGVzLCAwKVxuICB9XG5cbiAgdmFyIG11bCA9IDFcbiAgdmFyIGkgPSAwXG4gIHRoaXNbb2Zmc2V0XSA9IHZhbHVlICYgMHhGRlxuICB3aGlsZSAoKytpIDwgYnl0ZUxlbmd0aCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHRoaXNbb2Zmc2V0ICsgaV0gPSAodmFsdWUgLyBtdWwpICYgMHhGRlxuICB9XG5cbiAgcmV0dXJuIG9mZnNldCArIGJ5dGVMZW5ndGhcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnRCRSA9IGZ1bmN0aW9uIHdyaXRlVUludEJFICh2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIHZhciBtYXhCeXRlcyA9IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoKSAtIDFcbiAgICBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBtYXhCeXRlcywgMClcbiAgfVxuXG4gIHZhciBpID0gYnl0ZUxlbmd0aCAtIDFcbiAgdmFyIG11bCA9IDFcbiAgdGhpc1tvZmZzZXQgKyBpXSA9IHZhbHVlICYgMHhGRlxuICB3aGlsZSAoLS1pID49IDAgJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB0aGlzW29mZnNldCArIGldID0gKHZhbHVlIC8gbXVsKSAmIDB4RkZcbiAgfVxuXG4gIHJldHVybiBvZmZzZXQgKyBieXRlTGVuZ3RoXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50OCA9IGZ1bmN0aW9uIHdyaXRlVUludDggKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAxLCAweGZmLCAwKVxuICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKVxuICByZXR1cm4gb2Zmc2V0ICsgMVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDE2TEUgPSBmdW5jdGlvbiB3cml0ZVVJbnQxNkxFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMiwgMHhmZmZmLCAwKVxuICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKVxuICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiA4KVxuICByZXR1cm4gb2Zmc2V0ICsgMlxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDE2QkUgPSBmdW5jdGlvbiB3cml0ZVVJbnQxNkJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMiwgMHhmZmZmLCAwKVxuICB0aGlzW29mZnNldF0gPSAodmFsdWUgPj4+IDgpXG4gIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgJiAweGZmKVxuICByZXR1cm4gb2Zmc2V0ICsgMlxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDMyTEUgPSBmdW5jdGlvbiB3cml0ZVVJbnQzMkxFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgNCwgMHhmZmZmZmZmZiwgMClcbiAgdGhpc1tvZmZzZXQgKyAzXSA9ICh2YWx1ZSA+Pj4gMjQpXG4gIHRoaXNbb2Zmc2V0ICsgMl0gPSAodmFsdWUgPj4+IDE2KVxuICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiA4KVxuICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKVxuICByZXR1cm4gb2Zmc2V0ICsgNFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDMyQkUgPSBmdW5jdGlvbiB3cml0ZVVJbnQzMkJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgNCwgMHhmZmZmZmZmZiwgMClcbiAgdGhpc1tvZmZzZXRdID0gKHZhbHVlID4+PiAyNClcbiAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSA+Pj4gMTYpXG4gIHRoaXNbb2Zmc2V0ICsgMl0gPSAodmFsdWUgPj4+IDgpXG4gIHRoaXNbb2Zmc2V0ICsgM10gPSAodmFsdWUgJiAweGZmKVxuICByZXR1cm4gb2Zmc2V0ICsgNFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50TEUgPSBmdW5jdGlvbiB3cml0ZUludExFICh2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIHZhciBsaW1pdCA9IE1hdGgucG93KDIsICg4ICogYnl0ZUxlbmd0aCkgLSAxKVxuXG4gICAgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbGltaXQgLSAxLCAtbGltaXQpXG4gIH1cblxuICB2YXIgaSA9IDBcbiAgdmFyIG11bCA9IDFcbiAgdmFyIHN1YiA9IDBcbiAgdGhpc1tvZmZzZXRdID0gdmFsdWUgJiAweEZGXG4gIHdoaWxlICgrK2kgPCBieXRlTGVuZ3RoICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgaWYgKHZhbHVlIDwgMCAmJiBzdWIgPT09IDAgJiYgdGhpc1tvZmZzZXQgKyBpIC0gMV0gIT09IDApIHtcbiAgICAgIHN1YiA9IDFcbiAgICB9XG4gICAgdGhpc1tvZmZzZXQgKyBpXSA9ICgodmFsdWUgLyBtdWwpID4+IDApIC0gc3ViICYgMHhGRlxuICB9XG5cbiAgcmV0dXJuIG9mZnNldCArIGJ5dGVMZW5ndGhcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludEJFID0gZnVuY3Rpb24gd3JpdGVJbnRCRSAodmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICB2YXIgbGltaXQgPSBNYXRoLnBvdygyLCAoOCAqIGJ5dGVMZW5ndGgpIC0gMSlcblxuICAgIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIGxpbWl0IC0gMSwgLWxpbWl0KVxuICB9XG5cbiAgdmFyIGkgPSBieXRlTGVuZ3RoIC0gMVxuICB2YXIgbXVsID0gMVxuICB2YXIgc3ViID0gMFxuICB0aGlzW29mZnNldCArIGldID0gdmFsdWUgJiAweEZGXG4gIHdoaWxlICgtLWkgPj0gMCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIGlmICh2YWx1ZSA8IDAgJiYgc3ViID09PSAwICYmIHRoaXNbb2Zmc2V0ICsgaSArIDFdICE9PSAwKSB7XG4gICAgICBzdWIgPSAxXG4gICAgfVxuICAgIHRoaXNbb2Zmc2V0ICsgaV0gPSAoKHZhbHVlIC8gbXVsKSA+PiAwKSAtIHN1YiAmIDB4RkZcbiAgfVxuXG4gIHJldHVybiBvZmZzZXQgKyBieXRlTGVuZ3RoXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQ4ID0gZnVuY3Rpb24gd3JpdGVJbnQ4ICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMSwgMHg3ZiwgLTB4ODApXG4gIGlmICh2YWx1ZSA8IDApIHZhbHVlID0gMHhmZiArIHZhbHVlICsgMVxuICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKVxuICByZXR1cm4gb2Zmc2V0ICsgMVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50MTZMRSA9IGZ1bmN0aW9uIHdyaXRlSW50MTZMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDIsIDB4N2ZmZiwgLTB4ODAwMClcbiAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSA+Pj4gOClcbiAgcmV0dXJuIG9mZnNldCArIDJcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDE2QkUgPSBmdW5jdGlvbiB3cml0ZUludDE2QkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAyLCAweDdmZmYsIC0weDgwMDApXG4gIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSA+Pj4gOClcbiAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIHJldHVybiBvZmZzZXQgKyAyXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQzMkxFID0gZnVuY3Rpb24gd3JpdGVJbnQzMkxFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgNCwgMHg3ZmZmZmZmZiwgLTB4ODAwMDAwMDApXG4gIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDgpXG4gIHRoaXNbb2Zmc2V0ICsgMl0gPSAodmFsdWUgPj4+IDE2KVxuICB0aGlzW29mZnNldCArIDNdID0gKHZhbHVlID4+PiAyNClcbiAgcmV0dXJuIG9mZnNldCArIDRcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDMyQkUgPSBmdW5jdGlvbiB3cml0ZUludDMyQkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCA0LCAweDdmZmZmZmZmLCAtMHg4MDAwMDAwMClcbiAgaWYgKHZhbHVlIDwgMCkgdmFsdWUgPSAweGZmZmZmZmZmICsgdmFsdWUgKyAxXG4gIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSA+Pj4gMjQpXG4gIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDE2KVxuICB0aGlzW29mZnNldCArIDJdID0gKHZhbHVlID4+PiA4KVxuICB0aGlzW29mZnNldCArIDNdID0gKHZhbHVlICYgMHhmZilcbiAgcmV0dXJuIG9mZnNldCArIDRcbn1cblxuZnVuY3Rpb24gY2hlY2tJRUVFNzU0IChidWYsIHZhbHVlLCBvZmZzZXQsIGV4dCwgbWF4LCBtaW4pIHtcbiAgaWYgKG9mZnNldCArIGV4dCA+IGJ1Zi5sZW5ndGgpIHRocm93IG5ldyBSYW5nZUVycm9yKCdJbmRleCBvdXQgb2YgcmFuZ2UnKVxuICBpZiAob2Zmc2V0IDwgMCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0luZGV4IG91dCBvZiByYW5nZScpXG59XG5cbmZ1bmN0aW9uIHdyaXRlRmxvYXQgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuLCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIGNoZWNrSUVFRTc1NChidWYsIHZhbHVlLCBvZmZzZXQsIDQsIDMuNDAyODIzNDY2Mzg1Mjg4NmUrMzgsIC0zLjQwMjgyMzQ2NjM4NTI4ODZlKzM4KVxuICB9XG4gIGllZWU3NTQud3JpdGUoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4sIDIzLCA0KVxuICByZXR1cm4gb2Zmc2V0ICsgNFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlRmxvYXRMRSA9IGZ1bmN0aW9uIHdyaXRlRmxvYXRMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgcmV0dXJuIHdyaXRlRmxvYXQodGhpcywgdmFsdWUsIG9mZnNldCwgdHJ1ZSwgbm9Bc3NlcnQpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVGbG9hdEJFID0gZnVuY3Rpb24gd3JpdGVGbG9hdEJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICByZXR1cm4gd3JpdGVGbG9hdCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBmYWxzZSwgbm9Bc3NlcnQpXG59XG5cbmZ1bmN0aW9uIHdyaXRlRG91YmxlIChidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbiwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICBjaGVja0lFRUU3NTQoYnVmLCB2YWx1ZSwgb2Zmc2V0LCA4LCAxLjc5NzY5MzEzNDg2MjMxNTdFKzMwOCwgLTEuNzk3NjkzMTM0ODYyMzE1N0UrMzA4KVxuICB9XG4gIGllZWU3NTQud3JpdGUoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4sIDUyLCA4KVxuICByZXR1cm4gb2Zmc2V0ICsgOFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlRG91YmxlTEUgPSBmdW5jdGlvbiB3cml0ZURvdWJsZUxFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICByZXR1cm4gd3JpdGVEb3VibGUodGhpcywgdmFsdWUsIG9mZnNldCwgdHJ1ZSwgbm9Bc3NlcnQpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVEb3VibGVCRSA9IGZ1bmN0aW9uIHdyaXRlRG91YmxlQkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHJldHVybiB3cml0ZURvdWJsZSh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBmYWxzZSwgbm9Bc3NlcnQpXG59XG5cbi8vIGNvcHkodGFyZ2V0QnVmZmVyLCB0YXJnZXRTdGFydD0wLCBzb3VyY2VTdGFydD0wLCBzb3VyY2VFbmQ9YnVmZmVyLmxlbmd0aClcbkJ1ZmZlci5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uIGNvcHkgKHRhcmdldCwgdGFyZ2V0U3RhcnQsIHN0YXJ0LCBlbmQpIHtcbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIodGFyZ2V0KSkgdGhyb3cgbmV3IFR5cGVFcnJvcignYXJndW1lbnQgc2hvdWxkIGJlIGEgQnVmZmVyJylcbiAgaWYgKCFzdGFydCkgc3RhcnQgPSAwXG4gIGlmICghZW5kICYmIGVuZCAhPT0gMCkgZW5kID0gdGhpcy5sZW5ndGhcbiAgaWYgKHRhcmdldFN0YXJ0ID49IHRhcmdldC5sZW5ndGgpIHRhcmdldFN0YXJ0ID0gdGFyZ2V0Lmxlbmd0aFxuICBpZiAoIXRhcmdldFN0YXJ0KSB0YXJnZXRTdGFydCA9IDBcbiAgaWYgKGVuZCA+IDAgJiYgZW5kIDwgc3RhcnQpIGVuZCA9IHN0YXJ0XG5cbiAgLy8gQ29weSAwIGJ5dGVzOyB3ZSdyZSBkb25lXG4gIGlmIChlbmQgPT09IHN0YXJ0KSByZXR1cm4gMFxuICBpZiAodGFyZ2V0Lmxlbmd0aCA9PT0gMCB8fCB0aGlzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIDBcblxuICAvLyBGYXRhbCBlcnJvciBjb25kaXRpb25zXG4gIGlmICh0YXJnZXRTdGFydCA8IDApIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcigndGFyZ2V0U3RhcnQgb3V0IG9mIGJvdW5kcycpXG4gIH1cbiAgaWYgKHN0YXJ0IDwgMCB8fCBzdGFydCA+PSB0aGlzLmxlbmd0aCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0luZGV4IG91dCBvZiByYW5nZScpXG4gIGlmIChlbmQgPCAwKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignc291cmNlRW5kIG91dCBvZiBib3VuZHMnKVxuXG4gIC8vIEFyZSB3ZSBvb2I/XG4gIGlmIChlbmQgPiB0aGlzLmxlbmd0aCkgZW5kID0gdGhpcy5sZW5ndGhcbiAgaWYgKHRhcmdldC5sZW5ndGggLSB0YXJnZXRTdGFydCA8IGVuZCAtIHN0YXJ0KSB7XG4gICAgZW5kID0gdGFyZ2V0Lmxlbmd0aCAtIHRhcmdldFN0YXJ0ICsgc3RhcnRcbiAgfVxuXG4gIHZhciBsZW4gPSBlbmQgLSBzdGFydFxuXG4gIGlmICh0aGlzID09PSB0YXJnZXQgJiYgdHlwZW9mIFVpbnQ4QXJyYXkucHJvdG90eXBlLmNvcHlXaXRoaW4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAvLyBVc2UgYnVpbHQtaW4gd2hlbiBhdmFpbGFibGUsIG1pc3NpbmcgZnJvbSBJRTExXG4gICAgdGhpcy5jb3B5V2l0aGluKHRhcmdldFN0YXJ0LCBzdGFydCwgZW5kKVxuICB9IGVsc2UgaWYgKHRoaXMgPT09IHRhcmdldCAmJiBzdGFydCA8IHRhcmdldFN0YXJ0ICYmIHRhcmdldFN0YXJ0IDwgZW5kKSB7XG4gICAgLy8gZGVzY2VuZGluZyBjb3B5IGZyb20gZW5kXG4gICAgZm9yICh2YXIgaSA9IGxlbiAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICB0YXJnZXRbaSArIHRhcmdldFN0YXJ0XSA9IHRoaXNbaSArIHN0YXJ0XVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBVaW50OEFycmF5LnByb3RvdHlwZS5zZXQuY2FsbChcbiAgICAgIHRhcmdldCxcbiAgICAgIHRoaXMuc3ViYXJyYXkoc3RhcnQsIGVuZCksXG4gICAgICB0YXJnZXRTdGFydFxuICAgIClcbiAgfVxuXG4gIHJldHVybiBsZW5cbn1cblxuLy8gVXNhZ2U6XG4vLyAgICBidWZmZXIuZmlsbChudW1iZXJbLCBvZmZzZXRbLCBlbmRdXSlcbi8vICAgIGJ1ZmZlci5maWxsKGJ1ZmZlclssIG9mZnNldFssIGVuZF1dKVxuLy8gICAgYnVmZmVyLmZpbGwoc3RyaW5nWywgb2Zmc2V0WywgZW5kXV1bLCBlbmNvZGluZ10pXG5CdWZmZXIucHJvdG90eXBlLmZpbGwgPSBmdW5jdGlvbiBmaWxsICh2YWwsIHN0YXJ0LCBlbmQsIGVuY29kaW5nKSB7XG4gIC8vIEhhbmRsZSBzdHJpbmcgY2FzZXM6XG4gIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJykge1xuICAgIGlmICh0eXBlb2Ygc3RhcnQgPT09ICdzdHJpbmcnKSB7XG4gICAgICBlbmNvZGluZyA9IHN0YXJ0XG4gICAgICBzdGFydCA9IDBcbiAgICAgIGVuZCA9IHRoaXMubGVuZ3RoXG4gICAgfSBlbHNlIGlmICh0eXBlb2YgZW5kID09PSAnc3RyaW5nJykge1xuICAgICAgZW5jb2RpbmcgPSBlbmRcbiAgICAgIGVuZCA9IHRoaXMubGVuZ3RoXG4gICAgfVxuICAgIGlmIChlbmNvZGluZyAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBlbmNvZGluZyAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2VuY29kaW5nIG11c3QgYmUgYSBzdHJpbmcnKVxuICAgIH1cbiAgICBpZiAodHlwZW9mIGVuY29kaW5nID09PSAnc3RyaW5nJyAmJiAhQnVmZmVyLmlzRW5jb2RpbmcoZW5jb2RpbmcpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdVbmtub3duIGVuY29kaW5nOiAnICsgZW5jb2RpbmcpXG4gICAgfVxuICAgIGlmICh2YWwubGVuZ3RoID09PSAxKSB7XG4gICAgICB2YXIgY29kZSA9IHZhbC5jaGFyQ29kZUF0KDApXG4gICAgICBpZiAoKGVuY29kaW5nID09PSAndXRmOCcgJiYgY29kZSA8IDEyOCkgfHxcbiAgICAgICAgICBlbmNvZGluZyA9PT0gJ2xhdGluMScpIHtcbiAgICAgICAgLy8gRmFzdCBwYXRoOiBJZiBgdmFsYCBmaXRzIGludG8gYSBzaW5nbGUgYnl0ZSwgdXNlIHRoYXQgbnVtZXJpYyB2YWx1ZS5cbiAgICAgICAgdmFsID0gY29kZVxuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIGlmICh0eXBlb2YgdmFsID09PSAnbnVtYmVyJykge1xuICAgIHZhbCA9IHZhbCAmIDI1NVxuICB9XG5cbiAgLy8gSW52YWxpZCByYW5nZXMgYXJlIG5vdCBzZXQgdG8gYSBkZWZhdWx0LCBzbyBjYW4gcmFuZ2UgY2hlY2sgZWFybHkuXG4gIGlmIChzdGFydCA8IDAgfHwgdGhpcy5sZW5ndGggPCBzdGFydCB8fCB0aGlzLmxlbmd0aCA8IGVuZCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdPdXQgb2YgcmFuZ2UgaW5kZXgnKVxuICB9XG5cbiAgaWYgKGVuZCA8PSBzdGFydCkge1xuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICBzdGFydCA9IHN0YXJ0ID4+PiAwXG4gIGVuZCA9IGVuZCA9PT0gdW5kZWZpbmVkID8gdGhpcy5sZW5ndGggOiBlbmQgPj4+IDBcblxuICBpZiAoIXZhbCkgdmFsID0gMFxuXG4gIHZhciBpXG4gIGlmICh0eXBlb2YgdmFsID09PSAnbnVtYmVyJykge1xuICAgIGZvciAoaSA9IHN0YXJ0OyBpIDwgZW5kOyArK2kpIHtcbiAgICAgIHRoaXNbaV0gPSB2YWxcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdmFyIGJ5dGVzID0gQnVmZmVyLmlzQnVmZmVyKHZhbClcbiAgICAgID8gdmFsXG4gICAgICA6IEJ1ZmZlci5mcm9tKHZhbCwgZW5jb2RpbmcpXG4gICAgdmFyIGxlbiA9IGJ5dGVzLmxlbmd0aFxuICAgIGlmIChsZW4gPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSB2YWx1ZSBcIicgKyB2YWwgK1xuICAgICAgICAnXCIgaXMgaW52YWxpZCBmb3IgYXJndW1lbnQgXCJ2YWx1ZVwiJylcbiAgICB9XG4gICAgZm9yIChpID0gMDsgaSA8IGVuZCAtIHN0YXJ0OyArK2kpIHtcbiAgICAgIHRoaXNbaSArIHN0YXJ0XSA9IGJ5dGVzW2kgJSBsZW5dXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRoaXNcbn1cblxuLy8gSEVMUEVSIEZVTkNUSU9OU1xuLy8gPT09PT09PT09PT09PT09PVxuXG52YXIgSU5WQUxJRF9CQVNFNjRfUkUgPSAvW14rLzAtOUEtWmEtei1fXS9nXG5cbmZ1bmN0aW9uIGJhc2U2NGNsZWFuIChzdHIpIHtcbiAgLy8gTm9kZSB0YWtlcyBlcXVhbCBzaWducyBhcyBlbmQgb2YgdGhlIEJhc2U2NCBlbmNvZGluZ1xuICBzdHIgPSBzdHIuc3BsaXQoJz0nKVswXVxuICAvLyBOb2RlIHN0cmlwcyBvdXQgaW52YWxpZCBjaGFyYWN0ZXJzIGxpa2UgXFxuIGFuZCBcXHQgZnJvbSB0aGUgc3RyaW5nLCBiYXNlNjQtanMgZG9lcyBub3RcbiAgc3RyID0gc3RyLnRyaW0oKS5yZXBsYWNlKElOVkFMSURfQkFTRTY0X1JFLCAnJylcbiAgLy8gTm9kZSBjb252ZXJ0cyBzdHJpbmdzIHdpdGggbGVuZ3RoIDwgMiB0byAnJ1xuICBpZiAoc3RyLmxlbmd0aCA8IDIpIHJldHVybiAnJ1xuICAvLyBOb2RlIGFsbG93cyBmb3Igbm9uLXBhZGRlZCBiYXNlNjQgc3RyaW5ncyAobWlzc2luZyB0cmFpbGluZyA9PT0pLCBiYXNlNjQtanMgZG9lcyBub3RcbiAgd2hpbGUgKHN0ci5sZW5ndGggJSA0ICE9PSAwKSB7XG4gICAgc3RyID0gc3RyICsgJz0nXG4gIH1cbiAgcmV0dXJuIHN0clxufVxuXG5mdW5jdGlvbiB0b0hleCAobikge1xuICBpZiAobiA8IDE2KSByZXR1cm4gJzAnICsgbi50b1N0cmluZygxNilcbiAgcmV0dXJuIG4udG9TdHJpbmcoMTYpXG59XG5cbmZ1bmN0aW9uIHV0ZjhUb0J5dGVzIChzdHJpbmcsIHVuaXRzKSB7XG4gIHVuaXRzID0gdW5pdHMgfHwgSW5maW5pdHlcbiAgdmFyIGNvZGVQb2ludFxuICB2YXIgbGVuZ3RoID0gc3RyaW5nLmxlbmd0aFxuICB2YXIgbGVhZFN1cnJvZ2F0ZSA9IG51bGxcbiAgdmFyIGJ5dGVzID0gW11cblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7XG4gICAgY29kZVBvaW50ID0gc3RyaW5nLmNoYXJDb2RlQXQoaSlcblxuICAgIC8vIGlzIHN1cnJvZ2F0ZSBjb21wb25lbnRcbiAgICBpZiAoY29kZVBvaW50ID4gMHhEN0ZGICYmIGNvZGVQb2ludCA8IDB4RTAwMCkge1xuICAgICAgLy8gbGFzdCBjaGFyIHdhcyBhIGxlYWRcbiAgICAgIGlmICghbGVhZFN1cnJvZ2F0ZSkge1xuICAgICAgICAvLyBubyBsZWFkIHlldFxuICAgICAgICBpZiAoY29kZVBvaW50ID4gMHhEQkZGKSB7XG4gICAgICAgICAgLy8gdW5leHBlY3RlZCB0cmFpbFxuICAgICAgICAgIGlmICgodW5pdHMgLT0gMykgPiAtMSkgYnl0ZXMucHVzaCgweEVGLCAweEJGLCAweEJEKVxuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH0gZWxzZSBpZiAoaSArIDEgPT09IGxlbmd0aCkge1xuICAgICAgICAgIC8vIHVucGFpcmVkIGxlYWRcbiAgICAgICAgICBpZiAoKHVuaXRzIC09IDMpID4gLTEpIGJ5dGVzLnB1c2goMHhFRiwgMHhCRiwgMHhCRClcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gdmFsaWQgbGVhZFxuICAgICAgICBsZWFkU3Vycm9nYXRlID0gY29kZVBvaW50XG5cbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgLy8gMiBsZWFkcyBpbiBhIHJvd1xuICAgICAgaWYgKGNvZGVQb2ludCA8IDB4REMwMCkge1xuICAgICAgICBpZiAoKHVuaXRzIC09IDMpID4gLTEpIGJ5dGVzLnB1c2goMHhFRiwgMHhCRiwgMHhCRClcbiAgICAgICAgbGVhZFN1cnJvZ2F0ZSA9IGNvZGVQb2ludFxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICAvLyB2YWxpZCBzdXJyb2dhdGUgcGFpclxuICAgICAgY29kZVBvaW50ID0gKGxlYWRTdXJyb2dhdGUgLSAweEQ4MDAgPDwgMTAgfCBjb2RlUG9pbnQgLSAweERDMDApICsgMHgxMDAwMFxuICAgIH0gZWxzZSBpZiAobGVhZFN1cnJvZ2F0ZSkge1xuICAgICAgLy8gdmFsaWQgYm1wIGNoYXIsIGJ1dCBsYXN0IGNoYXIgd2FzIGEgbGVhZFxuICAgICAgaWYgKCh1bml0cyAtPSAzKSA+IC0xKSBieXRlcy5wdXNoKDB4RUYsIDB4QkYsIDB4QkQpXG4gICAgfVxuXG4gICAgbGVhZFN1cnJvZ2F0ZSA9IG51bGxcblxuICAgIC8vIGVuY29kZSB1dGY4XG4gICAgaWYgKGNvZGVQb2ludCA8IDB4ODApIHtcbiAgICAgIGlmICgodW5pdHMgLT0gMSkgPCAwKSBicmVha1xuICAgICAgYnl0ZXMucHVzaChjb2RlUG9pbnQpXG4gICAgfSBlbHNlIGlmIChjb2RlUG9pbnQgPCAweDgwMCkge1xuICAgICAgaWYgKCh1bml0cyAtPSAyKSA8IDApIGJyZWFrXG4gICAgICBieXRlcy5wdXNoKFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHg2IHwgMHhDMCxcbiAgICAgICAgY29kZVBvaW50ICYgMHgzRiB8IDB4ODBcbiAgICAgIClcbiAgICB9IGVsc2UgaWYgKGNvZGVQb2ludCA8IDB4MTAwMDApIHtcbiAgICAgIGlmICgodW5pdHMgLT0gMykgPCAwKSBicmVha1xuICAgICAgYnl0ZXMucHVzaChcbiAgICAgICAgY29kZVBvaW50ID4+IDB4QyB8IDB4RTAsXG4gICAgICAgIGNvZGVQb2ludCA+PiAweDYgJiAweDNGIHwgMHg4MCxcbiAgICAgICAgY29kZVBvaW50ICYgMHgzRiB8IDB4ODBcbiAgICAgIClcbiAgICB9IGVsc2UgaWYgKGNvZGVQb2ludCA8IDB4MTEwMDAwKSB7XG4gICAgICBpZiAoKHVuaXRzIC09IDQpIDwgMCkgYnJlYWtcbiAgICAgIGJ5dGVzLnB1c2goXG4gICAgICAgIGNvZGVQb2ludCA+PiAweDEyIHwgMHhGMCxcbiAgICAgICAgY29kZVBvaW50ID4+IDB4QyAmIDB4M0YgfCAweDgwLFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHg2ICYgMHgzRiB8IDB4ODAsXG4gICAgICAgIGNvZGVQb2ludCAmIDB4M0YgfCAweDgwXG4gICAgICApXG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBjb2RlIHBvaW50JylcbiAgICB9XG4gIH1cblxuICByZXR1cm4gYnl0ZXNcbn1cblxuZnVuY3Rpb24gYXNjaWlUb0J5dGVzIChzdHIpIHtcbiAgdmFyIGJ5dGVBcnJheSA9IFtdXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgKytpKSB7XG4gICAgLy8gTm9kZSdzIGNvZGUgc2VlbXMgdG8gYmUgZG9pbmcgdGhpcyBhbmQgbm90ICYgMHg3Ri4uXG4gICAgYnl0ZUFycmF5LnB1c2goc3RyLmNoYXJDb2RlQXQoaSkgJiAweEZGKVxuICB9XG4gIHJldHVybiBieXRlQXJyYXlcbn1cblxuZnVuY3Rpb24gdXRmMTZsZVRvQnl0ZXMgKHN0ciwgdW5pdHMpIHtcbiAgdmFyIGMsIGhpLCBsb1xuICB2YXIgYnl0ZUFycmF5ID0gW11cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyArK2kpIHtcbiAgICBpZiAoKHVuaXRzIC09IDIpIDwgMCkgYnJlYWtcblxuICAgIGMgPSBzdHIuY2hhckNvZGVBdChpKVxuICAgIGhpID0gYyA+PiA4XG4gICAgbG8gPSBjICUgMjU2XG4gICAgYnl0ZUFycmF5LnB1c2gobG8pXG4gICAgYnl0ZUFycmF5LnB1c2goaGkpXG4gIH1cblxuICByZXR1cm4gYnl0ZUFycmF5XG59XG5cbmZ1bmN0aW9uIGJhc2U2NFRvQnl0ZXMgKHN0cikge1xuICByZXR1cm4gYmFzZTY0LnRvQnl0ZUFycmF5KGJhc2U2NGNsZWFuKHN0cikpXG59XG5cbmZ1bmN0aW9uIGJsaXRCdWZmZXIgKHNyYywgZHN0LCBvZmZzZXQsIGxlbmd0aCkge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7XG4gICAgaWYgKChpICsgb2Zmc2V0ID49IGRzdC5sZW5ndGgpIHx8IChpID49IHNyYy5sZW5ndGgpKSBicmVha1xuICAgIGRzdFtpICsgb2Zmc2V0XSA9IHNyY1tpXVxuICB9XG4gIHJldHVybiBpXG59XG5cbi8vIEFycmF5QnVmZmVyIG9yIFVpbnQ4QXJyYXkgb2JqZWN0cyBmcm9tIG90aGVyIGNvbnRleHRzIChpLmUuIGlmcmFtZXMpIGRvIG5vdCBwYXNzXG4vLyB0aGUgYGluc3RhbmNlb2ZgIGNoZWNrIGJ1dCB0aGV5IHNob3VsZCBiZSB0cmVhdGVkIGFzIG9mIHRoYXQgdHlwZS5cbi8vIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL2Zlcm9zcy9idWZmZXIvaXNzdWVzLzE2NlxuZnVuY3Rpb24gaXNJbnN0YW5jZSAob2JqLCB0eXBlKSB7XG4gIHJldHVybiBvYmogaW5zdGFuY2VvZiB0eXBlIHx8XG4gICAgKG9iaiAhPSBudWxsICYmIG9iai5jb25zdHJ1Y3RvciAhPSBudWxsICYmIG9iai5jb25zdHJ1Y3Rvci5uYW1lICE9IG51bGwgJiZcbiAgICAgIG9iai5jb25zdHJ1Y3Rvci5uYW1lID09PSB0eXBlLm5hbWUpXG59XG5mdW5jdGlvbiBudW1iZXJJc05hTiAob2JqKSB7XG4gIC8vIEZvciBJRTExIHN1cHBvcnRcbiAgcmV0dXJuIG9iaiAhPT0gb2JqIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tc2VsZi1jb21wYXJlXG59XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHtcbiAgXCIxMDBcIjogXCJDb250aW51ZVwiLFxuICBcIjEwMVwiOiBcIlN3aXRjaGluZyBQcm90b2NvbHNcIixcbiAgXCIxMDJcIjogXCJQcm9jZXNzaW5nXCIsXG4gIFwiMjAwXCI6IFwiT0tcIixcbiAgXCIyMDFcIjogXCJDcmVhdGVkXCIsXG4gIFwiMjAyXCI6IFwiQWNjZXB0ZWRcIixcbiAgXCIyMDNcIjogXCJOb24tQXV0aG9yaXRhdGl2ZSBJbmZvcm1hdGlvblwiLFxuICBcIjIwNFwiOiBcIk5vIENvbnRlbnRcIixcbiAgXCIyMDVcIjogXCJSZXNldCBDb250ZW50XCIsXG4gIFwiMjA2XCI6IFwiUGFydGlhbCBDb250ZW50XCIsXG4gIFwiMjA3XCI6IFwiTXVsdGktU3RhdHVzXCIsXG4gIFwiMjA4XCI6IFwiQWxyZWFkeSBSZXBvcnRlZFwiLFxuICBcIjIyNlwiOiBcIklNIFVzZWRcIixcbiAgXCIzMDBcIjogXCJNdWx0aXBsZSBDaG9pY2VzXCIsXG4gIFwiMzAxXCI6IFwiTW92ZWQgUGVybWFuZW50bHlcIixcbiAgXCIzMDJcIjogXCJGb3VuZFwiLFxuICBcIjMwM1wiOiBcIlNlZSBPdGhlclwiLFxuICBcIjMwNFwiOiBcIk5vdCBNb2RpZmllZFwiLFxuICBcIjMwNVwiOiBcIlVzZSBQcm94eVwiLFxuICBcIjMwN1wiOiBcIlRlbXBvcmFyeSBSZWRpcmVjdFwiLFxuICBcIjMwOFwiOiBcIlBlcm1hbmVudCBSZWRpcmVjdFwiLFxuICBcIjQwMFwiOiBcIkJhZCBSZXF1ZXN0XCIsXG4gIFwiNDAxXCI6IFwiVW5hdXRob3JpemVkXCIsXG4gIFwiNDAyXCI6IFwiUGF5bWVudCBSZXF1aXJlZFwiLFxuICBcIjQwM1wiOiBcIkZvcmJpZGRlblwiLFxuICBcIjQwNFwiOiBcIk5vdCBGb3VuZFwiLFxuICBcIjQwNVwiOiBcIk1ldGhvZCBOb3QgQWxsb3dlZFwiLFxuICBcIjQwNlwiOiBcIk5vdCBBY2NlcHRhYmxlXCIsXG4gIFwiNDA3XCI6IFwiUHJveHkgQXV0aGVudGljYXRpb24gUmVxdWlyZWRcIixcbiAgXCI0MDhcIjogXCJSZXF1ZXN0IFRpbWVvdXRcIixcbiAgXCI0MDlcIjogXCJDb25mbGljdFwiLFxuICBcIjQxMFwiOiBcIkdvbmVcIixcbiAgXCI0MTFcIjogXCJMZW5ndGggUmVxdWlyZWRcIixcbiAgXCI0MTJcIjogXCJQcmVjb25kaXRpb24gRmFpbGVkXCIsXG4gIFwiNDEzXCI6IFwiUGF5bG9hZCBUb28gTGFyZ2VcIixcbiAgXCI0MTRcIjogXCJVUkkgVG9vIExvbmdcIixcbiAgXCI0MTVcIjogXCJVbnN1cHBvcnRlZCBNZWRpYSBUeXBlXCIsXG4gIFwiNDE2XCI6IFwiUmFuZ2UgTm90IFNhdGlzZmlhYmxlXCIsXG4gIFwiNDE3XCI6IFwiRXhwZWN0YXRpb24gRmFpbGVkXCIsXG4gIFwiNDE4XCI6IFwiSSdtIGEgdGVhcG90XCIsXG4gIFwiNDIxXCI6IFwiTWlzZGlyZWN0ZWQgUmVxdWVzdFwiLFxuICBcIjQyMlwiOiBcIlVucHJvY2Vzc2FibGUgRW50aXR5XCIsXG4gIFwiNDIzXCI6IFwiTG9ja2VkXCIsXG4gIFwiNDI0XCI6IFwiRmFpbGVkIERlcGVuZGVuY3lcIixcbiAgXCI0MjVcIjogXCJVbm9yZGVyZWQgQ29sbGVjdGlvblwiLFxuICBcIjQyNlwiOiBcIlVwZ3JhZGUgUmVxdWlyZWRcIixcbiAgXCI0MjhcIjogXCJQcmVjb25kaXRpb24gUmVxdWlyZWRcIixcbiAgXCI0MjlcIjogXCJUb28gTWFueSBSZXF1ZXN0c1wiLFxuICBcIjQzMVwiOiBcIlJlcXVlc3QgSGVhZGVyIEZpZWxkcyBUb28gTGFyZ2VcIixcbiAgXCI0NTFcIjogXCJVbmF2YWlsYWJsZSBGb3IgTGVnYWwgUmVhc29uc1wiLFxuICBcIjUwMFwiOiBcIkludGVybmFsIFNlcnZlciBFcnJvclwiLFxuICBcIjUwMVwiOiBcIk5vdCBJbXBsZW1lbnRlZFwiLFxuICBcIjUwMlwiOiBcIkJhZCBHYXRld2F5XCIsXG4gIFwiNTAzXCI6IFwiU2VydmljZSBVbmF2YWlsYWJsZVwiLFxuICBcIjUwNFwiOiBcIkdhdGV3YXkgVGltZW91dFwiLFxuICBcIjUwNVwiOiBcIkhUVFAgVmVyc2lvbiBOb3QgU3VwcG9ydGVkXCIsXG4gIFwiNTA2XCI6IFwiVmFyaWFudCBBbHNvIE5lZ290aWF0ZXNcIixcbiAgXCI1MDdcIjogXCJJbnN1ZmZpY2llbnQgU3RvcmFnZVwiLFxuICBcIjUwOFwiOiBcIkxvb3AgRGV0ZWN0ZWRcIixcbiAgXCI1MDlcIjogXCJCYW5kd2lkdGggTGltaXQgRXhjZWVkZWRcIixcbiAgXCI1MTBcIjogXCJOb3QgRXh0ZW5kZWRcIixcbiAgXCI1MTFcIjogXCJOZXR3b3JrIEF1dGhlbnRpY2F0aW9uIFJlcXVpcmVkXCJcbn1cbiIsIi8qXHJcbiBDb3B5cmlnaHQgMjAxMy0yMDE0IERhbmllbCBXaXJ0eiA8ZGNvZGVAZGNvZGUuaW8+XHJcblxyXG4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG5cclxuIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG5cclxuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIEBsaWNlbnNlIGJ5dGVidWZmZXIuanMgKGMpIDIwMTUgRGFuaWVsIFdpcnR6IDxkY29kZUBkY29kZS5pbz5cclxuICogQmFja2luZyBidWZmZXI6IEFycmF5QnVmZmVyLCBBY2Nlc3NvcjogVWludDhBcnJheVxyXG4gKiBSZWxlYXNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wXHJcbiAqIHNlZTogaHR0cHM6Ly9naXRodWIuY29tL2Rjb2RlSU8vYnl0ZWJ1ZmZlci5qcyBmb3IgZGV0YWlsc1xyXG4gKi9cclxuKGZ1bmN0aW9uKGdsb2JhbCwgZmFjdG9yeSkge1xyXG5cclxuICAgIC8qIEFNRCAqLyBpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmVbXCJhbWRcIl0pXHJcbiAgICAgICAgZGVmaW5lKFtcImxvbmdcIl0sIGZhY3RvcnkpO1xyXG4gICAgLyogQ29tbW9uSlMgKi8gZWxzZSBpZiAodHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIG1vZHVsZSA9PT0gXCJvYmplY3RcIiAmJiBtb2R1bGUgJiYgbW9kdWxlW1wiZXhwb3J0c1wiXSlcclxuICAgICAgICBtb2R1bGVbJ2V4cG9ydHMnXSA9IChmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgdmFyIExvbmc7IHRyeSB7IExvbmcgPSByZXF1aXJlKFwibG9uZ1wiKTsgfSBjYXRjaCAoZSkge31cclxuICAgICAgICAgICAgcmV0dXJuIGZhY3RvcnkoTG9uZyk7XHJcbiAgICAgICAgfSkoKTtcclxuICAgIC8qIEdsb2JhbCAqLyBlbHNlXHJcbiAgICAgICAgKGdsb2JhbFtcImRjb2RlSU9cIl0gPSBnbG9iYWxbXCJkY29kZUlPXCJdIHx8IHt9KVtcIkJ5dGVCdWZmZXJcIl0gPSBmYWN0b3J5KGdsb2JhbFtcImRjb2RlSU9cIl1bXCJMb25nXCJdKTtcclxuXHJcbn0pKHRoaXMsIGZ1bmN0aW9uKExvbmcpIHtcclxuICAgIFwidXNlIHN0cmljdFwiO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29uc3RydWN0cyBhIG5ldyBCeXRlQnVmZmVyLlxyXG4gICAgICogQGNsYXNzIFRoZSBzd2lzcyBhcm15IGtuaWZlIGZvciBiaW5hcnkgZGF0YSBpbiBKYXZhU2NyaXB0LlxyXG4gICAgICogQGV4cG9ydHMgQnl0ZUJ1ZmZlclxyXG4gICAgICogQGNvbnN0cnVjdG9yXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcj19IGNhcGFjaXR5IEluaXRpYWwgY2FwYWNpdHkuIERlZmF1bHRzIHRvIHtAbGluayBCeXRlQnVmZmVyLkRFRkFVTFRfQ0FQQUNJVFl9LlxyXG4gICAgICogQHBhcmFtIHtib29sZWFuPX0gbGl0dGxlRW5kaWFuIFdoZXRoZXIgdG8gdXNlIGxpdHRsZSBvciBiaWcgZW5kaWFuIGJ5dGUgb3JkZXIuIERlZmF1bHRzIHRvXHJcbiAgICAgKiAge0BsaW5rIEJ5dGVCdWZmZXIuREVGQVVMVF9FTkRJQU59LlxyXG4gICAgICogQHBhcmFtIHtib29sZWFuPX0gbm9Bc3NlcnQgV2hldGhlciB0byBza2lwIGFzc2VydGlvbnMgb2Ygb2Zmc2V0cyBhbmQgdmFsdWVzLiBEZWZhdWx0cyB0b1xyXG4gICAgICogIHtAbGluayBCeXRlQnVmZmVyLkRFRkFVTFRfTk9BU1NFUlR9LlxyXG4gICAgICogQGV4cG9zZVxyXG4gICAgICovXHJcbiAgICB2YXIgQnl0ZUJ1ZmZlciA9IGZ1bmN0aW9uKGNhcGFjaXR5LCBsaXR0bGVFbmRpYW4sIG5vQXNzZXJ0KSB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiBjYXBhY2l0eSA9PT0gJ3VuZGVmaW5lZCcpXHJcbiAgICAgICAgICAgIGNhcGFjaXR5ID0gQnl0ZUJ1ZmZlci5ERUZBVUxUX0NBUEFDSVRZO1xyXG4gICAgICAgIGlmICh0eXBlb2YgbGl0dGxlRW5kaWFuID09PSAndW5kZWZpbmVkJylcclxuICAgICAgICAgICAgbGl0dGxlRW5kaWFuID0gQnl0ZUJ1ZmZlci5ERUZBVUxUX0VORElBTjtcclxuICAgICAgICBpZiAodHlwZW9mIG5vQXNzZXJ0ID09PSAndW5kZWZpbmVkJylcclxuICAgICAgICAgICAgbm9Bc3NlcnQgPSBCeXRlQnVmZmVyLkRFRkFVTFRfTk9BU1NFUlQ7XHJcbiAgICAgICAgaWYgKCFub0Fzc2VydCkge1xyXG4gICAgICAgICAgICBjYXBhY2l0eSA9IGNhcGFjaXR5IHwgMDtcclxuICAgICAgICAgICAgaWYgKGNhcGFjaXR5IDwgMClcclxuICAgICAgICAgICAgICAgIHRocm93IFJhbmdlRXJyb3IoXCJJbGxlZ2FsIGNhcGFjaXR5XCIpO1xyXG4gICAgICAgICAgICBsaXR0bGVFbmRpYW4gPSAhIWxpdHRsZUVuZGlhbjtcclxuICAgICAgICAgICAgbm9Bc3NlcnQgPSAhIW5vQXNzZXJ0O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQmFja2luZyBBcnJheUJ1ZmZlci5cclxuICAgICAgICAgKiBAdHlwZSB7IUFycmF5QnVmZmVyfVxyXG4gICAgICAgICAqIEBleHBvc2VcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmJ1ZmZlciA9IGNhcGFjaXR5ID09PSAwID8gRU1QVFlfQlVGRkVSIDogbmV3IEFycmF5QnVmZmVyKGNhcGFjaXR5KTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVWludDhBcnJheSB1dGlsaXplZCB0byBtYW5pcHVsYXRlIHRoZSBiYWNraW5nIGJ1ZmZlci4gQmVjb21lcyBgbnVsbGAgaWYgdGhlIGJhY2tpbmcgYnVmZmVyIGhhcyBhIGNhcGFjaXR5IG9mIGAwYC5cclxuICAgICAgICAgKiBAdHlwZSB7P1VpbnQ4QXJyYXl9XHJcbiAgICAgICAgICogQGV4cG9zZVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMudmlldyA9IGNhcGFjaXR5ID09PSAwID8gbnVsbCA6IG5ldyBVaW50OEFycmF5KHRoaXMuYnVmZmVyKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQWJzb2x1dGUgcmVhZC93cml0ZSBvZmZzZXQuXHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKiBAZXhwb3NlXHJcbiAgICAgICAgICogQHNlZSBCeXRlQnVmZmVyI2ZsaXBcclxuICAgICAgICAgKiBAc2VlIEJ5dGVCdWZmZXIjY2xlYXJcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLm9mZnNldCA9IDA7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIE1hcmtlZCBvZmZzZXQuXHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKiBAZXhwb3NlXHJcbiAgICAgICAgICogQHNlZSBCeXRlQnVmZmVyI21hcmtcclxuICAgICAgICAgKiBAc2VlIEJ5dGVCdWZmZXIjcmVzZXRcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLm1hcmtlZE9mZnNldCA9IC0xO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBYnNvbHV0ZSBsaW1pdCBvZiB0aGUgY29udGFpbmVkIGRhdGEuIFNldCB0byB0aGUgYmFja2luZyBidWZmZXIncyBjYXBhY2l0eSB1cG9uIGFsbG9jYXRpb24uXHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKiBAZXhwb3NlXHJcbiAgICAgICAgICogQHNlZSBCeXRlQnVmZmVyI2ZsaXBcclxuICAgICAgICAgKiBAc2VlIEJ5dGVCdWZmZXIjY2xlYXJcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmxpbWl0ID0gY2FwYWNpdHk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFdoZXRoZXIgdG8gdXNlIGxpdHRsZSBlbmRpYW4gYnl0ZSBvcmRlciwgZGVmYXVsdHMgdG8gYGZhbHNlYCBmb3IgYmlnIGVuZGlhbi5cclxuICAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgICAgICAgKiBAZXhwb3NlXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5saXR0bGVFbmRpYW4gPSBsaXR0bGVFbmRpYW47XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFdoZXRoZXIgdG8gc2tpcCBhc3NlcnRpb25zIG9mIG9mZnNldHMgYW5kIHZhbHVlcywgZGVmYXVsdHMgdG8gYGZhbHNlYC5cclxuICAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgICAgICAgKiBAZXhwb3NlXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5ub0Fzc2VydCA9IG5vQXNzZXJ0O1xyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEJ5dGVCdWZmZXIgdmVyc2lvbi5cclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XHJcbiAgICAgKiBAY29uc3RcclxuICAgICAqIEBleHBvc2VcclxuICAgICAqL1xyXG4gICAgQnl0ZUJ1ZmZlci5WRVJTSU9OID0gXCI1LjAuMVwiO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogTGl0dGxlIGVuZGlhbiBjb25zdGFudCB0aGF0IGNhbiBiZSB1c2VkIGluc3RlYWQgb2YgaXRzIGJvb2xlYW4gdmFsdWUuIEV2YWx1YXRlcyB0byBgdHJ1ZWAuXHJcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgICAqIEBjb25zdFxyXG4gICAgICogQGV4cG9zZVxyXG4gICAgICovXHJcbiAgICBCeXRlQnVmZmVyLkxJVFRMRV9FTkRJQU4gPSB0cnVlO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQmlnIGVuZGlhbiBjb25zdGFudCB0aGF0IGNhbiBiZSB1c2VkIGluc3RlYWQgb2YgaXRzIGJvb2xlYW4gdmFsdWUuIEV2YWx1YXRlcyB0byBgZmFsc2VgLlxyXG4gICAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICAgKiBAY29uc3RcclxuICAgICAqIEBleHBvc2VcclxuICAgICAqL1xyXG4gICAgQnl0ZUJ1ZmZlci5CSUdfRU5ESUFOID0gZmFsc2U7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEZWZhdWx0IGluaXRpYWwgY2FwYWNpdHkgb2YgYDE2YC5cclxuICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgKiBAZXhwb3NlXHJcbiAgICAgKi9cclxuICAgIEJ5dGVCdWZmZXIuREVGQVVMVF9DQVBBQ0lUWSA9IDE2O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogRGVmYXVsdCBlbmRpYW5lc3Mgb2YgYGZhbHNlYCBmb3IgYmlnIGVuZGlhbi5cclxuICAgICAqIEB0eXBlIHtib29sZWFufVxyXG4gICAgICogQGV4cG9zZVxyXG4gICAgICovXHJcbiAgICBCeXRlQnVmZmVyLkRFRkFVTFRfRU5ESUFOID0gQnl0ZUJ1ZmZlci5CSUdfRU5ESUFOO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogRGVmYXVsdCBubyBhc3NlcnRpb25zIGZsYWcgb2YgYGZhbHNlYC5cclxuICAgICAqIEB0eXBlIHtib29sZWFufVxyXG4gICAgICogQGV4cG9zZVxyXG4gICAgICovXHJcbiAgICBCeXRlQnVmZmVyLkRFRkFVTFRfTk9BU1NFUlQgPSBmYWxzZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEEgYExvbmdgIGNsYXNzIGZvciByZXByZXNlbnRpbmcgYSA2NC1iaXQgdHdvJ3MtY29tcGxlbWVudCBpbnRlZ2VyIHZhbHVlLiBNYXkgYmUgYG51bGxgIGlmIExvbmcuanMgaGFzIG5vdCBiZWVuIGxvYWRlZFxyXG4gICAgICogIGFuZCBpbnQ2NCBzdXBwb3J0IGlzIG5vdCBhdmFpbGFibGUuXHJcbiAgICAgKiBAdHlwZSB7P0xvbmd9XHJcbiAgICAgKiBAY29uc3RcclxuICAgICAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2Rjb2RlSU8vbG9uZy5qc1xyXG4gICAgICogQGV4cG9zZVxyXG4gICAgICovXHJcbiAgICBCeXRlQnVmZmVyLkxvbmcgPSBMb25nIHx8IG51bGw7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAYWxpYXMgQnl0ZUJ1ZmZlci5wcm90b3R5cGVcclxuICAgICAqIEBpbm5lclxyXG4gICAgICovXHJcbiAgICB2YXIgQnl0ZUJ1ZmZlclByb3RvdHlwZSA9IEJ5dGVCdWZmZXIucHJvdG90eXBlO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQW4gaW5kaWNhdG9yIHVzZWQgdG8gcmVsaWFibHkgZGV0ZXJtaW5lIGlmIGFuIG9iamVjdCBpcyBhIEJ5dGVCdWZmZXIgb3Igbm90LlxyXG4gICAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICAgKiBAY29uc3RcclxuICAgICAqIEBleHBvc2VcclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKi9cclxuICAgIEJ5dGVCdWZmZXJQcm90b3R5cGUuX19pc0J5dGVCdWZmZXJfXztcclxuXHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQnl0ZUJ1ZmZlclByb3RvdHlwZSwgXCJfX2lzQnl0ZUJ1ZmZlcl9fXCIsIHtcclxuICAgICAgICB2YWx1ZTogdHJ1ZSxcclxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcclxuICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlXHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyBoZWxwZXJzXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAdHlwZSB7IUFycmF5QnVmZmVyfVxyXG4gICAgICogQGlubmVyXHJcbiAgICAgKi9cclxuICAgIHZhciBFTVBUWV9CVUZGRVIgPSBuZXcgQXJyYXlCdWZmZXIoMCk7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTdHJpbmcuZnJvbUNoYXJDb2RlIHJlZmVyZW5jZSBmb3IgY29tcGlsZS10aW1lIHJlbmFtaW5nLlxyXG4gICAgICogQHR5cGUge2Z1bmN0aW9uKC4uLm51bWJlcik6c3RyaW5nfVxyXG4gICAgICogQGlubmVyXHJcbiAgICAgKi9cclxuICAgIHZhciBzdHJpbmdGcm9tQ2hhckNvZGUgPSBTdHJpbmcuZnJvbUNoYXJDb2RlO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhIHNvdXJjZSBmdW5jdGlvbiBmb3IgYSBzdHJpbmcuXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcyBTdHJpbmcgdG8gcmVhZCBmcm9tXHJcbiAgICAgKiBAcmV0dXJucyB7ZnVuY3Rpb24oKTpudW1iZXJ8bnVsbH0gU291cmNlIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgbmV4dCBjaGFyIGNvZGUgcmVzcGVjdGl2ZWx5IGBudWxsYCBpZiB0aGVyZSBhcmVcclxuICAgICAqICBubyBtb3JlIGNoYXJhY3RlcnMgbGVmdC5cclxuICAgICAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gSWYgdGhlIGFyZ3VtZW50IGlzIGludmFsaWRcclxuICAgICAqIEBpbm5lclxyXG4gICAgICovXHJcbiAgICBmdW5jdGlvbiBzdHJpbmdTb3VyY2Uocykge1xyXG4gICAgICAgIHZhciBpPTA7IHJldHVybiBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGkgPCBzLmxlbmd0aCA/IHMuY2hhckNvZGVBdChpKyspIDogbnVsbDtcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhIGRlc3RpbmF0aW9uIGZ1bmN0aW9uIGZvciBhIHN0cmluZy5cclxuICAgICAqIEByZXR1cm5zIHtmdW5jdGlvbihudW1iZXI9KTp1bmRlZmluZWR8c3RyaW5nfSBEZXN0aW5hdGlvbiBmdW5jdGlvbiBzdWNjZXNzaXZlbHkgY2FsbGVkIHdpdGggdGhlIG5leHQgY2hhciBjb2RlLlxyXG4gICAgICogIFJldHVybnMgdGhlIGZpbmFsIHN0cmluZyB3aGVuIGNhbGxlZCB3aXRob3V0IGFyZ3VtZW50cy5cclxuICAgICAqIEBpbm5lclxyXG4gICAgICovXHJcbiAgICBmdW5jdGlvbiBzdHJpbmdEZXN0aW5hdGlvbigpIHtcclxuICAgICAgICB2YXIgY3MgPSBbXSwgcHMgPSBbXTsgcmV0dXJuIGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMClcclxuICAgICAgICAgICAgICAgIHJldHVybiBwcy5qb2luKCcnKStzdHJpbmdGcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLCBjcyk7XHJcbiAgICAgICAgICAgIGlmIChjcy5sZW5ndGggKyBhcmd1bWVudHMubGVuZ3RoID4gMTAyNClcclxuICAgICAgICAgICAgICAgIHBzLnB1c2goc3RyaW5nRnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZywgY3MpKSxcclxuICAgICAgICAgICAgICAgICAgICBjcy5sZW5ndGggPSAwO1xyXG4gICAgICAgICAgICBBcnJheS5wcm90b3R5cGUucHVzaC5hcHBseShjcywgYXJndW1lbnRzKTtcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyB0aGUgYWNjZXNzb3IgdHlwZS5cclxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gYEJ1ZmZlcmAgdW5kZXIgbm9kZS5qcywgYFVpbnQ4QXJyYXlgIHJlc3BlY3RpdmVseSBgRGF0YVZpZXdgIGluIHRoZSBicm93c2VyIChjbGFzc2VzKVxyXG4gICAgICogQGV4cG9zZVxyXG4gICAgICovXHJcbiAgICBCeXRlQnVmZmVyLmFjY2Vzc29yID0gZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgcmV0dXJuIFVpbnQ4QXJyYXk7XHJcbiAgICB9O1xyXG4gICAgLyoqXHJcbiAgICAgKiBBbGxvY2F0ZXMgYSBuZXcgQnl0ZUJ1ZmZlciBiYWNrZWQgYnkgYSBidWZmZXIgb2YgdGhlIHNwZWNpZmllZCBjYXBhY2l0eS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyPX0gY2FwYWNpdHkgSW5pdGlhbCBjYXBhY2l0eS4gRGVmYXVsdHMgdG8ge0BsaW5rIEJ5dGVCdWZmZXIuREVGQVVMVF9DQVBBQ0lUWX0uXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW49fSBsaXR0bGVFbmRpYW4gV2hldGhlciB0byB1c2UgbGl0dGxlIG9yIGJpZyBlbmRpYW4gYnl0ZSBvcmRlci4gRGVmYXVsdHMgdG9cclxuICAgICAqICB7QGxpbmsgQnl0ZUJ1ZmZlci5ERUZBVUxUX0VORElBTn0uXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW49fSBub0Fzc2VydCBXaGV0aGVyIHRvIHNraXAgYXNzZXJ0aW9ucyBvZiBvZmZzZXRzIGFuZCB2YWx1ZXMuIERlZmF1bHRzIHRvXHJcbiAgICAgKiAge0BsaW5rIEJ5dGVCdWZmZXIuREVGQVVMVF9OT0FTU0VSVH0uXHJcbiAgICAgKiBAcmV0dXJucyB7IUJ5dGVCdWZmZXJ9XHJcbiAgICAgKiBAZXhwb3NlXHJcbiAgICAgKi9cclxuICAgIEJ5dGVCdWZmZXIuYWxsb2NhdGUgPSBmdW5jdGlvbihjYXBhY2l0eSwgbGl0dGxlRW5kaWFuLCBub0Fzc2VydCkge1xyXG4gICAgICAgIHJldHVybiBuZXcgQnl0ZUJ1ZmZlcihjYXBhY2l0eSwgbGl0dGxlRW5kaWFuLCBub0Fzc2VydCk7XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29uY2F0ZW5hdGVzIG11bHRpcGxlIEJ5dGVCdWZmZXJzIGludG8gb25lLlxyXG4gICAgICogQHBhcmFtIHshQXJyYXkuPCFCeXRlQnVmZmVyfCFBcnJheUJ1ZmZlcnwhVWludDhBcnJheXxzdHJpbmc+fSBidWZmZXJzIEJ1ZmZlcnMgdG8gY29uY2F0ZW5hdGVcclxuICAgICAqIEBwYXJhbSB7KHN0cmluZ3xib29sZWFuKT19IGVuY29kaW5nIFN0cmluZyBlbmNvZGluZyBpZiBgYnVmZmVyc2AgY29udGFpbnMgYSBzdHJpbmcgKFwiYmFzZTY0XCIsIFwiaGV4XCIsIFwiYmluYXJ5XCIsXHJcbiAgICAgKiAgZGVmYXVsdHMgdG8gXCJ1dGY4XCIpXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW49fSBsaXR0bGVFbmRpYW4gV2hldGhlciB0byB1c2UgbGl0dGxlIG9yIGJpZyBlbmRpYW4gYnl0ZSBvcmRlciBmb3IgdGhlIHJlc3VsdGluZyBCeXRlQnVmZmVyLiBEZWZhdWx0c1xyXG4gICAgICogIHRvIHtAbGluayBCeXRlQnVmZmVyLkRFRkFVTFRfRU5ESUFOfS5cclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbj19IG5vQXNzZXJ0IFdoZXRoZXIgdG8gc2tpcCBhc3NlcnRpb25zIG9mIG9mZnNldHMgYW5kIHZhbHVlcyBmb3IgdGhlIHJlc3VsdGluZyBCeXRlQnVmZmVyLiBEZWZhdWx0cyB0b1xyXG4gICAgICogIHtAbGluayBCeXRlQnVmZmVyLkRFRkFVTFRfTk9BU1NFUlR9LlxyXG4gICAgICogQHJldHVybnMgeyFCeXRlQnVmZmVyfSBDb25jYXRlbmF0ZWQgQnl0ZUJ1ZmZlclxyXG4gICAgICogQGV4cG9zZVxyXG4gICAgICovXHJcbiAgICBCeXRlQnVmZmVyLmNvbmNhdCA9IGZ1bmN0aW9uKGJ1ZmZlcnMsIGVuY29kaW5nLCBsaXR0bGVFbmRpYW4sIG5vQXNzZXJ0KSB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiBlbmNvZGluZyA9PT0gJ2Jvb2xlYW4nIHx8IHR5cGVvZiBlbmNvZGluZyAhPT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgbm9Bc3NlcnQgPSBsaXR0bGVFbmRpYW47XHJcbiAgICAgICAgICAgIGxpdHRsZUVuZGlhbiA9IGVuY29kaW5nO1xyXG4gICAgICAgICAgICBlbmNvZGluZyA9IHVuZGVmaW5lZDtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIGNhcGFjaXR5ID0gMDtcclxuICAgICAgICBmb3IgKHZhciBpPTAsIGs9YnVmZmVycy5sZW5ndGgsIGxlbmd0aDsgaTxrOyArK2kpIHtcclxuICAgICAgICAgICAgaWYgKCFCeXRlQnVmZmVyLmlzQnl0ZUJ1ZmZlcihidWZmZXJzW2ldKSlcclxuICAgICAgICAgICAgICAgIGJ1ZmZlcnNbaV0gPSBCeXRlQnVmZmVyLndyYXAoYnVmZmVyc1tpXSwgZW5jb2RpbmcpO1xyXG4gICAgICAgICAgICBsZW5ndGggPSBidWZmZXJzW2ldLmxpbWl0IC0gYnVmZmVyc1tpXS5vZmZzZXQ7XHJcbiAgICAgICAgICAgIGlmIChsZW5ndGggPiAwKSBjYXBhY2l0eSArPSBsZW5ndGg7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChjYXBhY2l0eSA9PT0gMClcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBCeXRlQnVmZmVyKDAsIGxpdHRsZUVuZGlhbiwgbm9Bc3NlcnQpO1xyXG4gICAgICAgIHZhciBiYiA9IG5ldyBCeXRlQnVmZmVyKGNhcGFjaXR5LCBsaXR0bGVFbmRpYW4sIG5vQXNzZXJ0KSxcclxuICAgICAgICAgICAgYmk7XHJcbiAgICAgICAgaT0wOyB3aGlsZSAoaTxrKSB7XHJcbiAgICAgICAgICAgIGJpID0gYnVmZmVyc1tpKytdO1xyXG4gICAgICAgICAgICBsZW5ndGggPSBiaS5saW1pdCAtIGJpLm9mZnNldDtcclxuICAgICAgICAgICAgaWYgKGxlbmd0aCA8PSAwKSBjb250aW51ZTtcclxuICAgICAgICAgICAgYmIudmlldy5zZXQoYmkudmlldy5zdWJhcnJheShiaS5vZmZzZXQsIGJpLmxpbWl0KSwgYmIub2Zmc2V0KTtcclxuICAgICAgICAgICAgYmIub2Zmc2V0ICs9IGxlbmd0aDtcclxuICAgICAgICB9XHJcbiAgICAgICAgYmIubGltaXQgPSBiYi5vZmZzZXQ7XHJcbiAgICAgICAgYmIub2Zmc2V0ID0gMDtcclxuICAgICAgICByZXR1cm4gYmI7XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGVzdHMgaWYgdGhlIHNwZWNpZmllZCB0eXBlIGlzIGEgQnl0ZUJ1ZmZlci5cclxuICAgICAqIEBwYXJhbSB7Kn0gYmIgQnl0ZUJ1ZmZlciB0byB0ZXN0XHJcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gYHRydWVgIGlmIGl0IGlzIGEgQnl0ZUJ1ZmZlciwgb3RoZXJ3aXNlIGBmYWxzZWBcclxuICAgICAqIEBleHBvc2VcclxuICAgICAqL1xyXG4gICAgQnl0ZUJ1ZmZlci5pc0J5dGVCdWZmZXIgPSBmdW5jdGlvbihiYikge1xyXG4gICAgICAgIHJldHVybiAoYmIgJiYgYmJbXCJfX2lzQnl0ZUJ1ZmZlcl9fXCJdKSA9PT0gdHJ1ZTtcclxuICAgIH07XHJcbiAgICAvKipcclxuICAgICAqIEdldHMgdGhlIGJhY2tpbmcgYnVmZmVyIHR5cGUuXHJcbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IGBCdWZmZXJgIHVuZGVyIG5vZGUuanMsIGBBcnJheUJ1ZmZlcmAgaW4gdGhlIGJyb3dzZXIgKGNsYXNzZXMpXHJcbiAgICAgKiBAZXhwb3NlXHJcbiAgICAgKi9cclxuICAgIEJ5dGVCdWZmZXIudHlwZSA9IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgIHJldHVybiBBcnJheUJ1ZmZlcjtcclxuICAgIH07XHJcbiAgICAvKipcclxuICAgICAqIFdyYXBzIGEgYnVmZmVyIG9yIGEgc3RyaW5nLiBTZXRzIHRoZSBhbGxvY2F0ZWQgQnl0ZUJ1ZmZlcidzIHtAbGluayBCeXRlQnVmZmVyI29mZnNldH0gdG8gYDBgIGFuZCBpdHNcclxuICAgICAqICB7QGxpbmsgQnl0ZUJ1ZmZlciNsaW1pdH0gdG8gdGhlIGxlbmd0aCBvZiB0aGUgd3JhcHBlZCBkYXRhLlxyXG4gICAgICogQHBhcmFtIHshQnl0ZUJ1ZmZlcnwhQXJyYXlCdWZmZXJ8IVVpbnQ4QXJyYXl8c3RyaW5nfCFBcnJheS48bnVtYmVyPn0gYnVmZmVyIEFueXRoaW5nIHRoYXQgY2FuIGJlIHdyYXBwZWRcclxuICAgICAqIEBwYXJhbSB7KHN0cmluZ3xib29sZWFuKT19IGVuY29kaW5nIFN0cmluZyBlbmNvZGluZyBpZiBgYnVmZmVyYCBpcyBhIHN0cmluZyAoXCJiYXNlNjRcIiwgXCJoZXhcIiwgXCJiaW5hcnlcIiwgZGVmYXVsdHMgdG9cclxuICAgICAqICBcInV0ZjhcIilcclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbj19IGxpdHRsZUVuZGlhbiBXaGV0aGVyIHRvIHVzZSBsaXR0bGUgb3IgYmlnIGVuZGlhbiBieXRlIG9yZGVyLiBEZWZhdWx0cyB0b1xyXG4gICAgICogIHtAbGluayBCeXRlQnVmZmVyLkRFRkFVTFRfRU5ESUFOfS5cclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbj19IG5vQXNzZXJ0IFdoZXRoZXIgdG8gc2tpcCBhc3NlcnRpb25zIG9mIG9mZnNldHMgYW5kIHZhbHVlcy4gRGVmYXVsdHMgdG9cclxuICAgICAqICB7QGxpbmsgQnl0ZUJ1ZmZlci5ERUZBVUxUX05PQVNTRVJUfS5cclxuICAgICAqIEByZXR1cm5zIHshQnl0ZUJ1ZmZlcn0gQSBCeXRlQnVmZmVyIHdyYXBwaW5nIGBidWZmZXJgXHJcbiAgICAgKiBAZXhwb3NlXHJcbiAgICAgKi9cclxuICAgIEJ5dGVCdWZmZXIud3JhcCA9IGZ1bmN0aW9uKGJ1ZmZlciwgZW5jb2RpbmcsIGxpdHRsZUVuZGlhbiwgbm9Bc3NlcnQpIHtcclxuICAgICAgICBpZiAodHlwZW9mIGVuY29kaW5nICE9PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICBub0Fzc2VydCA9IGxpdHRsZUVuZGlhbjtcclxuICAgICAgICAgICAgbGl0dGxlRW5kaWFuID0gZW5jb2Rpbmc7XHJcbiAgICAgICAgICAgIGVuY29kaW5nID0gdW5kZWZpbmVkO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodHlwZW9mIGJ1ZmZlciA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgaWYgKHR5cGVvZiBlbmNvZGluZyA9PT0gJ3VuZGVmaW5lZCcpXHJcbiAgICAgICAgICAgICAgICBlbmNvZGluZyA9IFwidXRmOFwiO1xyXG4gICAgICAgICAgICBzd2l0Y2ggKGVuY29kaW5nKSB7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFwiYmFzZTY0XCI6XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJ5dGVCdWZmZXIuZnJvbUJhc2U2NChidWZmZXIsIGxpdHRsZUVuZGlhbik7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFwiaGV4XCI6XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJ5dGVCdWZmZXIuZnJvbUhleChidWZmZXIsIGxpdHRsZUVuZGlhbik7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFwiYmluYXJ5XCI6XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJ5dGVCdWZmZXIuZnJvbUJpbmFyeShidWZmZXIsIGxpdHRsZUVuZGlhbik7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFwidXRmOFwiOlxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBCeXRlQnVmZmVyLmZyb21VVEY4KGJ1ZmZlciwgbGl0dGxlRW5kaWFuKTtcclxuICAgICAgICAgICAgICAgIGNhc2UgXCJkZWJ1Z1wiOlxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBCeXRlQnVmZmVyLmZyb21EZWJ1ZyhidWZmZXIsIGxpdHRsZUVuZGlhbik7XHJcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IEVycm9yKFwiVW5zdXBwb3J0ZWQgZW5jb2Rpbmc6IFwiK2VuY29kaW5nKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoYnVmZmVyID09PSBudWxsIHx8IHR5cGVvZiBidWZmZXIgIT09ICdvYmplY3QnKVxyXG4gICAgICAgICAgICB0aHJvdyBUeXBlRXJyb3IoXCJJbGxlZ2FsIGJ1ZmZlclwiKTtcclxuICAgICAgICB2YXIgYmI7XHJcbiAgICAgICAgaWYgKEJ5dGVCdWZmZXIuaXNCeXRlQnVmZmVyKGJ1ZmZlcikpIHtcclxuICAgICAgICAgICAgYmIgPSBCeXRlQnVmZmVyUHJvdG90eXBlLmNsb25lLmNhbGwoYnVmZmVyKTtcclxuICAgICAgICAgICAgYmIubWFya2VkT2Zmc2V0ID0gLTE7XHJcbiAgICAgICAgICAgIHJldHVybiBiYjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGJ1ZmZlciBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHsgLy8gRXh0cmFjdCBBcnJheUJ1ZmZlciBmcm9tIFVpbnQ4QXJyYXlcclxuICAgICAgICAgICAgYmIgPSBuZXcgQnl0ZUJ1ZmZlcigwLCBsaXR0bGVFbmRpYW4sIG5vQXNzZXJ0KTtcclxuICAgICAgICAgICAgaWYgKGJ1ZmZlci5sZW5ndGggPiAwKSB7IC8vIEF2b2lkIHJlZmVyZW5jZXMgdG8gbW9yZSB0aGFuIG9uZSBFTVBUWV9CVUZGRVJcclxuICAgICAgICAgICAgICAgIGJiLmJ1ZmZlciA9IGJ1ZmZlci5idWZmZXI7XHJcbiAgICAgICAgICAgICAgICBiYi5vZmZzZXQgPSBidWZmZXIuYnl0ZU9mZnNldDtcclxuICAgICAgICAgICAgICAgIGJiLmxpbWl0ID0gYnVmZmVyLmJ5dGVPZmZzZXQgKyBidWZmZXIuYnl0ZUxlbmd0aDtcclxuICAgICAgICAgICAgICAgIGJiLnZpZXcgPSBuZXcgVWludDhBcnJheShidWZmZXIuYnVmZmVyKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSBpZiAoYnVmZmVyIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHsgLy8gUmV1c2UgQXJyYXlCdWZmZXJcclxuICAgICAgICAgICAgYmIgPSBuZXcgQnl0ZUJ1ZmZlcigwLCBsaXR0bGVFbmRpYW4sIG5vQXNzZXJ0KTtcclxuICAgICAgICAgICAgaWYgKGJ1ZmZlci5ieXRlTGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgYmIuYnVmZmVyID0gYnVmZmVyO1xyXG4gICAgICAgICAgICAgICAgYmIub2Zmc2V0ID0gMDtcclxuICAgICAgICAgICAgICAgIGJiLmxpbWl0ID0gYnVmZmVyLmJ5dGVMZW5ndGg7XHJcbiAgICAgICAgICAgICAgICBiYi52aWV3ID0gYnVmZmVyLmJ5dGVMZW5ndGggPiAwID8gbmV3IFVpbnQ4QXJyYXkoYnVmZmVyKSA6IG51bGw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2UgaWYgKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChidWZmZXIpID09PSBcIltvYmplY3QgQXJyYXldXCIpIHsgLy8gQ3JlYXRlIGZyb20gb2N0ZXRzXHJcbiAgICAgICAgICAgIGJiID0gbmV3IEJ5dGVCdWZmZXIoYnVmZmVyLmxlbmd0aCwgbGl0dGxlRW5kaWFuLCBub0Fzc2VydCk7XHJcbiAgICAgICAgICAgIGJiLmxpbWl0ID0gYnVmZmVyLmxlbmd0aDtcclxuICAgICAgICAgICAgZm9yICh2YXIgaT0wOyBpPGJ1ZmZlci5sZW5ndGg7ICsraSlcclxuICAgICAgICAgICAgICAgIGJiLnZpZXdbaV0gPSBidWZmZXJbaV07XHJcbiAgICAgICAgfSBlbHNlXHJcbiAgICAgICAgICAgIHRocm93IFR5cGVFcnJvcihcIklsbGVnYWwgYnVmZmVyXCIpOyAvLyBPdGhlcndpc2UgZmFpbFxyXG4gICAgICAgIHJldHVybiBiYjtcclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBXcml0ZXMgdGhlIGFycmF5IGFzIGEgYml0c2V0LlxyXG4gICAgICogQHBhcmFtIHtBcnJheTxib29sZWFuPn0gdmFsdWUgQXJyYXkgb2YgYm9vbGVhbnMgdG8gd3JpdGVcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyPX0gb2Zmc2V0IE9mZnNldCB0byByZWFkIGZyb20uIFdpbGwgdXNlIGFuZCBpbmNyZWFzZSB7QGxpbmsgQnl0ZUJ1ZmZlciNvZmZzZXR9IGJ5IGBsZW5ndGhgIGlmIG9taXR0ZWQuXHJcbiAgICAgKiBAcmV0dXJucyB7IUJ5dGVCdWZmZXJ9XHJcbiAgICAgKiBAZXhwb3NlXHJcbiAgICAgKi9cclxuICAgIEJ5dGVCdWZmZXJQcm90b3R5cGUud3JpdGVCaXRTZXQgPSBmdW5jdGlvbih2YWx1ZSwgb2Zmc2V0KSB7XHJcbiAgICAgIHZhciByZWxhdGl2ZSA9IHR5cGVvZiBvZmZzZXQgPT09ICd1bmRlZmluZWQnO1xuICAgICAgaWYgKHJlbGF0aXZlKSBvZmZzZXQgPSB0aGlzLm9mZnNldDtcbiAgICAgIGlmICghdGhpcy5ub0Fzc2VydCkge1xyXG4gICAgICAgIGlmICghKHZhbHVlIGluc3RhbmNlb2YgQXJyYXkpKVxyXG4gICAgICAgICAgdGhyb3cgVHlwZUVycm9yKFwiSWxsZWdhbCBCaXRTZXQ6IE5vdCBhbiBhcnJheVwiKTtcclxuICAgICAgICBpZiAodHlwZW9mIG9mZnNldCAhPT0gJ251bWJlcicgfHwgb2Zmc2V0ICUgMSAhPT0gMClcbiAgICAgICAgICAgIHRocm93IFR5cGVFcnJvcihcIklsbGVnYWwgb2Zmc2V0OiBcIitvZmZzZXQrXCIgKG5vdCBhbiBpbnRlZ2VyKVwiKTtcbiAgICAgICAgb2Zmc2V0ID4+Pj0gMDtcbiAgICAgICAgaWYgKG9mZnNldCA8IDAgfHwgb2Zmc2V0ICsgMCA+IHRoaXMuYnVmZmVyLmJ5dGVMZW5ndGgpXG4gICAgICAgICAgICB0aHJvdyBSYW5nZUVycm9yKFwiSWxsZWdhbCBvZmZzZXQ6IDAgPD0gXCIrb2Zmc2V0K1wiICgrXCIrMCtcIikgPD0gXCIrdGhpcy5idWZmZXIuYnl0ZUxlbmd0aCk7XG4gICAgICB9XHJcblxyXG4gICAgICB2YXIgc3RhcnQgPSBvZmZzZXQsXHJcbiAgICAgICAgICBiaXRzID0gdmFsdWUubGVuZ3RoLFxyXG4gICAgICAgICAgYnl0ZXMgPSAoYml0cyA+PiAzKSxcclxuICAgICAgICAgIGJpdCA9IDAsXHJcbiAgICAgICAgICBrO1xyXG5cclxuICAgICAgb2Zmc2V0ICs9IHRoaXMud3JpdGVWYXJpbnQzMihiaXRzLG9mZnNldCk7XHJcblxyXG4gICAgICB3aGlsZShieXRlcy0tKSB7XHJcbiAgICAgICAgayA9ICghIXZhbHVlW2JpdCsrXSAmIDEpIHxcclxuICAgICAgICAgICAgKCghIXZhbHVlW2JpdCsrXSAmIDEpIDw8IDEpIHxcclxuICAgICAgICAgICAgKCghIXZhbHVlW2JpdCsrXSAmIDEpIDw8IDIpIHxcclxuICAgICAgICAgICAgKCghIXZhbHVlW2JpdCsrXSAmIDEpIDw8IDMpIHxcclxuICAgICAgICAgICAgKCghIXZhbHVlW2JpdCsrXSAmIDEpIDw8IDQpIHxcclxuICAgICAgICAgICAgKCghIXZhbHVlW2JpdCsrXSAmIDEpIDw8IDUpIHxcclxuICAgICAgICAgICAgKCghIXZhbHVlW2JpdCsrXSAmIDEpIDw8IDYpIHxcclxuICAgICAgICAgICAgKCghIXZhbHVlW2JpdCsrXSAmIDEpIDw8IDcpO1xyXG4gICAgICAgIHRoaXMud3JpdGVCeXRlKGssb2Zmc2V0KyspO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZihiaXQgPCBiaXRzKSB7XHJcbiAgICAgICAgdmFyIG0gPSAwOyBrID0gMDtcclxuICAgICAgICB3aGlsZShiaXQgPCBiaXRzKSBrID0gayB8ICgoISF2YWx1ZVtiaXQrK10gJiAxKSA8PCAobSsrKSk7XHJcbiAgICAgICAgdGhpcy53cml0ZUJ5dGUoayxvZmZzZXQrKyk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChyZWxhdGl2ZSkge1xyXG4gICAgICAgIHRoaXMub2Zmc2V0ID0gb2Zmc2V0O1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBvZmZzZXQgLSBzdGFydDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlYWRzIGEgQml0U2V0IGFzIGFuIGFycmF5IG9mIGJvb2xlYW5zLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXI9fSBvZmZzZXQgT2Zmc2V0IHRvIHJlYWQgZnJvbS4gV2lsbCB1c2UgYW5kIGluY3JlYXNlIHtAbGluayBCeXRlQnVmZmVyI29mZnNldH0gYnkgYGxlbmd0aGAgaWYgb21pdHRlZC5cclxuICAgICAqIEByZXR1cm5zIHtBcnJheTxib29sZWFuPlxyXG4gICAgICogQGV4cG9zZVxyXG4gICAgICovXHJcbiAgICBCeXRlQnVmZmVyUHJvdG90eXBlLnJlYWRCaXRTZXQgPSBmdW5jdGlvbihvZmZzZXQpIHtcclxuICAgICAgdmFyIHJlbGF0aXZlID0gdHlwZW9mIG9mZnNldCA9PT0gJ3VuZGVmaW5lZCc7XG4gICAgICBpZiAocmVsYXRpdmUpIG9mZnNldCA9IHRoaXMub2Zmc2V0O1xuXHJcbiAgICAgIHZhciByZXQgPSB0aGlzLnJlYWRWYXJpbnQzMihvZmZzZXQpLFxyXG4gICAgICAgICAgYml0cyA9IHJldC52YWx1ZSxcclxuICAgICAgICAgIGJ5dGVzID0gKGJpdHMgPj4gMyksXHJcbiAgICAgICAgICBiaXQgPSAwLFxyXG4gICAgICAgICAgdmFsdWUgPSBbXSxcclxuICAgICAgICAgIGs7XHJcblxyXG4gICAgICBvZmZzZXQgKz0gcmV0Lmxlbmd0aDtcclxuXHJcbiAgICAgIHdoaWxlKGJ5dGVzLS0pIHtcclxuICAgICAgICBrID0gdGhpcy5yZWFkQnl0ZShvZmZzZXQrKyk7XHJcbiAgICAgICAgdmFsdWVbYml0KytdID0gISEoayAmIDB4MDEpO1xyXG4gICAgICAgIHZhbHVlW2JpdCsrXSA9ICEhKGsgJiAweDAyKTtcclxuICAgICAgICB2YWx1ZVtiaXQrK10gPSAhIShrICYgMHgwNCk7XHJcbiAgICAgICAgdmFsdWVbYml0KytdID0gISEoayAmIDB4MDgpO1xyXG4gICAgICAgIHZhbHVlW2JpdCsrXSA9ICEhKGsgJiAweDEwKTtcclxuICAgICAgICB2YWx1ZVtiaXQrK10gPSAhIShrICYgMHgyMCk7XHJcbiAgICAgICAgdmFsdWVbYml0KytdID0gISEoayAmIDB4NDApO1xyXG4gICAgICAgIHZhbHVlW2JpdCsrXSA9ICEhKGsgJiAweDgwKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYoYml0IDwgYml0cykge1xyXG4gICAgICAgIHZhciBtID0gMDtcclxuICAgICAgICBrID0gdGhpcy5yZWFkQnl0ZShvZmZzZXQrKyk7XHJcbiAgICAgICAgd2hpbGUoYml0IDwgYml0cykgdmFsdWVbYml0KytdID0gISEoKGsgPj4gKG0rKykpICYgMSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChyZWxhdGl2ZSkge1xyXG4gICAgICAgIHRoaXMub2Zmc2V0ID0gb2Zmc2V0O1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiB2YWx1ZTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogUmVhZHMgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgYnl0ZXMuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbGVuZ3RoIE51bWJlciBvZiBieXRlcyB0byByZWFkXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcj19IG9mZnNldCBPZmZzZXQgdG8gcmVhZCBmcm9tLiBXaWxsIHVzZSBhbmQgaW5jcmVhc2Uge0BsaW5rIEJ5dGVCdWZmZXIjb2Zmc2V0fSBieSBgbGVuZ3RoYCBpZiBvbWl0dGVkLlxyXG4gICAgICogQHJldHVybnMgeyFCeXRlQnVmZmVyfVxyXG4gICAgICogQGV4cG9zZVxyXG4gICAgICovXHJcbiAgICBCeXRlQnVmZmVyUHJvdG90eXBlLnJlYWRCeXRlcyA9IGZ1bmN0aW9uKGxlbmd0aCwgb2Zmc2V0KSB7XHJcbiAgICAgICAgdmFyIHJlbGF0aXZlID0gdHlwZW9mIG9mZnNldCA9PT0gJ3VuZGVmaW5lZCc7XG4gICAgICAgIGlmIChyZWxhdGl2ZSkgb2Zmc2V0ID0gdGhpcy5vZmZzZXQ7XG4gICAgICAgIGlmICghdGhpcy5ub0Fzc2VydCkge1xyXG4gICAgICAgICAgICBpZiAodHlwZW9mIG9mZnNldCAhPT0gJ251bWJlcicgfHwgb2Zmc2V0ICUgMSAhPT0gMClcbiAgICAgICAgICAgICAgICB0aHJvdyBUeXBlRXJyb3IoXCJJbGxlZ2FsIG9mZnNldDogXCIrb2Zmc2V0K1wiIChub3QgYW4gaW50ZWdlcilcIik7XG4gICAgICAgICAgICBvZmZzZXQgPj4+PSAwO1xuICAgICAgICAgICAgaWYgKG9mZnNldCA8IDAgfHwgb2Zmc2V0ICsgbGVuZ3RoID4gdGhpcy5idWZmZXIuYnl0ZUxlbmd0aClcbiAgICAgICAgICAgICAgICB0aHJvdyBSYW5nZUVycm9yKFwiSWxsZWdhbCBvZmZzZXQ6IDAgPD0gXCIrb2Zmc2V0K1wiICgrXCIrbGVuZ3RoK1wiKSA8PSBcIit0aGlzLmJ1ZmZlci5ieXRlTGVuZ3RoKTtcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciBzbGljZSA9IHRoaXMuc2xpY2Uob2Zmc2V0LCBvZmZzZXQgKyBsZW5ndGgpO1xyXG4gICAgICAgIGlmIChyZWxhdGl2ZSkgdGhpcy5vZmZzZXQgKz0gbGVuZ3RoO1xuICAgICAgICByZXR1cm4gc2xpY2U7XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogV3JpdGVzIGEgcGF5bG9hZCBvZiBieXRlcy4gVGhpcyBpcyBhbiBhbGlhcyBvZiB7QGxpbmsgQnl0ZUJ1ZmZlciNhcHBlbmR9LlxyXG4gICAgICogQGZ1bmN0aW9uXHJcbiAgICAgKiBAcGFyYW0geyFCeXRlQnVmZmVyfCFBcnJheUJ1ZmZlcnwhVWludDhBcnJheXxzdHJpbmd9IHNvdXJjZSBEYXRhIHRvIHdyaXRlLiBJZiBgc291cmNlYCBpcyBhIEJ5dGVCdWZmZXIsIGl0cyBvZmZzZXRzXHJcbiAgICAgKiAgd2lsbCBiZSBtb2RpZmllZCBhY2NvcmRpbmcgdG8gdGhlIHBlcmZvcm1lZCByZWFkIG9wZXJhdGlvbi5cclxuICAgICAqIEBwYXJhbSB7KHN0cmluZ3xudW1iZXIpPX0gZW5jb2RpbmcgRW5jb2RpbmcgaWYgYGRhdGFgIGlzIGEgc3RyaW5nIChcImJhc2U2NFwiLCBcImhleFwiLCBcImJpbmFyeVwiLCBkZWZhdWx0cyB0byBcInV0ZjhcIilcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyPX0gb2Zmc2V0IE9mZnNldCB0byB3cml0ZSB0by4gV2lsbCB1c2UgYW5kIGluY3JlYXNlIHtAbGluayBCeXRlQnVmZmVyI29mZnNldH0gYnkgdGhlIG51bWJlciBvZiBieXRlc1xyXG4gICAgICogIHdyaXR0ZW4gaWYgb21pdHRlZC5cclxuICAgICAqIEByZXR1cm5zIHshQnl0ZUJ1ZmZlcn0gdGhpc1xyXG4gICAgICogQGV4cG9zZVxyXG4gICAgICovXHJcbiAgICBCeXRlQnVmZmVyUHJvdG90eXBlLndyaXRlQnl0ZXMgPSBCeXRlQnVmZmVyUHJvdG90eXBlLmFwcGVuZDtcclxuXHJcbiAgICAvLyB0eXBlcy9pbnRzL2ludDhcclxuXHJcbiAgICAvKipcclxuICAgICAqIFdyaXRlcyBhbiA4Yml0IHNpZ25lZCBpbnRlZ2VyLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIFZhbHVlIHRvIHdyaXRlXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcj19IG9mZnNldCBPZmZzZXQgdG8gd3JpdGUgdG8uIFdpbGwgdXNlIGFuZCBhZHZhbmNlIHtAbGluayBCeXRlQnVmZmVyI29mZnNldH0gYnkgYDFgIGlmIG9taXR0ZWQuXHJcbiAgICAgKiBAcmV0dXJucyB7IUJ5dGVCdWZmZXJ9IHRoaXNcclxuICAgICAqIEBleHBvc2VcclxuICAgICAqL1xyXG4gICAgQnl0ZUJ1ZmZlclByb3RvdHlwZS53cml0ZUludDggPSBmdW5jdGlvbih2YWx1ZSwgb2Zmc2V0KSB7XHJcbiAgICAgICAgdmFyIHJlbGF0aXZlID0gdHlwZW9mIG9mZnNldCA9PT0gJ3VuZGVmaW5lZCc7XG4gICAgICAgIGlmIChyZWxhdGl2ZSkgb2Zmc2V0ID0gdGhpcy5vZmZzZXQ7XG4gICAgICAgIGlmICghdGhpcy5ub0Fzc2VydCkge1xyXG4gICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnbnVtYmVyJyB8fCB2YWx1ZSAlIDEgIT09IDApXG4gICAgICAgICAgICAgICAgdGhyb3cgVHlwZUVycm9yKFwiSWxsZWdhbCB2YWx1ZTogXCIrdmFsdWUrXCIgKG5vdCBhbiBpbnRlZ2VyKVwiKTtcbiAgICAgICAgICAgIHZhbHVlIHw9IDA7XG4gICAgICAgICAgICBpZiAodHlwZW9mIG9mZnNldCAhPT0gJ251bWJlcicgfHwgb2Zmc2V0ICUgMSAhPT0gMClcbiAgICAgICAgICAgICAgICB0aHJvdyBUeXBlRXJyb3IoXCJJbGxlZ2FsIG9mZnNldDogXCIrb2Zmc2V0K1wiIChub3QgYW4gaW50ZWdlcilcIik7XG4gICAgICAgICAgICBvZmZzZXQgPj4+PSAwO1xuICAgICAgICAgICAgaWYgKG9mZnNldCA8IDAgfHwgb2Zmc2V0ICsgMCA+IHRoaXMuYnVmZmVyLmJ5dGVMZW5ndGgpXG4gICAgICAgICAgICAgICAgdGhyb3cgUmFuZ2VFcnJvcihcIklsbGVnYWwgb2Zmc2V0OiAwIDw9IFwiK29mZnNldCtcIiAoK1wiKzArXCIpIDw9IFwiK3RoaXMuYnVmZmVyLmJ5dGVMZW5ndGgpO1xuICAgICAgICB9XHJcbiAgICAgICAgb2Zmc2V0ICs9IDE7XG4gICAgICAgIHZhciBjYXBhY2l0eTAgPSB0aGlzLmJ1ZmZlci5ieXRlTGVuZ3RoO1xuICAgICAgICBpZiAob2Zmc2V0ID4gY2FwYWNpdHkwKVxuICAgICAgICAgICAgdGhpcy5yZXNpemUoKGNhcGFjaXR5MCAqPSAyKSA+IG9mZnNldCA/IGNhcGFjaXR5MCA6IG9mZnNldCk7XG4gICAgICAgIG9mZnNldCAtPSAxO1xuICAgICAgICB0aGlzLnZpZXdbb2Zmc2V0XSA9IHZhbHVlO1xyXG4gICAgICAgIGlmIChyZWxhdGl2ZSkgdGhpcy5vZmZzZXQgKz0gMTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogV3JpdGVzIGFuIDhiaXQgc2lnbmVkIGludGVnZXIuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIEJ5dGVCdWZmZXIjd3JpdGVJbnQ4fS5cclxuICAgICAqIEBmdW5jdGlvblxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIFZhbHVlIHRvIHdyaXRlXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcj19IG9mZnNldCBPZmZzZXQgdG8gd3JpdGUgdG8uIFdpbGwgdXNlIGFuZCBhZHZhbmNlIHtAbGluayBCeXRlQnVmZmVyI29mZnNldH0gYnkgYDFgIGlmIG9taXR0ZWQuXHJcbiAgICAgKiBAcmV0dXJucyB7IUJ5dGVCdWZmZXJ9IHRoaXNcclxuICAgICAqIEBleHBvc2VcclxuICAgICAqL1xyXG4gICAgQnl0ZUJ1ZmZlclByb3RvdHlwZS53cml0ZUJ5dGUgPSBCeXRlQnVmZmVyUHJvdG90eXBlLndyaXRlSW50ODtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlYWRzIGFuIDhiaXQgc2lnbmVkIGludGVnZXIuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcj19IG9mZnNldCBPZmZzZXQgdG8gcmVhZCBmcm9tLiBXaWxsIHVzZSBhbmQgYWR2YW5jZSB7QGxpbmsgQnl0ZUJ1ZmZlciNvZmZzZXR9IGJ5IGAxYCBpZiBvbWl0dGVkLlxyXG4gICAgICogQHJldHVybnMge251bWJlcn0gVmFsdWUgcmVhZFxyXG4gICAgICogQGV4cG9zZVxyXG4gICAgICovXHJcbiAgICBCeXRlQnVmZmVyUHJvdG90eXBlLnJlYWRJbnQ4ID0gZnVuY3Rpb24ob2Zmc2V0KSB7XHJcbiAgICAgICAgdmFyIHJlbGF0aXZlID0gdHlwZW9mIG9mZnNldCA9PT0gJ3VuZGVmaW5lZCc7XG4gICAgICAgIGlmIChyZWxhdGl2ZSkgb2Zmc2V0ID0gdGhpcy5vZmZzZXQ7XG4gICAgICAgIGlmICghdGhpcy5ub0Fzc2VydCkge1xyXG4gICAgICAgICAgICBpZiAodHlwZW9mIG9mZnNldCAhPT0gJ251bWJlcicgfHwgb2Zmc2V0ICUgMSAhPT0gMClcbiAgICAgICAgICAgICAgICB0aHJvdyBUeXBlRXJyb3IoXCJJbGxlZ2FsIG9mZnNldDogXCIrb2Zmc2V0K1wiIChub3QgYW4gaW50ZWdlcilcIik7XG4gICAgICAgICAgICBvZmZzZXQgPj4+PSAwO1xuICAgICAgICAgICAgaWYgKG9mZnNldCA8IDAgfHwgb2Zmc2V0ICsgMSA+IHRoaXMuYnVmZmVyLmJ5dGVMZW5ndGgpXG4gICAgICAgICAgICAgICAgdGhyb3cgUmFuZ2VFcnJvcihcIklsbGVnYWwgb2Zmc2V0OiAwIDw9IFwiK29mZnNldCtcIiAoK1wiKzErXCIpIDw9IFwiK3RoaXMuYnVmZmVyLmJ5dGVMZW5ndGgpO1xuICAgICAgICB9XHJcbiAgICAgICAgdmFyIHZhbHVlID0gdGhpcy52aWV3W29mZnNldF07XHJcbiAgICAgICAgaWYgKCh2YWx1ZSAmIDB4ODApID09PSAweDgwKSB2YWx1ZSA9IC0oMHhGRiAtIHZhbHVlICsgMSk7IC8vIENhc3QgdG8gc2lnbmVkXHJcbiAgICAgICAgaWYgKHJlbGF0aXZlKSB0aGlzLm9mZnNldCArPSAxO1xuICAgICAgICByZXR1cm4gdmFsdWU7XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVhZHMgYW4gOGJpdCBzaWduZWQgaW50ZWdlci4gVGhpcyBpcyBhbiBhbGlhcyBvZiB7QGxpbmsgQnl0ZUJ1ZmZlciNyZWFkSW50OH0uXHJcbiAgICAgKiBAZnVuY3Rpb25cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyPX0gb2Zmc2V0IE9mZnNldCB0byByZWFkIGZyb20uIFdpbGwgdXNlIGFuZCBhZHZhbmNlIHtAbGluayBCeXRlQnVmZmVyI29mZnNldH0gYnkgYDFgIGlmIG9taXR0ZWQuXHJcbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBWYWx1ZSByZWFkXHJcbiAgICAgKiBAZXhwb3NlXHJcbiAgICAgKi9cclxuICAgIEJ5dGVCdWZmZXJQcm90b3R5cGUucmVhZEJ5dGUgPSBCeXRlQnVmZmVyUHJvdG90eXBlLnJlYWRJbnQ4O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogV3JpdGVzIGFuIDhiaXQgdW5zaWduZWQgaW50ZWdlci5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSBWYWx1ZSB0byB3cml0ZVxyXG4gICAgICogQHBhcmFtIHtudW1iZXI9fSBvZmZzZXQgT2Zmc2V0IHRvIHdyaXRlIHRvLiBXaWxsIHVzZSBhbmQgYWR2YW5jZSB7QGxpbmsgQnl0ZUJ1ZmZlciNvZmZzZXR9IGJ5IGAxYCBpZiBvbWl0dGVkLlxyXG4gICAgICogQHJldHVybnMgeyFCeXRlQnVmZmVyfSB0aGlzXHJcbiAgICAgKiBAZXhwb3NlXHJcbiAgICAgKi9cclxuICAgIEJ5dGVCdWZmZXJQcm90b3R5cGUud3JpdGVVaW50OCA9IGZ1bmN0aW9uKHZhbHVlLCBvZmZzZXQpIHtcclxuICAgICAgICB2YXIgcmVsYXRpdmUgPSB0eXBlb2Ygb2Zmc2V0ID09PSAndW5kZWZpbmVkJztcbiAgICAgICAgaWYgKHJlbGF0aXZlKSBvZmZzZXQgPSB0aGlzLm9mZnNldDtcbiAgICAgICAgaWYgKCF0aGlzLm5vQXNzZXJ0KSB7XHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdudW1iZXInIHx8IHZhbHVlICUgMSAhPT0gMClcbiAgICAgICAgICAgICAgICB0aHJvdyBUeXBlRXJyb3IoXCJJbGxlZ2FsIHZhbHVlOiBcIit2YWx1ZStcIiAobm90IGFuIGludGVnZXIpXCIpO1xuICAgICAgICAgICAgdmFsdWUgPj4+PSAwO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBvZmZzZXQgIT09ICdudW1iZXInIHx8IG9mZnNldCAlIDEgIT09IDApXG4gICAgICAgICAgICAgICAgdGhyb3cgVHlwZUVycm9yKFwiSWxsZWdhbCBvZmZzZXQ6IFwiK29mZnNldCtcIiAobm90IGFuIGludGVnZXIpXCIpO1xuICAgICAgICAgICAgb2Zmc2V0ID4+Pj0gMDtcbiAgICAgICAgICAgIGlmIChvZmZzZXQgPCAwIHx8IG9mZnNldCArIDAgPiB0aGlzLmJ1ZmZlci5ieXRlTGVuZ3RoKVxuICAgICAgICAgICAgICAgIHRocm93IFJhbmdlRXJyb3IoXCJJbGxlZ2FsIG9mZnNldDogMCA8PSBcIitvZmZzZXQrXCIgKCtcIiswK1wiKSA8PSBcIit0aGlzLmJ1ZmZlci5ieXRlTGVuZ3RoKTtcbiAgICAgICAgfVxyXG4gICAgICAgIG9mZnNldCArPSAxO1xuICAgICAgICB2YXIgY2FwYWNpdHkxID0gdGhpcy5idWZmZXIuYnl0ZUxlbmd0aDtcbiAgICAgICAgaWYgKG9mZnNldCA+IGNhcGFjaXR5MSlcbiAgICAgICAgICAgIHRoaXMucmVzaXplKChjYXBhY2l0eTEgKj0gMikgPiBvZmZzZXQgPyBjYXBhY2l0eTEgOiBvZmZzZXQpO1xuICAgICAgICBvZmZzZXQgLT0gMTtcbiAgICAgICAgdGhpcy52aWV3W29mZnNldF0gPSB2YWx1ZTtcclxuICAgICAgICBpZiAocmVsYXRpdmUpIHRoaXMub2Zmc2V0ICs9IDE7XG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFdyaXRlcyBhbiA4Yml0IHVuc2lnbmVkIGludGVnZXIuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIEJ5dGVCdWZmZXIjd3JpdGVVaW50OH0uXHJcbiAgICAgKiBAZnVuY3Rpb25cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSBWYWx1ZSB0byB3cml0ZVxyXG4gICAgICogQHBhcmFtIHtudW1iZXI9fSBvZmZzZXQgT2Zmc2V0IHRvIHdyaXRlIHRvLiBXaWxsIHVzZSBhbmQgYWR2YW5jZSB7QGxpbmsgQnl0ZUJ1ZmZlciNvZmZzZXR9IGJ5IGAxYCBpZiBvbWl0dGVkLlxyXG4gICAgICogQHJldHVybnMgeyFCeXRlQnVmZmVyfSB0aGlzXHJcbiAgICAgKiBAZXhwb3NlXHJcbiAgICAgKi9cclxuICAgIEJ5dGVCdWZmZXJQcm90b3R5cGUud3JpdGVVSW50OCA9IEJ5dGVCdWZmZXJQcm90b3R5cGUud3JpdGVVaW50ODtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlYWRzIGFuIDhiaXQgdW5zaWduZWQgaW50ZWdlci5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyPX0gb2Zmc2V0IE9mZnNldCB0byByZWFkIGZyb20uIFdpbGwgdXNlIGFuZCBhZHZhbmNlIHtAbGluayBCeXRlQnVmZmVyI29mZnNldH0gYnkgYDFgIGlmIG9taXR0ZWQuXHJcbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBWYWx1ZSByZWFkXHJcbiAgICAgKiBAZXhwb3NlXHJcbiAgICAgKi9cclxuICAgIEJ5dGVCdWZmZXJQcm90b3R5cGUucmVhZFVpbnQ4ID0gZnVuY3Rpb24ob2Zmc2V0KSB7XHJcbiAgICAgICAgdmFyIHJlbGF0aXZlID0gdHlwZW9mIG9mZnNldCA9PT0gJ3VuZGVmaW5lZCc7XG4gICAgICAgIGlmIChyZWxhdGl2ZSkgb2Zmc2V0ID0gdGhpcy5vZmZzZXQ7XG4gICAgICAgIGlmICghdGhpcy5ub0Fzc2VydCkge1xyXG4gICAgICAgICAgICBpZiAodHlwZW9mIG9mZnNldCAhPT0gJ251bWJlcicgfHwgb2Zmc2V0ICUgMSAhPT0gMClcbiAgICAgICAgICAgICAgICB0aHJvdyBUeXBlRXJyb3IoXCJJbGxlZ2FsIG9mZnNldDogXCIrb2Zmc2V0K1wiIChub3QgYW4gaW50ZWdlcilcIik7XG4gICAgICAgICAgICBvZmZzZXQgPj4+PSAwO1xuICAgICAgICAgICAgaWYgKG9mZnNldCA8IDAgfHwgb2Zmc2V0ICsgMSA+IHRoaXMuYnVmZmVyLmJ5dGVMZW5ndGgpXG4gICAgICAgICAgICAgICAgdGhyb3cgUmFuZ2VFcnJvcihcIklsbGVnYWwgb2Zmc2V0OiAwIDw9IFwiK29mZnNldCtcIiAoK1wiKzErXCIpIDw9IFwiK3RoaXMuYnVmZmVyLmJ5dGVMZW5ndGgpO1xuICAgICAgICB9XHJcbiAgICAgICAgdmFyIHZhbHVlID0gdGhpcy52aWV3W29mZnNldF07XHJcbiAgICAgICAgaWYgKHJlbGF0aXZlKSB0aGlzLm9mZnNldCArPSAxO1xuICAgICAgICByZXR1cm4gdmFsdWU7XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVhZHMgYW4gOGJpdCB1bnNpZ25lZCBpbnRlZ2VyLiBUaGlzIGlzIGFuIGFsaWFzIG9mIHtAbGluayBCeXRlQnVmZmVyI3JlYWRVaW50OH0uXHJcbiAgICAgKiBAZnVuY3Rpb25cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyPX0gb2Zmc2V0IE9mZnNldCB0byByZWFkIGZyb20uIFdpbGwgdXNlIGFuZCBhZHZhbmNlIHtAbGluayBCeXRlQnVmZmVyI29mZnNldH0gYnkgYDFgIGlmIG9taXR0ZWQuXHJcbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBWYWx1ZSByZWFkXHJcbiAgICAgKiBAZXhwb3NlXHJcbiAgICAgKi9cclxuICAgIEJ5dGVCdWZmZXJQcm90b3R5cGUucmVhZFVJbnQ4ID0gQnl0ZUJ1ZmZlclByb3RvdHlwZS5yZWFkVWludDg7XHJcblxyXG4gICAgLy8gdHlwZXMvaW50cy9pbnQxNlxyXG5cclxuICAgIC8qKlxyXG4gICAgICogV3JpdGVzIGEgMTZiaXQgc2lnbmVkIGludGVnZXIuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgVmFsdWUgdG8gd3JpdGVcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyPX0gb2Zmc2V0IE9mZnNldCB0byB3cml0ZSB0by4gV2lsbCB1c2UgYW5kIGFkdmFuY2Uge0BsaW5rIEJ5dGVCdWZmZXIjb2Zmc2V0fSBieSBgMmAgaWYgb21pdHRlZC5cclxuICAgICAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gSWYgYG9mZnNldGAgb3IgYHZhbHVlYCBpcyBub3QgYSB2YWxpZCBudW1iZXJcclxuICAgICAqIEB0aHJvd3Mge1JhbmdlRXJyb3J9IElmIGBvZmZzZXRgIGlzIG91dCBvZiBib3VuZHNcclxuICAgICAqIEBleHBvc2VcclxuICAgICAqL1xyXG4gICAgQnl0ZUJ1ZmZlclByb3RvdHlwZS53cml0ZUludDE2ID0gZnVuY3Rpb24odmFsdWUsIG9mZnNldCkge1xyXG4gICAgICAgIHZhciByZWxhdGl2ZSA9IHR5cGVvZiBvZmZzZXQgPT09ICd1bmRlZmluZWQnO1xuICAgICAgICBpZiAocmVsYXRpdmUpIG9mZnNldCA9IHRoaXMub2Zmc2V0O1xuICAgICAgICBpZiAoIXRoaXMubm9Bc3NlcnQpIHtcclxuICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ251bWJlcicgfHwgdmFsdWUgJSAxICE9PSAwKVxuICAgICAgICAgICAgICAgIHRocm93IFR5cGVFcnJvcihcIklsbGVnYWwgdmFsdWU6IFwiK3ZhbHVlK1wiIChub3QgYW4gaW50ZWdlcilcIik7XG4gICAgICAgICAgICB2YWx1ZSB8PSAwO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBvZmZzZXQgIT09ICdudW1iZXInIHx8IG9mZnNldCAlIDEgIT09IDApXG4gICAgICAgICAgICAgICAgdGhyb3cgVHlwZUVycm9yKFwiSWxsZWdhbCBvZmZzZXQ6IFwiK29mZnNldCtcIiAobm90IGFuIGludGVnZXIpXCIpO1xuICAgICAgICAgICAgb2Zmc2V0ID4+Pj0gMDtcbiAgICAgICAgICAgIGlmIChvZmZzZXQgPCAwIHx8IG9mZnNldCArIDAgPiB0aGlzLmJ1ZmZlci5ieXRlTGVuZ3RoKVxuICAgICAgICAgICAgICAgIHRocm93IFJhbmdlRXJyb3IoXCJJbGxlZ2FsIG9mZnNldDogMCA8PSBcIitvZmZzZXQrXCIgKCtcIiswK1wiKSA8PSBcIit0aGlzLmJ1ZmZlci5ieXRlTGVuZ3RoKTtcbiAgICAgICAgfVxyXG4gICAgICAgIG9mZnNldCArPSAyO1xuICAgICAgICB2YXIgY2FwYWNpdHkyID0gdGhpcy5idWZmZXIuYnl0ZUxlbmd0aDtcbiAgICAgICAgaWYgKG9mZnNldCA+IGNhcGFjaXR5MilcbiAgICAgICAgICAgIHRoaXMucmVzaXplKChjYXBhY2l0eTIgKj0gMikgPiBvZmZzZXQgPyBjYXBhY2l0eTIgOiBvZmZzZXQpO1xuICAgICAgICBvZmZzZXQgLT0gMjtcbiAgICAgICAgaWYgKHRoaXMubGl0dGxlRW5kaWFuKSB7XHJcbiAgICAgICAgICAgIHRoaXMudmlld1tvZmZzZXQrMV0gPSAodmFsdWUgJiAweEZGMDApID4+PiA4O1xyXG4gICAgICAgICAgICB0aGlzLnZpZXdbb2Zmc2V0ICBdID0gIHZhbHVlICYgMHgwMEZGO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMudmlld1tvZmZzZXRdICAgPSAodmFsdWUgJiAweEZGMDApID4+PiA4O1xyXG4gICAgICAgICAgICB0aGlzLnZpZXdbb2Zmc2V0KzFdID0gIHZhbHVlICYgMHgwMEZGO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAocmVsYXRpdmUpIHRoaXMub2Zmc2V0ICs9IDI7XG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFdyaXRlcyBhIDE2Yml0IHNpZ25lZCBpbnRlZ2VyLiBUaGlzIGlzIGFuIGFsaWFzIG9mIHtAbGluayBCeXRlQnVmZmVyI3dyaXRlSW50MTZ9LlxyXG4gICAgICogQGZ1bmN0aW9uXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgVmFsdWUgdG8gd3JpdGVcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyPX0gb2Zmc2V0IE9mZnNldCB0byB3cml0ZSB0by4gV2lsbCB1c2UgYW5kIGFkdmFuY2Uge0BsaW5rIEJ5dGVCdWZmZXIjb2Zmc2V0fSBieSBgMmAgaWYgb21pdHRlZC5cclxuICAgICAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gSWYgYG9mZnNldGAgb3IgYHZhbHVlYCBpcyBub3QgYSB2YWxpZCBudW1iZXJcclxuICAgICAqIEB0aHJvd3Mge1JhbmdlRXJyb3J9IElmIGBvZmZzZXRgIGlzIG91dCBvZiBib3VuZHNcclxuICAgICAqIEBleHBvc2VcclxuICAgICAqL1xyXG4gICAgQnl0ZUJ1ZmZlclByb3RvdHlwZS53cml0ZVNob3J0ID0gQnl0ZUJ1ZmZlclByb3RvdHlwZS53cml0ZUludDE2O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVhZHMgYSAxNmJpdCBzaWduZWQgaW50ZWdlci5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyPX0gb2Zmc2V0IE9mZnNldCB0byByZWFkIGZyb20uIFdpbGwgdXNlIGFuZCBhZHZhbmNlIHtAbGluayBCeXRlQnVmZmVyI29mZnNldH0gYnkgYDJgIGlmIG9taXR0ZWQuXHJcbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBWYWx1ZSByZWFkXHJcbiAgICAgKiBAdGhyb3dzIHtUeXBlRXJyb3J9IElmIGBvZmZzZXRgIGlzIG5vdCBhIHZhbGlkIG51bWJlclxyXG4gICAgICogQHRocm93cyB7UmFuZ2VFcnJvcn0gSWYgYG9mZnNldGAgaXMgb3V0IG9mIGJvdW5kc1xyXG4gICAgICogQGV4cG9zZVxyXG4gICAgICovXHJcbiAgICBCeXRlQnVmZmVyUHJvdG90eXBlLnJlYWRJbnQxNiA9IGZ1bmN0aW9uKG9mZnNldCkge1xyXG4gICAgICAgIHZhciByZWxhdGl2ZSA9IHR5cGVvZiBvZmZzZXQgPT09ICd1bmRlZmluZWQnO1xuICAgICAgICBpZiAocmVsYXRpdmUpIG9mZnNldCA9IHRoaXMub2Zmc2V0O1xuICAgICAgICBpZiAoIXRoaXMubm9Bc3NlcnQpIHtcclxuICAgICAgICAgICAgaWYgKHR5cGVvZiBvZmZzZXQgIT09ICdudW1iZXInIHx8IG9mZnNldCAlIDEgIT09IDApXG4gICAgICAgICAgICAgICAgdGhyb3cgVHlwZUVycm9yKFwiSWxsZWdhbCBvZmZzZXQ6IFwiK29mZnNldCtcIiAobm90IGFuIGludGVnZXIpXCIpO1xuICAgICAgICAgICAgb2Zmc2V0ID4+Pj0gMDtcbiAgICAgICAgICAgIGlmIChvZmZzZXQgPCAwIHx8IG9mZnNldCArIDIgPiB0aGlzLmJ1ZmZlci5ieXRlTGVuZ3RoKVxuICAgICAgICAgICAgICAgIHRocm93IFJhbmdlRXJyb3IoXCJJbGxlZ2FsIG9mZnNldDogMCA8PSBcIitvZmZzZXQrXCIgKCtcIisyK1wiKSA8PSBcIit0aGlzLmJ1ZmZlci5ieXRlTGVuZ3RoKTtcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciB2YWx1ZSA9IDA7XHJcbiAgICAgICAgaWYgKHRoaXMubGl0dGxlRW5kaWFuKSB7XHJcbiAgICAgICAgICAgIHZhbHVlICA9IHRoaXMudmlld1tvZmZzZXQgIF07XHJcbiAgICAgICAgICAgIHZhbHVlIHw9IHRoaXMudmlld1tvZmZzZXQrMV0gPDwgODtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB2YWx1ZSAgPSB0aGlzLnZpZXdbb2Zmc2V0ICBdIDw8IDg7XHJcbiAgICAgICAgICAgIHZhbHVlIHw9IHRoaXMudmlld1tvZmZzZXQrMV07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICgodmFsdWUgJiAweDgwMDApID09PSAweDgwMDApIHZhbHVlID0gLSgweEZGRkYgLSB2YWx1ZSArIDEpOyAvLyBDYXN0IHRvIHNpZ25lZFxyXG4gICAgICAgIGlmIChyZWxhdGl2ZSkgdGhpcy5vZmZzZXQgKz0gMjtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlYWRzIGEgMTZiaXQgc2lnbmVkIGludGVnZXIuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIEJ5dGVCdWZmZXIjcmVhZEludDE2fS5cclxuICAgICAqIEBmdW5jdGlvblxyXG4gICAgICogQHBhcmFtIHtudW1iZXI9fSBvZmZzZXQgT2Zmc2V0IHRvIHJlYWQgZnJvbS4gV2lsbCB1c2UgYW5kIGFkdmFuY2Uge0BsaW5rIEJ5dGVCdWZmZXIjb2Zmc2V0fSBieSBgMmAgaWYgb21pdHRlZC5cclxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFZhbHVlIHJlYWRcclxuICAgICAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gSWYgYG9mZnNldGAgaXMgbm90IGEgdmFsaWQgbnVtYmVyXHJcbiAgICAgKiBAdGhyb3dzIHtSYW5nZUVycm9yfSBJZiBgb2Zmc2V0YCBpcyBvdXQgb2YgYm91bmRzXHJcbiAgICAgKiBAZXhwb3NlXHJcbiAgICAgKi9cclxuICAgIEJ5dGVCdWZmZXJQcm90b3R5cGUucmVhZFNob3J0ID0gQnl0ZUJ1ZmZlclByb3RvdHlwZS5yZWFkSW50MTY7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBXcml0ZXMgYSAxNmJpdCB1bnNpZ25lZCBpbnRlZ2VyLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIFZhbHVlIHRvIHdyaXRlXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcj19IG9mZnNldCBPZmZzZXQgdG8gd3JpdGUgdG8uIFdpbGwgdXNlIGFuZCBhZHZhbmNlIHtAbGluayBCeXRlQnVmZmVyI29mZnNldH0gYnkgYDJgIGlmIG9taXR0ZWQuXHJcbiAgICAgKiBAdGhyb3dzIHtUeXBlRXJyb3J9IElmIGBvZmZzZXRgIG9yIGB2YWx1ZWAgaXMgbm90IGEgdmFsaWQgbnVtYmVyXHJcbiAgICAgKiBAdGhyb3dzIHtSYW5nZUVycm9yfSBJZiBgb2Zmc2V0YCBpcyBvdXQgb2YgYm91bmRzXHJcbiAgICAgKiBAZXhwb3NlXHJcbiAgICAgKi9cclxuICAgIEJ5dGVCdWZmZXJQcm90b3R5cGUud3JpdGVVaW50MTYgPSBmdW5jdGlvbih2YWx1ZSwgb2Zmc2V0KSB7XHJcbiAgICAgICAgdmFyIHJlbGF0aXZlID0gdHlwZW9mIG9mZnNldCA9PT0gJ3VuZGVmaW5lZCc7XG4gICAgICAgIGlmIChyZWxhdGl2ZSkgb2Zmc2V0ID0gdGhpcy5vZmZzZXQ7XG4gICAgICAgIGlmICghdGhpcy5ub0Fzc2VydCkge1xyXG4gICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnbnVtYmVyJyB8fCB2YWx1ZSAlIDEgIT09IDApXG4gICAgICAgICAgICAgICAgdGhyb3cgVHlwZUVycm9yKFwiSWxsZWdhbCB2YWx1ZTogXCIrdmFsdWUrXCIgKG5vdCBhbiBpbnRlZ2VyKVwiKTtcbiAgICAgICAgICAgIHZhbHVlID4+Pj0gMDtcbiAgICAgICAgICAgIGlmICh0eXBlb2Ygb2Zmc2V0ICE9PSAnbnVtYmVyJyB8fCBvZmZzZXQgJSAxICE9PSAwKVxuICAgICAgICAgICAgICAgIHRocm93IFR5cGVFcnJvcihcIklsbGVnYWwgb2Zmc2V0OiBcIitvZmZzZXQrXCIgKG5vdCBhbiBpbnRlZ2VyKVwiKTtcbiAgICAgICAgICAgIG9mZnNldCA+Pj49IDA7XG4gICAgICAgICAgICBpZiAob2Zmc2V0IDwgMCB8fCBvZmZzZXQgKyAwID4gdGhpcy5idWZmZXIuYnl0ZUxlbmd0aClcbiAgICAgICAgICAgICAgICB0aHJvdyBSYW5nZUVycm9yKFwiSWxsZWdhbCBvZmZzZXQ6IDAgPD0gXCIrb2Zmc2V0K1wiICgrXCIrMCtcIikgPD0gXCIrdGhpcy5idWZmZXIuYnl0ZUxlbmd0aCk7XG4gICAgICAgIH1cclxuICAgICAgICBvZmZzZXQgKz0gMjtcbiAgICAgICAgdmFyIGNhcGFjaXR5MyA9IHRoaXMuYnVmZmVyLmJ5dGVMZW5ndGg7XG4gICAgICAgIGlmIChvZmZzZXQgPiBjYXBhY2l0eTMpXG4gICAgICAgICAgICB0aGlzLnJlc2l6ZSgoY2FwYWNpdHkzICo9IDIpID4gb2Zmc2V0ID8gY2FwYWNpdHkzIDogb2Zmc2V0KTtcbiAgICAgICAgb2Zmc2V0IC09IDI7XG4gICAgICAgIGlmICh0aGlzLmxpdHRsZUVuZGlhbikge1xyXG4gICAgICAgICAgICB0aGlzLnZpZXdbb2Zmc2V0KzFdID0gKHZhbHVlICYgMHhGRjAwKSA+Pj4gODtcclxuICAgICAgICAgICAgdGhpcy52aWV3W29mZnNldCAgXSA9ICB2YWx1ZSAmIDB4MDBGRjtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLnZpZXdbb2Zmc2V0XSAgID0gKHZhbHVlICYgMHhGRjAwKSA+Pj4gODtcclxuICAgICAgICAgICAgdGhpcy52aWV3W29mZnNldCsxXSA9ICB2YWx1ZSAmIDB4MDBGRjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHJlbGF0aXZlKSB0aGlzLm9mZnNldCArPSAyO1xuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBXcml0ZXMgYSAxNmJpdCB1bnNpZ25lZCBpbnRlZ2VyLiBUaGlzIGlzIGFuIGFsaWFzIG9mIHtAbGluayBCeXRlQnVmZmVyI3dyaXRlVWludDE2fS5cclxuICAgICAqIEBmdW5jdGlvblxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIFZhbHVlIHRvIHdyaXRlXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcj19IG9mZnNldCBPZmZzZXQgdG8gd3JpdGUgdG8uIFdpbGwgdXNlIGFuZCBhZHZhbmNlIHtAbGluayBCeXRlQnVmZmVyI29mZnNldH0gYnkgYDJgIGlmIG9taXR0ZWQuXHJcbiAgICAgKiBAdGhyb3dzIHtUeXBlRXJyb3J9IElmIGBvZmZzZXRgIG9yIGB2YWx1ZWAgaXMgbm90IGEgdmFsaWQgbnVtYmVyXHJcbiAgICAgKiBAdGhyb3dzIHtSYW5nZUVycm9yfSBJZiBgb2Zmc2V0YCBpcyBvdXQgb2YgYm91bmRzXHJcbiAgICAgKiBAZXhwb3NlXHJcbiAgICAgKi9cclxuICAgIEJ5dGVCdWZmZXJQcm90b3R5cGUud3JpdGVVSW50MTYgPSBCeXRlQnVmZmVyUHJvdG90eXBlLndyaXRlVWludDE2O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVhZHMgYSAxNmJpdCB1bnNpZ25lZCBpbnRlZ2VyLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXI9fSBvZmZzZXQgT2Zmc2V0IHRvIHJlYWQgZnJvbS4gV2lsbCB1c2UgYW5kIGFkdmFuY2Uge0BsaW5rIEJ5dGVCdWZmZXIjb2Zmc2V0fSBieSBgMmAgaWYgb21pdHRlZC5cclxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFZhbHVlIHJlYWRcclxuICAgICAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gSWYgYG9mZnNldGAgaXMgbm90IGEgdmFsaWQgbnVtYmVyXHJcbiAgICAgKiBAdGhyb3dzIHtSYW5nZUVycm9yfSBJZiBgb2Zmc2V0YCBpcyBvdXQgb2YgYm91bmRzXHJcbiAgICAgKiBAZXhwb3NlXHJcbiAgICAgKi9cclxuICAgIEJ5dGVCdWZmZXJQcm90b3R5cGUucmVhZFVpbnQxNiA9IGZ1bmN0aW9uKG9mZnNldCkge1xyXG4gICAgICAgIHZhciByZWxhdGl2ZSA9IHR5cGVvZiBvZmZzZXQgPT09ICd1bmRlZmluZWQnO1xuICAgICAgICBpZiAocmVsYXRpdmUpIG9mZnNldCA9IHRoaXMub2Zmc2V0O1xuICAgICAgICBpZiAoIXRoaXMubm9Bc3NlcnQpIHtcclxuICAgICAgICAgICAgaWYgKHR5cGVvZiBvZmZzZXQgIT09ICdudW1iZXInIHx8IG9mZnNldCAlIDEgIT09IDApXG4gICAgICAgICAgICAgICAgdGhyb3cgVHlwZUVycm9yKFwiSWxsZWdhbCBvZmZzZXQ6IFwiK29mZnNldCtcIiAobm90IGFuIGludGVnZXIpXCIpO1xuICAgICAgICAgICAgb2Zmc2V0ID4+Pj0gMDtcbiAgICAgICAgICAgIGlmIChvZmZzZXQgPCAwIHx8IG9mZnNldCArIDIgPiB0aGlzLmJ1ZmZlci5ieXRlTGVuZ3RoKVxuICAgICAgICAgICAgICAgIHRocm93IFJhbmdlRXJyb3IoXCJJbGxlZ2FsIG9mZnNldDogMCA8PSBcIitvZmZzZXQrXCIgKCtcIisyK1wiKSA8PSBcIit0aGlzLmJ1ZmZlci5ieXRlTGVuZ3RoKTtcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciB2YWx1ZSA9IDA7XHJcbiAgICAgICAgaWYgKHRoaXMubGl0dGxlRW5kaWFuKSB7XHJcbiAgICAgICAgICAgIHZhbHVlICA9IHRoaXMudmlld1tvZmZzZXQgIF07XHJcbiAgICAgICAgICAgIHZhbHVlIHw9IHRoaXMudmlld1tvZmZzZXQrMV0gPDwgODtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB2YWx1ZSAgPSB0aGlzLnZpZXdbb2Zmc2V0ICBdIDw8IDg7XHJcbiAgICAgICAgICAgIHZhbHVlIHw9IHRoaXMudmlld1tvZmZzZXQrMV07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZWxhdGl2ZSkgdGhpcy5vZmZzZXQgKz0gMjtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlYWRzIGEgMTZiaXQgdW5zaWduZWQgaW50ZWdlci4gVGhpcyBpcyBhbiBhbGlhcyBvZiB7QGxpbmsgQnl0ZUJ1ZmZlciNyZWFkVWludDE2fS5cclxuICAgICAqIEBmdW5jdGlvblxyXG4gICAgICogQHBhcmFtIHtudW1iZXI9fSBvZmZzZXQgT2Zmc2V0IHRvIHJlYWQgZnJvbS4gV2lsbCB1c2UgYW5kIGFkdmFuY2Uge0BsaW5rIEJ5dGVCdWZmZXIjb2Zmc2V0fSBieSBgMmAgaWYgb21pdHRlZC5cclxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFZhbHVlIHJlYWRcclxuICAgICAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gSWYgYG9mZnNldGAgaXMgbm90IGEgdmFsaWQgbnVtYmVyXHJcbiAgICAgKiBAdGhyb3dzIHtSYW5nZUVycm9yfSBJZiBgb2Zmc2V0YCBpcyBvdXQgb2YgYm91bmRzXHJcbiAgICAgKiBAZXhwb3NlXHJcbiAgICAgKi9cclxuICAgIEJ5dGVCdWZmZXJQcm90b3R5cGUucmVhZFVJbnQxNiA9IEJ5dGVCdWZmZXJQcm90b3R5cGUucmVhZFVpbnQxNjtcclxuXHJcbiAgICAvLyB0eXBlcy9pbnRzL2ludDMyXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBXcml0ZXMgYSAzMmJpdCBzaWduZWQgaW50ZWdlci5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSBWYWx1ZSB0byB3cml0ZVxyXG4gICAgICogQHBhcmFtIHtudW1iZXI9fSBvZmZzZXQgT2Zmc2V0IHRvIHdyaXRlIHRvLiBXaWxsIHVzZSBhbmQgaW5jcmVhc2Uge0BsaW5rIEJ5dGVCdWZmZXIjb2Zmc2V0fSBieSBgNGAgaWYgb21pdHRlZC5cclxuICAgICAqIEBleHBvc2VcclxuICAgICAqL1xyXG4gICAgQnl0ZUJ1ZmZlclByb3RvdHlwZS53cml0ZUludDMyID0gZnVuY3Rpb24odmFsdWUsIG9mZnNldCkge1xyXG4gICAgICAgIHZhciByZWxhdGl2ZSA9IHR5cGVvZiBvZmZzZXQgPT09ICd1bmRlZmluZWQnO1xuICAgICAgICBpZiAocmVsYXRpdmUpIG9mZnNldCA9IHRoaXMub2Zmc2V0O1xuICAgICAgICBpZiAoIXRoaXMubm9Bc3NlcnQpIHtcclxuICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ251bWJlcicgfHwgdmFsdWUgJSAxICE9PSAwKVxuICAgICAgICAgICAgICAgIHRocm93IFR5cGVFcnJvcihcIklsbGVnYWwgdmFsdWU6IFwiK3ZhbHVlK1wiIChub3QgYW4gaW50ZWdlcilcIik7XG4gICAgICAgICAgICB2YWx1ZSB8PSAwO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBvZmZzZXQgIT09ICdudW1iZXInIHx8IG9mZnNldCAlIDEgIT09IDApXG4gICAgICAgICAgICAgICAgdGhyb3cgVHlwZUVycm9yKFwiSWxsZWdhbCBvZmZzZXQ6IFwiK29mZnNldCtcIiAobm90IGFuIGludGVnZXIpXCIpO1xuICAgICAgICAgICAgb2Zmc2V0ID4+Pj0gMDtcbiAgICAgICAgICAgIGlmIChvZmZzZXQgPCAwIHx8IG9mZnNldCArIDAgPiB0aGlzLmJ1ZmZlci5ieXRlTGVuZ3RoKVxuICAgICAgICAgICAgICAgIHRocm93IFJhbmdlRXJyb3IoXCJJbGxlZ2FsIG9mZnNldDogMCA8PSBcIitvZmZzZXQrXCIgKCtcIiswK1wiKSA8PSBcIit0aGlzLmJ1ZmZlci5ieXRlTGVuZ3RoKTtcbiAgICAgICAgfVxyXG4gICAgICAgIG9mZnNldCArPSA0O1xuICAgICAgICB2YXIgY2FwYWNpdHk0ID0gdGhpcy5idWZmZXIuYnl0ZUxlbmd0aDtcbiAgICAgICAgaWYgKG9mZnNldCA+IGNhcGFjaXR5NClcbiAgICAgICAgICAgIHRoaXMucmVzaXplKChjYXBhY2l0eTQgKj0gMikgPiBvZmZzZXQgPyBjYXBhY2l0eTQgOiBvZmZzZXQpO1xuICAgICAgICBvZmZzZXQgLT0gNDtcbiAgICAgICAgaWYgKHRoaXMubGl0dGxlRW5kaWFuKSB7XG4gICAgICAgICAgICB0aGlzLnZpZXdbb2Zmc2V0KzNdID0gKHZhbHVlID4+PiAyNCkgJiAweEZGO1xuICAgICAgICAgICAgdGhpcy52aWV3W29mZnNldCsyXSA9ICh2YWx1ZSA+Pj4gMTYpICYgMHhGRjtcbiAgICAgICAgICAgIHRoaXMudmlld1tvZmZzZXQrMV0gPSAodmFsdWUgPj4+ICA4KSAmIDB4RkY7XG4gICAgICAgICAgICB0aGlzLnZpZXdbb2Zmc2V0ICBdID0gIHZhbHVlICAgICAgICAgJiAweEZGO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy52aWV3W29mZnNldCAgXSA9ICh2YWx1ZSA+Pj4gMjQpICYgMHhGRjtcbiAgICAgICAgICAgIHRoaXMudmlld1tvZmZzZXQrMV0gPSAodmFsdWUgPj4+IDE2KSAmIDB4RkY7XG4gICAgICAgICAgICB0aGlzLnZpZXdbb2Zmc2V0KzJdID0gKHZhbHVlID4+PiAgOCkgJiAweEZGO1xuICAgICAgICAgICAgdGhpcy52aWV3W29mZnNldCszXSA9ICB2YWx1ZSAgICAgICAgICYgMHhGRjtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVsYXRpdmUpIHRoaXMub2Zmc2V0ICs9IDQ7XG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFdyaXRlcyBhIDMyYml0IHNpZ25lZCBpbnRlZ2VyLiBUaGlzIGlzIGFuIGFsaWFzIG9mIHtAbGluayBCeXRlQnVmZmVyI3dyaXRlSW50MzJ9LlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIFZhbHVlIHRvIHdyaXRlXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcj19IG9mZnNldCBPZmZzZXQgdG8gd3JpdGUgdG8uIFdpbGwgdXNlIGFuZCBpbmNyZWFzZSB7QGxpbmsgQnl0ZUJ1ZmZlciNvZmZzZXR9IGJ5IGA0YCBpZiBvbWl0dGVkLlxyXG4gICAgICogQGV4cG9zZVxyXG4gICAgICovXHJcbiAgICBCeXRlQnVmZmVyUHJvdG90eXBlLndyaXRlSW50ID0gQnl0ZUJ1ZmZlclByb3RvdHlwZS53cml0ZUludDMyO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVhZHMgYSAzMmJpdCBzaWduZWQgaW50ZWdlci5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyPX0gb2Zmc2V0IE9mZnNldCB0byByZWFkIGZyb20uIFdpbGwgdXNlIGFuZCBpbmNyZWFzZSB7QGxpbmsgQnl0ZUJ1ZmZlciNvZmZzZXR9IGJ5IGA0YCBpZiBvbWl0dGVkLlxyXG4gICAgICogQHJldHVybnMge251bWJlcn0gVmFsdWUgcmVhZFxyXG4gICAgICogQGV4cG9zZVxyXG4gICAgICovXHJcbiAgICBCeXRlQnVmZmVyUHJvdG90eXBlLnJlYWRJbnQzMiA9IGZ1bmN0aW9uKG9mZnNldCkge1xyXG4gICAgICAgIHZhciByZWxhdGl2ZSA9IHR5cGVvZiBvZmZzZXQgPT09ICd1bmRlZmluZWQnO1xuICAgICAgICBpZiAocmVsYXRpdmUpIG9mZnNldCA9IHRoaXMub2Zmc2V0O1xuICAgICAgICBpZiAoIXRoaXMubm9Bc3NlcnQpIHtcclxuICAgICAgICAgICAgaWYgKHR5cGVvZiBvZmZzZXQgIT09ICdudW1iZXInIHx8IG9mZnNldCAlIDEgIT09IDApXG4gICAgICAgICAgICAgICAgdGhyb3cgVHlwZUVycm9yKFwiSWxsZWdhbCBvZmZzZXQ6IFwiK29mZnNldCtcIiAobm90IGFuIGludGVnZXIpXCIpO1xuICAgICAgICAgICAgb2Zmc2V0ID4+Pj0gMDtcbiAgICAgICAgICAgIGlmIChvZmZzZXQgPCAwIHx8IG9mZnNldCArIDQgPiB0aGlzLmJ1ZmZlci5ieXRlTGVuZ3RoKVxuICAgICAgICAgICAgICAgIHRocm93IFJhbmdlRXJyb3IoXCJJbGxlZ2FsIG9mZnNldDogMCA8PSBcIitvZmZzZXQrXCIgKCtcIis0K1wiKSA8PSBcIit0aGlzLmJ1ZmZlci5ieXRlTGVuZ3RoKTtcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciB2YWx1ZSA9IDA7XHJcbiAgICAgICAgaWYgKHRoaXMubGl0dGxlRW5kaWFuKSB7XG4gICAgICAgICAgICB2YWx1ZSAgPSB0aGlzLnZpZXdbb2Zmc2V0KzJdIDw8IDE2O1xuICAgICAgICAgICAgdmFsdWUgfD0gdGhpcy52aWV3W29mZnNldCsxXSA8PCAgODtcbiAgICAgICAgICAgIHZhbHVlIHw9IHRoaXMudmlld1tvZmZzZXQgIF07XG4gICAgICAgICAgICB2YWx1ZSArPSB0aGlzLnZpZXdbb2Zmc2V0KzNdIDw8IDI0ID4+PiAwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFsdWUgID0gdGhpcy52aWV3W29mZnNldCsxXSA8PCAxNjtcbiAgICAgICAgICAgIHZhbHVlIHw9IHRoaXMudmlld1tvZmZzZXQrMl0gPDwgIDg7XG4gICAgICAgICAgICB2YWx1ZSB8PSB0aGlzLnZpZXdbb2Zmc2V0KzNdO1xuICAgICAgICAgICAgdmFsdWUgKz0gdGhpcy52aWV3W29mZnNldCAgXSA8PCAyNCA+Pj4gMDtcbiAgICAgICAgfVxuICAgICAgICB2YWx1ZSB8PSAwOyAvLyBDYXN0IHRvIHNpZ25lZFxyXG4gICAgICAgIGlmIChyZWxhdGl2ZSkgdGhpcy5vZmZzZXQgKz0gNDtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlYWRzIGEgMzJiaXQgc2lnbmVkIGludGVnZXIuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIEJ5dGVCdWZmZXIjcmVhZEludDMyfS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyPX0gb2Zmc2V0IE9mZnNldCB0byByZWFkIGZyb20uIFdpbGwgdXNlIGFuZCBhZHZhbmNlIHtAbGluayBCeXRlQnVmZmVyI29mZnNldH0gYnkgYDRgIGlmIG9taXR0ZWQuXHJcbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBWYWx1ZSByZWFkXHJcbiAgICAgKiBAZXhwb3NlXHJcbiAgICAgKi9cclxuICAgIEJ5dGVCdWZmZXJQcm90b3R5cGUucmVhZEludCA9IEJ5dGVCdWZmZXJQcm90b3R5cGUucmVhZEludDMyO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogV3JpdGVzIGEgMzJiaXQgdW5zaWduZWQgaW50ZWdlci5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSBWYWx1ZSB0byB3cml0ZVxyXG4gICAgICogQHBhcmFtIHtudW1iZXI9fSBvZmZzZXQgT2Zmc2V0IHRvIHdyaXRlIHRvLiBXaWxsIHVzZSBhbmQgaW5jcmVhc2Uge0BsaW5rIEJ5dGVCdWZmZXIjb2Zmc2V0fSBieSBgNGAgaWYgb21pdHRlZC5cclxuICAgICAqIEBleHBvc2VcclxuICAgICAqL1xyXG4gICAgQnl0ZUJ1ZmZlclByb3RvdHlwZS53cml0ZVVpbnQzMiA9IGZ1bmN0aW9uKHZhbHVlLCBvZmZzZXQpIHtcclxuICAgICAgICB2YXIgcmVsYXRpdmUgPSB0eXBlb2Ygb2Zmc2V0ID09PSAndW5kZWZpbmVkJztcbiAgICAgICAgaWYgKHJlbGF0aXZlKSBvZmZzZXQgPSB0aGlzLm9mZnNldDtcbiAgICAgICAgaWYgKCF0aGlzLm5vQXNzZXJ0KSB7XHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdudW1iZXInIHx8IHZhbHVlICUgMSAhPT0gMClcbiAgICAgICAgICAgICAgICB0aHJvdyBUeXBlRXJyb3IoXCJJbGxlZ2FsIHZhbHVlOiBcIit2YWx1ZStcIiAobm90IGFuIGludGVnZXIpXCIpO1xuICAgICAgICAgICAgdmFsdWUgPj4+PSAwO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBvZmZzZXQgIT09ICdudW1iZXInIHx8IG9mZnNldCAlIDEgIT09IDApXG4gICAgICAgICAgICAgICAgdGhyb3cgVHlwZUVycm9yKFwiSWxsZWdhbCBvZmZzZXQ6IFwiK29mZnNldCtcIiAobm90IGFuIGludGVnZXIpXCIpO1xuICAgICAgICAgICAgb2Zmc2V0ID4+Pj0gMDtcbiAgICAgICAgICAgIGlmIChvZmZzZXQgPCAwIHx8IG9mZnNldCArIDAgPiB0aGlzLmJ1ZmZlci5ieXRlTGVuZ3RoKVxuICAgICAgICAgICAgICAgIHRocm93IFJhbmdlRXJyb3IoXCJJbGxlZ2FsIG9mZnNldDogMCA8PSBcIitvZmZzZXQrXCIgKCtcIiswK1wiKSA8PSBcIit0aGlzLmJ1ZmZlci5ieXRlTGVuZ3RoKTtcbiAgICAgICAgfVxyXG4gICAgICAgIG9mZnNldCArPSA0O1xuICAgICAgICB2YXIgY2FwYWNpdHk1ID0gdGhpcy5idWZmZXIuYnl0ZUxlbmd0aDtcbiAgICAgICAgaWYgKG9mZnNldCA+IGNhcGFjaXR5NSlcbiAgICAgICAgICAgIHRoaXMucmVzaXplKChjYXBhY2l0eTUgKj0gMikgPiBvZmZzZXQgPyBjYXBhY2l0eTUgOiBvZmZzZXQpO1xuICAgICAgICBvZmZzZXQgLT0gNDtcbiAgICAgICAgaWYgKHRoaXMubGl0dGxlRW5kaWFuKSB7XG4gICAgICAgICAgICB0aGlzLnZpZXdbb2Zmc2V0KzNdID0gKHZhbHVlID4+PiAyNCkgJiAweEZGO1xuICAgICAgICAgICAgdGhpcy52aWV3W29mZnNldCsyXSA9ICh2YWx1ZSA+Pj4gMTYpICYgMHhGRjtcbiAgICAgICAgICAgIHRoaXMudmlld1tvZmZzZXQrMV0gPSAodmFsdWUgPj4+ICA4KSAmIDB4RkY7XG4gICAgICAgICAgICB0aGlzLnZpZXdbb2Zmc2V0ICBdID0gIHZhbHVlICAgICAgICAgJiAweEZGO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy52aWV3W29mZnNldCAgXSA9ICh2YWx1ZSA+Pj4gMjQpICYgMHhGRjtcbiAgICAgICAgICAgIHRoaXMudmlld1tvZmZzZXQrMV0gPSAodmFsdWUgPj4+IDE2KSAmIDB4RkY7XG4gICAgICAgICAgICB0aGlzLnZpZXdbb2Zmc2V0KzJdID0gKHZhbHVlID4+PiAgOCkgJiAweEZGO1xuICAgICAgICAgICAgdGhpcy52aWV3W29mZnNldCszXSA9ICB2YWx1ZSAgICAgICAgICYgMHhGRjtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVsYXRpdmUpIHRoaXMub2Zmc2V0ICs9IDQ7XG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFdyaXRlcyBhIDMyYml0IHVuc2lnbmVkIGludGVnZXIuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIEJ5dGVCdWZmZXIjd3JpdGVVaW50MzJ9LlxyXG4gICAgICogQGZ1bmN0aW9uXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgVmFsdWUgdG8gd3JpdGVcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyPX0gb2Zmc2V0IE9mZnNldCB0byB3cml0ZSB0by4gV2lsbCB1c2UgYW5kIGluY3JlYXNlIHtAbGluayBCeXRlQnVmZmVyI29mZnNldH0gYnkgYDRgIGlmIG9taXR0ZWQuXHJcbiAgICAgKiBAZXhwb3NlXHJcbiAgICAgKi9cclxuICAgIEJ5dGVCdWZmZXJQcm90b3R5cGUud3JpdGVVSW50MzIgPSBCeXRlQnVmZmVyUHJvdG90eXBlLndyaXRlVWludDMyO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVhZHMgYSAzMmJpdCB1bnNpZ25lZCBpbnRlZ2VyLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXI9fSBvZmZzZXQgT2Zmc2V0IHRvIHJlYWQgZnJvbS4gV2lsbCB1c2UgYW5kIGluY3JlYXNlIHtAbGluayBCeXRlQnVmZmVyI29mZnNldH0gYnkgYDRgIGlmIG9taXR0ZWQuXHJcbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBWYWx1ZSByZWFkXHJcbiAgICAgKiBAZXhwb3NlXHJcbiAgICAgKi9cclxuICAgIEJ5dGVCdWZmZXJQcm90b3R5cGUucmVhZFVpbnQzMiA9IGZ1bmN0aW9uKG9mZnNldCkge1xyXG4gICAgICAgIHZhciByZWxhdGl2ZSA9IHR5cGVvZiBvZmZzZXQgPT09ICd1bmRlZmluZWQnO1xuICAgICAgICBpZiAocmVsYXRpdmUpIG9mZnNldCA9IHRoaXMub2Zmc2V0O1xuICAgICAgICBpZiAoIXRoaXMubm9Bc3NlcnQpIHtcclxuICAgICAgICAgICAgaWYgKHR5cGVvZiBvZmZzZXQgIT09ICdudW1iZXInIHx8IG9mZnNldCAlIDEgIT09IDApXG4gICAgICAgICAgICAgICAgdGhyb3cgVHlwZUVycm9yKFwiSWxsZWdhbCBvZmZzZXQ6IFwiK29mZnNldCtcIiAobm90IGFuIGludGVnZXIpXCIpO1xuICAgICAgICAgICAgb2Zmc2V0ID4+Pj0gMDtcbiAgICAgICAgICAgIGlmIChvZmZzZXQgPCAwIHx8IG9mZnNldCArIDQgPiB0aGlzLmJ1ZmZlci5ieXRlTGVuZ3RoKVxuICAgICAgICAgICAgICAgIHRocm93IFJhbmdlRXJyb3IoXCJJbGxlZ2FsIG9mZnNldDogMCA8PSBcIitvZmZzZXQrXCIgKCtcIis0K1wiKSA8PSBcIit0aGlzLmJ1ZmZlci5ieXRlTGVuZ3RoKTtcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciB2YWx1ZSA9IDA7XHJcbiAgICAgICAgaWYgKHRoaXMubGl0dGxlRW5kaWFuKSB7XG4gICAgICAgICAgICB2YWx1ZSAgPSB0aGlzLnZpZXdbb2Zmc2V0KzJdIDw8IDE2O1xuICAgICAgICAgICAgdmFsdWUgfD0gdGhpcy52aWV3W29mZnNldCsxXSA8PCAgODtcbiAgICAgICAgICAgIHZhbHVlIHw9IHRoaXMudmlld1tvZmZzZXQgIF07XG4gICAgICAgICAgICB2YWx1ZSArPSB0aGlzLnZpZXdbb2Zmc2V0KzNdIDw8IDI0ID4+PiAwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFsdWUgID0gdGhpcy52aWV3W29mZnNldCsxXSA8PCAxNjtcbiAgICAgICAgICAgIHZhbHVlIHw9IHRoaXMudmlld1tvZmZzZXQrMl0gPDwgIDg7XG4gICAgICAgICAgICB2YWx1ZSB8PSB0aGlzLnZpZXdbb2Zmc2V0KzNdO1xuICAgICAgICAgICAgdmFsdWUgKz0gdGhpcy52aWV3W29mZnNldCAgXSA8PCAyNCA+Pj4gMDtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVsYXRpdmUpIHRoaXMub2Zmc2V0ICs9IDQ7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZWFkcyBhIDMyYml0IHVuc2lnbmVkIGludGVnZXIuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIEJ5dGVCdWZmZXIjcmVhZFVpbnQzMn0uXHJcbiAgICAgKiBAZnVuY3Rpb25cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyPX0gb2Zmc2V0IE9mZnNldCB0byByZWFkIGZyb20uIFdpbGwgdXNlIGFuZCBpbmNyZWFzZSB7QGxpbmsgQnl0ZUJ1ZmZlciNvZmZzZXR9IGJ5IGA0YCBpZiBvbWl0dGVkLlxyXG4gICAgICogQHJldHVybnMge251bWJlcn0gVmFsdWUgcmVhZFxyXG4gICAgICogQGV4cG9zZVxyXG4gICAgICovXHJcbiAgICBCeXRlQnVmZmVyUHJvdG90eXBlLnJlYWRVSW50MzIgPSBCeXRlQnVmZmVyUHJvdG90eXBlLnJlYWRVaW50MzI7XHJcblxyXG4gICAgLy8gdHlwZXMvaW50cy9pbnQ2NFxyXG5cclxuICAgIGlmIChMb25nKSB7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFdyaXRlcyBhIDY0Yml0IHNpZ25lZCBpbnRlZ2VyLlxyXG4gICAgICAgICAqIEBwYXJhbSB7bnVtYmVyfCFMb25nfSB2YWx1ZSBWYWx1ZSB0byB3cml0ZVxyXG4gICAgICAgICAqIEBwYXJhbSB7bnVtYmVyPX0gb2Zmc2V0IE9mZnNldCB0byB3cml0ZSB0by4gV2lsbCB1c2UgYW5kIGluY3JlYXNlIHtAbGluayBCeXRlQnVmZmVyI29mZnNldH0gYnkgYDhgIGlmIG9taXR0ZWQuXHJcbiAgICAgICAgICogQHJldHVybnMgeyFCeXRlQnVmZmVyfSB0aGlzXHJcbiAgICAgICAgICogQGV4cG9zZVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIEJ5dGVCdWZmZXJQcm90b3R5cGUud3JpdGVJbnQ2NCA9IGZ1bmN0aW9uKHZhbHVlLCBvZmZzZXQpIHtcclxuICAgICAgICAgICAgdmFyIHJlbGF0aXZlID0gdHlwZW9mIG9mZnNldCA9PT0gJ3VuZGVmaW5lZCc7XG4gICAgICAgICAgICBpZiAocmVsYXRpdmUpIG9mZnNldCA9IHRoaXMub2Zmc2V0O1xuICAgICAgICAgICAgaWYgKCF0aGlzLm5vQXNzZXJ0KSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJylcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBMb25nLmZyb21OdW1iZXIodmFsdWUpO1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gTG9uZy5mcm9tU3RyaW5nKHZhbHVlKTtcbiAgICAgICAgICAgICAgICBlbHNlIGlmICghKHZhbHVlICYmIHZhbHVlIGluc3RhbmNlb2YgTG9uZykpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IFR5cGVFcnJvcihcIklsbGVnYWwgdmFsdWU6IFwiK3ZhbHVlK1wiIChub3QgYW4gaW50ZWdlciBvciBMb25nKVwiKTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG9mZnNldCAhPT0gJ251bWJlcicgfHwgb2Zmc2V0ICUgMSAhPT0gMClcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgVHlwZUVycm9yKFwiSWxsZWdhbCBvZmZzZXQ6IFwiK29mZnNldCtcIiAobm90IGFuIGludGVnZXIpXCIpO1xuICAgICAgICAgICAgICAgIG9mZnNldCA+Pj49IDA7XG4gICAgICAgICAgICAgICAgaWYgKG9mZnNldCA8IDAgfHwgb2Zmc2V0ICsgMCA+IHRoaXMuYnVmZmVyLmJ5dGVMZW5ndGgpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IFJhbmdlRXJyb3IoXCJJbGxlZ2FsIG9mZnNldDogMCA8PSBcIitvZmZzZXQrXCIgKCtcIiswK1wiKSA8PSBcIit0aGlzLmJ1ZmZlci5ieXRlTGVuZ3RoKTtcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpXG4gICAgICAgICAgICAgICAgdmFsdWUgPSBMb25nLmZyb21OdW1iZXIodmFsdWUpO1xuICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJylcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IExvbmcuZnJvbVN0cmluZyh2YWx1ZSk7XG4gICAgICAgICAgICBvZmZzZXQgKz0gODtcbiAgICAgICAgICAgIHZhciBjYXBhY2l0eTYgPSB0aGlzLmJ1ZmZlci5ieXRlTGVuZ3RoO1xuICAgICAgICAgICAgaWYgKG9mZnNldCA+IGNhcGFjaXR5NilcbiAgICAgICAgICAgICAgICB0aGlzLnJlc2l6ZSgoY2FwYWNpdHk2ICo9IDIpID4gb2Zmc2V0ID8gY2FwYWNpdHk2IDogb2Zmc2V0KTtcbiAgICAgICAgICAgIG9mZnNldCAtPSA4O1xuICAgICAgICAgICAgdmFyIGxvID0gdmFsdWUubG93LFxyXG4gICAgICAgICAgICAgICAgaGkgPSB2YWx1ZS5oaWdoO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5saXR0bGVFbmRpYW4pIHtcclxuICAgICAgICAgICAgICAgIHRoaXMudmlld1tvZmZzZXQrM10gPSAobG8gPj4+IDI0KSAmIDB4RkY7XG4gICAgICAgICAgICAgICAgdGhpcy52aWV3W29mZnNldCsyXSA9IChsbyA+Pj4gMTYpICYgMHhGRjtcbiAgICAgICAgICAgICAgICB0aGlzLnZpZXdbb2Zmc2V0KzFdID0gKGxvID4+PiAgOCkgJiAweEZGO1xuICAgICAgICAgICAgICAgIHRoaXMudmlld1tvZmZzZXQgIF0gPSAgbG8gICAgICAgICAmIDB4RkY7XG4gICAgICAgICAgICAgICAgb2Zmc2V0ICs9IDQ7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnZpZXdbb2Zmc2V0KzNdID0gKGhpID4+PiAyNCkgJiAweEZGO1xuICAgICAgICAgICAgICAgIHRoaXMudmlld1tvZmZzZXQrMl0gPSAoaGkgPj4+IDE2KSAmIDB4RkY7XG4gICAgICAgICAgICAgICAgdGhpcy52aWV3W29mZnNldCsxXSA9IChoaSA+Pj4gIDgpICYgMHhGRjtcbiAgICAgICAgICAgICAgICB0aGlzLnZpZXdbb2Zmc2V0ICBdID0gIGhpICAgICAgICAgJiAweEZGO1xuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMudmlld1tvZmZzZXQgIF0gPSAoaGkgPj4+IDI0KSAmIDB4RkY7XG4gICAgICAgICAgICAgICAgdGhpcy52aWV3W29mZnNldCsxXSA9IChoaSA+Pj4gMTYpICYgMHhGRjtcbiAgICAgICAgICAgICAgICB0aGlzLnZpZXdbb2Zmc2V0KzJdID0gKGhpID4+PiAgOCkgJiAweEZGO1xuICAgICAgICAgICAgICAgIHRoaXMudmlld1tvZmZzZXQrM10gPSAgaGkgICAgICAgICAmIDB4RkY7XG4gICAgICAgICAgICAgICAgb2Zmc2V0ICs9IDQ7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnZpZXdbb2Zmc2V0ICBdID0gKGxvID4+PiAyNCkgJiAweEZGO1xuICAgICAgICAgICAgICAgIHRoaXMudmlld1tvZmZzZXQrMV0gPSAobG8gPj4+IDE2KSAmIDB4RkY7XG4gICAgICAgICAgICAgICAgdGhpcy52aWV3W29mZnNldCsyXSA9IChsbyA+Pj4gIDgpICYgMHhGRjtcbiAgICAgICAgICAgICAgICB0aGlzLnZpZXdbb2Zmc2V0KzNdID0gIGxvICAgICAgICAgJiAweEZGO1xuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAocmVsYXRpdmUpIHRoaXMub2Zmc2V0ICs9IDg7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBXcml0ZXMgYSA2NGJpdCBzaWduZWQgaW50ZWdlci4gVGhpcyBpcyBhbiBhbGlhcyBvZiB7QGxpbmsgQnl0ZUJ1ZmZlciN3cml0ZUludDY0fS5cclxuICAgICAgICAgKiBAcGFyYW0ge251bWJlcnwhTG9uZ30gdmFsdWUgVmFsdWUgdG8gd3JpdGVcclxuICAgICAgICAgKiBAcGFyYW0ge251bWJlcj19IG9mZnNldCBPZmZzZXQgdG8gd3JpdGUgdG8uIFdpbGwgdXNlIGFuZCBpbmNyZWFzZSB7QGxpbmsgQnl0ZUJ1ZmZlciNvZmZzZXR9IGJ5IGA4YCBpZiBvbWl0dGVkLlxyXG4gICAgICAgICAqIEByZXR1cm5zIHshQnl0ZUJ1ZmZlcn0gdGhpc1xyXG4gICAgICAgICAqIEBleHBvc2VcclxuICAgICAgICAgKi9cclxuICAgICAgICBCeXRlQnVmZmVyUHJvdG90eXBlLndyaXRlTG9uZyA9IEJ5dGVCdWZmZXJQcm90b3R5cGUud3JpdGVJbnQ2NDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogUmVhZHMgYSA2NGJpdCBzaWduZWQgaW50ZWdlci5cclxuICAgICAgICAgKiBAcGFyYW0ge251bWJlcj19IG9mZnNldCBPZmZzZXQgdG8gcmVhZCBmcm9tLiBXaWxsIHVzZSBhbmQgaW5jcmVhc2Uge0BsaW5rIEJ5dGVCdWZmZXIjb2Zmc2V0fSBieSBgOGAgaWYgb21pdHRlZC5cclxuICAgICAgICAgKiBAcmV0dXJucyB7IUxvbmd9XHJcbiAgICAgICAgICogQGV4cG9zZVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIEJ5dGVCdWZmZXJQcm90b3R5cGUucmVhZEludDY0ID0gZnVuY3Rpb24ob2Zmc2V0KSB7XHJcbiAgICAgICAgICAgIHZhciByZWxhdGl2ZSA9IHR5cGVvZiBvZmZzZXQgPT09ICd1bmRlZmluZWQnO1xuICAgICAgICAgICAgaWYgKHJlbGF0aXZlKSBvZmZzZXQgPSB0aGlzLm9mZnNldDtcbiAgICAgICAgICAgIGlmICghdGhpcy5ub0Fzc2VydCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBvZmZzZXQgIT09ICdudW1iZXInIHx8IG9mZnNldCAlIDEgIT09IDApXG4gICAgICAgICAgICAgICAgICAgIHRocm93IFR5cGVFcnJvcihcIklsbGVnYWwgb2Zmc2V0OiBcIitvZmZzZXQrXCIgKG5vdCBhbiBpbnRlZ2VyKVwiKTtcbiAgICAgICAgICAgICAgICBvZmZzZXQgPj4+PSAwO1xuICAgICAgICAgICAgICAgIGlmIChvZmZzZXQgPCAwIHx8IG9mZnNldCArIDggPiB0aGlzLmJ1ZmZlci5ieXRlTGVuZ3RoKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBSYW5nZUVycm9yKFwiSWxsZWdhbCBvZmZzZXQ6IDAgPD0gXCIrb2Zmc2V0K1wiICgrXCIrOCtcIikgPD0gXCIrdGhpcy5idWZmZXIuYnl0ZUxlbmd0aCk7XG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHZhciBsbyA9IDAsXHJcbiAgICAgICAgICAgICAgICBoaSA9IDA7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmxpdHRsZUVuZGlhbikge1xyXG4gICAgICAgICAgICAgICAgbG8gID0gdGhpcy52aWV3W29mZnNldCsyXSA8PCAxNjtcbiAgICAgICAgICAgICAgICBsbyB8PSB0aGlzLnZpZXdbb2Zmc2V0KzFdIDw8ICA4O1xuICAgICAgICAgICAgICAgIGxvIHw9IHRoaXMudmlld1tvZmZzZXQgIF07XG4gICAgICAgICAgICAgICAgbG8gKz0gdGhpcy52aWV3W29mZnNldCszXSA8PCAyNCA+Pj4gMDtcbiAgICAgICAgICAgICAgICBvZmZzZXQgKz0gNDtcclxuICAgICAgICAgICAgICAgIGhpICA9IHRoaXMudmlld1tvZmZzZXQrMl0gPDwgMTY7XG4gICAgICAgICAgICAgICAgaGkgfD0gdGhpcy52aWV3W29mZnNldCsxXSA8PCAgODtcbiAgICAgICAgICAgICAgICBoaSB8PSB0aGlzLnZpZXdbb2Zmc2V0ICBdO1xuICAgICAgICAgICAgICAgIGhpICs9IHRoaXMudmlld1tvZmZzZXQrM10gPDwgMjQgPj4+IDA7XG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaGkgID0gdGhpcy52aWV3W29mZnNldCsxXSA8PCAxNjtcbiAgICAgICAgICAgICAgICBoaSB8PSB0aGlzLnZpZXdbb2Zmc2V0KzJdIDw8ICA4O1xuICAgICAgICAgICAgICAgIGhpIHw9IHRoaXMudmlld1tvZmZzZXQrM107XG4gICAgICAgICAgICAgICAgaGkgKz0gdGhpcy52aWV3W29mZnNldCAgXSA8PCAyNCA+Pj4gMDtcbiAgICAgICAgICAgICAgICBvZmZzZXQgKz0gNDtcclxuICAgICAgICAgICAgICAgIGxvICA9IHRoaXMudmlld1tvZmZzZXQrMV0gPDwgMTY7XG4gICAgICAgICAgICAgICAgbG8gfD0gdGhpcy52aWV3W29mZnNldCsyXSA8PCAgODtcbiAgICAgICAgICAgICAgICBsbyB8PSB0aGlzLnZpZXdbb2Zmc2V0KzNdO1xuICAgICAgICAgICAgICAgIGxvICs9IHRoaXMudmlld1tvZmZzZXQgIF0gPDwgMjQgPj4+IDA7XG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHZhciB2YWx1ZSA9IG5ldyBMb25nKGxvLCBoaSwgZmFsc2UpO1xyXG4gICAgICAgICAgICBpZiAocmVsYXRpdmUpIHRoaXMub2Zmc2V0ICs9IDg7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogUmVhZHMgYSA2NGJpdCBzaWduZWQgaW50ZWdlci4gVGhpcyBpcyBhbiBhbGlhcyBvZiB7QGxpbmsgQnl0ZUJ1ZmZlciNyZWFkSW50NjR9LlxyXG4gICAgICAgICAqIEBwYXJhbSB7bnVtYmVyPX0gb2Zmc2V0IE9mZnNldCB0byByZWFkIGZyb20uIFdpbGwgdXNlIGFuZCBpbmNyZWFzZSB7QGxpbmsgQnl0ZUJ1ZmZlciNvZmZzZXR9IGJ5IGA4YCBpZiBvbWl0dGVkLlxyXG4gICAgICAgICAqIEByZXR1cm5zIHshTG9uZ31cclxuICAgICAgICAgKiBAZXhwb3NlXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgQnl0ZUJ1ZmZlclByb3RvdHlwZS5yZWFkTG9uZyA9IEJ5dGVCdWZmZXJQcm90b3R5cGUucmVhZEludDY0O1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBXcml0ZXMgYSA2NGJpdCB1bnNpZ25lZCBpbnRlZ2VyLlxyXG4gICAgICAgICAqIEBwYXJhbSB7bnVtYmVyfCFMb25nfSB2YWx1ZSBWYWx1ZSB0byB3cml0ZVxyXG4gICAgICAgICAqIEBwYXJhbSB7bnVtYmVyPX0gb2Zmc2V0IE9mZnNldCB0byB3cml0ZSB0by4gV2lsbCB1c2UgYW5kIGluY3JlYXNlIHtAbGluayBCeXRlQnVmZmVyI29mZnNldH0gYnkgYDhgIGlmIG9taXR0ZWQuXHJcbiAgICAgICAgICogQHJldHVybnMgeyFCeXRlQnVmZmVyfSB0aGlzXHJcbiAgICAgICAgICogQGV4cG9zZVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIEJ5dGVCdWZmZXJQcm90b3R5cGUud3JpdGVVaW50NjQgPSBmdW5jdGlvbih2YWx1ZSwgb2Zmc2V0KSB7XHJcbiAgICAgICAgICAgIHZhciByZWxhdGl2ZSA9IHR5cGVvZiBvZmZzZXQgPT09ICd1bmRlZmluZWQnO1xuICAgICAgICAgICAgaWYgKHJlbGF0aXZlKSBvZmZzZXQgPSB0aGlzLm9mZnNldDtcbiAgICAgICAgICAgIGlmICghdGhpcy5ub0Fzc2VydCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gTG9uZy5mcm9tTnVtYmVyKHZhbHVlKTtcbiAgICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKVxuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IExvbmcuZnJvbVN0cmluZyh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoISh2YWx1ZSAmJiB2YWx1ZSBpbnN0YW5jZW9mIExvbmcpKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBUeXBlRXJyb3IoXCJJbGxlZ2FsIHZhbHVlOiBcIit2YWx1ZStcIiAobm90IGFuIGludGVnZXIgb3IgTG9uZylcIik7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBvZmZzZXQgIT09ICdudW1iZXInIHx8IG9mZnNldCAlIDEgIT09IDApXG4gICAgICAgICAgICAgICAgICAgIHRocm93IFR5cGVFcnJvcihcIklsbGVnYWwgb2Zmc2V0OiBcIitvZmZzZXQrXCIgKG5vdCBhbiBpbnRlZ2VyKVwiKTtcbiAgICAgICAgICAgICAgICBvZmZzZXQgPj4+PSAwO1xuICAgICAgICAgICAgICAgIGlmIChvZmZzZXQgPCAwIHx8IG9mZnNldCArIDAgPiB0aGlzLmJ1ZmZlci5ieXRlTGVuZ3RoKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBSYW5nZUVycm9yKFwiSWxsZWdhbCBvZmZzZXQ6IDAgPD0gXCIrb2Zmc2V0K1wiICgrXCIrMCtcIikgPD0gXCIrdGhpcy5idWZmZXIuYnl0ZUxlbmd0aCk7XG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKVxuICAgICAgICAgICAgICAgIHZhbHVlID0gTG9uZy5mcm9tTnVtYmVyKHZhbHVlKTtcbiAgICAgICAgICAgIGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpXG4gICAgICAgICAgICAgICAgdmFsdWUgPSBMb25nLmZyb21TdHJpbmcodmFsdWUpO1xuICAgICAgICAgICAgb2Zmc2V0ICs9IDg7XG4gICAgICAgICAgICB2YXIgY2FwYWNpdHk3ID0gdGhpcy5idWZmZXIuYnl0ZUxlbmd0aDtcbiAgICAgICAgICAgIGlmIChvZmZzZXQgPiBjYXBhY2l0eTcpXG4gICAgICAgICAgICAgICAgdGhpcy5yZXNpemUoKGNhcGFjaXR5NyAqPSAyKSA+IG9mZnNldCA/IGNhcGFjaXR5NyA6IG9mZnNldCk7XG4gICAgICAgICAgICBvZmZzZXQgLT0gODtcbiAgICAgICAgICAgIHZhciBsbyA9IHZhbHVlLmxvdyxcclxuICAgICAgICAgICAgICAgIGhpID0gdmFsdWUuaGlnaDtcclxuICAgICAgICAgICAgaWYgKHRoaXMubGl0dGxlRW5kaWFuKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnZpZXdbb2Zmc2V0KzNdID0gKGxvID4+PiAyNCkgJiAweEZGO1xuICAgICAgICAgICAgICAgIHRoaXMudmlld1tvZmZzZXQrMl0gPSAobG8gPj4+IDE2KSAmIDB4RkY7XG4gICAgICAgICAgICAgICAgdGhpcy52aWV3W29mZnNldCsxXSA9IChsbyA+Pj4gIDgpICYgMHhGRjtcbiAgICAgICAgICAgICAgICB0aGlzLnZpZXdbb2Zmc2V0ICBdID0gIGxvICAgICAgICAgJiAweEZGO1xuICAgICAgICAgICAgICAgIG9mZnNldCArPSA0O1xyXG4gICAgICAgICAgICAgICAgdGhpcy52aWV3W29mZnNldCszXSA9IChoaSA+Pj4gMjQpICYgMHhGRjtcbiAgICAgICAgICAgICAgICB0aGlzLnZpZXdbb2Zmc2V0KzJdID0gKGhpID4+PiAxNikgJiAweEZGO1xuICAgICAgICAgICAgICAgIHRoaXMudmlld1tvZmZzZXQrMV0gPSAoaGkgPj4+ICA4KSAmIDB4RkY7XG4gICAgICAgICAgICAgICAgdGhpcy52aWV3W29mZnNldCAgXSA9ICBoaSAgICAgICAgICYgMHhGRjtcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnZpZXdbb2Zmc2V0ICBdID0gKGhpID4+PiAyNCkgJiAweEZGO1xuICAgICAgICAgICAgICAgIHRoaXMudmlld1tvZmZzZXQrMV0gPSAoaGkgPj4+IDE2KSAmIDB4RkY7XG4gICAgICAgICAgICAgICAgdGhpcy52aWV3W29mZnNldCsyXSA9IChoaSA+Pj4gIDgpICYgMHhGRjtcbiAgICAgICAgICAgICAgICB0aGlzLnZpZXdbb2Zmc2V0KzNdID0gIGhpICAgICAgICAgJiAweEZGO1xuICAgICAgICAgICAgICAgIG9mZnNldCArPSA0O1xyXG4gICAgICAgICAgICAgICAgdGhpcy52aWV3W29mZnNldCAgXSA9IChsbyA+Pj4gMjQpICYgMHhGRjtcbiAgICAgICAgICAgICAgICB0aGlzLnZpZXdbb2Zmc2V0KzFdID0gKGxvID4+PiAxNikgJiAweEZGO1xuICAgICAgICAgICAgICAgIHRoaXMudmlld1tvZmZzZXQrMl0gPSAobG8gPj4+ICA4KSAmIDB4RkY7XG4gICAgICAgICAgICAgICAgdGhpcy52aWV3W29mZnNldCszXSA9ICBsbyAgICAgICAgICYgMHhGRjtcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHJlbGF0aXZlKSB0aGlzLm9mZnNldCArPSA4O1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogV3JpdGVzIGEgNjRiaXQgdW5zaWduZWQgaW50ZWdlci4gVGhpcyBpcyBhbiBhbGlhcyBvZiB7QGxpbmsgQnl0ZUJ1ZmZlciN3cml0ZVVpbnQ2NH0uXHJcbiAgICAgICAgICogQGZ1bmN0aW9uXHJcbiAgICAgICAgICogQHBhcmFtIHtudW1iZXJ8IUxvbmd9IHZhbHVlIFZhbHVlIHRvIHdyaXRlXHJcbiAgICAgICAgICogQHBhcmFtIHtudW1iZXI9fSBvZmZzZXQgT2Zmc2V0IHRvIHdyaXRlIHRvLiBXaWxsIHVzZSBhbmQgaW5jcmVhc2Uge0BsaW5rIEJ5dGVCdWZmZXIjb2Zmc2V0fSBieSBgOGAgaWYgb21pdHRlZC5cclxuICAgICAgICAgKiBAcmV0dXJucyB7IUJ5dGVCdWZmZXJ9IHRoaXNcclxuICAgICAgICAgKiBAZXhwb3NlXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgQnl0ZUJ1ZmZlclByb3RvdHlwZS53cml0ZVVJbnQ2NCA9IEJ5dGVCdWZmZXJQcm90b3R5cGUud3JpdGVVaW50NjQ7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFJlYWRzIGEgNjRiaXQgdW5zaWduZWQgaW50ZWdlci5cclxuICAgICAgICAgKiBAcGFyYW0ge251bWJlcj19IG9mZnNldCBPZmZzZXQgdG8gcmVhZCBmcm9tLiBXaWxsIHVzZSBhbmQgaW5jcmVhc2Uge0BsaW5rIEJ5dGVCdWZmZXIjb2Zmc2V0fSBieSBgOGAgaWYgb21pdHRlZC5cclxuICAgICAgICAgKiBAcmV0dXJucyB7IUxvbmd9XHJcbiAgICAgICAgICogQGV4cG9zZVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIEJ5dGVCdWZmZXJQcm90b3R5cGUucmVhZFVpbnQ2NCA9IGZ1bmN0aW9uKG9mZnNldCkge1xyXG4gICAgICAgICAgICB2YXIgcmVsYXRpdmUgPSB0eXBlb2Ygb2Zmc2V0ID09PSAndW5kZWZpbmVkJztcbiAgICAgICAgICAgIGlmIChyZWxhdGl2ZSkgb2Zmc2V0ID0gdGhpcy5vZmZzZXQ7XG4gICAgICAgICAgICBpZiAoIXRoaXMubm9Bc3NlcnQpIHtcclxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygb2Zmc2V0ICE9PSAnbnVtYmVyJyB8fCBvZmZzZXQgJSAxICE9PSAwKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBUeXBlRXJyb3IoXCJJbGxlZ2FsIG9mZnNldDogXCIrb2Zmc2V0K1wiIChub3QgYW4gaW50ZWdlcilcIik7XG4gICAgICAgICAgICAgICAgb2Zmc2V0ID4+Pj0gMDtcbiAgICAgICAgICAgICAgICBpZiAob2Zmc2V0IDwgMCB8fCBvZmZzZXQgKyA4ID4gdGhpcy5idWZmZXIuYnl0ZUxlbmd0aClcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgUmFuZ2VFcnJvcihcIklsbGVnYWwgb2Zmc2V0OiAwIDw9IFwiK29mZnNldCtcIiAoK1wiKzgrXCIpIDw9IFwiK3RoaXMuYnVmZmVyLmJ5dGVMZW5ndGgpO1xuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB2YXIgbG8gPSAwLFxyXG4gICAgICAgICAgICAgICAgaGkgPSAwO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5saXR0bGVFbmRpYW4pIHtcclxuICAgICAgICAgICAgICAgIGxvICA9IHRoaXMudmlld1tvZmZzZXQrMl0gPDwgMTY7XG4gICAgICAgICAgICAgICAgbG8gfD0gdGhpcy52aWV3W29mZnNldCsxXSA8PCAgODtcbiAgICAgICAgICAgICAgICBsbyB8PSB0aGlzLnZpZXdbb2Zmc2V0ICBdO1xuICAgICAgICAgICAgICAgIGxvICs9IHRoaXMudmlld1tvZmZzZXQrM10gPDwgMjQgPj4+IDA7XG4gICAgICAgICAgICAgICAgb2Zmc2V0ICs9IDQ7XHJcbiAgICAgICAgICAgICAgICBoaSAgPSB0aGlzLnZpZXdbb2Zmc2V0KzJdIDw8IDE2O1xuICAgICAgICAgICAgICAgIGhpIHw9IHRoaXMudmlld1tvZmZzZXQrMV0gPDwgIDg7XG4gICAgICAgICAgICAgICAgaGkgfD0gdGhpcy52aWV3W29mZnNldCAgXTtcbiAgICAgICAgICAgICAgICBoaSArPSB0aGlzLnZpZXdbb2Zmc2V0KzNdIDw8IDI0ID4+PiAwO1xuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGhpICA9IHRoaXMudmlld1tvZmZzZXQrMV0gPDwgMTY7XG4gICAgICAgICAgICAgICAgaGkgfD0gdGhpcy52aWV3W29mZnNldCsyXSA8PCAgODtcbiAgICAgICAgICAgICAgICBoaSB8PSB0aGlzLnZpZXdbb2Zmc2V0KzNdO1xuICAgICAgICAgICAgICAgIGhpICs9IHRoaXMudmlld1tvZmZzZXQgIF0gPDwgMjQgPj4+IDA7XG4gICAgICAgICAgICAgICAgb2Zmc2V0ICs9IDQ7XHJcbiAgICAgICAgICAgICAgICBsbyAgPSB0aGlzLnZpZXdbb2Zmc2V0KzFdIDw8IDE2O1xuICAgICAgICAgICAgICAgIGxvIHw9IHRoaXMudmlld1tvZmZzZXQrMl0gPDwgIDg7XG4gICAgICAgICAgICAgICAgbG8gfD0gdGhpcy52aWV3W29mZnNldCszXTtcbiAgICAgICAgICAgICAgICBsbyArPSB0aGlzLnZpZXdbb2Zmc2V0ICBdIDw8IDI0ID4+PiAwO1xuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB2YXIgdmFsdWUgPSBuZXcgTG9uZyhsbywgaGksIHRydWUpO1xyXG4gICAgICAgICAgICBpZiAocmVsYXRpdmUpIHRoaXMub2Zmc2V0ICs9IDg7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogUmVhZHMgYSA2NGJpdCB1bnNpZ25lZCBpbnRlZ2VyLiBUaGlzIGlzIGFuIGFsaWFzIG9mIHtAbGluayBCeXRlQnVmZmVyI3JlYWRVaW50NjR9LlxyXG4gICAgICAgICAqIEBmdW5jdGlvblxyXG4gICAgICAgICAqIEBwYXJhbSB7bnVtYmVyPX0gb2Zmc2V0IE9mZnNldCB0byByZWFkIGZyb20uIFdpbGwgdXNlIGFuZCBpbmNyZWFzZSB7QGxpbmsgQnl0ZUJ1ZmZlciNvZmZzZXR9IGJ5IGA4YCBpZiBvbWl0dGVkLlxyXG4gICAgICAgICAqIEByZXR1cm5zIHshTG9uZ31cclxuICAgICAgICAgKiBAZXhwb3NlXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgQnl0ZUJ1ZmZlclByb3RvdHlwZS5yZWFkVUludDY0ID0gQnl0ZUJ1ZmZlclByb3RvdHlwZS5yZWFkVWludDY0O1xyXG5cclxuICAgIH0gLy8gTG9uZ1xyXG5cclxuXHJcbiAgICAvLyB0eXBlcy9mbG9hdHMvZmxvYXQzMlxyXG5cclxuICAgIC8qXHJcbiAgICAgaWVlZTc1NCAtIGh0dHBzOi8vZ2l0aHViLmNvbS9mZXJvc3MvaWVlZTc1NFxyXG5cclxuICAgICBUaGUgTUlUIExpY2Vuc2UgKE1JVClcclxuXHJcbiAgICAgQ29weXJpZ2h0IChjKSBGZXJvc3MgQWJvdWtoYWRpamVoXHJcblxyXG4gICAgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcclxuICAgICBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXHJcbiAgICAgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xyXG4gICAgIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcclxuICAgICBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcclxuICAgICBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxyXG5cclxuICAgICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxyXG4gICAgIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxyXG5cclxuICAgICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXHJcbiAgICAgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXHJcbiAgICAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXHJcbiAgICAgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxyXG4gICAgIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXHJcbiAgICAgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxyXG4gICAgIFRIRSBTT0ZUV0FSRS5cclxuICAgICovXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZWFkcyBhbiBJRUVFNzU0IGZsb2F0IGZyb20gYSBieXRlIGFycmF5LlxyXG4gICAgICogQHBhcmFtIHshQXJyYXl9IGJ1ZmZlclxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG9mZnNldFxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBpc0xFXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbUxlblxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG5CeXRlc1xyXG4gICAgICogQHJldHVybnMge251bWJlcn1cclxuICAgICAqIEBpbm5lclxyXG4gICAgICovXHJcbiAgICBmdW5jdGlvbiBpZWVlNzU0X3JlYWQoYnVmZmVyLCBvZmZzZXQsIGlzTEUsIG1MZW4sIG5CeXRlcykge1xyXG4gICAgICAgIHZhciBlLCBtLFxyXG4gICAgICAgICAgICBlTGVuID0gbkJ5dGVzICogOCAtIG1MZW4gLSAxLFxyXG4gICAgICAgICAgICBlTWF4ID0gKDEgPDwgZUxlbikgLSAxLFxyXG4gICAgICAgICAgICBlQmlhcyA9IGVNYXggPj4gMSxcclxuICAgICAgICAgICAgbkJpdHMgPSAtNyxcclxuICAgICAgICAgICAgaSA9IGlzTEUgPyAobkJ5dGVzIC0gMSkgOiAwLFxyXG4gICAgICAgICAgICBkID0gaXNMRSA/IC0xIDogMSxcclxuICAgICAgICAgICAgcyA9IGJ1ZmZlcltvZmZzZXQgKyBpXTtcclxuXHJcbiAgICAgICAgaSArPSBkO1xyXG5cclxuICAgICAgICBlID0gcyAmICgoMSA8PCAoLW5CaXRzKSkgLSAxKTtcclxuICAgICAgICBzID4+PSAoLW5CaXRzKTtcclxuICAgICAgICBuQml0cyArPSBlTGVuO1xyXG4gICAgICAgIGZvciAoOyBuQml0cyA+IDA7IGUgPSBlICogMjU2ICsgYnVmZmVyW29mZnNldCArIGldLCBpICs9IGQsIG5CaXRzIC09IDgpIHt9XHJcblxyXG4gICAgICAgIG0gPSBlICYgKCgxIDw8ICgtbkJpdHMpKSAtIDEpO1xyXG4gICAgICAgIGUgPj49ICgtbkJpdHMpO1xyXG4gICAgICAgIG5CaXRzICs9IG1MZW47XHJcbiAgICAgICAgZm9yICg7IG5CaXRzID4gMDsgbSA9IG0gKiAyNTYgKyBidWZmZXJbb2Zmc2V0ICsgaV0sIGkgKz0gZCwgbkJpdHMgLT0gOCkge31cclxuXHJcbiAgICAgICAgaWYgKGUgPT09IDApIHtcclxuICAgICAgICAgICAgZSA9IDEgLSBlQmlhcztcclxuICAgICAgICB9IGVsc2UgaWYgKGUgPT09IGVNYXgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG0gPyBOYU4gOiAoKHMgPyAtMSA6IDEpICogSW5maW5pdHkpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIG0gPSBtICsgTWF0aC5wb3coMiwgbUxlbik7XHJcbiAgICAgICAgICAgIGUgPSBlIC0gZUJpYXM7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiAocyA/IC0xIDogMSkgKiBtICogTWF0aC5wb3coMiwgZSAtIG1MZW4pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogV3JpdGVzIGFuIElFRUU3NTQgZmxvYXQgdG8gYSBieXRlIGFycmF5LlxyXG4gICAgICogQHBhcmFtIHshQXJyYXl9IGJ1ZmZlclxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gb2Zmc2V0XHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGlzTEVcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBtTGVuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbkJ5dGVzXHJcbiAgICAgKiBAaW5uZXJcclxuICAgICAqL1xyXG4gICAgZnVuY3Rpb24gaWVlZTc1NF93cml0ZShidWZmZXIsIHZhbHVlLCBvZmZzZXQsIGlzTEUsIG1MZW4sIG5CeXRlcykge1xyXG4gICAgICAgIHZhciBlLCBtLCBjLFxyXG4gICAgICAgICAgICBlTGVuID0gbkJ5dGVzICogOCAtIG1MZW4gLSAxLFxyXG4gICAgICAgICAgICBlTWF4ID0gKDEgPDwgZUxlbikgLSAxLFxyXG4gICAgICAgICAgICBlQmlhcyA9IGVNYXggPj4gMSxcclxuICAgICAgICAgICAgcnQgPSAobUxlbiA9PT0gMjMgPyBNYXRoLnBvdygyLCAtMjQpIC0gTWF0aC5wb3coMiwgLTc3KSA6IDApLFxyXG4gICAgICAgICAgICBpID0gaXNMRSA/IDAgOiAobkJ5dGVzIC0gMSksXHJcbiAgICAgICAgICAgIGQgPSBpc0xFID8gMSA6IC0xLFxyXG4gICAgICAgICAgICBzID0gdmFsdWUgPCAwIHx8ICh2YWx1ZSA9PT0gMCAmJiAxIC8gdmFsdWUgPCAwKSA/IDEgOiAwO1xyXG5cclxuICAgICAgICB2YWx1ZSA9IE1hdGguYWJzKHZhbHVlKTtcclxuXHJcbiAgICAgICAgaWYgKGlzTmFOKHZhbHVlKSB8fCB2YWx1ZSA9PT0gSW5maW5pdHkpIHtcclxuICAgICAgICAgICAgbSA9IGlzTmFOKHZhbHVlKSA/IDEgOiAwO1xyXG4gICAgICAgICAgICBlID0gZU1heDtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBlID0gTWF0aC5mbG9vcihNYXRoLmxvZyh2YWx1ZSkgLyBNYXRoLkxOMik7XHJcbiAgICAgICAgICAgIGlmICh2YWx1ZSAqIChjID0gTWF0aC5wb3coMiwgLWUpKSA8IDEpIHtcclxuICAgICAgICAgICAgICAgIGUtLTtcclxuICAgICAgICAgICAgICAgIGMgKj0gMjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoZSArIGVCaWFzID49IDEpIHtcclxuICAgICAgICAgICAgICAgIHZhbHVlICs9IHJ0IC8gYztcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHZhbHVlICs9IHJ0ICogTWF0aC5wb3coMiwgMSAtIGVCaWFzKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAodmFsdWUgKiBjID49IDIpIHtcclxuICAgICAgICAgICAgICAgIGUrKztcclxuICAgICAgICAgICAgICAgIGMgLz0gMjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGUgKyBlQmlhcyA+PSBlTWF4KSB7XHJcbiAgICAgICAgICAgICAgICBtID0gMDtcclxuICAgICAgICAgICAgICAgIGUgPSBlTWF4O1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGUgKyBlQmlhcyA+PSAxKSB7XHJcbiAgICAgICAgICAgICAgICBtID0gKHZhbHVlICogYyAtIDEpICogTWF0aC5wb3coMiwgbUxlbik7XHJcbiAgICAgICAgICAgICAgICBlID0gZSArIGVCaWFzO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgbSA9IHZhbHVlICogTWF0aC5wb3coMiwgZUJpYXMgLSAxKSAqIE1hdGgucG93KDIsIG1MZW4pO1xyXG4gICAgICAgICAgICAgICAgZSA9IDA7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZvciAoOyBtTGVuID49IDg7IGJ1ZmZlcltvZmZzZXQgKyBpXSA9IG0gJiAweGZmLCBpICs9IGQsIG0gLz0gMjU2LCBtTGVuIC09IDgpIHt9XHJcblxyXG4gICAgICAgIGUgPSAoZSA8PCBtTGVuKSB8IG07XHJcbiAgICAgICAgZUxlbiArPSBtTGVuO1xyXG4gICAgICAgIGZvciAoOyBlTGVuID4gMDsgYnVmZmVyW29mZnNldCArIGldID0gZSAmIDB4ZmYsIGkgKz0gZCwgZSAvPSAyNTYsIGVMZW4gLT0gOCkge31cclxuXHJcbiAgICAgICAgYnVmZmVyW29mZnNldCArIGkgLSBkXSB8PSBzICogMTI4O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogV3JpdGVzIGEgMzJiaXQgZmxvYXQuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgVmFsdWUgdG8gd3JpdGVcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyPX0gb2Zmc2V0IE9mZnNldCB0byB3cml0ZSB0by4gV2lsbCB1c2UgYW5kIGluY3JlYXNlIHtAbGluayBCeXRlQnVmZmVyI29mZnNldH0gYnkgYDRgIGlmIG9taXR0ZWQuXHJcbiAgICAgKiBAcmV0dXJucyB7IUJ5dGVCdWZmZXJ9IHRoaXNcclxuICAgICAqIEBleHBvc2VcclxuICAgICAqL1xyXG4gICAgQnl0ZUJ1ZmZlclByb3RvdHlwZS53cml0ZUZsb2F0MzIgPSBmdW5jdGlvbih2YWx1ZSwgb2Zmc2V0KSB7XHJcbiAgICAgICAgdmFyIHJlbGF0aXZlID0gdHlwZW9mIG9mZnNldCA9PT0gJ3VuZGVmaW5lZCc7XG4gICAgICAgIGlmIChyZWxhdGl2ZSkgb2Zmc2V0ID0gdGhpcy5vZmZzZXQ7XG4gICAgICAgIGlmICghdGhpcy5ub0Fzc2VydCkge1xyXG4gICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnbnVtYmVyJylcclxuICAgICAgICAgICAgICAgIHRocm93IFR5cGVFcnJvcihcIklsbGVnYWwgdmFsdWU6IFwiK3ZhbHVlK1wiIChub3QgYSBudW1iZXIpXCIpO1xyXG4gICAgICAgICAgICBpZiAodHlwZW9mIG9mZnNldCAhPT0gJ251bWJlcicgfHwgb2Zmc2V0ICUgMSAhPT0gMClcbiAgICAgICAgICAgICAgICB0aHJvdyBUeXBlRXJyb3IoXCJJbGxlZ2FsIG9mZnNldDogXCIrb2Zmc2V0K1wiIChub3QgYW4gaW50ZWdlcilcIik7XG4gICAgICAgICAgICBvZmZzZXQgPj4+PSAwO1xuICAgICAgICAgICAgaWYgKG9mZnNldCA8IDAgfHwgb2Zmc2V0ICsgMCA+IHRoaXMuYnVmZmVyLmJ5dGVMZW5ndGgpXG4gICAgICAgICAgICAgICAgdGhyb3cgUmFuZ2VFcnJvcihcIklsbGVnYWwgb2Zmc2V0OiAwIDw9IFwiK29mZnNldCtcIiAoK1wiKzArXCIpIDw9IFwiK3RoaXMuYnVmZmVyLmJ5dGVMZW5ndGgpO1xuICAgICAgICB9XHJcbiAgICAgICAgb2Zmc2V0ICs9IDQ7XG4gICAgICAgIHZhciBjYXBhY2l0eTggPSB0aGlzLmJ1ZmZlci5ieXRlTGVuZ3RoO1xuICAgICAgICBpZiAob2Zmc2V0ID4gY2FwYWNpdHk4KVxuICAgICAgICAgICAgdGhpcy5yZXNpemUoKGNhcGFjaXR5OCAqPSAyKSA+IG9mZnNldCA/IGNhcGFjaXR5OCA6IG9mZnNldCk7XG4gICAgICAgIG9mZnNldCAtPSA0O1xuICAgICAgICBpZWVlNzU0X3dyaXRlKHRoaXMudmlldywgdmFsdWUsIG9mZnNldCwgdGhpcy5saXR0bGVFbmRpYW4sIDIzLCA0KTtcclxuICAgICAgICBpZiAocmVsYXRpdmUpIHRoaXMub2Zmc2V0ICs9IDQ7XG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFdyaXRlcyBhIDMyYml0IGZsb2F0LiBUaGlzIGlzIGFuIGFsaWFzIG9mIHtAbGluayBCeXRlQnVmZmVyI3dyaXRlRmxvYXQzMn0uXHJcbiAgICAgKiBAZnVuY3Rpb25cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSBWYWx1ZSB0byB3cml0ZVxyXG4gICAgICogQHBhcmFtIHtudW1iZXI9fSBvZmZzZXQgT2Zmc2V0IHRvIHdyaXRlIHRvLiBXaWxsIHVzZSBhbmQgaW5jcmVhc2Uge0BsaW5rIEJ5dGVCdWZmZXIjb2Zmc2V0fSBieSBgNGAgaWYgb21pdHRlZC5cclxuICAgICAqIEByZXR1cm5zIHshQnl0ZUJ1ZmZlcn0gdGhpc1xyXG4gICAgICogQGV4cG9zZVxyXG4gICAgICovXHJcbiAgICBCeXRlQnVmZmVyUHJvdG90eXBlLndyaXRlRmxvYXQgPSBCeXRlQnVmZmVyUHJvdG90eXBlLndyaXRlRmxvYXQzMjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlYWRzIGEgMzJiaXQgZmxvYXQuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcj19IG9mZnNldCBPZmZzZXQgdG8gcmVhZCBmcm9tLiBXaWxsIHVzZSBhbmQgaW5jcmVhc2Uge0BsaW5rIEJ5dGVCdWZmZXIjb2Zmc2V0fSBieSBgNGAgaWYgb21pdHRlZC5cclxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9XHJcbiAgICAgKiBAZXhwb3NlXHJcbiAgICAgKi9cclxuICAgIEJ5dGVCdWZmZXJQcm90b3R5cGUucmVhZEZsb2F0MzIgPSBmdW5jdGlvbihvZmZzZXQpIHtcclxuICAgICAgICB2YXIgcmVsYXRpdmUgPSB0eXBlb2Ygb2Zmc2V0ID09PSAndW5kZWZpbmVkJztcbiAgICAgICAgaWYgKHJlbGF0aXZlKSBvZmZzZXQgPSB0aGlzLm9mZnNldDtcbiAgICAgICAgaWYgKCF0aGlzLm5vQXNzZXJ0KSB7XHJcbiAgICAgICAgICAgIGlmICh0eXBlb2Ygb2Zmc2V0ICE9PSAnbnVtYmVyJyB8fCBvZmZzZXQgJSAxICE9PSAwKVxuICAgICAgICAgICAgICAgIHRocm93IFR5cGVFcnJvcihcIklsbGVnYWwgb2Zmc2V0OiBcIitvZmZzZXQrXCIgKG5vdCBhbiBpbnRlZ2VyKVwiKTtcbiAgICAgICAgICAgIG9mZnNldCA+Pj49IDA7XG4gICAgICAgICAgICBpZiAob2Zmc2V0IDwgMCB8fCBvZmZzZXQgKyA0ID4gdGhpcy5idWZmZXIuYnl0ZUxlbmd0aClcbiAgICAgICAgICAgICAgICB0aHJvdyBSYW5nZUVycm9yKFwiSWxsZWdhbCBvZmZzZXQ6IDAgPD0gXCIrb2Zmc2V0K1wiICgrXCIrNCtcIikgPD0gXCIrdGhpcy5idWZmZXIuYnl0ZUxlbmd0aCk7XG4gICAgICAgIH1cclxuICAgICAgICB2YXIgdmFsdWUgPSBpZWVlNzU0X3JlYWQodGhpcy52aWV3LCBvZmZzZXQsIHRoaXMubGl0dGxlRW5kaWFuLCAyMywgNCk7XHJcbiAgICAgICAgaWYgKHJlbGF0aXZlKSB0aGlzLm9mZnNldCArPSA0O1xuICAgICAgICByZXR1cm4gdmFsdWU7XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVhZHMgYSAzMmJpdCBmbG9hdC4gVGhpcyBpcyBhbiBhbGlhcyBvZiB7QGxpbmsgQnl0ZUJ1ZmZlciNyZWFkRmxvYXQzMn0uXHJcbiAgICAgKiBAZnVuY3Rpb25cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyPX0gb2Zmc2V0IE9mZnNldCB0byByZWFkIGZyb20uIFdpbGwgdXNlIGFuZCBpbmNyZWFzZSB7QGxpbmsgQnl0ZUJ1ZmZlciNvZmZzZXR9IGJ5IGA0YCBpZiBvbWl0dGVkLlxyXG4gICAgICogQHJldHVybnMge251bWJlcn1cclxuICAgICAqIEBleHBvc2VcclxuICAgICAqL1xyXG4gICAgQnl0ZUJ1ZmZlclByb3RvdHlwZS5yZWFkRmxvYXQgPSBCeXRlQnVmZmVyUHJvdG90eXBlLnJlYWRGbG9hdDMyO1xyXG5cclxuICAgIC8vIHR5cGVzL2Zsb2F0cy9mbG9hdDY0XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBXcml0ZXMgYSA2NGJpdCBmbG9hdC5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSBWYWx1ZSB0byB3cml0ZVxyXG4gICAgICogQHBhcmFtIHtudW1iZXI9fSBvZmZzZXQgT2Zmc2V0IHRvIHdyaXRlIHRvLiBXaWxsIHVzZSBhbmQgaW5jcmVhc2Uge0BsaW5rIEJ5dGVCdWZmZXIjb2Zmc2V0fSBieSBgOGAgaWYgb21pdHRlZC5cclxuICAgICAqIEByZXR1cm5zIHshQnl0ZUJ1ZmZlcn0gdGhpc1xyXG4gICAgICogQGV4cG9zZVxyXG4gICAgICovXHJcbiAgICBCeXRlQnVmZmVyUHJvdG90eXBlLndyaXRlRmxvYXQ2NCA9IGZ1bmN0aW9uKHZhbHVlLCBvZmZzZXQpIHtcclxuICAgICAgICB2YXIgcmVsYXRpdmUgPSB0eXBlb2Ygb2Zmc2V0ID09PSAndW5kZWZpbmVkJztcbiAgICAgICAgaWYgKHJlbGF0aXZlKSBvZmZzZXQgPSB0aGlzLm9mZnNldDtcbiAgICAgICAgaWYgKCF0aGlzLm5vQXNzZXJ0KSB7XHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdudW1iZXInKVxyXG4gICAgICAgICAgICAgICAgdGhyb3cgVHlwZUVycm9yKFwiSWxsZWdhbCB2YWx1ZTogXCIrdmFsdWUrXCIgKG5vdCBhIG51bWJlcilcIik7XHJcbiAgICAgICAgICAgIGlmICh0eXBlb2Ygb2Zmc2V0ICE9PSAnbnVtYmVyJyB8fCBvZmZzZXQgJSAxICE9PSAwKVxuICAgICAgICAgICAgICAgIHRocm93IFR5cGVFcnJvcihcIklsbGVnYWwgb2Zmc2V0OiBcIitvZmZzZXQrXCIgKG5vdCBhbiBpbnRlZ2VyKVwiKTtcbiAgICAgICAgICAgIG9mZnNldCA+Pj49IDA7XG4gICAgICAgICAgICBpZiAob2Zmc2V0IDwgMCB8fCBvZmZzZXQgKyAwID4gdGhpcy5idWZmZXIuYnl0ZUxlbmd0aClcbiAgICAgICAgICAgICAgICB0aHJvdyBSYW5nZUVycm9yKFwiSWxsZWdhbCBvZmZzZXQ6IDAgPD0gXCIrb2Zmc2V0K1wiICgrXCIrMCtcIikgPD0gXCIrdGhpcy5idWZmZXIuYnl0ZUxlbmd0aCk7XG4gICAgICAgIH1cclxuICAgICAgICBvZmZzZXQgKz0gODtcbiAgICAgICAgdmFyIGNhcGFjaXR5OSA9IHRoaXMuYnVmZmVyLmJ5dGVMZW5ndGg7XG4gICAgICAgIGlmIChvZmZzZXQgPiBjYXBhY2l0eTkpXG4gICAgICAgICAgICB0aGlzLnJlc2l6ZSgoY2FwYWNpdHk5ICo9IDIpID4gb2Zmc2V0ID8gY2FwYWNpdHk5IDogb2Zmc2V0KTtcbiAgICAgICAgb2Zmc2V0IC09IDg7XG4gICAgICAgIGllZWU3NTRfd3JpdGUodGhpcy52aWV3LCB2YWx1ZSwgb2Zmc2V0LCB0aGlzLmxpdHRsZUVuZGlhbiwgNTIsIDgpO1xyXG4gICAgICAgIGlmIChyZWxhdGl2ZSkgdGhpcy5vZmZzZXQgKz0gODtcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogV3JpdGVzIGEgNjRiaXQgZmxvYXQuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIEJ5dGVCdWZmZXIjd3JpdGVGbG9hdDY0fS5cclxuICAgICAqIEBmdW5jdGlvblxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIFZhbHVlIHRvIHdyaXRlXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcj19IG9mZnNldCBPZmZzZXQgdG8gd3JpdGUgdG8uIFdpbGwgdXNlIGFuZCBpbmNyZWFzZSB7QGxpbmsgQnl0ZUJ1ZmZlciNvZmZzZXR9IGJ5IGA4YCBpZiBvbWl0dGVkLlxyXG4gICAgICogQHJldHVybnMgeyFCeXRlQnVmZmVyfSB0aGlzXHJcbiAgICAgKiBAZXhwb3NlXHJcbiAgICAgKi9cclxuICAgIEJ5dGVCdWZmZXJQcm90b3R5cGUud3JpdGVEb3VibGUgPSBCeXRlQnVmZmVyUHJvdG90eXBlLndyaXRlRmxvYXQ2NDtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlYWRzIGEgNjRiaXQgZmxvYXQuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcj19IG9mZnNldCBPZmZzZXQgdG8gcmVhZCBmcm9tLiBXaWxsIHVzZSBhbmQgaW5jcmVhc2Uge0BsaW5rIEJ5dGVCdWZmZXIjb2Zmc2V0fSBieSBgOGAgaWYgb21pdHRlZC5cclxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9XHJcbiAgICAgKiBAZXhwb3NlXHJcbiAgICAgKi9cclxuICAgIEJ5dGVCdWZmZXJQcm90b3R5cGUucmVhZEZsb2F0NjQgPSBmdW5jdGlvbihvZmZzZXQpIHtcclxuICAgICAgICB2YXIgcmVsYXRpdmUgPSB0eXBlb2Ygb2Zmc2V0ID09PSAndW5kZWZpbmVkJztcbiAgICAgICAgaWYgKHJlbGF0aXZlKSBvZmZzZXQgPSB0aGlzLm9mZnNldDtcbiAgICAgICAgaWYgKCF0aGlzLm5vQXNzZXJ0KSB7XHJcbiAgICAgICAgICAgIGlmICh0eXBlb2Ygb2Zmc2V0ICE9PSAnbnVtYmVyJyB8fCBvZmZzZXQgJSAxICE9PSAwKVxuICAgICAgICAgICAgICAgIHRocm93IFR5cGVFcnJvcihcIklsbGVnYWwgb2Zmc2V0OiBcIitvZmZzZXQrXCIgKG5vdCBhbiBpbnRlZ2VyKVwiKTtcbiAgICAgICAgICAgIG9mZnNldCA+Pj49IDA7XG4gICAgICAgICAgICBpZiAob2Zmc2V0IDwgMCB8fCBvZmZzZXQgKyA4ID4gdGhpcy5idWZmZXIuYnl0ZUxlbmd0aClcbiAgICAgICAgICAgICAgICB0aHJvdyBSYW5nZUVycm9yKFwiSWxsZWdhbCBvZmZzZXQ6IDAgPD0gXCIrb2Zmc2V0K1wiICgrXCIrOCtcIikgPD0gXCIrdGhpcy5idWZmZXIuYnl0ZUxlbmd0aCk7XG4gICAgICAgIH1cclxuICAgICAgICB2YXIgdmFsdWUgPSBpZWVlNzU0X3JlYWQodGhpcy52aWV3LCBvZmZzZXQsIHRoaXMubGl0dGxlRW5kaWFuLCA1MiwgOCk7XHJcbiAgICAgICAgaWYgKHJlbGF0aXZlKSB0aGlzLm9mZnNldCArPSA4O1xuICAgICAgICByZXR1cm4gdmFsdWU7XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVhZHMgYSA2NGJpdCBmbG9hdC4gVGhpcyBpcyBhbiBhbGlhcyBvZiB7QGxpbmsgQnl0ZUJ1ZmZlciNyZWFkRmxvYXQ2NH0uXHJcbiAgICAgKiBAZnVuY3Rpb25cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyPX0gb2Zmc2V0IE9mZnNldCB0byByZWFkIGZyb20uIFdpbGwgdXNlIGFuZCBpbmNyZWFzZSB7QGxpbmsgQnl0ZUJ1ZmZlciNvZmZzZXR9IGJ5IGA4YCBpZiBvbWl0dGVkLlxyXG4gICAgICogQHJldHVybnMge251bWJlcn1cclxuICAgICAqIEBleHBvc2VcclxuICAgICAqL1xyXG4gICAgQnl0ZUJ1ZmZlclByb3RvdHlwZS5yZWFkRG91YmxlID0gQnl0ZUJ1ZmZlclByb3RvdHlwZS5yZWFkRmxvYXQ2NDtcclxuXHJcblxyXG4gICAgLy8gdHlwZXMvdmFyaW50cy92YXJpbnQzMlxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgcmVxdWlyZWQgdG8gc3RvcmUgYSAzMmJpdCBiYXNlIDEyOCB2YXJpYWJsZS1sZW5ndGggaW50ZWdlci5cclxuICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgKiBAY29uc3RcclxuICAgICAqIEBleHBvc2VcclxuICAgICAqL1xyXG4gICAgQnl0ZUJ1ZmZlci5NQVhfVkFSSU5UMzJfQllURVMgPSA1O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FsY3VsYXRlcyB0aGUgYWN0dWFsIG51bWJlciBvZiBieXRlcyByZXF1aXJlZCB0byBzdG9yZSBhIDMyYml0IGJhc2UgMTI4IHZhcmlhYmxlLWxlbmd0aCBpbnRlZ2VyLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIFZhbHVlIHRvIGVuY29kZVxyXG4gICAgICogQHJldHVybnMge251bWJlcn0gTnVtYmVyIG9mIGJ5dGVzIHJlcXVpcmVkLiBDYXBwZWQgdG8ge0BsaW5rIEJ5dGVCdWZmZXIuTUFYX1ZBUklOVDMyX0JZVEVTfVxyXG4gICAgICogQGV4cG9zZVxyXG4gICAgICovXHJcbiAgICBCeXRlQnVmZmVyLmNhbGN1bGF0ZVZhcmludDMyID0gZnVuY3Rpb24odmFsdWUpIHtcclxuICAgICAgICAvLyByZWY6IHNyYy9nb29nbGUvcHJvdG9idWYvaW8vY29kZWRfc3RyZWFtLmNjXHJcbiAgICAgICAgdmFsdWUgPSB2YWx1ZSA+Pj4gMDtcclxuICAgICAgICAgICAgIGlmICh2YWx1ZSA8IDEgPDwgNyApIHJldHVybiAxO1xyXG4gICAgICAgIGVsc2UgaWYgKHZhbHVlIDwgMSA8PCAxNCkgcmV0dXJuIDI7XHJcbiAgICAgICAgZWxzZSBpZiAodmFsdWUgPCAxIDw8IDIxKSByZXR1cm4gMztcclxuICAgICAgICBlbHNlIGlmICh2YWx1ZSA8IDEgPDwgMjgpIHJldHVybiA0O1xyXG4gICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDU7XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogWmlnemFnIGVuY29kZXMgYSBzaWduZWQgMzJiaXQgaW50ZWdlciBzbyB0aGF0IGl0IGNhbiBiZSBlZmZlY3RpdmVseSB1c2VkIHdpdGggdmFyaW50IGVuY29kaW5nLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG4gU2lnbmVkIDMyYml0IGludGVnZXJcclxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFVuc2lnbmVkIHppZ3phZyBlbmNvZGVkIDMyYml0IGludGVnZXJcclxuICAgICAqIEBleHBvc2VcclxuICAgICAqL1xyXG4gICAgQnl0ZUJ1ZmZlci56aWdaYWdFbmNvZGUzMiA9IGZ1bmN0aW9uKG4pIHtcclxuICAgICAgICByZXR1cm4gKCgobiB8PSAwKSA8PCAxKSBeIChuID4+IDMxKSkgPj4+IDA7IC8vIHJlZjogc3JjL2dvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdF9saXRlLmhcclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEZWNvZGVzIGEgemlnemFnIGVuY29kZWQgc2lnbmVkIDMyYml0IGludGVnZXIuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbiBVbnNpZ25lZCB6aWd6YWcgZW5jb2RlZCAzMmJpdCBpbnRlZ2VyXHJcbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBTaWduZWQgMzJiaXQgaW50ZWdlclxyXG4gICAgICogQGV4cG9zZVxyXG4gICAgICovXHJcbiAgICBCeXRlQnVmZmVyLnppZ1phZ0RlY29kZTMyID0gZnVuY3Rpb24obikge1xyXG4gICAgICAgIHJldHVybiAoKG4gPj4+IDEpIF4gLShuICYgMSkpIHwgMDsgLy8gLy8gcmVmOiBzcmMvZ29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0X2xpdGUuaFxyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFdyaXRlcyBhIDMyYml0IGJhc2UgMTI4IHZhcmlhYmxlLWxlbmd0aCBpbnRlZ2VyLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIFZhbHVlIHRvIHdyaXRlXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcj19IG9mZnNldCBPZmZzZXQgdG8gd3JpdGUgdG8uIFdpbGwgdXNlIGFuZCBpbmNyZWFzZSB7QGxpbmsgQnl0ZUJ1ZmZlciNvZmZzZXR9IGJ5IHRoZSBudW1iZXIgb2YgYnl0ZXNcclxuICAgICAqICB3cml0dGVuIGlmIG9taXR0ZWQuXHJcbiAgICAgKiBAcmV0dXJucyB7IUJ5dGVCdWZmZXJ8bnVtYmVyfSB0aGlzIGlmIGBvZmZzZXRgIGlzIG9taXR0ZWQsIGVsc2UgdGhlIGFjdHVhbCBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlblxyXG4gICAgICogQGV4cG9zZVxyXG4gICAgICovXHJcbiAgICBCeXRlQnVmZmVyUHJvdG90eXBlLndyaXRlVmFyaW50MzIgPSBmdW5jdGlvbih2YWx1ZSwgb2Zmc2V0KSB7XHJcbiAgICAgICAgdmFyIHJlbGF0aXZlID0gdHlwZW9mIG9mZnNldCA9PT0gJ3VuZGVmaW5lZCc7XG4gICAgICAgIGlmIChyZWxhdGl2ZSkgb2Zmc2V0ID0gdGhpcy5vZmZzZXQ7XG4gICAgICAgIGlmICghdGhpcy5ub0Fzc2VydCkge1xyXG4gICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnbnVtYmVyJyB8fCB2YWx1ZSAlIDEgIT09IDApXG4gICAgICAgICAgICAgICAgdGhyb3cgVHlwZUVycm9yKFwiSWxsZWdhbCB2YWx1ZTogXCIrdmFsdWUrXCIgKG5vdCBhbiBpbnRlZ2VyKVwiKTtcbiAgICAgICAgICAgIHZhbHVlIHw9IDA7XG4gICAgICAgICAgICBpZiAodHlwZW9mIG9mZnNldCAhPT0gJ251bWJlcicgfHwgb2Zmc2V0ICUgMSAhPT0gMClcbiAgICAgICAgICAgICAgICB0aHJvdyBUeXBlRXJyb3IoXCJJbGxlZ2FsIG9mZnNldDogXCIrb2Zmc2V0K1wiIChub3QgYW4gaW50ZWdlcilcIik7XG4gICAgICAgICAgICBvZmZzZXQgPj4+PSAwO1xuICAgICAgICAgICAgaWYgKG9mZnNldCA8IDAgfHwgb2Zmc2V0ICsgMCA+IHRoaXMuYnVmZmVyLmJ5dGVMZW5ndGgpXG4gICAgICAgICAgICAgICAgdGhyb3cgUmFuZ2VFcnJvcihcIklsbGVnYWwgb2Zmc2V0OiAwIDw9IFwiK29mZnNldCtcIiAoK1wiKzArXCIpIDw9IFwiK3RoaXMuYnVmZmVyLmJ5dGVMZW5ndGgpO1xuICAgICAgICB9XHJcbiAgICAgICAgdmFyIHNpemUgPSBCeXRlQnVmZmVyLmNhbGN1bGF0ZVZhcmludDMyKHZhbHVlKSxcclxuICAgICAgICAgICAgYjtcclxuICAgICAgICBvZmZzZXQgKz0gc2l6ZTtcbiAgICAgICAgdmFyIGNhcGFjaXR5MTAgPSB0aGlzLmJ1ZmZlci5ieXRlTGVuZ3RoO1xuICAgICAgICBpZiAob2Zmc2V0ID4gY2FwYWNpdHkxMClcbiAgICAgICAgICAgIHRoaXMucmVzaXplKChjYXBhY2l0eTEwICo9IDIpID4gb2Zmc2V0ID8gY2FwYWNpdHkxMCA6IG9mZnNldCk7XG4gICAgICAgIG9mZnNldCAtPSBzaXplO1xuICAgICAgICB2YWx1ZSA+Pj49IDA7XHJcbiAgICAgICAgd2hpbGUgKHZhbHVlID49IDB4ODApIHtcclxuICAgICAgICAgICAgYiA9ICh2YWx1ZSAmIDB4N2YpIHwgMHg4MDtcclxuICAgICAgICAgICAgdGhpcy52aWV3W29mZnNldCsrXSA9IGI7XHJcbiAgICAgICAgICAgIHZhbHVlID4+Pj0gNztcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy52aWV3W29mZnNldCsrXSA9IHZhbHVlO1xyXG4gICAgICAgIGlmIChyZWxhdGl2ZSkge1xyXG4gICAgICAgICAgICB0aGlzLm9mZnNldCA9IG9mZnNldDtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBzaXplO1xyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFdyaXRlcyBhIHppZy16YWcgZW5jb2RlZCAoc2lnbmVkKSAzMmJpdCBiYXNlIDEyOCB2YXJpYWJsZS1sZW5ndGggaW50ZWdlci5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSBWYWx1ZSB0byB3cml0ZVxyXG4gICAgICogQHBhcmFtIHtudW1iZXI9fSBvZmZzZXQgT2Zmc2V0IHRvIHdyaXRlIHRvLiBXaWxsIHVzZSBhbmQgaW5jcmVhc2Uge0BsaW5rIEJ5dGVCdWZmZXIjb2Zmc2V0fSBieSB0aGUgbnVtYmVyIG9mIGJ5dGVzXHJcbiAgICAgKiAgd3JpdHRlbiBpZiBvbWl0dGVkLlxyXG4gICAgICogQHJldHVybnMgeyFCeXRlQnVmZmVyfG51bWJlcn0gdGhpcyBpZiBgb2Zmc2V0YCBpcyBvbWl0dGVkLCBlbHNlIHRoZSBhY3R1YWwgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW5cclxuICAgICAqIEBleHBvc2VcclxuICAgICAqL1xyXG4gICAgQnl0ZUJ1ZmZlclByb3RvdHlwZS53cml0ZVZhcmludDMyWmlnWmFnID0gZnVuY3Rpb24odmFsdWUsIG9mZnNldCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLndyaXRlVmFyaW50MzIoQnl0ZUJ1ZmZlci56aWdaYWdFbmNvZGUzMih2YWx1ZSksIG9mZnNldCk7XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVhZHMgYSAzMmJpdCBiYXNlIDEyOCB2YXJpYWJsZS1sZW5ndGggaW50ZWdlci5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyPX0gb2Zmc2V0IE9mZnNldCB0byByZWFkIGZyb20uIFdpbGwgdXNlIGFuZCBpbmNyZWFzZSB7QGxpbmsgQnl0ZUJ1ZmZlciNvZmZzZXR9IGJ5IHRoZSBudW1iZXIgb2YgYnl0ZXNcclxuICAgICAqICB3cml0dGVuIGlmIG9taXR0ZWQuXHJcbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfCF7dmFsdWU6IG51bWJlciwgbGVuZ3RoOiBudW1iZXJ9fSBUaGUgdmFsdWUgcmVhZCBpZiBvZmZzZXQgaXMgb21pdHRlZCwgZWxzZSB0aGUgdmFsdWUgcmVhZFxyXG4gICAgICogIGFuZCB0aGUgYWN0dWFsIG51bWJlciBvZiBieXRlcyByZWFkLlxyXG4gICAgICogQHRocm93cyB7RXJyb3J9IElmIGl0J3Mgbm90IGEgdmFsaWQgdmFyaW50LiBIYXMgYSBwcm9wZXJ0eSBgdHJ1bmNhdGVkID0gdHJ1ZWAgaWYgdGhlcmUgaXMgbm90IGVub3VnaCBkYXRhIGF2YWlsYWJsZVxyXG4gICAgICogIHRvIGZ1bGx5IGRlY29kZSB0aGUgdmFyaW50LlxyXG4gICAgICogQGV4cG9zZVxyXG4gICAgICovXHJcbiAgICBCeXRlQnVmZmVyUHJvdG90eXBlLnJlYWRWYXJpbnQzMiA9IGZ1bmN0aW9uKG9mZnNldCkge1xyXG4gICAgICAgIHZhciByZWxhdGl2ZSA9IHR5cGVvZiBvZmZzZXQgPT09ICd1bmRlZmluZWQnO1xuICAgICAgICBpZiAocmVsYXRpdmUpIG9mZnNldCA9IHRoaXMub2Zmc2V0O1xuICAgICAgICBpZiAoIXRoaXMubm9Bc3NlcnQpIHtcclxuICAgICAgICAgICAgaWYgKHR5cGVvZiBvZmZzZXQgIT09ICdudW1iZXInIHx8IG9mZnNldCAlIDEgIT09IDApXG4gICAgICAgICAgICAgICAgdGhyb3cgVHlwZUVycm9yKFwiSWxsZWdhbCBvZmZzZXQ6IFwiK29mZnNldCtcIiAobm90IGFuIGludGVnZXIpXCIpO1xuICAgICAgICAgICAgb2Zmc2V0ID4+Pj0gMDtcbiAgICAgICAgICAgIGlmIChvZmZzZXQgPCAwIHx8IG9mZnNldCArIDEgPiB0aGlzLmJ1ZmZlci5ieXRlTGVuZ3RoKVxuICAgICAgICAgICAgICAgIHRocm93IFJhbmdlRXJyb3IoXCJJbGxlZ2FsIG9mZnNldDogMCA8PSBcIitvZmZzZXQrXCIgKCtcIisxK1wiKSA8PSBcIit0aGlzLmJ1ZmZlci5ieXRlTGVuZ3RoKTtcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciBjID0gMCxcclxuICAgICAgICAgICAgdmFsdWUgPSAwID4+PiAwLFxyXG4gICAgICAgICAgICBiO1xyXG4gICAgICAgIGRvIHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLm5vQXNzZXJ0ICYmIG9mZnNldCA+IHRoaXMubGltaXQpIHtcclxuICAgICAgICAgICAgICAgIHZhciBlcnIgPSBFcnJvcihcIlRydW5jYXRlZFwiKTtcclxuICAgICAgICAgICAgICAgIGVyclsndHJ1bmNhdGVkJ10gPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGIgPSB0aGlzLnZpZXdbb2Zmc2V0KytdO1xyXG4gICAgICAgICAgICBpZiAoYyA8IDUpXHJcbiAgICAgICAgICAgICAgICB2YWx1ZSB8PSAoYiAmIDB4N2YpIDw8ICg3KmMpO1xyXG4gICAgICAgICAgICArK2M7XHJcbiAgICAgICAgfSB3aGlsZSAoKGIgJiAweDgwKSAhPT0gMCk7XHJcbiAgICAgICAgdmFsdWUgfD0gMDtcclxuICAgICAgICBpZiAocmVsYXRpdmUpIHtcclxuICAgICAgICAgICAgdGhpcy5vZmZzZXQgPSBvZmZzZXQ7XHJcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgXCJ2YWx1ZVwiOiB2YWx1ZSxcclxuICAgICAgICAgICAgXCJsZW5ndGhcIjogY1xyXG4gICAgICAgIH07XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVhZHMgYSB6aWctemFnIGVuY29kZWQgKHNpZ25lZCkgMzJiaXQgYmFzZSAxMjggdmFyaWFibGUtbGVuZ3RoIGludGVnZXIuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcj19IG9mZnNldCBPZmZzZXQgdG8gcmVhZCBmcm9tLiBXaWxsIHVzZSBhbmQgaW5jcmVhc2Uge0BsaW5rIEJ5dGVCdWZmZXIjb2Zmc2V0fSBieSB0aGUgbnVtYmVyIG9mIGJ5dGVzXHJcbiAgICAgKiAgd3JpdHRlbiBpZiBvbWl0dGVkLlxyXG4gICAgICogQHJldHVybnMge251bWJlcnwhe3ZhbHVlOiBudW1iZXIsIGxlbmd0aDogbnVtYmVyfX0gVGhlIHZhbHVlIHJlYWQgaWYgb2Zmc2V0IGlzIG9taXR0ZWQsIGVsc2UgdGhlIHZhbHVlIHJlYWRcclxuICAgICAqICBhbmQgdGhlIGFjdHVhbCBudW1iZXIgb2YgYnl0ZXMgcmVhZC5cclxuICAgICAqIEB0aHJvd3Mge0Vycm9yfSBJZiBpdCdzIG5vdCBhIHZhbGlkIHZhcmludFxyXG4gICAgICogQGV4cG9zZVxyXG4gICAgICovXHJcbiAgICBCeXRlQnVmZmVyUHJvdG90eXBlLnJlYWRWYXJpbnQzMlppZ1phZyA9IGZ1bmN0aW9uKG9mZnNldCkge1xyXG4gICAgICAgIHZhciB2YWwgPSB0aGlzLnJlYWRWYXJpbnQzMihvZmZzZXQpO1xyXG4gICAgICAgIGlmICh0eXBlb2YgdmFsID09PSAnb2JqZWN0JylcclxuICAgICAgICAgICAgdmFsW1widmFsdWVcIl0gPSBCeXRlQnVmZmVyLnppZ1phZ0RlY29kZTMyKHZhbFtcInZhbHVlXCJdKTtcclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHZhbCA9IEJ5dGVCdWZmZXIuemlnWmFnRGVjb2RlMzIodmFsKTtcclxuICAgICAgICByZXR1cm4gdmFsO1xyXG4gICAgfTtcclxuXHJcbiAgICAvLyB0eXBlcy92YXJpbnRzL3ZhcmludDY0XHJcblxyXG4gICAgaWYgKExvbmcpIHtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogTWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgcmVxdWlyZWQgdG8gc3RvcmUgYSA2NGJpdCBiYXNlIDEyOCB2YXJpYWJsZS1sZW5ndGggaW50ZWdlci5cclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEBjb25zdFxyXG4gICAgICAgICAqIEBleHBvc2VcclxuICAgICAgICAgKi9cclxuICAgICAgICBCeXRlQnVmZmVyLk1BWF9WQVJJTlQ2NF9CWVRFUyA9IDEwO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBDYWxjdWxhdGVzIHRoZSBhY3R1YWwgbnVtYmVyIG9mIGJ5dGVzIHJlcXVpcmVkIHRvIHN0b3JlIGEgNjRiaXQgYmFzZSAxMjggdmFyaWFibGUtbGVuZ3RoIGludGVnZXIuXHJcbiAgICAgICAgICogQHBhcmFtIHtudW1iZXJ8IUxvbmd9IHZhbHVlIFZhbHVlIHRvIGVuY29kZVxyXG4gICAgICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IE51bWJlciBvZiBieXRlcyByZXF1aXJlZC4gQ2FwcGVkIHRvIHtAbGluayBCeXRlQnVmZmVyLk1BWF9WQVJJTlQ2NF9CWVRFU31cclxuICAgICAgICAgKiBAZXhwb3NlXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgQnl0ZUJ1ZmZlci5jYWxjdWxhdGVWYXJpbnQ2NCA9IGZ1bmN0aW9uKHZhbHVlKSB7XHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKVxuICAgICAgICAgICAgICAgIHZhbHVlID0gTG9uZy5mcm9tTnVtYmVyKHZhbHVlKTtcbiAgICAgICAgICAgIGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpXG4gICAgICAgICAgICAgICAgdmFsdWUgPSBMb25nLmZyb21TdHJpbmcodmFsdWUpO1xuICAgICAgICAgICAgLy8gcmVmOiBzcmMvZ29vZ2xlL3Byb3RvYnVmL2lvL2NvZGVkX3N0cmVhbS5jY1xyXG4gICAgICAgICAgICB2YXIgcGFydDAgPSB2YWx1ZS50b0ludCgpID4+PiAwLFxyXG4gICAgICAgICAgICAgICAgcGFydDEgPSB2YWx1ZS5zaGlmdFJpZ2h0VW5zaWduZWQoMjgpLnRvSW50KCkgPj4+IDAsXHJcbiAgICAgICAgICAgICAgICBwYXJ0MiA9IHZhbHVlLnNoaWZ0UmlnaHRVbnNpZ25lZCg1NikudG9JbnQoKSA+Pj4gMDtcclxuICAgICAgICAgICAgaWYgKHBhcnQyID09IDApIHtcclxuICAgICAgICAgICAgICAgIGlmIChwYXJ0MSA9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhcnQwIDwgMSA8PCAxNClcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhcnQwIDwgMSA8PCA3ID8gMSA6IDI7XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGFydDAgPCAxIDw8IDIxID8gMyA6IDQ7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChwYXJ0MSA8IDEgPDwgMTQpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXJ0MSA8IDEgPDwgNyA/IDUgOiA2O1xyXG4gICAgICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhcnQxIDwgMSA8PCAyMSA/IDcgOiA4O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2VcclxuICAgICAgICAgICAgICAgIHJldHVybiBwYXJ0MiA8IDEgPDwgNyA/IDkgOiAxMDtcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBaaWd6YWcgZW5jb2RlcyBhIHNpZ25lZCA2NGJpdCBpbnRlZ2VyIHNvIHRoYXQgaXQgY2FuIGJlIGVmZmVjdGl2ZWx5IHVzZWQgd2l0aCB2YXJpbnQgZW5jb2RpbmcuXHJcbiAgICAgICAgICogQHBhcmFtIHtudW1iZXJ8IUxvbmd9IHZhbHVlIFNpZ25lZCBsb25nXHJcbiAgICAgICAgICogQHJldHVybnMgeyFMb25nfSBVbnNpZ25lZCB6aWd6YWcgZW5jb2RlZCBsb25nXHJcbiAgICAgICAgICogQGV4cG9zZVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIEJ5dGVCdWZmZXIuemlnWmFnRW5jb2RlNjQgPSBmdW5jdGlvbih2YWx1ZSkge1xyXG4gICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJylcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IExvbmcuZnJvbU51bWJlcih2YWx1ZSwgZmFsc2UpO1xuICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJylcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IExvbmcuZnJvbVN0cmluZyh2YWx1ZSwgZmFsc2UpO1xuICAgICAgICAgICAgZWxzZSBpZiAodmFsdWUudW5zaWduZWQgIT09IGZhbHNlKSB2YWx1ZSA9IHZhbHVlLnRvU2lnbmVkKCk7XG4gICAgICAgICAgICAvLyByZWY6IHNyYy9nb29nbGUvcHJvdG9idWYvd2lyZV9mb3JtYXRfbGl0ZS5oXHJcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZS5zaGlmdExlZnQoMSkueG9yKHZhbHVlLnNoaWZ0UmlnaHQoNjMpKS50b1Vuc2lnbmVkKCk7XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogRGVjb2RlcyBhIHppZ3phZyBlbmNvZGVkIHNpZ25lZCA2NGJpdCBpbnRlZ2VyLlxyXG4gICAgICAgICAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfSB2YWx1ZSBVbnNpZ25lZCB6aWd6YWcgZW5jb2RlZCBsb25nIG9yIEphdmFTY3JpcHQgbnVtYmVyXHJcbiAgICAgICAgICogQHJldHVybnMgeyFMb25nfSBTaWduZWQgbG9uZ1xyXG4gICAgICAgICAqIEBleHBvc2VcclxuICAgICAgICAgKi9cclxuICAgICAgICBCeXRlQnVmZmVyLnppZ1phZ0RlY29kZTY0ID0gZnVuY3Rpb24odmFsdWUpIHtcclxuICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpXG4gICAgICAgICAgICAgICAgdmFsdWUgPSBMb25nLmZyb21OdW1iZXIodmFsdWUsIGZhbHNlKTtcbiAgICAgICAgICAgIGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpXG4gICAgICAgICAgICAgICAgdmFsdWUgPSBMb25nLmZyb21TdHJpbmcodmFsdWUsIGZhbHNlKTtcbiAgICAgICAgICAgIGVsc2UgaWYgKHZhbHVlLnVuc2lnbmVkICE9PSBmYWxzZSkgdmFsdWUgPSB2YWx1ZS50b1NpZ25lZCgpO1xuICAgICAgICAgICAgLy8gcmVmOiBzcmMvZ29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0X2xpdGUuaFxyXG4gICAgICAgICAgICByZXR1cm4gdmFsdWUuc2hpZnRSaWdodFVuc2lnbmVkKDEpLnhvcih2YWx1ZS5hbmQoTG9uZy5PTkUpLnRvU2lnbmVkKCkubmVnYXRlKCkpLnRvU2lnbmVkKCk7XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogV3JpdGVzIGEgNjRiaXQgYmFzZSAxMjggdmFyaWFibGUtbGVuZ3RoIGludGVnZXIuXHJcbiAgICAgICAgICogQHBhcmFtIHtudW1iZXJ8TG9uZ30gdmFsdWUgVmFsdWUgdG8gd3JpdGVcclxuICAgICAgICAgKiBAcGFyYW0ge251bWJlcj19IG9mZnNldCBPZmZzZXQgdG8gd3JpdGUgdG8uIFdpbGwgdXNlIGFuZCBpbmNyZWFzZSB7QGxpbmsgQnl0ZUJ1ZmZlciNvZmZzZXR9IGJ5IHRoZSBudW1iZXIgb2YgYnl0ZXNcclxuICAgICAgICAgKiAgd3JpdHRlbiBpZiBvbWl0dGVkLlxyXG4gICAgICAgICAqIEByZXR1cm5zIHshQnl0ZUJ1ZmZlcnxudW1iZXJ9IGB0aGlzYCBpZiBvZmZzZXQgaXMgb21pdHRlZCwgZWxzZSB0aGUgYWN0dWFsIG51bWJlciBvZiBieXRlcyB3cml0dGVuLlxyXG4gICAgICAgICAqIEBleHBvc2VcclxuICAgICAgICAgKi9cclxuICAgICAgICBCeXRlQnVmZmVyUHJvdG90eXBlLndyaXRlVmFyaW50NjQgPSBmdW5jdGlvbih2YWx1ZSwgb2Zmc2V0KSB7XHJcbiAgICAgICAgICAgIHZhciByZWxhdGl2ZSA9IHR5cGVvZiBvZmZzZXQgPT09ICd1bmRlZmluZWQnO1xuICAgICAgICAgICAgaWYgKHJlbGF0aXZlKSBvZmZzZXQgPSB0aGlzLm9mZnNldDtcbiAgICAgICAgICAgIGlmICghdGhpcy5ub0Fzc2VydCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gTG9uZy5mcm9tTnVtYmVyKHZhbHVlKTtcbiAgICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKVxuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IExvbmcuZnJvbVN0cmluZyh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoISh2YWx1ZSAmJiB2YWx1ZSBpbnN0YW5jZW9mIExvbmcpKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBUeXBlRXJyb3IoXCJJbGxlZ2FsIHZhbHVlOiBcIit2YWx1ZStcIiAobm90IGFuIGludGVnZXIgb3IgTG9uZylcIik7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBvZmZzZXQgIT09ICdudW1iZXInIHx8IG9mZnNldCAlIDEgIT09IDApXG4gICAgICAgICAgICAgICAgICAgIHRocm93IFR5cGVFcnJvcihcIklsbGVnYWwgb2Zmc2V0OiBcIitvZmZzZXQrXCIgKG5vdCBhbiBpbnRlZ2VyKVwiKTtcbiAgICAgICAgICAgICAgICBvZmZzZXQgPj4+PSAwO1xuICAgICAgICAgICAgICAgIGlmIChvZmZzZXQgPCAwIHx8IG9mZnNldCArIDAgPiB0aGlzLmJ1ZmZlci5ieXRlTGVuZ3RoKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBSYW5nZUVycm9yKFwiSWxsZWdhbCBvZmZzZXQ6IDAgPD0gXCIrb2Zmc2V0K1wiICgrXCIrMCtcIikgPD0gXCIrdGhpcy5idWZmZXIuYnl0ZUxlbmd0aCk7XG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKVxuICAgICAgICAgICAgICAgIHZhbHVlID0gTG9uZy5mcm9tTnVtYmVyKHZhbHVlLCBmYWxzZSk7XG4gICAgICAgICAgICBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKVxuICAgICAgICAgICAgICAgIHZhbHVlID0gTG9uZy5mcm9tU3RyaW5nKHZhbHVlLCBmYWxzZSk7XG4gICAgICAgICAgICBlbHNlIGlmICh2YWx1ZS51bnNpZ25lZCAhPT0gZmFsc2UpIHZhbHVlID0gdmFsdWUudG9TaWduZWQoKTtcbiAgICAgICAgICAgIHZhciBzaXplID0gQnl0ZUJ1ZmZlci5jYWxjdWxhdGVWYXJpbnQ2NCh2YWx1ZSksXHJcbiAgICAgICAgICAgICAgICBwYXJ0MCA9IHZhbHVlLnRvSW50KCkgPj4+IDAsXHJcbiAgICAgICAgICAgICAgICBwYXJ0MSA9IHZhbHVlLnNoaWZ0UmlnaHRVbnNpZ25lZCgyOCkudG9JbnQoKSA+Pj4gMCxcclxuICAgICAgICAgICAgICAgIHBhcnQyID0gdmFsdWUuc2hpZnRSaWdodFVuc2lnbmVkKDU2KS50b0ludCgpID4+PiAwO1xyXG4gICAgICAgICAgICBvZmZzZXQgKz0gc2l6ZTtcbiAgICAgICAgICAgIHZhciBjYXBhY2l0eTExID0gdGhpcy5idWZmZXIuYnl0ZUxlbmd0aDtcbiAgICAgICAgICAgIGlmIChvZmZzZXQgPiBjYXBhY2l0eTExKVxuICAgICAgICAgICAgICAgIHRoaXMucmVzaXplKChjYXBhY2l0eTExICo9IDIpID4gb2Zmc2V0ID8gY2FwYWNpdHkxMSA6IG9mZnNldCk7XG4gICAgICAgICAgICBvZmZzZXQgLT0gc2l6ZTtcbiAgICAgICAgICAgIHN3aXRjaCAoc2l6ZSkge1xyXG4gICAgICAgICAgICAgICAgY2FzZSAxMDogdGhpcy52aWV3W29mZnNldCs5XSA9IChwYXJ0MiA+Pj4gIDcpICYgMHgwMTtcclxuICAgICAgICAgICAgICAgIGNhc2UgOSA6IHRoaXMudmlld1tvZmZzZXQrOF0gPSBzaXplICE9PSA5ID8gKHBhcnQyICAgICAgICkgfCAweDgwIDogKHBhcnQyICAgICAgICkgJiAweDdGO1xyXG4gICAgICAgICAgICAgICAgY2FzZSA4IDogdGhpcy52aWV3W29mZnNldCs3XSA9IHNpemUgIT09IDggPyAocGFydDEgPj4+IDIxKSB8IDB4ODAgOiAocGFydDEgPj4+IDIxKSAmIDB4N0Y7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDcgOiB0aGlzLnZpZXdbb2Zmc2V0KzZdID0gc2l6ZSAhPT0gNyA/IChwYXJ0MSA+Pj4gMTQpIHwgMHg4MCA6IChwYXJ0MSA+Pj4gMTQpICYgMHg3RjtcclxuICAgICAgICAgICAgICAgIGNhc2UgNiA6IHRoaXMudmlld1tvZmZzZXQrNV0gPSBzaXplICE9PSA2ID8gKHBhcnQxID4+PiAgNykgfCAweDgwIDogKHBhcnQxID4+PiAgNykgJiAweDdGO1xyXG4gICAgICAgICAgICAgICAgY2FzZSA1IDogdGhpcy52aWV3W29mZnNldCs0XSA9IHNpemUgIT09IDUgPyAocGFydDEgICAgICAgKSB8IDB4ODAgOiAocGFydDEgICAgICAgKSAmIDB4N0Y7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDQgOiB0aGlzLnZpZXdbb2Zmc2V0KzNdID0gc2l6ZSAhPT0gNCA/IChwYXJ0MCA+Pj4gMjEpIHwgMHg4MCA6IChwYXJ0MCA+Pj4gMjEpICYgMHg3RjtcclxuICAgICAgICAgICAgICAgIGNhc2UgMyA6IHRoaXMudmlld1tvZmZzZXQrMl0gPSBzaXplICE9PSAzID8gKHBhcnQwID4+PiAxNCkgfCAweDgwIDogKHBhcnQwID4+PiAxNCkgJiAweDdGO1xyXG4gICAgICAgICAgICAgICAgY2FzZSAyIDogdGhpcy52aWV3W29mZnNldCsxXSA9IHNpemUgIT09IDIgPyAocGFydDAgPj4+ICA3KSB8IDB4ODAgOiAocGFydDAgPj4+ICA3KSAmIDB4N0Y7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDEgOiB0aGlzLnZpZXdbb2Zmc2V0ICBdID0gc2l6ZSAhPT0gMSA/IChwYXJ0MCAgICAgICApIHwgMHg4MCA6IChwYXJ0MCAgICAgICApICYgMHg3RjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAocmVsYXRpdmUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMub2Zmc2V0ICs9IHNpemU7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcztcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBzaXplO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogV3JpdGVzIGEgemlnLXphZyBlbmNvZGVkIDY0Yml0IGJhc2UgMTI4IHZhcmlhYmxlLWxlbmd0aCBpbnRlZ2VyLlxyXG4gICAgICAgICAqIEBwYXJhbSB7bnVtYmVyfExvbmd9IHZhbHVlIFZhbHVlIHRvIHdyaXRlXHJcbiAgICAgICAgICogQHBhcmFtIHtudW1iZXI9fSBvZmZzZXQgT2Zmc2V0IHRvIHdyaXRlIHRvLiBXaWxsIHVzZSBhbmQgaW5jcmVhc2Uge0BsaW5rIEJ5dGVCdWZmZXIjb2Zmc2V0fSBieSB0aGUgbnVtYmVyIG9mIGJ5dGVzXHJcbiAgICAgICAgICogIHdyaXR0ZW4gaWYgb21pdHRlZC5cclxuICAgICAgICAgKiBAcmV0dXJucyB7IUJ5dGVCdWZmZXJ8bnVtYmVyfSBgdGhpc2AgaWYgb2Zmc2V0IGlzIG9taXR0ZWQsIGVsc2UgdGhlIGFjdHVhbCBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbi5cclxuICAgICAgICAgKiBAZXhwb3NlXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgQnl0ZUJ1ZmZlclByb3RvdHlwZS53cml0ZVZhcmludDY0WmlnWmFnID0gZnVuY3Rpb24odmFsdWUsIG9mZnNldCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy53cml0ZVZhcmludDY0KEJ5dGVCdWZmZXIuemlnWmFnRW5jb2RlNjQodmFsdWUpLCBvZmZzZXQpO1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFJlYWRzIGEgNjRiaXQgYmFzZSAxMjggdmFyaWFibGUtbGVuZ3RoIGludGVnZXIuIFJlcXVpcmVzIExvbmcuanMuXHJcbiAgICAgICAgICogQHBhcmFtIHtudW1iZXI9fSBvZmZzZXQgT2Zmc2V0IHRvIHJlYWQgZnJvbS4gV2lsbCB1c2UgYW5kIGluY3JlYXNlIHtAbGluayBCeXRlQnVmZmVyI29mZnNldH0gYnkgdGhlIG51bWJlciBvZiBieXRlc1xyXG4gICAgICAgICAqICByZWFkIGlmIG9taXR0ZWQuXHJcbiAgICAgICAgICogQHJldHVybnMgeyFMb25nfCF7dmFsdWU6IExvbmcsIGxlbmd0aDogbnVtYmVyfX0gVGhlIHZhbHVlIHJlYWQgaWYgb2Zmc2V0IGlzIG9taXR0ZWQsIGVsc2UgdGhlIHZhbHVlIHJlYWQgYW5kXHJcbiAgICAgICAgICogIHRoZSBhY3R1YWwgbnVtYmVyIG9mIGJ5dGVzIHJlYWQuXHJcbiAgICAgICAgICogQHRocm93cyB7RXJyb3J9IElmIGl0J3Mgbm90IGEgdmFsaWQgdmFyaW50XHJcbiAgICAgICAgICogQGV4cG9zZVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIEJ5dGVCdWZmZXJQcm90b3R5cGUucmVhZFZhcmludDY0ID0gZnVuY3Rpb24ob2Zmc2V0KSB7XHJcbiAgICAgICAgICAgIHZhciByZWxhdGl2ZSA9IHR5cGVvZiBvZmZzZXQgPT09ICd1bmRlZmluZWQnO1xuICAgICAgICAgICAgaWYgKHJlbGF0aXZlKSBvZmZzZXQgPSB0aGlzLm9mZnNldDtcbiAgICAgICAgICAgIGlmICghdGhpcy5ub0Fzc2VydCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBvZmZzZXQgIT09ICdudW1iZXInIHx8IG9mZnNldCAlIDEgIT09IDApXG4gICAgICAgICAgICAgICAgICAgIHRocm93IFR5cGVFcnJvcihcIklsbGVnYWwgb2Zmc2V0OiBcIitvZmZzZXQrXCIgKG5vdCBhbiBpbnRlZ2VyKVwiKTtcbiAgICAgICAgICAgICAgICBvZmZzZXQgPj4+PSAwO1xuICAgICAgICAgICAgICAgIGlmIChvZmZzZXQgPCAwIHx8IG9mZnNldCArIDEgPiB0aGlzLmJ1ZmZlci5ieXRlTGVuZ3RoKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBSYW5nZUVycm9yKFwiSWxsZWdhbCBvZmZzZXQ6IDAgPD0gXCIrb2Zmc2V0K1wiICgrXCIrMStcIikgPD0gXCIrdGhpcy5idWZmZXIuYnl0ZUxlbmd0aCk7XG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vIHJlZjogc3JjL2dvb2dsZS9wcm90b2J1Zi9pby9jb2RlZF9zdHJlYW0uY2NcclxuICAgICAgICAgICAgdmFyIHN0YXJ0ID0gb2Zmc2V0LFxyXG4gICAgICAgICAgICAgICAgcGFydDAgPSAwLFxyXG4gICAgICAgICAgICAgICAgcGFydDEgPSAwLFxyXG4gICAgICAgICAgICAgICAgcGFydDIgPSAwLFxyXG4gICAgICAgICAgICAgICAgYiAgPSAwO1xyXG4gICAgICAgICAgICBiID0gdGhpcy52aWV3W29mZnNldCsrXTsgcGFydDAgID0gKGIgJiAweDdGKSAgICAgIDsgaWYgKCBiICYgMHg4MCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICBiID0gdGhpcy52aWV3W29mZnNldCsrXTsgcGFydDAgfD0gKGIgJiAweDdGKSA8PCAgNzsgaWYgKChiICYgMHg4MCkgfHwgKHRoaXMubm9Bc3NlcnQgJiYgdHlwZW9mIGIgPT09ICd1bmRlZmluZWQnKSkge1xyXG4gICAgICAgICAgICBiID0gdGhpcy52aWV3W29mZnNldCsrXTsgcGFydDAgfD0gKGIgJiAweDdGKSA8PCAxNDsgaWYgKChiICYgMHg4MCkgfHwgKHRoaXMubm9Bc3NlcnQgJiYgdHlwZW9mIGIgPT09ICd1bmRlZmluZWQnKSkge1xyXG4gICAgICAgICAgICBiID0gdGhpcy52aWV3W29mZnNldCsrXTsgcGFydDAgfD0gKGIgJiAweDdGKSA8PCAyMTsgaWYgKChiICYgMHg4MCkgfHwgKHRoaXMubm9Bc3NlcnQgJiYgdHlwZW9mIGIgPT09ICd1bmRlZmluZWQnKSkge1xyXG4gICAgICAgICAgICBiID0gdGhpcy52aWV3W29mZnNldCsrXTsgcGFydDEgID0gKGIgJiAweDdGKSAgICAgIDsgaWYgKChiICYgMHg4MCkgfHwgKHRoaXMubm9Bc3NlcnQgJiYgdHlwZW9mIGIgPT09ICd1bmRlZmluZWQnKSkge1xyXG4gICAgICAgICAgICBiID0gdGhpcy52aWV3W29mZnNldCsrXTsgcGFydDEgfD0gKGIgJiAweDdGKSA8PCAgNzsgaWYgKChiICYgMHg4MCkgfHwgKHRoaXMubm9Bc3NlcnQgJiYgdHlwZW9mIGIgPT09ICd1bmRlZmluZWQnKSkge1xyXG4gICAgICAgICAgICBiID0gdGhpcy52aWV3W29mZnNldCsrXTsgcGFydDEgfD0gKGIgJiAweDdGKSA8PCAxNDsgaWYgKChiICYgMHg4MCkgfHwgKHRoaXMubm9Bc3NlcnQgJiYgdHlwZW9mIGIgPT09ICd1bmRlZmluZWQnKSkge1xyXG4gICAgICAgICAgICBiID0gdGhpcy52aWV3W29mZnNldCsrXTsgcGFydDEgfD0gKGIgJiAweDdGKSA8PCAyMTsgaWYgKChiICYgMHg4MCkgfHwgKHRoaXMubm9Bc3NlcnQgJiYgdHlwZW9mIGIgPT09ICd1bmRlZmluZWQnKSkge1xyXG4gICAgICAgICAgICBiID0gdGhpcy52aWV3W29mZnNldCsrXTsgcGFydDIgID0gKGIgJiAweDdGKSAgICAgIDsgaWYgKChiICYgMHg4MCkgfHwgKHRoaXMubm9Bc3NlcnQgJiYgdHlwZW9mIGIgPT09ICd1bmRlZmluZWQnKSkge1xyXG4gICAgICAgICAgICBiID0gdGhpcy52aWV3W29mZnNldCsrXTsgcGFydDIgfD0gKGIgJiAweDdGKSA8PCAgNzsgaWYgKChiICYgMHg4MCkgfHwgKHRoaXMubm9Bc3NlcnQgJiYgdHlwZW9mIGIgPT09ICd1bmRlZmluZWQnKSkge1xyXG4gICAgICAgICAgICB0aHJvdyBFcnJvcihcIkJ1ZmZlciBvdmVycnVuXCIpOyB9fX19fX19fX19XHJcbiAgICAgICAgICAgIHZhciB2YWx1ZSA9IExvbmcuZnJvbUJpdHMocGFydDAgfCAocGFydDEgPDwgMjgpLCAocGFydDEgPj4+IDQpIHwgKHBhcnQyKSA8PCAyNCwgZmFsc2UpO1xyXG4gICAgICAgICAgICBpZiAocmVsYXRpdmUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMub2Zmc2V0ID0gb2Zmc2V0O1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgICAgICAndmFsdWUnOiB2YWx1ZSxcclxuICAgICAgICAgICAgICAgICAgICAnbGVuZ3RoJzogb2Zmc2V0LXN0YXJ0XHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogUmVhZHMgYSB6aWctemFnIGVuY29kZWQgNjRiaXQgYmFzZSAxMjggdmFyaWFibGUtbGVuZ3RoIGludGVnZXIuIFJlcXVpcmVzIExvbmcuanMuXHJcbiAgICAgICAgICogQHBhcmFtIHtudW1iZXI9fSBvZmZzZXQgT2Zmc2V0IHRvIHJlYWQgZnJvbS4gV2lsbCB1c2UgYW5kIGluY3JlYXNlIHtAbGluayBCeXRlQnVmZmVyI29mZnNldH0gYnkgdGhlIG51bWJlciBvZiBieXRlc1xyXG4gICAgICAgICAqICByZWFkIGlmIG9taXR0ZWQuXHJcbiAgICAgICAgICogQHJldHVybnMgeyFMb25nfCF7dmFsdWU6IExvbmcsIGxlbmd0aDogbnVtYmVyfX0gVGhlIHZhbHVlIHJlYWQgaWYgb2Zmc2V0IGlzIG9taXR0ZWQsIGVsc2UgdGhlIHZhbHVlIHJlYWQgYW5kXHJcbiAgICAgICAgICogIHRoZSBhY3R1YWwgbnVtYmVyIG9mIGJ5dGVzIHJlYWQuXHJcbiAgICAgICAgICogQHRocm93cyB7RXJyb3J9IElmIGl0J3Mgbm90IGEgdmFsaWQgdmFyaW50XHJcbiAgICAgICAgICogQGV4cG9zZVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIEJ5dGVCdWZmZXJQcm90b3R5cGUucmVhZFZhcmludDY0WmlnWmFnID0gZnVuY3Rpb24ob2Zmc2V0KSB7XHJcbiAgICAgICAgICAgIHZhciB2YWwgPSB0aGlzLnJlYWRWYXJpbnQ2NChvZmZzZXQpO1xyXG4gICAgICAgICAgICBpZiAodmFsICYmIHZhbFsndmFsdWUnXSBpbnN0YW5jZW9mIExvbmcpXHJcbiAgICAgICAgICAgICAgICB2YWxbXCJ2YWx1ZVwiXSA9IEJ5dGVCdWZmZXIuemlnWmFnRGVjb2RlNjQodmFsW1widmFsdWVcIl0pO1xyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICB2YWwgPSBCeXRlQnVmZmVyLnppZ1phZ0RlY29kZTY0KHZhbCk7XHJcbiAgICAgICAgICAgIHJldHVybiB2YWw7XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICB9IC8vIExvbmdcclxuXHJcblxyXG4gICAgLy8gdHlwZXMvc3RyaW5ncy9jc3RyaW5nXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBXcml0ZXMgYSBOVUxMLXRlcm1pbmF0ZWQgVVRGOCBlbmNvZGVkIHN0cmluZy4gRm9yIHRoaXMgdG8gd29yayB0aGUgc3BlY2lmaWVkIHN0cmluZyBtdXN0IG5vdCBjb250YWluIGFueSBOVUxMXHJcbiAgICAgKiAgY2hhcmFjdGVycyBpdHNlbGYuXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyIFN0cmluZyB0byB3cml0ZVxyXG4gICAgICogQHBhcmFtIHtudW1iZXI9fSBvZmZzZXQgT2Zmc2V0IHRvIHdyaXRlIHRvLiBXaWxsIHVzZSBhbmQgaW5jcmVhc2Uge0BsaW5rIEJ5dGVCdWZmZXIjb2Zmc2V0fSBieSB0aGUgbnVtYmVyIG9mIGJ5dGVzXHJcbiAgICAgKiAgY29udGFpbmVkIGluIGBzdHJgICsgMSBpZiBvbWl0dGVkLlxyXG4gICAgICogQHJldHVybnMgeyFCeXRlQnVmZmVyfG51bWJlcn0gdGhpcyBpZiBvZmZzZXQgaXMgb21pdHRlZCwgZWxzZSB0aGUgYWN0dWFsIG51bWJlciBvZiBieXRlcyB3cml0dGVuXHJcbiAgICAgKiBAZXhwb3NlXHJcbiAgICAgKi9cclxuICAgIEJ5dGVCdWZmZXJQcm90b3R5cGUud3JpdGVDU3RyaW5nID0gZnVuY3Rpb24oc3RyLCBvZmZzZXQpIHtcclxuICAgICAgICB2YXIgcmVsYXRpdmUgPSB0eXBlb2Ygb2Zmc2V0ID09PSAndW5kZWZpbmVkJztcbiAgICAgICAgaWYgKHJlbGF0aXZlKSBvZmZzZXQgPSB0aGlzLm9mZnNldDtcbiAgICAgICAgdmFyIGksXHJcbiAgICAgICAgICAgIGsgPSBzdHIubGVuZ3RoO1xyXG4gICAgICAgIGlmICghdGhpcy5ub0Fzc2VydCkge1xyXG4gICAgICAgICAgICBpZiAodHlwZW9mIHN0ciAhPT0gJ3N0cmluZycpXHJcbiAgICAgICAgICAgICAgICB0aHJvdyBUeXBlRXJyb3IoXCJJbGxlZ2FsIHN0cjogTm90IGEgc3RyaW5nXCIpO1xyXG4gICAgICAgICAgICBmb3IgKGk9MDsgaTxrOyArK2kpIHtcclxuICAgICAgICAgICAgICAgIGlmIChzdHIuY2hhckNvZGVBdChpKSA9PT0gMClcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBSYW5nZUVycm9yKFwiSWxsZWdhbCBzdHI6IENvbnRhaW5zIE5VTEwtY2hhcmFjdGVyc1wiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAodHlwZW9mIG9mZnNldCAhPT0gJ251bWJlcicgfHwgb2Zmc2V0ICUgMSAhPT0gMClcbiAgICAgICAgICAgICAgICB0aHJvdyBUeXBlRXJyb3IoXCJJbGxlZ2FsIG9mZnNldDogXCIrb2Zmc2V0K1wiIChub3QgYW4gaW50ZWdlcilcIik7XG4gICAgICAgICAgICBvZmZzZXQgPj4+PSAwO1xuICAgICAgICAgICAgaWYgKG9mZnNldCA8IDAgfHwgb2Zmc2V0ICsgMCA+IHRoaXMuYnVmZmVyLmJ5dGVMZW5ndGgpXG4gICAgICAgICAgICAgICAgdGhyb3cgUmFuZ2VFcnJvcihcIklsbGVnYWwgb2Zmc2V0OiAwIDw9IFwiK29mZnNldCtcIiAoK1wiKzArXCIpIDw9IFwiK3RoaXMuYnVmZmVyLmJ5dGVMZW5ndGgpO1xuICAgICAgICB9XHJcbiAgICAgICAgLy8gVVRGOCBzdHJpbmdzIGRvIG5vdCBjb250YWluIHplcm8gYnl0ZXMgaW4gYmV0d2VlbiBleGNlcHQgZm9yIHRoZSB6ZXJvIGNoYXJhY3Rlciwgc286XHJcbiAgICAgICAgayA9IHV0ZnguY2FsY3VsYXRlVVRGMTZhc1VURjgoc3RyaW5nU291cmNlKHN0cikpWzFdO1xyXG4gICAgICAgIG9mZnNldCArPSBrKzE7XG4gICAgICAgIHZhciBjYXBhY2l0eTEyID0gdGhpcy5idWZmZXIuYnl0ZUxlbmd0aDtcbiAgICAgICAgaWYgKG9mZnNldCA+IGNhcGFjaXR5MTIpXG4gICAgICAgICAgICB0aGlzLnJlc2l6ZSgoY2FwYWNpdHkxMiAqPSAyKSA+IG9mZnNldCA/IGNhcGFjaXR5MTIgOiBvZmZzZXQpO1xuICAgICAgICBvZmZzZXQgLT0gaysxO1xuICAgICAgICB1dGZ4LmVuY29kZVVURjE2dG9VVEY4KHN0cmluZ1NvdXJjZShzdHIpLCBmdW5jdGlvbihiKSB7XHJcbiAgICAgICAgICAgIHRoaXMudmlld1tvZmZzZXQrK10gPSBiO1xyXG4gICAgICAgIH0uYmluZCh0aGlzKSk7XHJcbiAgICAgICAgdGhpcy52aWV3W29mZnNldCsrXSA9IDA7XHJcbiAgICAgICAgaWYgKHJlbGF0aXZlKSB7XHJcbiAgICAgICAgICAgIHRoaXMub2Zmc2V0ID0gb2Zmc2V0O1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGs7XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVhZHMgYSBOVUxMLXRlcm1pbmF0ZWQgVVRGOCBlbmNvZGVkIHN0cmluZy4gRm9yIHRoaXMgdG8gd29yayB0aGUgc3RyaW5nIHJlYWQgbXVzdCBub3QgY29udGFpbiBhbnkgTlVMTCBjaGFyYWN0ZXJzXHJcbiAgICAgKiAgaXRzZWxmLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXI9fSBvZmZzZXQgT2Zmc2V0IHRvIHJlYWQgZnJvbS4gV2lsbCB1c2UgYW5kIGluY3JlYXNlIHtAbGluayBCeXRlQnVmZmVyI29mZnNldH0gYnkgdGhlIG51bWJlciBvZiBieXRlc1xyXG4gICAgICogIHJlYWQgaWYgb21pdHRlZC5cclxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd8IXtzdHJpbmc6IHN0cmluZywgbGVuZ3RoOiBudW1iZXJ9fSBUaGUgc3RyaW5nIHJlYWQgaWYgb2Zmc2V0IGlzIG9taXR0ZWQsIGVsc2UgdGhlIHN0cmluZ1xyXG4gICAgICogIHJlYWQgYW5kIHRoZSBhY3R1YWwgbnVtYmVyIG9mIGJ5dGVzIHJlYWQuXHJcbiAgICAgKiBAZXhwb3NlXHJcbiAgICAgKi9cclxuICAgIEJ5dGVCdWZmZXJQcm90b3R5cGUucmVhZENTdHJpbmcgPSBmdW5jdGlvbihvZmZzZXQpIHtcclxuICAgICAgICB2YXIgcmVsYXRpdmUgPSB0eXBlb2Ygb2Zmc2V0ID09PSAndW5kZWZpbmVkJztcbiAgICAgICAgaWYgKHJlbGF0aXZlKSBvZmZzZXQgPSB0aGlzLm9mZnNldDtcbiAgICAgICAgaWYgKCF0aGlzLm5vQXNzZXJ0KSB7XHJcbiAgICAgICAgICAgIGlmICh0eXBlb2Ygb2Zmc2V0ICE9PSAnbnVtYmVyJyB8fCBvZmZzZXQgJSAxICE9PSAwKVxuICAgICAgICAgICAgICAgIHRocm93IFR5cGVFcnJvcihcIklsbGVnYWwgb2Zmc2V0OiBcIitvZmZzZXQrXCIgKG5vdCBhbiBpbnRlZ2VyKVwiKTtcbiAgICAgICAgICAgIG9mZnNldCA+Pj49IDA7XG4gICAgICAgICAgICBpZiAob2Zmc2V0IDwgMCB8fCBvZmZzZXQgKyAxID4gdGhpcy5idWZmZXIuYnl0ZUxlbmd0aClcbiAgICAgICAgICAgICAgICB0aHJvdyBSYW5nZUVycm9yKFwiSWxsZWdhbCBvZmZzZXQ6IDAgPD0gXCIrb2Zmc2V0K1wiICgrXCIrMStcIikgPD0gXCIrdGhpcy5idWZmZXIuYnl0ZUxlbmd0aCk7XG4gICAgICAgIH1cclxuICAgICAgICB2YXIgc3RhcnQgPSBvZmZzZXQsXHJcbiAgICAgICAgICAgIHRlbXA7XHJcbiAgICAgICAgLy8gVVRGOCBzdHJpbmdzIGRvIG5vdCBjb250YWluIHplcm8gYnl0ZXMgaW4gYmV0d2VlbiBleGNlcHQgZm9yIHRoZSB6ZXJvIGNoYXJhY3RlciBpdHNlbGYsIHNvOlxyXG4gICAgICAgIHZhciBzZCwgYiA9IC0xO1xyXG4gICAgICAgIHV0ZnguZGVjb2RlVVRGOHRvVVRGMTYoZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgIGlmIChiID09PSAwKSByZXR1cm4gbnVsbDtcclxuICAgICAgICAgICAgaWYgKG9mZnNldCA+PSB0aGlzLmxpbWl0KVxyXG4gICAgICAgICAgICAgICAgdGhyb3cgUmFuZ2VFcnJvcihcIklsbGVnYWwgcmFuZ2U6IFRydW5jYXRlZCBkYXRhLCBcIitvZmZzZXQrXCIgPCBcIit0aGlzLmxpbWl0KTtcclxuICAgICAgICAgICAgYiA9IHRoaXMudmlld1tvZmZzZXQrK107XHJcbiAgICAgICAgICAgIHJldHVybiBiID09PSAwID8gbnVsbCA6IGI7XHJcbiAgICAgICAgfS5iaW5kKHRoaXMpLCBzZCA9IHN0cmluZ0Rlc3RpbmF0aW9uKCksIHRydWUpO1xyXG4gICAgICAgIGlmIChyZWxhdGl2ZSkge1xyXG4gICAgICAgICAgICB0aGlzLm9mZnNldCA9IG9mZnNldDtcclxuICAgICAgICAgICAgcmV0dXJuIHNkKCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIFwic3RyaW5nXCI6IHNkKCksXHJcbiAgICAgICAgICAgICAgICBcImxlbmd0aFwiOiBvZmZzZXQgLSBzdGFydFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgLy8gdHlwZXMvc3RyaW5ncy9pc3RyaW5nXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBXcml0ZXMgYSBsZW5ndGggYXMgdWludDMyIHByZWZpeGVkIFVURjggZW5jb2RlZCBzdHJpbmcuXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyIFN0cmluZyB0byB3cml0ZVxyXG4gICAgICogQHBhcmFtIHtudW1iZXI9fSBvZmZzZXQgT2Zmc2V0IHRvIHdyaXRlIHRvLiBXaWxsIHVzZSBhbmQgaW5jcmVhc2Uge0BsaW5rIEJ5dGVCdWZmZXIjb2Zmc2V0fSBieSB0aGUgbnVtYmVyIG9mIGJ5dGVzXHJcbiAgICAgKiAgd3JpdHRlbiBpZiBvbWl0dGVkLlxyXG4gICAgICogQHJldHVybnMgeyFCeXRlQnVmZmVyfG51bWJlcn0gYHRoaXNgIGlmIGBvZmZzZXRgIGlzIG9taXR0ZWQsIGVsc2UgdGhlIGFjdHVhbCBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlblxyXG4gICAgICogQGV4cG9zZVxyXG4gICAgICogQHNlZSBCeXRlQnVmZmVyI3dyaXRlVmFyaW50MzJcclxuICAgICAqL1xyXG4gICAgQnl0ZUJ1ZmZlclByb3RvdHlwZS53cml0ZUlTdHJpbmcgPSBmdW5jdGlvbihzdHIsIG9mZnNldCkge1xyXG4gICAgICAgIHZhciByZWxhdGl2ZSA9IHR5cGVvZiBvZmZzZXQgPT09ICd1bmRlZmluZWQnO1xuICAgICAgICBpZiAocmVsYXRpdmUpIG9mZnNldCA9IHRoaXMub2Zmc2V0O1xuICAgICAgICBpZiAoIXRoaXMubm9Bc3NlcnQpIHtcclxuICAgICAgICAgICAgaWYgKHR5cGVvZiBzdHIgIT09ICdzdHJpbmcnKVxyXG4gICAgICAgICAgICAgICAgdGhyb3cgVHlwZUVycm9yKFwiSWxsZWdhbCBzdHI6IE5vdCBhIHN0cmluZ1wiKTtcclxuICAgICAgICAgICAgaWYgKHR5cGVvZiBvZmZzZXQgIT09ICdudW1iZXInIHx8IG9mZnNldCAlIDEgIT09IDApXG4gICAgICAgICAgICAgICAgdGhyb3cgVHlwZUVycm9yKFwiSWxsZWdhbCBvZmZzZXQ6IFwiK29mZnNldCtcIiAobm90IGFuIGludGVnZXIpXCIpO1xuICAgICAgICAgICAgb2Zmc2V0ID4+Pj0gMDtcbiAgICAgICAgICAgIGlmIChvZmZzZXQgPCAwIHx8IG9mZnNldCArIDAgPiB0aGlzLmJ1ZmZlci5ieXRlTGVuZ3RoKVxuICAgICAgICAgICAgICAgIHRocm93IFJhbmdlRXJyb3IoXCJJbGxlZ2FsIG9mZnNldDogMCA8PSBcIitvZmZzZXQrXCIgKCtcIiswK1wiKSA8PSBcIit0aGlzLmJ1ZmZlci5ieXRlTGVuZ3RoKTtcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciBzdGFydCA9IG9mZnNldCxcclxuICAgICAgICAgICAgaztcclxuICAgICAgICBrID0gdXRmeC5jYWxjdWxhdGVVVEYxNmFzVVRGOChzdHJpbmdTb3VyY2Uoc3RyKSwgdGhpcy5ub0Fzc2VydClbMV07XHJcbiAgICAgICAgb2Zmc2V0ICs9IDQraztcbiAgICAgICAgdmFyIGNhcGFjaXR5MTMgPSB0aGlzLmJ1ZmZlci5ieXRlTGVuZ3RoO1xuICAgICAgICBpZiAob2Zmc2V0ID4gY2FwYWNpdHkxMylcbiAgICAgICAgICAgIHRoaXMucmVzaXplKChjYXBhY2l0eTEzICo9IDIpID4gb2Zmc2V0ID8gY2FwYWNpdHkxMyA6IG9mZnNldCk7XG4gICAgICAgIG9mZnNldCAtPSA0K2s7XG4gICAgICAgIGlmICh0aGlzLmxpdHRsZUVuZGlhbikge1xuICAgICAgICAgICAgdGhpcy52aWV3W29mZnNldCszXSA9IChrID4+PiAyNCkgJiAweEZGO1xuICAgICAgICAgICAgdGhpcy52aWV3W29mZnNldCsyXSA9IChrID4+PiAxNikgJiAweEZGO1xuICAgICAgICAgICAgdGhpcy52aWV3W29mZnNldCsxXSA9IChrID4+PiAgOCkgJiAweEZGO1xuICAgICAgICAgICAgdGhpcy52aWV3W29mZnNldCAgXSA9ICBrICAgICAgICAgJiAweEZGO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy52aWV3W29mZnNldCAgXSA9IChrID4+PiAyNCkgJiAweEZGO1xuICAgICAgICAgICAgdGhpcy52aWV3W29mZnNldCsxXSA9IChrID4+PiAxNikgJiAweEZGO1xuICAgICAgICAgICAgdGhpcy52aWV3W29mZnNldCsyXSA9IChrID4+PiAgOCkgJiAweEZGO1xuICAgICAgICAgICAgdGhpcy52aWV3W29mZnNldCszXSA9ICBrICAgICAgICAgJiAweEZGO1xuICAgICAgICB9XG4gICAgICAgIG9mZnNldCArPSA0O1xyXG4gICAgICAgIHV0ZnguZW5jb2RlVVRGMTZ0b1VURjgoc3RyaW5nU291cmNlKHN0ciksIGZ1bmN0aW9uKGIpIHtcclxuICAgICAgICAgICAgdGhpcy52aWV3W29mZnNldCsrXSA9IGI7XHJcbiAgICAgICAgfS5iaW5kKHRoaXMpKTtcclxuICAgICAgICBpZiAob2Zmc2V0ICE9PSBzdGFydCArIDQgKyBrKVxyXG4gICAgICAgICAgICB0aHJvdyBSYW5nZUVycm9yKFwiSWxsZWdhbCByYW5nZTogVHJ1bmNhdGVkIGRhdGEsIFwiK29mZnNldCtcIiA9PSBcIisob2Zmc2V0KzQraykpO1xyXG4gICAgICAgIGlmIChyZWxhdGl2ZSkge1xyXG4gICAgICAgICAgICB0aGlzLm9mZnNldCA9IG9mZnNldDtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBvZmZzZXQgLSBzdGFydDtcclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZWFkcyBhIGxlbmd0aCBhcyB1aW50MzIgcHJlZml4ZWQgVVRGOCBlbmNvZGVkIHN0cmluZy5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyPX0gb2Zmc2V0IE9mZnNldCB0byByZWFkIGZyb20uIFdpbGwgdXNlIGFuZCBpbmNyZWFzZSB7QGxpbmsgQnl0ZUJ1ZmZlciNvZmZzZXR9IGJ5IHRoZSBudW1iZXIgb2YgYnl0ZXNcclxuICAgICAqICByZWFkIGlmIG9taXR0ZWQuXHJcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfCF7c3RyaW5nOiBzdHJpbmcsIGxlbmd0aDogbnVtYmVyfX0gVGhlIHN0cmluZyByZWFkIGlmIG9mZnNldCBpcyBvbWl0dGVkLCBlbHNlIHRoZSBzdHJpbmdcclxuICAgICAqICByZWFkIGFuZCB0aGUgYWN0dWFsIG51bWJlciBvZiBieXRlcyByZWFkLlxyXG4gICAgICogQGV4cG9zZVxyXG4gICAgICogQHNlZSBCeXRlQnVmZmVyI3JlYWRWYXJpbnQzMlxyXG4gICAgICovXHJcbiAgICBCeXRlQnVmZmVyUHJvdG90eXBlLnJlYWRJU3RyaW5nID0gZnVuY3Rpb24ob2Zmc2V0KSB7XHJcbiAgICAgICAgdmFyIHJlbGF0aXZlID0gdHlwZW9mIG9mZnNldCA9PT0gJ3VuZGVmaW5lZCc7XG4gICAgICAgIGlmIChyZWxhdGl2ZSkgb2Zmc2V0ID0gdGhpcy5vZmZzZXQ7XG4gICAgICAgIGlmICghdGhpcy5ub0Fzc2VydCkge1xyXG4gICAgICAgICAgICBpZiAodHlwZW9mIG9mZnNldCAhPT0gJ251bWJlcicgfHwgb2Zmc2V0ICUgMSAhPT0gMClcbiAgICAgICAgICAgICAgICB0aHJvdyBUeXBlRXJyb3IoXCJJbGxlZ2FsIG9mZnNldDogXCIrb2Zmc2V0K1wiIChub3QgYW4gaW50ZWdlcilcIik7XG4gICAgICAgICAgICBvZmZzZXQgPj4+PSAwO1xuICAgICAgICAgICAgaWYgKG9mZnNldCA8IDAgfHwgb2Zmc2V0ICsgNCA+IHRoaXMuYnVmZmVyLmJ5dGVMZW5ndGgpXG4gICAgICAgICAgICAgICAgdGhyb3cgUmFuZ2VFcnJvcihcIklsbGVnYWwgb2Zmc2V0OiAwIDw9IFwiK29mZnNldCtcIiAoK1wiKzQrXCIpIDw9IFwiK3RoaXMuYnVmZmVyLmJ5dGVMZW5ndGgpO1xuICAgICAgICB9XHJcbiAgICAgICAgdmFyIHN0YXJ0ID0gb2Zmc2V0O1xyXG4gICAgICAgIHZhciBsZW4gPSB0aGlzLnJlYWRVaW50MzIob2Zmc2V0KTtcclxuICAgICAgICB2YXIgc3RyID0gdGhpcy5yZWFkVVRGOFN0cmluZyhsZW4sIEJ5dGVCdWZmZXIuTUVUUklDU19CWVRFUywgb2Zmc2V0ICs9IDQpO1xyXG4gICAgICAgIG9mZnNldCArPSBzdHJbJ2xlbmd0aCddO1xyXG4gICAgICAgIGlmIChyZWxhdGl2ZSkge1xyXG4gICAgICAgICAgICB0aGlzLm9mZnNldCA9IG9mZnNldDtcclxuICAgICAgICAgICAgcmV0dXJuIHN0clsnc3RyaW5nJ107XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgICdzdHJpbmcnOiBzdHJbJ3N0cmluZyddLFxyXG4gICAgICAgICAgICAgICAgJ2xlbmd0aCc6IG9mZnNldCAtIHN0YXJ0XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICAvLyB0eXBlcy9zdHJpbmdzL3V0ZjhzdHJpbmdcclxuXHJcbiAgICAvKipcclxuICAgICAqIE1ldHJpY3MgcmVwcmVzZW50aW5nIG51bWJlciBvZiBVVEY4IGNoYXJhY3RlcnMuIEV2YWx1YXRlcyB0byBgY2AuXHJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxyXG4gICAgICogQGNvbnN0XHJcbiAgICAgKiBAZXhwb3NlXHJcbiAgICAgKi9cclxuICAgIEJ5dGVCdWZmZXIuTUVUUklDU19DSEFSUyA9ICdjJztcclxuXHJcbiAgICAvKipcclxuICAgICAqIE1ldHJpY3MgcmVwcmVzZW50aW5nIG51bWJlciBvZiBieXRlcy4gRXZhbHVhdGVzIHRvIGBiYC5cclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XHJcbiAgICAgKiBAY29uc3RcclxuICAgICAqIEBleHBvc2VcclxuICAgICAqL1xyXG4gICAgQnl0ZUJ1ZmZlci5NRVRSSUNTX0JZVEVTID0gJ2InO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogV3JpdGVzIGFuIFVURjggZW5jb2RlZCBzdHJpbmcuXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyIFN0cmluZyB0byB3cml0ZVxyXG4gICAgICogQHBhcmFtIHtudW1iZXI9fSBvZmZzZXQgT2Zmc2V0IHRvIHdyaXRlIHRvLiBXaWxsIHVzZSBhbmQgaW5jcmVhc2Uge0BsaW5rIEJ5dGVCdWZmZXIjb2Zmc2V0fSBpZiBvbWl0dGVkLlxyXG4gICAgICogQHJldHVybnMgeyFCeXRlQnVmZmVyfG51bWJlcn0gdGhpcyBpZiBvZmZzZXQgaXMgb21pdHRlZCwgZWxzZSB0aGUgYWN0dWFsIG51bWJlciBvZiBieXRlcyB3cml0dGVuLlxyXG4gICAgICogQGV4cG9zZVxyXG4gICAgICovXHJcbiAgICBCeXRlQnVmZmVyUHJvdG90eXBlLndyaXRlVVRGOFN0cmluZyA9IGZ1bmN0aW9uKHN0ciwgb2Zmc2V0KSB7XHJcbiAgICAgICAgdmFyIHJlbGF0aXZlID0gdHlwZW9mIG9mZnNldCA9PT0gJ3VuZGVmaW5lZCc7XG4gICAgICAgIGlmIChyZWxhdGl2ZSkgb2Zmc2V0ID0gdGhpcy5vZmZzZXQ7XG4gICAgICAgIGlmICghdGhpcy5ub0Fzc2VydCkge1xyXG4gICAgICAgICAgICBpZiAodHlwZW9mIG9mZnNldCAhPT0gJ251bWJlcicgfHwgb2Zmc2V0ICUgMSAhPT0gMClcbiAgICAgICAgICAgICAgICB0aHJvdyBUeXBlRXJyb3IoXCJJbGxlZ2FsIG9mZnNldDogXCIrb2Zmc2V0K1wiIChub3QgYW4gaW50ZWdlcilcIik7XG4gICAgICAgICAgICBvZmZzZXQgPj4+PSAwO1xuICAgICAgICAgICAgaWYgKG9mZnNldCA8IDAgfHwgb2Zmc2V0ICsgMCA+IHRoaXMuYnVmZmVyLmJ5dGVMZW5ndGgpXG4gICAgICAgICAgICAgICAgdGhyb3cgUmFuZ2VFcnJvcihcIklsbGVnYWwgb2Zmc2V0OiAwIDw9IFwiK29mZnNldCtcIiAoK1wiKzArXCIpIDw9IFwiK3RoaXMuYnVmZmVyLmJ5dGVMZW5ndGgpO1xuICAgICAgICB9XHJcbiAgICAgICAgdmFyIGs7XHJcbiAgICAgICAgdmFyIHN0YXJ0ID0gb2Zmc2V0O1xyXG4gICAgICAgIGsgPSB1dGZ4LmNhbGN1bGF0ZVVURjE2YXNVVEY4KHN0cmluZ1NvdXJjZShzdHIpKVsxXTtcclxuICAgICAgICBvZmZzZXQgKz0gaztcbiAgICAgICAgdmFyIGNhcGFjaXR5MTQgPSB0aGlzLmJ1ZmZlci5ieXRlTGVuZ3RoO1xuICAgICAgICBpZiAob2Zmc2V0ID4gY2FwYWNpdHkxNClcbiAgICAgICAgICAgIHRoaXMucmVzaXplKChjYXBhY2l0eTE0ICo9IDIpID4gb2Zmc2V0ID8gY2FwYWNpdHkxNCA6IG9mZnNldCk7XG4gICAgICAgIG9mZnNldCAtPSBrO1xuICAgICAgICB1dGZ4LmVuY29kZVVURjE2dG9VVEY4KHN0cmluZ1NvdXJjZShzdHIpLCBmdW5jdGlvbihiKSB7XHJcbiAgICAgICAgICAgIHRoaXMudmlld1tvZmZzZXQrK10gPSBiO1xyXG4gICAgICAgIH0uYmluZCh0aGlzKSk7XHJcbiAgICAgICAgaWYgKHJlbGF0aXZlKSB7XHJcbiAgICAgICAgICAgIHRoaXMub2Zmc2V0ID0gb2Zmc2V0O1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG9mZnNldCAtIHN0YXJ0O1xyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFdyaXRlcyBhbiBVVEY4IGVuY29kZWQgc3RyaW5nLiBUaGlzIGlzIGFuIGFsaWFzIG9mIHtAbGluayBCeXRlQnVmZmVyI3dyaXRlVVRGOFN0cmluZ30uXHJcbiAgICAgKiBAZnVuY3Rpb25cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzdHIgU3RyaW5nIHRvIHdyaXRlXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcj19IG9mZnNldCBPZmZzZXQgdG8gd3JpdGUgdG8uIFdpbGwgdXNlIGFuZCBpbmNyZWFzZSB7QGxpbmsgQnl0ZUJ1ZmZlciNvZmZzZXR9IGlmIG9taXR0ZWQuXHJcbiAgICAgKiBAcmV0dXJucyB7IUJ5dGVCdWZmZXJ8bnVtYmVyfSB0aGlzIGlmIG9mZnNldCBpcyBvbWl0dGVkLCBlbHNlIHRoZSBhY3R1YWwgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4uXHJcbiAgICAgKiBAZXhwb3NlXHJcbiAgICAgKi9cclxuICAgIEJ5dGVCdWZmZXJQcm90b3R5cGUud3JpdGVTdHJpbmcgPSBCeXRlQnVmZmVyUHJvdG90eXBlLndyaXRlVVRGOFN0cmluZztcclxuXHJcbiAgICAvKipcclxuICAgICAqIENhbGN1bGF0ZXMgdGhlIG51bWJlciBvZiBVVEY4IGNoYXJhY3RlcnMgb2YgYSBzdHJpbmcuIEphdmFTY3JpcHQgaXRzZWxmIHVzZXMgVVRGLTE2LCBzbyB0aGF0IGEgc3RyaW5nJ3NcclxuICAgICAqICBgbGVuZ3RoYCBwcm9wZXJ0eSBkb2VzIG5vdCByZWZsZWN0IGl0cyBhY3R1YWwgVVRGOCBzaXplIGlmIGl0IGNvbnRhaW5zIGNvZGUgcG9pbnRzIGxhcmdlciB0aGFuIDB4RkZGRi5cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzdHIgU3RyaW5nIHRvIGNhbGN1bGF0ZVxyXG4gICAgICogQHJldHVybnMge251bWJlcn0gTnVtYmVyIG9mIFVURjggY2hhcmFjdGVyc1xyXG4gICAgICogQGV4cG9zZVxyXG4gICAgICovXHJcbiAgICBCeXRlQnVmZmVyLmNhbGN1bGF0ZVVURjhDaGFycyA9IGZ1bmN0aW9uKHN0cikge1xyXG4gICAgICAgIHJldHVybiB1dGZ4LmNhbGN1bGF0ZVVURjE2YXNVVEY4KHN0cmluZ1NvdXJjZShzdHIpKVswXTtcclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDYWxjdWxhdGVzIHRoZSBudW1iZXIgb2YgVVRGOCBieXRlcyBvZiBhIHN0cmluZy5cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzdHIgU3RyaW5nIHRvIGNhbGN1bGF0ZVxyXG4gICAgICogQHJldHVybnMge251bWJlcn0gTnVtYmVyIG9mIFVURjggYnl0ZXNcclxuICAgICAqIEBleHBvc2VcclxuICAgICAqL1xyXG4gICAgQnl0ZUJ1ZmZlci5jYWxjdWxhdGVVVEY4Qnl0ZXMgPSBmdW5jdGlvbihzdHIpIHtcclxuICAgICAgICByZXR1cm4gdXRmeC5jYWxjdWxhdGVVVEYxNmFzVVRGOChzdHJpbmdTb3VyY2Uoc3RyKSlbMV07XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FsY3VsYXRlcyB0aGUgbnVtYmVyIG9mIFVURjggYnl0ZXMgb2YgYSBzdHJpbmcuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIEJ5dGVCdWZmZXIuY2FsY3VsYXRlVVRGOEJ5dGVzfS5cclxuICAgICAqIEBmdW5jdGlvblxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHN0ciBTdHJpbmcgdG8gY2FsY3VsYXRlXHJcbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBOdW1iZXIgb2YgVVRGOCBieXRlc1xyXG4gICAgICogQGV4cG9zZVxyXG4gICAgICovXHJcbiAgICBCeXRlQnVmZmVyLmNhbGN1bGF0ZVN0cmluZyA9IEJ5dGVCdWZmZXIuY2FsY3VsYXRlVVRGOEJ5dGVzO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVhZHMgYW4gVVRGOCBlbmNvZGVkIHN0cmluZy5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBsZW5ndGggTnVtYmVyIG9mIGNoYXJhY3RlcnMgb3IgYnl0ZXMgdG8gcmVhZC5cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nPX0gbWV0cmljcyBNZXRyaWNzIHNwZWNpZnlpbmcgd2hhdCBgbGVuZ3RoYCBpcyBtZWFudCB0byBjb3VudC4gRGVmYXVsdHMgdG9cclxuICAgICAqICB7QGxpbmsgQnl0ZUJ1ZmZlci5NRVRSSUNTX0NIQVJTfS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyPX0gb2Zmc2V0IE9mZnNldCB0byByZWFkIGZyb20uIFdpbGwgdXNlIGFuZCBpbmNyZWFzZSB7QGxpbmsgQnl0ZUJ1ZmZlciNvZmZzZXR9IGJ5IHRoZSBudW1iZXIgb2YgYnl0ZXNcclxuICAgICAqICByZWFkIGlmIG9taXR0ZWQuXHJcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfCF7c3RyaW5nOiBzdHJpbmcsIGxlbmd0aDogbnVtYmVyfX0gVGhlIHN0cmluZyByZWFkIGlmIG9mZnNldCBpcyBvbWl0dGVkLCBlbHNlIHRoZSBzdHJpbmdcclxuICAgICAqICByZWFkIGFuZCB0aGUgYWN0dWFsIG51bWJlciBvZiBieXRlcyByZWFkLlxyXG4gICAgICogQGV4cG9zZVxyXG4gICAgICovXHJcbiAgICBCeXRlQnVmZmVyUHJvdG90eXBlLnJlYWRVVEY4U3RyaW5nID0gZnVuY3Rpb24obGVuZ3RoLCBtZXRyaWNzLCBvZmZzZXQpIHtcclxuICAgICAgICBpZiAodHlwZW9mIG1ldHJpY3MgPT09ICdudW1iZXInKSB7XHJcbiAgICAgICAgICAgIG9mZnNldCA9IG1ldHJpY3M7XHJcbiAgICAgICAgICAgIG1ldHJpY3MgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciByZWxhdGl2ZSA9IHR5cGVvZiBvZmZzZXQgPT09ICd1bmRlZmluZWQnO1xuICAgICAgICBpZiAocmVsYXRpdmUpIG9mZnNldCA9IHRoaXMub2Zmc2V0O1xuICAgICAgICBpZiAodHlwZW9mIG1ldHJpY3MgPT09ICd1bmRlZmluZWQnKSBtZXRyaWNzID0gQnl0ZUJ1ZmZlci5NRVRSSUNTX0NIQVJTO1xyXG4gICAgICAgIGlmICghdGhpcy5ub0Fzc2VydCkge1xyXG4gICAgICAgICAgICBpZiAodHlwZW9mIGxlbmd0aCAhPT0gJ251bWJlcicgfHwgbGVuZ3RoICUgMSAhPT0gMClcbiAgICAgICAgICAgICAgICB0aHJvdyBUeXBlRXJyb3IoXCJJbGxlZ2FsIGxlbmd0aDogXCIrbGVuZ3RoK1wiIChub3QgYW4gaW50ZWdlcilcIik7XG4gICAgICAgICAgICBsZW5ndGggfD0gMDtcbiAgICAgICAgICAgIGlmICh0eXBlb2Ygb2Zmc2V0ICE9PSAnbnVtYmVyJyB8fCBvZmZzZXQgJSAxICE9PSAwKVxuICAgICAgICAgICAgICAgIHRocm93IFR5cGVFcnJvcihcIklsbGVnYWwgb2Zmc2V0OiBcIitvZmZzZXQrXCIgKG5vdCBhbiBpbnRlZ2VyKVwiKTtcbiAgICAgICAgICAgIG9mZnNldCA+Pj49IDA7XG4gICAgICAgICAgICBpZiAob2Zmc2V0IDwgMCB8fCBvZmZzZXQgKyAwID4gdGhpcy5idWZmZXIuYnl0ZUxlbmd0aClcbiAgICAgICAgICAgICAgICB0aHJvdyBSYW5nZUVycm9yKFwiSWxsZWdhbCBvZmZzZXQ6IDAgPD0gXCIrb2Zmc2V0K1wiICgrXCIrMCtcIikgPD0gXCIrdGhpcy5idWZmZXIuYnl0ZUxlbmd0aCk7XG4gICAgICAgIH1cclxuICAgICAgICB2YXIgaSA9IDAsXHJcbiAgICAgICAgICAgIHN0YXJ0ID0gb2Zmc2V0LFxyXG4gICAgICAgICAgICBzZDtcclxuICAgICAgICBpZiAobWV0cmljcyA9PT0gQnl0ZUJ1ZmZlci5NRVRSSUNTX0NIQVJTKSB7IC8vIFRoZSBzYW1lIGZvciBub2RlIGFuZCB0aGUgYnJvd3NlclxyXG4gICAgICAgICAgICBzZCA9IHN0cmluZ0Rlc3RpbmF0aW9uKCk7XHJcbiAgICAgICAgICAgIHV0ZnguZGVjb2RlVVRGOChmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBpIDwgbGVuZ3RoICYmIG9mZnNldCA8IHRoaXMubGltaXQgPyB0aGlzLnZpZXdbb2Zmc2V0KytdIDogbnVsbDtcclxuICAgICAgICAgICAgfS5iaW5kKHRoaXMpLCBmdW5jdGlvbihjcCkge1xyXG4gICAgICAgICAgICAgICAgKytpOyB1dGZ4LlVURjh0b1VURjE2KGNwLCBzZCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBpZiAoaSAhPT0gbGVuZ3RoKVxyXG4gICAgICAgICAgICAgICAgdGhyb3cgUmFuZ2VFcnJvcihcIklsbGVnYWwgcmFuZ2U6IFRydW5jYXRlZCBkYXRhLCBcIitpK1wiID09IFwiK2xlbmd0aCk7XHJcbiAgICAgICAgICAgIGlmIChyZWxhdGl2ZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5vZmZzZXQgPSBvZmZzZXQ7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gc2QoKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICAgICAgXCJzdHJpbmdcIjogc2QoKSxcclxuICAgICAgICAgICAgICAgICAgICBcImxlbmd0aFwiOiBvZmZzZXQgLSBzdGFydFxyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSBpZiAobWV0cmljcyA9PT0gQnl0ZUJ1ZmZlci5NRVRSSUNTX0JZVEVTKSB7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5ub0Fzc2VydCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBvZmZzZXQgIT09ICdudW1iZXInIHx8IG9mZnNldCAlIDEgIT09IDApXG4gICAgICAgICAgICAgICAgICAgIHRocm93IFR5cGVFcnJvcihcIklsbGVnYWwgb2Zmc2V0OiBcIitvZmZzZXQrXCIgKG5vdCBhbiBpbnRlZ2VyKVwiKTtcbiAgICAgICAgICAgICAgICBvZmZzZXQgPj4+PSAwO1xuICAgICAgICAgICAgICAgIGlmIChvZmZzZXQgPCAwIHx8IG9mZnNldCArIGxlbmd0aCA+IHRoaXMuYnVmZmVyLmJ5dGVMZW5ndGgpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IFJhbmdlRXJyb3IoXCJJbGxlZ2FsIG9mZnNldDogMCA8PSBcIitvZmZzZXQrXCIgKCtcIitsZW5ndGgrXCIpIDw9IFwiK3RoaXMuYnVmZmVyLmJ5dGVMZW5ndGgpO1xuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB2YXIgayA9IG9mZnNldCArIGxlbmd0aDtcclxuICAgICAgICAgICAgdXRmeC5kZWNvZGVVVEY4dG9VVEYxNihmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBvZmZzZXQgPCBrID8gdGhpcy52aWV3W29mZnNldCsrXSA6IG51bGw7XHJcbiAgICAgICAgICAgIH0uYmluZCh0aGlzKSwgc2QgPSBzdHJpbmdEZXN0aW5hdGlvbigpLCB0aGlzLm5vQXNzZXJ0KTtcclxuICAgICAgICAgICAgaWYgKG9mZnNldCAhPT0gaylcclxuICAgICAgICAgICAgICAgIHRocm93IFJhbmdlRXJyb3IoXCJJbGxlZ2FsIHJhbmdlOiBUcnVuY2F0ZWQgZGF0YSwgXCIrb2Zmc2V0K1wiID09IFwiK2spO1xyXG4gICAgICAgICAgICBpZiAocmVsYXRpdmUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMub2Zmc2V0ID0gb2Zmc2V0O1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHNkKCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgICAgICdzdHJpbmcnOiBzZCgpLFxyXG4gICAgICAgICAgICAgICAgICAgICdsZW5ndGgnOiBvZmZzZXQgLSBzdGFydFxyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZVxyXG4gICAgICAgICAgICB0aHJvdyBUeXBlRXJyb3IoXCJVbnN1cHBvcnRlZCBtZXRyaWNzOiBcIittZXRyaWNzKTtcclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZWFkcyBhbiBVVEY4IGVuY29kZWQgc3RyaW5nLiBUaGlzIGlzIGFuIGFsaWFzIG9mIHtAbGluayBCeXRlQnVmZmVyI3JlYWRVVEY4U3RyaW5nfS5cclxuICAgICAqIEBmdW5jdGlvblxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGxlbmd0aCBOdW1iZXIgb2YgY2hhcmFjdGVycyBvciBieXRlcyB0byByZWFkXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcj19IG1ldHJpY3MgTWV0cmljcyBzcGVjaWZ5aW5nIHdoYXQgYG5gIGlzIG1lYW50IHRvIGNvdW50LiBEZWZhdWx0cyB0b1xyXG4gICAgICogIHtAbGluayBCeXRlQnVmZmVyLk1FVFJJQ1NfQ0hBUlN9LlxyXG4gICAgICogQHBhcmFtIHtudW1iZXI9fSBvZmZzZXQgT2Zmc2V0IHRvIHJlYWQgZnJvbS4gV2lsbCB1c2UgYW5kIGluY3JlYXNlIHtAbGluayBCeXRlQnVmZmVyI29mZnNldH0gYnkgdGhlIG51bWJlciBvZiBieXRlc1xyXG4gICAgICogIHJlYWQgaWYgb21pdHRlZC5cclxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd8IXtzdHJpbmc6IHN0cmluZywgbGVuZ3RoOiBudW1iZXJ9fSBUaGUgc3RyaW5nIHJlYWQgaWYgb2Zmc2V0IGlzIG9taXR0ZWQsIGVsc2UgdGhlIHN0cmluZ1xyXG4gICAgICogIHJlYWQgYW5kIHRoZSBhY3R1YWwgbnVtYmVyIG9mIGJ5dGVzIHJlYWQuXHJcbiAgICAgKiBAZXhwb3NlXHJcbiAgICAgKi9cclxuICAgIEJ5dGVCdWZmZXJQcm90b3R5cGUucmVhZFN0cmluZyA9IEJ5dGVCdWZmZXJQcm90b3R5cGUucmVhZFVURjhTdHJpbmc7XHJcblxyXG4gICAgLy8gdHlwZXMvc3RyaW5ncy92c3RyaW5nXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBXcml0ZXMgYSBsZW5ndGggYXMgdmFyaW50MzIgcHJlZml4ZWQgVVRGOCBlbmNvZGVkIHN0cmluZy5cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzdHIgU3RyaW5nIHRvIHdyaXRlXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcj19IG9mZnNldCBPZmZzZXQgdG8gd3JpdGUgdG8uIFdpbGwgdXNlIGFuZCBpbmNyZWFzZSB7QGxpbmsgQnl0ZUJ1ZmZlciNvZmZzZXR9IGJ5IHRoZSBudW1iZXIgb2YgYnl0ZXNcclxuICAgICAqICB3cml0dGVuIGlmIG9taXR0ZWQuXHJcbiAgICAgKiBAcmV0dXJucyB7IUJ5dGVCdWZmZXJ8bnVtYmVyfSBgdGhpc2AgaWYgYG9mZnNldGAgaXMgb21pdHRlZCwgZWxzZSB0aGUgYWN0dWFsIG51bWJlciBvZiBieXRlcyB3cml0dGVuXHJcbiAgICAgKiBAZXhwb3NlXHJcbiAgICAgKiBAc2VlIEJ5dGVCdWZmZXIjd3JpdGVWYXJpbnQzMlxyXG4gICAgICovXHJcbiAgICBCeXRlQnVmZmVyUHJvdG90eXBlLndyaXRlVlN0cmluZyA9IGZ1bmN0aW9uKHN0ciwgb2Zmc2V0KSB7XHJcbiAgICAgICAgdmFyIHJlbGF0aXZlID0gdHlwZW9mIG9mZnNldCA9PT0gJ3VuZGVmaW5lZCc7XG4gICAgICAgIGlmIChyZWxhdGl2ZSkgb2Zmc2V0ID0gdGhpcy5vZmZzZXQ7XG4gICAgICAgIGlmICghdGhpcy5ub0Fzc2VydCkge1xyXG4gICAgICAgICAgICBpZiAodHlwZW9mIHN0ciAhPT0gJ3N0cmluZycpXHJcbiAgICAgICAgICAgICAgICB0aHJvdyBUeXBlRXJyb3IoXCJJbGxlZ2FsIHN0cjogTm90IGEgc3RyaW5nXCIpO1xyXG4gICAgICAgICAgICBpZiAodHlwZW9mIG9mZnNldCAhPT0gJ251bWJlcicgfHwgb2Zmc2V0ICUgMSAhPT0gMClcbiAgICAgICAgICAgICAgICB0aHJvdyBUeXBlRXJyb3IoXCJJbGxlZ2FsIG9mZnNldDogXCIrb2Zmc2V0K1wiIChub3QgYW4gaW50ZWdlcilcIik7XG4gICAgICAgICAgICBvZmZzZXQgPj4+PSAwO1xuICAgICAgICAgICAgaWYgKG9mZnNldCA8IDAgfHwgb2Zmc2V0ICsgMCA+IHRoaXMuYnVmZmVyLmJ5dGVMZW5ndGgpXG4gICAgICAgICAgICAgICAgdGhyb3cgUmFuZ2VFcnJvcihcIklsbGVnYWwgb2Zmc2V0OiAwIDw9IFwiK29mZnNldCtcIiAoK1wiKzArXCIpIDw9IFwiK3RoaXMuYnVmZmVyLmJ5dGVMZW5ndGgpO1xuICAgICAgICB9XHJcbiAgICAgICAgdmFyIHN0YXJ0ID0gb2Zmc2V0LFxyXG4gICAgICAgICAgICBrLCBsO1xyXG4gICAgICAgIGsgPSB1dGZ4LmNhbGN1bGF0ZVVURjE2YXNVVEY4KHN0cmluZ1NvdXJjZShzdHIpLCB0aGlzLm5vQXNzZXJ0KVsxXTtcclxuICAgICAgICBsID0gQnl0ZUJ1ZmZlci5jYWxjdWxhdGVWYXJpbnQzMihrKTtcclxuICAgICAgICBvZmZzZXQgKz0gbCtrO1xuICAgICAgICB2YXIgY2FwYWNpdHkxNSA9IHRoaXMuYnVmZmVyLmJ5dGVMZW5ndGg7XG4gICAgICAgIGlmIChvZmZzZXQgPiBjYXBhY2l0eTE1KVxuICAgICAgICAgICAgdGhpcy5yZXNpemUoKGNhcGFjaXR5MTUgKj0gMikgPiBvZmZzZXQgPyBjYXBhY2l0eTE1IDogb2Zmc2V0KTtcbiAgICAgICAgb2Zmc2V0IC09IGwraztcbiAgICAgICAgb2Zmc2V0ICs9IHRoaXMud3JpdGVWYXJpbnQzMihrLCBvZmZzZXQpO1xyXG4gICAgICAgIHV0ZnguZW5jb2RlVVRGMTZ0b1VURjgoc3RyaW5nU291cmNlKHN0ciksIGZ1bmN0aW9uKGIpIHtcclxuICAgICAgICAgICAgdGhpcy52aWV3W29mZnNldCsrXSA9IGI7XHJcbiAgICAgICAgfS5iaW5kKHRoaXMpKTtcclxuICAgICAgICBpZiAob2Zmc2V0ICE9PSBzdGFydCtrK2wpXHJcbiAgICAgICAgICAgIHRocm93IFJhbmdlRXJyb3IoXCJJbGxlZ2FsIHJhbmdlOiBUcnVuY2F0ZWQgZGF0YSwgXCIrb2Zmc2V0K1wiID09IFwiKyhvZmZzZXQraytsKSk7XHJcbiAgICAgICAgaWYgKHJlbGF0aXZlKSB7XHJcbiAgICAgICAgICAgIHRoaXMub2Zmc2V0ID0gb2Zmc2V0O1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG9mZnNldCAtIHN0YXJ0O1xyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlYWRzIGEgbGVuZ3RoIGFzIHZhcmludDMyIHByZWZpeGVkIFVURjggZW5jb2RlZCBzdHJpbmcuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcj19IG9mZnNldCBPZmZzZXQgdG8gcmVhZCBmcm9tLiBXaWxsIHVzZSBhbmQgaW5jcmVhc2Uge0BsaW5rIEJ5dGVCdWZmZXIjb2Zmc2V0fSBieSB0aGUgbnVtYmVyIG9mIGJ5dGVzXHJcbiAgICAgKiAgcmVhZCBpZiBvbWl0dGVkLlxyXG4gICAgICogQHJldHVybnMge3N0cmluZ3whe3N0cmluZzogc3RyaW5nLCBsZW5ndGg6IG51bWJlcn19IFRoZSBzdHJpbmcgcmVhZCBpZiBvZmZzZXQgaXMgb21pdHRlZCwgZWxzZSB0aGUgc3RyaW5nXHJcbiAgICAgKiAgcmVhZCBhbmQgdGhlIGFjdHVhbCBudW1iZXIgb2YgYnl0ZXMgcmVhZC5cclxuICAgICAqIEBleHBvc2VcclxuICAgICAqIEBzZWUgQnl0ZUJ1ZmZlciNyZWFkVmFyaW50MzJcclxuICAgICAqL1xyXG4gICAgQnl0ZUJ1ZmZlclByb3RvdHlwZS5yZWFkVlN0cmluZyA9IGZ1bmN0aW9uKG9mZnNldCkge1xyXG4gICAgICAgIHZhciByZWxhdGl2ZSA9IHR5cGVvZiBvZmZzZXQgPT09ICd1bmRlZmluZWQnO1xuICAgICAgICBpZiAocmVsYXRpdmUpIG9mZnNldCA9IHRoaXMub2Zmc2V0O1xuICAgICAgICBpZiAoIXRoaXMubm9Bc3NlcnQpIHtcclxuICAgICAgICAgICAgaWYgKHR5cGVvZiBvZmZzZXQgIT09ICdudW1iZXInIHx8IG9mZnNldCAlIDEgIT09IDApXG4gICAgICAgICAgICAgICAgdGhyb3cgVHlwZUVycm9yKFwiSWxsZWdhbCBvZmZzZXQ6IFwiK29mZnNldCtcIiAobm90IGFuIGludGVnZXIpXCIpO1xuICAgICAgICAgICAgb2Zmc2V0ID4+Pj0gMDtcbiAgICAgICAgICAgIGlmIChvZmZzZXQgPCAwIHx8IG9mZnNldCArIDEgPiB0aGlzLmJ1ZmZlci5ieXRlTGVuZ3RoKVxuICAgICAgICAgICAgICAgIHRocm93IFJhbmdlRXJyb3IoXCJJbGxlZ2FsIG9mZnNldDogMCA8PSBcIitvZmZzZXQrXCIgKCtcIisxK1wiKSA8PSBcIit0aGlzLmJ1ZmZlci5ieXRlTGVuZ3RoKTtcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciBzdGFydCA9IG9mZnNldDtcclxuICAgICAgICB2YXIgbGVuID0gdGhpcy5yZWFkVmFyaW50MzIob2Zmc2V0KTtcclxuICAgICAgICB2YXIgc3RyID0gdGhpcy5yZWFkVVRGOFN0cmluZyhsZW5bJ3ZhbHVlJ10sIEJ5dGVCdWZmZXIuTUVUUklDU19CWVRFUywgb2Zmc2V0ICs9IGxlblsnbGVuZ3RoJ10pO1xyXG4gICAgICAgIG9mZnNldCArPSBzdHJbJ2xlbmd0aCddO1xyXG4gICAgICAgIGlmIChyZWxhdGl2ZSkge1xyXG4gICAgICAgICAgICB0aGlzLm9mZnNldCA9IG9mZnNldDtcclxuICAgICAgICAgICAgcmV0dXJuIHN0clsnc3RyaW5nJ107XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgICdzdHJpbmcnOiBzdHJbJ3N0cmluZyddLFxyXG4gICAgICAgICAgICAgICAgJ2xlbmd0aCc6IG9mZnNldCAtIHN0YXJ0XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBcHBlbmRzIHNvbWUgZGF0YSB0byB0aGlzIEJ5dGVCdWZmZXIuIFRoaXMgd2lsbCBvdmVyd3JpdGUgYW55IGNvbnRlbnRzIGJlaGluZCB0aGUgc3BlY2lmaWVkIG9mZnNldCB1cCB0byB0aGUgYXBwZW5kZWRcclxuICAgICAqICBkYXRhJ3MgbGVuZ3RoLlxyXG4gICAgICogQHBhcmFtIHshQnl0ZUJ1ZmZlcnwhQXJyYXlCdWZmZXJ8IVVpbnQ4QXJyYXl8c3RyaW5nfSBzb3VyY2UgRGF0YSB0byBhcHBlbmQuIElmIGBzb3VyY2VgIGlzIGEgQnl0ZUJ1ZmZlciwgaXRzIG9mZnNldHNcclxuICAgICAqICB3aWxsIGJlIG1vZGlmaWVkIGFjY29yZGluZyB0byB0aGUgcGVyZm9ybWVkIHJlYWQgb3BlcmF0aW9uLlxyXG4gICAgICogQHBhcmFtIHsoc3RyaW5nfG51bWJlcik9fSBlbmNvZGluZyBFbmNvZGluZyBpZiBgZGF0YWAgaXMgYSBzdHJpbmcgKFwiYmFzZTY0XCIsIFwiaGV4XCIsIFwiYmluYXJ5XCIsIGRlZmF1bHRzIHRvIFwidXRmOFwiKVxyXG4gICAgICogQHBhcmFtIHtudW1iZXI9fSBvZmZzZXQgT2Zmc2V0IHRvIGFwcGVuZCBhdC4gV2lsbCB1c2UgYW5kIGluY3JlYXNlIHtAbGluayBCeXRlQnVmZmVyI29mZnNldH0gYnkgdGhlIG51bWJlciBvZiBieXRlc1xyXG4gICAgICogIHdyaXR0ZW4gaWYgb21pdHRlZC5cclxuICAgICAqIEByZXR1cm5zIHshQnl0ZUJ1ZmZlcn0gdGhpc1xyXG4gICAgICogQGV4cG9zZVxyXG4gICAgICogQGV4YW1wbGUgQSByZWxhdGl2ZSBgPDAxIDAyPjAzLmFwcGVuZCg8MDQgMDU+KWAgd2lsbCByZXN1bHQgaW4gYDwwMSAwMiAwNCAwNT4sIDA0IDA1fGBcclxuICAgICAqIEBleGFtcGxlIEFuIGFic29sdXRlIGA8MDEgMDI+MDMuYXBwZW5kKDA0IDA1PiwgMSlgIHdpbGwgcmVzdWx0IGluIGA8MDEgMDQ+MDUsIDA0IDA1fGBcclxuICAgICAqL1xyXG4gICAgQnl0ZUJ1ZmZlclByb3RvdHlwZS5hcHBlbmQgPSBmdW5jdGlvbihzb3VyY2UsIGVuY29kaW5nLCBvZmZzZXQpIHtcclxuICAgICAgICBpZiAodHlwZW9mIGVuY29kaW5nID09PSAnbnVtYmVyJyB8fCB0eXBlb2YgZW5jb2RpbmcgIT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgIG9mZnNldCA9IGVuY29kaW5nO1xyXG4gICAgICAgICAgICBlbmNvZGluZyA9IHVuZGVmaW5lZDtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIHJlbGF0aXZlID0gdHlwZW9mIG9mZnNldCA9PT0gJ3VuZGVmaW5lZCc7XG4gICAgICAgIGlmIChyZWxhdGl2ZSkgb2Zmc2V0ID0gdGhpcy5vZmZzZXQ7XG4gICAgICAgIGlmICghdGhpcy5ub0Fzc2VydCkge1xyXG4gICAgICAgICAgICBpZiAodHlwZW9mIG9mZnNldCAhPT0gJ251bWJlcicgfHwgb2Zmc2V0ICUgMSAhPT0gMClcbiAgICAgICAgICAgICAgICB0aHJvdyBUeXBlRXJyb3IoXCJJbGxlZ2FsIG9mZnNldDogXCIrb2Zmc2V0K1wiIChub3QgYW4gaW50ZWdlcilcIik7XG4gICAgICAgICAgICBvZmZzZXQgPj4+PSAwO1xuICAgICAgICAgICAgaWYgKG9mZnNldCA8IDAgfHwgb2Zmc2V0ICsgMCA+IHRoaXMuYnVmZmVyLmJ5dGVMZW5ndGgpXG4gICAgICAgICAgICAgICAgdGhyb3cgUmFuZ2VFcnJvcihcIklsbGVnYWwgb2Zmc2V0OiAwIDw9IFwiK29mZnNldCtcIiAoK1wiKzArXCIpIDw9IFwiK3RoaXMuYnVmZmVyLmJ5dGVMZW5ndGgpO1xuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCEoc291cmNlIGluc3RhbmNlb2YgQnl0ZUJ1ZmZlcikpXHJcbiAgICAgICAgICAgIHNvdXJjZSA9IEJ5dGVCdWZmZXIud3JhcChzb3VyY2UsIGVuY29kaW5nKTtcclxuICAgICAgICB2YXIgbGVuZ3RoID0gc291cmNlLmxpbWl0IC0gc291cmNlLm9mZnNldDtcclxuICAgICAgICBpZiAobGVuZ3RoIDw9IDApIHJldHVybiB0aGlzOyAvLyBOb3RoaW5nIHRvIGFwcGVuZFxyXG4gICAgICAgIG9mZnNldCArPSBsZW5ndGg7XG4gICAgICAgIHZhciBjYXBhY2l0eTE2ID0gdGhpcy5idWZmZXIuYnl0ZUxlbmd0aDtcbiAgICAgICAgaWYgKG9mZnNldCA+IGNhcGFjaXR5MTYpXG4gICAgICAgICAgICB0aGlzLnJlc2l6ZSgoY2FwYWNpdHkxNiAqPSAyKSA+IG9mZnNldCA/IGNhcGFjaXR5MTYgOiBvZmZzZXQpO1xuICAgICAgICBvZmZzZXQgLT0gbGVuZ3RoO1xuICAgICAgICB0aGlzLnZpZXcuc2V0KHNvdXJjZS52aWV3LnN1YmFycmF5KHNvdXJjZS5vZmZzZXQsIHNvdXJjZS5saW1pdCksIG9mZnNldCk7XHJcbiAgICAgICAgc291cmNlLm9mZnNldCArPSBsZW5ndGg7XHJcbiAgICAgICAgaWYgKHJlbGF0aXZlKSB0aGlzLm9mZnNldCArPSBsZW5ndGg7XG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEFwcGVuZHMgdGhpcyBCeXRlQnVmZmVyJ3MgY29udGVudHMgdG8gYW5vdGhlciBCeXRlQnVmZmVyLiBUaGlzIHdpbGwgb3ZlcndyaXRlIGFueSBjb250ZW50cyBhdCBhbmQgYWZ0ZXIgdGhlXHJcbiAgICAgICAgc3BlY2lmaWVkIG9mZnNldCB1cCB0byB0aGUgbGVuZ3RoIG9mIHRoaXMgQnl0ZUJ1ZmZlcidzIGRhdGEuXHJcbiAgICAgKiBAcGFyYW0geyFCeXRlQnVmZmVyfSB0YXJnZXQgVGFyZ2V0IEJ5dGVCdWZmZXJcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyPX0gb2Zmc2V0IE9mZnNldCB0byBhcHBlbmQgdG8uIFdpbGwgdXNlIGFuZCBpbmNyZWFzZSB7QGxpbmsgQnl0ZUJ1ZmZlciNvZmZzZXR9IGJ5IHRoZSBudW1iZXIgb2YgYnl0ZXNcclxuICAgICAqICByZWFkIGlmIG9taXR0ZWQuXHJcbiAgICAgKiBAcmV0dXJucyB7IUJ5dGVCdWZmZXJ9IHRoaXNcclxuICAgICAqIEBleHBvc2VcclxuICAgICAqIEBzZWUgQnl0ZUJ1ZmZlciNhcHBlbmRcclxuICAgICAqL1xyXG4gICAgQnl0ZUJ1ZmZlclByb3RvdHlwZS5hcHBlbmRUbyA9IGZ1bmN0aW9uKHRhcmdldCwgb2Zmc2V0KSB7XHJcbiAgICAgICAgdGFyZ2V0LmFwcGVuZCh0aGlzLCBvZmZzZXQpO1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEVuYWJsZXMgb3IgZGlzYWJsZXMgYXNzZXJ0aW9ucyBvZiBhcmd1bWVudCB0eXBlcyBhbmQgb2Zmc2V0cy4gQXNzZXJ0aW9ucyBhcmUgZW5hYmxlZCBieSBkZWZhdWx0IGJ1dCB5b3UgY2FuIG9wdCB0b1xyXG4gICAgICogIGRpc2FibGUgdGhlbSBpZiB5b3VyIGNvZGUgYWxyZWFkeSBtYWtlcyBzdXJlIHRoYXQgZXZlcnl0aGluZyBpcyB2YWxpZC5cclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gYXNzZXJ0IGB0cnVlYCB0byBlbmFibGUgYXNzZXJ0aW9ucywgb3RoZXJ3aXNlIGBmYWxzZWBcclxuICAgICAqIEByZXR1cm5zIHshQnl0ZUJ1ZmZlcn0gdGhpc1xyXG4gICAgICogQGV4cG9zZVxyXG4gICAgICovXHJcbiAgICBCeXRlQnVmZmVyUHJvdG90eXBlLmFzc2VydCA9IGZ1bmN0aW9uKGFzc2VydCkge1xyXG4gICAgICAgIHRoaXMubm9Bc3NlcnQgPSAhYXNzZXJ0O1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgdGhlIGNhcGFjaXR5IG9mIHRoaXMgQnl0ZUJ1ZmZlcidzIGJhY2tpbmcgYnVmZmVyLlxyXG4gICAgICogQHJldHVybnMge251bWJlcn0gQ2FwYWNpdHkgb2YgdGhlIGJhY2tpbmcgYnVmZmVyXHJcbiAgICAgKiBAZXhwb3NlXHJcbiAgICAgKi9cclxuICAgIEJ5dGVCdWZmZXJQcm90b3R5cGUuY2FwYWNpdHkgPSBmdW5jdGlvbigpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5idWZmZXIuYnl0ZUxlbmd0aDtcclxuICAgIH07XHJcbiAgICAvKipcclxuICAgICAqIENsZWFycyB0aGlzIEJ5dGVCdWZmZXIncyBvZmZzZXRzIGJ5IHNldHRpbmcge0BsaW5rIEJ5dGVCdWZmZXIjb2Zmc2V0fSB0byBgMGAgYW5kIHtAbGluayBCeXRlQnVmZmVyI2xpbWl0fSB0byB0aGVcclxuICAgICAqICBiYWNraW5nIGJ1ZmZlcidzIGNhcGFjaXR5LiBEaXNjYXJkcyB7QGxpbmsgQnl0ZUJ1ZmZlciNtYXJrZWRPZmZzZXR9LlxyXG4gICAgICogQHJldHVybnMgeyFCeXRlQnVmZmVyfSB0aGlzXHJcbiAgICAgKiBAZXhwb3NlXHJcbiAgICAgKi9cclxuICAgIEJ5dGVCdWZmZXJQcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbigpIHtcclxuICAgICAgICB0aGlzLm9mZnNldCA9IDA7XHJcbiAgICAgICAgdGhpcy5saW1pdCA9IHRoaXMuYnVmZmVyLmJ5dGVMZW5ndGg7XHJcbiAgICAgICAgdGhpcy5tYXJrZWRPZmZzZXQgPSAtMTtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGEgY2xvbmVkIGluc3RhbmNlIG9mIHRoaXMgQnl0ZUJ1ZmZlciwgcHJlc2V0IHdpdGggdGhpcyBCeXRlQnVmZmVyJ3MgdmFsdWVzIGZvciB7QGxpbmsgQnl0ZUJ1ZmZlciNvZmZzZXR9LFxyXG4gICAgICogIHtAbGluayBCeXRlQnVmZmVyI21hcmtlZE9mZnNldH0gYW5kIHtAbGluayBCeXRlQnVmZmVyI2xpbWl0fS5cclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbj19IGNvcHkgV2hldGhlciB0byBjb3B5IHRoZSBiYWNraW5nIGJ1ZmZlciBvciB0byByZXR1cm4gYW5vdGhlciB2aWV3IG9uIHRoZSBzYW1lLCBkZWZhdWx0cyB0byBgZmFsc2VgXHJcbiAgICAgKiBAcmV0dXJucyB7IUJ5dGVCdWZmZXJ9IENsb25lZCBpbnN0YW5jZVxyXG4gICAgICogQGV4cG9zZVxyXG4gICAgICovXHJcbiAgICBCeXRlQnVmZmVyUHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24oY29weSkge1xyXG4gICAgICAgIHZhciBiYiA9IG5ldyBCeXRlQnVmZmVyKDAsIHRoaXMubGl0dGxlRW5kaWFuLCB0aGlzLm5vQXNzZXJ0KTtcclxuICAgICAgICBpZiAoY29weSkge1xyXG4gICAgICAgICAgICBiYi5idWZmZXIgPSBuZXcgQXJyYXlCdWZmZXIodGhpcy5idWZmZXIuYnl0ZUxlbmd0aCk7XHJcbiAgICAgICAgICAgIGJiLnZpZXcgPSBuZXcgVWludDhBcnJheShiYi5idWZmZXIpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGJiLmJ1ZmZlciA9IHRoaXMuYnVmZmVyO1xyXG4gICAgICAgICAgICBiYi52aWV3ID0gdGhpcy52aWV3O1xyXG4gICAgICAgIH1cclxuICAgICAgICBiYi5vZmZzZXQgPSB0aGlzLm9mZnNldDtcclxuICAgICAgICBiYi5tYXJrZWRPZmZzZXQgPSB0aGlzLm1hcmtlZE9mZnNldDtcclxuICAgICAgICBiYi5saW1pdCA9IHRoaXMubGltaXQ7XHJcbiAgICAgICAgcmV0dXJuIGJiO1xyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIENvbXBhY3RzIHRoaXMgQnl0ZUJ1ZmZlciB0byBiZSBiYWNrZWQgYnkgYSB7QGxpbmsgQnl0ZUJ1ZmZlciNidWZmZXJ9IG9mIGl0cyBjb250ZW50cycgbGVuZ3RoLiBDb250ZW50cyBhcmUgdGhlIGJ5dGVzXHJcbiAgICAgKiAgYmV0d2VlbiB7QGxpbmsgQnl0ZUJ1ZmZlciNvZmZzZXR9IGFuZCB7QGxpbmsgQnl0ZUJ1ZmZlciNsaW1pdH0uIFdpbGwgc2V0IGBvZmZzZXQgPSAwYCBhbmQgYGxpbWl0ID0gY2FwYWNpdHlgIGFuZFxyXG4gICAgICogIGFkYXB0IHtAbGluayBCeXRlQnVmZmVyI21hcmtlZE9mZnNldH0gdG8gdGhlIHNhbWUgcmVsYXRpdmUgcG9zaXRpb24gaWYgc2V0LlxyXG4gICAgICogQHBhcmFtIHtudW1iZXI9fSBiZWdpbiBPZmZzZXQgdG8gc3RhcnQgYXQsIGRlZmF1bHRzIHRvIHtAbGluayBCeXRlQnVmZmVyI29mZnNldH1cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyPX0gZW5kIE9mZnNldCB0byBlbmQgYXQsIGRlZmF1bHRzIHRvIHtAbGluayBCeXRlQnVmZmVyI2xpbWl0fVxyXG4gICAgICogQHJldHVybnMgeyFCeXRlQnVmZmVyfSB0aGlzXHJcbiAgICAgKiBAZXhwb3NlXHJcbiAgICAgKi9cclxuICAgIEJ5dGVCdWZmZXJQcm90b3R5cGUuY29tcGFjdCA9IGZ1bmN0aW9uKGJlZ2luLCBlbmQpIHtcclxuICAgICAgICBpZiAodHlwZW9mIGJlZ2luID09PSAndW5kZWZpbmVkJykgYmVnaW4gPSB0aGlzLm9mZnNldDtcclxuICAgICAgICBpZiAodHlwZW9mIGVuZCA9PT0gJ3VuZGVmaW5lZCcpIGVuZCA9IHRoaXMubGltaXQ7XHJcbiAgICAgICAgaWYgKCF0aGlzLm5vQXNzZXJ0KSB7XHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgYmVnaW4gIT09ICdudW1iZXInIHx8IGJlZ2luICUgMSAhPT0gMClcbiAgICAgICAgICAgICAgICB0aHJvdyBUeXBlRXJyb3IoXCJJbGxlZ2FsIGJlZ2luOiBOb3QgYW4gaW50ZWdlclwiKTtcbiAgICAgICAgICAgIGJlZ2luID4+Pj0gMDtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgZW5kICE9PSAnbnVtYmVyJyB8fCBlbmQgJSAxICE9PSAwKVxuICAgICAgICAgICAgICAgIHRocm93IFR5cGVFcnJvcihcIklsbGVnYWwgZW5kOiBOb3QgYW4gaW50ZWdlclwiKTtcbiAgICAgICAgICAgIGVuZCA+Pj49IDA7XG4gICAgICAgICAgICBpZiAoYmVnaW4gPCAwIHx8IGJlZ2luID4gZW5kIHx8IGVuZCA+IHRoaXMuYnVmZmVyLmJ5dGVMZW5ndGgpXG4gICAgICAgICAgICAgICAgdGhyb3cgUmFuZ2VFcnJvcihcIklsbGVnYWwgcmFuZ2U6IDAgPD0gXCIrYmVnaW4rXCIgPD0gXCIrZW5kK1wiIDw9IFwiK3RoaXMuYnVmZmVyLmJ5dGVMZW5ndGgpO1xuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGJlZ2luID09PSAwICYmIGVuZCA9PT0gdGhpcy5idWZmZXIuYnl0ZUxlbmd0aClcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7IC8vIEFscmVhZHkgY29tcGFjdGVkXHJcbiAgICAgICAgdmFyIGxlbiA9IGVuZCAtIGJlZ2luO1xyXG4gICAgICAgIGlmIChsZW4gPT09IDApIHtcclxuICAgICAgICAgICAgdGhpcy5idWZmZXIgPSBFTVBUWV9CVUZGRVI7XHJcbiAgICAgICAgICAgIHRoaXMudmlldyA9IG51bGw7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLm1hcmtlZE9mZnNldCA+PSAwKSB0aGlzLm1hcmtlZE9mZnNldCAtPSBiZWdpbjtcclxuICAgICAgICAgICAgdGhpcy5vZmZzZXQgPSAwO1xyXG4gICAgICAgICAgICB0aGlzLmxpbWl0ID0gMDtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciBidWZmZXIgPSBuZXcgQXJyYXlCdWZmZXIobGVuKTtcclxuICAgICAgICB2YXIgdmlldyA9IG5ldyBVaW50OEFycmF5KGJ1ZmZlcik7XHJcbiAgICAgICAgdmlldy5zZXQodGhpcy52aWV3LnN1YmFycmF5KGJlZ2luLCBlbmQpKTtcclxuICAgICAgICB0aGlzLmJ1ZmZlciA9IGJ1ZmZlcjtcclxuICAgICAgICB0aGlzLnZpZXcgPSB2aWV3O1xyXG4gICAgICAgIGlmICh0aGlzLm1hcmtlZE9mZnNldCA+PSAwKSB0aGlzLm1hcmtlZE9mZnNldCAtPSBiZWdpbjtcclxuICAgICAgICB0aGlzLm9mZnNldCA9IDA7XHJcbiAgICAgICAgdGhpcy5saW1pdCA9IGxlbjtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGEgY29weSBvZiB0aGlzIEJ5dGVCdWZmZXIncyBjb250ZW50cy4gQ29udGVudHMgYXJlIHRoZSBieXRlcyBiZXR3ZWVuIHtAbGluayBCeXRlQnVmZmVyI29mZnNldH0gYW5kXHJcbiAgICAgKiAge0BsaW5rIEJ5dGVCdWZmZXIjbGltaXR9LlxyXG4gICAgICogQHBhcmFtIHtudW1iZXI9fSBiZWdpbiBCZWdpbiBvZmZzZXQsIGRlZmF1bHRzIHRvIHtAbGluayBCeXRlQnVmZmVyI29mZnNldH0uXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcj19IGVuZCBFbmQgb2Zmc2V0LCBkZWZhdWx0cyB0byB7QGxpbmsgQnl0ZUJ1ZmZlciNsaW1pdH0uXHJcbiAgICAgKiBAcmV0dXJucyB7IUJ5dGVCdWZmZXJ9IENvcHlcclxuICAgICAqIEBleHBvc2VcclxuICAgICAqL1xyXG4gICAgQnl0ZUJ1ZmZlclByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24oYmVnaW4sIGVuZCkge1xyXG4gICAgICAgIGlmICh0eXBlb2YgYmVnaW4gPT09ICd1bmRlZmluZWQnKSBiZWdpbiA9IHRoaXMub2Zmc2V0O1xyXG4gICAgICAgIGlmICh0eXBlb2YgZW5kID09PSAndW5kZWZpbmVkJykgZW5kID0gdGhpcy5saW1pdDtcclxuICAgICAgICBpZiAoIXRoaXMubm9Bc3NlcnQpIHtcclxuICAgICAgICAgICAgaWYgKHR5cGVvZiBiZWdpbiAhPT0gJ251bWJlcicgfHwgYmVnaW4gJSAxICE9PSAwKVxuICAgICAgICAgICAgICAgIHRocm93IFR5cGVFcnJvcihcIklsbGVnYWwgYmVnaW46IE5vdCBhbiBpbnRlZ2VyXCIpO1xuICAgICAgICAgICAgYmVnaW4gPj4+PSAwO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBlbmQgIT09ICdudW1iZXInIHx8IGVuZCAlIDEgIT09IDApXG4gICAgICAgICAgICAgICAgdGhyb3cgVHlwZUVycm9yKFwiSWxsZWdhbCBlbmQ6IE5vdCBhbiBpbnRlZ2VyXCIpO1xuICAgICAgICAgICAgZW5kID4+Pj0gMDtcbiAgICAgICAgICAgIGlmIChiZWdpbiA8IDAgfHwgYmVnaW4gPiBlbmQgfHwgZW5kID4gdGhpcy5idWZmZXIuYnl0ZUxlbmd0aClcbiAgICAgICAgICAgICAgICB0aHJvdyBSYW5nZUVycm9yKFwiSWxsZWdhbCByYW5nZTogMCA8PSBcIitiZWdpbitcIiA8PSBcIitlbmQrXCIgPD0gXCIrdGhpcy5idWZmZXIuYnl0ZUxlbmd0aCk7XG4gICAgICAgIH1cclxuICAgICAgICBpZiAoYmVnaW4gPT09IGVuZClcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBCeXRlQnVmZmVyKDAsIHRoaXMubGl0dGxlRW5kaWFuLCB0aGlzLm5vQXNzZXJ0KTtcclxuICAgICAgICB2YXIgY2FwYWNpdHkgPSBlbmQgLSBiZWdpbixcclxuICAgICAgICAgICAgYmIgPSBuZXcgQnl0ZUJ1ZmZlcihjYXBhY2l0eSwgdGhpcy5saXR0bGVFbmRpYW4sIHRoaXMubm9Bc3NlcnQpO1xyXG4gICAgICAgIGJiLm9mZnNldCA9IDA7XHJcbiAgICAgICAgYmIubGltaXQgPSBjYXBhY2l0eTtcclxuICAgICAgICBpZiAoYmIubWFya2VkT2Zmc2V0ID49IDApIGJiLm1hcmtlZE9mZnNldCAtPSBiZWdpbjtcclxuICAgICAgICB0aGlzLmNvcHlUbyhiYiwgMCwgYmVnaW4sIGVuZCk7XHJcbiAgICAgICAgcmV0dXJuIGJiO1xyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIENvcGllcyB0aGlzIEJ5dGVCdWZmZXIncyBjb250ZW50cyB0byBhbm90aGVyIEJ5dGVCdWZmZXIuIENvbnRlbnRzIGFyZSB0aGUgYnl0ZXMgYmV0d2VlbiB7QGxpbmsgQnl0ZUJ1ZmZlciNvZmZzZXR9IGFuZFxyXG4gICAgICogIHtAbGluayBCeXRlQnVmZmVyI2xpbWl0fS5cclxuICAgICAqIEBwYXJhbSB7IUJ5dGVCdWZmZXJ9IHRhcmdldCBUYXJnZXQgQnl0ZUJ1ZmZlclxyXG4gICAgICogQHBhcmFtIHtudW1iZXI9fSB0YXJnZXRPZmZzZXQgT2Zmc2V0IHRvIGNvcHkgdG8uIFdpbGwgdXNlIGFuZCBpbmNyZWFzZSB0aGUgdGFyZ2V0J3Mge0BsaW5rIEJ5dGVCdWZmZXIjb2Zmc2V0fVxyXG4gICAgICogIGJ5IHRoZSBudW1iZXIgb2YgYnl0ZXMgY29waWVkIGlmIG9taXR0ZWQuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcj19IHNvdXJjZU9mZnNldCBPZmZzZXQgdG8gc3RhcnQgY29weWluZyBmcm9tLiBXaWxsIHVzZSBhbmQgaW5jcmVhc2Uge0BsaW5rIEJ5dGVCdWZmZXIjb2Zmc2V0fSBieSB0aGVcclxuICAgICAqICBudW1iZXIgb2YgYnl0ZXMgY29waWVkIGlmIG9taXR0ZWQuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcj19IHNvdXJjZUxpbWl0IE9mZnNldCB0byBlbmQgY29weWluZyBmcm9tLCBkZWZhdWx0cyB0byB7QGxpbmsgQnl0ZUJ1ZmZlciNsaW1pdH1cclxuICAgICAqIEByZXR1cm5zIHshQnl0ZUJ1ZmZlcn0gdGhpc1xyXG4gICAgICogQGV4cG9zZVxyXG4gICAgICovXHJcbiAgICBCeXRlQnVmZmVyUHJvdG90eXBlLmNvcHlUbyA9IGZ1bmN0aW9uKHRhcmdldCwgdGFyZ2V0T2Zmc2V0LCBzb3VyY2VPZmZzZXQsIHNvdXJjZUxpbWl0KSB7XHJcbiAgICAgICAgdmFyIHJlbGF0aXZlLFxyXG4gICAgICAgICAgICB0YXJnZXRSZWxhdGl2ZTtcclxuICAgICAgICBpZiAoIXRoaXMubm9Bc3NlcnQpIHtcclxuICAgICAgICAgICAgaWYgKCFCeXRlQnVmZmVyLmlzQnl0ZUJ1ZmZlcih0YXJnZXQpKVxyXG4gICAgICAgICAgICAgICAgdGhyb3cgVHlwZUVycm9yKFwiSWxsZWdhbCB0YXJnZXQ6IE5vdCBhIEJ5dGVCdWZmZXJcIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRhcmdldE9mZnNldCA9ICh0YXJnZXRSZWxhdGl2ZSA9IHR5cGVvZiB0YXJnZXRPZmZzZXQgPT09ICd1bmRlZmluZWQnKSA/IHRhcmdldC5vZmZzZXQgOiB0YXJnZXRPZmZzZXQgfCAwO1xyXG4gICAgICAgIHNvdXJjZU9mZnNldCA9IChyZWxhdGl2ZSA9IHR5cGVvZiBzb3VyY2VPZmZzZXQgPT09ICd1bmRlZmluZWQnKSA/IHRoaXMub2Zmc2V0IDogc291cmNlT2Zmc2V0IHwgMDtcclxuICAgICAgICBzb3VyY2VMaW1pdCA9IHR5cGVvZiBzb3VyY2VMaW1pdCA9PT0gJ3VuZGVmaW5lZCcgPyB0aGlzLmxpbWl0IDogc291cmNlTGltaXQgfCAwO1xyXG5cclxuICAgICAgICBpZiAodGFyZ2V0T2Zmc2V0IDwgMCB8fCB0YXJnZXRPZmZzZXQgPiB0YXJnZXQuYnVmZmVyLmJ5dGVMZW5ndGgpXHJcbiAgICAgICAgICAgIHRocm93IFJhbmdlRXJyb3IoXCJJbGxlZ2FsIHRhcmdldCByYW5nZTogMCA8PSBcIit0YXJnZXRPZmZzZXQrXCIgPD0gXCIrdGFyZ2V0LmJ1ZmZlci5ieXRlTGVuZ3RoKTtcclxuICAgICAgICBpZiAoc291cmNlT2Zmc2V0IDwgMCB8fCBzb3VyY2VMaW1pdCA+IHRoaXMuYnVmZmVyLmJ5dGVMZW5ndGgpXHJcbiAgICAgICAgICAgIHRocm93IFJhbmdlRXJyb3IoXCJJbGxlZ2FsIHNvdXJjZSByYW5nZTogMCA8PSBcIitzb3VyY2VPZmZzZXQrXCIgPD0gXCIrdGhpcy5idWZmZXIuYnl0ZUxlbmd0aCk7XHJcblxyXG4gICAgICAgIHZhciBsZW4gPSBzb3VyY2VMaW1pdCAtIHNvdXJjZU9mZnNldDtcclxuICAgICAgICBpZiAobGVuID09PSAwKVxyXG4gICAgICAgICAgICByZXR1cm4gdGFyZ2V0OyAvLyBOb3RoaW5nIHRvIGNvcHlcclxuXHJcbiAgICAgICAgdGFyZ2V0LmVuc3VyZUNhcGFjaXR5KHRhcmdldE9mZnNldCArIGxlbik7XHJcblxyXG4gICAgICAgIHRhcmdldC52aWV3LnNldCh0aGlzLnZpZXcuc3ViYXJyYXkoc291cmNlT2Zmc2V0LCBzb3VyY2VMaW1pdCksIHRhcmdldE9mZnNldCk7XHJcblxyXG4gICAgICAgIGlmIChyZWxhdGl2ZSkgdGhpcy5vZmZzZXQgKz0gbGVuO1xyXG4gICAgICAgIGlmICh0YXJnZXRSZWxhdGl2ZSkgdGFyZ2V0Lm9mZnNldCArPSBsZW47XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIE1ha2VzIHN1cmUgdGhhdCB0aGlzIEJ5dGVCdWZmZXIgaXMgYmFja2VkIGJ5IGEge0BsaW5rIEJ5dGVCdWZmZXIjYnVmZmVyfSBvZiBhdCBsZWFzdCB0aGUgc3BlY2lmaWVkIGNhcGFjaXR5LiBJZiB0aGVcclxuICAgICAqICBjdXJyZW50IGNhcGFjaXR5IGlzIGV4Y2VlZGVkLCBpdCB3aWxsIGJlIGRvdWJsZWQuIElmIGRvdWJsZSB0aGUgY3VycmVudCBjYXBhY2l0eSBpcyBsZXNzIHRoYW4gdGhlIHJlcXVpcmVkIGNhcGFjaXR5LFxyXG4gICAgICogIHRoZSByZXF1aXJlZCBjYXBhY2l0eSB3aWxsIGJlIHVzZWQgaW5zdGVhZC5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBjYXBhY2l0eSBSZXF1aXJlZCBjYXBhY2l0eVxyXG4gICAgICogQHJldHVybnMgeyFCeXRlQnVmZmVyfSB0aGlzXHJcbiAgICAgKiBAZXhwb3NlXHJcbiAgICAgKi9cclxuICAgIEJ5dGVCdWZmZXJQcm90b3R5cGUuZW5zdXJlQ2FwYWNpdHkgPSBmdW5jdGlvbihjYXBhY2l0eSkge1xyXG4gICAgICAgIHZhciBjdXJyZW50ID0gdGhpcy5idWZmZXIuYnl0ZUxlbmd0aDtcclxuICAgICAgICBpZiAoY3VycmVudCA8IGNhcGFjaXR5KVxyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yZXNpemUoKGN1cnJlbnQgKj0gMikgPiBjYXBhY2l0eSA/IGN1cnJlbnQgOiBjYXBhY2l0eSk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogT3ZlcndyaXRlcyB0aGlzIEJ5dGVCdWZmZXIncyBjb250ZW50cyB3aXRoIHRoZSBzcGVjaWZpZWQgdmFsdWUuIENvbnRlbnRzIGFyZSB0aGUgYnl0ZXMgYmV0d2VlblxyXG4gICAgICogIHtAbGluayBCeXRlQnVmZmVyI29mZnNldH0gYW5kIHtAbGluayBCeXRlQnVmZmVyI2xpbWl0fS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfHN0cmluZ30gdmFsdWUgQnl0ZSB2YWx1ZSB0byBmaWxsIHdpdGguIElmIGdpdmVuIGFzIGEgc3RyaW5nLCB0aGUgZmlyc3QgY2hhcmFjdGVyIGlzIHVzZWQuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcj19IGJlZ2luIEJlZ2luIG9mZnNldC4gV2lsbCB1c2UgYW5kIGluY3JlYXNlIHtAbGluayBCeXRlQnVmZmVyI29mZnNldH0gYnkgdGhlIG51bWJlciBvZiBieXRlc1xyXG4gICAgICogIHdyaXR0ZW4gaWYgb21pdHRlZC4gZGVmYXVsdHMgdG8ge0BsaW5rIEJ5dGVCdWZmZXIjb2Zmc2V0fS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyPX0gZW5kIEVuZCBvZmZzZXQsIGRlZmF1bHRzIHRvIHtAbGluayBCeXRlQnVmZmVyI2xpbWl0fS5cclxuICAgICAqIEByZXR1cm5zIHshQnl0ZUJ1ZmZlcn0gdGhpc1xyXG4gICAgICogQGV4cG9zZVxyXG4gICAgICogQGV4YW1wbGUgYHNvbWVCeXRlQnVmZmVyLmNsZWFyKCkuZmlsbCgwKWAgZmlsbHMgdGhlIGVudGlyZSBiYWNraW5nIGJ1ZmZlciB3aXRoIHplcm9lc1xyXG4gICAgICovXHJcbiAgICBCeXRlQnVmZmVyUHJvdG90eXBlLmZpbGwgPSBmdW5jdGlvbih2YWx1ZSwgYmVnaW4sIGVuZCkge1xyXG4gICAgICAgIHZhciByZWxhdGl2ZSA9IHR5cGVvZiBiZWdpbiA9PT0gJ3VuZGVmaW5lZCc7XG4gICAgICAgIGlmIChyZWxhdGl2ZSkgYmVnaW4gPSB0aGlzLm9mZnNldDtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgdmFsdWUubGVuZ3RoID4gMClcclxuICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5jaGFyQ29kZUF0KDApO1xyXG4gICAgICAgIGlmICh0eXBlb2YgYmVnaW4gPT09ICd1bmRlZmluZWQnKSBiZWdpbiA9IHRoaXMub2Zmc2V0O1xyXG4gICAgICAgIGlmICh0eXBlb2YgZW5kID09PSAndW5kZWZpbmVkJykgZW5kID0gdGhpcy5saW1pdDtcclxuICAgICAgICBpZiAoIXRoaXMubm9Bc3NlcnQpIHtcclxuICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ251bWJlcicgfHwgdmFsdWUgJSAxICE9PSAwKVxuICAgICAgICAgICAgICAgIHRocm93IFR5cGVFcnJvcihcIklsbGVnYWwgdmFsdWU6IFwiK3ZhbHVlK1wiIChub3QgYW4gaW50ZWdlcilcIik7XG4gICAgICAgICAgICB2YWx1ZSB8PSAwO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBiZWdpbiAhPT0gJ251bWJlcicgfHwgYmVnaW4gJSAxICE9PSAwKVxuICAgICAgICAgICAgICAgIHRocm93IFR5cGVFcnJvcihcIklsbGVnYWwgYmVnaW46IE5vdCBhbiBpbnRlZ2VyXCIpO1xuICAgICAgICAgICAgYmVnaW4gPj4+PSAwO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBlbmQgIT09ICdudW1iZXInIHx8IGVuZCAlIDEgIT09IDApXG4gICAgICAgICAgICAgICAgdGhyb3cgVHlwZUVycm9yKFwiSWxsZWdhbCBlbmQ6IE5vdCBhbiBpbnRlZ2VyXCIpO1xuICAgICAgICAgICAgZW5kID4+Pj0gMDtcbiAgICAgICAgICAgIGlmIChiZWdpbiA8IDAgfHwgYmVnaW4gPiBlbmQgfHwgZW5kID4gdGhpcy5idWZmZXIuYnl0ZUxlbmd0aClcbiAgICAgICAgICAgICAgICB0aHJvdyBSYW5nZUVycm9yKFwiSWxsZWdhbCByYW5nZTogMCA8PSBcIitiZWdpbitcIiA8PSBcIitlbmQrXCIgPD0gXCIrdGhpcy5idWZmZXIuYnl0ZUxlbmd0aCk7XG4gICAgICAgIH1cclxuICAgICAgICBpZiAoYmVnaW4gPj0gZW5kKVxyXG4gICAgICAgICAgICByZXR1cm4gdGhpczsgLy8gTm90aGluZyB0byBmaWxsXHJcbiAgICAgICAgd2hpbGUgKGJlZ2luIDwgZW5kKSB0aGlzLnZpZXdbYmVnaW4rK10gPSB2YWx1ZTtcclxuICAgICAgICBpZiAocmVsYXRpdmUpIHRoaXMub2Zmc2V0ID0gYmVnaW47XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogTWFrZXMgdGhpcyBCeXRlQnVmZmVyIHJlYWR5IGZvciBhIG5ldyBzZXF1ZW5jZSBvZiB3cml0ZSBvciByZWxhdGl2ZSByZWFkIG9wZXJhdGlvbnMuIFNldHMgYGxpbWl0ID0gb2Zmc2V0YCBhbmRcclxuICAgICAqICBgb2Zmc2V0ID0gMGAuIE1ha2Ugc3VyZSBhbHdheXMgdG8gZmxpcCBhIEJ5dGVCdWZmZXIgd2hlbiBhbGwgcmVsYXRpdmUgcmVhZCBvciB3cml0ZSBvcGVyYXRpb25zIGFyZSBjb21wbGV0ZS5cclxuICAgICAqIEByZXR1cm5zIHshQnl0ZUJ1ZmZlcn0gdGhpc1xyXG4gICAgICogQGV4cG9zZVxyXG4gICAgICovXHJcbiAgICBCeXRlQnVmZmVyUHJvdG90eXBlLmZsaXAgPSBmdW5jdGlvbigpIHtcclxuICAgICAgICB0aGlzLmxpbWl0ID0gdGhpcy5vZmZzZXQ7XHJcbiAgICAgICAgdGhpcy5vZmZzZXQgPSAwO1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfTtcclxuICAgIC8qKlxyXG4gICAgICogTWFya3MgYW4gb2Zmc2V0IG9uIHRoaXMgQnl0ZUJ1ZmZlciB0byBiZSB1c2VkIGxhdGVyLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXI9fSBvZmZzZXQgT2Zmc2V0IHRvIG1hcmsuIERlZmF1bHRzIHRvIHtAbGluayBCeXRlQnVmZmVyI29mZnNldH0uXHJcbiAgICAgKiBAcmV0dXJucyB7IUJ5dGVCdWZmZXJ9IHRoaXNcclxuICAgICAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gSWYgYG9mZnNldGAgaXMgbm90IGEgdmFsaWQgbnVtYmVyXHJcbiAgICAgKiBAdGhyb3dzIHtSYW5nZUVycm9yfSBJZiBgb2Zmc2V0YCBpcyBvdXQgb2YgYm91bmRzXHJcbiAgICAgKiBAc2VlIEJ5dGVCdWZmZXIjcmVzZXRcclxuICAgICAqIEBleHBvc2VcclxuICAgICAqL1xyXG4gICAgQnl0ZUJ1ZmZlclByb3RvdHlwZS5tYXJrID0gZnVuY3Rpb24ob2Zmc2V0KSB7XHJcbiAgICAgICAgb2Zmc2V0ID0gdHlwZW9mIG9mZnNldCA9PT0gJ3VuZGVmaW5lZCcgPyB0aGlzLm9mZnNldCA6IG9mZnNldDtcclxuICAgICAgICBpZiAoIXRoaXMubm9Bc3NlcnQpIHtcclxuICAgICAgICAgICAgaWYgKHR5cGVvZiBvZmZzZXQgIT09ICdudW1iZXInIHx8IG9mZnNldCAlIDEgIT09IDApXG4gICAgICAgICAgICAgICAgdGhyb3cgVHlwZUVycm9yKFwiSWxsZWdhbCBvZmZzZXQ6IFwiK29mZnNldCtcIiAobm90IGFuIGludGVnZXIpXCIpO1xuICAgICAgICAgICAgb2Zmc2V0ID4+Pj0gMDtcbiAgICAgICAgICAgIGlmIChvZmZzZXQgPCAwIHx8IG9mZnNldCArIDAgPiB0aGlzLmJ1ZmZlci5ieXRlTGVuZ3RoKVxuICAgICAgICAgICAgICAgIHRocm93IFJhbmdlRXJyb3IoXCJJbGxlZ2FsIG9mZnNldDogMCA8PSBcIitvZmZzZXQrXCIgKCtcIiswK1wiKSA8PSBcIit0aGlzLmJ1ZmZlci5ieXRlTGVuZ3RoKTtcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMubWFya2VkT2Zmc2V0ID0gb2Zmc2V0O1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfTtcclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgYnl0ZSBvcmRlci5cclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gbGl0dGxlRW5kaWFuIGB0cnVlYCBmb3IgbGl0dGxlIGVuZGlhbiBieXRlIG9yZGVyLCBgZmFsc2VgIGZvciBiaWcgZW5kaWFuXHJcbiAgICAgKiBAcmV0dXJucyB7IUJ5dGVCdWZmZXJ9IHRoaXNcclxuICAgICAqIEBleHBvc2VcclxuICAgICAqL1xyXG4gICAgQnl0ZUJ1ZmZlclByb3RvdHlwZS5vcmRlciA9IGZ1bmN0aW9uKGxpdHRsZUVuZGlhbikge1xyXG4gICAgICAgIGlmICghdGhpcy5ub0Fzc2VydCkge1xyXG4gICAgICAgICAgICBpZiAodHlwZW9mIGxpdHRsZUVuZGlhbiAhPT0gJ2Jvb2xlYW4nKVxyXG4gICAgICAgICAgICAgICAgdGhyb3cgVHlwZUVycm9yKFwiSWxsZWdhbCBsaXR0bGVFbmRpYW46IE5vdCBhIGJvb2xlYW5cIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMubGl0dGxlRW5kaWFuID0gISFsaXR0bGVFbmRpYW47XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogU3dpdGNoZXMgKHRvKSBsaXR0bGUgZW5kaWFuIGJ5dGUgb3JkZXIuXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW49fSBsaXR0bGVFbmRpYW4gRGVmYXVsdHMgdG8gYHRydWVgLCBvdGhlcndpc2UgdXNlcyBiaWcgZW5kaWFuXHJcbiAgICAgKiBAcmV0dXJucyB7IUJ5dGVCdWZmZXJ9IHRoaXNcclxuICAgICAqIEBleHBvc2VcclxuICAgICAqL1xyXG4gICAgQnl0ZUJ1ZmZlclByb3RvdHlwZS5MRSA9IGZ1bmN0aW9uKGxpdHRsZUVuZGlhbikge1xyXG4gICAgICAgIHRoaXMubGl0dGxlRW5kaWFuID0gdHlwZW9mIGxpdHRsZUVuZGlhbiAhPT0gJ3VuZGVmaW5lZCcgPyAhIWxpdHRsZUVuZGlhbiA6IHRydWU7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogU3dpdGNoZXMgKHRvKSBiaWcgZW5kaWFuIGJ5dGUgb3JkZXIuXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW49fSBiaWdFbmRpYW4gRGVmYXVsdHMgdG8gYHRydWVgLCBvdGhlcndpc2UgdXNlcyBsaXR0bGUgZW5kaWFuXHJcbiAgICAgKiBAcmV0dXJucyB7IUJ5dGVCdWZmZXJ9IHRoaXNcclxuICAgICAqIEBleHBvc2VcclxuICAgICAqL1xyXG4gICAgQnl0ZUJ1ZmZlclByb3RvdHlwZS5CRSA9IGZ1bmN0aW9uKGJpZ0VuZGlhbikge1xyXG4gICAgICAgIHRoaXMubGl0dGxlRW5kaWFuID0gdHlwZW9mIGJpZ0VuZGlhbiAhPT0gJ3VuZGVmaW5lZCcgPyAhYmlnRW5kaWFuIDogZmFsc2U7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9O1xyXG4gICAgLyoqXHJcbiAgICAgKiBQcmVwZW5kcyBzb21lIGRhdGEgdG8gdGhpcyBCeXRlQnVmZmVyLiBUaGlzIHdpbGwgb3ZlcndyaXRlIGFueSBjb250ZW50cyBiZWZvcmUgdGhlIHNwZWNpZmllZCBvZmZzZXQgdXAgdG8gdGhlXHJcbiAgICAgKiAgcHJlcGVuZGVkIGRhdGEncyBsZW5ndGguIElmIHRoZXJlIGlzIG5vdCBlbm91Z2ggc3BhY2UgYXZhaWxhYmxlIGJlZm9yZSB0aGUgc3BlY2lmaWVkIGBvZmZzZXRgLCB0aGUgYmFja2luZyBidWZmZXJcclxuICAgICAqICB3aWxsIGJlIHJlc2l6ZWQgYW5kIGl0cyBjb250ZW50cyBtb3ZlZCBhY2NvcmRpbmdseS5cclxuICAgICAqIEBwYXJhbSB7IUJ5dGVCdWZmZXJ8c3RyaW5nfCFBcnJheUJ1ZmZlcn0gc291cmNlIERhdGEgdG8gcHJlcGVuZC4gSWYgYHNvdXJjZWAgaXMgYSBCeXRlQnVmZmVyLCBpdHMgb2Zmc2V0IHdpbGwgYmVcclxuICAgICAqICBtb2RpZmllZCBhY2NvcmRpbmcgdG8gdGhlIHBlcmZvcm1lZCByZWFkIG9wZXJhdGlvbi5cclxuICAgICAqIEBwYXJhbSB7KHN0cmluZ3xudW1iZXIpPX0gZW5jb2RpbmcgRW5jb2RpbmcgaWYgYGRhdGFgIGlzIGEgc3RyaW5nIChcImJhc2U2NFwiLCBcImhleFwiLCBcImJpbmFyeVwiLCBkZWZhdWx0cyB0byBcInV0ZjhcIilcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyPX0gb2Zmc2V0IE9mZnNldCB0byBwcmVwZW5kIGF0LiBXaWxsIHVzZSBhbmQgZGVjcmVhc2Uge0BsaW5rIEJ5dGVCdWZmZXIjb2Zmc2V0fSBieSB0aGUgbnVtYmVyIG9mIGJ5dGVzXHJcbiAgICAgKiAgcHJlcGVuZGVkIGlmIG9taXR0ZWQuXHJcbiAgICAgKiBAcmV0dXJucyB7IUJ5dGVCdWZmZXJ9IHRoaXNcclxuICAgICAqIEBleHBvc2VcclxuICAgICAqIEBleGFtcGxlIEEgcmVsYXRpdmUgYDAwPDAxIDAyIDAzPi5wcmVwZW5kKDwwNCAwNT4pYCByZXN1bHRzIGluIGA8MDQgMDUgMDEgMDIgMDM+LCAwNCAwNXxgXHJcbiAgICAgKiBAZXhhbXBsZSBBbiBhYnNvbHV0ZSBgMDA8MDEgMDIgMDM+LnByZXBlbmQoPDA0IDA1PiwgMilgIHJlc3VsdHMgaW4gYDA0PDA1IDAyIDAzPiwgMDQgMDV8YFxyXG4gICAgICovXHJcbiAgICBCeXRlQnVmZmVyUHJvdG90eXBlLnByZXBlbmQgPSBmdW5jdGlvbihzb3VyY2UsIGVuY29kaW5nLCBvZmZzZXQpIHtcclxuICAgICAgICBpZiAodHlwZW9mIGVuY29kaW5nID09PSAnbnVtYmVyJyB8fCB0eXBlb2YgZW5jb2RpbmcgIT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgIG9mZnNldCA9IGVuY29kaW5nO1xyXG4gICAgICAgICAgICBlbmNvZGluZyA9IHVuZGVmaW5lZDtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIHJlbGF0aXZlID0gdHlwZW9mIG9mZnNldCA9PT0gJ3VuZGVmaW5lZCc7XG4gICAgICAgIGlmIChyZWxhdGl2ZSkgb2Zmc2V0ID0gdGhpcy5vZmZzZXQ7XG4gICAgICAgIGlmICghdGhpcy5ub0Fzc2VydCkge1xyXG4gICAgICAgICAgICBpZiAodHlwZW9mIG9mZnNldCAhPT0gJ251bWJlcicgfHwgb2Zmc2V0ICUgMSAhPT0gMClcbiAgICAgICAgICAgICAgICB0aHJvdyBUeXBlRXJyb3IoXCJJbGxlZ2FsIG9mZnNldDogXCIrb2Zmc2V0K1wiIChub3QgYW4gaW50ZWdlcilcIik7XG4gICAgICAgICAgICBvZmZzZXQgPj4+PSAwO1xuICAgICAgICAgICAgaWYgKG9mZnNldCA8IDAgfHwgb2Zmc2V0ICsgMCA+IHRoaXMuYnVmZmVyLmJ5dGVMZW5ndGgpXG4gICAgICAgICAgICAgICAgdGhyb3cgUmFuZ2VFcnJvcihcIklsbGVnYWwgb2Zmc2V0OiAwIDw9IFwiK29mZnNldCtcIiAoK1wiKzArXCIpIDw9IFwiK3RoaXMuYnVmZmVyLmJ5dGVMZW5ndGgpO1xuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCEoc291cmNlIGluc3RhbmNlb2YgQnl0ZUJ1ZmZlcikpXHJcbiAgICAgICAgICAgIHNvdXJjZSA9IEJ5dGVCdWZmZXIud3JhcChzb3VyY2UsIGVuY29kaW5nKTtcclxuICAgICAgICB2YXIgbGVuID0gc291cmNlLmxpbWl0IC0gc291cmNlLm9mZnNldDtcclxuICAgICAgICBpZiAobGVuIDw9IDApIHJldHVybiB0aGlzOyAvLyBOb3RoaW5nIHRvIHByZXBlbmRcclxuICAgICAgICB2YXIgZGlmZiA9IGxlbiAtIG9mZnNldDtcclxuICAgICAgICBpZiAoZGlmZiA+IDApIHsgLy8gTm90IGVub3VnaCBzcGFjZSBiZWZvcmUgb2Zmc2V0LCBzbyByZXNpemUgKyBtb3ZlXHJcbiAgICAgICAgICAgIHZhciBidWZmZXIgPSBuZXcgQXJyYXlCdWZmZXIodGhpcy5idWZmZXIuYnl0ZUxlbmd0aCArIGRpZmYpO1xyXG4gICAgICAgICAgICB2YXIgdmlldyA9IG5ldyBVaW50OEFycmF5KGJ1ZmZlcik7XHJcbiAgICAgICAgICAgIHZpZXcuc2V0KHRoaXMudmlldy5zdWJhcnJheShvZmZzZXQsIHRoaXMuYnVmZmVyLmJ5dGVMZW5ndGgpLCBsZW4pO1xyXG4gICAgICAgICAgICB0aGlzLmJ1ZmZlciA9IGJ1ZmZlcjtcclxuICAgICAgICAgICAgdGhpcy52aWV3ID0gdmlldztcclxuICAgICAgICAgICAgdGhpcy5vZmZzZXQgKz0gZGlmZjtcclxuICAgICAgICAgICAgaWYgKHRoaXMubWFya2VkT2Zmc2V0ID49IDApIHRoaXMubWFya2VkT2Zmc2V0ICs9IGRpZmY7XHJcbiAgICAgICAgICAgIHRoaXMubGltaXQgKz0gZGlmZjtcclxuICAgICAgICAgICAgb2Zmc2V0ICs9IGRpZmY7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdmFyIGFycmF5VmlldyA9IG5ldyBVaW50OEFycmF5KHRoaXMuYnVmZmVyKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy52aWV3LnNldChzb3VyY2Uudmlldy5zdWJhcnJheShzb3VyY2Uub2Zmc2V0LCBzb3VyY2UubGltaXQpLCBvZmZzZXQgLSBsZW4pO1xyXG5cclxuICAgICAgICBzb3VyY2Uub2Zmc2V0ID0gc291cmNlLmxpbWl0O1xyXG4gICAgICAgIGlmIChyZWxhdGl2ZSlcclxuICAgICAgICAgICAgdGhpcy5vZmZzZXQgLT0gbGVuO1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFByZXBlbmRzIHRoaXMgQnl0ZUJ1ZmZlciB0byBhbm90aGVyIEJ5dGVCdWZmZXIuIFRoaXMgd2lsbCBvdmVyd3JpdGUgYW55IGNvbnRlbnRzIGJlZm9yZSB0aGUgc3BlY2lmaWVkIG9mZnNldCB1cCB0byB0aGVcclxuICAgICAqICBwcmVwZW5kZWQgZGF0YSdzIGxlbmd0aC4gSWYgdGhlcmUgaXMgbm90IGVub3VnaCBzcGFjZSBhdmFpbGFibGUgYmVmb3JlIHRoZSBzcGVjaWZpZWQgYG9mZnNldGAsIHRoZSBiYWNraW5nIGJ1ZmZlclxyXG4gICAgICogIHdpbGwgYmUgcmVzaXplZCBhbmQgaXRzIGNvbnRlbnRzIG1vdmVkIGFjY29yZGluZ2x5LlxyXG4gICAgICogQHBhcmFtIHshQnl0ZUJ1ZmZlcn0gdGFyZ2V0IFRhcmdldCBCeXRlQnVmZmVyXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcj19IG9mZnNldCBPZmZzZXQgdG8gcHJlcGVuZCBhdC4gV2lsbCB1c2UgYW5kIGRlY3JlYXNlIHtAbGluayBCeXRlQnVmZmVyI29mZnNldH0gYnkgdGhlIG51bWJlciBvZiBieXRlc1xyXG4gICAgICogIHByZXBlbmRlZCBpZiBvbWl0dGVkLlxyXG4gICAgICogQHJldHVybnMgeyFCeXRlQnVmZmVyfSB0aGlzXHJcbiAgICAgKiBAZXhwb3NlXHJcbiAgICAgKiBAc2VlIEJ5dGVCdWZmZXIjcHJlcGVuZFxyXG4gICAgICovXHJcbiAgICBCeXRlQnVmZmVyUHJvdG90eXBlLnByZXBlbmRUbyA9IGZ1bmN0aW9uKHRhcmdldCwgb2Zmc2V0KSB7XHJcbiAgICAgICAgdGFyZ2V0LnByZXBlbmQodGhpcywgb2Zmc2V0KTtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH07XHJcbiAgICAvKipcclxuICAgICAqIFByaW50cyBkZWJ1ZyBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIEJ5dGVCdWZmZXIncyBjb250ZW50cy5cclxuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24oc3RyaW5nKT19IG91dCBPdXRwdXQgZnVuY3Rpb24gdG8gY2FsbCwgZGVmYXVsdHMgdG8gY29uc29sZS5sb2dcclxuICAgICAqIEBleHBvc2VcclxuICAgICAqL1xyXG4gICAgQnl0ZUJ1ZmZlclByb3RvdHlwZS5wcmludERlYnVnID0gZnVuY3Rpb24ob3V0KSB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiBvdXQgIT09ICdmdW5jdGlvbicpIG91dCA9IGNvbnNvbGUubG9nLmJpbmQoY29uc29sZSk7XHJcbiAgICAgICAgb3V0KFxyXG4gICAgICAgICAgICB0aGlzLnRvU3RyaW5nKCkrXCJcXG5cIitcclxuICAgICAgICAgICAgXCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXFxuXCIrXHJcbiAgICAgICAgICAgIHRoaXMudG9EZWJ1ZygvKiBjb2x1bW5zICovIHRydWUpXHJcbiAgICAgICAgKTtcclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIHRoZSBudW1iZXIgb2YgcmVtYWluaW5nIHJlYWRhYmxlIGJ5dGVzLiBDb250ZW50cyBhcmUgdGhlIGJ5dGVzIGJldHdlZW4ge0BsaW5rIEJ5dGVCdWZmZXIjb2Zmc2V0fSBhbmRcclxuICAgICAqICB7QGxpbmsgQnl0ZUJ1ZmZlciNsaW1pdH0sIHNvIHRoaXMgcmV0dXJucyBgbGltaXQgLSBvZmZzZXRgLlxyXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmVtYWluaW5nIHJlYWRhYmxlIGJ5dGVzLiBNYXkgYmUgbmVnYXRpdmUgaWYgYG9mZnNldCA+IGxpbWl0YC5cclxuICAgICAqIEBleHBvc2VcclxuICAgICAqL1xyXG4gICAgQnl0ZUJ1ZmZlclByb3RvdHlwZS5yZW1haW5pbmcgPSBmdW5jdGlvbigpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5saW1pdCAtIHRoaXMub2Zmc2V0O1xyXG4gICAgfTtcclxuICAgIC8qKlxyXG4gICAgICogUmVzZXRzIHRoaXMgQnl0ZUJ1ZmZlcidzIHtAbGluayBCeXRlQnVmZmVyI29mZnNldH0uIElmIGFuIG9mZnNldCBoYXMgYmVlbiBtYXJrZWQgdGhyb3VnaCB7QGxpbmsgQnl0ZUJ1ZmZlciNtYXJrfVxyXG4gICAgICogIGJlZm9yZSwgYG9mZnNldGAgd2lsbCBiZSBzZXQgdG8ge0BsaW5rIEJ5dGVCdWZmZXIjbWFya2VkT2Zmc2V0fSwgd2hpY2ggd2lsbCB0aGVuIGJlIGRpc2NhcmRlZC4gSWYgbm8gb2Zmc2V0IGhhcyBiZWVuXHJcbiAgICAgKiAgbWFya2VkLCBzZXRzIGBvZmZzZXQgPSAwYC5cclxuICAgICAqIEByZXR1cm5zIHshQnl0ZUJ1ZmZlcn0gdGhpc1xyXG4gICAgICogQHNlZSBCeXRlQnVmZmVyI21hcmtcclxuICAgICAqIEBleHBvc2VcclxuICAgICAqL1xyXG4gICAgQnl0ZUJ1ZmZlclByb3RvdHlwZS5yZXNldCA9IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgIGlmICh0aGlzLm1hcmtlZE9mZnNldCA+PSAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMub2Zmc2V0ID0gdGhpcy5tYXJrZWRPZmZzZXQ7XHJcbiAgICAgICAgICAgIHRoaXMubWFya2VkT2Zmc2V0ID0gLTE7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5vZmZzZXQgPSAwO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH07XHJcbiAgICAvKipcclxuICAgICAqIFJlc2l6ZXMgdGhpcyBCeXRlQnVmZmVyIHRvIGJlIGJhY2tlZCBieSBhIGJ1ZmZlciBvZiBhdCBsZWFzdCB0aGUgZ2l2ZW4gY2FwYWNpdHkuIFdpbGwgZG8gbm90aGluZyBpZiBhbHJlYWR5IHRoYXRcclxuICAgICAqICBsYXJnZSBvciBsYXJnZXIuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gY2FwYWNpdHkgQ2FwYWNpdHkgcmVxdWlyZWRcclxuICAgICAqIEByZXR1cm5zIHshQnl0ZUJ1ZmZlcn0gdGhpc1xyXG4gICAgICogQHRocm93cyB7VHlwZUVycm9yfSBJZiBgY2FwYWNpdHlgIGlzIG5vdCBhIG51bWJlclxyXG4gICAgICogQHRocm93cyB7UmFuZ2VFcnJvcn0gSWYgYGNhcGFjaXR5IDwgMGBcclxuICAgICAqIEBleHBvc2VcclxuICAgICAqL1xyXG4gICAgQnl0ZUJ1ZmZlclByb3RvdHlwZS5yZXNpemUgPSBmdW5jdGlvbihjYXBhY2l0eSkge1xyXG4gICAgICAgIGlmICghdGhpcy5ub0Fzc2VydCkge1xyXG4gICAgICAgICAgICBpZiAodHlwZW9mIGNhcGFjaXR5ICE9PSAnbnVtYmVyJyB8fCBjYXBhY2l0eSAlIDEgIT09IDApXG4gICAgICAgICAgICAgICAgdGhyb3cgVHlwZUVycm9yKFwiSWxsZWdhbCBjYXBhY2l0eTogXCIrY2FwYWNpdHkrXCIgKG5vdCBhbiBpbnRlZ2VyKVwiKTtcbiAgICAgICAgICAgIGNhcGFjaXR5IHw9IDA7XG4gICAgICAgICAgICBpZiAoY2FwYWNpdHkgPCAwKVxyXG4gICAgICAgICAgICAgICAgdGhyb3cgUmFuZ2VFcnJvcihcIklsbGVnYWwgY2FwYWNpdHk6IDAgPD0gXCIrY2FwYWNpdHkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5idWZmZXIuYnl0ZUxlbmd0aCA8IGNhcGFjaXR5KSB7XHJcbiAgICAgICAgICAgIHZhciBidWZmZXIgPSBuZXcgQXJyYXlCdWZmZXIoY2FwYWNpdHkpO1xyXG4gICAgICAgICAgICB2YXIgdmlldyA9IG5ldyBVaW50OEFycmF5KGJ1ZmZlcik7XHJcbiAgICAgICAgICAgIHZpZXcuc2V0KHRoaXMudmlldyk7XHJcbiAgICAgICAgICAgIHRoaXMuYnVmZmVyID0gYnVmZmVyO1xyXG4gICAgICAgICAgICB0aGlzLnZpZXcgPSB2aWV3O1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH07XHJcbiAgICAvKipcclxuICAgICAqIFJldmVyc2VzIHRoaXMgQnl0ZUJ1ZmZlcidzIGNvbnRlbnRzLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXI9fSBiZWdpbiBPZmZzZXQgdG8gc3RhcnQgYXQsIGRlZmF1bHRzIHRvIHtAbGluayBCeXRlQnVmZmVyI29mZnNldH1cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyPX0gZW5kIE9mZnNldCB0byBlbmQgYXQsIGRlZmF1bHRzIHRvIHtAbGluayBCeXRlQnVmZmVyI2xpbWl0fVxyXG4gICAgICogQHJldHVybnMgeyFCeXRlQnVmZmVyfSB0aGlzXHJcbiAgICAgKiBAZXhwb3NlXHJcbiAgICAgKi9cclxuICAgIEJ5dGVCdWZmZXJQcm90b3R5cGUucmV2ZXJzZSA9IGZ1bmN0aW9uKGJlZ2luLCBlbmQpIHtcclxuICAgICAgICBpZiAodHlwZW9mIGJlZ2luID09PSAndW5kZWZpbmVkJykgYmVnaW4gPSB0aGlzLm9mZnNldDtcclxuICAgICAgICBpZiAodHlwZW9mIGVuZCA9PT0gJ3VuZGVmaW5lZCcpIGVuZCA9IHRoaXMubGltaXQ7XHJcbiAgICAgICAgaWYgKCF0aGlzLm5vQXNzZXJ0KSB7XHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgYmVnaW4gIT09ICdudW1iZXInIHx8IGJlZ2luICUgMSAhPT0gMClcbiAgICAgICAgICAgICAgICB0aHJvdyBUeXBlRXJyb3IoXCJJbGxlZ2FsIGJlZ2luOiBOb3QgYW4gaW50ZWdlclwiKTtcbiAgICAgICAgICAgIGJlZ2luID4+Pj0gMDtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgZW5kICE9PSAnbnVtYmVyJyB8fCBlbmQgJSAxICE9PSAwKVxuICAgICAgICAgICAgICAgIHRocm93IFR5cGVFcnJvcihcIklsbGVnYWwgZW5kOiBOb3QgYW4gaW50ZWdlclwiKTtcbiAgICAgICAgICAgIGVuZCA+Pj49IDA7XG4gICAgICAgICAgICBpZiAoYmVnaW4gPCAwIHx8IGJlZ2luID4gZW5kIHx8IGVuZCA+IHRoaXMuYnVmZmVyLmJ5dGVMZW5ndGgpXG4gICAgICAgICAgICAgICAgdGhyb3cgUmFuZ2VFcnJvcihcIklsbGVnYWwgcmFuZ2U6IDAgPD0gXCIrYmVnaW4rXCIgPD0gXCIrZW5kK1wiIDw9IFwiK3RoaXMuYnVmZmVyLmJ5dGVMZW5ndGgpO1xuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGJlZ2luID09PSBlbmQpXHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzOyAvLyBOb3RoaW5nIHRvIHJldmVyc2VcclxuICAgICAgICBBcnJheS5wcm90b3R5cGUucmV2ZXJzZS5jYWxsKHRoaXMudmlldy5zdWJhcnJheShiZWdpbiwgZW5kKSk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9O1xyXG4gICAgLyoqXHJcbiAgICAgKiBTa2lwcyB0aGUgbmV4dCBgbGVuZ3RoYCBieXRlcy4gVGhpcyB3aWxsIGp1c3QgYWR2YW5jZVxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGxlbmd0aCBOdW1iZXIgb2YgYnl0ZXMgdG8gc2tpcC4gTWF5IGFsc28gYmUgbmVnYXRpdmUgdG8gbW92ZSB0aGUgb2Zmc2V0IGJhY2suXHJcbiAgICAgKiBAcmV0dXJucyB7IUJ5dGVCdWZmZXJ9IHRoaXNcclxuICAgICAqIEBleHBvc2VcclxuICAgICAqL1xyXG4gICAgQnl0ZUJ1ZmZlclByb3RvdHlwZS5za2lwID0gZnVuY3Rpb24obGVuZ3RoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLm5vQXNzZXJ0KSB7XHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgbGVuZ3RoICE9PSAnbnVtYmVyJyB8fCBsZW5ndGggJSAxICE9PSAwKVxuICAgICAgICAgICAgICAgIHRocm93IFR5cGVFcnJvcihcIklsbGVnYWwgbGVuZ3RoOiBcIitsZW5ndGgrXCIgKG5vdCBhbiBpbnRlZ2VyKVwiKTtcbiAgICAgICAgICAgIGxlbmd0aCB8PSAwO1xuICAgICAgICB9XHJcbiAgICAgICAgdmFyIG9mZnNldCA9IHRoaXMub2Zmc2V0ICsgbGVuZ3RoO1xyXG4gICAgICAgIGlmICghdGhpcy5ub0Fzc2VydCkge1xyXG4gICAgICAgICAgICBpZiAob2Zmc2V0IDwgMCB8fCBvZmZzZXQgPiB0aGlzLmJ1ZmZlci5ieXRlTGVuZ3RoKVxyXG4gICAgICAgICAgICAgICAgdGhyb3cgUmFuZ2VFcnJvcihcIklsbGVnYWwgbGVuZ3RoOiAwIDw9IFwiK3RoaXMub2Zmc2V0K1wiICsgXCIrbGVuZ3RoK1wiIDw9IFwiK3RoaXMuYnVmZmVyLmJ5dGVMZW5ndGgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLm9mZnNldCA9IG9mZnNldDtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTbGljZXMgdGhpcyBCeXRlQnVmZmVyIGJ5IGNyZWF0aW5nIGEgY2xvbmVkIGluc3RhbmNlIHdpdGggYG9mZnNldCA9IGJlZ2luYCBhbmQgYGxpbWl0ID0gZW5kYC5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyPX0gYmVnaW4gQmVnaW4gb2Zmc2V0LCBkZWZhdWx0cyB0byB7QGxpbmsgQnl0ZUJ1ZmZlciNvZmZzZXR9LlxyXG4gICAgICogQHBhcmFtIHtudW1iZXI9fSBlbmQgRW5kIG9mZnNldCwgZGVmYXVsdHMgdG8ge0BsaW5rIEJ5dGVCdWZmZXIjbGltaXR9LlxyXG4gICAgICogQHJldHVybnMgeyFCeXRlQnVmZmVyfSBDbG9uZSBvZiB0aGlzIEJ5dGVCdWZmZXIgd2l0aCBzbGljaW5nIGFwcGxpZWQsIGJhY2tlZCBieSB0aGUgc2FtZSB7QGxpbmsgQnl0ZUJ1ZmZlciNidWZmZXJ9XHJcbiAgICAgKiBAZXhwb3NlXHJcbiAgICAgKi9cclxuICAgIEJ5dGVCdWZmZXJQcm90b3R5cGUuc2xpY2UgPSBmdW5jdGlvbihiZWdpbiwgZW5kKSB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiBiZWdpbiA9PT0gJ3VuZGVmaW5lZCcpIGJlZ2luID0gdGhpcy5vZmZzZXQ7XHJcbiAgICAgICAgaWYgKHR5cGVvZiBlbmQgPT09ICd1bmRlZmluZWQnKSBlbmQgPSB0aGlzLmxpbWl0O1xyXG4gICAgICAgIGlmICghdGhpcy5ub0Fzc2VydCkge1xyXG4gICAgICAgICAgICBpZiAodHlwZW9mIGJlZ2luICE9PSAnbnVtYmVyJyB8fCBiZWdpbiAlIDEgIT09IDApXG4gICAgICAgICAgICAgICAgdGhyb3cgVHlwZUVycm9yKFwiSWxsZWdhbCBiZWdpbjogTm90IGFuIGludGVnZXJcIik7XG4gICAgICAgICAgICBiZWdpbiA+Pj49IDA7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGVuZCAhPT0gJ251bWJlcicgfHwgZW5kICUgMSAhPT0gMClcbiAgICAgICAgICAgICAgICB0aHJvdyBUeXBlRXJyb3IoXCJJbGxlZ2FsIGVuZDogTm90IGFuIGludGVnZXJcIik7XG4gICAgICAgICAgICBlbmQgPj4+PSAwO1xuICAgICAgICAgICAgaWYgKGJlZ2luIDwgMCB8fCBiZWdpbiA+IGVuZCB8fCBlbmQgPiB0aGlzLmJ1ZmZlci5ieXRlTGVuZ3RoKVxuICAgICAgICAgICAgICAgIHRocm93IFJhbmdlRXJyb3IoXCJJbGxlZ2FsIHJhbmdlOiAwIDw9IFwiK2JlZ2luK1wiIDw9IFwiK2VuZCtcIiA8PSBcIit0aGlzLmJ1ZmZlci5ieXRlTGVuZ3RoKTtcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciBiYiA9IHRoaXMuY2xvbmUoKTtcclxuICAgICAgICBiYi5vZmZzZXQgPSBiZWdpbjtcclxuICAgICAgICBiYi5saW1pdCA9IGVuZDtcclxuICAgICAgICByZXR1cm4gYmI7XHJcbiAgICB9O1xyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGEgY29weSBvZiB0aGUgYmFja2luZyBidWZmZXIgdGhhdCBjb250YWlucyB0aGlzIEJ5dGVCdWZmZXIncyBjb250ZW50cy4gQ29udGVudHMgYXJlIHRoZSBieXRlcyBiZXR3ZWVuXHJcbiAgICAgKiAge0BsaW5rIEJ5dGVCdWZmZXIjb2Zmc2V0fSBhbmQge0BsaW5rIEJ5dGVCdWZmZXIjbGltaXR9LlxyXG4gICAgICogQHBhcmFtIHtib29sZWFuPX0gZm9yY2VDb3B5IElmIGB0cnVlYCByZXR1cm5zIGEgY29weSwgb3RoZXJ3aXNlIHJldHVybnMgYSB2aWV3IHJlZmVyZW5jaW5nIHRoZSBzYW1lIG1lbW9yeSBpZlxyXG4gICAgICogIHBvc3NpYmxlLiBEZWZhdWx0cyB0byBgZmFsc2VgXHJcbiAgICAgKiBAcmV0dXJucyB7IUFycmF5QnVmZmVyfSBDb250ZW50cyBhcyBhbiBBcnJheUJ1ZmZlclxyXG4gICAgICogQGV4cG9zZVxyXG4gICAgICovXHJcbiAgICBCeXRlQnVmZmVyUHJvdG90eXBlLnRvQnVmZmVyID0gZnVuY3Rpb24oZm9yY2VDb3B5KSB7XHJcbiAgICAgICAgdmFyIG9mZnNldCA9IHRoaXMub2Zmc2V0LFxyXG4gICAgICAgICAgICBsaW1pdCA9IHRoaXMubGltaXQ7XHJcbiAgICAgICAgaWYgKCF0aGlzLm5vQXNzZXJ0KSB7XHJcbiAgICAgICAgICAgIGlmICh0eXBlb2Ygb2Zmc2V0ICE9PSAnbnVtYmVyJyB8fCBvZmZzZXQgJSAxICE9PSAwKVxuICAgICAgICAgICAgICAgIHRocm93IFR5cGVFcnJvcihcIklsbGVnYWwgb2Zmc2V0OiBOb3QgYW4gaW50ZWdlclwiKTtcbiAgICAgICAgICAgIG9mZnNldCA+Pj49IDA7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGxpbWl0ICE9PSAnbnVtYmVyJyB8fCBsaW1pdCAlIDEgIT09IDApXG4gICAgICAgICAgICAgICAgdGhyb3cgVHlwZUVycm9yKFwiSWxsZWdhbCBsaW1pdDogTm90IGFuIGludGVnZXJcIik7XG4gICAgICAgICAgICBsaW1pdCA+Pj49IDA7XG4gICAgICAgICAgICBpZiAob2Zmc2V0IDwgMCB8fCBvZmZzZXQgPiBsaW1pdCB8fCBsaW1pdCA+IHRoaXMuYnVmZmVyLmJ5dGVMZW5ndGgpXG4gICAgICAgICAgICAgICAgdGhyb3cgUmFuZ2VFcnJvcihcIklsbGVnYWwgcmFuZ2U6IDAgPD0gXCIrb2Zmc2V0K1wiIDw9IFwiK2xpbWl0K1wiIDw9IFwiK3RoaXMuYnVmZmVyLmJ5dGVMZW5ndGgpO1xuICAgICAgICB9XHJcbiAgICAgICAgLy8gTk9URTogSXQncyBub3QgcG9zc2libGUgdG8gaGF2ZSBhbm90aGVyIEFycmF5QnVmZmVyIHJlZmVyZW5jZSB0aGUgc2FtZSBtZW1vcnkgYXMgdGhlIGJhY2tpbmcgYnVmZmVyLiBUaGlzIGlzXHJcbiAgICAgICAgLy8gcG9zc2libGUgd2l0aCBVaW50OEFycmF5I3N1YmFycmF5IG9ubHksIGJ1dCB3ZSBoYXZlIHRvIHJldHVybiBhbiBBcnJheUJ1ZmZlciBieSBjb250cmFjdC4gU286XHJcbiAgICAgICAgaWYgKCFmb3JjZUNvcHkgJiYgb2Zmc2V0ID09PSAwICYmIGxpbWl0ID09PSB0aGlzLmJ1ZmZlci5ieXRlTGVuZ3RoKVxyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5idWZmZXI7XHJcbiAgICAgICAgaWYgKG9mZnNldCA9PT0gbGltaXQpXHJcbiAgICAgICAgICAgIHJldHVybiBFTVBUWV9CVUZGRVI7XHJcbiAgICAgICAgdmFyIGJ1ZmZlciA9IG5ldyBBcnJheUJ1ZmZlcihsaW1pdCAtIG9mZnNldCk7XHJcbiAgICAgICAgbmV3IFVpbnQ4QXJyYXkoYnVmZmVyKS5zZXQobmV3IFVpbnQ4QXJyYXkodGhpcy5idWZmZXIpLnN1YmFycmF5KG9mZnNldCwgbGltaXQpLCAwKTtcclxuICAgICAgICByZXR1cm4gYnVmZmVyO1xyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYSByYXcgYnVmZmVyIGNvbXBhY3RlZCB0byBjb250YWluIHRoaXMgQnl0ZUJ1ZmZlcidzIGNvbnRlbnRzLiBDb250ZW50cyBhcmUgdGhlIGJ5dGVzIGJldHdlZW5cclxuICAgICAqICB7QGxpbmsgQnl0ZUJ1ZmZlciNvZmZzZXR9IGFuZCB7QGxpbmsgQnl0ZUJ1ZmZlciNsaW1pdH0uIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIEJ5dGVCdWZmZXIjdG9CdWZmZXJ9LlxyXG4gICAgICogQGZ1bmN0aW9uXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW49fSBmb3JjZUNvcHkgSWYgYHRydWVgIHJldHVybnMgYSBjb3B5LCBvdGhlcndpc2UgcmV0dXJucyBhIHZpZXcgcmVmZXJlbmNpbmcgdGhlIHNhbWUgbWVtb3J5LlxyXG4gICAgICogIERlZmF1bHRzIHRvIGBmYWxzZWBcclxuICAgICAqIEByZXR1cm5zIHshQXJyYXlCdWZmZXJ9IENvbnRlbnRzIGFzIGFuIEFycmF5QnVmZmVyXHJcbiAgICAgKiBAZXhwb3NlXHJcbiAgICAgKi9cclxuICAgIEJ5dGVCdWZmZXJQcm90b3R5cGUudG9BcnJheUJ1ZmZlciA9IEJ5dGVCdWZmZXJQcm90b3R5cGUudG9CdWZmZXI7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb252ZXJ0cyB0aGUgQnl0ZUJ1ZmZlcidzIGNvbnRlbnRzIHRvIGEgc3RyaW5nLlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmc9fSBlbmNvZGluZyBPdXRwdXQgZW5jb2RpbmcuIFJldHVybnMgYW4gaW5mb3JtYXRpdmUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIGlmIG9taXR0ZWQgYnV0IGFsc28gYWxsb3dzXHJcbiAgICAgKiAgZGlyZWN0IGNvbnZlcnNpb24gdG8gXCJ1dGY4XCIsIFwiaGV4XCIsIFwiYmFzZTY0XCIgYW5kIFwiYmluYXJ5XCIgZW5jb2RpbmcuIFwiZGVidWdcIiByZXR1cm5zIGEgaGV4IHJlcHJlc2VudGF0aW9uIHdpdGhcclxuICAgICAqICBoaWdobGlnaHRlZCBvZmZzZXRzLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXI9fSBiZWdpbiBPZmZzZXQgdG8gYmVnaW4gYXQsIGRlZmF1bHRzIHRvIHtAbGluayBCeXRlQnVmZmVyI29mZnNldH1cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyPX0gZW5kIE9mZnNldCB0byBlbmQgYXQsIGRlZmF1bHRzIHRvIHtAbGluayBCeXRlQnVmZmVyI2xpbWl0fVxyXG4gICAgICogQHJldHVybnMge3N0cmluZ30gU3RyaW5nIHJlcHJlc2VudGF0aW9uXHJcbiAgICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYgYGVuY29kaW5nYCBpcyBpbnZhbGlkXHJcbiAgICAgKiBAZXhwb3NlXHJcbiAgICAgKi9cclxuICAgIEJ5dGVCdWZmZXJQcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbihlbmNvZGluZywgYmVnaW4sIGVuZCkge1xyXG4gICAgICAgIGlmICh0eXBlb2YgZW5jb2RpbmcgPT09ICd1bmRlZmluZWQnKVxyXG4gICAgICAgICAgICByZXR1cm4gXCJCeXRlQnVmZmVyQUIob2Zmc2V0PVwiK3RoaXMub2Zmc2V0K1wiLG1hcmtlZE9mZnNldD1cIit0aGlzLm1hcmtlZE9mZnNldCtcIixsaW1pdD1cIit0aGlzLmxpbWl0K1wiLGNhcGFjaXR5PVwiK3RoaXMuY2FwYWNpdHkoKStcIilcIjtcclxuICAgICAgICBpZiAodHlwZW9mIGVuY29kaW5nID09PSAnbnVtYmVyJylcclxuICAgICAgICAgICAgZW5jb2RpbmcgPSBcInV0ZjhcIixcclxuICAgICAgICAgICAgYmVnaW4gPSBlbmNvZGluZyxcclxuICAgICAgICAgICAgZW5kID0gYmVnaW47XHJcbiAgICAgICAgc3dpdGNoIChlbmNvZGluZykge1xyXG4gICAgICAgICAgICBjYXNlIFwidXRmOFwiOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudG9VVEY4KGJlZ2luLCBlbmQpO1xyXG4gICAgICAgICAgICBjYXNlIFwiYmFzZTY0XCI6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50b0Jhc2U2NChiZWdpbiwgZW5kKTtcclxuICAgICAgICAgICAgY2FzZSBcImhleFwiOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudG9IZXgoYmVnaW4sIGVuZCk7XHJcbiAgICAgICAgICAgIGNhc2UgXCJiaW5hcnlcIjpcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRvQmluYXJ5KGJlZ2luLCBlbmQpO1xyXG4gICAgICAgICAgICBjYXNlIFwiZGVidWdcIjpcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRvRGVidWcoKTtcclxuICAgICAgICAgICAgY2FzZSBcImNvbHVtbnNcIjpcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRvQ29sdW1ucygpO1xyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoXCJVbnN1cHBvcnRlZCBlbmNvZGluZzogXCIrZW5jb2RpbmcpO1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgLy8gbHhpdi1lbWJlZGRhYmxlXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBseGl2LWVtYmVkZGFibGUgKGMpIDIwMTQgRGFuaWVsIFdpcnR6IDxkY29kZUBkY29kZS5pbz5cclxuICAgICAqIFJlbGVhc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjBcclxuICAgICAqIHNlZTogaHR0cHM6Ly9naXRodWIuY29tL2Rjb2RlSU8vbHhpdiBmb3IgZGV0YWlsc1xyXG4gICAgICovXHJcbiAgICB2YXIgbHhpdiA9IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgIFwidXNlIHN0cmljdFwiO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBseGl2IG5hbWVzcGFjZS5cclxuICAgICAgICAgKiBAdHlwZSB7IU9iamVjdC48c3RyaW5nLCo+fVxyXG4gICAgICAgICAqIEBleHBvcnRzIGx4aXZcclxuICAgICAgICAgKi9cclxuICAgICAgICB2YXIgbHhpdiA9IHt9O1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBDaGFyYWN0ZXIgY29kZXMgZm9yIG91dHB1dC5cclxuICAgICAgICAgKiBAdHlwZSB7IUFycmF5LjxudW1iZXI+fVxyXG4gICAgICAgICAqIEBpbm5lclxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHZhciBhb3V0ID0gW1xyXG4gICAgICAgICAgICA2NSwgNjYsIDY3LCA2OCwgNjksIDcwLCA3MSwgNzIsIDczLCA3NCwgNzUsIDc2LCA3NywgNzgsIDc5LCA4MCxcclxuICAgICAgICAgICAgODEsIDgyLCA4MywgODQsIDg1LCA4NiwgODcsIDg4LCA4OSwgOTAsIDk3LCA5OCwgOTksIDEwMCwgMTAxLCAxMDIsXHJcbiAgICAgICAgICAgIDEwMywgMTA0LCAxMDUsIDEwNiwgMTA3LCAxMDgsIDEwOSwgMTEwLCAxMTEsIDExMiwgMTEzLCAxMTQsIDExNSwgMTE2LCAxMTcsIDExOCxcclxuICAgICAgICAgICAgMTE5LCAxMjAsIDEyMSwgMTIyLCA0OCwgNDksIDUwLCA1MSwgNTIsIDUzLCA1NCwgNTUsIDU2LCA1NywgNDMsIDQ3XHJcbiAgICAgICAgXTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQ2hhcmFjdGVyIGNvZGVzIGZvciBpbnB1dC5cclxuICAgICAgICAgKiBAdHlwZSB7IUFycmF5LjxudW1iZXI+fVxyXG4gICAgICAgICAqIEBpbm5lclxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHZhciBhaW4gPSBbXTtcclxuICAgICAgICBmb3IgKHZhciBpPTAsIGs9YW91dC5sZW5ndGg7IGk8azsgKytpKVxyXG4gICAgICAgICAgICBhaW5bYW91dFtpXV0gPSBpO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBFbmNvZGVzIGJ5dGVzIHRvIGJhc2U2NCBjaGFyIGNvZGVzLlxyXG4gICAgICAgICAqIEBwYXJhbSB7IWZ1bmN0aW9uKCk6bnVtYmVyfG51bGx9IHNyYyBCeXRlcyBzb3VyY2UgYXMgYSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIG5leHQgYnl0ZSByZXNwZWN0aXZlbHkgYG51bGxgIGlmXHJcbiAgICAgICAgICogIHRoZXJlIGFyZSBubyBtb3JlIGJ5dGVzIGxlZnQuXHJcbiAgICAgICAgICogQHBhcmFtIHshZnVuY3Rpb24obnVtYmVyKX0gZHN0IENoYXJhY3RlcnMgZGVzdGluYXRpb24gYXMgYSBmdW5jdGlvbiBzdWNjZXNzaXZlbHkgY2FsbGVkIHdpdGggZWFjaCBlbmNvZGVkIGNoYXJcclxuICAgICAgICAgKiAgY29kZS5cclxuICAgICAgICAgKi9cclxuICAgICAgICBseGl2LmVuY29kZSA9IGZ1bmN0aW9uKHNyYywgZHN0KSB7XHJcbiAgICAgICAgICAgIHZhciBiLCB0O1xyXG4gICAgICAgICAgICB3aGlsZSAoKGIgPSBzcmMoKSkgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIGRzdChhb3V0WyhiPj4yKSYweDNmXSk7XHJcbiAgICAgICAgICAgICAgICB0ID0gKGImMHgzKTw8NDtcclxuICAgICAgICAgICAgICAgIGlmICgoYiA9IHNyYygpKSAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHQgfD0gKGI+PjQpJjB4ZjtcclxuICAgICAgICAgICAgICAgICAgICBkc3QoYW91dFsodHwoKGI+PjQpJjB4ZikpJjB4M2ZdKTtcclxuICAgICAgICAgICAgICAgICAgICB0ID0gKGImMHhmKTw8MjtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoKGIgPSBzcmMoKSkgIT09IG51bGwpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRzdChhb3V0Wyh0fCgoYj4+NikmMHgzKSkmMHgzZl0pLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBkc3QoYW91dFtiJjB4M2ZdKTtcclxuICAgICAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRzdChhb3V0W3QmMHgzZl0pLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBkc3QoNjEpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlXHJcbiAgICAgICAgICAgICAgICAgICAgZHN0KGFvdXRbdCYweDNmXSksXHJcbiAgICAgICAgICAgICAgICAgICAgZHN0KDYxKSxcclxuICAgICAgICAgICAgICAgICAgICBkc3QoNjEpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogRGVjb2RlcyBiYXNlNjQgY2hhciBjb2RlcyB0byBieXRlcy5cclxuICAgICAgICAgKiBAcGFyYW0geyFmdW5jdGlvbigpOm51bWJlcnxudWxsfSBzcmMgQ2hhcmFjdGVycyBzb3VyY2UgYXMgYSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIG5leHQgY2hhciBjb2RlIHJlc3BlY3RpdmVseVxyXG4gICAgICAgICAqICBgbnVsbGAgaWYgdGhlcmUgYXJlIG5vIG1vcmUgY2hhcmFjdGVycyBsZWZ0LlxyXG4gICAgICAgICAqIEBwYXJhbSB7IWZ1bmN0aW9uKG51bWJlcil9IGRzdCBCeXRlcyBkZXN0aW5hdGlvbiBhcyBhIGZ1bmN0aW9uIHN1Y2Nlc3NpdmVseSBjYWxsZWQgd2l0aCB0aGUgbmV4dCBieXRlLlxyXG4gICAgICAgICAqIEB0aHJvd3Mge0Vycm9yfSBJZiBhIGNoYXJhY3RlciBjb2RlIGlzIGludmFsaWRcclxuICAgICAgICAgKi9cclxuICAgICAgICBseGl2LmRlY29kZSA9IGZ1bmN0aW9uKHNyYywgZHN0KSB7XHJcbiAgICAgICAgICAgIHZhciBjLCB0MSwgdDI7XHJcbiAgICAgICAgICAgIGZ1bmN0aW9uIGZhaWwoYykge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoXCJJbGxlZ2FsIGNoYXJhY3RlciBjb2RlOiBcIitjKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB3aGlsZSAoKGMgPSBzcmMoKSkgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHQxID0gYWluW2NdO1xyXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB0MSA9PT0gJ3VuZGVmaW5lZCcpIGZhaWwoYyk7XHJcbiAgICAgICAgICAgICAgICBpZiAoKGMgPSBzcmMoKSkgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICB0MiA9IGFpbltjXTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHQyID09PSAndW5kZWZpbmVkJykgZmFpbChjKTtcclxuICAgICAgICAgICAgICAgICAgICBkc3QoKHQxPDwyKT4+PjB8KHQyJjB4MzApPj40KTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoKGMgPSBzcmMoKSkgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdDEgPSBhaW5bY107XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdDEgPT09ICd1bmRlZmluZWQnKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGMgPT09IDYxKSBicmVhazsgZWxzZSBmYWlsKGMpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkc3QoKCh0MiYweGYpPDw0KT4+PjB8KHQxJjB4M2MpPj4yKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChjID0gc3JjKCkpICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0MiA9IGFpbltjXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdDIgPT09ICd1bmRlZmluZWQnKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjID09PSA2MSkgYnJlYWs7IGVsc2UgZmFpbChjKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdCgoKHQxJjB4Myk8PDYpPj4+MHx0Mik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUZXN0cyBpZiBhIHN0cmluZyBpcyB2YWxpZCBiYXNlNjQuXHJcbiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHN0ciBTdHJpbmcgdG8gdGVzdFxyXG4gICAgICAgICAqIEByZXR1cm5zIHtib29sZWFufSBgdHJ1ZWAgaWYgdmFsaWQsIG90aGVyd2lzZSBgZmFsc2VgXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgbHhpdi50ZXN0ID0gZnVuY3Rpb24oc3RyKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAvXig/OltBLVphLXowLTkrL117NH0pKig/OltBLVphLXowLTkrL117Mn09PXxbQS1aYS16MC05Ky9dezN9PSk/JC8udGVzdChzdHIpO1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHJldHVybiBseGl2O1xyXG4gICAgfSgpO1xyXG5cclxuICAgIC8vIGVuY29kaW5ncy9iYXNlNjRcclxuXHJcbiAgICAvKipcclxuICAgICAqIEVuY29kZXMgdGhpcyBCeXRlQnVmZmVyJ3MgY29udGVudHMgdG8gYSBiYXNlNjQgZW5jb2RlZCBzdHJpbmcuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcj19IGJlZ2luIE9mZnNldCB0byBiZWdpbiBhdCwgZGVmYXVsdHMgdG8ge0BsaW5rIEJ5dGVCdWZmZXIjb2Zmc2V0fS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyPX0gZW5kIE9mZnNldCB0byBlbmQgYXQsIGRlZmF1bHRzIHRvIHtAbGluayBCeXRlQnVmZmVyI2xpbWl0fS5cclxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IEJhc2U2NCBlbmNvZGVkIHN0cmluZ1xyXG4gICAgICogQHRocm93cyB7UmFuZ2VFcnJvcn0gSWYgYGJlZ2luYCBvciBgZW5kYCBpcyBvdXQgb2YgYm91bmRzXHJcbiAgICAgKiBAZXhwb3NlXHJcbiAgICAgKi9cclxuICAgIEJ5dGVCdWZmZXJQcm90b3R5cGUudG9CYXNlNjQgPSBmdW5jdGlvbihiZWdpbiwgZW5kKSB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiBiZWdpbiA9PT0gJ3VuZGVmaW5lZCcpXHJcbiAgICAgICAgICAgIGJlZ2luID0gdGhpcy5vZmZzZXQ7XHJcbiAgICAgICAgaWYgKHR5cGVvZiBlbmQgPT09ICd1bmRlZmluZWQnKVxyXG4gICAgICAgICAgICBlbmQgPSB0aGlzLmxpbWl0O1xyXG4gICAgICAgIGJlZ2luID0gYmVnaW4gfCAwOyBlbmQgPSBlbmQgfCAwO1xyXG4gICAgICAgIGlmIChiZWdpbiA8IDAgfHwgZW5kID4gdGhpcy5jYXBhY2l0eSB8fCBiZWdpbiA+IGVuZClcclxuICAgICAgICAgICAgdGhyb3cgUmFuZ2VFcnJvcihcImJlZ2luLCBlbmRcIik7XHJcbiAgICAgICAgdmFyIHNkOyBseGl2LmVuY29kZShmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGJlZ2luIDwgZW5kID8gdGhpcy52aWV3W2JlZ2luKytdIDogbnVsbDtcclxuICAgICAgICB9LmJpbmQodGhpcyksIHNkID0gc3RyaW5nRGVzdGluYXRpb24oKSk7XHJcbiAgICAgICAgcmV0dXJuIHNkKCk7XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogRGVjb2RlcyBhIGJhc2U2NCBlbmNvZGVkIHN0cmluZyB0byBhIEJ5dGVCdWZmZXIuXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyIFN0cmluZyB0byBkZWNvZGVcclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbj19IGxpdHRsZUVuZGlhbiBXaGV0aGVyIHRvIHVzZSBsaXR0bGUgb3IgYmlnIGVuZGlhbiBieXRlIG9yZGVyLiBEZWZhdWx0cyB0b1xyXG4gICAgICogIHtAbGluayBCeXRlQnVmZmVyLkRFRkFVTFRfRU5ESUFOfS5cclxuICAgICAqIEByZXR1cm5zIHshQnl0ZUJ1ZmZlcn0gQnl0ZUJ1ZmZlclxyXG4gICAgICogQGV4cG9zZVxyXG4gICAgICovXHJcbiAgICBCeXRlQnVmZmVyLmZyb21CYXNlNjQgPSBmdW5jdGlvbihzdHIsIGxpdHRsZUVuZGlhbikge1xyXG4gICAgICAgIGlmICh0eXBlb2Ygc3RyICE9PSAnc3RyaW5nJylcclxuICAgICAgICAgICAgdGhyb3cgVHlwZUVycm9yKFwic3RyXCIpO1xyXG4gICAgICAgIHZhciBiYiA9IG5ldyBCeXRlQnVmZmVyKHN0ci5sZW5ndGgvNCozLCBsaXR0bGVFbmRpYW4pLFxyXG4gICAgICAgICAgICBpID0gMDtcclxuICAgICAgICBseGl2LmRlY29kZShzdHJpbmdTb3VyY2Uoc3RyKSwgZnVuY3Rpb24oYikge1xyXG4gICAgICAgICAgICBiYi52aWV3W2krK10gPSBiO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGJiLmxpbWl0ID0gaTtcclxuICAgICAgICByZXR1cm4gYmI7XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogRW5jb2RlcyBhIGJpbmFyeSBzdHJpbmcgdG8gYmFzZTY0IGxpa2UgYHdpbmRvdy5idG9hYCBkb2VzLlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHN0ciBCaW5hcnkgc3RyaW5nXHJcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBCYXNlNjQgZW5jb2RlZCBzdHJpbmdcclxuICAgICAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1dpbmRvdy5idG9hXHJcbiAgICAgKiBAZXhwb3NlXHJcbiAgICAgKi9cclxuICAgIEJ5dGVCdWZmZXIuYnRvYSA9IGZ1bmN0aW9uKHN0cikge1xyXG4gICAgICAgIHJldHVybiBCeXRlQnVmZmVyLmZyb21CaW5hcnkoc3RyKS50b0Jhc2U2NCgpO1xyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIERlY29kZXMgYSBiYXNlNjQgZW5jb2RlZCBzdHJpbmcgdG8gYmluYXJ5IGxpa2UgYHdpbmRvdy5hdG9iYCBkb2VzLlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGI2NCBCYXNlNjQgZW5jb2RlZCBzdHJpbmdcclxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IEJpbmFyeSBzdHJpbmdcclxuICAgICAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1dpbmRvdy5hdG9iXHJcbiAgICAgKiBAZXhwb3NlXHJcbiAgICAgKi9cclxuICAgIEJ5dGVCdWZmZXIuYXRvYiA9IGZ1bmN0aW9uKGI2NCkge1xyXG4gICAgICAgIHJldHVybiBCeXRlQnVmZmVyLmZyb21CYXNlNjQoYjY0KS50b0JpbmFyeSgpO1xyXG4gICAgfTtcclxuXHJcbiAgICAvLyBlbmNvZGluZ3MvYmluYXJ5XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBFbmNvZGVzIHRoaXMgQnl0ZUJ1ZmZlciB0byBhIGJpbmFyeSBlbmNvZGVkIHN0cmluZywgdGhhdCBpcyB1c2luZyBvbmx5IGNoYXJhY3RlcnMgMHgwMC0weEZGIGFzIGJ5dGVzLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXI9fSBiZWdpbiBPZmZzZXQgdG8gYmVnaW4gYXQuIERlZmF1bHRzIHRvIHtAbGluayBCeXRlQnVmZmVyI29mZnNldH0uXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcj19IGVuZCBPZmZzZXQgdG8gZW5kIGF0LiBEZWZhdWx0cyB0byB7QGxpbmsgQnl0ZUJ1ZmZlciNsaW1pdH0uXHJcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBCaW5hcnkgZW5jb2RlZCBzdHJpbmdcclxuICAgICAqIEB0aHJvd3Mge1JhbmdlRXJyb3J9IElmIGBvZmZzZXQgPiBsaW1pdGBcclxuICAgICAqIEBleHBvc2VcclxuICAgICAqL1xyXG4gICAgQnl0ZUJ1ZmZlclByb3RvdHlwZS50b0JpbmFyeSA9IGZ1bmN0aW9uKGJlZ2luLCBlbmQpIHtcclxuICAgICAgICBpZiAodHlwZW9mIGJlZ2luID09PSAndW5kZWZpbmVkJylcclxuICAgICAgICAgICAgYmVnaW4gPSB0aGlzLm9mZnNldDtcclxuICAgICAgICBpZiAodHlwZW9mIGVuZCA9PT0gJ3VuZGVmaW5lZCcpXHJcbiAgICAgICAgICAgIGVuZCA9IHRoaXMubGltaXQ7XHJcbiAgICAgICAgYmVnaW4gfD0gMDsgZW5kIHw9IDA7XHJcbiAgICAgICAgaWYgKGJlZ2luIDwgMCB8fCBlbmQgPiB0aGlzLmNhcGFjaXR5KCkgfHwgYmVnaW4gPiBlbmQpXHJcbiAgICAgICAgICAgIHRocm93IFJhbmdlRXJyb3IoXCJiZWdpbiwgZW5kXCIpO1xyXG4gICAgICAgIGlmIChiZWdpbiA9PT0gZW5kKVxyXG4gICAgICAgICAgICByZXR1cm4gXCJcIjtcclxuICAgICAgICB2YXIgY2hhcnMgPSBbXSxcclxuICAgICAgICAgICAgcGFydHMgPSBbXTtcclxuICAgICAgICB3aGlsZSAoYmVnaW4gPCBlbmQpIHtcclxuICAgICAgICAgICAgY2hhcnMucHVzaCh0aGlzLnZpZXdbYmVnaW4rK10pO1xyXG4gICAgICAgICAgICBpZiAoY2hhcnMubGVuZ3RoID49IDEwMjQpXHJcbiAgICAgICAgICAgICAgICBwYXJ0cy5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLCBjaGFycykpLFxyXG4gICAgICAgICAgICAgICAgY2hhcnMgPSBbXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHBhcnRzLmpvaW4oJycpICsgU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsIGNoYXJzKTtcclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEZWNvZGVzIGEgYmluYXJ5IGVuY29kZWQgc3RyaW5nLCB0aGF0IGlzIHVzaW5nIG9ubHkgY2hhcmFjdGVycyAweDAwLTB4RkYgYXMgYnl0ZXMsIHRvIGEgQnl0ZUJ1ZmZlci5cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzdHIgU3RyaW5nIHRvIGRlY29kZVxyXG4gICAgICogQHBhcmFtIHtib29sZWFuPX0gbGl0dGxlRW5kaWFuIFdoZXRoZXIgdG8gdXNlIGxpdHRsZSBvciBiaWcgZW5kaWFuIGJ5dGUgb3JkZXIuIERlZmF1bHRzIHRvXHJcbiAgICAgKiAge0BsaW5rIEJ5dGVCdWZmZXIuREVGQVVMVF9FTkRJQU59LlxyXG4gICAgICogQHJldHVybnMgeyFCeXRlQnVmZmVyfSBCeXRlQnVmZmVyXHJcbiAgICAgKiBAZXhwb3NlXHJcbiAgICAgKi9cclxuICAgIEJ5dGVCdWZmZXIuZnJvbUJpbmFyeSA9IGZ1bmN0aW9uKHN0ciwgbGl0dGxlRW5kaWFuKSB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiBzdHIgIT09ICdzdHJpbmcnKVxyXG4gICAgICAgICAgICB0aHJvdyBUeXBlRXJyb3IoXCJzdHJcIik7XHJcbiAgICAgICAgdmFyIGkgPSAwLFxyXG4gICAgICAgICAgICBrID0gc3RyLmxlbmd0aCxcclxuICAgICAgICAgICAgY2hhckNvZGUsXHJcbiAgICAgICAgICAgIGJiID0gbmV3IEJ5dGVCdWZmZXIoaywgbGl0dGxlRW5kaWFuKTtcclxuICAgICAgICB3aGlsZSAoaTxrKSB7XHJcbiAgICAgICAgICAgIGNoYXJDb2RlID0gc3RyLmNoYXJDb2RlQXQoaSk7XHJcbiAgICAgICAgICAgIGlmIChjaGFyQ29kZSA+IDB4ZmYpXHJcbiAgICAgICAgICAgICAgICB0aHJvdyBSYW5nZUVycm9yKFwiaWxsZWdhbCBjaGFyIGNvZGU6IFwiK2NoYXJDb2RlKTtcclxuICAgICAgICAgICAgYmIudmlld1tpKytdID0gY2hhckNvZGU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGJiLmxpbWl0ID0gaztcclxuICAgICAgICByZXR1cm4gYmI7XHJcbiAgICB9O1xyXG5cclxuICAgIC8vIGVuY29kaW5ncy9kZWJ1Z1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogRW5jb2RlcyB0aGlzIEJ5dGVCdWZmZXIgdG8gYSBoZXggZW5jb2RlZCBzdHJpbmcgd2l0aCBtYXJrZWQgb2Zmc2V0cy4gT2Zmc2V0IHN5bWJvbHMgYXJlOlxyXG4gICAgICogKiBgPGAgOiBvZmZzZXQsXHJcbiAgICAgKiAqIGAnYCA6IG1hcmtlZE9mZnNldCxcclxuICAgICAqICogYD5gIDogbGltaXQsXHJcbiAgICAgKiAqIGB8YCA6IG9mZnNldCBhbmQgbGltaXQsXHJcbiAgICAgKiAqIGBbYCA6IG9mZnNldCBhbmQgbWFya2VkT2Zmc2V0LFxyXG4gICAgICogKiBgXWAgOiBtYXJrZWRPZmZzZXQgYW5kIGxpbWl0LFxyXG4gICAgICogKiBgIWAgOiBvZmZzZXQsIG1hcmtlZE9mZnNldCBhbmQgbGltaXRcclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbj19IGNvbHVtbnMgSWYgYHRydWVgIHJldHVybnMgdHdvIGNvbHVtbnMgaGV4ICsgYXNjaWksIGRlZmF1bHRzIHRvIGBmYWxzZWBcclxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd8IUFycmF5LjxzdHJpbmc+fSBEZWJ1ZyBzdHJpbmcgb3IgYXJyYXkgb2YgbGluZXMgaWYgYGFzQXJyYXkgPSB0cnVlYFxyXG4gICAgICogQGV4cG9zZVxyXG4gICAgICogQGV4YW1wbGUgYD4wMCcwMSAwMjwwM2AgY29udGFpbnMgZm91ciBieXRlcyB3aXRoIGBsaW1pdD0wLCBtYXJrZWRPZmZzZXQ9MSwgb2Zmc2V0PTNgXHJcbiAgICAgKiBAZXhhbXBsZSBgMDBbMDEgMDIgMDM+YCBjb250YWlucyBmb3VyIGJ5dGVzIHdpdGggYG9mZnNldD1tYXJrZWRPZmZzZXQ9MSwgbGltaXQ9NGBcclxuICAgICAqIEBleGFtcGxlIGAwMHwwMSAwMiAwM2AgY29udGFpbnMgZm91ciBieXRlcyB3aXRoIGBvZmZzZXQ9bGltaXQ9MSwgbWFya2VkT2Zmc2V0PS0xYFxyXG4gICAgICogQGV4YW1wbGUgYHxgIGNvbnRhaW5zIHplcm8gYnl0ZXMgd2l0aCBgb2Zmc2V0PWxpbWl0PTAsIG1hcmtlZE9mZnNldD0tMWBcclxuICAgICAqL1xyXG4gICAgQnl0ZUJ1ZmZlclByb3RvdHlwZS50b0RlYnVnID0gZnVuY3Rpb24oY29sdW1ucykge1xyXG4gICAgICAgIHZhciBpID0gLTEsXHJcbiAgICAgICAgICAgIGsgPSB0aGlzLmJ1ZmZlci5ieXRlTGVuZ3RoLFxyXG4gICAgICAgICAgICBiLFxyXG4gICAgICAgICAgICBoZXggPSBcIlwiLFxyXG4gICAgICAgICAgICBhc2MgPSBcIlwiLFxyXG4gICAgICAgICAgICBvdXQgPSBcIlwiO1xyXG4gICAgICAgIHdoaWxlIChpPGspIHtcclxuICAgICAgICAgICAgaWYgKGkgIT09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICBiID0gdGhpcy52aWV3W2ldO1xyXG4gICAgICAgICAgICAgICAgaWYgKGIgPCAweDEwKSBoZXggKz0gXCIwXCIrYi50b1N0cmluZygxNikudG9VcHBlckNhc2UoKTtcclxuICAgICAgICAgICAgICAgIGVsc2UgaGV4ICs9IGIudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoY29sdW1ucylcclxuICAgICAgICAgICAgICAgICAgICBhc2MgKz0gYiA+IDMyICYmIGIgPCAxMjcgPyBTdHJpbmcuZnJvbUNoYXJDb2RlKGIpIDogJy4nO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICsraTtcclxuICAgICAgICAgICAgaWYgKGNvbHVtbnMpIHtcclxuICAgICAgICAgICAgICAgIGlmIChpID4gMCAmJiBpICUgMTYgPT09IDAgJiYgaSAhPT0gaykge1xyXG4gICAgICAgICAgICAgICAgICAgIHdoaWxlIChoZXgubGVuZ3RoIDwgMyoxNiszKSBoZXggKz0gXCIgXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgb3V0ICs9IGhleCthc2MrXCJcXG5cIjtcclxuICAgICAgICAgICAgICAgICAgICBoZXggPSBhc2MgPSBcIlwiO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChpID09PSB0aGlzLm9mZnNldCAmJiBpID09PSB0aGlzLmxpbWl0KVxyXG4gICAgICAgICAgICAgICAgaGV4ICs9IGkgPT09IHRoaXMubWFya2VkT2Zmc2V0ID8gXCIhXCIgOiBcInxcIjtcclxuICAgICAgICAgICAgZWxzZSBpZiAoaSA9PT0gdGhpcy5vZmZzZXQpXHJcbiAgICAgICAgICAgICAgICBoZXggKz0gaSA9PT0gdGhpcy5tYXJrZWRPZmZzZXQgPyBcIltcIiA6IFwiPFwiO1xyXG4gICAgICAgICAgICBlbHNlIGlmIChpID09PSB0aGlzLmxpbWl0KVxyXG4gICAgICAgICAgICAgICAgaGV4ICs9IGkgPT09IHRoaXMubWFya2VkT2Zmc2V0ID8gXCJdXCIgOiBcIj5cIjtcclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgaGV4ICs9IGkgPT09IHRoaXMubWFya2VkT2Zmc2V0ID8gXCInXCIgOiAoY29sdW1ucyB8fCAoaSAhPT0gMCAmJiBpICE9PSBrKSA/IFwiIFwiIDogXCJcIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChjb2x1bW5zICYmIGhleCAhPT0gXCIgXCIpIHtcclxuICAgICAgICAgICAgd2hpbGUgKGhleC5sZW5ndGggPCAzKjE2KzMpXHJcbiAgICAgICAgICAgICAgICBoZXggKz0gXCIgXCI7XHJcbiAgICAgICAgICAgIG91dCArPSBoZXggKyBhc2MgKyBcIlxcblwiO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gY29sdW1ucyA/IG91dCA6IGhleDtcclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEZWNvZGVzIGEgaGV4IGVuY29kZWQgc3RyaW5nIHdpdGggbWFya2VkIG9mZnNldHMgdG8gYSBCeXRlQnVmZmVyLlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHN0ciBEZWJ1ZyBzdHJpbmcgdG8gZGVjb2RlIChub3QgYmUgZ2VuZXJhdGVkIHdpdGggYGNvbHVtbnMgPSB0cnVlYClcclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbj19IGxpdHRsZUVuZGlhbiBXaGV0aGVyIHRvIHVzZSBsaXR0bGUgb3IgYmlnIGVuZGlhbiBieXRlIG9yZGVyLiBEZWZhdWx0cyB0b1xyXG4gICAgICogIHtAbGluayBCeXRlQnVmZmVyLkRFRkFVTFRfRU5ESUFOfS5cclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbj19IG5vQXNzZXJ0IFdoZXRoZXIgdG8gc2tpcCBhc3NlcnRpb25zIG9mIG9mZnNldHMgYW5kIHZhbHVlcy4gRGVmYXVsdHMgdG9cclxuICAgICAqICB7QGxpbmsgQnl0ZUJ1ZmZlci5ERUZBVUxUX05PQVNTRVJUfS5cclxuICAgICAqIEByZXR1cm5zIHshQnl0ZUJ1ZmZlcn0gQnl0ZUJ1ZmZlclxyXG4gICAgICogQGV4cG9zZVxyXG4gICAgICogQHNlZSBCeXRlQnVmZmVyI3RvRGVidWdcclxuICAgICAqL1xyXG4gICAgQnl0ZUJ1ZmZlci5mcm9tRGVidWcgPSBmdW5jdGlvbihzdHIsIGxpdHRsZUVuZGlhbiwgbm9Bc3NlcnQpIHtcclxuICAgICAgICB2YXIgayA9IHN0ci5sZW5ndGgsXHJcbiAgICAgICAgICAgIGJiID0gbmV3IEJ5dGVCdWZmZXIoKChrKzEpLzMpfDAsIGxpdHRsZUVuZGlhbiwgbm9Bc3NlcnQpO1xyXG4gICAgICAgIHZhciBpID0gMCwgaiA9IDAsIGNoLCBiLFxyXG4gICAgICAgICAgICBycyA9IGZhbHNlLCAvLyBSZXF1aXJlIHN5bWJvbCBuZXh0XHJcbiAgICAgICAgICAgIGhvID0gZmFsc2UsIGhtID0gZmFsc2UsIGhsID0gZmFsc2UsIC8vIEFscmVhZHkgaGFzIG9mZnNldCAoaG8pLCBtYXJrZWRPZmZzZXQgKGhtKSwgbGltaXQgKGhsKT9cclxuICAgICAgICAgICAgZmFpbCA9IGZhbHNlO1xyXG4gICAgICAgIHdoaWxlIChpPGspIHtcclxuICAgICAgICAgICAgc3dpdGNoIChjaCA9IHN0ci5jaGFyQXQoaSsrKSkge1xyXG4gICAgICAgICAgICAgICAgY2FzZSAnISc6XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFub0Fzc2VydCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaG8gfHwgaG0gfHwgaGwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhaWwgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgaG8gPSBobSA9IGhsID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgYmIub2Zmc2V0ID0gYmIubWFya2VkT2Zmc2V0ID0gYmIubGltaXQgPSBqO1xyXG4gICAgICAgICAgICAgICAgICAgIHJzID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlICd8JzpcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIW5vQXNzZXJ0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChobyB8fCBobCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFpbCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBobyA9IGhsID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgYmIub2Zmc2V0ID0gYmIubGltaXQgPSBqO1xyXG4gICAgICAgICAgICAgICAgICAgIHJzID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlICdbJzpcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIW5vQXNzZXJ0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChobyB8fCBobSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFpbCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBobyA9IGhtID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgYmIub2Zmc2V0ID0gYmIubWFya2VkT2Zmc2V0ID0gajtcclxuICAgICAgICAgICAgICAgICAgICBycyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSAnPCc6XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFub0Fzc2VydCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaG8pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhaWwgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgaG8gPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBiYi5vZmZzZXQgPSBqO1xyXG4gICAgICAgICAgICAgICAgICAgIHJzID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlICddJzpcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIW5vQXNzZXJ0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChobCB8fCBobSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFpbCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBobCA9IGhtID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgYmIubGltaXQgPSBiYi5tYXJrZWRPZmZzZXQgPSBqO1xyXG4gICAgICAgICAgICAgICAgICAgIHJzID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlICc+JzpcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIW5vQXNzZXJ0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChobCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFpbCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBobCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGJiLmxpbWl0ID0gajtcclxuICAgICAgICAgICAgICAgICAgICBycyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcIidcIjpcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIW5vQXNzZXJ0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChobSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFpbCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBobSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGJiLm1hcmtlZE9mZnNldCA9IGo7XHJcbiAgICAgICAgICAgICAgICAgICAgcnMgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgJyAnOlxyXG4gICAgICAgICAgICAgICAgICAgIHJzID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgICAgIGlmICghbm9Bc3NlcnQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWlsID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGIgPSBwYXJzZUludChjaCtzdHIuY2hhckF0KGkrKyksIDE2KTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIW5vQXNzZXJ0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc05hTihiKSB8fCBiIDwgMCB8fCBiID4gMjU1KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgVHlwZUVycm9yKFwiSWxsZWdhbCBzdHI6IE5vdCBhIGRlYnVnIGVuY29kZWQgc3RyaW5nXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBiYi52aWV3W2orK10gPSBiO1xyXG4gICAgICAgICAgICAgICAgICAgIHJzID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoZmFpbClcclxuICAgICAgICAgICAgICAgIHRocm93IFR5cGVFcnJvcihcIklsbGVnYWwgc3RyOiBJbnZhbGlkIHN5bWJvbCBhdCBcIitpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFub0Fzc2VydCkge1xyXG4gICAgICAgICAgICBpZiAoIWhvIHx8ICFobClcclxuICAgICAgICAgICAgICAgIHRocm93IFR5cGVFcnJvcihcIklsbGVnYWwgc3RyOiBNaXNzaW5nIG9mZnNldCBvciBsaW1pdFwiKTtcclxuICAgICAgICAgICAgaWYgKGo8YmIuYnVmZmVyLmJ5dGVMZW5ndGgpXHJcbiAgICAgICAgICAgICAgICB0aHJvdyBUeXBlRXJyb3IoXCJJbGxlZ2FsIHN0cjogTm90IGEgZGVidWcgZW5jb2RlZCBzdHJpbmcgKGlzIGl0IGhleD8pIFwiK2orXCIgPCBcIitrKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGJiO1xyXG4gICAgfTtcclxuXHJcbiAgICAvLyBlbmNvZGluZ3MvaGV4XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBFbmNvZGVzIHRoaXMgQnl0ZUJ1ZmZlcidzIGNvbnRlbnRzIHRvIGEgaGV4IGVuY29kZWQgc3RyaW5nLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXI9fSBiZWdpbiBPZmZzZXQgdG8gYmVnaW4gYXQuIERlZmF1bHRzIHRvIHtAbGluayBCeXRlQnVmZmVyI29mZnNldH0uXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcj19IGVuZCBPZmZzZXQgdG8gZW5kIGF0LiBEZWZhdWx0cyB0byB7QGxpbmsgQnl0ZUJ1ZmZlciNsaW1pdH0uXHJcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBIZXggZW5jb2RlZCBzdHJpbmdcclxuICAgICAqIEBleHBvc2VcclxuICAgICAqL1xyXG4gICAgQnl0ZUJ1ZmZlclByb3RvdHlwZS50b0hleCA9IGZ1bmN0aW9uKGJlZ2luLCBlbmQpIHtcclxuICAgICAgICBiZWdpbiA9IHR5cGVvZiBiZWdpbiA9PT0gJ3VuZGVmaW5lZCcgPyB0aGlzLm9mZnNldCA6IGJlZ2luO1xyXG4gICAgICAgIGVuZCA9IHR5cGVvZiBlbmQgPT09ICd1bmRlZmluZWQnID8gdGhpcy5saW1pdCA6IGVuZDtcclxuICAgICAgICBpZiAoIXRoaXMubm9Bc3NlcnQpIHtcclxuICAgICAgICAgICAgaWYgKHR5cGVvZiBiZWdpbiAhPT0gJ251bWJlcicgfHwgYmVnaW4gJSAxICE9PSAwKVxuICAgICAgICAgICAgICAgIHRocm93IFR5cGVFcnJvcihcIklsbGVnYWwgYmVnaW46IE5vdCBhbiBpbnRlZ2VyXCIpO1xuICAgICAgICAgICAgYmVnaW4gPj4+PSAwO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBlbmQgIT09ICdudW1iZXInIHx8IGVuZCAlIDEgIT09IDApXG4gICAgICAgICAgICAgICAgdGhyb3cgVHlwZUVycm9yKFwiSWxsZWdhbCBlbmQ6IE5vdCBhbiBpbnRlZ2VyXCIpO1xuICAgICAgICAgICAgZW5kID4+Pj0gMDtcbiAgICAgICAgICAgIGlmIChiZWdpbiA8IDAgfHwgYmVnaW4gPiBlbmQgfHwgZW5kID4gdGhpcy5idWZmZXIuYnl0ZUxlbmd0aClcbiAgICAgICAgICAgICAgICB0aHJvdyBSYW5nZUVycm9yKFwiSWxsZWdhbCByYW5nZTogMCA8PSBcIitiZWdpbitcIiA8PSBcIitlbmQrXCIgPD0gXCIrdGhpcy5idWZmZXIuYnl0ZUxlbmd0aCk7XG4gICAgICAgIH1cclxuICAgICAgICB2YXIgb3V0ID0gbmV3IEFycmF5KGVuZCAtIGJlZ2luKSxcclxuICAgICAgICAgICAgYjtcclxuICAgICAgICB3aGlsZSAoYmVnaW4gPCBlbmQpIHtcclxuICAgICAgICAgICAgYiA9IHRoaXMudmlld1tiZWdpbisrXTtcclxuICAgICAgICAgICAgaWYgKGIgPCAweDEwKVxyXG4gICAgICAgICAgICAgICAgb3V0LnB1c2goXCIwXCIsIGIudG9TdHJpbmcoMTYpKTtcclxuICAgICAgICAgICAgZWxzZSBvdXQucHVzaChiLnRvU3RyaW5nKDE2KSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBvdXQuam9pbignJyk7XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogRGVjb2RlcyBhIGhleCBlbmNvZGVkIHN0cmluZyB0byBhIEJ5dGVCdWZmZXIuXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyIFN0cmluZyB0byBkZWNvZGVcclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbj19IGxpdHRsZUVuZGlhbiBXaGV0aGVyIHRvIHVzZSBsaXR0bGUgb3IgYmlnIGVuZGlhbiBieXRlIG9yZGVyLiBEZWZhdWx0cyB0b1xyXG4gICAgICogIHtAbGluayBCeXRlQnVmZmVyLkRFRkFVTFRfRU5ESUFOfS5cclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbj19IG5vQXNzZXJ0IFdoZXRoZXIgdG8gc2tpcCBhc3NlcnRpb25zIG9mIG9mZnNldHMgYW5kIHZhbHVlcy4gRGVmYXVsdHMgdG9cclxuICAgICAqICB7QGxpbmsgQnl0ZUJ1ZmZlci5ERUZBVUxUX05PQVNTRVJUfS5cclxuICAgICAqIEByZXR1cm5zIHshQnl0ZUJ1ZmZlcn0gQnl0ZUJ1ZmZlclxyXG4gICAgICogQGV4cG9zZVxyXG4gICAgICovXHJcbiAgICBCeXRlQnVmZmVyLmZyb21IZXggPSBmdW5jdGlvbihzdHIsIGxpdHRsZUVuZGlhbiwgbm9Bc3NlcnQpIHtcclxuICAgICAgICBpZiAoIW5vQXNzZXJ0KSB7XHJcbiAgICAgICAgICAgIGlmICh0eXBlb2Ygc3RyICE9PSAnc3RyaW5nJylcclxuICAgICAgICAgICAgICAgIHRocm93IFR5cGVFcnJvcihcIklsbGVnYWwgc3RyOiBOb3QgYSBzdHJpbmdcIik7XHJcbiAgICAgICAgICAgIGlmIChzdHIubGVuZ3RoICUgMiAhPT0gMClcclxuICAgICAgICAgICAgICAgIHRocm93IFR5cGVFcnJvcihcIklsbGVnYWwgc3RyOiBMZW5ndGggbm90IGEgbXVsdGlwbGUgb2YgMlwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIGsgPSBzdHIubGVuZ3RoLFxyXG4gICAgICAgICAgICBiYiA9IG5ldyBCeXRlQnVmZmVyKChrIC8gMikgfCAwLCBsaXR0bGVFbmRpYW4pLFxyXG4gICAgICAgICAgICBiO1xyXG4gICAgICAgIGZvciAodmFyIGk9MCwgaj0wOyBpPGs7IGkrPTIpIHtcclxuICAgICAgICAgICAgYiA9IHBhcnNlSW50KHN0ci5zdWJzdHJpbmcoaSwgaSsyKSwgMTYpO1xyXG4gICAgICAgICAgICBpZiAoIW5vQXNzZXJ0KVxyXG4gICAgICAgICAgICAgICAgaWYgKCFpc0Zpbml0ZShiKSB8fCBiIDwgMCB8fCBiID4gMjU1KVxyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IFR5cGVFcnJvcihcIklsbGVnYWwgc3RyOiBDb250YWlucyBub24taGV4IGNoYXJhY3RlcnNcIik7XHJcbiAgICAgICAgICAgIGJiLnZpZXdbaisrXSA9IGI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGJiLmxpbWl0ID0gajtcclxuICAgICAgICByZXR1cm4gYmI7XHJcbiAgICB9O1xyXG5cclxuICAgIC8vIHV0ZngtZW1iZWRkYWJsZVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogdXRmeC1lbWJlZGRhYmxlIChjKSAyMDE0IERhbmllbCBXaXJ0eiA8ZGNvZGVAZGNvZGUuaW8+XHJcbiAgICAgKiBSZWxlYXNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wXHJcbiAgICAgKiBzZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9kY29kZUlPL3V0ZnggZm9yIGRldGFpbHNcclxuICAgICAqL1xyXG4gICAgdmFyIHV0ZnggPSBmdW5jdGlvbigpIHtcclxuICAgICAgICBcInVzZSBzdHJpY3RcIjtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogdXRmeCBuYW1lc3BhY2UuXHJcbiAgICAgICAgICogQGlubmVyXHJcbiAgICAgICAgICogQHR5cGUgeyFPYmplY3QuPHN0cmluZywqPn1cclxuICAgICAgICAgKi9cclxuICAgICAgICB2YXIgdXRmeCA9IHt9O1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBNYXhpbXVtIHZhbGlkIGNvZGUgcG9pbnQuXHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKiBAY29uc3RcclxuICAgICAgICAgKi9cclxuICAgICAgICB1dGZ4Lk1BWF9DT0RFUE9JTlQgPSAweDEwRkZGRjtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogRW5jb2RlcyBVVEY4IGNvZGUgcG9pbnRzIHRvIFVURjggYnl0ZXMuXHJcbiAgICAgICAgICogQHBhcmFtIHsoIWZ1bmN0aW9uKCk6bnVtYmVyfG51bGwpIHwgbnVtYmVyfSBzcmMgQ29kZSBwb2ludHMgc291cmNlLCBlaXRoZXIgYXMgYSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIG5leHQgY29kZSBwb2ludFxyXG4gICAgICAgICAqICByZXNwZWN0aXZlbHkgYG51bGxgIGlmIHRoZXJlIGFyZSBubyBtb3JlIGNvZGUgcG9pbnRzIGxlZnQgb3IgYSBzaW5nbGUgbnVtZXJpYyBjb2RlIHBvaW50LlxyXG4gICAgICAgICAqIEBwYXJhbSB7IWZ1bmN0aW9uKG51bWJlcil9IGRzdCBCeXRlcyBkZXN0aW5hdGlvbiBhcyBhIGZ1bmN0aW9uIHN1Y2Nlc3NpdmVseSBjYWxsZWQgd2l0aCB0aGUgbmV4dCBieXRlXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdXRmeC5lbmNvZGVVVEY4ID0gZnVuY3Rpb24oc3JjLCBkc3QpIHtcclxuICAgICAgICAgICAgdmFyIGNwID0gbnVsbDtcclxuICAgICAgICAgICAgaWYgKHR5cGVvZiBzcmMgPT09ICdudW1iZXInKVxyXG4gICAgICAgICAgICAgICAgY3AgPSBzcmMsXHJcbiAgICAgICAgICAgICAgICBzcmMgPSBmdW5jdGlvbigpIHsgcmV0dXJuIG51bGw7IH07XHJcbiAgICAgICAgICAgIHdoaWxlIChjcCAhPT0gbnVsbCB8fCAoY3AgPSBzcmMoKSkgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIGlmIChjcCA8IDB4ODApXHJcbiAgICAgICAgICAgICAgICAgICAgZHN0KGNwJjB4N0YpO1xyXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoY3AgPCAweDgwMClcclxuICAgICAgICAgICAgICAgICAgICBkc3QoKChjcD4+NikmMHgxRil8MHhDMCksXHJcbiAgICAgICAgICAgICAgICAgICAgZHN0KChjcCYweDNGKXwweDgwKTtcclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNwIDwgMHgxMDAwMClcclxuICAgICAgICAgICAgICAgICAgICBkc3QoKChjcD4+MTIpJjB4MEYpfDB4RTApLFxyXG4gICAgICAgICAgICAgICAgICAgIGRzdCgoKGNwPj42KSYweDNGKXwweDgwKSxcclxuICAgICAgICAgICAgICAgICAgICBkc3QoKGNwJjB4M0YpfDB4ODApO1xyXG4gICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgICAgIGRzdCgoKGNwPj4xOCkmMHgwNyl8MHhGMCksXHJcbiAgICAgICAgICAgICAgICAgICAgZHN0KCgoY3A+PjEyKSYweDNGKXwweDgwKSxcclxuICAgICAgICAgICAgICAgICAgICBkc3QoKChjcD4+NikmMHgzRil8MHg4MCksXHJcbiAgICAgICAgICAgICAgICAgICAgZHN0KChjcCYweDNGKXwweDgwKTtcclxuICAgICAgICAgICAgICAgIGNwID0gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIERlY29kZXMgVVRGOCBieXRlcyB0byBVVEY4IGNvZGUgcG9pbnRzLlxyXG4gICAgICAgICAqIEBwYXJhbSB7IWZ1bmN0aW9uKCk6bnVtYmVyfG51bGx9IHNyYyBCeXRlcyBzb3VyY2UgYXMgYSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIG5leHQgYnl0ZSByZXNwZWN0aXZlbHkgYG51bGxgIGlmIHRoZXJlXHJcbiAgICAgICAgICogIGFyZSBubyBtb3JlIGJ5dGVzIGxlZnQuXHJcbiAgICAgICAgICogQHBhcmFtIHshZnVuY3Rpb24obnVtYmVyKX0gZHN0IENvZGUgcG9pbnRzIGRlc3RpbmF0aW9uIGFzIGEgZnVuY3Rpb24gc3VjY2Vzc2l2ZWx5IGNhbGxlZCB3aXRoIGVhY2ggZGVjb2RlZCBjb2RlIHBvaW50LlxyXG4gICAgICAgICAqIEB0aHJvd3Mge1JhbmdlRXJyb3J9IElmIGEgc3RhcnRpbmcgYnl0ZSBpcyBpbnZhbGlkIGluIFVURjhcclxuICAgICAgICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIGxhc3Qgc2VxdWVuY2UgaXMgdHJ1bmNhdGVkLiBIYXMgYW4gYXJyYXkgcHJvcGVydHkgYGJ5dGVzYCBob2xkaW5nIHRoZVxyXG4gICAgICAgICAqICByZW1haW5pbmcgYnl0ZXMuXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdXRmeC5kZWNvZGVVVEY4ID0gZnVuY3Rpb24oc3JjLCBkc3QpIHtcclxuICAgICAgICAgICAgdmFyIGEsIGIsIGMsIGQsIGZhaWwgPSBmdW5jdGlvbihiKSB7XHJcbiAgICAgICAgICAgICAgICBiID0gYi5zbGljZSgwLCBiLmluZGV4T2YobnVsbCkpO1xyXG4gICAgICAgICAgICAgICAgdmFyIGVyciA9IEVycm9yKGIudG9TdHJpbmcoKSk7XHJcbiAgICAgICAgICAgICAgICBlcnIubmFtZSA9IFwiVHJ1bmNhdGVkRXJyb3JcIjtcclxuICAgICAgICAgICAgICAgIGVyclsnYnl0ZXMnXSA9IGI7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIHdoaWxlICgoYSA9IHNyYygpKSAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKChhJjB4ODApID09PSAwKVxyXG4gICAgICAgICAgICAgICAgICAgIGRzdChhKTtcclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKChhJjB4RTApID09PSAweEMwKVxyXG4gICAgICAgICAgICAgICAgICAgICgoYiA9IHNyYygpKSA9PT0gbnVsbCkgJiYgZmFpbChbYSwgYl0pLFxyXG4gICAgICAgICAgICAgICAgICAgIGRzdCgoKGEmMHgxRik8PDYpIHwgKGImMHgzRikpO1xyXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoKGEmMHhGMCkgPT09IDB4RTApXHJcbiAgICAgICAgICAgICAgICAgICAgKChiPXNyYygpKSA9PT0gbnVsbCB8fCAoYz1zcmMoKSkgPT09IG51bGwpICYmIGZhaWwoW2EsIGIsIGNdKSxcclxuICAgICAgICAgICAgICAgICAgICBkc3QoKChhJjB4MEYpPDwxMikgfCAoKGImMHgzRik8PDYpIHwgKGMmMHgzRikpO1xyXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoKGEmMHhGOCkgPT09IDB4RjApXHJcbiAgICAgICAgICAgICAgICAgICAgKChiPXNyYygpKSA9PT0gbnVsbCB8fCAoYz1zcmMoKSkgPT09IG51bGwgfHwgKGQ9c3JjKCkpID09PSBudWxsKSAmJiBmYWlsKFthLCBiLCBjICxkXSksXHJcbiAgICAgICAgICAgICAgICAgICAgZHN0KCgoYSYweDA3KTw8MTgpIHwgKChiJjB4M0YpPDwxMikgfCAoKGMmMHgzRik8PDYpIHwgKGQmMHgzRikpO1xyXG4gICAgICAgICAgICAgICAgZWxzZSB0aHJvdyBSYW5nZUVycm9yKFwiSWxsZWdhbCBzdGFydGluZyBieXRlOiBcIithKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIENvbnZlcnRzIFVURjE2IGNoYXJhY3RlcnMgdG8gVVRGOCBjb2RlIHBvaW50cy5cclxuICAgICAgICAgKiBAcGFyYW0geyFmdW5jdGlvbigpOm51bWJlcnxudWxsfSBzcmMgQ2hhcmFjdGVycyBzb3VyY2UgYXMgYSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIG5leHQgY2hhciBjb2RlIHJlc3BlY3RpdmVseVxyXG4gICAgICAgICAqICBgbnVsbGAgaWYgdGhlcmUgYXJlIG5vIG1vcmUgY2hhcmFjdGVycyBsZWZ0LlxyXG4gICAgICAgICAqIEBwYXJhbSB7IWZ1bmN0aW9uKG51bWJlcil9IGRzdCBDb2RlIHBvaW50cyBkZXN0aW5hdGlvbiBhcyBhIGZ1bmN0aW9uIHN1Y2Nlc3NpdmVseSBjYWxsZWQgd2l0aCBlYWNoIGNvbnZlcnRlZCBjb2RlXHJcbiAgICAgICAgICogIHBvaW50LlxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHV0ZnguVVRGMTZ0b1VURjggPSBmdW5jdGlvbihzcmMsIGRzdCkge1xyXG4gICAgICAgICAgICB2YXIgYzEsIGMyID0gbnVsbDtcclxuICAgICAgICAgICAgd2hpbGUgKHRydWUpIHtcclxuICAgICAgICAgICAgICAgIGlmICgoYzEgPSBjMiAhPT0gbnVsbCA/IGMyIDogc3JjKCkpID09PSBudWxsKVxyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgaWYgKGMxID49IDB4RDgwMCAmJiBjMSA8PSAweERGRkYpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoKGMyID0gc3JjKCkpICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjMiA+PSAweERDMDAgJiYgYzIgPD0gMHhERkZGKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QoKGMxLTB4RDgwMCkqMHg0MDArYzItMHhEQzAwKzB4MTAwMDApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYzIgPSBudWxsOyBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGRzdChjMSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKGMyICE9PSBudWxsKSBkc3QoYzIpO1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIENvbnZlcnRzIFVURjggY29kZSBwb2ludHMgdG8gVVRGMTYgY2hhcmFjdGVycy5cclxuICAgICAgICAgKiBAcGFyYW0geyghZnVuY3Rpb24oKTpudW1iZXJ8bnVsbCkgfCBudW1iZXJ9IHNyYyBDb2RlIHBvaW50cyBzb3VyY2UsIGVpdGhlciBhcyBhIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgbmV4dCBjb2RlIHBvaW50XHJcbiAgICAgICAgICogIHJlc3BlY3RpdmVseSBgbnVsbGAgaWYgdGhlcmUgYXJlIG5vIG1vcmUgY29kZSBwb2ludHMgbGVmdCBvciBhIHNpbmdsZSBudW1lcmljIGNvZGUgcG9pbnQuXHJcbiAgICAgICAgICogQHBhcmFtIHshZnVuY3Rpb24obnVtYmVyKX0gZHN0IENoYXJhY3RlcnMgZGVzdGluYXRpb24gYXMgYSBmdW5jdGlvbiBzdWNjZXNzaXZlbHkgY2FsbGVkIHdpdGggZWFjaCBjb252ZXJ0ZWQgY2hhciBjb2RlLlxyXG4gICAgICAgICAqIEB0aHJvd3Mge1JhbmdlRXJyb3J9IElmIGEgY29kZSBwb2ludCBpcyBvdXQgb2YgcmFuZ2VcclxuICAgICAgICAgKi9cclxuICAgICAgICB1dGZ4LlVURjh0b1VURjE2ID0gZnVuY3Rpb24oc3JjLCBkc3QpIHtcclxuICAgICAgICAgICAgdmFyIGNwID0gbnVsbDtcclxuICAgICAgICAgICAgaWYgKHR5cGVvZiBzcmMgPT09ICdudW1iZXInKVxyXG4gICAgICAgICAgICAgICAgY3AgPSBzcmMsIHNyYyA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gbnVsbDsgfTtcclxuICAgICAgICAgICAgd2hpbGUgKGNwICE9PSBudWxsIHx8IChjcCA9IHNyYygpKSAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGNwIDw9IDB4RkZGRilcclxuICAgICAgICAgICAgICAgICAgICBkc3QoY3ApO1xyXG4gICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgICAgIGNwIC09IDB4MTAwMDAsXHJcbiAgICAgICAgICAgICAgICAgICAgZHN0KChjcD4+MTApKzB4RDgwMCksXHJcbiAgICAgICAgICAgICAgICAgICAgZHN0KChjcCUweDQwMCkrMHhEQzAwKTtcclxuICAgICAgICAgICAgICAgIGNwID0gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIENvbnZlcnRzIGFuZCBlbmNvZGVzIFVURjE2IGNoYXJhY3RlcnMgdG8gVVRGOCBieXRlcy5cclxuICAgICAgICAgKiBAcGFyYW0geyFmdW5jdGlvbigpOm51bWJlcnxudWxsfSBzcmMgQ2hhcmFjdGVycyBzb3VyY2UgYXMgYSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIG5leHQgY2hhciBjb2RlIHJlc3BlY3RpdmVseSBgbnVsbGBcclxuICAgICAgICAgKiAgaWYgdGhlcmUgYXJlIG5vIG1vcmUgY2hhcmFjdGVycyBsZWZ0LlxyXG4gICAgICAgICAqIEBwYXJhbSB7IWZ1bmN0aW9uKG51bWJlcil9IGRzdCBCeXRlcyBkZXN0aW5hdGlvbiBhcyBhIGZ1bmN0aW9uIHN1Y2Nlc3NpdmVseSBjYWxsZWQgd2l0aCB0aGUgbmV4dCBieXRlLlxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHV0ZnguZW5jb2RlVVRGMTZ0b1VURjggPSBmdW5jdGlvbihzcmMsIGRzdCkge1xyXG4gICAgICAgICAgICB1dGZ4LlVURjE2dG9VVEY4KHNyYywgZnVuY3Rpb24oY3ApIHtcclxuICAgICAgICAgICAgICAgIHV0ZnguZW5jb2RlVVRGOChjcCwgZHN0KTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogRGVjb2RlcyBhbmQgY29udmVydHMgVVRGOCBieXRlcyB0byBVVEYxNiBjaGFyYWN0ZXJzLlxyXG4gICAgICAgICAqIEBwYXJhbSB7IWZ1bmN0aW9uKCk6bnVtYmVyfG51bGx9IHNyYyBCeXRlcyBzb3VyY2UgYXMgYSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIG5leHQgYnl0ZSByZXNwZWN0aXZlbHkgYG51bGxgIGlmIHRoZXJlXHJcbiAgICAgICAgICogIGFyZSBubyBtb3JlIGJ5dGVzIGxlZnQuXHJcbiAgICAgICAgICogQHBhcmFtIHshZnVuY3Rpb24obnVtYmVyKX0gZHN0IENoYXJhY3RlcnMgZGVzdGluYXRpb24gYXMgYSBmdW5jdGlvbiBzdWNjZXNzaXZlbHkgY2FsbGVkIHdpdGggZWFjaCBjb252ZXJ0ZWQgY2hhciBjb2RlLlxyXG4gICAgICAgICAqIEB0aHJvd3Mge1JhbmdlRXJyb3J9IElmIGEgc3RhcnRpbmcgYnl0ZSBpcyBpbnZhbGlkIGluIFVURjhcclxuICAgICAgICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIGxhc3Qgc2VxdWVuY2UgaXMgdHJ1bmNhdGVkLiBIYXMgYW4gYXJyYXkgcHJvcGVydHkgYGJ5dGVzYCBob2xkaW5nIHRoZSByZW1haW5pbmcgYnl0ZXMuXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdXRmeC5kZWNvZGVVVEY4dG9VVEYxNiA9IGZ1bmN0aW9uKHNyYywgZHN0KSB7XHJcbiAgICAgICAgICAgIHV0ZnguZGVjb2RlVVRGOChzcmMsIGZ1bmN0aW9uKGNwKSB7XHJcbiAgICAgICAgICAgICAgICB1dGZ4LlVURjh0b1VURjE2KGNwLCBkc3QpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBDYWxjdWxhdGVzIHRoZSBieXRlIGxlbmd0aCBvZiBhbiBVVEY4IGNvZGUgcG9pbnQuXHJcbiAgICAgICAgICogQHBhcmFtIHtudW1iZXJ9IGNwIFVURjggY29kZSBwb2ludFxyXG4gICAgICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IEJ5dGUgbGVuZ3RoXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdXRmeC5jYWxjdWxhdGVDb2RlUG9pbnQgPSBmdW5jdGlvbihjcCkge1xyXG4gICAgICAgICAgICByZXR1cm4gKGNwIDwgMHg4MCkgPyAxIDogKGNwIDwgMHg4MDApID8gMiA6IChjcCA8IDB4MTAwMDApID8gMyA6IDQ7XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQ2FsY3VsYXRlcyB0aGUgbnVtYmVyIG9mIFVURjggYnl0ZXMgcmVxdWlyZWQgdG8gc3RvcmUgVVRGOCBjb2RlIHBvaW50cy5cclxuICAgICAgICAgKiBAcGFyYW0geyghZnVuY3Rpb24oKTpudW1iZXJ8bnVsbCl9IHNyYyBDb2RlIHBvaW50cyBzb3VyY2UgYXMgYSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIG5leHQgY29kZSBwb2ludCByZXNwZWN0aXZlbHlcclxuICAgICAgICAgKiAgYG51bGxgIGlmIHRoZXJlIGFyZSBubyBtb3JlIGNvZGUgcG9pbnRzIGxlZnQuXHJcbiAgICAgICAgICogQHJldHVybnMge251bWJlcn0gVGhlIG51bWJlciBvZiBVVEY4IGJ5dGVzIHJlcXVpcmVkXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdXRmeC5jYWxjdWxhdGVVVEY4ID0gZnVuY3Rpb24oc3JjKSB7XHJcbiAgICAgICAgICAgIHZhciBjcCwgbD0wO1xyXG4gICAgICAgICAgICB3aGlsZSAoKGNwID0gc3JjKCkpICE9PSBudWxsKVxyXG4gICAgICAgICAgICAgICAgbCArPSAoY3AgPCAweDgwKSA/IDEgOiAoY3AgPCAweDgwMCkgPyAyIDogKGNwIDwgMHgxMDAwMCkgPyAzIDogNDtcclxuICAgICAgICAgICAgcmV0dXJuIGw7XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQ2FsY3VsYXRlcyB0aGUgbnVtYmVyIG9mIFVURjggY29kZSBwb2ludHMgcmVzcGVjdGl2ZWx5IFVURjggYnl0ZXMgcmVxdWlyZWQgdG8gc3RvcmUgVVRGMTYgY2hhciBjb2Rlcy5cclxuICAgICAgICAgKiBAcGFyYW0geyghZnVuY3Rpb24oKTpudW1iZXJ8bnVsbCl9IHNyYyBDaGFyYWN0ZXJzIHNvdXJjZSBhcyBhIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgbmV4dCBjaGFyIGNvZGUgcmVzcGVjdGl2ZWx5XHJcbiAgICAgICAgICogIGBudWxsYCBpZiB0aGVyZSBhcmUgbm8gbW9yZSBjaGFyYWN0ZXJzIGxlZnQuXHJcbiAgICAgICAgICogQHJldHVybnMgeyFBcnJheS48bnVtYmVyPn0gVGhlIG51bWJlciBvZiBVVEY4IGNvZGUgcG9pbnRzIGF0IGluZGV4IDAgYW5kIHRoZSBudW1iZXIgb2YgVVRGOCBieXRlcyByZXF1aXJlZCBhdCBpbmRleCAxLlxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHV0ZnguY2FsY3VsYXRlVVRGMTZhc1VURjggPSBmdW5jdGlvbihzcmMpIHtcclxuICAgICAgICAgICAgdmFyIG49MCwgbD0wO1xyXG4gICAgICAgICAgICB1dGZ4LlVURjE2dG9VVEY4KHNyYywgZnVuY3Rpb24oY3ApIHtcclxuICAgICAgICAgICAgICAgICsrbjsgbCArPSAoY3AgPCAweDgwKSA/IDEgOiAoY3AgPCAweDgwMCkgPyAyIDogKGNwIDwgMHgxMDAwMCkgPyAzIDogNDtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHJldHVybiBbbixsXTtcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICByZXR1cm4gdXRmeDtcclxuICAgIH0oKTtcclxuXHJcbiAgICAvLyBlbmNvZGluZ3MvdXRmOFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRW5jb2RlcyB0aGlzIEJ5dGVCdWZmZXIncyBjb250ZW50cyBiZXR3ZWVuIHtAbGluayBCeXRlQnVmZmVyI29mZnNldH0gYW5kIHtAbGluayBCeXRlQnVmZmVyI2xpbWl0fSB0byBhbiBVVEY4IGVuY29kZWRcclxuICAgICAqICBzdHJpbmcuXHJcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBIZXggZW5jb2RlZCBzdHJpbmdcclxuICAgICAqIEB0aHJvd3Mge1JhbmdlRXJyb3J9IElmIGBvZmZzZXQgPiBsaW1pdGBcclxuICAgICAqIEBleHBvc2VcclxuICAgICAqL1xyXG4gICAgQnl0ZUJ1ZmZlclByb3RvdHlwZS50b1VURjggPSBmdW5jdGlvbihiZWdpbiwgZW5kKSB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiBiZWdpbiA9PT0gJ3VuZGVmaW5lZCcpIGJlZ2luID0gdGhpcy5vZmZzZXQ7XHJcbiAgICAgICAgaWYgKHR5cGVvZiBlbmQgPT09ICd1bmRlZmluZWQnKSBlbmQgPSB0aGlzLmxpbWl0O1xyXG4gICAgICAgIGlmICghdGhpcy5ub0Fzc2VydCkge1xyXG4gICAgICAgICAgICBpZiAodHlwZW9mIGJlZ2luICE9PSAnbnVtYmVyJyB8fCBiZWdpbiAlIDEgIT09IDApXG4gICAgICAgICAgICAgICAgdGhyb3cgVHlwZUVycm9yKFwiSWxsZWdhbCBiZWdpbjogTm90IGFuIGludGVnZXJcIik7XG4gICAgICAgICAgICBiZWdpbiA+Pj49IDA7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGVuZCAhPT0gJ251bWJlcicgfHwgZW5kICUgMSAhPT0gMClcbiAgICAgICAgICAgICAgICB0aHJvdyBUeXBlRXJyb3IoXCJJbGxlZ2FsIGVuZDogTm90IGFuIGludGVnZXJcIik7XG4gICAgICAgICAgICBlbmQgPj4+PSAwO1xuICAgICAgICAgICAgaWYgKGJlZ2luIDwgMCB8fCBiZWdpbiA+IGVuZCB8fCBlbmQgPiB0aGlzLmJ1ZmZlci5ieXRlTGVuZ3RoKVxuICAgICAgICAgICAgICAgIHRocm93IFJhbmdlRXJyb3IoXCJJbGxlZ2FsIHJhbmdlOiAwIDw9IFwiK2JlZ2luK1wiIDw9IFwiK2VuZCtcIiA8PSBcIit0aGlzLmJ1ZmZlci5ieXRlTGVuZ3RoKTtcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciBzZDsgdHJ5IHtcclxuICAgICAgICAgICAgdXRmeC5kZWNvZGVVVEY4dG9VVEYxNihmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBiZWdpbiA8IGVuZCA/IHRoaXMudmlld1tiZWdpbisrXSA6IG51bGw7XHJcbiAgICAgICAgICAgIH0uYmluZCh0aGlzKSwgc2QgPSBzdHJpbmdEZXN0aW5hdGlvbigpKTtcclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIGlmIChiZWdpbiAhPT0gZW5kKVxyXG4gICAgICAgICAgICAgICAgdGhyb3cgUmFuZ2VFcnJvcihcIklsbGVnYWwgcmFuZ2U6IFRydW5jYXRlZCBkYXRhLCBcIitiZWdpbitcIiAhPSBcIitlbmQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gc2QoKTtcclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEZWNvZGVzIGFuIFVURjggZW5jb2RlZCBzdHJpbmcgdG8gYSBCeXRlQnVmZmVyLlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHN0ciBTdHJpbmcgdG8gZGVjb2RlXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW49fSBsaXR0bGVFbmRpYW4gV2hldGhlciB0byB1c2UgbGl0dGxlIG9yIGJpZyBlbmRpYW4gYnl0ZSBvcmRlci4gRGVmYXVsdHMgdG9cclxuICAgICAqICB7QGxpbmsgQnl0ZUJ1ZmZlci5ERUZBVUxUX0VORElBTn0uXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW49fSBub0Fzc2VydCBXaGV0aGVyIHRvIHNraXAgYXNzZXJ0aW9ucyBvZiBvZmZzZXRzIGFuZCB2YWx1ZXMuIERlZmF1bHRzIHRvXHJcbiAgICAgKiAge0BsaW5rIEJ5dGVCdWZmZXIuREVGQVVMVF9OT0FTU0VSVH0uXHJcbiAgICAgKiBAcmV0dXJucyB7IUJ5dGVCdWZmZXJ9IEJ5dGVCdWZmZXJcclxuICAgICAqIEBleHBvc2VcclxuICAgICAqL1xyXG4gICAgQnl0ZUJ1ZmZlci5mcm9tVVRGOCA9IGZ1bmN0aW9uKHN0ciwgbGl0dGxlRW5kaWFuLCBub0Fzc2VydCkge1xyXG4gICAgICAgIGlmICghbm9Bc3NlcnQpXHJcbiAgICAgICAgICAgIGlmICh0eXBlb2Ygc3RyICE9PSAnc3RyaW5nJylcclxuICAgICAgICAgICAgICAgIHRocm93IFR5cGVFcnJvcihcIklsbGVnYWwgc3RyOiBOb3QgYSBzdHJpbmdcIik7XHJcbiAgICAgICAgdmFyIGJiID0gbmV3IEJ5dGVCdWZmZXIodXRmeC5jYWxjdWxhdGVVVEYxNmFzVVRGOChzdHJpbmdTb3VyY2Uoc3RyKSwgdHJ1ZSlbMV0sIGxpdHRsZUVuZGlhbiwgbm9Bc3NlcnQpLFxyXG4gICAgICAgICAgICBpID0gMDtcclxuICAgICAgICB1dGZ4LmVuY29kZVVURjE2dG9VVEY4KHN0cmluZ1NvdXJjZShzdHIpLCBmdW5jdGlvbihiKSB7XHJcbiAgICAgICAgICAgIGJiLnZpZXdbaSsrXSA9IGI7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgYmIubGltaXQgPSBpO1xyXG4gICAgICAgIHJldHVybiBiYjtcclxuICAgIH07XHJcblxyXG4gICAgcmV0dXJuIEJ5dGVCdWZmZXI7XHJcbn0pO1xyXG4iLCIvLyBDb3B5cmlnaHQgSm95ZW50LCBJbmMuIGFuZCBvdGhlciBOb2RlIGNvbnRyaWJ1dG9ycy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYVxuLy8gY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuLy8gXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG4vLyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG4vLyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0XG4vLyBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGVcbi8vIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkXG4vLyBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTXG4vLyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOXG4vLyBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcbi8vIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUlxuLy8gT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRVxuLy8gVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxudmFyIG9iamVjdENyZWF0ZSA9IE9iamVjdC5jcmVhdGUgfHwgb2JqZWN0Q3JlYXRlUG9seWZpbGxcbnZhciBvYmplY3RLZXlzID0gT2JqZWN0LmtleXMgfHwgb2JqZWN0S2V5c1BvbHlmaWxsXG52YXIgYmluZCA9IEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kIHx8IGZ1bmN0aW9uQmluZFBvbHlmaWxsXG5cbmZ1bmN0aW9uIEV2ZW50RW1pdHRlcigpIHtcbiAgaWYgKCF0aGlzLl9ldmVudHMgfHwgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0aGlzLCAnX2V2ZW50cycpKSB7XG4gICAgdGhpcy5fZXZlbnRzID0gb2JqZWN0Q3JlYXRlKG51bGwpO1xuICAgIHRoaXMuX2V2ZW50c0NvdW50ID0gMDtcbiAgfVxuXG4gIHRoaXMuX21heExpc3RlbmVycyA9IHRoaXMuX21heExpc3RlbmVycyB8fCB1bmRlZmluZWQ7XG59XG5tb2R1bGUuZXhwb3J0cyA9IEV2ZW50RW1pdHRlcjtcblxuLy8gQmFja3dhcmRzLWNvbXBhdCB3aXRoIG5vZGUgMC4xMC54XG5FdmVudEVtaXR0ZXIuRXZlbnRFbWl0dGVyID0gRXZlbnRFbWl0dGVyO1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLl9ldmVudHMgPSB1bmRlZmluZWQ7XG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLl9tYXhMaXN0ZW5lcnMgPSB1bmRlZmluZWQ7XG5cbi8vIEJ5IGRlZmF1bHQgRXZlbnRFbWl0dGVycyB3aWxsIHByaW50IGEgd2FybmluZyBpZiBtb3JlIHRoYW4gMTAgbGlzdGVuZXJzIGFyZVxuLy8gYWRkZWQgdG8gaXQuIFRoaXMgaXMgYSB1c2VmdWwgZGVmYXVsdCB3aGljaCBoZWxwcyBmaW5kaW5nIG1lbW9yeSBsZWFrcy5cbnZhciBkZWZhdWx0TWF4TGlzdGVuZXJzID0gMTA7XG5cbnZhciBoYXNEZWZpbmVQcm9wZXJ0eTtcbnRyeSB7XG4gIHZhciBvID0ge307XG4gIGlmIChPYmplY3QuZGVmaW5lUHJvcGVydHkpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCAneCcsIHsgdmFsdWU6IDAgfSk7XG4gIGhhc0RlZmluZVByb3BlcnR5ID0gby54ID09PSAwO1xufSBjYXRjaCAoZXJyKSB7IGhhc0RlZmluZVByb3BlcnR5ID0gZmFsc2UgfVxuaWYgKGhhc0RlZmluZVByb3BlcnR5KSB7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShFdmVudEVtaXR0ZXIsICdkZWZhdWx0TWF4TGlzdGVuZXJzJywge1xuICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgZ2V0OiBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBkZWZhdWx0TWF4TGlzdGVuZXJzO1xuICAgIH0sXG4gICAgc2V0OiBmdW5jdGlvbihhcmcpIHtcbiAgICAgIC8vIGNoZWNrIHdoZXRoZXIgdGhlIGlucHV0IGlzIGEgcG9zaXRpdmUgbnVtYmVyICh3aG9zZSB2YWx1ZSBpcyB6ZXJvIG9yXG4gICAgICAvLyBncmVhdGVyIGFuZCBub3QgYSBOYU4pLlxuICAgICAgaWYgKHR5cGVvZiBhcmcgIT09ICdudW1iZXInIHx8IGFyZyA8IDAgfHwgYXJnICE9PSBhcmcpXG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wiZGVmYXVsdE1heExpc3RlbmVyc1wiIG11c3QgYmUgYSBwb3NpdGl2ZSBudW1iZXInKTtcbiAgICAgIGRlZmF1bHRNYXhMaXN0ZW5lcnMgPSBhcmc7XG4gICAgfVxuICB9KTtcbn0gZWxzZSB7XG4gIEV2ZW50RW1pdHRlci5kZWZhdWx0TWF4TGlzdGVuZXJzID0gZGVmYXVsdE1heExpc3RlbmVycztcbn1cblxuLy8gT2J2aW91c2x5IG5vdCBhbGwgRW1pdHRlcnMgc2hvdWxkIGJlIGxpbWl0ZWQgdG8gMTAuIFRoaXMgZnVuY3Rpb24gYWxsb3dzXG4vLyB0aGF0IHRvIGJlIGluY3JlYXNlZC4gU2V0IHRvIHplcm8gZm9yIHVubGltaXRlZC5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuc2V0TWF4TGlzdGVuZXJzID0gZnVuY3Rpb24gc2V0TWF4TGlzdGVuZXJzKG4pIHtcbiAgaWYgKHR5cGVvZiBuICE9PSAnbnVtYmVyJyB8fCBuIDwgMCB8fCBpc05hTihuKSlcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcIm5cIiBhcmd1bWVudCBtdXN0IGJlIGEgcG9zaXRpdmUgbnVtYmVyJyk7XG4gIHRoaXMuX21heExpc3RlbmVycyA9IG47XG4gIHJldHVybiB0aGlzO1xufTtcblxuZnVuY3Rpb24gJGdldE1heExpc3RlbmVycyh0aGF0KSB7XG4gIGlmICh0aGF0Ll9tYXhMaXN0ZW5lcnMgPT09IHVuZGVmaW5lZClcbiAgICByZXR1cm4gRXZlbnRFbWl0dGVyLmRlZmF1bHRNYXhMaXN0ZW5lcnM7XG4gIHJldHVybiB0aGF0Ll9tYXhMaXN0ZW5lcnM7XG59XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuZ2V0TWF4TGlzdGVuZXJzID0gZnVuY3Rpb24gZ2V0TWF4TGlzdGVuZXJzKCkge1xuICByZXR1cm4gJGdldE1heExpc3RlbmVycyh0aGlzKTtcbn07XG5cbi8vIFRoZXNlIHN0YW5kYWxvbmUgZW1pdCogZnVuY3Rpb25zIGFyZSB1c2VkIHRvIG9wdGltaXplIGNhbGxpbmcgb2YgZXZlbnRcbi8vIGhhbmRsZXJzIGZvciBmYXN0IGNhc2VzIGJlY2F1c2UgZW1pdCgpIGl0c2VsZiBvZnRlbiBoYXMgYSB2YXJpYWJsZSBudW1iZXIgb2Zcbi8vIGFyZ3VtZW50cyBhbmQgY2FuIGJlIGRlb3B0aW1pemVkIGJlY2F1c2Ugb2YgdGhhdC4gVGhlc2UgZnVuY3Rpb25zIGFsd2F5cyBoYXZlXG4vLyB0aGUgc2FtZSBudW1iZXIgb2YgYXJndW1lbnRzIGFuZCB0aHVzIGRvIG5vdCBnZXQgZGVvcHRpbWl6ZWQsIHNvIHRoZSBjb2RlXG4vLyBpbnNpZGUgdGhlbSBjYW4gZXhlY3V0ZSBmYXN0ZXIuXG5mdW5jdGlvbiBlbWl0Tm9uZShoYW5kbGVyLCBpc0ZuLCBzZWxmKSB7XG4gIGlmIChpc0ZuKVxuICAgIGhhbmRsZXIuY2FsbChzZWxmKTtcbiAgZWxzZSB7XG4gICAgdmFyIGxlbiA9IGhhbmRsZXIubGVuZ3RoO1xuICAgIHZhciBsaXN0ZW5lcnMgPSBhcnJheUNsb25lKGhhbmRsZXIsIGxlbik7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47ICsraSlcbiAgICAgIGxpc3RlbmVyc1tpXS5jYWxsKHNlbGYpO1xuICB9XG59XG5mdW5jdGlvbiBlbWl0T25lKGhhbmRsZXIsIGlzRm4sIHNlbGYsIGFyZzEpIHtcbiAgaWYgKGlzRm4pXG4gICAgaGFuZGxlci5jYWxsKHNlbGYsIGFyZzEpO1xuICBlbHNlIHtcbiAgICB2YXIgbGVuID0gaGFuZGxlci5sZW5ndGg7XG4gICAgdmFyIGxpc3RlbmVycyA9IGFycmF5Q2xvbmUoaGFuZGxlciwgbGVuKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgKytpKVxuICAgICAgbGlzdGVuZXJzW2ldLmNhbGwoc2VsZiwgYXJnMSk7XG4gIH1cbn1cbmZ1bmN0aW9uIGVtaXRUd28oaGFuZGxlciwgaXNGbiwgc2VsZiwgYXJnMSwgYXJnMikge1xuICBpZiAoaXNGbilcbiAgICBoYW5kbGVyLmNhbGwoc2VsZiwgYXJnMSwgYXJnMik7XG4gIGVsc2Uge1xuICAgIHZhciBsZW4gPSBoYW5kbGVyLmxlbmd0aDtcbiAgICB2YXIgbGlzdGVuZXJzID0gYXJyYXlDbG9uZShoYW5kbGVyLCBsZW4pO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyArK2kpXG4gICAgICBsaXN0ZW5lcnNbaV0uY2FsbChzZWxmLCBhcmcxLCBhcmcyKTtcbiAgfVxufVxuZnVuY3Rpb24gZW1pdFRocmVlKGhhbmRsZXIsIGlzRm4sIHNlbGYsIGFyZzEsIGFyZzIsIGFyZzMpIHtcbiAgaWYgKGlzRm4pXG4gICAgaGFuZGxlci5jYWxsKHNlbGYsIGFyZzEsIGFyZzIsIGFyZzMpO1xuICBlbHNlIHtcbiAgICB2YXIgbGVuID0gaGFuZGxlci5sZW5ndGg7XG4gICAgdmFyIGxpc3RlbmVycyA9IGFycmF5Q2xvbmUoaGFuZGxlciwgbGVuKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgKytpKVxuICAgICAgbGlzdGVuZXJzW2ldLmNhbGwoc2VsZiwgYXJnMSwgYXJnMiwgYXJnMyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZW1pdE1hbnkoaGFuZGxlciwgaXNGbiwgc2VsZiwgYXJncykge1xuICBpZiAoaXNGbilcbiAgICBoYW5kbGVyLmFwcGx5KHNlbGYsIGFyZ3MpO1xuICBlbHNlIHtcbiAgICB2YXIgbGVuID0gaGFuZGxlci5sZW5ndGg7XG4gICAgdmFyIGxpc3RlbmVycyA9IGFycmF5Q2xvbmUoaGFuZGxlciwgbGVuKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgKytpKVxuICAgICAgbGlzdGVuZXJzW2ldLmFwcGx5KHNlbGYsIGFyZ3MpO1xuICB9XG59XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuZW1pdCA9IGZ1bmN0aW9uIGVtaXQodHlwZSkge1xuICB2YXIgZXIsIGhhbmRsZXIsIGxlbiwgYXJncywgaSwgZXZlbnRzO1xuICB2YXIgZG9FcnJvciA9ICh0eXBlID09PSAnZXJyb3InKTtcblxuICBldmVudHMgPSB0aGlzLl9ldmVudHM7XG4gIGlmIChldmVudHMpXG4gICAgZG9FcnJvciA9IChkb0Vycm9yICYmIGV2ZW50cy5lcnJvciA9PSBudWxsKTtcbiAgZWxzZSBpZiAoIWRvRXJyb3IpXG4gICAgcmV0dXJuIGZhbHNlO1xuXG4gIC8vIElmIHRoZXJlIGlzIG5vICdlcnJvcicgZXZlbnQgbGlzdGVuZXIgdGhlbiB0aHJvdy5cbiAgaWYgKGRvRXJyb3IpIHtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpXG4gICAgICBlciA9IGFyZ3VtZW50c1sxXTtcbiAgICBpZiAoZXIgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgdGhyb3cgZXI7IC8vIFVuaGFuZGxlZCAnZXJyb3InIGV2ZW50XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEF0IGxlYXN0IGdpdmUgc29tZSBraW5kIG9mIGNvbnRleHQgdG8gdGhlIHVzZXJcbiAgICAgIHZhciBlcnIgPSBuZXcgRXJyb3IoJ1VuaGFuZGxlZCBcImVycm9yXCIgZXZlbnQuICgnICsgZXIgKyAnKScpO1xuICAgICAgZXJyLmNvbnRleHQgPSBlcjtcbiAgICAgIHRocm93IGVycjtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaGFuZGxlciA9IGV2ZW50c1t0eXBlXTtcblxuICBpZiAoIWhhbmRsZXIpXG4gICAgcmV0dXJuIGZhbHNlO1xuXG4gIHZhciBpc0ZuID0gdHlwZW9mIGhhbmRsZXIgPT09ICdmdW5jdGlvbic7XG4gIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gIHN3aXRjaCAobGVuKSB7XG4gICAgICAvLyBmYXN0IGNhc2VzXG4gICAgY2FzZSAxOlxuICAgICAgZW1pdE5vbmUoaGFuZGxlciwgaXNGbiwgdGhpcyk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIDI6XG4gICAgICBlbWl0T25lKGhhbmRsZXIsIGlzRm4sIHRoaXMsIGFyZ3VtZW50c1sxXSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIDM6XG4gICAgICBlbWl0VHdvKGhhbmRsZXIsIGlzRm4sIHRoaXMsIGFyZ3VtZW50c1sxXSwgYXJndW1lbnRzWzJdKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgNDpcbiAgICAgIGVtaXRUaHJlZShoYW5kbGVyLCBpc0ZuLCB0aGlzLCBhcmd1bWVudHNbMV0sIGFyZ3VtZW50c1syXSwgYXJndW1lbnRzWzNdKTtcbiAgICAgIGJyZWFrO1xuICAgICAgLy8gc2xvd2VyXG4gICAgZGVmYXVsdDpcbiAgICAgIGFyZ3MgPSBuZXcgQXJyYXkobGVuIC0gMSk7XG4gICAgICBmb3IgKGkgPSAxOyBpIDwgbGVuOyBpKyspXG4gICAgICAgIGFyZ3NbaSAtIDFdID0gYXJndW1lbnRzW2ldO1xuICAgICAgZW1pdE1hbnkoaGFuZGxlciwgaXNGbiwgdGhpcywgYXJncyk7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbmZ1bmN0aW9uIF9hZGRMaXN0ZW5lcih0YXJnZXQsIHR5cGUsIGxpc3RlbmVyLCBwcmVwZW5kKSB7XG4gIHZhciBtO1xuICB2YXIgZXZlbnRzO1xuICB2YXIgZXhpc3Rpbmc7XG5cbiAgaWYgKHR5cGVvZiBsaXN0ZW5lciAhPT0gJ2Z1bmN0aW9uJylcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcImxpc3RlbmVyXCIgYXJndW1lbnQgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XG5cbiAgZXZlbnRzID0gdGFyZ2V0Ll9ldmVudHM7XG4gIGlmICghZXZlbnRzKSB7XG4gICAgZXZlbnRzID0gdGFyZ2V0Ll9ldmVudHMgPSBvYmplY3RDcmVhdGUobnVsbCk7XG4gICAgdGFyZ2V0Ll9ldmVudHNDb3VudCA9IDA7XG4gIH0gZWxzZSB7XG4gICAgLy8gVG8gYXZvaWQgcmVjdXJzaW9uIGluIHRoZSBjYXNlIHRoYXQgdHlwZSA9PT0gXCJuZXdMaXN0ZW5lclwiISBCZWZvcmVcbiAgICAvLyBhZGRpbmcgaXQgdG8gdGhlIGxpc3RlbmVycywgZmlyc3QgZW1pdCBcIm5ld0xpc3RlbmVyXCIuXG4gICAgaWYgKGV2ZW50cy5uZXdMaXN0ZW5lcikge1xuICAgICAgdGFyZ2V0LmVtaXQoJ25ld0xpc3RlbmVyJywgdHlwZSxcbiAgICAgICAgICBsaXN0ZW5lci5saXN0ZW5lciA/IGxpc3RlbmVyLmxpc3RlbmVyIDogbGlzdGVuZXIpO1xuXG4gICAgICAvLyBSZS1hc3NpZ24gYGV2ZW50c2AgYmVjYXVzZSBhIG5ld0xpc3RlbmVyIGhhbmRsZXIgY291bGQgaGF2ZSBjYXVzZWQgdGhlXG4gICAgICAvLyB0aGlzLl9ldmVudHMgdG8gYmUgYXNzaWduZWQgdG8gYSBuZXcgb2JqZWN0XG4gICAgICBldmVudHMgPSB0YXJnZXQuX2V2ZW50cztcbiAgICB9XG4gICAgZXhpc3RpbmcgPSBldmVudHNbdHlwZV07XG4gIH1cblxuICBpZiAoIWV4aXN0aW5nKSB7XG4gICAgLy8gT3B0aW1pemUgdGhlIGNhc2Ugb2Ygb25lIGxpc3RlbmVyLiBEb24ndCBuZWVkIHRoZSBleHRyYSBhcnJheSBvYmplY3QuXG4gICAgZXhpc3RpbmcgPSBldmVudHNbdHlwZV0gPSBsaXN0ZW5lcjtcbiAgICArK3RhcmdldC5fZXZlbnRzQ291bnQ7XG4gIH0gZWxzZSB7XG4gICAgaWYgKHR5cGVvZiBleGlzdGluZyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgLy8gQWRkaW5nIHRoZSBzZWNvbmQgZWxlbWVudCwgbmVlZCB0byBjaGFuZ2UgdG8gYXJyYXkuXG4gICAgICBleGlzdGluZyA9IGV2ZW50c1t0eXBlXSA9XG4gICAgICAgICAgcHJlcGVuZCA/IFtsaXN0ZW5lciwgZXhpc3RpbmddIDogW2V4aXN0aW5nLCBsaXN0ZW5lcl07XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIElmIHdlJ3ZlIGFscmVhZHkgZ290IGFuIGFycmF5LCBqdXN0IGFwcGVuZC5cbiAgICAgIGlmIChwcmVwZW5kKSB7XG4gICAgICAgIGV4aXN0aW5nLnVuc2hpZnQobGlzdGVuZXIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZXhpc3RpbmcucHVzaChsaXN0ZW5lcik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgZm9yIGxpc3RlbmVyIGxlYWtcbiAgICBpZiAoIWV4aXN0aW5nLndhcm5lZCkge1xuICAgICAgbSA9ICRnZXRNYXhMaXN0ZW5lcnModGFyZ2V0KTtcbiAgICAgIGlmIChtICYmIG0gPiAwICYmIGV4aXN0aW5nLmxlbmd0aCA+IG0pIHtcbiAgICAgICAgZXhpc3Rpbmcud2FybmVkID0gdHJ1ZTtcbiAgICAgICAgdmFyIHcgPSBuZXcgRXJyb3IoJ1Bvc3NpYmxlIEV2ZW50RW1pdHRlciBtZW1vcnkgbGVhayBkZXRlY3RlZC4gJyArXG4gICAgICAgICAgICBleGlzdGluZy5sZW5ndGggKyAnIFwiJyArIFN0cmluZyh0eXBlKSArICdcIiBsaXN0ZW5lcnMgJyArXG4gICAgICAgICAgICAnYWRkZWQuIFVzZSBlbWl0dGVyLnNldE1heExpc3RlbmVycygpIHRvICcgK1xuICAgICAgICAgICAgJ2luY3JlYXNlIGxpbWl0LicpO1xuICAgICAgICB3Lm5hbWUgPSAnTWF4TGlzdGVuZXJzRXhjZWVkZWRXYXJuaW5nJztcbiAgICAgICAgdy5lbWl0dGVyID0gdGFyZ2V0O1xuICAgICAgICB3LnR5cGUgPSB0eXBlO1xuICAgICAgICB3LmNvdW50ID0gZXhpc3RpbmcubGVuZ3RoO1xuICAgICAgICBpZiAodHlwZW9mIGNvbnNvbGUgPT09ICdvYmplY3QnICYmIGNvbnNvbGUud2Fybikge1xuICAgICAgICAgIGNvbnNvbGUud2FybignJXM6ICVzJywgdy5uYW1lLCB3Lm1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRhcmdldDtcbn1cblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5hZGRMaXN0ZW5lciA9IGZ1bmN0aW9uIGFkZExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyKSB7XG4gIHJldHVybiBfYWRkTGlzdGVuZXIodGhpcywgdHlwZSwgbGlzdGVuZXIsIGZhbHNlKTtcbn07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUub24gPSBFdmVudEVtaXR0ZXIucHJvdG90eXBlLmFkZExpc3RlbmVyO1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLnByZXBlbmRMaXN0ZW5lciA9XG4gICAgZnVuY3Rpb24gcHJlcGVuZExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyKSB7XG4gICAgICByZXR1cm4gX2FkZExpc3RlbmVyKHRoaXMsIHR5cGUsIGxpc3RlbmVyLCB0cnVlKTtcbiAgICB9O1xuXG5mdW5jdGlvbiBvbmNlV3JhcHBlcigpIHtcbiAgaWYgKCF0aGlzLmZpcmVkKSB7XG4gICAgdGhpcy50YXJnZXQucmVtb3ZlTGlzdGVuZXIodGhpcy50eXBlLCB0aGlzLndyYXBGbik7XG4gICAgdGhpcy5maXJlZCA9IHRydWU7XG4gICAgc3dpdGNoIChhcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgICBjYXNlIDA6XG4gICAgICAgIHJldHVybiB0aGlzLmxpc3RlbmVyLmNhbGwodGhpcy50YXJnZXQpO1xuICAgICAgY2FzZSAxOlxuICAgICAgICByZXR1cm4gdGhpcy5saXN0ZW5lci5jYWxsKHRoaXMudGFyZ2V0LCBhcmd1bWVudHNbMF0pO1xuICAgICAgY2FzZSAyOlxuICAgICAgICByZXR1cm4gdGhpcy5saXN0ZW5lci5jYWxsKHRoaXMudGFyZ2V0LCBhcmd1bWVudHNbMF0sIGFyZ3VtZW50c1sxXSk7XG4gICAgICBjYXNlIDM6XG4gICAgICAgIHJldHVybiB0aGlzLmxpc3RlbmVyLmNhbGwodGhpcy50YXJnZXQsIGFyZ3VtZW50c1swXSwgYXJndW1lbnRzWzFdLFxuICAgICAgICAgICAgYXJndW1lbnRzWzJdKTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHZhciBhcmdzID0gbmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGgpO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyArK2kpXG4gICAgICAgICAgYXJnc1tpXSA9IGFyZ3VtZW50c1tpXTtcbiAgICAgICAgdGhpcy5saXN0ZW5lci5hcHBseSh0aGlzLnRhcmdldCwgYXJncyk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIF9vbmNlV3JhcCh0YXJnZXQsIHR5cGUsIGxpc3RlbmVyKSB7XG4gIHZhciBzdGF0ZSA9IHsgZmlyZWQ6IGZhbHNlLCB3cmFwRm46IHVuZGVmaW5lZCwgdGFyZ2V0OiB0YXJnZXQsIHR5cGU6IHR5cGUsIGxpc3RlbmVyOiBsaXN0ZW5lciB9O1xuICB2YXIgd3JhcHBlZCA9IGJpbmQuY2FsbChvbmNlV3JhcHBlciwgc3RhdGUpO1xuICB3cmFwcGVkLmxpc3RlbmVyID0gbGlzdGVuZXI7XG4gIHN0YXRlLndyYXBGbiA9IHdyYXBwZWQ7XG4gIHJldHVybiB3cmFwcGVkO1xufVxuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLm9uY2UgPSBmdW5jdGlvbiBvbmNlKHR5cGUsIGxpc3RlbmVyKSB7XG4gIGlmICh0eXBlb2YgbGlzdGVuZXIgIT09ICdmdW5jdGlvbicpXG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJsaXN0ZW5lclwiIGFyZ3VtZW50IG11c3QgYmUgYSBmdW5jdGlvbicpO1xuICB0aGlzLm9uKHR5cGUsIF9vbmNlV3JhcCh0aGlzLCB0eXBlLCBsaXN0ZW5lcikpO1xuICByZXR1cm4gdGhpcztcbn07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUucHJlcGVuZE9uY2VMaXN0ZW5lciA9XG4gICAgZnVuY3Rpb24gcHJlcGVuZE9uY2VMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcikge1xuICAgICAgaWYgKHR5cGVvZiBsaXN0ZW5lciAhPT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJsaXN0ZW5lclwiIGFyZ3VtZW50IG11c3QgYmUgYSBmdW5jdGlvbicpO1xuICAgICAgdGhpcy5wcmVwZW5kTGlzdGVuZXIodHlwZSwgX29uY2VXcmFwKHRoaXMsIHR5cGUsIGxpc3RlbmVyKSk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG4vLyBFbWl0cyBhICdyZW1vdmVMaXN0ZW5lcicgZXZlbnQgaWYgYW5kIG9ubHkgaWYgdGhlIGxpc3RlbmVyIHdhcyByZW1vdmVkLlxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lciA9XG4gICAgZnVuY3Rpb24gcmVtb3ZlTGlzdGVuZXIodHlwZSwgbGlzdGVuZXIpIHtcbiAgICAgIHZhciBsaXN0LCBldmVudHMsIHBvc2l0aW9uLCBpLCBvcmlnaW5hbExpc3RlbmVyO1xuXG4gICAgICBpZiAodHlwZW9mIGxpc3RlbmVyICE9PSAnZnVuY3Rpb24nKVxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcImxpc3RlbmVyXCIgYXJndW1lbnQgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XG5cbiAgICAgIGV2ZW50cyA9IHRoaXMuX2V2ZW50cztcbiAgICAgIGlmICghZXZlbnRzKVxuICAgICAgICByZXR1cm4gdGhpcztcblxuICAgICAgbGlzdCA9IGV2ZW50c1t0eXBlXTtcbiAgICAgIGlmICghbGlzdClcbiAgICAgICAgcmV0dXJuIHRoaXM7XG5cbiAgICAgIGlmIChsaXN0ID09PSBsaXN0ZW5lciB8fCBsaXN0Lmxpc3RlbmVyID09PSBsaXN0ZW5lcikge1xuICAgICAgICBpZiAoLS10aGlzLl9ldmVudHNDb3VudCA9PT0gMClcbiAgICAgICAgICB0aGlzLl9ldmVudHMgPSBvYmplY3RDcmVhdGUobnVsbCk7XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIGRlbGV0ZSBldmVudHNbdHlwZV07XG4gICAgICAgICAgaWYgKGV2ZW50cy5yZW1vdmVMaXN0ZW5lcilcbiAgICAgICAgICAgIHRoaXMuZW1pdCgncmVtb3ZlTGlzdGVuZXInLCB0eXBlLCBsaXN0Lmxpc3RlbmVyIHx8IGxpc3RlbmVyKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgbGlzdCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBwb3NpdGlvbiA9IC0xO1xuXG4gICAgICAgIGZvciAoaSA9IGxpc3QubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICBpZiAobGlzdFtpXSA9PT0gbGlzdGVuZXIgfHwgbGlzdFtpXS5saXN0ZW5lciA9PT0gbGlzdGVuZXIpIHtcbiAgICAgICAgICAgIG9yaWdpbmFsTGlzdGVuZXIgPSBsaXN0W2ldLmxpc3RlbmVyO1xuICAgICAgICAgICAgcG9zaXRpb24gPSBpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBvc2l0aW9uIDwgMClcbiAgICAgICAgICByZXR1cm4gdGhpcztcblxuICAgICAgICBpZiAocG9zaXRpb24gPT09IDApXG4gICAgICAgICAgbGlzdC5zaGlmdCgpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgc3BsaWNlT25lKGxpc3QsIHBvc2l0aW9uKTtcblxuICAgICAgICBpZiAobGlzdC5sZW5ndGggPT09IDEpXG4gICAgICAgICAgZXZlbnRzW3R5cGVdID0gbGlzdFswXTtcblxuICAgICAgICBpZiAoZXZlbnRzLnJlbW92ZUxpc3RlbmVyKVxuICAgICAgICAgIHRoaXMuZW1pdCgncmVtb3ZlTGlzdGVuZXInLCB0eXBlLCBvcmlnaW5hbExpc3RlbmVyIHx8IGxpc3RlbmVyKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5yZW1vdmVBbGxMaXN0ZW5lcnMgPVxuICAgIGZ1bmN0aW9uIHJlbW92ZUFsbExpc3RlbmVycyh0eXBlKSB7XG4gICAgICB2YXIgbGlzdGVuZXJzLCBldmVudHMsIGk7XG5cbiAgICAgIGV2ZW50cyA9IHRoaXMuX2V2ZW50cztcbiAgICAgIGlmICghZXZlbnRzKVxuICAgICAgICByZXR1cm4gdGhpcztcblxuICAgICAgLy8gbm90IGxpc3RlbmluZyBmb3IgcmVtb3ZlTGlzdGVuZXIsIG5vIG5lZWQgdG8gZW1pdFxuICAgICAgaWYgKCFldmVudHMucmVtb3ZlTGlzdGVuZXIpIHtcbiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICB0aGlzLl9ldmVudHMgPSBvYmplY3RDcmVhdGUobnVsbCk7XG4gICAgICAgICAgdGhpcy5fZXZlbnRzQ291bnQgPSAwO1xuICAgICAgICB9IGVsc2UgaWYgKGV2ZW50c1t0eXBlXSkge1xuICAgICAgICAgIGlmICgtLXRoaXMuX2V2ZW50c0NvdW50ID09PSAwKVxuICAgICAgICAgICAgdGhpcy5fZXZlbnRzID0gb2JqZWN0Q3JlYXRlKG51bGwpO1xuICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIGRlbGV0ZSBldmVudHNbdHlwZV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG5cbiAgICAgIC8vIGVtaXQgcmVtb3ZlTGlzdGVuZXIgZm9yIGFsbCBsaXN0ZW5lcnMgb24gYWxsIGV2ZW50c1xuICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdmFyIGtleXMgPSBvYmplY3RLZXlzKGV2ZW50cyk7XG4gICAgICAgIHZhciBrZXk7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAga2V5ID0ga2V5c1tpXTtcbiAgICAgICAgICBpZiAoa2V5ID09PSAncmVtb3ZlTGlzdGVuZXInKSBjb250aW51ZTtcbiAgICAgICAgICB0aGlzLnJlbW92ZUFsbExpc3RlbmVycyhrZXkpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKCdyZW1vdmVMaXN0ZW5lcicpO1xuICAgICAgICB0aGlzLl9ldmVudHMgPSBvYmplY3RDcmVhdGUobnVsbCk7XG4gICAgICAgIHRoaXMuX2V2ZW50c0NvdW50ID0gMDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG5cbiAgICAgIGxpc3RlbmVycyA9IGV2ZW50c1t0eXBlXTtcblxuICAgICAgaWYgKHR5cGVvZiBsaXN0ZW5lcnMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhpcy5yZW1vdmVMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcnMpO1xuICAgICAgfSBlbHNlIGlmIChsaXN0ZW5lcnMpIHtcbiAgICAgICAgLy8gTElGTyBvcmRlclxuICAgICAgICBmb3IgKGkgPSBsaXN0ZW5lcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICB0aGlzLnJlbW92ZUxpc3RlbmVyKHR5cGUsIGxpc3RlbmVyc1tpXSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuZnVuY3Rpb24gX2xpc3RlbmVycyh0YXJnZXQsIHR5cGUsIHVud3JhcCkge1xuICB2YXIgZXZlbnRzID0gdGFyZ2V0Ll9ldmVudHM7XG5cbiAgaWYgKCFldmVudHMpXG4gICAgcmV0dXJuIFtdO1xuXG4gIHZhciBldmxpc3RlbmVyID0gZXZlbnRzW3R5cGVdO1xuICBpZiAoIWV2bGlzdGVuZXIpXG4gICAgcmV0dXJuIFtdO1xuXG4gIGlmICh0eXBlb2YgZXZsaXN0ZW5lciA9PT0gJ2Z1bmN0aW9uJylcbiAgICByZXR1cm4gdW53cmFwID8gW2V2bGlzdGVuZXIubGlzdGVuZXIgfHwgZXZsaXN0ZW5lcl0gOiBbZXZsaXN0ZW5lcl07XG5cbiAgcmV0dXJuIHVud3JhcCA/IHVud3JhcExpc3RlbmVycyhldmxpc3RlbmVyKSA6IGFycmF5Q2xvbmUoZXZsaXN0ZW5lciwgZXZsaXN0ZW5lci5sZW5ndGgpO1xufVxuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmxpc3RlbmVycyA9IGZ1bmN0aW9uIGxpc3RlbmVycyh0eXBlKSB7XG4gIHJldHVybiBfbGlzdGVuZXJzKHRoaXMsIHR5cGUsIHRydWUpO1xufTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5yYXdMaXN0ZW5lcnMgPSBmdW5jdGlvbiByYXdMaXN0ZW5lcnModHlwZSkge1xuICByZXR1cm4gX2xpc3RlbmVycyh0aGlzLCB0eXBlLCBmYWxzZSk7XG59O1xuXG5FdmVudEVtaXR0ZXIubGlzdGVuZXJDb3VudCA9IGZ1bmN0aW9uKGVtaXR0ZXIsIHR5cGUpIHtcbiAgaWYgKHR5cGVvZiBlbWl0dGVyLmxpc3RlbmVyQ291bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gZW1pdHRlci5saXN0ZW5lckNvdW50KHR5cGUpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBsaXN0ZW5lckNvdW50LmNhbGwoZW1pdHRlciwgdHlwZSk7XG4gIH1cbn07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUubGlzdGVuZXJDb3VudCA9IGxpc3RlbmVyQ291bnQ7XG5mdW5jdGlvbiBsaXN0ZW5lckNvdW50KHR5cGUpIHtcbiAgdmFyIGV2ZW50cyA9IHRoaXMuX2V2ZW50cztcblxuICBpZiAoZXZlbnRzKSB7XG4gICAgdmFyIGV2bGlzdGVuZXIgPSBldmVudHNbdHlwZV07XG5cbiAgICBpZiAodHlwZW9mIGV2bGlzdGVuZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiAxO1xuICAgIH0gZWxzZSBpZiAoZXZsaXN0ZW5lcikge1xuICAgICAgcmV0dXJuIGV2bGlzdGVuZXIubGVuZ3RoO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiAwO1xufVxuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmV2ZW50TmFtZXMgPSBmdW5jdGlvbiBldmVudE5hbWVzKCkge1xuICByZXR1cm4gdGhpcy5fZXZlbnRzQ291bnQgPiAwID8gUmVmbGVjdC5vd25LZXlzKHRoaXMuX2V2ZW50cykgOiBbXTtcbn07XG5cbi8vIEFib3V0IDEuNXggZmFzdGVyIHRoYW4gdGhlIHR3by1hcmcgdmVyc2lvbiBvZiBBcnJheSNzcGxpY2UoKS5cbmZ1bmN0aW9uIHNwbGljZU9uZShsaXN0LCBpbmRleCkge1xuICBmb3IgKHZhciBpID0gaW5kZXgsIGsgPSBpICsgMSwgbiA9IGxpc3QubGVuZ3RoOyBrIDwgbjsgaSArPSAxLCBrICs9IDEpXG4gICAgbGlzdFtpXSA9IGxpc3Rba107XG4gIGxpc3QucG9wKCk7XG59XG5cbmZ1bmN0aW9uIGFycmF5Q2xvbmUoYXJyLCBuKSB7XG4gIHZhciBjb3B5ID0gbmV3IEFycmF5KG4pO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IG47ICsraSlcbiAgICBjb3B5W2ldID0gYXJyW2ldO1xuICByZXR1cm4gY29weTtcbn1cblxuZnVuY3Rpb24gdW53cmFwTGlzdGVuZXJzKGFycikge1xuICB2YXIgcmV0ID0gbmV3IEFycmF5KGFyci5sZW5ndGgpO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHJldC5sZW5ndGg7ICsraSkge1xuICAgIHJldFtpXSA9IGFycltpXS5saXN0ZW5lciB8fCBhcnJbaV07XG4gIH1cbiAgcmV0dXJuIHJldDtcbn1cblxuZnVuY3Rpb24gb2JqZWN0Q3JlYXRlUG9seWZpbGwocHJvdG8pIHtcbiAgdmFyIEYgPSBmdW5jdGlvbigpIHt9O1xuICBGLnByb3RvdHlwZSA9IHByb3RvO1xuICByZXR1cm4gbmV3IEY7XG59XG5mdW5jdGlvbiBvYmplY3RLZXlzUG9seWZpbGwob2JqKSB7XG4gIHZhciBrZXlzID0gW107XG4gIGZvciAodmFyIGsgaW4gb2JqKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgaykpIHtcbiAgICBrZXlzLnB1c2goayk7XG4gIH1cbiAgcmV0dXJuIGs7XG59XG5mdW5jdGlvbiBmdW5jdGlvbkJpbmRQb2x5ZmlsbChjb250ZXh0KSB7XG4gIHZhciBmbiA9IHRoaXM7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGZuLmFwcGx5KGNvbnRleHQsIGFyZ3VtZW50cyk7XG4gIH07XG59XG4iLCJ2YXIgaHR0cCA9IHJlcXVpcmUoJ2h0dHAnKVxudmFyIHVybCA9IHJlcXVpcmUoJ3VybCcpXG5cbnZhciBodHRwcyA9IG1vZHVsZS5leHBvcnRzXG5cbmZvciAodmFyIGtleSBpbiBodHRwKSB7XG4gIGlmIChodHRwLmhhc093blByb3BlcnR5KGtleSkpIGh0dHBzW2tleV0gPSBodHRwW2tleV1cbn1cblxuaHR0cHMucmVxdWVzdCA9IGZ1bmN0aW9uIChwYXJhbXMsIGNiKSB7XG4gIHBhcmFtcyA9IHZhbGlkYXRlUGFyYW1zKHBhcmFtcylcbiAgcmV0dXJuIGh0dHAucmVxdWVzdC5jYWxsKHRoaXMsIHBhcmFtcywgY2IpXG59XG5cbmh0dHBzLmdldCA9IGZ1bmN0aW9uIChwYXJhbXMsIGNiKSB7XG4gIHBhcmFtcyA9IHZhbGlkYXRlUGFyYW1zKHBhcmFtcylcbiAgcmV0dXJuIGh0dHAuZ2V0LmNhbGwodGhpcywgcGFyYW1zLCBjYilcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVQYXJhbXMgKHBhcmFtcykge1xuICBpZiAodHlwZW9mIHBhcmFtcyA9PT0gJ3N0cmluZycpIHtcbiAgICBwYXJhbXMgPSB1cmwucGFyc2UocGFyYW1zKVxuICB9XG4gIGlmICghcGFyYW1zLnByb3RvY29sKSB7XG4gICAgcGFyYW1zLnByb3RvY29sID0gJ2h0dHBzOidcbiAgfVxuICBpZiAocGFyYW1zLnByb3RvY29sICE9PSAnaHR0cHM6Jykge1xuICAgIHRocm93IG5ldyBFcnJvcignUHJvdG9jb2wgXCInICsgcGFyYW1zLnByb3RvY29sICsgJ1wiIG5vdCBzdXBwb3J0ZWQuIEV4cGVjdGVkIFwiaHR0cHM6XCInKVxuICB9XG4gIHJldHVybiBwYXJhbXNcbn1cbiIsIi8qISBpZWVlNzU0LiBCU0QtMy1DbGF1c2UgTGljZW5zZS4gRmVyb3NzIEFib3VraGFkaWplaCA8aHR0cHM6Ly9mZXJvc3Mub3JnL29wZW5zb3VyY2U+ICovXG5leHBvcnRzLnJlYWQgPSBmdW5jdGlvbiAoYnVmZmVyLCBvZmZzZXQsIGlzTEUsIG1MZW4sIG5CeXRlcykge1xuICB2YXIgZSwgbVxuICB2YXIgZUxlbiA9IChuQnl0ZXMgKiA4KSAtIG1MZW4gLSAxXG4gIHZhciBlTWF4ID0gKDEgPDwgZUxlbikgLSAxXG4gIHZhciBlQmlhcyA9IGVNYXggPj4gMVxuICB2YXIgbkJpdHMgPSAtN1xuICB2YXIgaSA9IGlzTEUgPyAobkJ5dGVzIC0gMSkgOiAwXG4gIHZhciBkID0gaXNMRSA/IC0xIDogMVxuICB2YXIgcyA9IGJ1ZmZlcltvZmZzZXQgKyBpXVxuXG4gIGkgKz0gZFxuXG4gIGUgPSBzICYgKCgxIDw8ICgtbkJpdHMpKSAtIDEpXG4gIHMgPj49ICgtbkJpdHMpXG4gIG5CaXRzICs9IGVMZW5cbiAgZm9yICg7IG5CaXRzID4gMDsgZSA9IChlICogMjU2KSArIGJ1ZmZlcltvZmZzZXQgKyBpXSwgaSArPSBkLCBuQml0cyAtPSA4KSB7fVxuXG4gIG0gPSBlICYgKCgxIDw8ICgtbkJpdHMpKSAtIDEpXG4gIGUgPj49ICgtbkJpdHMpXG4gIG5CaXRzICs9IG1MZW5cbiAgZm9yICg7IG5CaXRzID4gMDsgbSA9IChtICogMjU2KSArIGJ1ZmZlcltvZmZzZXQgKyBpXSwgaSArPSBkLCBuQml0cyAtPSA4KSB7fVxuXG4gIGlmIChlID09PSAwKSB7XG4gICAgZSA9IDEgLSBlQmlhc1xuICB9IGVsc2UgaWYgKGUgPT09IGVNYXgpIHtcbiAgICByZXR1cm4gbSA/IE5hTiA6ICgocyA/IC0xIDogMSkgKiBJbmZpbml0eSlcbiAgfSBlbHNlIHtcbiAgICBtID0gbSArIE1hdGgucG93KDIsIG1MZW4pXG4gICAgZSA9IGUgLSBlQmlhc1xuICB9XG4gIHJldHVybiAocyA/IC0xIDogMSkgKiBtICogTWF0aC5wb3coMiwgZSAtIG1MZW4pXG59XG5cbmV4cG9ydHMud3JpdGUgPSBmdW5jdGlvbiAoYnVmZmVyLCB2YWx1ZSwgb2Zmc2V0LCBpc0xFLCBtTGVuLCBuQnl0ZXMpIHtcbiAgdmFyIGUsIG0sIGNcbiAgdmFyIGVMZW4gPSAobkJ5dGVzICogOCkgLSBtTGVuIC0gMVxuICB2YXIgZU1heCA9ICgxIDw8IGVMZW4pIC0gMVxuICB2YXIgZUJpYXMgPSBlTWF4ID4+IDFcbiAgdmFyIHJ0ID0gKG1MZW4gPT09IDIzID8gTWF0aC5wb3coMiwgLTI0KSAtIE1hdGgucG93KDIsIC03NykgOiAwKVxuICB2YXIgaSA9IGlzTEUgPyAwIDogKG5CeXRlcyAtIDEpXG4gIHZhciBkID0gaXNMRSA/IDEgOiAtMVxuICB2YXIgcyA9IHZhbHVlIDwgMCB8fCAodmFsdWUgPT09IDAgJiYgMSAvIHZhbHVlIDwgMCkgPyAxIDogMFxuXG4gIHZhbHVlID0gTWF0aC5hYnModmFsdWUpXG5cbiAgaWYgKGlzTmFOKHZhbHVlKSB8fCB2YWx1ZSA9PT0gSW5maW5pdHkpIHtcbiAgICBtID0gaXNOYU4odmFsdWUpID8gMSA6IDBcbiAgICBlID0gZU1heFxuICB9IGVsc2Uge1xuICAgIGUgPSBNYXRoLmZsb29yKE1hdGgubG9nKHZhbHVlKSAvIE1hdGguTE4yKVxuICAgIGlmICh2YWx1ZSAqIChjID0gTWF0aC5wb3coMiwgLWUpKSA8IDEpIHtcbiAgICAgIGUtLVxuICAgICAgYyAqPSAyXG4gICAgfVxuICAgIGlmIChlICsgZUJpYXMgPj0gMSkge1xuICAgICAgdmFsdWUgKz0gcnQgLyBjXG4gICAgfSBlbHNlIHtcbiAgICAgIHZhbHVlICs9IHJ0ICogTWF0aC5wb3coMiwgMSAtIGVCaWFzKVxuICAgIH1cbiAgICBpZiAodmFsdWUgKiBjID49IDIpIHtcbiAgICAgIGUrK1xuICAgICAgYyAvPSAyXG4gICAgfVxuXG4gICAgaWYgKGUgKyBlQmlhcyA+PSBlTWF4KSB7XG4gICAgICBtID0gMFxuICAgICAgZSA9IGVNYXhcbiAgICB9IGVsc2UgaWYgKGUgKyBlQmlhcyA+PSAxKSB7XG4gICAgICBtID0gKCh2YWx1ZSAqIGMpIC0gMSkgKiBNYXRoLnBvdygyLCBtTGVuKVxuICAgICAgZSA9IGUgKyBlQmlhc1xuICAgIH0gZWxzZSB7XG4gICAgICBtID0gdmFsdWUgKiBNYXRoLnBvdygyLCBlQmlhcyAtIDEpICogTWF0aC5wb3coMiwgbUxlbilcbiAgICAgIGUgPSAwXG4gICAgfVxuICB9XG5cbiAgZm9yICg7IG1MZW4gPj0gODsgYnVmZmVyW29mZnNldCArIGldID0gbSAmIDB4ZmYsIGkgKz0gZCwgbSAvPSAyNTYsIG1MZW4gLT0gOCkge31cblxuICBlID0gKGUgPDwgbUxlbikgfCBtXG4gIGVMZW4gKz0gbUxlblxuICBmb3IgKDsgZUxlbiA+IDA7IGJ1ZmZlcltvZmZzZXQgKyBpXSA9IGUgJiAweGZmLCBpICs9IGQsIGUgLz0gMjU2LCBlTGVuIC09IDgpIHt9XG5cbiAgYnVmZmVyW29mZnNldCArIGkgLSBkXSB8PSBzICogMTI4XG59XG4iLCIvKipcbiAqIE1JVCBMaWNlbnNlXG4gKiBcbiAqIENvcHlyaWdodCAoYykgMjAxNC1wcmVzZW50LCBMZWUgQnlyb24gYW5kIG90aGVyIGNvbnRyaWJ1dG9ycy5cbiAqIFxuICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4gKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuICogXG4gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGxcbiAqIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4gKiBcbiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1JcbiAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4gKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4gKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEVcbiAqIFNPRlRXQVJFLlxuICovXG4oZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgPyBmYWN0b3J5KGV4cG9ydHMpIDpcbiAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnZXhwb3J0cyddLCBmYWN0b3J5KSA6XG4gIChnbG9iYWwgPSB0eXBlb2YgZ2xvYmFsVGhpcyAhPT0gJ3VuZGVmaW5lZCcgPyBnbG9iYWxUaGlzIDogZ2xvYmFsIHx8IHNlbGYsIGZhY3RvcnkoZ2xvYmFsLkltbXV0YWJsZSA9IHt9KSk7XG59KHRoaXMsIChmdW5jdGlvbiAoZXhwb3J0cykgeyAndXNlIHN0cmljdCc7XG5cbiAgdmFyIERFTEVURSA9ICdkZWxldGUnO1xuXG4gIC8vIENvbnN0YW50cyBkZXNjcmliaW5nIHRoZSBzaXplIG9mIHRyaWUgbm9kZXMuXG4gIHZhciBTSElGVCA9IDU7IC8vIFJlc3VsdGVkIGluIGJlc3QgcGVyZm9ybWFuY2UgYWZ0ZXIgX19fX19fP1xuICB2YXIgU0laRSA9IDEgPDwgU0hJRlQ7XG4gIHZhciBNQVNLID0gU0laRSAtIDE7XG5cbiAgLy8gQSBjb25zaXN0ZW50IHNoYXJlZCB2YWx1ZSByZXByZXNlbnRpbmcgXCJub3Qgc2V0XCIgd2hpY2ggZXF1YWxzIG5vdGhpbmcgb3RoZXJcbiAgLy8gdGhhbiBpdHNlbGYsIGFuZCBub3RoaW5nIHRoYXQgY291bGQgYmUgcHJvdmlkZWQgZXh0ZXJuYWxseS5cbiAgdmFyIE5PVF9TRVQgPSB7fTtcblxuICAvLyBCb29sZWFuIHJlZmVyZW5jZXMsIFJvdWdoIGVxdWl2YWxlbnQgb2YgYGJvb2wgJmAuXG4gIGZ1bmN0aW9uIE1ha2VSZWYoKSB7XG4gICAgcmV0dXJuIHsgdmFsdWU6IGZhbHNlIH07XG4gIH1cblxuICBmdW5jdGlvbiBTZXRSZWYocmVmKSB7XG4gICAgaWYgKHJlZikge1xuICAgICAgcmVmLnZhbHVlID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICAvLyBBIGZ1bmN0aW9uIHdoaWNoIHJldHVybnMgYSB2YWx1ZSByZXByZXNlbnRpbmcgYW4gXCJvd25lclwiIGZvciB0cmFuc2llbnQgd3JpdGVzXG4gIC8vIHRvIHRyaWVzLiBUaGUgcmV0dXJuIHZhbHVlIHdpbGwgb25seSBldmVyIGVxdWFsIGl0c2VsZiwgYW5kIHdpbGwgbm90IGVxdWFsXG4gIC8vIHRoZSByZXR1cm4gb2YgYW55IHN1YnNlcXVlbnQgY2FsbCBvZiB0aGlzIGZ1bmN0aW9uLlxuICBmdW5jdGlvbiBPd25lcklEKCkge31cblxuICBmdW5jdGlvbiBlbnN1cmVTaXplKGl0ZXIpIHtcbiAgICBpZiAoaXRlci5zaXplID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGl0ZXIuc2l6ZSA9IGl0ZXIuX19pdGVyYXRlKHJldHVyblRydWUpO1xuICAgIH1cbiAgICByZXR1cm4gaXRlci5zaXplO1xuICB9XG5cbiAgZnVuY3Rpb24gd3JhcEluZGV4KGl0ZXIsIGluZGV4KSB7XG4gICAgLy8gVGhpcyBpbXBsZW1lbnRzIFwiaXMgYXJyYXkgaW5kZXhcIiB3aGljaCB0aGUgRUNNQVN0cmluZyBzcGVjIGRlZmluZXMgYXM6XG4gICAgLy9cbiAgICAvLyAgICAgQSBTdHJpbmcgcHJvcGVydHkgbmFtZSBQIGlzIGFuIGFycmF5IGluZGV4IGlmIGFuZCBvbmx5IGlmXG4gICAgLy8gICAgIFRvU3RyaW5nKFRvVWludDMyKFApKSBpcyBlcXVhbCB0byBQIGFuZCBUb1VpbnQzMihQKSBpcyBub3QgZXF1YWxcbiAgICAvLyAgICAgdG8gMl4zMuKIkjEuXG4gICAgLy9cbiAgICAvLyBodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNi4wLyNzZWMtYXJyYXktZXhvdGljLW9iamVjdHNcbiAgICBpZiAodHlwZW9mIGluZGV4ICE9PSAnbnVtYmVyJykge1xuICAgICAgdmFyIHVpbnQzMkluZGV4ID0gaW5kZXggPj4+IDA7IC8vIE4gPj4+IDAgaXMgc2hvcnRoYW5kIGZvciBUb1VpbnQzMlxuICAgICAgaWYgKCcnICsgdWludDMySW5kZXggIT09IGluZGV4IHx8IHVpbnQzMkluZGV4ID09PSA0Mjk0OTY3Mjk1KSB7XG4gICAgICAgIHJldHVybiBOYU47XG4gICAgICB9XG4gICAgICBpbmRleCA9IHVpbnQzMkluZGV4O1xuICAgIH1cbiAgICByZXR1cm4gaW5kZXggPCAwID8gZW5zdXJlU2l6ZShpdGVyKSArIGluZGV4IDogaW5kZXg7XG4gIH1cblxuICBmdW5jdGlvbiByZXR1cm5UcnVlKCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgZnVuY3Rpb24gd2hvbGVTbGljZShiZWdpbiwgZW5kLCBzaXplKSB7XG4gICAgcmV0dXJuIChcbiAgICAgICgoYmVnaW4gPT09IDAgJiYgIWlzTmVnKGJlZ2luKSkgfHxcbiAgICAgICAgKHNpemUgIT09IHVuZGVmaW5lZCAmJiBiZWdpbiA8PSAtc2l6ZSkpICYmXG4gICAgICAoZW5kID09PSB1bmRlZmluZWQgfHwgKHNpemUgIT09IHVuZGVmaW5lZCAmJiBlbmQgPj0gc2l6ZSkpXG4gICAgKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlc29sdmVCZWdpbihiZWdpbiwgc2l6ZSkge1xuICAgIHJldHVybiByZXNvbHZlSW5kZXgoYmVnaW4sIHNpemUsIDApO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVzb2x2ZUVuZChlbmQsIHNpemUpIHtcbiAgICByZXR1cm4gcmVzb2x2ZUluZGV4KGVuZCwgc2l6ZSwgc2l6ZSk7XG4gIH1cblxuICBmdW5jdGlvbiByZXNvbHZlSW5kZXgoaW5kZXgsIHNpemUsIGRlZmF1bHRJbmRleCkge1xuICAgIC8vIFNhbml0aXplIGluZGljZXMgdXNpbmcgdGhpcyBzaG9ydGhhbmQgZm9yIFRvSW50MzIoYXJndW1lbnQpXG4gICAgLy8gaHR0cDovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzYuMC8jc2VjLXRvaW50MzJcbiAgICByZXR1cm4gaW5kZXggPT09IHVuZGVmaW5lZFxuICAgICAgPyBkZWZhdWx0SW5kZXhcbiAgICAgIDogaXNOZWcoaW5kZXgpXG4gICAgICA/IHNpemUgPT09IEluZmluaXR5XG4gICAgICAgID8gc2l6ZVxuICAgICAgICA6IE1hdGgubWF4KDAsIHNpemUgKyBpbmRleCkgfCAwXG4gICAgICA6IHNpemUgPT09IHVuZGVmaW5lZCB8fCBzaXplID09PSBpbmRleFxuICAgICAgPyBpbmRleFxuICAgICAgOiBNYXRoLm1pbihzaXplLCBpbmRleCkgfCAwO1xuICB9XG5cbiAgZnVuY3Rpb24gaXNOZWcodmFsdWUpIHtcbiAgICAvLyBBY2NvdW50IGZvciAtMCB3aGljaCBpcyBuZWdhdGl2ZSwgYnV0IG5vdCBsZXNzIHRoYW4gMC5cbiAgICByZXR1cm4gdmFsdWUgPCAwIHx8ICh2YWx1ZSA9PT0gMCAmJiAxIC8gdmFsdWUgPT09IC1JbmZpbml0eSk7XG4gIH1cblxuICB2YXIgSVNfQ09MTEVDVElPTl9TWU1CT0wgPSAnQEBfX0lNTVVUQUJMRV9JVEVSQUJMRV9fQEAnO1xuXG4gIGZ1bmN0aW9uIGlzQ29sbGVjdGlvbihtYXliZUNvbGxlY3Rpb24pIHtcbiAgICByZXR1cm4gQm9vbGVhbihtYXliZUNvbGxlY3Rpb24gJiYgbWF5YmVDb2xsZWN0aW9uW0lTX0NPTExFQ1RJT05fU1lNQk9MXSk7XG4gIH1cblxuICB2YXIgSVNfS0VZRURfU1lNQk9MID0gJ0BAX19JTU1VVEFCTEVfS0VZRURfX0BAJztcblxuICBmdW5jdGlvbiBpc0tleWVkKG1heWJlS2V5ZWQpIHtcbiAgICByZXR1cm4gQm9vbGVhbihtYXliZUtleWVkICYmIG1heWJlS2V5ZWRbSVNfS0VZRURfU1lNQk9MXSk7XG4gIH1cblxuICB2YXIgSVNfSU5ERVhFRF9TWU1CT0wgPSAnQEBfX0lNTVVUQUJMRV9JTkRFWEVEX19AQCc7XG5cbiAgZnVuY3Rpb24gaXNJbmRleGVkKG1heWJlSW5kZXhlZCkge1xuICAgIHJldHVybiBCb29sZWFuKG1heWJlSW5kZXhlZCAmJiBtYXliZUluZGV4ZWRbSVNfSU5ERVhFRF9TWU1CT0xdKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGlzQXNzb2NpYXRpdmUobWF5YmVBc3NvY2lhdGl2ZSkge1xuICAgIHJldHVybiBpc0tleWVkKG1heWJlQXNzb2NpYXRpdmUpIHx8IGlzSW5kZXhlZChtYXliZUFzc29jaWF0aXZlKTtcbiAgfVxuXG4gIHZhciBDb2xsZWN0aW9uID0gZnVuY3Rpb24gQ29sbGVjdGlvbih2YWx1ZSkge1xuICAgIHJldHVybiBpc0NvbGxlY3Rpb24odmFsdWUpID8gdmFsdWUgOiBTZXEodmFsdWUpO1xuICB9O1xuXG4gIHZhciBLZXllZENvbGxlY3Rpb24gPSAvKkBfX1BVUkVfXyovKGZ1bmN0aW9uIChDb2xsZWN0aW9uKSB7XG4gICAgZnVuY3Rpb24gS2V5ZWRDb2xsZWN0aW9uKHZhbHVlKSB7XG4gICAgICByZXR1cm4gaXNLZXllZCh2YWx1ZSkgPyB2YWx1ZSA6IEtleWVkU2VxKHZhbHVlKTtcbiAgICB9XG5cbiAgICBpZiAoIENvbGxlY3Rpb24gKSBLZXllZENvbGxlY3Rpb24uX19wcm90b19fID0gQ29sbGVjdGlvbjtcbiAgICBLZXllZENvbGxlY3Rpb24ucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQ29sbGVjdGlvbiAmJiBDb2xsZWN0aW9uLnByb3RvdHlwZSApO1xuICAgIEtleWVkQ29sbGVjdGlvbi5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBLZXllZENvbGxlY3Rpb247XG5cbiAgICByZXR1cm4gS2V5ZWRDb2xsZWN0aW9uO1xuICB9KENvbGxlY3Rpb24pKTtcblxuICB2YXIgSW5kZXhlZENvbGxlY3Rpb24gPSAvKkBfX1BVUkVfXyovKGZ1bmN0aW9uIChDb2xsZWN0aW9uKSB7XG4gICAgZnVuY3Rpb24gSW5kZXhlZENvbGxlY3Rpb24odmFsdWUpIHtcbiAgICAgIHJldHVybiBpc0luZGV4ZWQodmFsdWUpID8gdmFsdWUgOiBJbmRleGVkU2VxKHZhbHVlKTtcbiAgICB9XG5cbiAgICBpZiAoIENvbGxlY3Rpb24gKSBJbmRleGVkQ29sbGVjdGlvbi5fX3Byb3RvX18gPSBDb2xsZWN0aW9uO1xuICAgIEluZGV4ZWRDb2xsZWN0aW9uLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIENvbGxlY3Rpb24gJiYgQ29sbGVjdGlvbi5wcm90b3R5cGUgKTtcbiAgICBJbmRleGVkQ29sbGVjdGlvbi5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBJbmRleGVkQ29sbGVjdGlvbjtcblxuICAgIHJldHVybiBJbmRleGVkQ29sbGVjdGlvbjtcbiAgfShDb2xsZWN0aW9uKSk7XG5cbiAgdmFyIFNldENvbGxlY3Rpb24gPSAvKkBfX1BVUkVfXyovKGZ1bmN0aW9uIChDb2xsZWN0aW9uKSB7XG4gICAgZnVuY3Rpb24gU2V0Q29sbGVjdGlvbih2YWx1ZSkge1xuICAgICAgcmV0dXJuIGlzQ29sbGVjdGlvbih2YWx1ZSkgJiYgIWlzQXNzb2NpYXRpdmUodmFsdWUpID8gdmFsdWUgOiBTZXRTZXEodmFsdWUpO1xuICAgIH1cblxuICAgIGlmICggQ29sbGVjdGlvbiApIFNldENvbGxlY3Rpb24uX19wcm90b19fID0gQ29sbGVjdGlvbjtcbiAgICBTZXRDb2xsZWN0aW9uLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIENvbGxlY3Rpb24gJiYgQ29sbGVjdGlvbi5wcm90b3R5cGUgKTtcbiAgICBTZXRDb2xsZWN0aW9uLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFNldENvbGxlY3Rpb247XG5cbiAgICByZXR1cm4gU2V0Q29sbGVjdGlvbjtcbiAgfShDb2xsZWN0aW9uKSk7XG5cbiAgQ29sbGVjdGlvbi5LZXllZCA9IEtleWVkQ29sbGVjdGlvbjtcbiAgQ29sbGVjdGlvbi5JbmRleGVkID0gSW5kZXhlZENvbGxlY3Rpb247XG4gIENvbGxlY3Rpb24uU2V0ID0gU2V0Q29sbGVjdGlvbjtcblxuICB2YXIgSVNfU0VRX1NZTUJPTCA9ICdAQF9fSU1NVVRBQkxFX1NFUV9fQEAnO1xuXG4gIGZ1bmN0aW9uIGlzU2VxKG1heWJlU2VxKSB7XG4gICAgcmV0dXJuIEJvb2xlYW4obWF5YmVTZXEgJiYgbWF5YmVTZXFbSVNfU0VRX1NZTUJPTF0pO1xuICB9XG5cbiAgdmFyIElTX1JFQ09SRF9TWU1CT0wgPSAnQEBfX0lNTVVUQUJMRV9SRUNPUkRfX0BAJztcblxuICBmdW5jdGlvbiBpc1JlY29yZChtYXliZVJlY29yZCkge1xuICAgIHJldHVybiBCb29sZWFuKG1heWJlUmVjb3JkICYmIG1heWJlUmVjb3JkW0lTX1JFQ09SRF9TWU1CT0xdKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGlzSW1tdXRhYmxlKG1heWJlSW1tdXRhYmxlKSB7XG4gICAgcmV0dXJuIGlzQ29sbGVjdGlvbihtYXliZUltbXV0YWJsZSkgfHwgaXNSZWNvcmQobWF5YmVJbW11dGFibGUpO1xuICB9XG5cbiAgdmFyIElTX09SREVSRURfU1lNQk9MID0gJ0BAX19JTU1VVEFCTEVfT1JERVJFRF9fQEAnO1xuXG4gIGZ1bmN0aW9uIGlzT3JkZXJlZChtYXliZU9yZGVyZWQpIHtcbiAgICByZXR1cm4gQm9vbGVhbihtYXliZU9yZGVyZWQgJiYgbWF5YmVPcmRlcmVkW0lTX09SREVSRURfU1lNQk9MXSk7XG4gIH1cblxuICB2YXIgSVRFUkFURV9LRVlTID0gMDtcbiAgdmFyIElURVJBVEVfVkFMVUVTID0gMTtcbiAgdmFyIElURVJBVEVfRU5UUklFUyA9IDI7XG5cbiAgdmFyIFJFQUxfSVRFUkFUT1JfU1lNQk9MID0gdHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiBTeW1ib2wuaXRlcmF0b3I7XG4gIHZhciBGQVVYX0lURVJBVE9SX1NZTUJPTCA9ICdAQGl0ZXJhdG9yJztcblxuICB2YXIgSVRFUkFUT1JfU1lNQk9MID0gUkVBTF9JVEVSQVRPUl9TWU1CT0wgfHwgRkFVWF9JVEVSQVRPUl9TWU1CT0w7XG5cbiAgdmFyIEl0ZXJhdG9yID0gZnVuY3Rpb24gSXRlcmF0b3IobmV4dCkge1xuICAgIHRoaXMubmV4dCA9IG5leHQ7XG4gIH07XG5cbiAgSXRlcmF0b3IucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcgKCkge1xuICAgIHJldHVybiAnW0l0ZXJhdG9yXSc7XG4gIH07XG5cbiAgSXRlcmF0b3IuS0VZUyA9IElURVJBVEVfS0VZUztcbiAgSXRlcmF0b3IuVkFMVUVTID0gSVRFUkFURV9WQUxVRVM7XG4gIEl0ZXJhdG9yLkVOVFJJRVMgPSBJVEVSQVRFX0VOVFJJRVM7XG5cbiAgSXRlcmF0b3IucHJvdG90eXBlLmluc3BlY3QgPSBJdGVyYXRvci5wcm90b3R5cGUudG9Tb3VyY2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMudG9TdHJpbmcoKTtcbiAgfTtcbiAgSXRlcmF0b3IucHJvdG90eXBlW0lURVJBVE9SX1NZTUJPTF0gPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgZnVuY3Rpb24gaXRlcmF0b3JWYWx1ZSh0eXBlLCBrLCB2LCBpdGVyYXRvclJlc3VsdCkge1xuICAgIHZhciB2YWx1ZSA9IHR5cGUgPT09IDAgPyBrIDogdHlwZSA9PT0gMSA/IHYgOiBbaywgdl07XG4gICAgaXRlcmF0b3JSZXN1bHRcbiAgICAgID8gKGl0ZXJhdG9yUmVzdWx0LnZhbHVlID0gdmFsdWUpXG4gICAgICA6IChpdGVyYXRvclJlc3VsdCA9IHtcbiAgICAgICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICAgICAgZG9uZTogZmFsc2UsXG4gICAgICAgIH0pO1xuICAgIHJldHVybiBpdGVyYXRvclJlc3VsdDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGl0ZXJhdG9yRG9uZSgpIHtcbiAgICByZXR1cm4geyB2YWx1ZTogdW5kZWZpbmVkLCBkb25lOiB0cnVlIH07XG4gIH1cblxuICBmdW5jdGlvbiBoYXNJdGVyYXRvcihtYXliZUl0ZXJhYmxlKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkobWF5YmVJdGVyYWJsZSkpIHtcbiAgICAgIC8vIElFMTEgdHJpY2sgYXMgaXQgZG9lcyBub3Qgc3VwcG9ydCBgU3ltYm9sLml0ZXJhdG9yYFxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuICEhZ2V0SXRlcmF0b3JGbihtYXliZUl0ZXJhYmxlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGlzSXRlcmF0b3IobWF5YmVJdGVyYXRvcikge1xuICAgIHJldHVybiBtYXliZUl0ZXJhdG9yICYmIHR5cGVvZiBtYXliZUl0ZXJhdG9yLm5leHQgPT09ICdmdW5jdGlvbic7XG4gIH1cblxuICBmdW5jdGlvbiBnZXRJdGVyYXRvcihpdGVyYWJsZSkge1xuICAgIHZhciBpdGVyYXRvckZuID0gZ2V0SXRlcmF0b3JGbihpdGVyYWJsZSk7XG4gICAgcmV0dXJuIGl0ZXJhdG9yRm4gJiYgaXRlcmF0b3JGbi5jYWxsKGl0ZXJhYmxlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldEl0ZXJhdG9yRm4oaXRlcmFibGUpIHtcbiAgICB2YXIgaXRlcmF0b3JGbiA9XG4gICAgICBpdGVyYWJsZSAmJlxuICAgICAgKChSRUFMX0lURVJBVE9SX1NZTUJPTCAmJiBpdGVyYWJsZVtSRUFMX0lURVJBVE9SX1NZTUJPTF0pIHx8XG4gICAgICAgIGl0ZXJhYmxlW0ZBVVhfSVRFUkFUT1JfU1lNQk9MXSk7XG4gICAgaWYgKHR5cGVvZiBpdGVyYXRvckZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gaXRlcmF0b3JGbjtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBpc0VudHJpZXNJdGVyYWJsZShtYXliZUl0ZXJhYmxlKSB7XG4gICAgdmFyIGl0ZXJhdG9yRm4gPSBnZXRJdGVyYXRvckZuKG1heWJlSXRlcmFibGUpO1xuICAgIHJldHVybiBpdGVyYXRvckZuICYmIGl0ZXJhdG9yRm4gPT09IG1heWJlSXRlcmFibGUuZW50cmllcztcbiAgfVxuXG4gIGZ1bmN0aW9uIGlzS2V5c0l0ZXJhYmxlKG1heWJlSXRlcmFibGUpIHtcbiAgICB2YXIgaXRlcmF0b3JGbiA9IGdldEl0ZXJhdG9yRm4obWF5YmVJdGVyYWJsZSk7XG4gICAgcmV0dXJuIGl0ZXJhdG9yRm4gJiYgaXRlcmF0b3JGbiA9PT0gbWF5YmVJdGVyYWJsZS5rZXlzO1xuICB9XG5cbiAgdmFyIGhhc093blByb3BlcnR5ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcblxuICBmdW5jdGlvbiBpc0FycmF5TGlrZSh2YWx1ZSkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSB8fCB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gKFxuICAgICAgdmFsdWUgJiZcbiAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiZcbiAgICAgIE51bWJlci5pc0ludGVnZXIodmFsdWUubGVuZ3RoKSAmJlxuICAgICAgdmFsdWUubGVuZ3RoID49IDAgJiZcbiAgICAgICh2YWx1ZS5sZW5ndGggPT09IDBcbiAgICAgICAgPyAvLyBPbmx5IHtsZW5ndGg6IDB9IGlzIGNvbnNpZGVyZWQgQXJyYXktbGlrZS5cbiAgICAgICAgICBPYmplY3Qua2V5cyh2YWx1ZSkubGVuZ3RoID09PSAxXG4gICAgICAgIDogLy8gQW4gb2JqZWN0IGlzIG9ubHkgQXJyYXktbGlrZSBpZiBpdCBoYXMgYSBwcm9wZXJ0eSB3aGVyZSB0aGUgbGFzdCB2YWx1ZVxuICAgICAgICAgIC8vIGluIHRoZSBhcnJheS1saWtlIG1heSBiZSBmb3VuZCAod2hpY2ggY291bGQgYmUgdW5kZWZpbmVkKS5cbiAgICAgICAgICB2YWx1ZS5oYXNPd25Qcm9wZXJ0eSh2YWx1ZS5sZW5ndGggLSAxKSlcbiAgICApO1xuICB9XG5cbiAgdmFyIFNlcSA9IC8qQF9fUFVSRV9fKi8oZnVuY3Rpb24gKENvbGxlY3Rpb24pIHtcbiAgICBmdW5jdGlvbiBTZXEodmFsdWUpIHtcbiAgICAgIHJldHVybiB2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSBudWxsXG4gICAgICAgID8gZW1wdHlTZXF1ZW5jZSgpXG4gICAgICAgIDogaXNJbW11dGFibGUodmFsdWUpXG4gICAgICAgID8gdmFsdWUudG9TZXEoKVxuICAgICAgICA6IHNlcUZyb21WYWx1ZSh2YWx1ZSk7XG4gICAgfVxuXG4gICAgaWYgKCBDb2xsZWN0aW9uICkgU2VxLl9fcHJvdG9fXyA9IENvbGxlY3Rpb247XG4gICAgU2VxLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIENvbGxlY3Rpb24gJiYgQ29sbGVjdGlvbi5wcm90b3R5cGUgKTtcbiAgICBTZXEucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gU2VxO1xuXG4gICAgU2VxLnByb3RvdHlwZS50b1NlcSA9IGZ1bmN0aW9uIHRvU2VxICgpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG5cbiAgICBTZXEucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcgKCkge1xuICAgICAgcmV0dXJuIHRoaXMuX190b1N0cmluZygnU2VxIHsnLCAnfScpO1xuICAgIH07XG5cbiAgICBTZXEucHJvdG90eXBlLmNhY2hlUmVzdWx0ID0gZnVuY3Rpb24gY2FjaGVSZXN1bHQgKCkge1xuICAgICAgaWYgKCF0aGlzLl9jYWNoZSAmJiB0aGlzLl9faXRlcmF0ZVVuY2FjaGVkKSB7XG4gICAgICAgIHRoaXMuX2NhY2hlID0gdGhpcy5lbnRyeVNlcSgpLnRvQXJyYXkoKTtcbiAgICAgICAgdGhpcy5zaXplID0gdGhpcy5fY2FjaGUubGVuZ3RoO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuICAgIC8vIGFic3RyYWN0IF9faXRlcmF0ZVVuY2FjaGVkKGZuLCByZXZlcnNlKVxuXG4gICAgU2VxLnByb3RvdHlwZS5fX2l0ZXJhdGUgPSBmdW5jdGlvbiBfX2l0ZXJhdGUgKGZuLCByZXZlcnNlKSB7XG4gICAgICB2YXIgY2FjaGUgPSB0aGlzLl9jYWNoZTtcbiAgICAgIGlmIChjYWNoZSkge1xuICAgICAgICB2YXIgc2l6ZSA9IGNhY2hlLmxlbmd0aDtcbiAgICAgICAgdmFyIGkgPSAwO1xuICAgICAgICB3aGlsZSAoaSAhPT0gc2l6ZSkge1xuICAgICAgICAgIHZhciBlbnRyeSA9IGNhY2hlW3JldmVyc2UgPyBzaXplIC0gKytpIDogaSsrXTtcbiAgICAgICAgICBpZiAoZm4oZW50cnlbMV0sIGVudHJ5WzBdLCB0aGlzKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLl9faXRlcmF0ZVVuY2FjaGVkKGZuLCByZXZlcnNlKTtcbiAgICB9O1xuXG4gICAgLy8gYWJzdHJhY3QgX19pdGVyYXRvclVuY2FjaGVkKHR5cGUsIHJldmVyc2UpXG5cbiAgICBTZXEucHJvdG90eXBlLl9faXRlcmF0b3IgPSBmdW5jdGlvbiBfX2l0ZXJhdG9yICh0eXBlLCByZXZlcnNlKSB7XG4gICAgICB2YXIgY2FjaGUgPSB0aGlzLl9jYWNoZTtcbiAgICAgIGlmIChjYWNoZSkge1xuICAgICAgICB2YXIgc2l6ZSA9IGNhY2hlLmxlbmd0aDtcbiAgICAgICAgdmFyIGkgPSAwO1xuICAgICAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpZiAoaSA9PT0gc2l6ZSkge1xuICAgICAgICAgICAgcmV0dXJuIGl0ZXJhdG9yRG9uZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB2YXIgZW50cnkgPSBjYWNoZVtyZXZlcnNlID8gc2l6ZSAtICsraSA6IGkrK107XG4gICAgICAgICAgcmV0dXJuIGl0ZXJhdG9yVmFsdWUodHlwZSwgZW50cnlbMF0sIGVudHJ5WzFdKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5fX2l0ZXJhdG9yVW5jYWNoZWQodHlwZSwgcmV2ZXJzZSk7XG4gICAgfTtcblxuICAgIHJldHVybiBTZXE7XG4gIH0oQ29sbGVjdGlvbikpO1xuXG4gIHZhciBLZXllZFNlcSA9IC8qQF9fUFVSRV9fKi8oZnVuY3Rpb24gKFNlcSkge1xuICAgIGZ1bmN0aW9uIEtleWVkU2VxKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gbnVsbFxuICAgICAgICA/IGVtcHR5U2VxdWVuY2UoKS50b0tleWVkU2VxKClcbiAgICAgICAgOiBpc0NvbGxlY3Rpb24odmFsdWUpXG4gICAgICAgID8gaXNLZXllZCh2YWx1ZSlcbiAgICAgICAgICA/IHZhbHVlLnRvU2VxKClcbiAgICAgICAgICA6IHZhbHVlLmZyb21FbnRyeVNlcSgpXG4gICAgICAgIDogaXNSZWNvcmQodmFsdWUpXG4gICAgICAgID8gdmFsdWUudG9TZXEoKVxuICAgICAgICA6IGtleWVkU2VxRnJvbVZhbHVlKHZhbHVlKTtcbiAgICB9XG5cbiAgICBpZiAoIFNlcSApIEtleWVkU2VxLl9fcHJvdG9fXyA9IFNlcTtcbiAgICBLZXllZFNlcS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBTZXEgJiYgU2VxLnByb3RvdHlwZSApO1xuICAgIEtleWVkU2VxLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEtleWVkU2VxO1xuXG4gICAgS2V5ZWRTZXEucHJvdG90eXBlLnRvS2V5ZWRTZXEgPSBmdW5jdGlvbiB0b0tleWVkU2VxICgpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG5cbiAgICByZXR1cm4gS2V5ZWRTZXE7XG4gIH0oU2VxKSk7XG5cbiAgdmFyIEluZGV4ZWRTZXEgPSAvKkBfX1BVUkVfXyovKGZ1bmN0aW9uIChTZXEpIHtcbiAgICBmdW5jdGlvbiBJbmRleGVkU2VxKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gbnVsbFxuICAgICAgICA/IGVtcHR5U2VxdWVuY2UoKVxuICAgICAgICA6IGlzQ29sbGVjdGlvbih2YWx1ZSlcbiAgICAgICAgPyBpc0tleWVkKHZhbHVlKVxuICAgICAgICAgID8gdmFsdWUuZW50cnlTZXEoKVxuICAgICAgICAgIDogdmFsdWUudG9JbmRleGVkU2VxKClcbiAgICAgICAgOiBpc1JlY29yZCh2YWx1ZSlcbiAgICAgICAgPyB2YWx1ZS50b1NlcSgpLmVudHJ5U2VxKClcbiAgICAgICAgOiBpbmRleGVkU2VxRnJvbVZhbHVlKHZhbHVlKTtcbiAgICB9XG5cbiAgICBpZiAoIFNlcSApIEluZGV4ZWRTZXEuX19wcm90b19fID0gU2VxO1xuICAgIEluZGV4ZWRTZXEucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggU2VxICYmIFNlcS5wcm90b3R5cGUgKTtcbiAgICBJbmRleGVkU2VxLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEluZGV4ZWRTZXE7XG5cbiAgICBJbmRleGVkU2VxLm9mID0gZnVuY3Rpb24gb2YgKC8qLi4udmFsdWVzKi8pIHtcbiAgICAgIHJldHVybiBJbmRleGVkU2VxKGFyZ3VtZW50cyk7XG4gICAgfTtcblxuICAgIEluZGV4ZWRTZXEucHJvdG90eXBlLnRvSW5kZXhlZFNlcSA9IGZ1bmN0aW9uIHRvSW5kZXhlZFNlcSAoKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG4gICAgSW5kZXhlZFNlcS5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZyAoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fX3RvU3RyaW5nKCdTZXEgWycsICddJyk7XG4gICAgfTtcblxuICAgIHJldHVybiBJbmRleGVkU2VxO1xuICB9KFNlcSkpO1xuXG4gIHZhciBTZXRTZXEgPSAvKkBfX1BVUkVfXyovKGZ1bmN0aW9uIChTZXEpIHtcbiAgICBmdW5jdGlvbiBTZXRTZXEodmFsdWUpIHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIGlzQ29sbGVjdGlvbih2YWx1ZSkgJiYgIWlzQXNzb2NpYXRpdmUodmFsdWUpID8gdmFsdWUgOiBJbmRleGVkU2VxKHZhbHVlKVxuICAgICAgKS50b1NldFNlcSgpO1xuICAgIH1cblxuICAgIGlmICggU2VxICkgU2V0U2VxLl9fcHJvdG9fXyA9IFNlcTtcbiAgICBTZXRTZXEucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggU2VxICYmIFNlcS5wcm90b3R5cGUgKTtcbiAgICBTZXRTZXEucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gU2V0U2VxO1xuXG4gICAgU2V0U2VxLm9mID0gZnVuY3Rpb24gb2YgKC8qLi4udmFsdWVzKi8pIHtcbiAgICAgIHJldHVybiBTZXRTZXEoYXJndW1lbnRzKTtcbiAgICB9O1xuXG4gICAgU2V0U2VxLnByb3RvdHlwZS50b1NldFNlcSA9IGZ1bmN0aW9uIHRvU2V0U2VxICgpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG5cbiAgICByZXR1cm4gU2V0U2VxO1xuICB9KFNlcSkpO1xuXG4gIFNlcS5pc1NlcSA9IGlzU2VxO1xuICBTZXEuS2V5ZWQgPSBLZXllZFNlcTtcbiAgU2VxLlNldCA9IFNldFNlcTtcbiAgU2VxLkluZGV4ZWQgPSBJbmRleGVkU2VxO1xuXG4gIFNlcS5wcm90b3R5cGVbSVNfU0VRX1NZTUJPTF0gPSB0cnVlO1xuXG4gIC8vICNwcmFnbWEgUm9vdCBTZXF1ZW5jZXNcblxuICB2YXIgQXJyYXlTZXEgPSAvKkBfX1BVUkVfXyovKGZ1bmN0aW9uIChJbmRleGVkU2VxKSB7XG4gICAgZnVuY3Rpb24gQXJyYXlTZXEoYXJyYXkpIHtcbiAgICAgIHRoaXMuX2FycmF5ID0gYXJyYXk7XG4gICAgICB0aGlzLnNpemUgPSBhcnJheS5sZW5ndGg7XG4gICAgfVxuXG4gICAgaWYgKCBJbmRleGVkU2VxICkgQXJyYXlTZXEuX19wcm90b19fID0gSW5kZXhlZFNlcTtcbiAgICBBcnJheVNlcS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBJbmRleGVkU2VxICYmIEluZGV4ZWRTZXEucHJvdG90eXBlICk7XG4gICAgQXJyYXlTZXEucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQXJyYXlTZXE7XG5cbiAgICBBcnJheVNlcS5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gZ2V0IChpbmRleCwgbm90U2V0VmFsdWUpIHtcbiAgICAgIHJldHVybiB0aGlzLmhhcyhpbmRleCkgPyB0aGlzLl9hcnJheVt3cmFwSW5kZXgodGhpcywgaW5kZXgpXSA6IG5vdFNldFZhbHVlO1xuICAgIH07XG5cbiAgICBBcnJheVNlcS5wcm90b3R5cGUuX19pdGVyYXRlID0gZnVuY3Rpb24gX19pdGVyYXRlIChmbiwgcmV2ZXJzZSkge1xuICAgICAgdmFyIGFycmF5ID0gdGhpcy5fYXJyYXk7XG4gICAgICB2YXIgc2l6ZSA9IGFycmF5Lmxlbmd0aDtcbiAgICAgIHZhciBpID0gMDtcbiAgICAgIHdoaWxlIChpICE9PSBzaXplKSB7XG4gICAgICAgIHZhciBpaSA9IHJldmVyc2UgPyBzaXplIC0gKytpIDogaSsrO1xuICAgICAgICBpZiAoZm4oYXJyYXlbaWldLCBpaSwgdGhpcykgPT09IGZhbHNlKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBpO1xuICAgIH07XG5cbiAgICBBcnJheVNlcS5wcm90b3R5cGUuX19pdGVyYXRvciA9IGZ1bmN0aW9uIF9faXRlcmF0b3IgKHR5cGUsIHJldmVyc2UpIHtcbiAgICAgIHZhciBhcnJheSA9IHRoaXMuX2FycmF5O1xuICAgICAgdmFyIHNpemUgPSBhcnJheS5sZW5ndGg7XG4gICAgICB2YXIgaSA9IDA7XG4gICAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKGkgPT09IHNpemUpIHtcbiAgICAgICAgICByZXR1cm4gaXRlcmF0b3JEb25lKCk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGlpID0gcmV2ZXJzZSA/IHNpemUgLSArK2kgOiBpKys7XG4gICAgICAgIHJldHVybiBpdGVyYXRvclZhbHVlKHR5cGUsIGlpLCBhcnJheVtpaV0pO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIHJldHVybiBBcnJheVNlcTtcbiAgfShJbmRleGVkU2VxKSk7XG5cbiAgdmFyIE9iamVjdFNlcSA9IC8qQF9fUFVSRV9fKi8oZnVuY3Rpb24gKEtleWVkU2VxKSB7XG4gICAgZnVuY3Rpb24gT2JqZWN0U2VxKG9iamVjdCkge1xuICAgICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmplY3QpLmNvbmNhdChcbiAgICAgICAgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMob2JqZWN0KSA6IFtdXG4gICAgICApO1xuICAgICAgdGhpcy5fb2JqZWN0ID0gb2JqZWN0O1xuICAgICAgdGhpcy5fa2V5cyA9IGtleXM7XG4gICAgICB0aGlzLnNpemUgPSBrZXlzLmxlbmd0aDtcbiAgICB9XG5cbiAgICBpZiAoIEtleWVkU2VxICkgT2JqZWN0U2VxLl9fcHJvdG9fXyA9IEtleWVkU2VxO1xuICAgIE9iamVjdFNlcS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBLZXllZFNlcSAmJiBLZXllZFNlcS5wcm90b3R5cGUgKTtcbiAgICBPYmplY3RTZXEucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gT2JqZWN0U2VxO1xuXG4gICAgT2JqZWN0U2VxLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiBnZXQgKGtleSwgbm90U2V0VmFsdWUpIHtcbiAgICAgIGlmIChub3RTZXRWYWx1ZSAhPT0gdW5kZWZpbmVkICYmICF0aGlzLmhhcyhrZXkpKSB7XG4gICAgICAgIHJldHVybiBub3RTZXRWYWx1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLl9vYmplY3Rba2V5XTtcbiAgICB9O1xuXG4gICAgT2JqZWN0U2VxLnByb3RvdHlwZS5oYXMgPSBmdW5jdGlvbiBoYXMgKGtleSkge1xuICAgICAgcmV0dXJuIGhhc093blByb3BlcnR5LmNhbGwodGhpcy5fb2JqZWN0LCBrZXkpO1xuICAgIH07XG5cbiAgICBPYmplY3RTZXEucHJvdG90eXBlLl9faXRlcmF0ZSA9IGZ1bmN0aW9uIF9faXRlcmF0ZSAoZm4sIHJldmVyc2UpIHtcbiAgICAgIHZhciBvYmplY3QgPSB0aGlzLl9vYmplY3Q7XG4gICAgICB2YXIga2V5cyA9IHRoaXMuX2tleXM7XG4gICAgICB2YXIgc2l6ZSA9IGtleXMubGVuZ3RoO1xuICAgICAgdmFyIGkgPSAwO1xuICAgICAgd2hpbGUgKGkgIT09IHNpemUpIHtcbiAgICAgICAgdmFyIGtleSA9IGtleXNbcmV2ZXJzZSA/IHNpemUgLSArK2kgOiBpKytdO1xuICAgICAgICBpZiAoZm4ob2JqZWN0W2tleV0sIGtleSwgdGhpcykgPT09IGZhbHNlKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBpO1xuICAgIH07XG5cbiAgICBPYmplY3RTZXEucHJvdG90eXBlLl9faXRlcmF0b3IgPSBmdW5jdGlvbiBfX2l0ZXJhdG9yICh0eXBlLCByZXZlcnNlKSB7XG4gICAgICB2YXIgb2JqZWN0ID0gdGhpcy5fb2JqZWN0O1xuICAgICAgdmFyIGtleXMgPSB0aGlzLl9rZXlzO1xuICAgICAgdmFyIHNpemUgPSBrZXlzLmxlbmd0aDtcbiAgICAgIHZhciBpID0gMDtcbiAgICAgIHJldHVybiBuZXcgSXRlcmF0b3IoZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoaSA9PT0gc2l6ZSkge1xuICAgICAgICAgIHJldHVybiBpdGVyYXRvckRvbmUoKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIga2V5ID0ga2V5c1tyZXZlcnNlID8gc2l6ZSAtICsraSA6IGkrK107XG4gICAgICAgIHJldHVybiBpdGVyYXRvclZhbHVlKHR5cGUsIGtleSwgb2JqZWN0W2tleV0pO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIHJldHVybiBPYmplY3RTZXE7XG4gIH0oS2V5ZWRTZXEpKTtcbiAgT2JqZWN0U2VxLnByb3RvdHlwZVtJU19PUkRFUkVEX1NZTUJPTF0gPSB0cnVlO1xuXG4gIHZhciBDb2xsZWN0aW9uU2VxID0gLypAX19QVVJFX18qLyhmdW5jdGlvbiAoSW5kZXhlZFNlcSkge1xuICAgIGZ1bmN0aW9uIENvbGxlY3Rpb25TZXEoY29sbGVjdGlvbikge1xuICAgICAgdGhpcy5fY29sbGVjdGlvbiA9IGNvbGxlY3Rpb247XG4gICAgICB0aGlzLnNpemUgPSBjb2xsZWN0aW9uLmxlbmd0aCB8fCBjb2xsZWN0aW9uLnNpemU7XG4gICAgfVxuXG4gICAgaWYgKCBJbmRleGVkU2VxICkgQ29sbGVjdGlvblNlcS5fX3Byb3RvX18gPSBJbmRleGVkU2VxO1xuICAgIENvbGxlY3Rpb25TZXEucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggSW5kZXhlZFNlcSAmJiBJbmRleGVkU2VxLnByb3RvdHlwZSApO1xuICAgIENvbGxlY3Rpb25TZXEucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQ29sbGVjdGlvblNlcTtcblxuICAgIENvbGxlY3Rpb25TZXEucHJvdG90eXBlLl9faXRlcmF0ZVVuY2FjaGVkID0gZnVuY3Rpb24gX19pdGVyYXRlVW5jYWNoZWQgKGZuLCByZXZlcnNlKSB7XG4gICAgICBpZiAocmV2ZXJzZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5jYWNoZVJlc3VsdCgpLl9faXRlcmF0ZShmbiwgcmV2ZXJzZSk7XG4gICAgICB9XG4gICAgICB2YXIgY29sbGVjdGlvbiA9IHRoaXMuX2NvbGxlY3Rpb247XG4gICAgICB2YXIgaXRlcmF0b3IgPSBnZXRJdGVyYXRvcihjb2xsZWN0aW9uKTtcbiAgICAgIHZhciBpdGVyYXRpb25zID0gMDtcbiAgICAgIGlmIChpc0l0ZXJhdG9yKGl0ZXJhdG9yKSkge1xuICAgICAgICB2YXIgc3RlcDtcbiAgICAgICAgd2hpbGUgKCEoc3RlcCA9IGl0ZXJhdG9yLm5leHQoKSkuZG9uZSkge1xuICAgICAgICAgIGlmIChmbihzdGVwLnZhbHVlLCBpdGVyYXRpb25zKyssIHRoaXMpID09PSBmYWxzZSkge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gaXRlcmF0aW9ucztcbiAgICB9O1xuXG4gICAgQ29sbGVjdGlvblNlcS5wcm90b3R5cGUuX19pdGVyYXRvclVuY2FjaGVkID0gZnVuY3Rpb24gX19pdGVyYXRvclVuY2FjaGVkICh0eXBlLCByZXZlcnNlKSB7XG4gICAgICBpZiAocmV2ZXJzZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5jYWNoZVJlc3VsdCgpLl9faXRlcmF0b3IodHlwZSwgcmV2ZXJzZSk7XG4gICAgICB9XG4gICAgICB2YXIgY29sbGVjdGlvbiA9IHRoaXMuX2NvbGxlY3Rpb247XG4gICAgICB2YXIgaXRlcmF0b3IgPSBnZXRJdGVyYXRvcihjb2xsZWN0aW9uKTtcbiAgICAgIGlmICghaXNJdGVyYXRvcihpdGVyYXRvcikpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBJdGVyYXRvcihpdGVyYXRvckRvbmUpO1xuICAgICAgfVxuICAgICAgdmFyIGl0ZXJhdGlvbnMgPSAwO1xuICAgICAgcmV0dXJuIG5ldyBJdGVyYXRvcihmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBzdGVwID0gaXRlcmF0b3IubmV4dCgpO1xuICAgICAgICByZXR1cm4gc3RlcC5kb25lID8gc3RlcCA6IGl0ZXJhdG9yVmFsdWUodHlwZSwgaXRlcmF0aW9ucysrLCBzdGVwLnZhbHVlKTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICByZXR1cm4gQ29sbGVjdGlvblNlcTtcbiAgfShJbmRleGVkU2VxKSk7XG5cbiAgLy8gIyBwcmFnbWEgSGVscGVyIGZ1bmN0aW9uc1xuXG4gIHZhciBFTVBUWV9TRVE7XG5cbiAgZnVuY3Rpb24gZW1wdHlTZXF1ZW5jZSgpIHtcbiAgICByZXR1cm4gRU1QVFlfU0VRIHx8IChFTVBUWV9TRVEgPSBuZXcgQXJyYXlTZXEoW10pKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGtleWVkU2VxRnJvbVZhbHVlKHZhbHVlKSB7XG4gICAgdmFyIHNlcSA9IG1heWJlSW5kZXhlZFNlcUZyb21WYWx1ZSh2YWx1ZSk7XG4gICAgaWYgKHNlcSkge1xuICAgICAgcmV0dXJuIHNlcS5mcm9tRW50cnlTZXEoKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIHJldHVybiBuZXcgT2JqZWN0U2VxKHZhbHVlKTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICdFeHBlY3RlZCBBcnJheSBvciBjb2xsZWN0aW9uIG9iamVjdCBvZiBbaywgdl0gZW50cmllcywgb3Iga2V5ZWQgb2JqZWN0OiAnICtcbiAgICAgICAgdmFsdWVcbiAgICApO1xuICB9XG5cbiAgZnVuY3Rpb24gaW5kZXhlZFNlcUZyb21WYWx1ZSh2YWx1ZSkge1xuICAgIHZhciBzZXEgPSBtYXliZUluZGV4ZWRTZXFGcm9tVmFsdWUodmFsdWUpO1xuICAgIGlmIChzZXEpIHtcbiAgICAgIHJldHVybiBzZXE7XG4gICAgfVxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAnRXhwZWN0ZWQgQXJyYXkgb3IgY29sbGVjdGlvbiBvYmplY3Qgb2YgdmFsdWVzOiAnICsgdmFsdWVcbiAgICApO1xuICB9XG5cbiAgZnVuY3Rpb24gc2VxRnJvbVZhbHVlKHZhbHVlKSB7XG4gICAgdmFyIHNlcSA9IG1heWJlSW5kZXhlZFNlcUZyb21WYWx1ZSh2YWx1ZSk7XG4gICAgaWYgKHNlcSkge1xuICAgICAgcmV0dXJuIGlzRW50cmllc0l0ZXJhYmxlKHZhbHVlKVxuICAgICAgICA/IHNlcS5mcm9tRW50cnlTZXEoKVxuICAgICAgICA6IGlzS2V5c0l0ZXJhYmxlKHZhbHVlKVxuICAgICAgICA/IHNlcS50b1NldFNlcSgpXG4gICAgICAgIDogc2VxO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jykge1xuICAgICAgcmV0dXJuIG5ldyBPYmplY3RTZXEodmFsdWUpO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgJ0V4cGVjdGVkIEFycmF5IG9yIGNvbGxlY3Rpb24gb2JqZWN0IG9mIHZhbHVlcywgb3Iga2V5ZWQgb2JqZWN0OiAnICsgdmFsdWVcbiAgICApO1xuICB9XG5cbiAgZnVuY3Rpb24gbWF5YmVJbmRleGVkU2VxRnJvbVZhbHVlKHZhbHVlKSB7XG4gICAgcmV0dXJuIGlzQXJyYXlMaWtlKHZhbHVlKVxuICAgICAgPyBuZXcgQXJyYXlTZXEodmFsdWUpXG4gICAgICA6IGhhc0l0ZXJhdG9yKHZhbHVlKVxuICAgICAgPyBuZXcgQ29sbGVjdGlvblNlcSh2YWx1ZSlcbiAgICAgIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgdmFyIElTX01BUF9TWU1CT0wgPSAnQEBfX0lNTVVUQUJMRV9NQVBfX0BAJztcblxuICBmdW5jdGlvbiBpc01hcChtYXliZU1hcCkge1xuICAgIHJldHVybiBCb29sZWFuKG1heWJlTWFwICYmIG1heWJlTWFwW0lTX01BUF9TWU1CT0xdKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGlzT3JkZXJlZE1hcChtYXliZU9yZGVyZWRNYXApIHtcbiAgICByZXR1cm4gaXNNYXAobWF5YmVPcmRlcmVkTWFwKSAmJiBpc09yZGVyZWQobWF5YmVPcmRlcmVkTWFwKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGlzVmFsdWVPYmplY3QobWF5YmVWYWx1ZSkge1xuICAgIHJldHVybiBCb29sZWFuKFxuICAgICAgbWF5YmVWYWx1ZSAmJlxuICAgICAgICB0eXBlb2YgbWF5YmVWYWx1ZS5lcXVhbHMgPT09ICdmdW5jdGlvbicgJiZcbiAgICAgICAgdHlwZW9mIG1heWJlVmFsdWUuaGFzaENvZGUgPT09ICdmdW5jdGlvbidcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEFuIGV4dGVuc2lvbiBvZiB0aGUgXCJzYW1lLXZhbHVlXCIgYWxnb3JpdGhtIGFzIFtkZXNjcmliZWQgZm9yIHVzZSBieSBFUzYgTWFwXG4gICAqIGFuZCBTZXRdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL01hcCNLZXlfZXF1YWxpdHkpXG4gICAqXG4gICAqIE5hTiBpcyBjb25zaWRlcmVkIHRoZSBzYW1lIGFzIE5hTiwgaG93ZXZlciAtMCBhbmQgMCBhcmUgY29uc2lkZXJlZCB0aGUgc2FtZVxuICAgKiB2YWx1ZSwgd2hpY2ggaXMgZGlmZmVyZW50IGZyb20gdGhlIGFsZ29yaXRobSBkZXNjcmliZWQgYnlcbiAgICogW2BPYmplY3QuaXNgXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9PYmplY3QvaXMpLlxuICAgKlxuICAgKiBUaGlzIGlzIGV4dGVuZGVkIGZ1cnRoZXIgdG8gYWxsb3cgT2JqZWN0cyB0byBkZXNjcmliZSB0aGUgdmFsdWVzIHRoZXlcbiAgICogcmVwcmVzZW50LCBieSB3YXkgb2YgYHZhbHVlT2ZgIG9yIGBlcXVhbHNgIChhbmQgYGhhc2hDb2RlYCkuXG4gICAqXG4gICAqIE5vdGU6IGJlY2F1c2Ugb2YgdGhpcyBleHRlbnNpb24sIHRoZSBrZXkgZXF1YWxpdHkgb2YgSW1tdXRhYmxlLk1hcCBhbmQgdGhlXG4gICAqIHZhbHVlIGVxdWFsaXR5IG9mIEltbXV0YWJsZS5TZXQgd2lsbCBkaWZmZXIgZnJvbSBFUzYgTWFwIGFuZCBTZXQuXG4gICAqXG4gICAqICMjIyBEZWZpbmluZyBjdXN0b20gdmFsdWVzXG4gICAqXG4gICAqIFRoZSBlYXNpZXN0IHdheSB0byBkZXNjcmliZSB0aGUgdmFsdWUgYW4gb2JqZWN0IHJlcHJlc2VudHMgaXMgYnkgaW1wbGVtZW50aW5nXG4gICAqIGB2YWx1ZU9mYC4gRm9yIGV4YW1wbGUsIGBEYXRlYCByZXByZXNlbnRzIGEgdmFsdWUgYnkgcmV0dXJuaW5nIGEgdW5peFxuICAgKiB0aW1lc3RhbXAgZm9yIGB2YWx1ZU9mYDpcbiAgICpcbiAgICogICAgIHZhciBkYXRlMSA9IG5ldyBEYXRlKDEyMzQ1Njc4OTAwMDApOyAvLyBGcmkgRmViIDEzIDIwMDkgLi4uXG4gICAqICAgICB2YXIgZGF0ZTIgPSBuZXcgRGF0ZSgxMjM0NTY3ODkwMDAwKTtcbiAgICogICAgIGRhdGUxLnZhbHVlT2YoKTsgLy8gMTIzNDU2Nzg5MDAwMFxuICAgKiAgICAgYXNzZXJ0KCBkYXRlMSAhPT0gZGF0ZTIgKTtcbiAgICogICAgIGFzc2VydCggSW1tdXRhYmxlLmlzKCBkYXRlMSwgZGF0ZTIgKSApO1xuICAgKlxuICAgKiBOb3RlOiBvdmVycmlkaW5nIGB2YWx1ZU9mYCBtYXkgaGF2ZSBvdGhlciBpbXBsaWNhdGlvbnMgaWYgeW91IHVzZSB0aGlzIG9iamVjdFxuICAgKiB3aGVyZSBKYXZhU2NyaXB0IGV4cGVjdHMgYSBwcmltaXRpdmUsIHN1Y2ggYXMgaW1wbGljaXQgc3RyaW5nIGNvZXJjaW9uLlxuICAgKlxuICAgKiBGb3IgbW9yZSBjb21wbGV4IHR5cGVzLCBlc3BlY2lhbGx5IGNvbGxlY3Rpb25zLCBpbXBsZW1lbnRpbmcgYHZhbHVlT2ZgIG1heVxuICAgKiBub3QgYmUgcGVyZm9ybWFudC4gQW4gYWx0ZXJuYXRpdmUgaXMgdG8gaW1wbGVtZW50IGBlcXVhbHNgIGFuZCBgaGFzaENvZGVgLlxuICAgKlxuICAgKiBgZXF1YWxzYCB0YWtlcyBhbm90aGVyIG9iamVjdCwgcHJlc3VtYWJseSBvZiBzaW1pbGFyIHR5cGUsIGFuZCByZXR1cm5zIHRydWVcbiAgICogaWYgaXQgaXMgZXF1YWwuIEVxdWFsaXR5IGlzIHN5bW1ldHJpY2FsLCBzbyB0aGUgc2FtZSByZXN1bHQgc2hvdWxkIGJlXG4gICAqIHJldHVybmVkIGlmIHRoaXMgYW5kIHRoZSBhcmd1bWVudCBhcmUgZmxpcHBlZC5cbiAgICpcbiAgICogICAgIGFzc2VydCggYS5lcXVhbHMoYikgPT09IGIuZXF1YWxzKGEpICk7XG4gICAqXG4gICAqIGBoYXNoQ29kZWAgcmV0dXJucyBhIDMyYml0IGludGVnZXIgbnVtYmVyIHJlcHJlc2VudGluZyB0aGUgb2JqZWN0IHdoaWNoIHdpbGxcbiAgICogYmUgdXNlZCB0byBkZXRlcm1pbmUgaG93IHRvIHN0b3JlIHRoZSB2YWx1ZSBvYmplY3QgaW4gYSBNYXAgb3IgU2V0LiBZb3UgbXVzdFxuICAgKiBwcm92aWRlIGJvdGggb3IgbmVpdGhlciBtZXRob2RzLCBvbmUgbXVzdCBub3QgZXhpc3Qgd2l0aG91dCB0aGUgb3RoZXIuXG4gICAqXG4gICAqIEFsc28sIGFuIGltcG9ydGFudCByZWxhdGlvbnNoaXAgYmV0d2VlbiB0aGVzZSBtZXRob2RzIG11c3QgYmUgdXBoZWxkOiBpZiB0d29cbiAgICogdmFsdWVzIGFyZSBlcXVhbCwgdGhleSAqbXVzdCogcmV0dXJuIHRoZSBzYW1lIGhhc2hDb2RlLiBJZiB0aGUgdmFsdWVzIGFyZSBub3RcbiAgICogZXF1YWwsIHRoZXkgbWlnaHQgaGF2ZSB0aGUgc2FtZSBoYXNoQ29kZTsgdGhpcyBpcyBjYWxsZWQgYSBoYXNoIGNvbGxpc2lvbixcbiAgICogYW5kIHdoaWxlIHVuZGVzaXJhYmxlIGZvciBwZXJmb3JtYW5jZSByZWFzb25zLCBpdCBpcyBhY2NlcHRhYmxlLlxuICAgKlxuICAgKiAgICAgaWYgKGEuZXF1YWxzKGIpKSB7XG4gICAqICAgICAgIGFzc2VydCggYS5oYXNoQ29kZSgpID09PSBiLmhhc2hDb2RlKCkgKTtcbiAgICogICAgIH1cbiAgICpcbiAgICogQWxsIEltbXV0YWJsZSBjb2xsZWN0aW9ucyBhcmUgVmFsdWUgT2JqZWN0czogdGhleSBpbXBsZW1lbnQgYGVxdWFscygpYFxuICAgKiBhbmQgYGhhc2hDb2RlKClgLlxuICAgKi9cbiAgZnVuY3Rpb24gaXModmFsdWVBLCB2YWx1ZUIpIHtcbiAgICBpZiAodmFsdWVBID09PSB2YWx1ZUIgfHwgKHZhbHVlQSAhPT0gdmFsdWVBICYmIHZhbHVlQiAhPT0gdmFsdWVCKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmICghdmFsdWVBIHx8ICF2YWx1ZUIpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgdHlwZW9mIHZhbHVlQS52YWx1ZU9mID09PSAnZnVuY3Rpb24nICYmXG4gICAgICB0eXBlb2YgdmFsdWVCLnZhbHVlT2YgPT09ICdmdW5jdGlvbidcbiAgICApIHtcbiAgICAgIHZhbHVlQSA9IHZhbHVlQS52YWx1ZU9mKCk7XG4gICAgICB2YWx1ZUIgPSB2YWx1ZUIudmFsdWVPZigpO1xuICAgICAgaWYgKHZhbHVlQSA9PT0gdmFsdWVCIHx8ICh2YWx1ZUEgIT09IHZhbHVlQSAmJiB2YWx1ZUIgIT09IHZhbHVlQikpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICBpZiAoIXZhbHVlQSB8fCAhdmFsdWVCKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuICEhKFxuICAgICAgaXNWYWx1ZU9iamVjdCh2YWx1ZUEpICYmXG4gICAgICBpc1ZhbHVlT2JqZWN0KHZhbHVlQikgJiZcbiAgICAgIHZhbHVlQS5lcXVhbHModmFsdWVCKVxuICAgICk7XG4gIH1cblxuICB2YXIgaW11bCA9XG4gICAgdHlwZW9mIE1hdGguaW11bCA9PT0gJ2Z1bmN0aW9uJyAmJiBNYXRoLmltdWwoMHhmZmZmZmZmZiwgMikgPT09IC0yXG4gICAgICA/IE1hdGguaW11bFxuICAgICAgOiBmdW5jdGlvbiBpbXVsKGEsIGIpIHtcbiAgICAgICAgICBhIHw9IDA7IC8vIGludFxuICAgICAgICAgIGIgfD0gMDsgLy8gaW50XG4gICAgICAgICAgdmFyIGMgPSBhICYgMHhmZmZmO1xuICAgICAgICAgIHZhciBkID0gYiAmIDB4ZmZmZjtcbiAgICAgICAgICAvLyBTaGlmdCBieSAwIGZpeGVzIHRoZSBzaWduIG9uIHRoZSBoaWdoIHBhcnQuXG4gICAgICAgICAgcmV0dXJuIChjICogZCArICgoKChhID4+PiAxNikgKiBkICsgYyAqIChiID4+PiAxNikpIDw8IDE2KSA+Pj4gMCkpIHwgMDsgLy8gaW50XG4gICAgICAgIH07XG5cbiAgLy8gdjggaGFzIGFuIG9wdGltaXphdGlvbiBmb3Igc3RvcmluZyAzMS1iaXQgc2lnbmVkIG51bWJlcnMuXG4gIC8vIFZhbHVlcyB3aGljaCBoYXZlIGVpdGhlciAwMCBvciAxMSBhcyB0aGUgaGlnaCBvcmRlciBiaXRzIHF1YWxpZnkuXG4gIC8vIFRoaXMgZnVuY3Rpb24gZHJvcHMgdGhlIGhpZ2hlc3Qgb3JkZXIgYml0IGluIGEgc2lnbmVkIG51bWJlciwgbWFpbnRhaW5pbmdcbiAgLy8gdGhlIHNpZ24gYml0LlxuICBmdW5jdGlvbiBzbWkoaTMyKSB7XG4gICAgcmV0dXJuICgoaTMyID4+PiAxKSAmIDB4NDAwMDAwMDApIHwgKGkzMiAmIDB4YmZmZmZmZmYpO1xuICB9XG5cbiAgdmFyIGRlZmF1bHRWYWx1ZU9mID0gT2JqZWN0LnByb3RvdHlwZS52YWx1ZU9mO1xuXG4gIGZ1bmN0aW9uIGhhc2gobykge1xuICAgIGlmIChvID09IG51bGwpIHtcbiAgICAgIHJldHVybiBoYXNoTnVsbGlzaChvKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG8uaGFzaENvZGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIC8vIERyb3AgYW55IGhpZ2ggYml0cyBmcm9tIGFjY2lkZW50YWxseSBsb25nIGhhc2ggY29kZXMuXG4gICAgICByZXR1cm4gc21pKG8uaGFzaENvZGUobykpO1xuICAgIH1cblxuICAgIHZhciB2ID0gdmFsdWVPZihvKTtcblxuICAgIGlmICh2ID09IG51bGwpIHtcbiAgICAgIHJldHVybiBoYXNoTnVsbGlzaCh2KTtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKHR5cGVvZiB2KSB7XG4gICAgICBjYXNlICdib29sZWFuJzpcbiAgICAgICAgLy8gVGhlIGhhc2ggdmFsdWVzIGZvciBidWlsdC1pbiBjb25zdGFudHMgYXJlIGEgMSB2YWx1ZSBmb3IgZWFjaCA1LWJ5dGVcbiAgICAgICAgLy8gc2hpZnQgcmVnaW9uIGV4cGVjdCBmb3IgdGhlIGZpcnN0LCB3aGljaCBlbmNvZGVzIHRoZSB2YWx1ZS4gVGhpc1xuICAgICAgICAvLyByZWR1Y2VzIHRoZSBvZGRzIG9mIGEgaGFzaCBjb2xsaXNpb24gZm9yIHRoZXNlIGNvbW1vbiB2YWx1ZXMuXG4gICAgICAgIHJldHVybiB2ID8gMHg0MjEwODQyMSA6IDB4NDIxMDg0MjA7XG4gICAgICBjYXNlICdudW1iZXInOlxuICAgICAgICByZXR1cm4gaGFzaE51bWJlcih2KTtcbiAgICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICAgIHJldHVybiB2Lmxlbmd0aCA+IFNUUklOR19IQVNIX0NBQ0hFX01JTl9TVFJMRU5cbiAgICAgICAgICA/IGNhY2hlZEhhc2hTdHJpbmcodilcbiAgICAgICAgICA6IGhhc2hTdHJpbmcodik7XG4gICAgICBjYXNlICdvYmplY3QnOlxuICAgICAgY2FzZSAnZnVuY3Rpb24nOlxuICAgICAgICByZXR1cm4gaGFzaEpTT2JqKHYpO1xuICAgICAgY2FzZSAnc3ltYm9sJzpcbiAgICAgICAgcmV0dXJuIGhhc2hTeW1ib2wodik7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpZiAodHlwZW9mIHYudG9TdHJpbmcgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICByZXR1cm4gaGFzaFN0cmluZyh2LnRvU3RyaW5nKCkpO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVmFsdWUgdHlwZSAnICsgdHlwZW9mIHYgKyAnIGNhbm5vdCBiZSBoYXNoZWQuJyk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gaGFzaE51bGxpc2gobnVsbGlzaCkge1xuICAgIHJldHVybiBudWxsaXNoID09PSBudWxsID8gMHg0MjEwODQyMiA6IC8qIHVuZGVmaW5lZCAqLyAweDQyMTA4NDIzO1xuICB9XG5cbiAgLy8gQ29tcHJlc3MgYXJiaXRyYXJpbHkgbGFyZ2UgbnVtYmVycyBpbnRvIHNtaSBoYXNoZXMuXG4gIGZ1bmN0aW9uIGhhc2hOdW1iZXIobikge1xuICAgIGlmIChuICE9PSBuIHx8IG4gPT09IEluZmluaXR5KSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgdmFyIGhhc2ggPSBuIHwgMDtcbiAgICBpZiAoaGFzaCAhPT0gbikge1xuICAgICAgaGFzaCBePSBuICogMHhmZmZmZmZmZjtcbiAgICB9XG4gICAgd2hpbGUgKG4gPiAweGZmZmZmZmZmKSB7XG4gICAgICBuIC89IDB4ZmZmZmZmZmY7XG4gICAgICBoYXNoIF49IG47XG4gICAgfVxuICAgIHJldHVybiBzbWkoaGFzaCk7XG4gIH1cblxuICBmdW5jdGlvbiBjYWNoZWRIYXNoU3RyaW5nKHN0cmluZykge1xuICAgIHZhciBoYXNoZWQgPSBzdHJpbmdIYXNoQ2FjaGVbc3RyaW5nXTtcbiAgICBpZiAoaGFzaGVkID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc2hlZCA9IGhhc2hTdHJpbmcoc3RyaW5nKTtcbiAgICAgIGlmIChTVFJJTkdfSEFTSF9DQUNIRV9TSVpFID09PSBTVFJJTkdfSEFTSF9DQUNIRV9NQVhfU0laRSkge1xuICAgICAgICBTVFJJTkdfSEFTSF9DQUNIRV9TSVpFID0gMDtcbiAgICAgICAgc3RyaW5nSGFzaENhY2hlID0ge307XG4gICAgICB9XG4gICAgICBTVFJJTkdfSEFTSF9DQUNIRV9TSVpFKys7XG4gICAgICBzdHJpbmdIYXNoQ2FjaGVbc3RyaW5nXSA9IGhhc2hlZDtcbiAgICB9XG4gICAgcmV0dXJuIGhhc2hlZDtcbiAgfVxuXG4gIC8vIGh0dHA6Ly9qc3BlcmYuY29tL2hhc2hpbmctc3RyaW5nc1xuICBmdW5jdGlvbiBoYXNoU3RyaW5nKHN0cmluZykge1xuICAgIC8vIFRoaXMgaXMgdGhlIGhhc2ggZnJvbSBKVk1cbiAgICAvLyBUaGUgaGFzaCBjb2RlIGZvciBhIHN0cmluZyBpcyBjb21wdXRlZCBhc1xuICAgIC8vIHNbMF0gKiAzMSBeIChuIC0gMSkgKyBzWzFdICogMzEgXiAobiAtIDIpICsgLi4uICsgc1tuIC0gMV0sXG4gICAgLy8gd2hlcmUgc1tpXSBpcyB0aGUgaXRoIGNoYXJhY3RlciBvZiB0aGUgc3RyaW5nIGFuZCBuIGlzIHRoZSBsZW5ndGggb2ZcbiAgICAvLyB0aGUgc3RyaW5nLiBXZSBcIm1vZFwiIHRoZSByZXN1bHQgdG8gbWFrZSBpdCBiZXR3ZWVuIDAgKGluY2x1c2l2ZSkgYW5kIDJeMzFcbiAgICAvLyAoZXhjbHVzaXZlKSBieSBkcm9wcGluZyBoaWdoIGJpdHMuXG4gICAgdmFyIGhhc2hlZCA9IDA7XG4gICAgZm9yICh2YXIgaWkgPSAwOyBpaSA8IHN0cmluZy5sZW5ndGg7IGlpKyspIHtcbiAgICAgIGhhc2hlZCA9ICgzMSAqIGhhc2hlZCArIHN0cmluZy5jaGFyQ29kZUF0KGlpKSkgfCAwO1xuICAgIH1cbiAgICByZXR1cm4gc21pKGhhc2hlZCk7XG4gIH1cblxuICBmdW5jdGlvbiBoYXNoU3ltYm9sKHN5bSkge1xuICAgIHZhciBoYXNoZWQgPSBzeW1ib2xNYXBbc3ltXTtcbiAgICBpZiAoaGFzaGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBoYXNoZWQ7XG4gICAgfVxuXG4gICAgaGFzaGVkID0gbmV4dEhhc2goKTtcblxuICAgIHN5bWJvbE1hcFtzeW1dID0gaGFzaGVkO1xuXG4gICAgcmV0dXJuIGhhc2hlZDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGhhc2hKU09iaihvYmopIHtcbiAgICB2YXIgaGFzaGVkO1xuICAgIGlmICh1c2luZ1dlYWtNYXApIHtcbiAgICAgIGhhc2hlZCA9IHdlYWtNYXAuZ2V0KG9iaik7XG4gICAgICBpZiAoaGFzaGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIGhhc2hlZDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBoYXNoZWQgPSBvYmpbVUlEX0hBU0hfS0VZXTtcbiAgICBpZiAoaGFzaGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBoYXNoZWQ7XG4gICAgfVxuXG4gICAgaWYgKCFjYW5EZWZpbmVQcm9wZXJ0eSkge1xuICAgICAgaGFzaGVkID0gb2JqLnByb3BlcnR5SXNFbnVtZXJhYmxlICYmIG9iai5wcm9wZXJ0eUlzRW51bWVyYWJsZVtVSURfSEFTSF9LRVldO1xuICAgICAgaWYgKGhhc2hlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBoYXNoZWQ7XG4gICAgICB9XG5cbiAgICAgIGhhc2hlZCA9IGdldElFTm9kZUhhc2gob2JqKTtcbiAgICAgIGlmIChoYXNoZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gaGFzaGVkO1xuICAgICAgfVxuICAgIH1cblxuICAgIGhhc2hlZCA9IG5leHRIYXNoKCk7XG5cbiAgICBpZiAodXNpbmdXZWFrTWFwKSB7XG4gICAgICB3ZWFrTWFwLnNldChvYmosIGhhc2hlZCk7XG4gICAgfSBlbHNlIGlmIChpc0V4dGVuc2libGUgIT09IHVuZGVmaW5lZCAmJiBpc0V4dGVuc2libGUob2JqKSA9PT0gZmFsc2UpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTm9uLWV4dGVuc2libGUgb2JqZWN0cyBhcmUgbm90IGFsbG93ZWQgYXMga2V5cy4nKTtcbiAgICB9IGVsc2UgaWYgKGNhbkRlZmluZVByb3BlcnR5KSB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBVSURfSEFTSF9LRVksIHtcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgdmFsdWU6IGhhc2hlZCxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICBvYmoucHJvcGVydHlJc0VudW1lcmFibGUgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgb2JqLnByb3BlcnR5SXNFbnVtZXJhYmxlID09PSBvYmouY29uc3RydWN0b3IucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlXG4gICAgKSB7XG4gICAgICAvLyBTaW5jZSB3ZSBjYW4ndCBkZWZpbmUgYSBub24tZW51bWVyYWJsZSBwcm9wZXJ0eSBvbiB0aGUgb2JqZWN0XG4gICAgICAvLyB3ZSdsbCBoaWphY2sgb25lIG9mIHRoZSBsZXNzLXVzZWQgbm9uLWVudW1lcmFibGUgcHJvcGVydGllcyB0b1xuICAgICAgLy8gc2F2ZSBvdXIgaGFzaCBvbiBpdC4gU2luY2UgdGhpcyBpcyBhIGZ1bmN0aW9uIGl0IHdpbGwgbm90IHNob3cgdXAgaW5cbiAgICAgIC8vIGBKU09OLnN0cmluZ2lmeWAgd2hpY2ggaXMgd2hhdCB3ZSB3YW50LlxuICAgICAgb2JqLnByb3BlcnR5SXNFbnVtZXJhYmxlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb25zdHJ1Y3Rvci5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuYXBwbHkoXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgICBhcmd1bWVudHNcbiAgICAgICAgKTtcbiAgICAgIH07XG4gICAgICBvYmoucHJvcGVydHlJc0VudW1lcmFibGVbVUlEX0hBU0hfS0VZXSA9IGhhc2hlZDtcbiAgICB9IGVsc2UgaWYgKG9iai5ub2RlVHlwZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBBdCB0aGlzIHBvaW50IHdlIGNvdWxkbid0IGdldCB0aGUgSUUgYHVuaXF1ZUlEYCB0byB1c2UgYXMgYSBoYXNoXG4gICAgICAvLyBhbmQgd2UgY291bGRuJ3QgdXNlIGEgbm9uLWVudW1lcmFibGUgcHJvcGVydHkgdG8gZXhwbG9pdCB0aGVcbiAgICAgIC8vIGRvbnRFbnVtIGJ1ZyBzbyB3ZSBzaW1wbHkgYWRkIHRoZSBgVUlEX0hBU0hfS0VZYCBvbiB0aGUgbm9kZVxuICAgICAgLy8gaXRzZWxmLlxuICAgICAgb2JqW1VJRF9IQVNIX0tFWV0gPSBoYXNoZWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVW5hYmxlIHRvIHNldCBhIG5vbi1lbnVtZXJhYmxlIHByb3BlcnR5IG9uIG9iamVjdC4nKTtcbiAgICB9XG5cbiAgICByZXR1cm4gaGFzaGVkO1xuICB9XG5cbiAgLy8gR2V0IHJlZmVyZW5jZXMgdG8gRVM1IG9iamVjdCBtZXRob2RzLlxuICB2YXIgaXNFeHRlbnNpYmxlID0gT2JqZWN0LmlzRXh0ZW5zaWJsZTtcblxuICAvLyBUcnVlIGlmIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSB3b3JrcyBhcyBleHBlY3RlZC4gSUU4IGZhaWxzIHRoaXMgdGVzdC5cbiAgdmFyIGNhbkRlZmluZVByb3BlcnR5ID0gKGZ1bmN0aW9uICgpIHtcbiAgICB0cnkge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHt9LCAnQCcsIHt9KTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH0pKCk7XG5cbiAgLy8gSUUgaGFzIGEgYHVuaXF1ZUlEYCBwcm9wZXJ0eSBvbiBET00gbm9kZXMuIFdlIGNhbiBjb25zdHJ1Y3QgdGhlIGhhc2ggZnJvbSBpdFxuICAvLyBhbmQgYXZvaWQgbWVtb3J5IGxlYWtzIGZyb20gdGhlIElFIGNsb25lTm9kZSBidWcuXG4gIGZ1bmN0aW9uIGdldElFTm9kZUhhc2gobm9kZSkge1xuICAgIGlmIChub2RlICYmIG5vZGUubm9kZVR5cGUgPiAwKSB7XG4gICAgICBzd2l0Y2ggKG5vZGUubm9kZVR5cGUpIHtcbiAgICAgICAgY2FzZSAxOiAvLyBFbGVtZW50XG4gICAgICAgICAgcmV0dXJuIG5vZGUudW5pcXVlSUQ7XG4gICAgICAgIGNhc2UgOTogLy8gRG9jdW1lbnRcbiAgICAgICAgICByZXR1cm4gbm9kZS5kb2N1bWVudEVsZW1lbnQgJiYgbm9kZS5kb2N1bWVudEVsZW1lbnQudW5pcXVlSUQ7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gdmFsdWVPZihvYmopIHtcbiAgICByZXR1cm4gb2JqLnZhbHVlT2YgIT09IGRlZmF1bHRWYWx1ZU9mICYmIHR5cGVvZiBvYmoudmFsdWVPZiA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgPyBvYmoudmFsdWVPZihvYmopXG4gICAgICA6IG9iajtcbiAgfVxuXG4gIGZ1bmN0aW9uIG5leHRIYXNoKCkge1xuICAgIHZhciBuZXh0SGFzaCA9ICsrX29iakhhc2hVSUQ7XG4gICAgaWYgKF9vYmpIYXNoVUlEICYgMHg0MDAwMDAwMCkge1xuICAgICAgX29iakhhc2hVSUQgPSAwO1xuICAgIH1cbiAgICByZXR1cm4gbmV4dEhhc2g7XG4gIH1cblxuICAvLyBJZiBwb3NzaWJsZSwgdXNlIGEgV2Vha01hcC5cbiAgdmFyIHVzaW5nV2Vha01hcCA9IHR5cGVvZiBXZWFrTWFwID09PSAnZnVuY3Rpb24nO1xuICB2YXIgd2Vha01hcDtcbiAgaWYgKHVzaW5nV2Vha01hcCkge1xuICAgIHdlYWtNYXAgPSBuZXcgV2Vha01hcCgpO1xuICB9XG5cbiAgdmFyIHN5bWJvbE1hcCA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cbiAgdmFyIF9vYmpIYXNoVUlEID0gMDtcblxuICB2YXIgVUlEX0hBU0hfS0VZID0gJ19faW1tdXRhYmxlaGFzaF9fJztcbiAgaWYgKHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicpIHtcbiAgICBVSURfSEFTSF9LRVkgPSBTeW1ib2woVUlEX0hBU0hfS0VZKTtcbiAgfVxuXG4gIHZhciBTVFJJTkdfSEFTSF9DQUNIRV9NSU5fU1RSTEVOID0gMTY7XG4gIHZhciBTVFJJTkdfSEFTSF9DQUNIRV9NQVhfU0laRSA9IDI1NTtcbiAgdmFyIFNUUklOR19IQVNIX0NBQ0hFX1NJWkUgPSAwO1xuICB2YXIgc3RyaW5nSGFzaENhY2hlID0ge307XG5cbiAgdmFyIFRvS2V5ZWRTZXF1ZW5jZSA9IC8qQF9fUFVSRV9fKi8oZnVuY3Rpb24gKEtleWVkU2VxKSB7XG4gICAgZnVuY3Rpb24gVG9LZXllZFNlcXVlbmNlKGluZGV4ZWQsIHVzZUtleXMpIHtcbiAgICAgIHRoaXMuX2l0ZXIgPSBpbmRleGVkO1xuICAgICAgdGhpcy5fdXNlS2V5cyA9IHVzZUtleXM7XG4gICAgICB0aGlzLnNpemUgPSBpbmRleGVkLnNpemU7XG4gICAgfVxuXG4gICAgaWYgKCBLZXllZFNlcSApIFRvS2V5ZWRTZXF1ZW5jZS5fX3Byb3RvX18gPSBLZXllZFNlcTtcbiAgICBUb0tleWVkU2VxdWVuY2UucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggS2V5ZWRTZXEgJiYgS2V5ZWRTZXEucHJvdG90eXBlICk7XG4gICAgVG9LZXllZFNlcXVlbmNlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFRvS2V5ZWRTZXF1ZW5jZTtcblxuICAgIFRvS2V5ZWRTZXF1ZW5jZS5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gZ2V0IChrZXksIG5vdFNldFZhbHVlKSB7XG4gICAgICByZXR1cm4gdGhpcy5faXRlci5nZXQoa2V5LCBub3RTZXRWYWx1ZSk7XG4gICAgfTtcblxuICAgIFRvS2V5ZWRTZXF1ZW5jZS5wcm90b3R5cGUuaGFzID0gZnVuY3Rpb24gaGFzIChrZXkpIHtcbiAgICAgIHJldHVybiB0aGlzLl9pdGVyLmhhcyhrZXkpO1xuICAgIH07XG5cbiAgICBUb0tleWVkU2VxdWVuY2UucHJvdG90eXBlLnZhbHVlU2VxID0gZnVuY3Rpb24gdmFsdWVTZXEgKCkge1xuICAgICAgcmV0dXJuIHRoaXMuX2l0ZXIudmFsdWVTZXEoKTtcbiAgICB9O1xuXG4gICAgVG9LZXllZFNlcXVlbmNlLnByb3RvdHlwZS5yZXZlcnNlID0gZnVuY3Rpb24gcmV2ZXJzZSAoKSB7XG4gICAgICB2YXIgdGhpcyQxJDEgPSB0aGlzO1xuXG4gICAgICB2YXIgcmV2ZXJzZWRTZXF1ZW5jZSA9IHJldmVyc2VGYWN0b3J5KHRoaXMsIHRydWUpO1xuICAgICAgaWYgKCF0aGlzLl91c2VLZXlzKSB7XG4gICAgICAgIHJldmVyc2VkU2VxdWVuY2UudmFsdWVTZXEgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzJDEkMS5faXRlci50b1NlcSgpLnJldmVyc2UoKTsgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXZlcnNlZFNlcXVlbmNlO1xuICAgIH07XG5cbiAgICBUb0tleWVkU2VxdWVuY2UucHJvdG90eXBlLm1hcCA9IGZ1bmN0aW9uIG1hcCAobWFwcGVyLCBjb250ZXh0KSB7XG4gICAgICB2YXIgdGhpcyQxJDEgPSB0aGlzO1xuXG4gICAgICB2YXIgbWFwcGVkU2VxdWVuY2UgPSBtYXBGYWN0b3J5KHRoaXMsIG1hcHBlciwgY29udGV4dCk7XG4gICAgICBpZiAoIXRoaXMuX3VzZUtleXMpIHtcbiAgICAgICAgbWFwcGVkU2VxdWVuY2UudmFsdWVTZXEgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzJDEkMS5faXRlci50b1NlcSgpLm1hcChtYXBwZXIsIGNvbnRleHQpOyB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIG1hcHBlZFNlcXVlbmNlO1xuICAgIH07XG5cbiAgICBUb0tleWVkU2VxdWVuY2UucHJvdG90eXBlLl9faXRlcmF0ZSA9IGZ1bmN0aW9uIF9faXRlcmF0ZSAoZm4sIHJldmVyc2UpIHtcbiAgICAgIHZhciB0aGlzJDEkMSA9IHRoaXM7XG5cbiAgICAgIHJldHVybiB0aGlzLl9pdGVyLl9faXRlcmF0ZShmdW5jdGlvbiAodiwgaykgeyByZXR1cm4gZm4odiwgaywgdGhpcyQxJDEpOyB9LCByZXZlcnNlKTtcbiAgICB9O1xuXG4gICAgVG9LZXllZFNlcXVlbmNlLnByb3RvdHlwZS5fX2l0ZXJhdG9yID0gZnVuY3Rpb24gX19pdGVyYXRvciAodHlwZSwgcmV2ZXJzZSkge1xuICAgICAgcmV0dXJuIHRoaXMuX2l0ZXIuX19pdGVyYXRvcih0eXBlLCByZXZlcnNlKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIFRvS2V5ZWRTZXF1ZW5jZTtcbiAgfShLZXllZFNlcSkpO1xuICBUb0tleWVkU2VxdWVuY2UucHJvdG90eXBlW0lTX09SREVSRURfU1lNQk9MXSA9IHRydWU7XG5cbiAgdmFyIFRvSW5kZXhlZFNlcXVlbmNlID0gLypAX19QVVJFX18qLyhmdW5jdGlvbiAoSW5kZXhlZFNlcSkge1xuICAgIGZ1bmN0aW9uIFRvSW5kZXhlZFNlcXVlbmNlKGl0ZXIpIHtcbiAgICAgIHRoaXMuX2l0ZXIgPSBpdGVyO1xuICAgICAgdGhpcy5zaXplID0gaXRlci5zaXplO1xuICAgIH1cblxuICAgIGlmICggSW5kZXhlZFNlcSApIFRvSW5kZXhlZFNlcXVlbmNlLl9fcHJvdG9fXyA9IEluZGV4ZWRTZXE7XG4gICAgVG9JbmRleGVkU2VxdWVuY2UucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggSW5kZXhlZFNlcSAmJiBJbmRleGVkU2VxLnByb3RvdHlwZSApO1xuICAgIFRvSW5kZXhlZFNlcXVlbmNlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFRvSW5kZXhlZFNlcXVlbmNlO1xuXG4gICAgVG9JbmRleGVkU2VxdWVuY2UucHJvdG90eXBlLmluY2x1ZGVzID0gZnVuY3Rpb24gaW5jbHVkZXMgKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdGhpcy5faXRlci5pbmNsdWRlcyh2YWx1ZSk7XG4gICAgfTtcblxuICAgIFRvSW5kZXhlZFNlcXVlbmNlLnByb3RvdHlwZS5fX2l0ZXJhdGUgPSBmdW5jdGlvbiBfX2l0ZXJhdGUgKGZuLCByZXZlcnNlKSB7XG4gICAgICB2YXIgdGhpcyQxJDEgPSB0aGlzO1xuXG4gICAgICB2YXIgaSA9IDA7XG4gICAgICByZXZlcnNlICYmIGVuc3VyZVNpemUodGhpcyk7XG4gICAgICByZXR1cm4gdGhpcy5faXRlci5fX2l0ZXJhdGUoXG4gICAgICAgIGZ1bmN0aW9uICh2KSB7IHJldHVybiBmbih2LCByZXZlcnNlID8gdGhpcyQxJDEuc2l6ZSAtICsraSA6IGkrKywgdGhpcyQxJDEpOyB9LFxuICAgICAgICByZXZlcnNlXG4gICAgICApO1xuICAgIH07XG5cbiAgICBUb0luZGV4ZWRTZXF1ZW5jZS5wcm90b3R5cGUuX19pdGVyYXRvciA9IGZ1bmN0aW9uIF9faXRlcmF0b3IgKHR5cGUsIHJldmVyc2UpIHtcbiAgICAgIHZhciB0aGlzJDEkMSA9IHRoaXM7XG5cbiAgICAgIHZhciBpdGVyYXRvciA9IHRoaXMuX2l0ZXIuX19pdGVyYXRvcihJVEVSQVRFX1ZBTFVFUywgcmV2ZXJzZSk7XG4gICAgICB2YXIgaSA9IDA7XG4gICAgICByZXZlcnNlICYmIGVuc3VyZVNpemUodGhpcyk7XG4gICAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHN0ZXAgPSBpdGVyYXRvci5uZXh0KCk7XG4gICAgICAgIHJldHVybiBzdGVwLmRvbmVcbiAgICAgICAgICA/IHN0ZXBcbiAgICAgICAgICA6IGl0ZXJhdG9yVmFsdWUoXG4gICAgICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgICAgIHJldmVyc2UgPyB0aGlzJDEkMS5zaXplIC0gKytpIDogaSsrLFxuICAgICAgICAgICAgICBzdGVwLnZhbHVlLFxuICAgICAgICAgICAgICBzdGVwXG4gICAgICAgICAgICApO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIHJldHVybiBUb0luZGV4ZWRTZXF1ZW5jZTtcbiAgfShJbmRleGVkU2VxKSk7XG5cbiAgdmFyIFRvU2V0U2VxdWVuY2UgPSAvKkBfX1BVUkVfXyovKGZ1bmN0aW9uIChTZXRTZXEpIHtcbiAgICBmdW5jdGlvbiBUb1NldFNlcXVlbmNlKGl0ZXIpIHtcbiAgICAgIHRoaXMuX2l0ZXIgPSBpdGVyO1xuICAgICAgdGhpcy5zaXplID0gaXRlci5zaXplO1xuICAgIH1cblxuICAgIGlmICggU2V0U2VxICkgVG9TZXRTZXF1ZW5jZS5fX3Byb3RvX18gPSBTZXRTZXE7XG4gICAgVG9TZXRTZXF1ZW5jZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBTZXRTZXEgJiYgU2V0U2VxLnByb3RvdHlwZSApO1xuICAgIFRvU2V0U2VxdWVuY2UucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gVG9TZXRTZXF1ZW5jZTtcblxuICAgIFRvU2V0U2VxdWVuY2UucHJvdG90eXBlLmhhcyA9IGZ1bmN0aW9uIGhhcyAoa2V5KSB7XG4gICAgICByZXR1cm4gdGhpcy5faXRlci5pbmNsdWRlcyhrZXkpO1xuICAgIH07XG5cbiAgICBUb1NldFNlcXVlbmNlLnByb3RvdHlwZS5fX2l0ZXJhdGUgPSBmdW5jdGlvbiBfX2l0ZXJhdGUgKGZuLCByZXZlcnNlKSB7XG4gICAgICB2YXIgdGhpcyQxJDEgPSB0aGlzO1xuXG4gICAgICByZXR1cm4gdGhpcy5faXRlci5fX2l0ZXJhdGUoZnVuY3Rpb24gKHYpIHsgcmV0dXJuIGZuKHYsIHYsIHRoaXMkMSQxKTsgfSwgcmV2ZXJzZSk7XG4gICAgfTtcblxuICAgIFRvU2V0U2VxdWVuY2UucHJvdG90eXBlLl9faXRlcmF0b3IgPSBmdW5jdGlvbiBfX2l0ZXJhdG9yICh0eXBlLCByZXZlcnNlKSB7XG4gICAgICB2YXIgaXRlcmF0b3IgPSB0aGlzLl9pdGVyLl9faXRlcmF0b3IoSVRFUkFURV9WQUxVRVMsIHJldmVyc2UpO1xuICAgICAgcmV0dXJuIG5ldyBJdGVyYXRvcihmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBzdGVwID0gaXRlcmF0b3IubmV4dCgpO1xuICAgICAgICByZXR1cm4gc3RlcC5kb25lXG4gICAgICAgICAgPyBzdGVwXG4gICAgICAgICAgOiBpdGVyYXRvclZhbHVlKHR5cGUsIHN0ZXAudmFsdWUsIHN0ZXAudmFsdWUsIHN0ZXApO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIHJldHVybiBUb1NldFNlcXVlbmNlO1xuICB9KFNldFNlcSkpO1xuXG4gIHZhciBGcm9tRW50cmllc1NlcXVlbmNlID0gLypAX19QVVJFX18qLyhmdW5jdGlvbiAoS2V5ZWRTZXEpIHtcbiAgICBmdW5jdGlvbiBGcm9tRW50cmllc1NlcXVlbmNlKGVudHJpZXMpIHtcbiAgICAgIHRoaXMuX2l0ZXIgPSBlbnRyaWVzO1xuICAgICAgdGhpcy5zaXplID0gZW50cmllcy5zaXplO1xuICAgIH1cblxuICAgIGlmICggS2V5ZWRTZXEgKSBGcm9tRW50cmllc1NlcXVlbmNlLl9fcHJvdG9fXyA9IEtleWVkU2VxO1xuICAgIEZyb21FbnRyaWVzU2VxdWVuY2UucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggS2V5ZWRTZXEgJiYgS2V5ZWRTZXEucHJvdG90eXBlICk7XG4gICAgRnJvbUVudHJpZXNTZXF1ZW5jZS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBGcm9tRW50cmllc1NlcXVlbmNlO1xuXG4gICAgRnJvbUVudHJpZXNTZXF1ZW5jZS5wcm90b3R5cGUuZW50cnlTZXEgPSBmdW5jdGlvbiBlbnRyeVNlcSAoKSB7XG4gICAgICByZXR1cm4gdGhpcy5faXRlci50b1NlcSgpO1xuICAgIH07XG5cbiAgICBGcm9tRW50cmllc1NlcXVlbmNlLnByb3RvdHlwZS5fX2l0ZXJhdGUgPSBmdW5jdGlvbiBfX2l0ZXJhdGUgKGZuLCByZXZlcnNlKSB7XG4gICAgICB2YXIgdGhpcyQxJDEgPSB0aGlzO1xuXG4gICAgICByZXR1cm4gdGhpcy5faXRlci5fX2l0ZXJhdGUoZnVuY3Rpb24gKGVudHJ5KSB7XG4gICAgICAgIC8vIENoZWNrIGlmIGVudHJ5IGV4aXN0cyBmaXJzdCBzbyBhcnJheSBhY2Nlc3MgZG9lc24ndCB0aHJvdyBmb3IgaG9sZXNcbiAgICAgICAgLy8gaW4gdGhlIHBhcmVudCBpdGVyYXRpb24uXG4gICAgICAgIGlmIChlbnRyeSkge1xuICAgICAgICAgIHZhbGlkYXRlRW50cnkoZW50cnkpO1xuICAgICAgICAgIHZhciBpbmRleGVkQ29sbGVjdGlvbiA9IGlzQ29sbGVjdGlvbihlbnRyeSk7XG4gICAgICAgICAgcmV0dXJuIGZuKFxuICAgICAgICAgICAgaW5kZXhlZENvbGxlY3Rpb24gPyBlbnRyeS5nZXQoMSkgOiBlbnRyeVsxXSxcbiAgICAgICAgICAgIGluZGV4ZWRDb2xsZWN0aW9uID8gZW50cnkuZ2V0KDApIDogZW50cnlbMF0sXG4gICAgICAgICAgICB0aGlzJDEkMVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0sIHJldmVyc2UpO1xuICAgIH07XG5cbiAgICBGcm9tRW50cmllc1NlcXVlbmNlLnByb3RvdHlwZS5fX2l0ZXJhdG9yID0gZnVuY3Rpb24gX19pdGVyYXRvciAodHlwZSwgcmV2ZXJzZSkge1xuICAgICAgdmFyIGl0ZXJhdG9yID0gdGhpcy5faXRlci5fX2l0ZXJhdG9yKElURVJBVEVfVkFMVUVTLCByZXZlcnNlKTtcbiAgICAgIHJldHVybiBuZXcgSXRlcmF0b3IoZnVuY3Rpb24gKCkge1xuICAgICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAgIHZhciBzdGVwID0gaXRlcmF0b3IubmV4dCgpO1xuICAgICAgICAgIGlmIChzdGVwLmRvbmUpIHtcbiAgICAgICAgICAgIHJldHVybiBzdGVwO1xuICAgICAgICAgIH1cbiAgICAgICAgICB2YXIgZW50cnkgPSBzdGVwLnZhbHVlO1xuICAgICAgICAgIC8vIENoZWNrIGlmIGVudHJ5IGV4aXN0cyBmaXJzdCBzbyBhcnJheSBhY2Nlc3MgZG9lc24ndCB0aHJvdyBmb3IgaG9sZXNcbiAgICAgICAgICAvLyBpbiB0aGUgcGFyZW50IGl0ZXJhdGlvbi5cbiAgICAgICAgICBpZiAoZW50cnkpIHtcbiAgICAgICAgICAgIHZhbGlkYXRlRW50cnkoZW50cnkpO1xuICAgICAgICAgICAgdmFyIGluZGV4ZWRDb2xsZWN0aW9uID0gaXNDb2xsZWN0aW9uKGVudHJ5KTtcbiAgICAgICAgICAgIHJldHVybiBpdGVyYXRvclZhbHVlKFxuICAgICAgICAgICAgICB0eXBlLFxuICAgICAgICAgICAgICBpbmRleGVkQ29sbGVjdGlvbiA/IGVudHJ5LmdldCgwKSA6IGVudHJ5WzBdLFxuICAgICAgICAgICAgICBpbmRleGVkQ29sbGVjdGlvbiA/IGVudHJ5LmdldCgxKSA6IGVudHJ5WzFdLFxuICAgICAgICAgICAgICBzdGVwXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIHJldHVybiBGcm9tRW50cmllc1NlcXVlbmNlO1xuICB9KEtleWVkU2VxKSk7XG5cbiAgVG9JbmRleGVkU2VxdWVuY2UucHJvdG90eXBlLmNhY2hlUmVzdWx0ID1cbiAgICBUb0tleWVkU2VxdWVuY2UucHJvdG90eXBlLmNhY2hlUmVzdWx0ID1cbiAgICBUb1NldFNlcXVlbmNlLnByb3RvdHlwZS5jYWNoZVJlc3VsdCA9XG4gICAgRnJvbUVudHJpZXNTZXF1ZW5jZS5wcm90b3R5cGUuY2FjaGVSZXN1bHQgPVxuICAgICAgY2FjaGVSZXN1bHRUaHJvdWdoO1xuXG4gIGZ1bmN0aW9uIGZsaXBGYWN0b3J5KGNvbGxlY3Rpb24pIHtcbiAgICB2YXIgZmxpcFNlcXVlbmNlID0gbWFrZVNlcXVlbmNlKGNvbGxlY3Rpb24pO1xuICAgIGZsaXBTZXF1ZW5jZS5faXRlciA9IGNvbGxlY3Rpb247XG4gICAgZmxpcFNlcXVlbmNlLnNpemUgPSBjb2xsZWN0aW9uLnNpemU7XG4gICAgZmxpcFNlcXVlbmNlLmZsaXAgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBjb2xsZWN0aW9uOyB9O1xuICAgIGZsaXBTZXF1ZW5jZS5yZXZlcnNlID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHJldmVyc2VkU2VxdWVuY2UgPSBjb2xsZWN0aW9uLnJldmVyc2UuYXBwbHkodGhpcyk7IC8vIHN1cGVyLnJldmVyc2UoKVxuICAgICAgcmV2ZXJzZWRTZXF1ZW5jZS5mbGlwID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gY29sbGVjdGlvbi5yZXZlcnNlKCk7IH07XG4gICAgICByZXR1cm4gcmV2ZXJzZWRTZXF1ZW5jZTtcbiAgICB9O1xuICAgIGZsaXBTZXF1ZW5jZS5oYXMgPSBmdW5jdGlvbiAoa2V5KSB7IHJldHVybiBjb2xsZWN0aW9uLmluY2x1ZGVzKGtleSk7IH07XG4gICAgZmxpcFNlcXVlbmNlLmluY2x1ZGVzID0gZnVuY3Rpb24gKGtleSkgeyByZXR1cm4gY29sbGVjdGlvbi5oYXMoa2V5KTsgfTtcbiAgICBmbGlwU2VxdWVuY2UuY2FjaGVSZXN1bHQgPSBjYWNoZVJlc3VsdFRocm91Z2g7XG4gICAgZmxpcFNlcXVlbmNlLl9faXRlcmF0ZVVuY2FjaGVkID0gZnVuY3Rpb24gKGZuLCByZXZlcnNlKSB7XG4gICAgICB2YXIgdGhpcyQxJDEgPSB0aGlzO1xuXG4gICAgICByZXR1cm4gY29sbGVjdGlvbi5fX2l0ZXJhdGUoZnVuY3Rpb24gKHYsIGspIHsgcmV0dXJuIGZuKGssIHYsIHRoaXMkMSQxKSAhPT0gZmFsc2U7IH0sIHJldmVyc2UpO1xuICAgIH07XG4gICAgZmxpcFNlcXVlbmNlLl9faXRlcmF0b3JVbmNhY2hlZCA9IGZ1bmN0aW9uICh0eXBlLCByZXZlcnNlKSB7XG4gICAgICBpZiAodHlwZSA9PT0gSVRFUkFURV9FTlRSSUVTKSB7XG4gICAgICAgIHZhciBpdGVyYXRvciA9IGNvbGxlY3Rpb24uX19pdGVyYXRvcih0eXBlLCByZXZlcnNlKTtcbiAgICAgICAgcmV0dXJuIG5ldyBJdGVyYXRvcihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgdmFyIHN0ZXAgPSBpdGVyYXRvci5uZXh0KCk7XG4gICAgICAgICAgaWYgKCFzdGVwLmRvbmUpIHtcbiAgICAgICAgICAgIHZhciBrID0gc3RlcC52YWx1ZVswXTtcbiAgICAgICAgICAgIHN0ZXAudmFsdWVbMF0gPSBzdGVwLnZhbHVlWzFdO1xuICAgICAgICAgICAgc3RlcC52YWx1ZVsxXSA9IGs7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBzdGVwO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjb2xsZWN0aW9uLl9faXRlcmF0b3IoXG4gICAgICAgIHR5cGUgPT09IElURVJBVEVfVkFMVUVTID8gSVRFUkFURV9LRVlTIDogSVRFUkFURV9WQUxVRVMsXG4gICAgICAgIHJldmVyc2VcbiAgICAgICk7XG4gICAgfTtcbiAgICByZXR1cm4gZmxpcFNlcXVlbmNlO1xuICB9XG5cbiAgZnVuY3Rpb24gbWFwRmFjdG9yeShjb2xsZWN0aW9uLCBtYXBwZXIsIGNvbnRleHQpIHtcbiAgICB2YXIgbWFwcGVkU2VxdWVuY2UgPSBtYWtlU2VxdWVuY2UoY29sbGVjdGlvbik7XG4gICAgbWFwcGVkU2VxdWVuY2Uuc2l6ZSA9IGNvbGxlY3Rpb24uc2l6ZTtcbiAgICBtYXBwZWRTZXF1ZW5jZS5oYXMgPSBmdW5jdGlvbiAoa2V5KSB7IHJldHVybiBjb2xsZWN0aW9uLmhhcyhrZXkpOyB9O1xuICAgIG1hcHBlZFNlcXVlbmNlLmdldCA9IGZ1bmN0aW9uIChrZXksIG5vdFNldFZhbHVlKSB7XG4gICAgICB2YXIgdiA9IGNvbGxlY3Rpb24uZ2V0KGtleSwgTk9UX1NFVCk7XG4gICAgICByZXR1cm4gdiA9PT0gTk9UX1NFVFxuICAgICAgICA/IG5vdFNldFZhbHVlXG4gICAgICAgIDogbWFwcGVyLmNhbGwoY29udGV4dCwgdiwga2V5LCBjb2xsZWN0aW9uKTtcbiAgICB9O1xuICAgIG1hcHBlZFNlcXVlbmNlLl9faXRlcmF0ZVVuY2FjaGVkID0gZnVuY3Rpb24gKGZuLCByZXZlcnNlKSB7XG4gICAgICB2YXIgdGhpcyQxJDEgPSB0aGlzO1xuXG4gICAgICByZXR1cm4gY29sbGVjdGlvbi5fX2l0ZXJhdGUoXG4gICAgICAgIGZ1bmN0aW9uICh2LCBrLCBjKSB7IHJldHVybiBmbihtYXBwZXIuY2FsbChjb250ZXh0LCB2LCBrLCBjKSwgaywgdGhpcyQxJDEpICE9PSBmYWxzZTsgfSxcbiAgICAgICAgcmV2ZXJzZVxuICAgICAgKTtcbiAgICB9O1xuICAgIG1hcHBlZFNlcXVlbmNlLl9faXRlcmF0b3JVbmNhY2hlZCA9IGZ1bmN0aW9uICh0eXBlLCByZXZlcnNlKSB7XG4gICAgICB2YXIgaXRlcmF0b3IgPSBjb2xsZWN0aW9uLl9faXRlcmF0b3IoSVRFUkFURV9FTlRSSUVTLCByZXZlcnNlKTtcbiAgICAgIHJldHVybiBuZXcgSXRlcmF0b3IoZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgc3RlcCA9IGl0ZXJhdG9yLm5leHQoKTtcbiAgICAgICAgaWYgKHN0ZXAuZG9uZSkge1xuICAgICAgICAgIHJldHVybiBzdGVwO1xuICAgICAgICB9XG4gICAgICAgIHZhciBlbnRyeSA9IHN0ZXAudmFsdWU7XG4gICAgICAgIHZhciBrZXkgPSBlbnRyeVswXTtcbiAgICAgICAgcmV0dXJuIGl0ZXJhdG9yVmFsdWUoXG4gICAgICAgICAgdHlwZSxcbiAgICAgICAgICBrZXksXG4gICAgICAgICAgbWFwcGVyLmNhbGwoY29udGV4dCwgZW50cnlbMV0sIGtleSwgY29sbGVjdGlvbiksXG4gICAgICAgICAgc3RlcFxuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgfTtcbiAgICByZXR1cm4gbWFwcGVkU2VxdWVuY2U7XG4gIH1cblxuICBmdW5jdGlvbiByZXZlcnNlRmFjdG9yeShjb2xsZWN0aW9uLCB1c2VLZXlzKSB7XG4gICAgdmFyIHRoaXMkMSQxID0gdGhpcztcblxuICAgIHZhciByZXZlcnNlZFNlcXVlbmNlID0gbWFrZVNlcXVlbmNlKGNvbGxlY3Rpb24pO1xuICAgIHJldmVyc2VkU2VxdWVuY2UuX2l0ZXIgPSBjb2xsZWN0aW9uO1xuICAgIHJldmVyc2VkU2VxdWVuY2Uuc2l6ZSA9IGNvbGxlY3Rpb24uc2l6ZTtcbiAgICByZXZlcnNlZFNlcXVlbmNlLnJldmVyc2UgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBjb2xsZWN0aW9uOyB9O1xuICAgIGlmIChjb2xsZWN0aW9uLmZsaXApIHtcbiAgICAgIHJldmVyc2VkU2VxdWVuY2UuZmxpcCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGZsaXBTZXF1ZW5jZSA9IGZsaXBGYWN0b3J5KGNvbGxlY3Rpb24pO1xuICAgICAgICBmbGlwU2VxdWVuY2UucmV2ZXJzZSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbGxlY3Rpb24uZmxpcCgpOyB9O1xuICAgICAgICByZXR1cm4gZmxpcFNlcXVlbmNlO1xuICAgICAgfTtcbiAgICB9XG4gICAgcmV2ZXJzZWRTZXF1ZW5jZS5nZXQgPSBmdW5jdGlvbiAoa2V5LCBub3RTZXRWYWx1ZSkgeyByZXR1cm4gY29sbGVjdGlvbi5nZXQodXNlS2V5cyA/IGtleSA6IC0xIC0ga2V5LCBub3RTZXRWYWx1ZSk7IH07XG4gICAgcmV2ZXJzZWRTZXF1ZW5jZS5oYXMgPSBmdW5jdGlvbiAoa2V5KSB7IHJldHVybiBjb2xsZWN0aW9uLmhhcyh1c2VLZXlzID8ga2V5IDogLTEgLSBrZXkpOyB9O1xuICAgIHJldmVyc2VkU2VxdWVuY2UuaW5jbHVkZXMgPSBmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIGNvbGxlY3Rpb24uaW5jbHVkZXModmFsdWUpOyB9O1xuICAgIHJldmVyc2VkU2VxdWVuY2UuY2FjaGVSZXN1bHQgPSBjYWNoZVJlc3VsdFRocm91Z2g7XG4gICAgcmV2ZXJzZWRTZXF1ZW5jZS5fX2l0ZXJhdGUgPSBmdW5jdGlvbiAoZm4sIHJldmVyc2UpIHtcbiAgICAgIHZhciB0aGlzJDEkMSA9IHRoaXM7XG5cbiAgICAgIHZhciBpID0gMDtcbiAgICAgIHJldmVyc2UgJiYgZW5zdXJlU2l6ZShjb2xsZWN0aW9uKTtcbiAgICAgIHJldHVybiBjb2xsZWN0aW9uLl9faXRlcmF0ZShcbiAgICAgICAgZnVuY3Rpb24gKHYsIGspIHsgcmV0dXJuIGZuKHYsIHVzZUtleXMgPyBrIDogcmV2ZXJzZSA/IHRoaXMkMSQxLnNpemUgLSArK2kgOiBpKyssIHRoaXMkMSQxKTsgfSxcbiAgICAgICAgIXJldmVyc2VcbiAgICAgICk7XG4gICAgfTtcbiAgICByZXZlcnNlZFNlcXVlbmNlLl9faXRlcmF0b3IgPSBmdW5jdGlvbiAodHlwZSwgcmV2ZXJzZSkge1xuICAgICAgdmFyIGkgPSAwO1xuICAgICAgcmV2ZXJzZSAmJiBlbnN1cmVTaXplKGNvbGxlY3Rpb24pO1xuICAgICAgdmFyIGl0ZXJhdG9yID0gY29sbGVjdGlvbi5fX2l0ZXJhdG9yKElURVJBVEVfRU5UUklFUywgIXJldmVyc2UpO1xuICAgICAgcmV0dXJuIG5ldyBJdGVyYXRvcihmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBzdGVwID0gaXRlcmF0b3IubmV4dCgpO1xuICAgICAgICBpZiAoc3RlcC5kb25lKSB7XG4gICAgICAgICAgcmV0dXJuIHN0ZXA7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGVudHJ5ID0gc3RlcC52YWx1ZTtcbiAgICAgICAgcmV0dXJuIGl0ZXJhdG9yVmFsdWUoXG4gICAgICAgICAgdHlwZSxcbiAgICAgICAgICB1c2VLZXlzID8gZW50cnlbMF0gOiByZXZlcnNlID8gdGhpcyQxJDEuc2l6ZSAtICsraSA6IGkrKyxcbiAgICAgICAgICBlbnRyeVsxXSxcbiAgICAgICAgICBzdGVwXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICB9O1xuICAgIHJldHVybiByZXZlcnNlZFNlcXVlbmNlO1xuICB9XG5cbiAgZnVuY3Rpb24gZmlsdGVyRmFjdG9yeShjb2xsZWN0aW9uLCBwcmVkaWNhdGUsIGNvbnRleHQsIHVzZUtleXMpIHtcbiAgICB2YXIgZmlsdGVyU2VxdWVuY2UgPSBtYWtlU2VxdWVuY2UoY29sbGVjdGlvbik7XG4gICAgaWYgKHVzZUtleXMpIHtcbiAgICAgIGZpbHRlclNlcXVlbmNlLmhhcyA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgdmFyIHYgPSBjb2xsZWN0aW9uLmdldChrZXksIE5PVF9TRVQpO1xuICAgICAgICByZXR1cm4gdiAhPT0gTk9UX1NFVCAmJiAhIXByZWRpY2F0ZS5jYWxsKGNvbnRleHQsIHYsIGtleSwgY29sbGVjdGlvbik7XG4gICAgICB9O1xuICAgICAgZmlsdGVyU2VxdWVuY2UuZ2V0ID0gZnVuY3Rpb24gKGtleSwgbm90U2V0VmFsdWUpIHtcbiAgICAgICAgdmFyIHYgPSBjb2xsZWN0aW9uLmdldChrZXksIE5PVF9TRVQpO1xuICAgICAgICByZXR1cm4gdiAhPT0gTk9UX1NFVCAmJiBwcmVkaWNhdGUuY2FsbChjb250ZXh0LCB2LCBrZXksIGNvbGxlY3Rpb24pXG4gICAgICAgICAgPyB2XG4gICAgICAgICAgOiBub3RTZXRWYWx1ZTtcbiAgICAgIH07XG4gICAgfVxuICAgIGZpbHRlclNlcXVlbmNlLl9faXRlcmF0ZVVuY2FjaGVkID0gZnVuY3Rpb24gKGZuLCByZXZlcnNlKSB7XG4gICAgICB2YXIgdGhpcyQxJDEgPSB0aGlzO1xuXG4gICAgICB2YXIgaXRlcmF0aW9ucyA9IDA7XG4gICAgICBjb2xsZWN0aW9uLl9faXRlcmF0ZShmdW5jdGlvbiAodiwgaywgYykge1xuICAgICAgICBpZiAocHJlZGljYXRlLmNhbGwoY29udGV4dCwgdiwgaywgYykpIHtcbiAgICAgICAgICBpdGVyYXRpb25zKys7XG4gICAgICAgICAgcmV0dXJuIGZuKHYsIHVzZUtleXMgPyBrIDogaXRlcmF0aW9ucyAtIDEsIHRoaXMkMSQxKTtcbiAgICAgICAgfVxuICAgICAgfSwgcmV2ZXJzZSk7XG4gICAgICByZXR1cm4gaXRlcmF0aW9ucztcbiAgICB9O1xuICAgIGZpbHRlclNlcXVlbmNlLl9faXRlcmF0b3JVbmNhY2hlZCA9IGZ1bmN0aW9uICh0eXBlLCByZXZlcnNlKSB7XG4gICAgICB2YXIgaXRlcmF0b3IgPSBjb2xsZWN0aW9uLl9faXRlcmF0b3IoSVRFUkFURV9FTlRSSUVTLCByZXZlcnNlKTtcbiAgICAgIHZhciBpdGVyYXRpb25zID0gMDtcbiAgICAgIHJldHVybiBuZXcgSXRlcmF0b3IoZnVuY3Rpb24gKCkge1xuICAgICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAgIHZhciBzdGVwID0gaXRlcmF0b3IubmV4dCgpO1xuICAgICAgICAgIGlmIChzdGVwLmRvbmUpIHtcbiAgICAgICAgICAgIHJldHVybiBzdGVwO1xuICAgICAgICAgIH1cbiAgICAgICAgICB2YXIgZW50cnkgPSBzdGVwLnZhbHVlO1xuICAgICAgICAgIHZhciBrZXkgPSBlbnRyeVswXTtcbiAgICAgICAgICB2YXIgdmFsdWUgPSBlbnRyeVsxXTtcbiAgICAgICAgICBpZiAocHJlZGljYXRlLmNhbGwoY29udGV4dCwgdmFsdWUsIGtleSwgY29sbGVjdGlvbikpIHtcbiAgICAgICAgICAgIHJldHVybiBpdGVyYXRvclZhbHVlKHR5cGUsIHVzZUtleXMgPyBrZXkgOiBpdGVyYXRpb25zKyssIHZhbHVlLCBzdGVwKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH07XG4gICAgcmV0dXJuIGZpbHRlclNlcXVlbmNlO1xuICB9XG5cbiAgZnVuY3Rpb24gY291bnRCeUZhY3RvcnkoY29sbGVjdGlvbiwgZ3JvdXBlciwgY29udGV4dCkge1xuICAgIHZhciBncm91cHMgPSBNYXAoKS5hc011dGFibGUoKTtcbiAgICBjb2xsZWN0aW9uLl9faXRlcmF0ZShmdW5jdGlvbiAodiwgaykge1xuICAgICAgZ3JvdXBzLnVwZGF0ZShncm91cGVyLmNhbGwoY29udGV4dCwgdiwgaywgY29sbGVjdGlvbiksIDAsIGZ1bmN0aW9uIChhKSB7IHJldHVybiBhICsgMTsgfSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGdyb3Vwcy5hc0ltbXV0YWJsZSgpO1xuICB9XG5cbiAgZnVuY3Rpb24gZ3JvdXBCeUZhY3RvcnkoY29sbGVjdGlvbiwgZ3JvdXBlciwgY29udGV4dCkge1xuICAgIHZhciBpc0tleWVkSXRlciA9IGlzS2V5ZWQoY29sbGVjdGlvbik7XG4gICAgdmFyIGdyb3VwcyA9IChpc09yZGVyZWQoY29sbGVjdGlvbikgPyBPcmRlcmVkTWFwKCkgOiBNYXAoKSkuYXNNdXRhYmxlKCk7XG4gICAgY29sbGVjdGlvbi5fX2l0ZXJhdGUoZnVuY3Rpb24gKHYsIGspIHtcbiAgICAgIGdyb3Vwcy51cGRhdGUoXG4gICAgICAgIGdyb3VwZXIuY2FsbChjb250ZXh0LCB2LCBrLCBjb2xsZWN0aW9uKSxcbiAgICAgICAgZnVuY3Rpb24gKGEpIHsgcmV0dXJuICgoYSA9IGEgfHwgW10pLCBhLnB1c2goaXNLZXllZEl0ZXIgPyBbaywgdl0gOiB2KSwgYSk7IH1cbiAgICAgICk7XG4gICAgfSk7XG4gICAgdmFyIGNvZXJjZSA9IGNvbGxlY3Rpb25DbGFzcyhjb2xsZWN0aW9uKTtcbiAgICByZXR1cm4gZ3JvdXBzLm1hcChmdW5jdGlvbiAoYXJyKSB7IHJldHVybiByZWlmeShjb2xsZWN0aW9uLCBjb2VyY2UoYXJyKSk7IH0pLmFzSW1tdXRhYmxlKCk7XG4gIH1cblxuICBmdW5jdGlvbiBzbGljZUZhY3RvcnkoY29sbGVjdGlvbiwgYmVnaW4sIGVuZCwgdXNlS2V5cykge1xuICAgIHZhciBvcmlnaW5hbFNpemUgPSBjb2xsZWN0aW9uLnNpemU7XG5cbiAgICBpZiAod2hvbGVTbGljZShiZWdpbiwgZW5kLCBvcmlnaW5hbFNpemUpKSB7XG4gICAgICByZXR1cm4gY29sbGVjdGlvbjtcbiAgICB9XG5cbiAgICB2YXIgcmVzb2x2ZWRCZWdpbiA9IHJlc29sdmVCZWdpbihiZWdpbiwgb3JpZ2luYWxTaXplKTtcbiAgICB2YXIgcmVzb2x2ZWRFbmQgPSByZXNvbHZlRW5kKGVuZCwgb3JpZ2luYWxTaXplKTtcblxuICAgIC8vIGJlZ2luIG9yIGVuZCB3aWxsIGJlIE5hTiBpZiB0aGV5IHdlcmUgcHJvdmlkZWQgYXMgbmVnYXRpdmUgbnVtYmVycyBhbmRcbiAgICAvLyB0aGlzIGNvbGxlY3Rpb24ncyBzaXplIGlzIHVua25vd24uIEluIHRoYXQgY2FzZSwgY2FjaGUgZmlyc3Qgc28gdGhlcmUgaXNcbiAgICAvLyBhIGtub3duIHNpemUgYW5kIHRoZXNlIGRvIG5vdCByZXNvbHZlIHRvIE5hTi5cbiAgICBpZiAocmVzb2x2ZWRCZWdpbiAhPT0gcmVzb2x2ZWRCZWdpbiB8fCByZXNvbHZlZEVuZCAhPT0gcmVzb2x2ZWRFbmQpIHtcbiAgICAgIHJldHVybiBzbGljZUZhY3RvcnkoY29sbGVjdGlvbi50b1NlcSgpLmNhY2hlUmVzdWx0KCksIGJlZ2luLCBlbmQsIHVzZUtleXMpO1xuICAgIH1cblxuICAgIC8vIE5vdGU6IHJlc29sdmVkRW5kIGlzIHVuZGVmaW5lZCB3aGVuIHRoZSBvcmlnaW5hbCBzZXF1ZW5jZSdzIGxlbmd0aCBpc1xuICAgIC8vIHVua25vd24gYW5kIHRoaXMgc2xpY2UgZGlkIG5vdCBzdXBwbHkgYW4gZW5kIGFuZCBzaG91bGQgY29udGFpbiBhbGxcbiAgICAvLyBlbGVtZW50cyBhZnRlciByZXNvbHZlZEJlZ2luLlxuICAgIC8vIEluIHRoYXQgY2FzZSwgcmVzb2x2ZWRTaXplIHdpbGwgYmUgTmFOIGFuZCBzbGljZVNpemUgd2lsbCByZW1haW4gdW5kZWZpbmVkLlxuICAgIHZhciByZXNvbHZlZFNpemUgPSByZXNvbHZlZEVuZCAtIHJlc29sdmVkQmVnaW47XG4gICAgdmFyIHNsaWNlU2l6ZTtcbiAgICBpZiAocmVzb2x2ZWRTaXplID09PSByZXNvbHZlZFNpemUpIHtcbiAgICAgIHNsaWNlU2l6ZSA9IHJlc29sdmVkU2l6ZSA8IDAgPyAwIDogcmVzb2x2ZWRTaXplO1xuICAgIH1cblxuICAgIHZhciBzbGljZVNlcSA9IG1ha2VTZXF1ZW5jZShjb2xsZWN0aW9uKTtcblxuICAgIC8vIElmIGNvbGxlY3Rpb24uc2l6ZSBpcyB1bmRlZmluZWQsIHRoZSBzaXplIG9mIHRoZSByZWFsaXplZCBzbGljZVNlcSBpc1xuICAgIC8vIHVua25vd24gYXQgdGhpcyBwb2ludCB1bmxlc3MgdGhlIG51bWJlciBvZiBpdGVtcyB0byBzbGljZSBpcyAwXG4gICAgc2xpY2VTZXEuc2l6ZSA9XG4gICAgICBzbGljZVNpemUgPT09IDAgPyBzbGljZVNpemUgOiAoY29sbGVjdGlvbi5zaXplICYmIHNsaWNlU2l6ZSkgfHwgdW5kZWZpbmVkO1xuXG4gICAgaWYgKCF1c2VLZXlzICYmIGlzU2VxKGNvbGxlY3Rpb24pICYmIHNsaWNlU2l6ZSA+PSAwKSB7XG4gICAgICBzbGljZVNlcS5nZXQgPSBmdW5jdGlvbiAoaW5kZXgsIG5vdFNldFZhbHVlKSB7XG4gICAgICAgIGluZGV4ID0gd3JhcEluZGV4KHRoaXMsIGluZGV4KTtcbiAgICAgICAgcmV0dXJuIGluZGV4ID49IDAgJiYgaW5kZXggPCBzbGljZVNpemVcbiAgICAgICAgICA/IGNvbGxlY3Rpb24uZ2V0KGluZGV4ICsgcmVzb2x2ZWRCZWdpbiwgbm90U2V0VmFsdWUpXG4gICAgICAgICAgOiBub3RTZXRWYWx1ZTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgc2xpY2VTZXEuX19pdGVyYXRlVW5jYWNoZWQgPSBmdW5jdGlvbiAoZm4sIHJldmVyc2UpIHtcbiAgICAgIHZhciB0aGlzJDEkMSA9IHRoaXM7XG5cbiAgICAgIGlmIChzbGljZVNpemUgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICB9XG4gICAgICBpZiAocmV2ZXJzZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5jYWNoZVJlc3VsdCgpLl9faXRlcmF0ZShmbiwgcmV2ZXJzZSk7XG4gICAgICB9XG4gICAgICB2YXIgc2tpcHBlZCA9IDA7XG4gICAgICB2YXIgaXNTa2lwcGluZyA9IHRydWU7XG4gICAgICB2YXIgaXRlcmF0aW9ucyA9IDA7XG4gICAgICBjb2xsZWN0aW9uLl9faXRlcmF0ZShmdW5jdGlvbiAodiwgaykge1xuICAgICAgICBpZiAoIShpc1NraXBwaW5nICYmIChpc1NraXBwaW5nID0gc2tpcHBlZCsrIDwgcmVzb2x2ZWRCZWdpbikpKSB7XG4gICAgICAgICAgaXRlcmF0aW9ucysrO1xuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICBmbih2LCB1c2VLZXlzID8gayA6IGl0ZXJhdGlvbnMgLSAxLCB0aGlzJDEkMSkgIT09IGZhbHNlICYmXG4gICAgICAgICAgICBpdGVyYXRpb25zICE9PSBzbGljZVNpemVcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBpdGVyYXRpb25zO1xuICAgIH07XG5cbiAgICBzbGljZVNlcS5fX2l0ZXJhdG9yVW5jYWNoZWQgPSBmdW5jdGlvbiAodHlwZSwgcmV2ZXJzZSkge1xuICAgICAgaWYgKHNsaWNlU2l6ZSAhPT0gMCAmJiByZXZlcnNlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNhY2hlUmVzdWx0KCkuX19pdGVyYXRvcih0eXBlLCByZXZlcnNlKTtcbiAgICAgIH1cbiAgICAgIC8vIERvbid0IGJvdGhlciBpbnN0YW50aWF0aW5nIHBhcmVudCBpdGVyYXRvciBpZiB0YWtpbmcgMC5cbiAgICAgIGlmIChzbGljZVNpemUgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIG5ldyBJdGVyYXRvcihpdGVyYXRvckRvbmUpO1xuICAgICAgfVxuICAgICAgdmFyIGl0ZXJhdG9yID0gY29sbGVjdGlvbi5fX2l0ZXJhdG9yKHR5cGUsIHJldmVyc2UpO1xuICAgICAgdmFyIHNraXBwZWQgPSAwO1xuICAgICAgdmFyIGl0ZXJhdGlvbnMgPSAwO1xuICAgICAgcmV0dXJuIG5ldyBJdGVyYXRvcihmdW5jdGlvbiAoKSB7XG4gICAgICAgIHdoaWxlIChza2lwcGVkKysgPCByZXNvbHZlZEJlZ2luKSB7XG4gICAgICAgICAgaXRlcmF0b3IubmV4dCgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICgrK2l0ZXJhdGlvbnMgPiBzbGljZVNpemUpIHtcbiAgICAgICAgICByZXR1cm4gaXRlcmF0b3JEb25lKCk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHN0ZXAgPSBpdGVyYXRvci5uZXh0KCk7XG4gICAgICAgIGlmICh1c2VLZXlzIHx8IHR5cGUgPT09IElURVJBVEVfVkFMVUVTIHx8IHN0ZXAuZG9uZSkge1xuICAgICAgICAgIHJldHVybiBzdGVwO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlID09PSBJVEVSQVRFX0tFWVMpIHtcbiAgICAgICAgICByZXR1cm4gaXRlcmF0b3JWYWx1ZSh0eXBlLCBpdGVyYXRpb25zIC0gMSwgdW5kZWZpbmVkLCBzdGVwKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaXRlcmF0b3JWYWx1ZSh0eXBlLCBpdGVyYXRpb25zIC0gMSwgc3RlcC52YWx1ZVsxXSwgc3RlcCk7XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIHNsaWNlU2VxO1xuICB9XG5cbiAgZnVuY3Rpb24gdGFrZVdoaWxlRmFjdG9yeShjb2xsZWN0aW9uLCBwcmVkaWNhdGUsIGNvbnRleHQpIHtcbiAgICB2YXIgdGFrZVNlcXVlbmNlID0gbWFrZVNlcXVlbmNlKGNvbGxlY3Rpb24pO1xuICAgIHRha2VTZXF1ZW5jZS5fX2l0ZXJhdGVVbmNhY2hlZCA9IGZ1bmN0aW9uIChmbiwgcmV2ZXJzZSkge1xuICAgICAgdmFyIHRoaXMkMSQxID0gdGhpcztcblxuICAgICAgaWYgKHJldmVyc2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FjaGVSZXN1bHQoKS5fX2l0ZXJhdGUoZm4sIHJldmVyc2UpO1xuICAgICAgfVxuICAgICAgdmFyIGl0ZXJhdGlvbnMgPSAwO1xuICAgICAgY29sbGVjdGlvbi5fX2l0ZXJhdGUoXG4gICAgICAgIGZ1bmN0aW9uICh2LCBrLCBjKSB7IHJldHVybiBwcmVkaWNhdGUuY2FsbChjb250ZXh0LCB2LCBrLCBjKSAmJiArK2l0ZXJhdGlvbnMgJiYgZm4odiwgaywgdGhpcyQxJDEpOyB9XG4gICAgICApO1xuICAgICAgcmV0dXJuIGl0ZXJhdGlvbnM7XG4gICAgfTtcbiAgICB0YWtlU2VxdWVuY2UuX19pdGVyYXRvclVuY2FjaGVkID0gZnVuY3Rpb24gKHR5cGUsIHJldmVyc2UpIHtcbiAgICAgIHZhciB0aGlzJDEkMSA9IHRoaXM7XG5cbiAgICAgIGlmIChyZXZlcnNlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNhY2hlUmVzdWx0KCkuX19pdGVyYXRvcih0eXBlLCByZXZlcnNlKTtcbiAgICAgIH1cbiAgICAgIHZhciBpdGVyYXRvciA9IGNvbGxlY3Rpb24uX19pdGVyYXRvcihJVEVSQVRFX0VOVFJJRVMsIHJldmVyc2UpO1xuICAgICAgdmFyIGl0ZXJhdGluZyA9IHRydWU7XG4gICAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCFpdGVyYXRpbmcpIHtcbiAgICAgICAgICByZXR1cm4gaXRlcmF0b3JEb25lKCk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHN0ZXAgPSBpdGVyYXRvci5uZXh0KCk7XG4gICAgICAgIGlmIChzdGVwLmRvbmUpIHtcbiAgICAgICAgICByZXR1cm4gc3RlcDtcbiAgICAgICAgfVxuICAgICAgICB2YXIgZW50cnkgPSBzdGVwLnZhbHVlO1xuICAgICAgICB2YXIgayA9IGVudHJ5WzBdO1xuICAgICAgICB2YXIgdiA9IGVudHJ5WzFdO1xuICAgICAgICBpZiAoIXByZWRpY2F0ZS5jYWxsKGNvbnRleHQsIHYsIGssIHRoaXMkMSQxKSkge1xuICAgICAgICAgIGl0ZXJhdGluZyA9IGZhbHNlO1xuICAgICAgICAgIHJldHVybiBpdGVyYXRvckRvbmUoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHlwZSA9PT0gSVRFUkFURV9FTlRSSUVTID8gc3RlcCA6IGl0ZXJhdG9yVmFsdWUodHlwZSwgaywgdiwgc3RlcCk7XG4gICAgICB9KTtcbiAgICB9O1xuICAgIHJldHVybiB0YWtlU2VxdWVuY2U7XG4gIH1cblxuICBmdW5jdGlvbiBza2lwV2hpbGVGYWN0b3J5KGNvbGxlY3Rpb24sIHByZWRpY2F0ZSwgY29udGV4dCwgdXNlS2V5cykge1xuICAgIHZhciBza2lwU2VxdWVuY2UgPSBtYWtlU2VxdWVuY2UoY29sbGVjdGlvbik7XG4gICAgc2tpcFNlcXVlbmNlLl9faXRlcmF0ZVVuY2FjaGVkID0gZnVuY3Rpb24gKGZuLCByZXZlcnNlKSB7XG4gICAgICB2YXIgdGhpcyQxJDEgPSB0aGlzO1xuXG4gICAgICBpZiAocmV2ZXJzZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5jYWNoZVJlc3VsdCgpLl9faXRlcmF0ZShmbiwgcmV2ZXJzZSk7XG4gICAgICB9XG4gICAgICB2YXIgaXNTa2lwcGluZyA9IHRydWU7XG4gICAgICB2YXIgaXRlcmF0aW9ucyA9IDA7XG4gICAgICBjb2xsZWN0aW9uLl9faXRlcmF0ZShmdW5jdGlvbiAodiwgaywgYykge1xuICAgICAgICBpZiAoIShpc1NraXBwaW5nICYmIChpc1NraXBwaW5nID0gcHJlZGljYXRlLmNhbGwoY29udGV4dCwgdiwgaywgYykpKSkge1xuICAgICAgICAgIGl0ZXJhdGlvbnMrKztcbiAgICAgICAgICByZXR1cm4gZm4odiwgdXNlS2V5cyA/IGsgOiBpdGVyYXRpb25zIC0gMSwgdGhpcyQxJDEpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBpdGVyYXRpb25zO1xuICAgIH07XG4gICAgc2tpcFNlcXVlbmNlLl9faXRlcmF0b3JVbmNhY2hlZCA9IGZ1bmN0aW9uICh0eXBlLCByZXZlcnNlKSB7XG4gICAgICB2YXIgdGhpcyQxJDEgPSB0aGlzO1xuXG4gICAgICBpZiAocmV2ZXJzZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5jYWNoZVJlc3VsdCgpLl9faXRlcmF0b3IodHlwZSwgcmV2ZXJzZSk7XG4gICAgICB9XG4gICAgICB2YXIgaXRlcmF0b3IgPSBjb2xsZWN0aW9uLl9faXRlcmF0b3IoSVRFUkFURV9FTlRSSUVTLCByZXZlcnNlKTtcbiAgICAgIHZhciBza2lwcGluZyA9IHRydWU7XG4gICAgICB2YXIgaXRlcmF0aW9ucyA9IDA7XG4gICAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHN0ZXA7XG4gICAgICAgIHZhciBrO1xuICAgICAgICB2YXIgdjtcbiAgICAgICAgZG8ge1xuICAgICAgICAgIHN0ZXAgPSBpdGVyYXRvci5uZXh0KCk7XG4gICAgICAgICAgaWYgKHN0ZXAuZG9uZSkge1xuICAgICAgICAgICAgaWYgKHVzZUtleXMgfHwgdHlwZSA9PT0gSVRFUkFURV9WQUxVRVMpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHN0ZXA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodHlwZSA9PT0gSVRFUkFURV9LRVlTKSB7XG4gICAgICAgICAgICAgIHJldHVybiBpdGVyYXRvclZhbHVlKHR5cGUsIGl0ZXJhdGlvbnMrKywgdW5kZWZpbmVkLCBzdGVwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBpdGVyYXRvclZhbHVlKHR5cGUsIGl0ZXJhdGlvbnMrKywgc3RlcC52YWx1ZVsxXSwgc3RlcCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHZhciBlbnRyeSA9IHN0ZXAudmFsdWU7XG4gICAgICAgICAgayA9IGVudHJ5WzBdO1xuICAgICAgICAgIHYgPSBlbnRyeVsxXTtcbiAgICAgICAgICBza2lwcGluZyAmJiAoc2tpcHBpbmcgPSBwcmVkaWNhdGUuY2FsbChjb250ZXh0LCB2LCBrLCB0aGlzJDEkMSkpO1xuICAgICAgICB9IHdoaWxlIChza2lwcGluZyk7XG4gICAgICAgIHJldHVybiB0eXBlID09PSBJVEVSQVRFX0VOVFJJRVMgPyBzdGVwIDogaXRlcmF0b3JWYWx1ZSh0eXBlLCBrLCB2LCBzdGVwKTtcbiAgICAgIH0pO1xuICAgIH07XG4gICAgcmV0dXJuIHNraXBTZXF1ZW5jZTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNvbmNhdEZhY3RvcnkoY29sbGVjdGlvbiwgdmFsdWVzKSB7XG4gICAgdmFyIGlzS2V5ZWRDb2xsZWN0aW9uID0gaXNLZXllZChjb2xsZWN0aW9uKTtcbiAgICB2YXIgaXRlcnMgPSBbY29sbGVjdGlvbl1cbiAgICAgIC5jb25jYXQodmFsdWVzKVxuICAgICAgLm1hcChmdW5jdGlvbiAodikge1xuICAgICAgICBpZiAoIWlzQ29sbGVjdGlvbih2KSkge1xuICAgICAgICAgIHYgPSBpc0tleWVkQ29sbGVjdGlvblxuICAgICAgICAgICAgPyBrZXllZFNlcUZyb21WYWx1ZSh2KVxuICAgICAgICAgICAgOiBpbmRleGVkU2VxRnJvbVZhbHVlKEFycmF5LmlzQXJyYXkodikgPyB2IDogW3ZdKTtcbiAgICAgICAgfSBlbHNlIGlmIChpc0tleWVkQ29sbGVjdGlvbikge1xuICAgICAgICAgIHYgPSBLZXllZENvbGxlY3Rpb24odik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHY7XG4gICAgICB9KVxuICAgICAgLmZpbHRlcihmdW5jdGlvbiAodikgeyByZXR1cm4gdi5zaXplICE9PSAwOyB9KTtcblxuICAgIGlmIChpdGVycy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBjb2xsZWN0aW9uO1xuICAgIH1cblxuICAgIGlmIChpdGVycy5sZW5ndGggPT09IDEpIHtcbiAgICAgIHZhciBzaW5nbGV0b24gPSBpdGVyc1swXTtcbiAgICAgIGlmIChcbiAgICAgICAgc2luZ2xldG9uID09PSBjb2xsZWN0aW9uIHx8XG4gICAgICAgIChpc0tleWVkQ29sbGVjdGlvbiAmJiBpc0tleWVkKHNpbmdsZXRvbikpIHx8XG4gICAgICAgIChpc0luZGV4ZWQoY29sbGVjdGlvbikgJiYgaXNJbmRleGVkKHNpbmdsZXRvbikpXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIHNpbmdsZXRvbjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgY29uY2F0U2VxID0gbmV3IEFycmF5U2VxKGl0ZXJzKTtcbiAgICBpZiAoaXNLZXllZENvbGxlY3Rpb24pIHtcbiAgICAgIGNvbmNhdFNlcSA9IGNvbmNhdFNlcS50b0tleWVkU2VxKCk7XG4gICAgfSBlbHNlIGlmICghaXNJbmRleGVkKGNvbGxlY3Rpb24pKSB7XG4gICAgICBjb25jYXRTZXEgPSBjb25jYXRTZXEudG9TZXRTZXEoKTtcbiAgICB9XG4gICAgY29uY2F0U2VxID0gY29uY2F0U2VxLmZsYXR0ZW4odHJ1ZSk7XG4gICAgY29uY2F0U2VxLnNpemUgPSBpdGVycy5yZWR1Y2UoZnVuY3Rpb24gKHN1bSwgc2VxKSB7XG4gICAgICBpZiAoc3VtICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdmFyIHNpemUgPSBzZXEuc2l6ZTtcbiAgICAgICAgaWYgKHNpemUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJldHVybiBzdW0gKyBzaXplO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwgMCk7XG4gICAgcmV0dXJuIGNvbmNhdFNlcTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZsYXR0ZW5GYWN0b3J5KGNvbGxlY3Rpb24sIGRlcHRoLCB1c2VLZXlzKSB7XG4gICAgdmFyIGZsYXRTZXF1ZW5jZSA9IG1ha2VTZXF1ZW5jZShjb2xsZWN0aW9uKTtcbiAgICBmbGF0U2VxdWVuY2UuX19pdGVyYXRlVW5jYWNoZWQgPSBmdW5jdGlvbiAoZm4sIHJldmVyc2UpIHtcbiAgICAgIGlmIChyZXZlcnNlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNhY2hlUmVzdWx0KCkuX19pdGVyYXRlKGZuLCByZXZlcnNlKTtcbiAgICAgIH1cbiAgICAgIHZhciBpdGVyYXRpb25zID0gMDtcbiAgICAgIHZhciBzdG9wcGVkID0gZmFsc2U7XG4gICAgICBmdW5jdGlvbiBmbGF0RGVlcChpdGVyLCBjdXJyZW50RGVwdGgpIHtcbiAgICAgICAgaXRlci5fX2l0ZXJhdGUoZnVuY3Rpb24gKHYsIGspIHtcbiAgICAgICAgICBpZiAoKCFkZXB0aCB8fCBjdXJyZW50RGVwdGggPCBkZXB0aCkgJiYgaXNDb2xsZWN0aW9uKHYpKSB7XG4gICAgICAgICAgICBmbGF0RGVlcCh2LCBjdXJyZW50RGVwdGggKyAxKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaXRlcmF0aW9ucysrO1xuICAgICAgICAgICAgaWYgKGZuKHYsIHVzZUtleXMgPyBrIDogaXRlcmF0aW9ucyAtIDEsIGZsYXRTZXF1ZW5jZSkgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgIHN0b3BwZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gIXN0b3BwZWQ7XG4gICAgICAgIH0sIHJldmVyc2UpO1xuICAgICAgfVxuICAgICAgZmxhdERlZXAoY29sbGVjdGlvbiwgMCk7XG4gICAgICByZXR1cm4gaXRlcmF0aW9ucztcbiAgICB9O1xuICAgIGZsYXRTZXF1ZW5jZS5fX2l0ZXJhdG9yVW5jYWNoZWQgPSBmdW5jdGlvbiAodHlwZSwgcmV2ZXJzZSkge1xuICAgICAgaWYgKHJldmVyc2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FjaGVSZXN1bHQoKS5fX2l0ZXJhdG9yKHR5cGUsIHJldmVyc2UpO1xuICAgICAgfVxuICAgICAgdmFyIGl0ZXJhdG9yID0gY29sbGVjdGlvbi5fX2l0ZXJhdG9yKHR5cGUsIHJldmVyc2UpO1xuICAgICAgdmFyIHN0YWNrID0gW107XG4gICAgICB2YXIgaXRlcmF0aW9ucyA9IDA7XG4gICAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgd2hpbGUgKGl0ZXJhdG9yKSB7XG4gICAgICAgICAgdmFyIHN0ZXAgPSBpdGVyYXRvci5uZXh0KCk7XG4gICAgICAgICAgaWYgKHN0ZXAuZG9uZSAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgIGl0ZXJhdG9yID0gc3RhY2sucG9wKCk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdmFyIHYgPSBzdGVwLnZhbHVlO1xuICAgICAgICAgIGlmICh0eXBlID09PSBJVEVSQVRFX0VOVFJJRVMpIHtcbiAgICAgICAgICAgIHYgPSB2WzFdO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoKCFkZXB0aCB8fCBzdGFjay5sZW5ndGggPCBkZXB0aCkgJiYgaXNDb2xsZWN0aW9uKHYpKSB7XG4gICAgICAgICAgICBzdGFjay5wdXNoKGl0ZXJhdG9yKTtcbiAgICAgICAgICAgIGl0ZXJhdG9yID0gdi5fX2l0ZXJhdG9yKHR5cGUsIHJldmVyc2UpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdXNlS2V5cyA/IHN0ZXAgOiBpdGVyYXRvclZhbHVlKHR5cGUsIGl0ZXJhdGlvbnMrKywgdiwgc3RlcCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpdGVyYXRvckRvbmUoKTtcbiAgICAgIH0pO1xuICAgIH07XG4gICAgcmV0dXJuIGZsYXRTZXF1ZW5jZTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZsYXRNYXBGYWN0b3J5KGNvbGxlY3Rpb24sIG1hcHBlciwgY29udGV4dCkge1xuICAgIHZhciBjb2VyY2UgPSBjb2xsZWN0aW9uQ2xhc3MoY29sbGVjdGlvbik7XG4gICAgcmV0dXJuIGNvbGxlY3Rpb25cbiAgICAgIC50b1NlcSgpXG4gICAgICAubWFwKGZ1bmN0aW9uICh2LCBrKSB7IHJldHVybiBjb2VyY2UobWFwcGVyLmNhbGwoY29udGV4dCwgdiwgaywgY29sbGVjdGlvbikpOyB9KVxuICAgICAgLmZsYXR0ZW4odHJ1ZSk7XG4gIH1cblxuICBmdW5jdGlvbiBpbnRlcnBvc2VGYWN0b3J5KGNvbGxlY3Rpb24sIHNlcGFyYXRvcikge1xuICAgIHZhciBpbnRlcnBvc2VkU2VxdWVuY2UgPSBtYWtlU2VxdWVuY2UoY29sbGVjdGlvbik7XG4gICAgaW50ZXJwb3NlZFNlcXVlbmNlLnNpemUgPSBjb2xsZWN0aW9uLnNpemUgJiYgY29sbGVjdGlvbi5zaXplICogMiAtIDE7XG4gICAgaW50ZXJwb3NlZFNlcXVlbmNlLl9faXRlcmF0ZVVuY2FjaGVkID0gZnVuY3Rpb24gKGZuLCByZXZlcnNlKSB7XG4gICAgICB2YXIgdGhpcyQxJDEgPSB0aGlzO1xuXG4gICAgICB2YXIgaXRlcmF0aW9ucyA9IDA7XG4gICAgICBjb2xsZWN0aW9uLl9faXRlcmF0ZShcbiAgICAgICAgZnVuY3Rpb24gKHYpIHsgcmV0dXJuICghaXRlcmF0aW9ucyB8fCBmbihzZXBhcmF0b3IsIGl0ZXJhdGlvbnMrKywgdGhpcyQxJDEpICE9PSBmYWxzZSkgJiZcbiAgICAgICAgICBmbih2LCBpdGVyYXRpb25zKyssIHRoaXMkMSQxKSAhPT0gZmFsc2U7IH0sXG4gICAgICAgIHJldmVyc2VcbiAgICAgICk7XG4gICAgICByZXR1cm4gaXRlcmF0aW9ucztcbiAgICB9O1xuICAgIGludGVycG9zZWRTZXF1ZW5jZS5fX2l0ZXJhdG9yVW5jYWNoZWQgPSBmdW5jdGlvbiAodHlwZSwgcmV2ZXJzZSkge1xuICAgICAgdmFyIGl0ZXJhdG9yID0gY29sbGVjdGlvbi5fX2l0ZXJhdG9yKElURVJBVEVfVkFMVUVTLCByZXZlcnNlKTtcbiAgICAgIHZhciBpdGVyYXRpb25zID0gMDtcbiAgICAgIHZhciBzdGVwO1xuICAgICAgcmV0dXJuIG5ldyBJdGVyYXRvcihmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICghc3RlcCB8fCBpdGVyYXRpb25zICUgMikge1xuICAgICAgICAgIHN0ZXAgPSBpdGVyYXRvci5uZXh0KCk7XG4gICAgICAgICAgaWYgKHN0ZXAuZG9uZSkge1xuICAgICAgICAgICAgcmV0dXJuIHN0ZXA7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpdGVyYXRpb25zICUgMlxuICAgICAgICAgID8gaXRlcmF0b3JWYWx1ZSh0eXBlLCBpdGVyYXRpb25zKyssIHNlcGFyYXRvcilcbiAgICAgICAgICA6IGl0ZXJhdG9yVmFsdWUodHlwZSwgaXRlcmF0aW9ucysrLCBzdGVwLnZhbHVlLCBzdGVwKTtcbiAgICAgIH0pO1xuICAgIH07XG4gICAgcmV0dXJuIGludGVycG9zZWRTZXF1ZW5jZTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHNvcnRGYWN0b3J5KGNvbGxlY3Rpb24sIGNvbXBhcmF0b3IsIG1hcHBlcikge1xuICAgIGlmICghY29tcGFyYXRvcikge1xuICAgICAgY29tcGFyYXRvciA9IGRlZmF1bHRDb21wYXJhdG9yO1xuICAgIH1cbiAgICB2YXIgaXNLZXllZENvbGxlY3Rpb24gPSBpc0tleWVkKGNvbGxlY3Rpb24pO1xuICAgIHZhciBpbmRleCA9IDA7XG4gICAgdmFyIGVudHJpZXMgPSBjb2xsZWN0aW9uXG4gICAgICAudG9TZXEoKVxuICAgICAgLm1hcChmdW5jdGlvbiAodiwgaykgeyByZXR1cm4gW2ssIHYsIGluZGV4KyssIG1hcHBlciA/IG1hcHBlcih2LCBrLCBjb2xsZWN0aW9uKSA6IHZdOyB9KVxuICAgICAgLnZhbHVlU2VxKClcbiAgICAgIC50b0FycmF5KCk7XG4gICAgZW50cmllc1xuICAgICAgLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuIGNvbXBhcmF0b3IoYVszXSwgYlszXSkgfHwgYVsyXSAtIGJbMl07IH0pXG4gICAgICAuZm9yRWFjaChcbiAgICAgICAgaXNLZXllZENvbGxlY3Rpb25cbiAgICAgICAgICA/IGZ1bmN0aW9uICh2LCBpKSB7XG4gICAgICAgICAgICAgIGVudHJpZXNbaV0ubGVuZ3RoID0gMjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICA6IGZ1bmN0aW9uICh2LCBpKSB7XG4gICAgICAgICAgICAgIGVudHJpZXNbaV0gPSB2WzFdO1xuICAgICAgICAgICAgfVxuICAgICAgKTtcbiAgICByZXR1cm4gaXNLZXllZENvbGxlY3Rpb25cbiAgICAgID8gS2V5ZWRTZXEoZW50cmllcylcbiAgICAgIDogaXNJbmRleGVkKGNvbGxlY3Rpb24pXG4gICAgICA/IEluZGV4ZWRTZXEoZW50cmllcylcbiAgICAgIDogU2V0U2VxKGVudHJpZXMpO1xuICB9XG5cbiAgZnVuY3Rpb24gbWF4RmFjdG9yeShjb2xsZWN0aW9uLCBjb21wYXJhdG9yLCBtYXBwZXIpIHtcbiAgICBpZiAoIWNvbXBhcmF0b3IpIHtcbiAgICAgIGNvbXBhcmF0b3IgPSBkZWZhdWx0Q29tcGFyYXRvcjtcbiAgICB9XG4gICAgaWYgKG1hcHBlcikge1xuICAgICAgdmFyIGVudHJ5ID0gY29sbGVjdGlvblxuICAgICAgICAudG9TZXEoKVxuICAgICAgICAubWFwKGZ1bmN0aW9uICh2LCBrKSB7IHJldHVybiBbdiwgbWFwcGVyKHYsIGssIGNvbGxlY3Rpb24pXTsgfSlcbiAgICAgICAgLnJlZHVjZShmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4gKG1heENvbXBhcmUoY29tcGFyYXRvciwgYVsxXSwgYlsxXSkgPyBiIDogYSk7IH0pO1xuICAgICAgcmV0dXJuIGVudHJ5ICYmIGVudHJ5WzBdO1xuICAgIH1cbiAgICByZXR1cm4gY29sbGVjdGlvbi5yZWR1Y2UoZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuIChtYXhDb21wYXJlKGNvbXBhcmF0b3IsIGEsIGIpID8gYiA6IGEpOyB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG1heENvbXBhcmUoY29tcGFyYXRvciwgYSwgYikge1xuICAgIHZhciBjb21wID0gY29tcGFyYXRvcihiLCBhKTtcbiAgICAvLyBiIGlzIGNvbnNpZGVyZWQgdGhlIG5ldyBtYXggaWYgdGhlIGNvbXBhcmF0b3IgZGVjbGFyZXMgdGhlbSBlcXVhbCwgYnV0XG4gICAgLy8gdGhleSBhcmUgbm90IGVxdWFsIGFuZCBiIGlzIGluIGZhY3QgYSBudWxsaXNoIHZhbHVlLlxuICAgIHJldHVybiAoXG4gICAgICAoY29tcCA9PT0gMCAmJiBiICE9PSBhICYmIChiID09PSB1bmRlZmluZWQgfHwgYiA9PT0gbnVsbCB8fCBiICE9PSBiKSkgfHxcbiAgICAgIGNvbXAgPiAwXG4gICAgKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHppcFdpdGhGYWN0b3J5KGtleUl0ZXIsIHppcHBlciwgaXRlcnMsIHppcEFsbCkge1xuICAgIHZhciB6aXBTZXF1ZW5jZSA9IG1ha2VTZXF1ZW5jZShrZXlJdGVyKTtcbiAgICB2YXIgc2l6ZXMgPSBuZXcgQXJyYXlTZXEoaXRlcnMpLm1hcChmdW5jdGlvbiAoaSkgeyByZXR1cm4gaS5zaXplOyB9KTtcbiAgICB6aXBTZXF1ZW5jZS5zaXplID0gemlwQWxsID8gc2l6ZXMubWF4KCkgOiBzaXplcy5taW4oKTtcbiAgICAvLyBOb3RlOiB0aGlzIGEgZ2VuZXJpYyBiYXNlIGltcGxlbWVudGF0aW9uIG9mIF9faXRlcmF0ZSBpbiB0ZXJtcyBvZlxuICAgIC8vIF9faXRlcmF0b3Igd2hpY2ggbWF5IGJlIG1vcmUgZ2VuZXJpY2FsbHkgdXNlZnVsIGluIHRoZSBmdXR1cmUuXG4gICAgemlwU2VxdWVuY2UuX19pdGVyYXRlID0gZnVuY3Rpb24gKGZuLCByZXZlcnNlKSB7XG4gICAgICAvKiBnZW5lcmljOlxuICAgICAgdmFyIGl0ZXJhdG9yID0gdGhpcy5fX2l0ZXJhdG9yKElURVJBVEVfRU5UUklFUywgcmV2ZXJzZSk7XG4gICAgICB2YXIgc3RlcDtcbiAgICAgIHZhciBpdGVyYXRpb25zID0gMDtcbiAgICAgIHdoaWxlICghKHN0ZXAgPSBpdGVyYXRvci5uZXh0KCkpLmRvbmUpIHtcbiAgICAgICAgaXRlcmF0aW9ucysrO1xuICAgICAgICBpZiAoZm4oc3RlcC52YWx1ZVsxXSwgc3RlcC52YWx1ZVswXSwgdGhpcykgPT09IGZhbHNlKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBpdGVyYXRpb25zO1xuICAgICAgKi9cbiAgICAgIC8vIGluZGV4ZWQ6XG4gICAgICB2YXIgaXRlcmF0b3IgPSB0aGlzLl9faXRlcmF0b3IoSVRFUkFURV9WQUxVRVMsIHJldmVyc2UpO1xuICAgICAgdmFyIHN0ZXA7XG4gICAgICB2YXIgaXRlcmF0aW9ucyA9IDA7XG4gICAgICB3aGlsZSAoIShzdGVwID0gaXRlcmF0b3IubmV4dCgpKS5kb25lKSB7XG4gICAgICAgIGlmIChmbihzdGVwLnZhbHVlLCBpdGVyYXRpb25zKyssIHRoaXMpID09PSBmYWxzZSkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gaXRlcmF0aW9ucztcbiAgICB9O1xuICAgIHppcFNlcXVlbmNlLl9faXRlcmF0b3JVbmNhY2hlZCA9IGZ1bmN0aW9uICh0eXBlLCByZXZlcnNlKSB7XG4gICAgICB2YXIgaXRlcmF0b3JzID0gaXRlcnMubWFwKFxuICAgICAgICBmdW5jdGlvbiAoaSkgeyByZXR1cm4gKChpID0gQ29sbGVjdGlvbihpKSksIGdldEl0ZXJhdG9yKHJldmVyc2UgPyBpLnJldmVyc2UoKSA6IGkpKTsgfVxuICAgICAgKTtcbiAgICAgIHZhciBpdGVyYXRpb25zID0gMDtcbiAgICAgIHZhciBpc0RvbmUgPSBmYWxzZTtcbiAgICAgIHJldHVybiBuZXcgSXRlcmF0b3IoZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgc3RlcHM7XG4gICAgICAgIGlmICghaXNEb25lKSB7XG4gICAgICAgICAgc3RlcHMgPSBpdGVyYXRvcnMubWFwKGZ1bmN0aW9uIChpKSB7IHJldHVybiBpLm5leHQoKTsgfSk7XG4gICAgICAgICAgaXNEb25lID0gemlwQWxsID8gc3RlcHMuZXZlcnkoZnVuY3Rpb24gKHMpIHsgcmV0dXJuIHMuZG9uZTsgfSkgOiBzdGVwcy5zb21lKGZ1bmN0aW9uIChzKSB7IHJldHVybiBzLmRvbmU7IH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc0RvbmUpIHtcbiAgICAgICAgICByZXR1cm4gaXRlcmF0b3JEb25lKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGl0ZXJhdG9yVmFsdWUoXG4gICAgICAgICAgdHlwZSxcbiAgICAgICAgICBpdGVyYXRpb25zKyssXG4gICAgICAgICAgemlwcGVyLmFwcGx5KFxuICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgIHN0ZXBzLm1hcChmdW5jdGlvbiAocykgeyByZXR1cm4gcy52YWx1ZTsgfSlcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICB9O1xuICAgIHJldHVybiB6aXBTZXF1ZW5jZTtcbiAgfVxuXG4gIC8vICNwcmFnbWEgSGVscGVyIEZ1bmN0aW9uc1xuXG4gIGZ1bmN0aW9uIHJlaWZ5KGl0ZXIsIHNlcSkge1xuICAgIHJldHVybiBpdGVyID09PSBzZXEgPyBpdGVyIDogaXNTZXEoaXRlcikgPyBzZXEgOiBpdGVyLmNvbnN0cnVjdG9yKHNlcSk7XG4gIH1cblxuICBmdW5jdGlvbiB2YWxpZGF0ZUVudHJ5KGVudHJ5KSB7XG4gICAgaWYgKGVudHJ5ICE9PSBPYmplY3QoZW50cnkpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBbSywgVl0gdHVwbGU6ICcgKyBlbnRyeSk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gY29sbGVjdGlvbkNsYXNzKGNvbGxlY3Rpb24pIHtcbiAgICByZXR1cm4gaXNLZXllZChjb2xsZWN0aW9uKVxuICAgICAgPyBLZXllZENvbGxlY3Rpb25cbiAgICAgIDogaXNJbmRleGVkKGNvbGxlY3Rpb24pXG4gICAgICA/IEluZGV4ZWRDb2xsZWN0aW9uXG4gICAgICA6IFNldENvbGxlY3Rpb247XG4gIH1cblxuICBmdW5jdGlvbiBtYWtlU2VxdWVuY2UoY29sbGVjdGlvbikge1xuICAgIHJldHVybiBPYmplY3QuY3JlYXRlKFxuICAgICAgKGlzS2V5ZWQoY29sbGVjdGlvbilcbiAgICAgICAgPyBLZXllZFNlcVxuICAgICAgICA6IGlzSW5kZXhlZChjb2xsZWN0aW9uKVxuICAgICAgICA/IEluZGV4ZWRTZXFcbiAgICAgICAgOiBTZXRTZXFcbiAgICAgICkucHJvdG90eXBlXG4gICAgKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNhY2hlUmVzdWx0VGhyb3VnaCgpIHtcbiAgICBpZiAodGhpcy5faXRlci5jYWNoZVJlc3VsdCkge1xuICAgICAgdGhpcy5faXRlci5jYWNoZVJlc3VsdCgpO1xuICAgICAgdGhpcy5zaXplID0gdGhpcy5faXRlci5zaXplO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHJldHVybiBTZXEucHJvdG90eXBlLmNhY2hlUmVzdWx0LmNhbGwodGhpcyk7XG4gIH1cblxuICBmdW5jdGlvbiBkZWZhdWx0Q29tcGFyYXRvcihhLCBiKSB7XG4gICAgaWYgKGEgPT09IHVuZGVmaW5lZCAmJiBiID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIGlmIChhID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiAxO1xuICAgIH1cblxuICAgIGlmIChiID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiAtMTtcbiAgICB9XG5cbiAgICByZXR1cm4gYSA+IGIgPyAxIDogYSA8IGIgPyAtMSA6IDA7XG4gIH1cblxuICBmdW5jdGlvbiBhcnJDb3B5KGFyciwgb2Zmc2V0KSB7XG4gICAgb2Zmc2V0ID0gb2Zmc2V0IHx8IDA7XG4gICAgdmFyIGxlbiA9IE1hdGgubWF4KDAsIGFyci5sZW5ndGggLSBvZmZzZXQpO1xuICAgIHZhciBuZXdBcnIgPSBuZXcgQXJyYXkobGVuKTtcbiAgICBmb3IgKHZhciBpaSA9IDA7IGlpIDwgbGVuOyBpaSsrKSB7XG4gICAgICBuZXdBcnJbaWldID0gYXJyW2lpICsgb2Zmc2V0XTtcbiAgICB9XG4gICAgcmV0dXJuIG5ld0FycjtcbiAgfVxuXG4gIGZ1bmN0aW9uIGludmFyaWFudChjb25kaXRpb24sIGVycm9yKSB7XG4gICAgaWYgKCFjb25kaXRpb24pIHsgdGhyb3cgbmV3IEVycm9yKGVycm9yKTsgfVxuICB9XG5cbiAgZnVuY3Rpb24gYXNzZXJ0Tm90SW5maW5pdGUoc2l6ZSkge1xuICAgIGludmFyaWFudChcbiAgICAgIHNpemUgIT09IEluZmluaXR5LFxuICAgICAgJ0Nhbm5vdCBwZXJmb3JtIHRoaXMgYWN0aW9uIHdpdGggYW4gaW5maW5pdGUgc2l6ZS4nXG4gICAgKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNvZXJjZUtleVBhdGgoa2V5UGF0aCkge1xuICAgIGlmIChpc0FycmF5TGlrZShrZXlQYXRoKSAmJiB0eXBlb2Yga2V5UGF0aCAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBrZXlQYXRoO1xuICAgIH1cbiAgICBpZiAoaXNPcmRlcmVkKGtleVBhdGgpKSB7XG4gICAgICByZXR1cm4ga2V5UGF0aC50b0FycmF5KCk7XG4gICAgfVxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAnSW52YWxpZCBrZXlQYXRoOiBleHBlY3RlZCBPcmRlcmVkIENvbGxlY3Rpb24gb3IgQXJyYXk6ICcgKyBrZXlQYXRoXG4gICAgKTtcbiAgfVxuXG4gIHZhciB0b1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XG5cbiAgZnVuY3Rpb24gaXNQbGFpbk9iamVjdCh2YWx1ZSkge1xuICAgIC8vIFRoZSBiYXNlIHByb3RvdHlwZSdzIHRvU3RyaW5nIGRlYWxzIHdpdGggQXJndW1lbnQgb2JqZWN0cyBhbmQgbmF0aXZlIG5hbWVzcGFjZXMgbGlrZSBNYXRoXG4gICAgaWYgKFxuICAgICAgIXZhbHVlIHx8XG4gICAgICB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnIHx8XG4gICAgICB0b1N0cmluZy5jYWxsKHZhbHVlKSAhPT0gJ1tvYmplY3QgT2JqZWN0XSdcbiAgICApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICB2YXIgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YodmFsdWUpO1xuICAgIGlmIChwcm90byA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gSXRlcmF0aXZlbHkgZ29pbmcgdXAgdGhlIHByb3RvdHlwZSBjaGFpbiBpcyBuZWVkZWQgZm9yIGNyb3NzLXJlYWxtIGVudmlyb25tZW50cyAoZGlmZmVyaW5nIGNvbnRleHRzLCBpZnJhbWVzLCBldGMpXG4gICAgdmFyIHBhcmVudFByb3RvID0gcHJvdG87XG4gICAgdmFyIG5leHRQcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihwcm90byk7XG4gICAgd2hpbGUgKG5leHRQcm90byAhPT0gbnVsbCkge1xuICAgICAgcGFyZW50UHJvdG8gPSBuZXh0UHJvdG87XG4gICAgICBuZXh0UHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YocGFyZW50UHJvdG8pO1xuICAgIH1cbiAgICByZXR1cm4gcGFyZW50UHJvdG8gPT09IHByb3RvO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgdmFsdWUgaXMgYSBwb3RlbnRpYWxseS1wZXJzaXN0ZW50IGRhdGEgc3RydWN0dXJlLCBlaXRoZXJcbiAgICogcHJvdmlkZWQgYnkgSW1tdXRhYmxlLmpzIG9yIGEgcGxhaW4gQXJyYXkgb3IgT2JqZWN0LlxuICAgKi9cbiAgZnVuY3Rpb24gaXNEYXRhU3RydWN0dXJlKHZhbHVlKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiZcbiAgICAgIChpc0ltbXV0YWJsZSh2YWx1ZSkgfHwgQXJyYXkuaXNBcnJheSh2YWx1ZSkgfHwgaXNQbGFpbk9iamVjdCh2YWx1ZSkpXG4gICAgKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHF1b3RlU3RyaW5nKHZhbHVlKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnID8gSlNPTi5zdHJpbmdpZnkodmFsdWUpIDogU3RyaW5nKHZhbHVlKTtcbiAgICB9IGNhdGNoIChfaWdub3JlRXJyb3IpIHtcbiAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gaGFzKGNvbGxlY3Rpb24sIGtleSkge1xuICAgIHJldHVybiBpc0ltbXV0YWJsZShjb2xsZWN0aW9uKVxuICAgICAgPyBjb2xsZWN0aW9uLmhhcyhrZXkpXG4gICAgICA6IGlzRGF0YVN0cnVjdHVyZShjb2xsZWN0aW9uKSAmJiBoYXNPd25Qcm9wZXJ0eS5jYWxsKGNvbGxlY3Rpb24sIGtleSk7XG4gIH1cblxuICBmdW5jdGlvbiBnZXQoY29sbGVjdGlvbiwga2V5LCBub3RTZXRWYWx1ZSkge1xuICAgIHJldHVybiBpc0ltbXV0YWJsZShjb2xsZWN0aW9uKVxuICAgICAgPyBjb2xsZWN0aW9uLmdldChrZXksIG5vdFNldFZhbHVlKVxuICAgICAgOiAhaGFzKGNvbGxlY3Rpb24sIGtleSlcbiAgICAgID8gbm90U2V0VmFsdWVcbiAgICAgIDogdHlwZW9mIGNvbGxlY3Rpb24uZ2V0ID09PSAnZnVuY3Rpb24nXG4gICAgICA/IGNvbGxlY3Rpb24uZ2V0KGtleSlcbiAgICAgIDogY29sbGVjdGlvbltrZXldO1xuICB9XG5cbiAgZnVuY3Rpb24gc2hhbGxvd0NvcHkoZnJvbSkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGZyb20pKSB7XG4gICAgICByZXR1cm4gYXJyQ29weShmcm9tKTtcbiAgICB9XG4gICAgdmFyIHRvID0ge307XG4gICAgZm9yICh2YXIga2V5IGluIGZyb20pIHtcbiAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKGZyb20sIGtleSkpIHtcbiAgICAgICAgdG9ba2V5XSA9IGZyb21ba2V5XTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRvO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVtb3ZlKGNvbGxlY3Rpb24sIGtleSkge1xuICAgIGlmICghaXNEYXRhU3RydWN0dXJlKGNvbGxlY3Rpb24pKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAnQ2Fubm90IHVwZGF0ZSBub24tZGF0YS1zdHJ1Y3R1cmUgdmFsdWU6ICcgKyBjb2xsZWN0aW9uXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoaXNJbW11dGFibGUoY29sbGVjdGlvbikpIHtcbiAgICAgIGlmICghY29sbGVjdGlvbi5yZW1vdmUpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgICAnQ2Fubm90IHVwZGF0ZSBpbW11dGFibGUgdmFsdWUgd2l0aG91dCAucmVtb3ZlKCkgbWV0aG9kOiAnICsgY29sbGVjdGlvblxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNvbGxlY3Rpb24ucmVtb3ZlKGtleSk7XG4gICAgfVxuICAgIGlmICghaGFzT3duUHJvcGVydHkuY2FsbChjb2xsZWN0aW9uLCBrZXkpKSB7XG4gICAgICByZXR1cm4gY29sbGVjdGlvbjtcbiAgICB9XG4gICAgdmFyIGNvbGxlY3Rpb25Db3B5ID0gc2hhbGxvd0NvcHkoY29sbGVjdGlvbik7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoY29sbGVjdGlvbkNvcHkpKSB7XG4gICAgICBjb2xsZWN0aW9uQ29weS5zcGxpY2Uoa2V5LCAxKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGVsZXRlIGNvbGxlY3Rpb25Db3B5W2tleV07XG4gICAgfVxuICAgIHJldHVybiBjb2xsZWN0aW9uQ29weTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHNldChjb2xsZWN0aW9uLCBrZXksIHZhbHVlKSB7XG4gICAgaWYgKCFpc0RhdGFTdHJ1Y3R1cmUoY29sbGVjdGlvbikpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICdDYW5ub3QgdXBkYXRlIG5vbi1kYXRhLXN0cnVjdHVyZSB2YWx1ZTogJyArIGNvbGxlY3Rpb25cbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChpc0ltbXV0YWJsZShjb2xsZWN0aW9uKSkge1xuICAgICAgaWYgKCFjb2xsZWN0aW9uLnNldCkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgICdDYW5ub3QgdXBkYXRlIGltbXV0YWJsZSB2YWx1ZSB3aXRob3V0IC5zZXQoKSBtZXRob2Q6ICcgKyBjb2xsZWN0aW9uXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm4gY29sbGVjdGlvbi5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgfVxuICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKGNvbGxlY3Rpb24sIGtleSkgJiYgdmFsdWUgPT09IGNvbGxlY3Rpb25ba2V5XSkge1xuICAgICAgcmV0dXJuIGNvbGxlY3Rpb247XG4gICAgfVxuICAgIHZhciBjb2xsZWN0aW9uQ29weSA9IHNoYWxsb3dDb3B5KGNvbGxlY3Rpb24pO1xuICAgIGNvbGxlY3Rpb25Db3B5W2tleV0gPSB2YWx1ZTtcbiAgICByZXR1cm4gY29sbGVjdGlvbkNvcHk7XG4gIH1cblxuICBmdW5jdGlvbiB1cGRhdGVJbiQxKGNvbGxlY3Rpb24sIGtleVBhdGgsIG5vdFNldFZhbHVlLCB1cGRhdGVyKSB7XG4gICAgaWYgKCF1cGRhdGVyKSB7XG4gICAgICB1cGRhdGVyID0gbm90U2V0VmFsdWU7XG4gICAgICBub3RTZXRWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgdmFyIHVwZGF0ZWRWYWx1ZSA9IHVwZGF0ZUluRGVlcGx5KFxuICAgICAgaXNJbW11dGFibGUoY29sbGVjdGlvbiksXG4gICAgICBjb2xsZWN0aW9uLFxuICAgICAgY29lcmNlS2V5UGF0aChrZXlQYXRoKSxcbiAgICAgIDAsXG4gICAgICBub3RTZXRWYWx1ZSxcbiAgICAgIHVwZGF0ZXJcbiAgICApO1xuICAgIHJldHVybiB1cGRhdGVkVmFsdWUgPT09IE5PVF9TRVQgPyBub3RTZXRWYWx1ZSA6IHVwZGF0ZWRWYWx1ZTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHVwZGF0ZUluRGVlcGx5KFxuICAgIGluSW1tdXRhYmxlLFxuICAgIGV4aXN0aW5nLFxuICAgIGtleVBhdGgsXG4gICAgaSxcbiAgICBub3RTZXRWYWx1ZSxcbiAgICB1cGRhdGVyXG4gICkge1xuICAgIHZhciB3YXNOb3RTZXQgPSBleGlzdGluZyA9PT0gTk9UX1NFVDtcbiAgICBpZiAoaSA9PT0ga2V5UGF0aC5sZW5ndGgpIHtcbiAgICAgIHZhciBleGlzdGluZ1ZhbHVlID0gd2FzTm90U2V0ID8gbm90U2V0VmFsdWUgOiBleGlzdGluZztcbiAgICAgIHZhciBuZXdWYWx1ZSA9IHVwZGF0ZXIoZXhpc3RpbmdWYWx1ZSk7XG4gICAgICByZXR1cm4gbmV3VmFsdWUgPT09IGV4aXN0aW5nVmFsdWUgPyBleGlzdGluZyA6IG5ld1ZhbHVlO1xuICAgIH1cbiAgICBpZiAoIXdhc05vdFNldCAmJiAhaXNEYXRhU3RydWN0dXJlKGV4aXN0aW5nKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgJ0Nhbm5vdCB1cGRhdGUgd2l0aGluIG5vbi1kYXRhLXN0cnVjdHVyZSB2YWx1ZSBpbiBwYXRoIFsnICtcbiAgICAgICAgICBrZXlQYXRoLnNsaWNlKDAsIGkpLm1hcChxdW90ZVN0cmluZykgK1xuICAgICAgICAgICddOiAnICtcbiAgICAgICAgICBleGlzdGluZ1xuICAgICAgKTtcbiAgICB9XG4gICAgdmFyIGtleSA9IGtleVBhdGhbaV07XG4gICAgdmFyIG5leHRFeGlzdGluZyA9IHdhc05vdFNldCA/IE5PVF9TRVQgOiBnZXQoZXhpc3RpbmcsIGtleSwgTk9UX1NFVCk7XG4gICAgdmFyIG5leHRVcGRhdGVkID0gdXBkYXRlSW5EZWVwbHkoXG4gICAgICBuZXh0RXhpc3RpbmcgPT09IE5PVF9TRVQgPyBpbkltbXV0YWJsZSA6IGlzSW1tdXRhYmxlKG5leHRFeGlzdGluZyksXG4gICAgICBuZXh0RXhpc3RpbmcsXG4gICAgICBrZXlQYXRoLFxuICAgICAgaSArIDEsXG4gICAgICBub3RTZXRWYWx1ZSxcbiAgICAgIHVwZGF0ZXJcbiAgICApO1xuICAgIHJldHVybiBuZXh0VXBkYXRlZCA9PT0gbmV4dEV4aXN0aW5nXG4gICAgICA/IGV4aXN0aW5nXG4gICAgICA6IG5leHRVcGRhdGVkID09PSBOT1RfU0VUXG4gICAgICA/IHJlbW92ZShleGlzdGluZywga2V5KVxuICAgICAgOiBzZXQoXG4gICAgICAgICAgd2FzTm90U2V0ID8gKGluSW1tdXRhYmxlID8gZW1wdHlNYXAoKSA6IHt9KSA6IGV4aXN0aW5nLFxuICAgICAgICAgIGtleSxcbiAgICAgICAgICBuZXh0VXBkYXRlZFxuICAgICAgICApO1xuICB9XG5cbiAgZnVuY3Rpb24gc2V0SW4kMShjb2xsZWN0aW9uLCBrZXlQYXRoLCB2YWx1ZSkge1xuICAgIHJldHVybiB1cGRhdGVJbiQxKGNvbGxlY3Rpb24sIGtleVBhdGgsIE5PVF9TRVQsIGZ1bmN0aW9uICgpIHsgcmV0dXJuIHZhbHVlOyB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHNldEluKGtleVBhdGgsIHYpIHtcbiAgICByZXR1cm4gc2V0SW4kMSh0aGlzLCBrZXlQYXRoLCB2KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlbW92ZUluKGNvbGxlY3Rpb24sIGtleVBhdGgpIHtcbiAgICByZXR1cm4gdXBkYXRlSW4kMShjb2xsZWN0aW9uLCBrZXlQYXRoLCBmdW5jdGlvbiAoKSB7IHJldHVybiBOT1RfU0VUOyB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGRlbGV0ZUluKGtleVBhdGgpIHtcbiAgICByZXR1cm4gcmVtb3ZlSW4odGhpcywga2V5UGF0aCk7XG4gIH1cblxuICBmdW5jdGlvbiB1cGRhdGUkMShjb2xsZWN0aW9uLCBrZXksIG5vdFNldFZhbHVlLCB1cGRhdGVyKSB7XG4gICAgcmV0dXJuIHVwZGF0ZUluJDEoY29sbGVjdGlvbiwgW2tleV0sIG5vdFNldFZhbHVlLCB1cGRhdGVyKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHVwZGF0ZShrZXksIG5vdFNldFZhbHVlLCB1cGRhdGVyKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPT09IDFcbiAgICAgID8ga2V5KHRoaXMpXG4gICAgICA6IHVwZGF0ZSQxKHRoaXMsIGtleSwgbm90U2V0VmFsdWUsIHVwZGF0ZXIpO1xuICB9XG5cbiAgZnVuY3Rpb24gdXBkYXRlSW4oa2V5UGF0aCwgbm90U2V0VmFsdWUsIHVwZGF0ZXIpIHtcbiAgICByZXR1cm4gdXBkYXRlSW4kMSh0aGlzLCBrZXlQYXRoLCBub3RTZXRWYWx1ZSwgdXBkYXRlcik7XG4gIH1cblxuICBmdW5jdGlvbiBtZXJnZSQxKCkge1xuICAgIHZhciBpdGVycyA9IFtdLCBsZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuICAgIHdoaWxlICggbGVuLS0gKSBpdGVyc1sgbGVuIF0gPSBhcmd1bWVudHNbIGxlbiBdO1xuXG4gICAgcmV0dXJuIG1lcmdlSW50b0tleWVkV2l0aCh0aGlzLCBpdGVycyk7XG4gIH1cblxuICBmdW5jdGlvbiBtZXJnZVdpdGgkMShtZXJnZXIpIHtcbiAgICB2YXIgaXRlcnMgPSBbXSwgbGVuID0gYXJndW1lbnRzLmxlbmd0aCAtIDE7XG4gICAgd2hpbGUgKCBsZW4tLSA+IDAgKSBpdGVyc1sgbGVuIF0gPSBhcmd1bWVudHNbIGxlbiArIDEgXTtcblxuICAgIGlmICh0eXBlb2YgbWVyZ2VyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIG1lcmdlciBmdW5jdGlvbjogJyArIG1lcmdlcik7XG4gICAgfVxuICAgIHJldHVybiBtZXJnZUludG9LZXllZFdpdGgodGhpcywgaXRlcnMsIG1lcmdlcik7XG4gIH1cblxuICBmdW5jdGlvbiBtZXJnZUludG9LZXllZFdpdGgoY29sbGVjdGlvbiwgY29sbGVjdGlvbnMsIG1lcmdlcikge1xuICAgIHZhciBpdGVycyA9IFtdO1xuICAgIGZvciAodmFyIGlpID0gMDsgaWkgPCBjb2xsZWN0aW9ucy5sZW5ndGg7IGlpKyspIHtcbiAgICAgIHZhciBjb2xsZWN0aW9uJDEgPSBLZXllZENvbGxlY3Rpb24oY29sbGVjdGlvbnNbaWldKTtcbiAgICAgIGlmIChjb2xsZWN0aW9uJDEuc2l6ZSAhPT0gMCkge1xuICAgICAgICBpdGVycy5wdXNoKGNvbGxlY3Rpb24kMSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpdGVycy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBjb2xsZWN0aW9uO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICBjb2xsZWN0aW9uLnRvU2VxKCkuc2l6ZSA9PT0gMCAmJlxuICAgICAgIWNvbGxlY3Rpb24uX19vd25lcklEICYmXG4gICAgICBpdGVycy5sZW5ndGggPT09IDFcbiAgICApIHtcbiAgICAgIHJldHVybiBjb2xsZWN0aW9uLmNvbnN0cnVjdG9yKGl0ZXJzWzBdKTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbGxlY3Rpb24ud2l0aE11dGF0aW9ucyhmdW5jdGlvbiAoY29sbGVjdGlvbikge1xuICAgICAgdmFyIG1lcmdlSW50b0NvbGxlY3Rpb24gPSBtZXJnZXJcbiAgICAgICAgPyBmdW5jdGlvbiAodmFsdWUsIGtleSkge1xuICAgICAgICAgICAgdXBkYXRlJDEoY29sbGVjdGlvbiwga2V5LCBOT1RfU0VULCBmdW5jdGlvbiAob2xkVmFsKSB7IHJldHVybiBvbGRWYWwgPT09IE5PVF9TRVQgPyB2YWx1ZSA6IG1lcmdlcihvbGRWYWwsIHZhbHVlLCBrZXkpOyB9XG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgOiBmdW5jdGlvbiAodmFsdWUsIGtleSkge1xuICAgICAgICAgICAgY29sbGVjdGlvbi5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgICAgICAgfTtcbiAgICAgIGZvciAodmFyIGlpID0gMDsgaWkgPCBpdGVycy5sZW5ndGg7IGlpKyspIHtcbiAgICAgICAgaXRlcnNbaWldLmZvckVhY2gobWVyZ2VJbnRvQ29sbGVjdGlvbik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiBtZXJnZShjb2xsZWN0aW9uKSB7XG4gICAgdmFyIHNvdXJjZXMgPSBbXSwgbGVuID0gYXJndW1lbnRzLmxlbmd0aCAtIDE7XG4gICAgd2hpbGUgKCBsZW4tLSA+IDAgKSBzb3VyY2VzWyBsZW4gXSA9IGFyZ3VtZW50c1sgbGVuICsgMSBdO1xuXG4gICAgcmV0dXJuIG1lcmdlV2l0aFNvdXJjZXMoY29sbGVjdGlvbiwgc291cmNlcyk7XG4gIH1cblxuICBmdW5jdGlvbiBtZXJnZVdpdGgobWVyZ2VyLCBjb2xsZWN0aW9uKSB7XG4gICAgdmFyIHNvdXJjZXMgPSBbXSwgbGVuID0gYXJndW1lbnRzLmxlbmd0aCAtIDI7XG4gICAgd2hpbGUgKCBsZW4tLSA+IDAgKSBzb3VyY2VzWyBsZW4gXSA9IGFyZ3VtZW50c1sgbGVuICsgMiBdO1xuXG4gICAgcmV0dXJuIG1lcmdlV2l0aFNvdXJjZXMoY29sbGVjdGlvbiwgc291cmNlcywgbWVyZ2VyKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG1lcmdlRGVlcCQxKGNvbGxlY3Rpb24pIHtcbiAgICB2YXIgc291cmNlcyA9IFtdLCBsZW4gPSBhcmd1bWVudHMubGVuZ3RoIC0gMTtcbiAgICB3aGlsZSAoIGxlbi0tID4gMCApIHNvdXJjZXNbIGxlbiBdID0gYXJndW1lbnRzWyBsZW4gKyAxIF07XG5cbiAgICByZXR1cm4gbWVyZ2VEZWVwV2l0aFNvdXJjZXMoY29sbGVjdGlvbiwgc291cmNlcyk7XG4gIH1cblxuICBmdW5jdGlvbiBtZXJnZURlZXBXaXRoJDEobWVyZ2VyLCBjb2xsZWN0aW9uKSB7XG4gICAgdmFyIHNvdXJjZXMgPSBbXSwgbGVuID0gYXJndW1lbnRzLmxlbmd0aCAtIDI7XG4gICAgd2hpbGUgKCBsZW4tLSA+IDAgKSBzb3VyY2VzWyBsZW4gXSA9IGFyZ3VtZW50c1sgbGVuICsgMiBdO1xuXG4gICAgcmV0dXJuIG1lcmdlRGVlcFdpdGhTb3VyY2VzKGNvbGxlY3Rpb24sIHNvdXJjZXMsIG1lcmdlcik7XG4gIH1cblxuICBmdW5jdGlvbiBtZXJnZURlZXBXaXRoU291cmNlcyhjb2xsZWN0aW9uLCBzb3VyY2VzLCBtZXJnZXIpIHtcbiAgICByZXR1cm4gbWVyZ2VXaXRoU291cmNlcyhjb2xsZWN0aW9uLCBzb3VyY2VzLCBkZWVwTWVyZ2VyV2l0aChtZXJnZXIpKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG1lcmdlV2l0aFNvdXJjZXMoY29sbGVjdGlvbiwgc291cmNlcywgbWVyZ2VyKSB7XG4gICAgaWYgKCFpc0RhdGFTdHJ1Y3R1cmUoY29sbGVjdGlvbikpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICdDYW5ub3QgbWVyZ2UgaW50byBub24tZGF0YS1zdHJ1Y3R1cmUgdmFsdWU6ICcgKyBjb2xsZWN0aW9uXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoaXNJbW11dGFibGUoY29sbGVjdGlvbikpIHtcbiAgICAgIHJldHVybiB0eXBlb2YgbWVyZ2VyID09PSAnZnVuY3Rpb24nICYmIGNvbGxlY3Rpb24ubWVyZ2VXaXRoXG4gICAgICAgID8gY29sbGVjdGlvbi5tZXJnZVdpdGguYXBwbHkoY29sbGVjdGlvbiwgWyBtZXJnZXIgXS5jb25jYXQoIHNvdXJjZXMgKSlcbiAgICAgICAgOiBjb2xsZWN0aW9uLm1lcmdlXG4gICAgICAgID8gY29sbGVjdGlvbi5tZXJnZS5hcHBseShjb2xsZWN0aW9uLCBzb3VyY2VzKVxuICAgICAgICA6IGNvbGxlY3Rpb24uY29uY2F0LmFwcGx5KGNvbGxlY3Rpb24sIHNvdXJjZXMpO1xuICAgIH1cbiAgICB2YXIgaXNBcnJheSA9IEFycmF5LmlzQXJyYXkoY29sbGVjdGlvbik7XG4gICAgdmFyIG1lcmdlZCA9IGNvbGxlY3Rpb247XG4gICAgdmFyIENvbGxlY3Rpb24gPSBpc0FycmF5ID8gSW5kZXhlZENvbGxlY3Rpb24gOiBLZXllZENvbGxlY3Rpb247XG4gICAgdmFyIG1lcmdlSXRlbSA9IGlzQXJyYXlcbiAgICAgID8gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgLy8gQ29weSBvbiB3cml0ZVxuICAgICAgICAgIGlmIChtZXJnZWQgPT09IGNvbGxlY3Rpb24pIHtcbiAgICAgICAgICAgIG1lcmdlZCA9IHNoYWxsb3dDb3B5KG1lcmdlZCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIG1lcmdlZC5wdXNoKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgOiBmdW5jdGlvbiAodmFsdWUsIGtleSkge1xuICAgICAgICAgIHZhciBoYXNWYWwgPSBoYXNPd25Qcm9wZXJ0eS5jYWxsKG1lcmdlZCwga2V5KTtcbiAgICAgICAgICB2YXIgbmV4dFZhbCA9XG4gICAgICAgICAgICBoYXNWYWwgJiYgbWVyZ2VyID8gbWVyZ2VyKG1lcmdlZFtrZXldLCB2YWx1ZSwga2V5KSA6IHZhbHVlO1xuICAgICAgICAgIGlmICghaGFzVmFsIHx8IG5leHRWYWwgIT09IG1lcmdlZFtrZXldKSB7XG4gICAgICAgICAgICAvLyBDb3B5IG9uIHdyaXRlXG4gICAgICAgICAgICBpZiAobWVyZ2VkID09PSBjb2xsZWN0aW9uKSB7XG4gICAgICAgICAgICAgIG1lcmdlZCA9IHNoYWxsb3dDb3B5KG1lcmdlZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBtZXJnZWRba2V5XSA9IG5leHRWYWw7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc291cmNlcy5sZW5ndGg7IGkrKykge1xuICAgICAgQ29sbGVjdGlvbihzb3VyY2VzW2ldKS5mb3JFYWNoKG1lcmdlSXRlbSk7XG4gICAgfVxuICAgIHJldHVybiBtZXJnZWQ7XG4gIH1cblxuICBmdW5jdGlvbiBkZWVwTWVyZ2VyV2l0aChtZXJnZXIpIHtcbiAgICBmdW5jdGlvbiBkZWVwTWVyZ2VyKG9sZFZhbHVlLCBuZXdWYWx1ZSwga2V5KSB7XG4gICAgICByZXR1cm4gaXNEYXRhU3RydWN0dXJlKG9sZFZhbHVlKSAmJlxuICAgICAgICBpc0RhdGFTdHJ1Y3R1cmUobmV3VmFsdWUpICYmXG4gICAgICAgIGFyZU1lcmdlYWJsZShvbGRWYWx1ZSwgbmV3VmFsdWUpXG4gICAgICAgID8gbWVyZ2VXaXRoU291cmNlcyhvbGRWYWx1ZSwgW25ld1ZhbHVlXSwgZGVlcE1lcmdlcilcbiAgICAgICAgOiBtZXJnZXJcbiAgICAgICAgPyBtZXJnZXIob2xkVmFsdWUsIG5ld1ZhbHVlLCBrZXkpXG4gICAgICAgIDogbmV3VmFsdWU7XG4gICAgfVxuICAgIHJldHVybiBkZWVwTWVyZ2VyO1xuICB9XG5cbiAgLyoqXG4gICAqIEl0J3MgdW5jbGVhciB3aGF0IHRoZSBkZXNpcmVkIGJlaGF2aW9yIGlzIGZvciBtZXJnaW5nIHR3byBjb2xsZWN0aW9ucyB0aGF0XG4gICAqIGZhbGwgaW50byBzZXBhcmF0ZSBjYXRlZ29yaWVzIGJldHdlZW4ga2V5ZWQsIGluZGV4ZWQsIG9yIHNldC1saWtlLCBzbyB3ZSBvbmx5XG4gICAqIGNvbnNpZGVyIHRoZW0gbWVyZ2VhYmxlIGlmIHRoZXkgZmFsbCBpbnRvIHRoZSBzYW1lIGNhdGVnb3J5LlxuICAgKi9cbiAgZnVuY3Rpb24gYXJlTWVyZ2VhYmxlKG9sZERhdGFTdHJ1Y3R1cmUsIG5ld0RhdGFTdHJ1Y3R1cmUpIHtcbiAgICB2YXIgb2xkU2VxID0gU2VxKG9sZERhdGFTdHJ1Y3R1cmUpO1xuICAgIHZhciBuZXdTZXEgPSBTZXEobmV3RGF0YVN0cnVjdHVyZSk7XG4gICAgLy8gVGhpcyBsb2dpYyBhc3N1bWVzIHRoYXQgYSBzZXF1ZW5jZSBjYW4gb25seSBmYWxsIGludG8gb25lIG9mIHRoZSB0aHJlZVxuICAgIC8vIGNhdGVnb3JpZXMgbWVudGlvbmVkIGFib3ZlIChzaW5jZSB0aGVyZSdzIG5vIGBpc1NldExpa2UoKWAgbWV0aG9kKS5cbiAgICByZXR1cm4gKFxuICAgICAgaXNJbmRleGVkKG9sZFNlcSkgPT09IGlzSW5kZXhlZChuZXdTZXEpICYmXG4gICAgICBpc0tleWVkKG9sZFNlcSkgPT09IGlzS2V5ZWQobmV3U2VxKVxuICAgICk7XG4gIH1cblxuICBmdW5jdGlvbiBtZXJnZURlZXAoKSB7XG4gICAgdmFyIGl0ZXJzID0gW10sIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgd2hpbGUgKCBsZW4tLSApIGl0ZXJzWyBsZW4gXSA9IGFyZ3VtZW50c1sgbGVuIF07XG5cbiAgICByZXR1cm4gbWVyZ2VEZWVwV2l0aFNvdXJjZXModGhpcywgaXRlcnMpO1xuICB9XG5cbiAgZnVuY3Rpb24gbWVyZ2VEZWVwV2l0aChtZXJnZXIpIHtcbiAgICB2YXIgaXRlcnMgPSBbXSwgbGVuID0gYXJndW1lbnRzLmxlbmd0aCAtIDE7XG4gICAgd2hpbGUgKCBsZW4tLSA+IDAgKSBpdGVyc1sgbGVuIF0gPSBhcmd1bWVudHNbIGxlbiArIDEgXTtcblxuICAgIHJldHVybiBtZXJnZURlZXBXaXRoU291cmNlcyh0aGlzLCBpdGVycywgbWVyZ2VyKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG1lcmdlSW4oa2V5UGF0aCkge1xuICAgIHZhciBpdGVycyA9IFtdLCBsZW4gPSBhcmd1bWVudHMubGVuZ3RoIC0gMTtcbiAgICB3aGlsZSAoIGxlbi0tID4gMCApIGl0ZXJzWyBsZW4gXSA9IGFyZ3VtZW50c1sgbGVuICsgMSBdO1xuXG4gICAgcmV0dXJuIHVwZGF0ZUluJDEodGhpcywga2V5UGF0aCwgZW1wdHlNYXAoKSwgZnVuY3Rpb24gKG0pIHsgcmV0dXJuIG1lcmdlV2l0aFNvdXJjZXMobSwgaXRlcnMpOyB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG1lcmdlRGVlcEluKGtleVBhdGgpIHtcbiAgICB2YXIgaXRlcnMgPSBbXSwgbGVuID0gYXJndW1lbnRzLmxlbmd0aCAtIDE7XG4gICAgd2hpbGUgKCBsZW4tLSA+IDAgKSBpdGVyc1sgbGVuIF0gPSBhcmd1bWVudHNbIGxlbiArIDEgXTtcblxuICAgIHJldHVybiB1cGRhdGVJbiQxKHRoaXMsIGtleVBhdGgsIGVtcHR5TWFwKCksIGZ1bmN0aW9uIChtKSB7IHJldHVybiBtZXJnZURlZXBXaXRoU291cmNlcyhtLCBpdGVycyk7IH1cbiAgICApO1xuICB9XG5cbiAgZnVuY3Rpb24gd2l0aE11dGF0aW9ucyhmbikge1xuICAgIHZhciBtdXRhYmxlID0gdGhpcy5hc011dGFibGUoKTtcbiAgICBmbihtdXRhYmxlKTtcbiAgICByZXR1cm4gbXV0YWJsZS53YXNBbHRlcmVkKCkgPyBtdXRhYmxlLl9fZW5zdXJlT3duZXIodGhpcy5fX293bmVySUQpIDogdGhpcztcbiAgfVxuXG4gIGZ1bmN0aW9uIGFzTXV0YWJsZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fX293bmVySUQgPyB0aGlzIDogdGhpcy5fX2Vuc3VyZU93bmVyKG5ldyBPd25lcklEKCkpO1xuICB9XG5cbiAgZnVuY3Rpb24gYXNJbW11dGFibGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX19lbnN1cmVPd25lcigpO1xuICB9XG5cbiAgZnVuY3Rpb24gd2FzQWx0ZXJlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5fX2FsdGVyZWQ7XG4gIH1cblxuICB2YXIgTWFwID0gLypAX19QVVJFX18qLyhmdW5jdGlvbiAoS2V5ZWRDb2xsZWN0aW9uKSB7XG4gICAgZnVuY3Rpb24gTWFwKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gbnVsbFxuICAgICAgICA/IGVtcHR5TWFwKClcbiAgICAgICAgOiBpc01hcCh2YWx1ZSkgJiYgIWlzT3JkZXJlZCh2YWx1ZSlcbiAgICAgICAgPyB2YWx1ZVxuICAgICAgICA6IGVtcHR5TWFwKCkud2l0aE11dGF0aW9ucyhmdW5jdGlvbiAobWFwKSB7XG4gICAgICAgICAgICB2YXIgaXRlciA9IEtleWVkQ29sbGVjdGlvbih2YWx1ZSk7XG4gICAgICAgICAgICBhc3NlcnROb3RJbmZpbml0ZShpdGVyLnNpemUpO1xuICAgICAgICAgICAgaXRlci5mb3JFYWNoKGZ1bmN0aW9uICh2LCBrKSB7IHJldHVybiBtYXAuc2V0KGssIHYpOyB9KTtcbiAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoIEtleWVkQ29sbGVjdGlvbiApIE1hcC5fX3Byb3RvX18gPSBLZXllZENvbGxlY3Rpb247XG4gICAgTWFwLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEtleWVkQ29sbGVjdGlvbiAmJiBLZXllZENvbGxlY3Rpb24ucHJvdG90eXBlICk7XG4gICAgTWFwLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IE1hcDtcblxuICAgIE1hcC5vZiA9IGZ1bmN0aW9uIG9mICgpIHtcbiAgICAgIHZhciBrZXlWYWx1ZXMgPSBbXSwgbGVuID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgICAgIHdoaWxlICggbGVuLS0gKSBrZXlWYWx1ZXNbIGxlbiBdID0gYXJndW1lbnRzWyBsZW4gXTtcblxuICAgICAgcmV0dXJuIGVtcHR5TWFwKCkud2l0aE11dGF0aW9ucyhmdW5jdGlvbiAobWFwKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwga2V5VmFsdWVzLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgICAgICAgaWYgKGkgKyAxID49IGtleVZhbHVlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTWlzc2luZyB2YWx1ZSBmb3Iga2V5OiAnICsga2V5VmFsdWVzW2ldKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbWFwLnNldChrZXlWYWx1ZXNbaV0sIGtleVZhbHVlc1tpICsgMV0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgTWFwLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nICgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9fdG9TdHJpbmcoJ01hcCB7JywgJ30nKTtcbiAgICB9O1xuXG4gICAgLy8gQHByYWdtYSBBY2Nlc3NcblxuICAgIE1hcC5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gZ2V0IChrLCBub3RTZXRWYWx1ZSkge1xuICAgICAgcmV0dXJuIHRoaXMuX3Jvb3RcbiAgICAgICAgPyB0aGlzLl9yb290LmdldCgwLCB1bmRlZmluZWQsIGssIG5vdFNldFZhbHVlKVxuICAgICAgICA6IG5vdFNldFZhbHVlO1xuICAgIH07XG5cbiAgICAvLyBAcHJhZ21hIE1vZGlmaWNhdGlvblxuXG4gICAgTWFwLnByb3RvdHlwZS5zZXQgPSBmdW5jdGlvbiBzZXQgKGssIHYpIHtcbiAgICAgIHJldHVybiB1cGRhdGVNYXAodGhpcywgaywgdik7XG4gICAgfTtcblxuICAgIE1hcC5wcm90b3R5cGUucmVtb3ZlID0gZnVuY3Rpb24gcmVtb3ZlIChrKSB7XG4gICAgICByZXR1cm4gdXBkYXRlTWFwKHRoaXMsIGssIE5PVF9TRVQpO1xuICAgIH07XG5cbiAgICBNYXAucHJvdG90eXBlLmRlbGV0ZUFsbCA9IGZ1bmN0aW9uIGRlbGV0ZUFsbCAoa2V5cykge1xuICAgICAgdmFyIGNvbGxlY3Rpb24gPSBDb2xsZWN0aW9uKGtleXMpO1xuXG4gICAgICBpZiAoY29sbGVjdGlvbi5zaXplID09PSAwKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy53aXRoTXV0YXRpb25zKGZ1bmN0aW9uIChtYXApIHtcbiAgICAgICAgY29sbGVjdGlvbi5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgcmV0dXJuIG1hcC5yZW1vdmUoa2V5KTsgfSk7XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgTWFwLnByb3RvdHlwZS5jbGVhciA9IGZ1bmN0aW9uIGNsZWFyICgpIHtcbiAgICAgIGlmICh0aGlzLnNpemUgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5fX293bmVySUQpIHtcbiAgICAgICAgdGhpcy5zaXplID0gMDtcbiAgICAgICAgdGhpcy5fcm9vdCA9IG51bGw7XG4gICAgICAgIHRoaXMuX19oYXNoID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLl9fYWx0ZXJlZCA9IHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGVtcHR5TWFwKCk7XG4gICAgfTtcblxuICAgIC8vIEBwcmFnbWEgQ29tcG9zaXRpb25cblxuICAgIE1hcC5wcm90b3R5cGUuc29ydCA9IGZ1bmN0aW9uIHNvcnQgKGNvbXBhcmF0b3IpIHtcbiAgICAgIC8vIExhdGUgYmluZGluZ1xuICAgICAgcmV0dXJuIE9yZGVyZWRNYXAoc29ydEZhY3RvcnkodGhpcywgY29tcGFyYXRvcikpO1xuICAgIH07XG5cbiAgICBNYXAucHJvdG90eXBlLnNvcnRCeSA9IGZ1bmN0aW9uIHNvcnRCeSAobWFwcGVyLCBjb21wYXJhdG9yKSB7XG4gICAgICAvLyBMYXRlIGJpbmRpbmdcbiAgICAgIHJldHVybiBPcmRlcmVkTWFwKHNvcnRGYWN0b3J5KHRoaXMsIGNvbXBhcmF0b3IsIG1hcHBlcikpO1xuICAgIH07XG5cbiAgICBNYXAucHJvdG90eXBlLm1hcCA9IGZ1bmN0aW9uIG1hcCAobWFwcGVyLCBjb250ZXh0KSB7XG4gICAgICB2YXIgdGhpcyQxJDEgPSB0aGlzO1xuXG4gICAgICByZXR1cm4gdGhpcy53aXRoTXV0YXRpb25zKGZ1bmN0aW9uIChtYXApIHtcbiAgICAgICAgbWFwLmZvckVhY2goZnVuY3Rpb24gKHZhbHVlLCBrZXkpIHtcbiAgICAgICAgICBtYXAuc2V0KGtleSwgbWFwcGVyLmNhbGwoY29udGV4dCwgdmFsdWUsIGtleSwgdGhpcyQxJDEpKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgLy8gQHByYWdtYSBNdXRhYmlsaXR5XG5cbiAgICBNYXAucHJvdG90eXBlLl9faXRlcmF0b3IgPSBmdW5jdGlvbiBfX2l0ZXJhdG9yICh0eXBlLCByZXZlcnNlKSB7XG4gICAgICByZXR1cm4gbmV3IE1hcEl0ZXJhdG9yKHRoaXMsIHR5cGUsIHJldmVyc2UpO1xuICAgIH07XG5cbiAgICBNYXAucHJvdG90eXBlLl9faXRlcmF0ZSA9IGZ1bmN0aW9uIF9faXRlcmF0ZSAoZm4sIHJldmVyc2UpIHtcbiAgICAgIHZhciB0aGlzJDEkMSA9IHRoaXM7XG5cbiAgICAgIHZhciBpdGVyYXRpb25zID0gMDtcbiAgICAgIHRoaXMuX3Jvb3QgJiZcbiAgICAgICAgdGhpcy5fcm9vdC5pdGVyYXRlKGZ1bmN0aW9uIChlbnRyeSkge1xuICAgICAgICAgIGl0ZXJhdGlvbnMrKztcbiAgICAgICAgICByZXR1cm4gZm4oZW50cnlbMV0sIGVudHJ5WzBdLCB0aGlzJDEkMSk7XG4gICAgICAgIH0sIHJldmVyc2UpO1xuICAgICAgcmV0dXJuIGl0ZXJhdGlvbnM7XG4gICAgfTtcblxuICAgIE1hcC5wcm90b3R5cGUuX19lbnN1cmVPd25lciA9IGZ1bmN0aW9uIF9fZW5zdXJlT3duZXIgKG93bmVySUQpIHtcbiAgICAgIGlmIChvd25lcklEID09PSB0aGlzLl9fb3duZXJJRCkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cbiAgICAgIGlmICghb3duZXJJRCkge1xuICAgICAgICBpZiAodGhpcy5zaXplID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIGVtcHR5TWFwKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fX293bmVySUQgPSBvd25lcklEO1xuICAgICAgICB0aGlzLl9fYWx0ZXJlZCA9IGZhbHNlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cbiAgICAgIHJldHVybiBtYWtlTWFwKHRoaXMuc2l6ZSwgdGhpcy5fcm9vdCwgb3duZXJJRCwgdGhpcy5fX2hhc2gpO1xuICAgIH07XG5cbiAgICByZXR1cm4gTWFwO1xuICB9KEtleWVkQ29sbGVjdGlvbikpO1xuXG4gIE1hcC5pc01hcCA9IGlzTWFwO1xuXG4gIHZhciBNYXBQcm90b3R5cGUgPSBNYXAucHJvdG90eXBlO1xuICBNYXBQcm90b3R5cGVbSVNfTUFQX1NZTUJPTF0gPSB0cnVlO1xuICBNYXBQcm90b3R5cGVbREVMRVRFXSA9IE1hcFByb3RvdHlwZS5yZW1vdmU7XG4gIE1hcFByb3RvdHlwZS5yZW1vdmVBbGwgPSBNYXBQcm90b3R5cGUuZGVsZXRlQWxsO1xuICBNYXBQcm90b3R5cGUuc2V0SW4gPSBzZXRJbjtcbiAgTWFwUHJvdG90eXBlLnJlbW92ZUluID0gTWFwUHJvdG90eXBlLmRlbGV0ZUluID0gZGVsZXRlSW47XG4gIE1hcFByb3RvdHlwZS51cGRhdGUgPSB1cGRhdGU7XG4gIE1hcFByb3RvdHlwZS51cGRhdGVJbiA9IHVwZGF0ZUluO1xuICBNYXBQcm90b3R5cGUubWVyZ2UgPSBNYXBQcm90b3R5cGUuY29uY2F0ID0gbWVyZ2UkMTtcbiAgTWFwUHJvdG90eXBlLm1lcmdlV2l0aCA9IG1lcmdlV2l0aCQxO1xuICBNYXBQcm90b3R5cGUubWVyZ2VEZWVwID0gbWVyZ2VEZWVwO1xuICBNYXBQcm90b3R5cGUubWVyZ2VEZWVwV2l0aCA9IG1lcmdlRGVlcFdpdGg7XG4gIE1hcFByb3RvdHlwZS5tZXJnZUluID0gbWVyZ2VJbjtcbiAgTWFwUHJvdG90eXBlLm1lcmdlRGVlcEluID0gbWVyZ2VEZWVwSW47XG4gIE1hcFByb3RvdHlwZS53aXRoTXV0YXRpb25zID0gd2l0aE11dGF0aW9ucztcbiAgTWFwUHJvdG90eXBlLndhc0FsdGVyZWQgPSB3YXNBbHRlcmVkO1xuICBNYXBQcm90b3R5cGUuYXNJbW11dGFibGUgPSBhc0ltbXV0YWJsZTtcbiAgTWFwUHJvdG90eXBlWydAQHRyYW5zZHVjZXIvaW5pdCddID0gTWFwUHJvdG90eXBlLmFzTXV0YWJsZSA9IGFzTXV0YWJsZTtcbiAgTWFwUHJvdG90eXBlWydAQHRyYW5zZHVjZXIvc3RlcCddID0gZnVuY3Rpb24gKHJlc3VsdCwgYXJyKSB7XG4gICAgcmV0dXJuIHJlc3VsdC5zZXQoYXJyWzBdLCBhcnJbMV0pO1xuICB9O1xuICBNYXBQcm90b3R5cGVbJ0BAdHJhbnNkdWNlci9yZXN1bHQnXSA9IGZ1bmN0aW9uIChvYmopIHtcbiAgICByZXR1cm4gb2JqLmFzSW1tdXRhYmxlKCk7XG4gIH07XG5cbiAgLy8gI3ByYWdtYSBUcmllIE5vZGVzXG5cbiAgdmFyIEFycmF5TWFwTm9kZSA9IGZ1bmN0aW9uIEFycmF5TWFwTm9kZShvd25lcklELCBlbnRyaWVzKSB7XG4gICAgdGhpcy5vd25lcklEID0gb3duZXJJRDtcbiAgICB0aGlzLmVudHJpZXMgPSBlbnRyaWVzO1xuICB9O1xuXG4gIEFycmF5TWFwTm9kZS5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gZ2V0IChzaGlmdCwga2V5SGFzaCwga2V5LCBub3RTZXRWYWx1ZSkge1xuICAgIHZhciBlbnRyaWVzID0gdGhpcy5lbnRyaWVzO1xuICAgIGZvciAodmFyIGlpID0gMCwgbGVuID0gZW50cmllcy5sZW5ndGg7IGlpIDwgbGVuOyBpaSsrKSB7XG4gICAgICBpZiAoaXMoa2V5LCBlbnRyaWVzW2lpXVswXSkpIHtcbiAgICAgICAgcmV0dXJuIGVudHJpZXNbaWldWzFdO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbm90U2V0VmFsdWU7XG4gIH07XG5cbiAgQXJyYXlNYXBOb2RlLnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbiB1cGRhdGUgKG93bmVySUQsIHNoaWZ0LCBrZXlIYXNoLCBrZXksIHZhbHVlLCBkaWRDaGFuZ2VTaXplLCBkaWRBbHRlcikge1xuICAgIHZhciByZW1vdmVkID0gdmFsdWUgPT09IE5PVF9TRVQ7XG5cbiAgICB2YXIgZW50cmllcyA9IHRoaXMuZW50cmllcztcbiAgICB2YXIgaWR4ID0gMDtcbiAgICB2YXIgbGVuID0gZW50cmllcy5sZW5ndGg7XG4gICAgZm9yICg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgIGlmIChpcyhrZXksIGVudHJpZXNbaWR4XVswXSkpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIHZhciBleGlzdHMgPSBpZHggPCBsZW47XG5cbiAgICBpZiAoZXhpc3RzID8gZW50cmllc1tpZHhdWzFdID09PSB2YWx1ZSA6IHJlbW92ZWQpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIFNldFJlZihkaWRBbHRlcik7XG4gICAgKHJlbW92ZWQgfHwgIWV4aXN0cykgJiYgU2V0UmVmKGRpZENoYW5nZVNpemUpO1xuXG4gICAgaWYgKHJlbW92ZWQgJiYgZW50cmllcy5sZW5ndGggPT09IDEpIHtcbiAgICAgIHJldHVybjsgLy8gdW5kZWZpbmVkXG4gICAgfVxuXG4gICAgaWYgKCFleGlzdHMgJiYgIXJlbW92ZWQgJiYgZW50cmllcy5sZW5ndGggPj0gTUFYX0FSUkFZX01BUF9TSVpFKSB7XG4gICAgICByZXR1cm4gY3JlYXRlTm9kZXMob3duZXJJRCwgZW50cmllcywga2V5LCB2YWx1ZSk7XG4gICAgfVxuXG4gICAgdmFyIGlzRWRpdGFibGUgPSBvd25lcklEICYmIG93bmVySUQgPT09IHRoaXMub3duZXJJRDtcbiAgICB2YXIgbmV3RW50cmllcyA9IGlzRWRpdGFibGUgPyBlbnRyaWVzIDogYXJyQ29weShlbnRyaWVzKTtcblxuICAgIGlmIChleGlzdHMpIHtcbiAgICAgIGlmIChyZW1vdmVkKSB7XG4gICAgICAgIGlkeCA9PT0gbGVuIC0gMVxuICAgICAgICAgID8gbmV3RW50cmllcy5wb3AoKVxuICAgICAgICAgIDogKG5ld0VudHJpZXNbaWR4XSA9IG5ld0VudHJpZXMucG9wKCkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbmV3RW50cmllc1tpZHhdID0gW2tleSwgdmFsdWVdO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBuZXdFbnRyaWVzLnB1c2goW2tleSwgdmFsdWVdKTtcbiAgICB9XG5cbiAgICBpZiAoaXNFZGl0YWJsZSkge1xuICAgICAgdGhpcy5lbnRyaWVzID0gbmV3RW50cmllcztcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgQXJyYXlNYXBOb2RlKG93bmVySUQsIG5ld0VudHJpZXMpO1xuICB9O1xuXG4gIHZhciBCaXRtYXBJbmRleGVkTm9kZSA9IGZ1bmN0aW9uIEJpdG1hcEluZGV4ZWROb2RlKG93bmVySUQsIGJpdG1hcCwgbm9kZXMpIHtcbiAgICB0aGlzLm93bmVySUQgPSBvd25lcklEO1xuICAgIHRoaXMuYml0bWFwID0gYml0bWFwO1xuICAgIHRoaXMubm9kZXMgPSBub2RlcztcbiAgfTtcblxuICBCaXRtYXBJbmRleGVkTm9kZS5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gZ2V0IChzaGlmdCwga2V5SGFzaCwga2V5LCBub3RTZXRWYWx1ZSkge1xuICAgIGlmIChrZXlIYXNoID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGtleUhhc2ggPSBoYXNoKGtleSk7XG4gICAgfVxuICAgIHZhciBiaXQgPSAxIDw8ICgoc2hpZnQgPT09IDAgPyBrZXlIYXNoIDoga2V5SGFzaCA+Pj4gc2hpZnQpICYgTUFTSyk7XG4gICAgdmFyIGJpdG1hcCA9IHRoaXMuYml0bWFwO1xuICAgIHJldHVybiAoYml0bWFwICYgYml0KSA9PT0gMFxuICAgICAgPyBub3RTZXRWYWx1ZVxuICAgICAgOiB0aGlzLm5vZGVzW3BvcENvdW50KGJpdG1hcCAmIChiaXQgLSAxKSldLmdldChcbiAgICAgICAgICBzaGlmdCArIFNISUZULFxuICAgICAgICAgIGtleUhhc2gsXG4gICAgICAgICAga2V5LFxuICAgICAgICAgIG5vdFNldFZhbHVlXG4gICAgICAgICk7XG4gIH07XG5cbiAgQml0bWFwSW5kZXhlZE5vZGUucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uIHVwZGF0ZSAob3duZXJJRCwgc2hpZnQsIGtleUhhc2gsIGtleSwgdmFsdWUsIGRpZENoYW5nZVNpemUsIGRpZEFsdGVyKSB7XG4gICAgaWYgKGtleUhhc2ggPT09IHVuZGVmaW5lZCkge1xuICAgICAga2V5SGFzaCA9IGhhc2goa2V5KTtcbiAgICB9XG4gICAgdmFyIGtleUhhc2hGcmFnID0gKHNoaWZ0ID09PSAwID8ga2V5SGFzaCA6IGtleUhhc2ggPj4+IHNoaWZ0KSAmIE1BU0s7XG4gICAgdmFyIGJpdCA9IDEgPDwga2V5SGFzaEZyYWc7XG4gICAgdmFyIGJpdG1hcCA9IHRoaXMuYml0bWFwO1xuICAgIHZhciBleGlzdHMgPSAoYml0bWFwICYgYml0KSAhPT0gMDtcblxuICAgIGlmICghZXhpc3RzICYmIHZhbHVlID09PSBOT1RfU0VUKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICB2YXIgaWR4ID0gcG9wQ291bnQoYml0bWFwICYgKGJpdCAtIDEpKTtcbiAgICB2YXIgbm9kZXMgPSB0aGlzLm5vZGVzO1xuICAgIHZhciBub2RlID0gZXhpc3RzID8gbm9kZXNbaWR4XSA6IHVuZGVmaW5lZDtcbiAgICB2YXIgbmV3Tm9kZSA9IHVwZGF0ZU5vZGUoXG4gICAgICBub2RlLFxuICAgICAgb3duZXJJRCxcbiAgICAgIHNoaWZ0ICsgU0hJRlQsXG4gICAgICBrZXlIYXNoLFxuICAgICAga2V5LFxuICAgICAgdmFsdWUsXG4gICAgICBkaWRDaGFuZ2VTaXplLFxuICAgICAgZGlkQWx0ZXJcbiAgICApO1xuXG4gICAgaWYgKG5ld05vZGUgPT09IG5vZGUpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIGlmICghZXhpc3RzICYmIG5ld05vZGUgJiYgbm9kZXMubGVuZ3RoID49IE1BWF9CSVRNQVBfSU5ERVhFRF9TSVpFKSB7XG4gICAgICByZXR1cm4gZXhwYW5kTm9kZXMob3duZXJJRCwgbm9kZXMsIGJpdG1hcCwga2V5SGFzaEZyYWcsIG5ld05vZGUpO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIGV4aXN0cyAmJlxuICAgICAgIW5ld05vZGUgJiZcbiAgICAgIG5vZGVzLmxlbmd0aCA9PT0gMiAmJlxuICAgICAgaXNMZWFmTm9kZShub2Rlc1tpZHggXiAxXSlcbiAgICApIHtcbiAgICAgIHJldHVybiBub2Rlc1tpZHggXiAxXTtcbiAgICB9XG5cbiAgICBpZiAoZXhpc3RzICYmIG5ld05vZGUgJiYgbm9kZXMubGVuZ3RoID09PSAxICYmIGlzTGVhZk5vZGUobmV3Tm9kZSkpIHtcbiAgICAgIHJldHVybiBuZXdOb2RlO1xuICAgIH1cblxuICAgIHZhciBpc0VkaXRhYmxlID0gb3duZXJJRCAmJiBvd25lcklEID09PSB0aGlzLm93bmVySUQ7XG4gICAgdmFyIG5ld0JpdG1hcCA9IGV4aXN0cyA/IChuZXdOb2RlID8gYml0bWFwIDogYml0bWFwIF4gYml0KSA6IGJpdG1hcCB8IGJpdDtcbiAgICB2YXIgbmV3Tm9kZXMgPSBleGlzdHNcbiAgICAgID8gbmV3Tm9kZVxuICAgICAgICA/IHNldEF0KG5vZGVzLCBpZHgsIG5ld05vZGUsIGlzRWRpdGFibGUpXG4gICAgICAgIDogc3BsaWNlT3V0KG5vZGVzLCBpZHgsIGlzRWRpdGFibGUpXG4gICAgICA6IHNwbGljZUluKG5vZGVzLCBpZHgsIG5ld05vZGUsIGlzRWRpdGFibGUpO1xuXG4gICAgaWYgKGlzRWRpdGFibGUpIHtcbiAgICAgIHRoaXMuYml0bWFwID0gbmV3Qml0bWFwO1xuICAgICAgdGhpcy5ub2RlcyA9IG5ld05vZGVzO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBCaXRtYXBJbmRleGVkTm9kZShvd25lcklELCBuZXdCaXRtYXAsIG5ld05vZGVzKTtcbiAgfTtcblxuICB2YXIgSGFzaEFycmF5TWFwTm9kZSA9IGZ1bmN0aW9uIEhhc2hBcnJheU1hcE5vZGUob3duZXJJRCwgY291bnQsIG5vZGVzKSB7XG4gICAgdGhpcy5vd25lcklEID0gb3duZXJJRDtcbiAgICB0aGlzLmNvdW50ID0gY291bnQ7XG4gICAgdGhpcy5ub2RlcyA9IG5vZGVzO1xuICB9O1xuXG4gIEhhc2hBcnJheU1hcE5vZGUucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uIGdldCAoc2hpZnQsIGtleUhhc2gsIGtleSwgbm90U2V0VmFsdWUpIHtcbiAgICBpZiAoa2V5SGFzaCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBrZXlIYXNoID0gaGFzaChrZXkpO1xuICAgIH1cbiAgICB2YXIgaWR4ID0gKHNoaWZ0ID09PSAwID8ga2V5SGFzaCA6IGtleUhhc2ggPj4+IHNoaWZ0KSAmIE1BU0s7XG4gICAgdmFyIG5vZGUgPSB0aGlzLm5vZGVzW2lkeF07XG4gICAgcmV0dXJuIG5vZGVcbiAgICAgID8gbm9kZS5nZXQoc2hpZnQgKyBTSElGVCwga2V5SGFzaCwga2V5LCBub3RTZXRWYWx1ZSlcbiAgICAgIDogbm90U2V0VmFsdWU7XG4gIH07XG5cbiAgSGFzaEFycmF5TWFwTm9kZS5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24gdXBkYXRlIChvd25lcklELCBzaGlmdCwga2V5SGFzaCwga2V5LCB2YWx1ZSwgZGlkQ2hhbmdlU2l6ZSwgZGlkQWx0ZXIpIHtcbiAgICBpZiAoa2V5SGFzaCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBrZXlIYXNoID0gaGFzaChrZXkpO1xuICAgIH1cbiAgICB2YXIgaWR4ID0gKHNoaWZ0ID09PSAwID8ga2V5SGFzaCA6IGtleUhhc2ggPj4+IHNoaWZ0KSAmIE1BU0s7XG4gICAgdmFyIHJlbW92ZWQgPSB2YWx1ZSA9PT0gTk9UX1NFVDtcbiAgICB2YXIgbm9kZXMgPSB0aGlzLm5vZGVzO1xuICAgIHZhciBub2RlID0gbm9kZXNbaWR4XTtcblxuICAgIGlmIChyZW1vdmVkICYmICFub2RlKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICB2YXIgbmV3Tm9kZSA9IHVwZGF0ZU5vZGUoXG4gICAgICBub2RlLFxuICAgICAgb3duZXJJRCxcbiAgICAgIHNoaWZ0ICsgU0hJRlQsXG4gICAgICBrZXlIYXNoLFxuICAgICAga2V5LFxuICAgICAgdmFsdWUsXG4gICAgICBkaWRDaGFuZ2VTaXplLFxuICAgICAgZGlkQWx0ZXJcbiAgICApO1xuICAgIGlmIChuZXdOb2RlID09PSBub2RlKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICB2YXIgbmV3Q291bnQgPSB0aGlzLmNvdW50O1xuICAgIGlmICghbm9kZSkge1xuICAgICAgbmV3Q291bnQrKztcbiAgICB9IGVsc2UgaWYgKCFuZXdOb2RlKSB7XG4gICAgICBuZXdDb3VudC0tO1xuICAgICAgaWYgKG5ld0NvdW50IDwgTUlOX0hBU0hfQVJSQVlfTUFQX1NJWkUpIHtcbiAgICAgICAgcmV0dXJuIHBhY2tOb2Rlcyhvd25lcklELCBub2RlcywgbmV3Q291bnQsIGlkeCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGlzRWRpdGFibGUgPSBvd25lcklEICYmIG93bmVySUQgPT09IHRoaXMub3duZXJJRDtcbiAgICB2YXIgbmV3Tm9kZXMgPSBzZXRBdChub2RlcywgaWR4LCBuZXdOb2RlLCBpc0VkaXRhYmxlKTtcblxuICAgIGlmIChpc0VkaXRhYmxlKSB7XG4gICAgICB0aGlzLmNvdW50ID0gbmV3Q291bnQ7XG4gICAgICB0aGlzLm5vZGVzID0gbmV3Tm9kZXM7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IEhhc2hBcnJheU1hcE5vZGUob3duZXJJRCwgbmV3Q291bnQsIG5ld05vZGVzKTtcbiAgfTtcblxuICB2YXIgSGFzaENvbGxpc2lvbk5vZGUgPSBmdW5jdGlvbiBIYXNoQ29sbGlzaW9uTm9kZShvd25lcklELCBrZXlIYXNoLCBlbnRyaWVzKSB7XG4gICAgdGhpcy5vd25lcklEID0gb3duZXJJRDtcbiAgICB0aGlzLmtleUhhc2ggPSBrZXlIYXNoO1xuICAgIHRoaXMuZW50cmllcyA9IGVudHJpZXM7XG4gIH07XG5cbiAgSGFzaENvbGxpc2lvbk5vZGUucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uIGdldCAoc2hpZnQsIGtleUhhc2gsIGtleSwgbm90U2V0VmFsdWUpIHtcbiAgICB2YXIgZW50cmllcyA9IHRoaXMuZW50cmllcztcbiAgICBmb3IgKHZhciBpaSA9IDAsIGxlbiA9IGVudHJpZXMubGVuZ3RoOyBpaSA8IGxlbjsgaWkrKykge1xuICAgICAgaWYgKGlzKGtleSwgZW50cmllc1tpaV1bMF0pKSB7XG4gICAgICAgIHJldHVybiBlbnRyaWVzW2lpXVsxXTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG5vdFNldFZhbHVlO1xuICB9O1xuXG4gIEhhc2hDb2xsaXNpb25Ob2RlLnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbiB1cGRhdGUgKG93bmVySUQsIHNoaWZ0LCBrZXlIYXNoLCBrZXksIHZhbHVlLCBkaWRDaGFuZ2VTaXplLCBkaWRBbHRlcikge1xuICAgIGlmIChrZXlIYXNoID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGtleUhhc2ggPSBoYXNoKGtleSk7XG4gICAgfVxuXG4gICAgdmFyIHJlbW92ZWQgPSB2YWx1ZSA9PT0gTk9UX1NFVDtcblxuICAgIGlmIChrZXlIYXNoICE9PSB0aGlzLmtleUhhc2gpIHtcbiAgICAgIGlmIChyZW1vdmVkKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuICAgICAgU2V0UmVmKGRpZEFsdGVyKTtcbiAgICAgIFNldFJlZihkaWRDaGFuZ2VTaXplKTtcbiAgICAgIHJldHVybiBtZXJnZUludG9Ob2RlKHRoaXMsIG93bmVySUQsIHNoaWZ0LCBrZXlIYXNoLCBba2V5LCB2YWx1ZV0pO1xuICAgIH1cblxuICAgIHZhciBlbnRyaWVzID0gdGhpcy5lbnRyaWVzO1xuICAgIHZhciBpZHggPSAwO1xuICAgIHZhciBsZW4gPSBlbnRyaWVzLmxlbmd0aDtcbiAgICBmb3IgKDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgaWYgKGlzKGtleSwgZW50cmllc1tpZHhdWzBdKSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgdmFyIGV4aXN0cyA9IGlkeCA8IGxlbjtcblxuICAgIGlmIChleGlzdHMgPyBlbnRyaWVzW2lkeF1bMV0gPT09IHZhbHVlIDogcmVtb3ZlZCkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgU2V0UmVmKGRpZEFsdGVyKTtcbiAgICAocmVtb3ZlZCB8fCAhZXhpc3RzKSAmJiBTZXRSZWYoZGlkQ2hhbmdlU2l6ZSk7XG5cbiAgICBpZiAocmVtb3ZlZCAmJiBsZW4gPT09IDIpIHtcbiAgICAgIHJldHVybiBuZXcgVmFsdWVOb2RlKG93bmVySUQsIHRoaXMua2V5SGFzaCwgZW50cmllc1tpZHggXiAxXSk7XG4gICAgfVxuXG4gICAgdmFyIGlzRWRpdGFibGUgPSBvd25lcklEICYmIG93bmVySUQgPT09IHRoaXMub3duZXJJRDtcbiAgICB2YXIgbmV3RW50cmllcyA9IGlzRWRpdGFibGUgPyBlbnRyaWVzIDogYXJyQ29weShlbnRyaWVzKTtcblxuICAgIGlmIChleGlzdHMpIHtcbiAgICAgIGlmIChyZW1vdmVkKSB7XG4gICAgICAgIGlkeCA9PT0gbGVuIC0gMVxuICAgICAgICAgID8gbmV3RW50cmllcy5wb3AoKVxuICAgICAgICAgIDogKG5ld0VudHJpZXNbaWR4XSA9IG5ld0VudHJpZXMucG9wKCkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbmV3RW50cmllc1tpZHhdID0gW2tleSwgdmFsdWVdO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBuZXdFbnRyaWVzLnB1c2goW2tleSwgdmFsdWVdKTtcbiAgICB9XG5cbiAgICBpZiAoaXNFZGl0YWJsZSkge1xuICAgICAgdGhpcy5lbnRyaWVzID0gbmV3RW50cmllcztcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgSGFzaENvbGxpc2lvbk5vZGUob3duZXJJRCwgdGhpcy5rZXlIYXNoLCBuZXdFbnRyaWVzKTtcbiAgfTtcblxuICB2YXIgVmFsdWVOb2RlID0gZnVuY3Rpb24gVmFsdWVOb2RlKG93bmVySUQsIGtleUhhc2gsIGVudHJ5KSB7XG4gICAgdGhpcy5vd25lcklEID0gb3duZXJJRDtcbiAgICB0aGlzLmtleUhhc2ggPSBrZXlIYXNoO1xuICAgIHRoaXMuZW50cnkgPSBlbnRyeTtcbiAgfTtcblxuICBWYWx1ZU5vZGUucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uIGdldCAoc2hpZnQsIGtleUhhc2gsIGtleSwgbm90U2V0VmFsdWUpIHtcbiAgICByZXR1cm4gaXMoa2V5LCB0aGlzLmVudHJ5WzBdKSA/IHRoaXMuZW50cnlbMV0gOiBub3RTZXRWYWx1ZTtcbiAgfTtcblxuICBWYWx1ZU5vZGUucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uIHVwZGF0ZSAob3duZXJJRCwgc2hpZnQsIGtleUhhc2gsIGtleSwgdmFsdWUsIGRpZENoYW5nZVNpemUsIGRpZEFsdGVyKSB7XG4gICAgdmFyIHJlbW92ZWQgPSB2YWx1ZSA9PT0gTk9UX1NFVDtcbiAgICB2YXIga2V5TWF0Y2ggPSBpcyhrZXksIHRoaXMuZW50cnlbMF0pO1xuICAgIGlmIChrZXlNYXRjaCA/IHZhbHVlID09PSB0aGlzLmVudHJ5WzFdIDogcmVtb3ZlZCkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgU2V0UmVmKGRpZEFsdGVyKTtcblxuICAgIGlmIChyZW1vdmVkKSB7XG4gICAgICBTZXRSZWYoZGlkQ2hhbmdlU2l6ZSk7XG4gICAgICByZXR1cm47IC8vIHVuZGVmaW5lZFxuICAgIH1cblxuICAgIGlmIChrZXlNYXRjaCkge1xuICAgICAgaWYgKG93bmVySUQgJiYgb3duZXJJRCA9PT0gdGhpcy5vd25lcklEKSB7XG4gICAgICAgIHRoaXMuZW50cnlbMV0gPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG4gICAgICByZXR1cm4gbmV3IFZhbHVlTm9kZShvd25lcklELCB0aGlzLmtleUhhc2gsIFtrZXksIHZhbHVlXSk7XG4gICAgfVxuXG4gICAgU2V0UmVmKGRpZENoYW5nZVNpemUpO1xuICAgIHJldHVybiBtZXJnZUludG9Ob2RlKHRoaXMsIG93bmVySUQsIHNoaWZ0LCBoYXNoKGtleSksIFtrZXksIHZhbHVlXSk7XG4gIH07XG5cbiAgLy8gI3ByYWdtYSBJdGVyYXRvcnNcblxuICBBcnJheU1hcE5vZGUucHJvdG90eXBlLml0ZXJhdGUgPSBIYXNoQ29sbGlzaW9uTm9kZS5wcm90b3R5cGUuaXRlcmF0ZSA9XG4gICAgZnVuY3Rpb24gKGZuLCByZXZlcnNlKSB7XG4gICAgICB2YXIgZW50cmllcyA9IHRoaXMuZW50cmllcztcbiAgICAgIGZvciAodmFyIGlpID0gMCwgbWF4SW5kZXggPSBlbnRyaWVzLmxlbmd0aCAtIDE7IGlpIDw9IG1heEluZGV4OyBpaSsrKSB7XG4gICAgICAgIGlmIChmbihlbnRyaWVzW3JldmVyc2UgPyBtYXhJbmRleCAtIGlpIDogaWldKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gIEJpdG1hcEluZGV4ZWROb2RlLnByb3RvdHlwZS5pdGVyYXRlID0gSGFzaEFycmF5TWFwTm9kZS5wcm90b3R5cGUuaXRlcmF0ZSA9XG4gICAgZnVuY3Rpb24gKGZuLCByZXZlcnNlKSB7XG4gICAgICB2YXIgbm9kZXMgPSB0aGlzLm5vZGVzO1xuICAgICAgZm9yICh2YXIgaWkgPSAwLCBtYXhJbmRleCA9IG5vZGVzLmxlbmd0aCAtIDE7IGlpIDw9IG1heEluZGV4OyBpaSsrKSB7XG4gICAgICAgIHZhciBub2RlID0gbm9kZXNbcmV2ZXJzZSA/IG1heEluZGV4IC0gaWkgOiBpaV07XG4gICAgICAgIGlmIChub2RlICYmIG5vZGUuaXRlcmF0ZShmbiwgcmV2ZXJzZSkgPT09IGZhbHNlKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgVmFsdWVOb2RlLnByb3RvdHlwZS5pdGVyYXRlID0gZnVuY3Rpb24gKGZuLCByZXZlcnNlKSB7XG4gICAgcmV0dXJuIGZuKHRoaXMuZW50cnkpO1xuICB9O1xuXG4gIHZhciBNYXBJdGVyYXRvciA9IC8qQF9fUFVSRV9fKi8oZnVuY3Rpb24gKEl0ZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gTWFwSXRlcmF0b3IobWFwLCB0eXBlLCByZXZlcnNlKSB7XG4gICAgICB0aGlzLl90eXBlID0gdHlwZTtcbiAgICAgIHRoaXMuX3JldmVyc2UgPSByZXZlcnNlO1xuICAgICAgdGhpcy5fc3RhY2sgPSBtYXAuX3Jvb3QgJiYgbWFwSXRlcmF0b3JGcmFtZShtYXAuX3Jvb3QpO1xuICAgIH1cblxuICAgIGlmICggSXRlcmF0b3IgKSBNYXBJdGVyYXRvci5fX3Byb3RvX18gPSBJdGVyYXRvcjtcbiAgICBNYXBJdGVyYXRvci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBJdGVyYXRvciAmJiBJdGVyYXRvci5wcm90b3R5cGUgKTtcbiAgICBNYXBJdGVyYXRvci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBNYXBJdGVyYXRvcjtcblxuICAgIE1hcEl0ZXJhdG9yLnByb3RvdHlwZS5uZXh0ID0gZnVuY3Rpb24gbmV4dCAoKSB7XG4gICAgICB2YXIgdHlwZSA9IHRoaXMuX3R5cGU7XG4gICAgICB2YXIgc3RhY2sgPSB0aGlzLl9zdGFjaztcbiAgICAgIHdoaWxlIChzdGFjaykge1xuICAgICAgICB2YXIgbm9kZSA9IHN0YWNrLm5vZGU7XG4gICAgICAgIHZhciBpbmRleCA9IHN0YWNrLmluZGV4Kys7XG4gICAgICAgIHZhciBtYXhJbmRleCA9ICh2b2lkIDApO1xuICAgICAgICBpZiAobm9kZS5lbnRyeSkge1xuICAgICAgICAgIGlmIChpbmRleCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIG1hcEl0ZXJhdG9yVmFsdWUodHlwZSwgbm9kZS5lbnRyeSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKG5vZGUuZW50cmllcykge1xuICAgICAgICAgIG1heEluZGV4ID0gbm9kZS5lbnRyaWVzLmxlbmd0aCAtIDE7XG4gICAgICAgICAgaWYgKGluZGV4IDw9IG1heEluZGV4KSB7XG4gICAgICAgICAgICByZXR1cm4gbWFwSXRlcmF0b3JWYWx1ZShcbiAgICAgICAgICAgICAgdHlwZSxcbiAgICAgICAgICAgICAgbm9kZS5lbnRyaWVzW3RoaXMuX3JldmVyc2UgPyBtYXhJbmRleCAtIGluZGV4IDogaW5kZXhdXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBtYXhJbmRleCA9IG5vZGUubm9kZXMubGVuZ3RoIC0gMTtcbiAgICAgICAgICBpZiAoaW5kZXggPD0gbWF4SW5kZXgpIHtcbiAgICAgICAgICAgIHZhciBzdWJOb2RlID0gbm9kZS5ub2Rlc1t0aGlzLl9yZXZlcnNlID8gbWF4SW5kZXggLSBpbmRleCA6IGluZGV4XTtcbiAgICAgICAgICAgIGlmIChzdWJOb2RlKSB7XG4gICAgICAgICAgICAgIGlmIChzdWJOb2RlLmVudHJ5KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1hcEl0ZXJhdG9yVmFsdWUodHlwZSwgc3ViTm9kZS5lbnRyeSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgc3RhY2sgPSB0aGlzLl9zdGFjayA9IG1hcEl0ZXJhdG9yRnJhbWUoc3ViTm9kZSwgc3RhY2spO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHN0YWNrID0gdGhpcy5fc3RhY2sgPSB0aGlzLl9zdGFjay5fX3ByZXY7XG4gICAgICB9XG4gICAgICByZXR1cm4gaXRlcmF0b3JEb25lKCk7XG4gICAgfTtcblxuICAgIHJldHVybiBNYXBJdGVyYXRvcjtcbiAgfShJdGVyYXRvcikpO1xuXG4gIGZ1bmN0aW9uIG1hcEl0ZXJhdG9yVmFsdWUodHlwZSwgZW50cnkpIHtcbiAgICByZXR1cm4gaXRlcmF0b3JWYWx1ZSh0eXBlLCBlbnRyeVswXSwgZW50cnlbMV0pO1xuICB9XG5cbiAgZnVuY3Rpb24gbWFwSXRlcmF0b3JGcmFtZShub2RlLCBwcmV2KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5vZGU6IG5vZGUsXG4gICAgICBpbmRleDogMCxcbiAgICAgIF9fcHJldjogcHJldixcbiAgICB9O1xuICB9XG5cbiAgZnVuY3Rpb24gbWFrZU1hcChzaXplLCByb290LCBvd25lcklELCBoYXNoKSB7XG4gICAgdmFyIG1hcCA9IE9iamVjdC5jcmVhdGUoTWFwUHJvdG90eXBlKTtcbiAgICBtYXAuc2l6ZSA9IHNpemU7XG4gICAgbWFwLl9yb290ID0gcm9vdDtcbiAgICBtYXAuX19vd25lcklEID0gb3duZXJJRDtcbiAgICBtYXAuX19oYXNoID0gaGFzaDtcbiAgICBtYXAuX19hbHRlcmVkID0gZmFsc2U7XG4gICAgcmV0dXJuIG1hcDtcbiAgfVxuXG4gIHZhciBFTVBUWV9NQVA7XG4gIGZ1bmN0aW9uIGVtcHR5TWFwKCkge1xuICAgIHJldHVybiBFTVBUWV9NQVAgfHwgKEVNUFRZX01BUCA9IG1ha2VNYXAoMCkpO1xuICB9XG5cbiAgZnVuY3Rpb24gdXBkYXRlTWFwKG1hcCwgaywgdikge1xuICAgIHZhciBuZXdSb290O1xuICAgIHZhciBuZXdTaXplO1xuICAgIGlmICghbWFwLl9yb290KSB7XG4gICAgICBpZiAodiA9PT0gTk9UX1NFVCkge1xuICAgICAgICByZXR1cm4gbWFwO1xuICAgICAgfVxuICAgICAgbmV3U2l6ZSA9IDE7XG4gICAgICBuZXdSb290ID0gbmV3IEFycmF5TWFwTm9kZShtYXAuX19vd25lcklELCBbW2ssIHZdXSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBkaWRDaGFuZ2VTaXplID0gTWFrZVJlZigpO1xuICAgICAgdmFyIGRpZEFsdGVyID0gTWFrZVJlZigpO1xuICAgICAgbmV3Um9vdCA9IHVwZGF0ZU5vZGUoXG4gICAgICAgIG1hcC5fcm9vdCxcbiAgICAgICAgbWFwLl9fb3duZXJJRCxcbiAgICAgICAgMCxcbiAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICBrLFxuICAgICAgICB2LFxuICAgICAgICBkaWRDaGFuZ2VTaXplLFxuICAgICAgICBkaWRBbHRlclxuICAgICAgKTtcbiAgICAgIGlmICghZGlkQWx0ZXIudmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIG1hcDtcbiAgICAgIH1cbiAgICAgIG5ld1NpemUgPSBtYXAuc2l6ZSArIChkaWRDaGFuZ2VTaXplLnZhbHVlID8gKHYgPT09IE5PVF9TRVQgPyAtMSA6IDEpIDogMCk7XG4gICAgfVxuICAgIGlmIChtYXAuX19vd25lcklEKSB7XG4gICAgICBtYXAuc2l6ZSA9IG5ld1NpemU7XG4gICAgICBtYXAuX3Jvb3QgPSBuZXdSb290O1xuICAgICAgbWFwLl9faGFzaCA9IHVuZGVmaW5lZDtcbiAgICAgIG1hcC5fX2FsdGVyZWQgPSB0cnVlO1xuICAgICAgcmV0dXJuIG1hcDtcbiAgICB9XG4gICAgcmV0dXJuIG5ld1Jvb3QgPyBtYWtlTWFwKG5ld1NpemUsIG5ld1Jvb3QpIDogZW1wdHlNYXAoKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHVwZGF0ZU5vZGUoXG4gICAgbm9kZSxcbiAgICBvd25lcklELFxuICAgIHNoaWZ0LFxuICAgIGtleUhhc2gsXG4gICAga2V5LFxuICAgIHZhbHVlLFxuICAgIGRpZENoYW5nZVNpemUsXG4gICAgZGlkQWx0ZXJcbiAgKSB7XG4gICAgaWYgKCFub2RlKSB7XG4gICAgICBpZiAodmFsdWUgPT09IE5PVF9TRVQpIHtcbiAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICB9XG4gICAgICBTZXRSZWYoZGlkQWx0ZXIpO1xuICAgICAgU2V0UmVmKGRpZENoYW5nZVNpemUpO1xuICAgICAgcmV0dXJuIG5ldyBWYWx1ZU5vZGUob3duZXJJRCwga2V5SGFzaCwgW2tleSwgdmFsdWVdKTtcbiAgICB9XG4gICAgcmV0dXJuIG5vZGUudXBkYXRlKFxuICAgICAgb3duZXJJRCxcbiAgICAgIHNoaWZ0LFxuICAgICAga2V5SGFzaCxcbiAgICAgIGtleSxcbiAgICAgIHZhbHVlLFxuICAgICAgZGlkQ2hhbmdlU2l6ZSxcbiAgICAgIGRpZEFsdGVyXG4gICAgKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGlzTGVhZk5vZGUobm9kZSkge1xuICAgIHJldHVybiAoXG4gICAgICBub2RlLmNvbnN0cnVjdG9yID09PSBWYWx1ZU5vZGUgfHwgbm9kZS5jb25zdHJ1Y3RvciA9PT0gSGFzaENvbGxpc2lvbk5vZGVcbiAgICApO1xuICB9XG5cbiAgZnVuY3Rpb24gbWVyZ2VJbnRvTm9kZShub2RlLCBvd25lcklELCBzaGlmdCwga2V5SGFzaCwgZW50cnkpIHtcbiAgICBpZiAobm9kZS5rZXlIYXNoID09PSBrZXlIYXNoKSB7XG4gICAgICByZXR1cm4gbmV3IEhhc2hDb2xsaXNpb25Ob2RlKG93bmVySUQsIGtleUhhc2gsIFtub2RlLmVudHJ5LCBlbnRyeV0pO1xuICAgIH1cblxuICAgIHZhciBpZHgxID0gKHNoaWZ0ID09PSAwID8gbm9kZS5rZXlIYXNoIDogbm9kZS5rZXlIYXNoID4+PiBzaGlmdCkgJiBNQVNLO1xuICAgIHZhciBpZHgyID0gKHNoaWZ0ID09PSAwID8ga2V5SGFzaCA6IGtleUhhc2ggPj4+IHNoaWZ0KSAmIE1BU0s7XG5cbiAgICB2YXIgbmV3Tm9kZTtcbiAgICB2YXIgbm9kZXMgPVxuICAgICAgaWR4MSA9PT0gaWR4MlxuICAgICAgICA/IFttZXJnZUludG9Ob2RlKG5vZGUsIG93bmVySUQsIHNoaWZ0ICsgU0hJRlQsIGtleUhhc2gsIGVudHJ5KV1cbiAgICAgICAgOiAoKG5ld05vZGUgPSBuZXcgVmFsdWVOb2RlKG93bmVySUQsIGtleUhhc2gsIGVudHJ5KSksXG4gICAgICAgICAgaWR4MSA8IGlkeDIgPyBbbm9kZSwgbmV3Tm9kZV0gOiBbbmV3Tm9kZSwgbm9kZV0pO1xuXG4gICAgcmV0dXJuIG5ldyBCaXRtYXBJbmRleGVkTm9kZShvd25lcklELCAoMSA8PCBpZHgxKSB8ICgxIDw8IGlkeDIpLCBub2Rlcyk7XG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVOb2Rlcyhvd25lcklELCBlbnRyaWVzLCBrZXksIHZhbHVlKSB7XG4gICAgaWYgKCFvd25lcklEKSB7XG4gICAgICBvd25lcklEID0gbmV3IE93bmVySUQoKTtcbiAgICB9XG4gICAgdmFyIG5vZGUgPSBuZXcgVmFsdWVOb2RlKG93bmVySUQsIGhhc2goa2V5KSwgW2tleSwgdmFsdWVdKTtcbiAgICBmb3IgKHZhciBpaSA9IDA7IGlpIDwgZW50cmllcy5sZW5ndGg7IGlpKyspIHtcbiAgICAgIHZhciBlbnRyeSA9IGVudHJpZXNbaWldO1xuICAgICAgbm9kZSA9IG5vZGUudXBkYXRlKG93bmVySUQsIDAsIHVuZGVmaW5lZCwgZW50cnlbMF0sIGVudHJ5WzFdKTtcbiAgICB9XG4gICAgcmV0dXJuIG5vZGU7XG4gIH1cblxuICBmdW5jdGlvbiBwYWNrTm9kZXMob3duZXJJRCwgbm9kZXMsIGNvdW50LCBleGNsdWRpbmcpIHtcbiAgICB2YXIgYml0bWFwID0gMDtcbiAgICB2YXIgcGFja2VkSUkgPSAwO1xuICAgIHZhciBwYWNrZWROb2RlcyA9IG5ldyBBcnJheShjb3VudCk7XG4gICAgZm9yICh2YXIgaWkgPSAwLCBiaXQgPSAxLCBsZW4gPSBub2Rlcy5sZW5ndGg7IGlpIDwgbGVuOyBpaSsrLCBiaXQgPDw9IDEpIHtcbiAgICAgIHZhciBub2RlID0gbm9kZXNbaWldO1xuICAgICAgaWYgKG5vZGUgIT09IHVuZGVmaW5lZCAmJiBpaSAhPT0gZXhjbHVkaW5nKSB7XG4gICAgICAgIGJpdG1hcCB8PSBiaXQ7XG4gICAgICAgIHBhY2tlZE5vZGVzW3BhY2tlZElJKytdID0gbm9kZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG5ldyBCaXRtYXBJbmRleGVkTm9kZShvd25lcklELCBiaXRtYXAsIHBhY2tlZE5vZGVzKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGV4cGFuZE5vZGVzKG93bmVySUQsIG5vZGVzLCBiaXRtYXAsIGluY2x1ZGluZywgbm9kZSkge1xuICAgIHZhciBjb3VudCA9IDA7XG4gICAgdmFyIGV4cGFuZGVkTm9kZXMgPSBuZXcgQXJyYXkoU0laRSk7XG4gICAgZm9yICh2YXIgaWkgPSAwOyBiaXRtYXAgIT09IDA7IGlpKyssIGJpdG1hcCA+Pj49IDEpIHtcbiAgICAgIGV4cGFuZGVkTm9kZXNbaWldID0gYml0bWFwICYgMSA/IG5vZGVzW2NvdW50KytdIDogdW5kZWZpbmVkO1xuICAgIH1cbiAgICBleHBhbmRlZE5vZGVzW2luY2x1ZGluZ10gPSBub2RlO1xuICAgIHJldHVybiBuZXcgSGFzaEFycmF5TWFwTm9kZShvd25lcklELCBjb3VudCArIDEsIGV4cGFuZGVkTm9kZXMpO1xuICB9XG5cbiAgZnVuY3Rpb24gcG9wQ291bnQoeCkge1xuICAgIHggLT0gKHggPj4gMSkgJiAweDU1NTU1NTU1O1xuICAgIHggPSAoeCAmIDB4MzMzMzMzMzMpICsgKCh4ID4+IDIpICYgMHgzMzMzMzMzMyk7XG4gICAgeCA9ICh4ICsgKHggPj4gNCkpICYgMHgwZjBmMGYwZjtcbiAgICB4ICs9IHggPj4gODtcbiAgICB4ICs9IHggPj4gMTY7XG4gICAgcmV0dXJuIHggJiAweDdmO1xuICB9XG5cbiAgZnVuY3Rpb24gc2V0QXQoYXJyYXksIGlkeCwgdmFsLCBjYW5FZGl0KSB7XG4gICAgdmFyIG5ld0FycmF5ID0gY2FuRWRpdCA/IGFycmF5IDogYXJyQ29weShhcnJheSk7XG4gICAgbmV3QXJyYXlbaWR4XSA9IHZhbDtcbiAgICByZXR1cm4gbmV3QXJyYXk7XG4gIH1cblxuICBmdW5jdGlvbiBzcGxpY2VJbihhcnJheSwgaWR4LCB2YWwsIGNhbkVkaXQpIHtcbiAgICB2YXIgbmV3TGVuID0gYXJyYXkubGVuZ3RoICsgMTtcbiAgICBpZiAoY2FuRWRpdCAmJiBpZHggKyAxID09PSBuZXdMZW4pIHtcbiAgICAgIGFycmF5W2lkeF0gPSB2YWw7XG4gICAgICByZXR1cm4gYXJyYXk7XG4gICAgfVxuICAgIHZhciBuZXdBcnJheSA9IG5ldyBBcnJheShuZXdMZW4pO1xuICAgIHZhciBhZnRlciA9IDA7XG4gICAgZm9yICh2YXIgaWkgPSAwOyBpaSA8IG5ld0xlbjsgaWkrKykge1xuICAgICAgaWYgKGlpID09PSBpZHgpIHtcbiAgICAgICAgbmV3QXJyYXlbaWldID0gdmFsO1xuICAgICAgICBhZnRlciA9IC0xO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbmV3QXJyYXlbaWldID0gYXJyYXlbaWkgKyBhZnRlcl07XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBuZXdBcnJheTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHNwbGljZU91dChhcnJheSwgaWR4LCBjYW5FZGl0KSB7XG4gICAgdmFyIG5ld0xlbiA9IGFycmF5Lmxlbmd0aCAtIDE7XG4gICAgaWYgKGNhbkVkaXQgJiYgaWR4ID09PSBuZXdMZW4pIHtcbiAgICAgIGFycmF5LnBvcCgpO1xuICAgICAgcmV0dXJuIGFycmF5O1xuICAgIH1cbiAgICB2YXIgbmV3QXJyYXkgPSBuZXcgQXJyYXkobmV3TGVuKTtcbiAgICB2YXIgYWZ0ZXIgPSAwO1xuICAgIGZvciAodmFyIGlpID0gMDsgaWkgPCBuZXdMZW47IGlpKyspIHtcbiAgICAgIGlmIChpaSA9PT0gaWR4KSB7XG4gICAgICAgIGFmdGVyID0gMTtcbiAgICAgIH1cbiAgICAgIG5ld0FycmF5W2lpXSA9IGFycmF5W2lpICsgYWZ0ZXJdO1xuICAgIH1cbiAgICByZXR1cm4gbmV3QXJyYXk7XG4gIH1cblxuICB2YXIgTUFYX0FSUkFZX01BUF9TSVpFID0gU0laRSAvIDQ7XG4gIHZhciBNQVhfQklUTUFQX0lOREVYRURfU0laRSA9IFNJWkUgLyAyO1xuICB2YXIgTUlOX0hBU0hfQVJSQVlfTUFQX1NJWkUgPSBTSVpFIC8gNDtcblxuICB2YXIgSVNfTElTVF9TWU1CT0wgPSAnQEBfX0lNTVVUQUJMRV9MSVNUX19AQCc7XG5cbiAgZnVuY3Rpb24gaXNMaXN0KG1heWJlTGlzdCkge1xuICAgIHJldHVybiBCb29sZWFuKG1heWJlTGlzdCAmJiBtYXliZUxpc3RbSVNfTElTVF9TWU1CT0xdKTtcbiAgfVxuXG4gIHZhciBMaXN0ID0gLypAX19QVVJFX18qLyhmdW5jdGlvbiAoSW5kZXhlZENvbGxlY3Rpb24pIHtcbiAgICBmdW5jdGlvbiBMaXN0KHZhbHVlKSB7XG4gICAgICB2YXIgZW1wdHkgPSBlbXB0eUxpc3QoKTtcbiAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBlbXB0eTtcbiAgICAgIH1cbiAgICAgIGlmIChpc0xpc3QodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIHZhciBpdGVyID0gSW5kZXhlZENvbGxlY3Rpb24odmFsdWUpO1xuICAgICAgdmFyIHNpemUgPSBpdGVyLnNpemU7XG4gICAgICBpZiAoc2l6ZSA9PT0gMCkge1xuICAgICAgICByZXR1cm4gZW1wdHk7XG4gICAgICB9XG4gICAgICBhc3NlcnROb3RJbmZpbml0ZShzaXplKTtcbiAgICAgIGlmIChzaXplID4gMCAmJiBzaXplIDwgU0laRSkge1xuICAgICAgICByZXR1cm4gbWFrZUxpc3QoMCwgc2l6ZSwgU0hJRlQsIG51bGwsIG5ldyBWTm9kZShpdGVyLnRvQXJyYXkoKSkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGVtcHR5LndpdGhNdXRhdGlvbnMoZnVuY3Rpb24gKGxpc3QpIHtcbiAgICAgICAgbGlzdC5zZXRTaXplKHNpemUpO1xuICAgICAgICBpdGVyLmZvckVhY2goZnVuY3Rpb24gKHYsIGkpIHsgcmV0dXJuIGxpc3Quc2V0KGksIHYpOyB9KTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICggSW5kZXhlZENvbGxlY3Rpb24gKSBMaXN0Ll9fcHJvdG9fXyA9IEluZGV4ZWRDb2xsZWN0aW9uO1xuICAgIExpc3QucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggSW5kZXhlZENvbGxlY3Rpb24gJiYgSW5kZXhlZENvbGxlY3Rpb24ucHJvdG90eXBlICk7XG4gICAgTGlzdC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBMaXN0O1xuXG4gICAgTGlzdC5vZiA9IGZ1bmN0aW9uIG9mICgvKi4uLnZhbHVlcyovKSB7XG4gICAgICByZXR1cm4gdGhpcyhhcmd1bWVudHMpO1xuICAgIH07XG5cbiAgICBMaXN0LnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nICgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9fdG9TdHJpbmcoJ0xpc3QgWycsICddJyk7XG4gICAgfTtcblxuICAgIC8vIEBwcmFnbWEgQWNjZXNzXG5cbiAgICBMaXN0LnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiBnZXQgKGluZGV4LCBub3RTZXRWYWx1ZSkge1xuICAgICAgaW5kZXggPSB3cmFwSW5kZXgodGhpcywgaW5kZXgpO1xuICAgICAgaWYgKGluZGV4ID49IDAgJiYgaW5kZXggPCB0aGlzLnNpemUpIHtcbiAgICAgICAgaW5kZXggKz0gdGhpcy5fb3JpZ2luO1xuICAgICAgICB2YXIgbm9kZSA9IGxpc3ROb2RlRm9yKHRoaXMsIGluZGV4KTtcbiAgICAgICAgcmV0dXJuIG5vZGUgJiYgbm9kZS5hcnJheVtpbmRleCAmIE1BU0tdO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5vdFNldFZhbHVlO1xuICAgIH07XG5cbiAgICAvLyBAcHJhZ21hIE1vZGlmaWNhdGlvblxuXG4gICAgTGlzdC5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24gc2V0IChpbmRleCwgdmFsdWUpIHtcbiAgICAgIHJldHVybiB1cGRhdGVMaXN0KHRoaXMsIGluZGV4LCB2YWx1ZSk7XG4gICAgfTtcblxuICAgIExpc3QucHJvdG90eXBlLnJlbW92ZSA9IGZ1bmN0aW9uIHJlbW92ZSAoaW5kZXgpIHtcbiAgICAgIHJldHVybiAhdGhpcy5oYXMoaW5kZXgpXG4gICAgICAgID8gdGhpc1xuICAgICAgICA6IGluZGV4ID09PSAwXG4gICAgICAgID8gdGhpcy5zaGlmdCgpXG4gICAgICAgIDogaW5kZXggPT09IHRoaXMuc2l6ZSAtIDFcbiAgICAgICAgPyB0aGlzLnBvcCgpXG4gICAgICAgIDogdGhpcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIH07XG5cbiAgICBMaXN0LnByb3RvdHlwZS5pbnNlcnQgPSBmdW5jdGlvbiBpbnNlcnQgKGluZGV4LCB2YWx1ZSkge1xuICAgICAgcmV0dXJuIHRoaXMuc3BsaWNlKGluZGV4LCAwLCB2YWx1ZSk7XG4gICAgfTtcblxuICAgIExpc3QucHJvdG90eXBlLmNsZWFyID0gZnVuY3Rpb24gY2xlYXIgKCkge1xuICAgICAgaWYgKHRoaXMuc2l6ZSA9PT0gMCkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLl9fb3duZXJJRCkge1xuICAgICAgICB0aGlzLnNpemUgPSB0aGlzLl9vcmlnaW4gPSB0aGlzLl9jYXBhY2l0eSA9IDA7XG4gICAgICAgIHRoaXMuX2xldmVsID0gU0hJRlQ7XG4gICAgICAgIHRoaXMuX3Jvb3QgPSB0aGlzLl90YWlsID0gdGhpcy5fX2hhc2ggPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuX19hbHRlcmVkID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG4gICAgICByZXR1cm4gZW1wdHlMaXN0KCk7XG4gICAgfTtcblxuICAgIExpc3QucHJvdG90eXBlLnB1c2ggPSBmdW5jdGlvbiBwdXNoICgvKi4uLnZhbHVlcyovKSB7XG4gICAgICB2YXIgdmFsdWVzID0gYXJndW1lbnRzO1xuICAgICAgdmFyIG9sZFNpemUgPSB0aGlzLnNpemU7XG4gICAgICByZXR1cm4gdGhpcy53aXRoTXV0YXRpb25zKGZ1bmN0aW9uIChsaXN0KSB7XG4gICAgICAgIHNldExpc3RCb3VuZHMobGlzdCwgMCwgb2xkU2l6ZSArIHZhbHVlcy5sZW5ndGgpO1xuICAgICAgICBmb3IgKHZhciBpaSA9IDA7IGlpIDwgdmFsdWVzLmxlbmd0aDsgaWkrKykge1xuICAgICAgICAgIGxpc3Quc2V0KG9sZFNpemUgKyBpaSwgdmFsdWVzW2lpXSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBMaXN0LnByb3RvdHlwZS5wb3AgPSBmdW5jdGlvbiBwb3AgKCkge1xuICAgICAgcmV0dXJuIHNldExpc3RCb3VuZHModGhpcywgMCwgLTEpO1xuICAgIH07XG5cbiAgICBMaXN0LnByb3RvdHlwZS51bnNoaWZ0ID0gZnVuY3Rpb24gdW5zaGlmdCAoLyouLi52YWx1ZXMqLykge1xuICAgICAgdmFyIHZhbHVlcyA9IGFyZ3VtZW50cztcbiAgICAgIHJldHVybiB0aGlzLndpdGhNdXRhdGlvbnMoZnVuY3Rpb24gKGxpc3QpIHtcbiAgICAgICAgc2V0TGlzdEJvdW5kcyhsaXN0LCAtdmFsdWVzLmxlbmd0aCk7XG4gICAgICAgIGZvciAodmFyIGlpID0gMDsgaWkgPCB2YWx1ZXMubGVuZ3RoOyBpaSsrKSB7XG4gICAgICAgICAgbGlzdC5zZXQoaWksIHZhbHVlc1tpaV0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgTGlzdC5wcm90b3R5cGUuc2hpZnQgPSBmdW5jdGlvbiBzaGlmdCAoKSB7XG4gICAgICByZXR1cm4gc2V0TGlzdEJvdW5kcyh0aGlzLCAxKTtcbiAgICB9O1xuXG4gICAgLy8gQHByYWdtYSBDb21wb3NpdGlvblxuXG4gICAgTGlzdC5wcm90b3R5cGUuY29uY2F0ID0gZnVuY3Rpb24gY29uY2F0ICgvKi4uLmNvbGxlY3Rpb25zKi8pIHtcbiAgICAgIHZhciBhcmd1bWVudHMkMSA9IGFyZ3VtZW50cztcblxuICAgICAgdmFyIHNlcXMgPSBbXTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBhcmd1bWVudCA9IGFyZ3VtZW50cyQxW2ldO1xuICAgICAgICB2YXIgc2VxID0gSW5kZXhlZENvbGxlY3Rpb24oXG4gICAgICAgICAgdHlwZW9mIGFyZ3VtZW50ICE9PSAnc3RyaW5nJyAmJiBoYXNJdGVyYXRvcihhcmd1bWVudClcbiAgICAgICAgICAgID8gYXJndW1lbnRcbiAgICAgICAgICAgIDogW2FyZ3VtZW50XVxuICAgICAgICApO1xuICAgICAgICBpZiAoc2VxLnNpemUgIT09IDApIHtcbiAgICAgICAgICBzZXFzLnB1c2goc2VxKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHNlcXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuc2l6ZSA9PT0gMCAmJiAhdGhpcy5fX293bmVySUQgJiYgc2Vxcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29uc3RydWN0b3Ioc2Vxc1swXSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy53aXRoTXV0YXRpb25zKGZ1bmN0aW9uIChsaXN0KSB7XG4gICAgICAgIHNlcXMuZm9yRWFjaChmdW5jdGlvbiAoc2VxKSB7IHJldHVybiBzZXEuZm9yRWFjaChmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIGxpc3QucHVzaCh2YWx1ZSk7IH0pOyB9KTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBMaXN0LnByb3RvdHlwZS5zZXRTaXplID0gZnVuY3Rpb24gc2V0U2l6ZSAoc2l6ZSkge1xuICAgICAgcmV0dXJuIHNldExpc3RCb3VuZHModGhpcywgMCwgc2l6ZSk7XG4gICAgfTtcblxuICAgIExpc3QucHJvdG90eXBlLm1hcCA9IGZ1bmN0aW9uIG1hcCAobWFwcGVyLCBjb250ZXh0KSB7XG4gICAgICB2YXIgdGhpcyQxJDEgPSB0aGlzO1xuXG4gICAgICByZXR1cm4gdGhpcy53aXRoTXV0YXRpb25zKGZ1bmN0aW9uIChsaXN0KSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcyQxJDEuc2l6ZTsgaSsrKSB7XG4gICAgICAgICAgbGlzdC5zZXQoaSwgbWFwcGVyLmNhbGwoY29udGV4dCwgbGlzdC5nZXQoaSksIGksIHRoaXMkMSQxKSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICAvLyBAcHJhZ21hIEl0ZXJhdGlvblxuXG4gICAgTGlzdC5wcm90b3R5cGUuc2xpY2UgPSBmdW5jdGlvbiBzbGljZSAoYmVnaW4sIGVuZCkge1xuICAgICAgdmFyIHNpemUgPSB0aGlzLnNpemU7XG4gICAgICBpZiAod2hvbGVTbGljZShiZWdpbiwgZW5kLCBzaXplKSkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cbiAgICAgIHJldHVybiBzZXRMaXN0Qm91bmRzKFxuICAgICAgICB0aGlzLFxuICAgICAgICByZXNvbHZlQmVnaW4oYmVnaW4sIHNpemUpLFxuICAgICAgICByZXNvbHZlRW5kKGVuZCwgc2l6ZSlcbiAgICAgICk7XG4gICAgfTtcblxuICAgIExpc3QucHJvdG90eXBlLl9faXRlcmF0b3IgPSBmdW5jdGlvbiBfX2l0ZXJhdG9yICh0eXBlLCByZXZlcnNlKSB7XG4gICAgICB2YXIgaW5kZXggPSByZXZlcnNlID8gdGhpcy5zaXplIDogMDtcbiAgICAgIHZhciB2YWx1ZXMgPSBpdGVyYXRlTGlzdCh0aGlzLCByZXZlcnNlKTtcbiAgICAgIHJldHVybiBuZXcgSXRlcmF0b3IoZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgdmFsdWUgPSB2YWx1ZXMoKTtcbiAgICAgICAgcmV0dXJuIHZhbHVlID09PSBET05FXG4gICAgICAgICAgPyBpdGVyYXRvckRvbmUoKVxuICAgICAgICAgIDogaXRlcmF0b3JWYWx1ZSh0eXBlLCByZXZlcnNlID8gLS1pbmRleCA6IGluZGV4KyssIHZhbHVlKTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBMaXN0LnByb3RvdHlwZS5fX2l0ZXJhdGUgPSBmdW5jdGlvbiBfX2l0ZXJhdGUgKGZuLCByZXZlcnNlKSB7XG4gICAgICB2YXIgaW5kZXggPSByZXZlcnNlID8gdGhpcy5zaXplIDogMDtcbiAgICAgIHZhciB2YWx1ZXMgPSBpdGVyYXRlTGlzdCh0aGlzLCByZXZlcnNlKTtcbiAgICAgIHZhciB2YWx1ZTtcbiAgICAgIHdoaWxlICgodmFsdWUgPSB2YWx1ZXMoKSkgIT09IERPTkUpIHtcbiAgICAgICAgaWYgKGZuKHZhbHVlLCByZXZlcnNlID8gLS1pbmRleCA6IGluZGV4KyssIHRoaXMpID09PSBmYWxzZSkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gaW5kZXg7XG4gICAgfTtcblxuICAgIExpc3QucHJvdG90eXBlLl9fZW5zdXJlT3duZXIgPSBmdW5jdGlvbiBfX2Vuc3VyZU93bmVyIChvd25lcklEKSB7XG4gICAgICBpZiAob3duZXJJRCA9PT0gdGhpcy5fX293bmVySUQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG4gICAgICBpZiAoIW93bmVySUQpIHtcbiAgICAgICAgaWYgKHRoaXMuc2l6ZSA9PT0gMCkge1xuICAgICAgICAgIHJldHVybiBlbXB0eUxpc3QoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9fb3duZXJJRCA9IG93bmVySUQ7XG4gICAgICAgIHRoaXMuX19hbHRlcmVkID0gZmFsc2U7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG1ha2VMaXN0KFxuICAgICAgICB0aGlzLl9vcmlnaW4sXG4gICAgICAgIHRoaXMuX2NhcGFjaXR5LFxuICAgICAgICB0aGlzLl9sZXZlbCxcbiAgICAgICAgdGhpcy5fcm9vdCxcbiAgICAgICAgdGhpcy5fdGFpbCxcbiAgICAgICAgb3duZXJJRCxcbiAgICAgICAgdGhpcy5fX2hhc2hcbiAgICAgICk7XG4gICAgfTtcblxuICAgIHJldHVybiBMaXN0O1xuICB9KEluZGV4ZWRDb2xsZWN0aW9uKSk7XG5cbiAgTGlzdC5pc0xpc3QgPSBpc0xpc3Q7XG5cbiAgdmFyIExpc3RQcm90b3R5cGUgPSBMaXN0LnByb3RvdHlwZTtcbiAgTGlzdFByb3RvdHlwZVtJU19MSVNUX1NZTUJPTF0gPSB0cnVlO1xuICBMaXN0UHJvdG90eXBlW0RFTEVURV0gPSBMaXN0UHJvdG90eXBlLnJlbW92ZTtcbiAgTGlzdFByb3RvdHlwZS5tZXJnZSA9IExpc3RQcm90b3R5cGUuY29uY2F0O1xuICBMaXN0UHJvdG90eXBlLnNldEluID0gc2V0SW47XG4gIExpc3RQcm90b3R5cGUuZGVsZXRlSW4gPSBMaXN0UHJvdG90eXBlLnJlbW92ZUluID0gZGVsZXRlSW47XG4gIExpc3RQcm90b3R5cGUudXBkYXRlID0gdXBkYXRlO1xuICBMaXN0UHJvdG90eXBlLnVwZGF0ZUluID0gdXBkYXRlSW47XG4gIExpc3RQcm90b3R5cGUubWVyZ2VJbiA9IG1lcmdlSW47XG4gIExpc3RQcm90b3R5cGUubWVyZ2VEZWVwSW4gPSBtZXJnZURlZXBJbjtcbiAgTGlzdFByb3RvdHlwZS53aXRoTXV0YXRpb25zID0gd2l0aE11dGF0aW9ucztcbiAgTGlzdFByb3RvdHlwZS53YXNBbHRlcmVkID0gd2FzQWx0ZXJlZDtcbiAgTGlzdFByb3RvdHlwZS5hc0ltbXV0YWJsZSA9IGFzSW1tdXRhYmxlO1xuICBMaXN0UHJvdG90eXBlWydAQHRyYW5zZHVjZXIvaW5pdCddID0gTGlzdFByb3RvdHlwZS5hc011dGFibGUgPSBhc011dGFibGU7XG4gIExpc3RQcm90b3R5cGVbJ0BAdHJhbnNkdWNlci9zdGVwJ10gPSBmdW5jdGlvbiAocmVzdWx0LCBhcnIpIHtcbiAgICByZXR1cm4gcmVzdWx0LnB1c2goYXJyKTtcbiAgfTtcbiAgTGlzdFByb3RvdHlwZVsnQEB0cmFuc2R1Y2VyL3Jlc3VsdCddID0gZnVuY3Rpb24gKG9iaikge1xuICAgIHJldHVybiBvYmouYXNJbW11dGFibGUoKTtcbiAgfTtcblxuICB2YXIgVk5vZGUgPSBmdW5jdGlvbiBWTm9kZShhcnJheSwgb3duZXJJRCkge1xuICAgIHRoaXMuYXJyYXkgPSBhcnJheTtcbiAgICB0aGlzLm93bmVySUQgPSBvd25lcklEO1xuICB9O1xuXG4gIC8vIFRPRE86IHNlZW1zIGxpa2UgdGhlc2UgbWV0aG9kcyBhcmUgdmVyeSBzaW1pbGFyXG5cbiAgVk5vZGUucHJvdG90eXBlLnJlbW92ZUJlZm9yZSA9IGZ1bmN0aW9uIHJlbW92ZUJlZm9yZSAob3duZXJJRCwgbGV2ZWwsIGluZGV4KSB7XG4gICAgaWYgKGluZGV4ID09PSBsZXZlbCA/IDEgPDwgbGV2ZWwgOiB0aGlzLmFycmF5Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHZhciBvcmlnaW5JbmRleCA9IChpbmRleCA+Pj4gbGV2ZWwpICYgTUFTSztcbiAgICBpZiAob3JpZ2luSW5kZXggPj0gdGhpcy5hcnJheS5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBuZXcgVk5vZGUoW10sIG93bmVySUQpO1xuICAgIH1cbiAgICB2YXIgcmVtb3ZpbmdGaXJzdCA9IG9yaWdpbkluZGV4ID09PSAwO1xuICAgIHZhciBuZXdDaGlsZDtcbiAgICBpZiAobGV2ZWwgPiAwKSB7XG4gICAgICB2YXIgb2xkQ2hpbGQgPSB0aGlzLmFycmF5W29yaWdpbkluZGV4XTtcbiAgICAgIG5ld0NoaWxkID1cbiAgICAgICAgb2xkQ2hpbGQgJiYgb2xkQ2hpbGQucmVtb3ZlQmVmb3JlKG93bmVySUQsIGxldmVsIC0gU0hJRlQsIGluZGV4KTtcbiAgICAgIGlmIChuZXdDaGlsZCA9PT0gb2xkQ2hpbGQgJiYgcmVtb3ZpbmdGaXJzdCkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHJlbW92aW5nRmlyc3QgJiYgIW5ld0NoaWxkKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgdmFyIGVkaXRhYmxlID0gZWRpdGFibGVWTm9kZSh0aGlzLCBvd25lcklEKTtcbiAgICBpZiAoIXJlbW92aW5nRmlyc3QpIHtcbiAgICAgIGZvciAodmFyIGlpID0gMDsgaWkgPCBvcmlnaW5JbmRleDsgaWkrKykge1xuICAgICAgICBlZGl0YWJsZS5hcnJheVtpaV0gPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChuZXdDaGlsZCkge1xuICAgICAgZWRpdGFibGUuYXJyYXlbb3JpZ2luSW5kZXhdID0gbmV3Q2hpbGQ7XG4gICAgfVxuICAgIHJldHVybiBlZGl0YWJsZTtcbiAgfTtcblxuICBWTm9kZS5wcm90b3R5cGUucmVtb3ZlQWZ0ZXIgPSBmdW5jdGlvbiByZW1vdmVBZnRlciAob3duZXJJRCwgbGV2ZWwsIGluZGV4KSB7XG4gICAgaWYgKGluZGV4ID09PSAobGV2ZWwgPyAxIDw8IGxldmVsIDogMCkgfHwgdGhpcy5hcnJheS5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICB2YXIgc2l6ZUluZGV4ID0gKChpbmRleCAtIDEpID4+PiBsZXZlbCkgJiBNQVNLO1xuICAgIGlmIChzaXplSW5kZXggPj0gdGhpcy5hcnJheS5sZW5ndGgpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHZhciBuZXdDaGlsZDtcbiAgICBpZiAobGV2ZWwgPiAwKSB7XG4gICAgICB2YXIgb2xkQ2hpbGQgPSB0aGlzLmFycmF5W3NpemVJbmRleF07XG4gICAgICBuZXdDaGlsZCA9XG4gICAgICAgIG9sZENoaWxkICYmIG9sZENoaWxkLnJlbW92ZUFmdGVyKG93bmVySUQsIGxldmVsIC0gU0hJRlQsIGluZGV4KTtcbiAgICAgIGlmIChuZXdDaGlsZCA9PT0gb2xkQ2hpbGQgJiYgc2l6ZUluZGV4ID09PSB0aGlzLmFycmF5Lmxlbmd0aCAtIDEpIHtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGVkaXRhYmxlID0gZWRpdGFibGVWTm9kZSh0aGlzLCBvd25lcklEKTtcbiAgICBlZGl0YWJsZS5hcnJheS5zcGxpY2Uoc2l6ZUluZGV4ICsgMSk7XG4gICAgaWYgKG5ld0NoaWxkKSB7XG4gICAgICBlZGl0YWJsZS5hcnJheVtzaXplSW5kZXhdID0gbmV3Q2hpbGQ7XG4gICAgfVxuICAgIHJldHVybiBlZGl0YWJsZTtcbiAgfTtcblxuICB2YXIgRE9ORSA9IHt9O1xuXG4gIGZ1bmN0aW9uIGl0ZXJhdGVMaXN0KGxpc3QsIHJldmVyc2UpIHtcbiAgICB2YXIgbGVmdCA9IGxpc3QuX29yaWdpbjtcbiAgICB2YXIgcmlnaHQgPSBsaXN0Ll9jYXBhY2l0eTtcbiAgICB2YXIgdGFpbFBvcyA9IGdldFRhaWxPZmZzZXQocmlnaHQpO1xuICAgIHZhciB0YWlsID0gbGlzdC5fdGFpbDtcblxuICAgIHJldHVybiBpdGVyYXRlTm9kZU9yTGVhZihsaXN0Ll9yb290LCBsaXN0Ll9sZXZlbCwgMCk7XG5cbiAgICBmdW5jdGlvbiBpdGVyYXRlTm9kZU9yTGVhZihub2RlLCBsZXZlbCwgb2Zmc2V0KSB7XG4gICAgICByZXR1cm4gbGV2ZWwgPT09IDBcbiAgICAgICAgPyBpdGVyYXRlTGVhZihub2RlLCBvZmZzZXQpXG4gICAgICAgIDogaXRlcmF0ZU5vZGUobm9kZSwgbGV2ZWwsIG9mZnNldCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXRlcmF0ZUxlYWYobm9kZSwgb2Zmc2V0KSB7XG4gICAgICB2YXIgYXJyYXkgPSBvZmZzZXQgPT09IHRhaWxQb3MgPyB0YWlsICYmIHRhaWwuYXJyYXkgOiBub2RlICYmIG5vZGUuYXJyYXk7XG4gICAgICB2YXIgZnJvbSA9IG9mZnNldCA+IGxlZnQgPyAwIDogbGVmdCAtIG9mZnNldDtcbiAgICAgIHZhciB0byA9IHJpZ2h0IC0gb2Zmc2V0O1xuICAgICAgaWYgKHRvID4gU0laRSkge1xuICAgICAgICB0byA9IFNJWkU7XG4gICAgICB9XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoZnJvbSA9PT0gdG8pIHtcbiAgICAgICAgICByZXR1cm4gRE9ORTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgaWR4ID0gcmV2ZXJzZSA/IC0tdG8gOiBmcm9tKys7XG4gICAgICAgIHJldHVybiBhcnJheSAmJiBhcnJheVtpZHhdO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpdGVyYXRlTm9kZShub2RlLCBsZXZlbCwgb2Zmc2V0KSB7XG4gICAgICB2YXIgdmFsdWVzO1xuICAgICAgdmFyIGFycmF5ID0gbm9kZSAmJiBub2RlLmFycmF5O1xuICAgICAgdmFyIGZyb20gPSBvZmZzZXQgPiBsZWZ0ID8gMCA6IChsZWZ0IC0gb2Zmc2V0KSA+PiBsZXZlbDtcbiAgICAgIHZhciB0byA9ICgocmlnaHQgLSBvZmZzZXQpID4+IGxldmVsKSArIDE7XG4gICAgICBpZiAodG8gPiBTSVpFKSB7XG4gICAgICAgIHRvID0gU0laRTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgaWYgKHZhbHVlcykge1xuICAgICAgICAgICAgdmFyIHZhbHVlID0gdmFsdWVzKCk7XG4gICAgICAgICAgICBpZiAodmFsdWUgIT09IERPTkUpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFsdWVzID0gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGZyb20gPT09IHRvKSB7XG4gICAgICAgICAgICByZXR1cm4gRE9ORTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdmFyIGlkeCA9IHJldmVyc2UgPyAtLXRvIDogZnJvbSsrO1xuICAgICAgICAgIHZhbHVlcyA9IGl0ZXJhdGVOb2RlT3JMZWFmKFxuICAgICAgICAgICAgYXJyYXkgJiYgYXJyYXlbaWR4XSxcbiAgICAgICAgICAgIGxldmVsIC0gU0hJRlQsXG4gICAgICAgICAgICBvZmZzZXQgKyAoaWR4IDw8IGxldmVsKVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gbWFrZUxpc3Qob3JpZ2luLCBjYXBhY2l0eSwgbGV2ZWwsIHJvb3QsIHRhaWwsIG93bmVySUQsIGhhc2gpIHtcbiAgICB2YXIgbGlzdCA9IE9iamVjdC5jcmVhdGUoTGlzdFByb3RvdHlwZSk7XG4gICAgbGlzdC5zaXplID0gY2FwYWNpdHkgLSBvcmlnaW47XG4gICAgbGlzdC5fb3JpZ2luID0gb3JpZ2luO1xuICAgIGxpc3QuX2NhcGFjaXR5ID0gY2FwYWNpdHk7XG4gICAgbGlzdC5fbGV2ZWwgPSBsZXZlbDtcbiAgICBsaXN0Ll9yb290ID0gcm9vdDtcbiAgICBsaXN0Ll90YWlsID0gdGFpbDtcbiAgICBsaXN0Ll9fb3duZXJJRCA9IG93bmVySUQ7XG4gICAgbGlzdC5fX2hhc2ggPSBoYXNoO1xuICAgIGxpc3QuX19hbHRlcmVkID0gZmFsc2U7XG4gICAgcmV0dXJuIGxpc3Q7XG4gIH1cblxuICB2YXIgRU1QVFlfTElTVDtcbiAgZnVuY3Rpb24gZW1wdHlMaXN0KCkge1xuICAgIHJldHVybiBFTVBUWV9MSVNUIHx8IChFTVBUWV9MSVNUID0gbWFrZUxpc3QoMCwgMCwgU0hJRlQpKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHVwZGF0ZUxpc3QobGlzdCwgaW5kZXgsIHZhbHVlKSB7XG4gICAgaW5kZXggPSB3cmFwSW5kZXgobGlzdCwgaW5kZXgpO1xuXG4gICAgaWYgKGluZGV4ICE9PSBpbmRleCkge1xuICAgICAgcmV0dXJuIGxpc3Q7XG4gICAgfVxuXG4gICAgaWYgKGluZGV4ID49IGxpc3Quc2l6ZSB8fCBpbmRleCA8IDApIHtcbiAgICAgIHJldHVybiBsaXN0LndpdGhNdXRhdGlvbnMoZnVuY3Rpb24gKGxpc3QpIHtcbiAgICAgICAgaW5kZXggPCAwXG4gICAgICAgICAgPyBzZXRMaXN0Qm91bmRzKGxpc3QsIGluZGV4KS5zZXQoMCwgdmFsdWUpXG4gICAgICAgICAgOiBzZXRMaXN0Qm91bmRzKGxpc3QsIDAsIGluZGV4ICsgMSkuc2V0KGluZGV4LCB2YWx1ZSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpbmRleCArPSBsaXN0Ll9vcmlnaW47XG5cbiAgICB2YXIgbmV3VGFpbCA9IGxpc3QuX3RhaWw7XG4gICAgdmFyIG5ld1Jvb3QgPSBsaXN0Ll9yb290O1xuICAgIHZhciBkaWRBbHRlciA9IE1ha2VSZWYoKTtcbiAgICBpZiAoaW5kZXggPj0gZ2V0VGFpbE9mZnNldChsaXN0Ll9jYXBhY2l0eSkpIHtcbiAgICAgIG5ld1RhaWwgPSB1cGRhdGVWTm9kZShuZXdUYWlsLCBsaXN0Ll9fb3duZXJJRCwgMCwgaW5kZXgsIHZhbHVlLCBkaWRBbHRlcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5ld1Jvb3QgPSB1cGRhdGVWTm9kZShcbiAgICAgICAgbmV3Um9vdCxcbiAgICAgICAgbGlzdC5fX293bmVySUQsXG4gICAgICAgIGxpc3QuX2xldmVsLFxuICAgICAgICBpbmRleCxcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIGRpZEFsdGVyXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICghZGlkQWx0ZXIudmFsdWUpIHtcbiAgICAgIHJldHVybiBsaXN0O1xuICAgIH1cblxuICAgIGlmIChsaXN0Ll9fb3duZXJJRCkge1xuICAgICAgbGlzdC5fcm9vdCA9IG5ld1Jvb3Q7XG4gICAgICBsaXN0Ll90YWlsID0gbmV3VGFpbDtcbiAgICAgIGxpc3QuX19oYXNoID0gdW5kZWZpbmVkO1xuICAgICAgbGlzdC5fX2FsdGVyZWQgPSB0cnVlO1xuICAgICAgcmV0dXJuIGxpc3Q7XG4gICAgfVxuICAgIHJldHVybiBtYWtlTGlzdChsaXN0Ll9vcmlnaW4sIGxpc3QuX2NhcGFjaXR5LCBsaXN0Ll9sZXZlbCwgbmV3Um9vdCwgbmV3VGFpbCk7XG4gIH1cblxuICBmdW5jdGlvbiB1cGRhdGVWTm9kZShub2RlLCBvd25lcklELCBsZXZlbCwgaW5kZXgsIHZhbHVlLCBkaWRBbHRlcikge1xuICAgIHZhciBpZHggPSAoaW5kZXggPj4+IGxldmVsKSAmIE1BU0s7XG4gICAgdmFyIG5vZGVIYXMgPSBub2RlICYmIGlkeCA8IG5vZGUuYXJyYXkubGVuZ3RoO1xuICAgIGlmICghbm9kZUhhcyAmJiB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gbm9kZTtcbiAgICB9XG5cbiAgICB2YXIgbmV3Tm9kZTtcblxuICAgIGlmIChsZXZlbCA+IDApIHtcbiAgICAgIHZhciBsb3dlck5vZGUgPSBub2RlICYmIG5vZGUuYXJyYXlbaWR4XTtcbiAgICAgIHZhciBuZXdMb3dlck5vZGUgPSB1cGRhdGVWTm9kZShcbiAgICAgICAgbG93ZXJOb2RlLFxuICAgICAgICBvd25lcklELFxuICAgICAgICBsZXZlbCAtIFNISUZULFxuICAgICAgICBpbmRleCxcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIGRpZEFsdGVyXG4gICAgICApO1xuICAgICAgaWYgKG5ld0xvd2VyTm9kZSA9PT0gbG93ZXJOb2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlO1xuICAgICAgfVxuICAgICAgbmV3Tm9kZSA9IGVkaXRhYmxlVk5vZGUobm9kZSwgb3duZXJJRCk7XG4gICAgICBuZXdOb2RlLmFycmF5W2lkeF0gPSBuZXdMb3dlck5vZGU7XG4gICAgICByZXR1cm4gbmV3Tm9kZTtcbiAgICB9XG5cbiAgICBpZiAobm9kZUhhcyAmJiBub2RlLmFycmF5W2lkeF0gPT09IHZhbHVlKSB7XG4gICAgICByZXR1cm4gbm9kZTtcbiAgICB9XG5cbiAgICBpZiAoZGlkQWx0ZXIpIHtcbiAgICAgIFNldFJlZihkaWRBbHRlcik7XG4gICAgfVxuXG4gICAgbmV3Tm9kZSA9IGVkaXRhYmxlVk5vZGUobm9kZSwgb3duZXJJRCk7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgJiYgaWR4ID09PSBuZXdOb2RlLmFycmF5Lmxlbmd0aCAtIDEpIHtcbiAgICAgIG5ld05vZGUuYXJyYXkucG9wKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5ld05vZGUuYXJyYXlbaWR4XSA9IHZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gbmV3Tm9kZTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGVkaXRhYmxlVk5vZGUobm9kZSwgb3duZXJJRCkge1xuICAgIGlmIChvd25lcklEICYmIG5vZGUgJiYgb3duZXJJRCA9PT0gbm9kZS5vd25lcklEKSB7XG4gICAgICByZXR1cm4gbm9kZTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBWTm9kZShub2RlID8gbm9kZS5hcnJheS5zbGljZSgpIDogW10sIG93bmVySUQpO1xuICB9XG5cbiAgZnVuY3Rpb24gbGlzdE5vZGVGb3IobGlzdCwgcmF3SW5kZXgpIHtcbiAgICBpZiAocmF3SW5kZXggPj0gZ2V0VGFpbE9mZnNldChsaXN0Ll9jYXBhY2l0eSkpIHtcbiAgICAgIHJldHVybiBsaXN0Ll90YWlsO1xuICAgIH1cbiAgICBpZiAocmF3SW5kZXggPCAxIDw8IChsaXN0Ll9sZXZlbCArIFNISUZUKSkge1xuICAgICAgdmFyIG5vZGUgPSBsaXN0Ll9yb290O1xuICAgICAgdmFyIGxldmVsID0gbGlzdC5fbGV2ZWw7XG4gICAgICB3aGlsZSAobm9kZSAmJiBsZXZlbCA+IDApIHtcbiAgICAgICAgbm9kZSA9IG5vZGUuYXJyYXlbKHJhd0luZGV4ID4+PiBsZXZlbCkgJiBNQVNLXTtcbiAgICAgICAgbGV2ZWwgLT0gU0hJRlQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gbm9kZTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBzZXRMaXN0Qm91bmRzKGxpc3QsIGJlZ2luLCBlbmQpIHtcbiAgICAvLyBTYW5pdGl6ZSBiZWdpbiAmIGVuZCB1c2luZyB0aGlzIHNob3J0aGFuZCBmb3IgVG9JbnQzMihhcmd1bWVudClcbiAgICAvLyBodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNi4wLyNzZWMtdG9pbnQzMlxuICAgIGlmIChiZWdpbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBiZWdpbiB8PSAwO1xuICAgIH1cbiAgICBpZiAoZW5kICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGVuZCB8PSAwO1xuICAgIH1cbiAgICB2YXIgb3duZXIgPSBsaXN0Ll9fb3duZXJJRCB8fCBuZXcgT3duZXJJRCgpO1xuICAgIHZhciBvbGRPcmlnaW4gPSBsaXN0Ll9vcmlnaW47XG4gICAgdmFyIG9sZENhcGFjaXR5ID0gbGlzdC5fY2FwYWNpdHk7XG4gICAgdmFyIG5ld09yaWdpbiA9IG9sZE9yaWdpbiArIGJlZ2luO1xuICAgIHZhciBuZXdDYXBhY2l0eSA9XG4gICAgICBlbmQgPT09IHVuZGVmaW5lZFxuICAgICAgICA/IG9sZENhcGFjaXR5XG4gICAgICAgIDogZW5kIDwgMFxuICAgICAgICA/IG9sZENhcGFjaXR5ICsgZW5kXG4gICAgICAgIDogb2xkT3JpZ2luICsgZW5kO1xuICAgIGlmIChuZXdPcmlnaW4gPT09IG9sZE9yaWdpbiAmJiBuZXdDYXBhY2l0eSA9PT0gb2xkQ2FwYWNpdHkpIHtcbiAgICAgIHJldHVybiBsaXN0O1xuICAgIH1cblxuICAgIC8vIElmIGl0J3MgZ29pbmcgdG8gZW5kIGFmdGVyIGl0IHN0YXJ0cywgaXQncyBlbXB0eS5cbiAgICBpZiAobmV3T3JpZ2luID49IG5ld0NhcGFjaXR5KSB7XG4gICAgICByZXR1cm4gbGlzdC5jbGVhcigpO1xuICAgIH1cblxuICAgIHZhciBuZXdMZXZlbCA9IGxpc3QuX2xldmVsO1xuICAgIHZhciBuZXdSb290ID0gbGlzdC5fcm9vdDtcblxuICAgIC8vIE5ldyBvcmlnaW4gbWlnaHQgbmVlZCBjcmVhdGluZyBhIGhpZ2hlciByb290LlxuICAgIHZhciBvZmZzZXRTaGlmdCA9IDA7XG4gICAgd2hpbGUgKG5ld09yaWdpbiArIG9mZnNldFNoaWZ0IDwgMCkge1xuICAgICAgbmV3Um9vdCA9IG5ldyBWTm9kZShcbiAgICAgICAgbmV3Um9vdCAmJiBuZXdSb290LmFycmF5Lmxlbmd0aCA/IFt1bmRlZmluZWQsIG5ld1Jvb3RdIDogW10sXG4gICAgICAgIG93bmVyXG4gICAgICApO1xuICAgICAgbmV3TGV2ZWwgKz0gU0hJRlQ7XG4gICAgICBvZmZzZXRTaGlmdCArPSAxIDw8IG5ld0xldmVsO1xuICAgIH1cbiAgICBpZiAob2Zmc2V0U2hpZnQpIHtcbiAgICAgIG5ld09yaWdpbiArPSBvZmZzZXRTaGlmdDtcbiAgICAgIG9sZE9yaWdpbiArPSBvZmZzZXRTaGlmdDtcbiAgICAgIG5ld0NhcGFjaXR5ICs9IG9mZnNldFNoaWZ0O1xuICAgICAgb2xkQ2FwYWNpdHkgKz0gb2Zmc2V0U2hpZnQ7XG4gICAgfVxuXG4gICAgdmFyIG9sZFRhaWxPZmZzZXQgPSBnZXRUYWlsT2Zmc2V0KG9sZENhcGFjaXR5KTtcbiAgICB2YXIgbmV3VGFpbE9mZnNldCA9IGdldFRhaWxPZmZzZXQobmV3Q2FwYWNpdHkpO1xuXG4gICAgLy8gTmV3IHNpemUgbWlnaHQgbmVlZCBjcmVhdGluZyBhIGhpZ2hlciByb290LlxuICAgIHdoaWxlIChuZXdUYWlsT2Zmc2V0ID49IDEgPDwgKG5ld0xldmVsICsgU0hJRlQpKSB7XG4gICAgICBuZXdSb290ID0gbmV3IFZOb2RlKFxuICAgICAgICBuZXdSb290ICYmIG5ld1Jvb3QuYXJyYXkubGVuZ3RoID8gW25ld1Jvb3RdIDogW10sXG4gICAgICAgIG93bmVyXG4gICAgICApO1xuICAgICAgbmV3TGV2ZWwgKz0gU0hJRlQ7XG4gICAgfVxuXG4gICAgLy8gTG9jYXRlIG9yIGNyZWF0ZSB0aGUgbmV3IHRhaWwuXG4gICAgdmFyIG9sZFRhaWwgPSBsaXN0Ll90YWlsO1xuICAgIHZhciBuZXdUYWlsID1cbiAgICAgIG5ld1RhaWxPZmZzZXQgPCBvbGRUYWlsT2Zmc2V0XG4gICAgICAgID8gbGlzdE5vZGVGb3IobGlzdCwgbmV3Q2FwYWNpdHkgLSAxKVxuICAgICAgICA6IG5ld1RhaWxPZmZzZXQgPiBvbGRUYWlsT2Zmc2V0XG4gICAgICAgID8gbmV3IFZOb2RlKFtdLCBvd25lcilcbiAgICAgICAgOiBvbGRUYWlsO1xuXG4gICAgLy8gTWVyZ2UgVGFpbCBpbnRvIHRyZWUuXG4gICAgaWYgKFxuICAgICAgb2xkVGFpbCAmJlxuICAgICAgbmV3VGFpbE9mZnNldCA+IG9sZFRhaWxPZmZzZXQgJiZcbiAgICAgIG5ld09yaWdpbiA8IG9sZENhcGFjaXR5ICYmXG4gICAgICBvbGRUYWlsLmFycmF5Lmxlbmd0aFxuICAgICkge1xuICAgICAgbmV3Um9vdCA9IGVkaXRhYmxlVk5vZGUobmV3Um9vdCwgb3duZXIpO1xuICAgICAgdmFyIG5vZGUgPSBuZXdSb290O1xuICAgICAgZm9yICh2YXIgbGV2ZWwgPSBuZXdMZXZlbDsgbGV2ZWwgPiBTSElGVDsgbGV2ZWwgLT0gU0hJRlQpIHtcbiAgICAgICAgdmFyIGlkeCA9IChvbGRUYWlsT2Zmc2V0ID4+PiBsZXZlbCkgJiBNQVNLO1xuICAgICAgICBub2RlID0gbm9kZS5hcnJheVtpZHhdID0gZWRpdGFibGVWTm9kZShub2RlLmFycmF5W2lkeF0sIG93bmVyKTtcbiAgICAgIH1cbiAgICAgIG5vZGUuYXJyYXlbKG9sZFRhaWxPZmZzZXQgPj4+IFNISUZUKSAmIE1BU0tdID0gb2xkVGFpbDtcbiAgICB9XG5cbiAgICAvLyBJZiB0aGUgc2l6ZSBoYXMgYmVlbiByZWR1Y2VkLCB0aGVyZSdzIGEgY2hhbmNlIHRoZSB0YWlsIG5lZWRzIHRvIGJlIHRyaW1tZWQuXG4gICAgaWYgKG5ld0NhcGFjaXR5IDwgb2xkQ2FwYWNpdHkpIHtcbiAgICAgIG5ld1RhaWwgPSBuZXdUYWlsICYmIG5ld1RhaWwucmVtb3ZlQWZ0ZXIob3duZXIsIDAsIG5ld0NhcGFjaXR5KTtcbiAgICB9XG5cbiAgICAvLyBJZiB0aGUgbmV3IG9yaWdpbiBpcyB3aXRoaW4gdGhlIHRhaWwsIHRoZW4gd2UgZG8gbm90IG5lZWQgYSByb290LlxuICAgIGlmIChuZXdPcmlnaW4gPj0gbmV3VGFpbE9mZnNldCkge1xuICAgICAgbmV3T3JpZ2luIC09IG5ld1RhaWxPZmZzZXQ7XG4gICAgICBuZXdDYXBhY2l0eSAtPSBuZXdUYWlsT2Zmc2V0O1xuICAgICAgbmV3TGV2ZWwgPSBTSElGVDtcbiAgICAgIG5ld1Jvb3QgPSBudWxsO1xuICAgICAgbmV3VGFpbCA9IG5ld1RhaWwgJiYgbmV3VGFpbC5yZW1vdmVCZWZvcmUob3duZXIsIDAsIG5ld09yaWdpbik7XG5cbiAgICAgIC8vIE90aGVyd2lzZSwgaWYgdGhlIHJvb3QgaGFzIGJlZW4gdHJpbW1lZCwgZ2FyYmFnZSBjb2xsZWN0LlxuICAgIH0gZWxzZSBpZiAobmV3T3JpZ2luID4gb2xkT3JpZ2luIHx8IG5ld1RhaWxPZmZzZXQgPCBvbGRUYWlsT2Zmc2V0KSB7XG4gICAgICBvZmZzZXRTaGlmdCA9IDA7XG5cbiAgICAgIC8vIElkZW50aWZ5IHRoZSBuZXcgdG9wIHJvb3Qgbm9kZSBvZiB0aGUgc3VidHJlZSBvZiB0aGUgb2xkIHJvb3QuXG4gICAgICB3aGlsZSAobmV3Um9vdCkge1xuICAgICAgICB2YXIgYmVnaW5JbmRleCA9IChuZXdPcmlnaW4gPj4+IG5ld0xldmVsKSAmIE1BU0s7XG4gICAgICAgIGlmICgoYmVnaW5JbmRleCAhPT0gbmV3VGFpbE9mZnNldCA+Pj4gbmV3TGV2ZWwpICYgTUFTSykge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGlmIChiZWdpbkluZGV4KSB7XG4gICAgICAgICAgb2Zmc2V0U2hpZnQgKz0gKDEgPDwgbmV3TGV2ZWwpICogYmVnaW5JbmRleDtcbiAgICAgICAgfVxuICAgICAgICBuZXdMZXZlbCAtPSBTSElGVDtcbiAgICAgICAgbmV3Um9vdCA9IG5ld1Jvb3QuYXJyYXlbYmVnaW5JbmRleF07XG4gICAgICB9XG5cbiAgICAgIC8vIFRyaW0gdGhlIG5ldyBzaWRlcyBvZiB0aGUgbmV3IHJvb3QuXG4gICAgICBpZiAobmV3Um9vdCAmJiBuZXdPcmlnaW4gPiBvbGRPcmlnaW4pIHtcbiAgICAgICAgbmV3Um9vdCA9IG5ld1Jvb3QucmVtb3ZlQmVmb3JlKG93bmVyLCBuZXdMZXZlbCwgbmV3T3JpZ2luIC0gb2Zmc2V0U2hpZnQpO1xuICAgICAgfVxuICAgICAgaWYgKG5ld1Jvb3QgJiYgbmV3VGFpbE9mZnNldCA8IG9sZFRhaWxPZmZzZXQpIHtcbiAgICAgICAgbmV3Um9vdCA9IG5ld1Jvb3QucmVtb3ZlQWZ0ZXIoXG4gICAgICAgICAgb3duZXIsXG4gICAgICAgICAgbmV3TGV2ZWwsXG4gICAgICAgICAgbmV3VGFpbE9mZnNldCAtIG9mZnNldFNoaWZ0XG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAob2Zmc2V0U2hpZnQpIHtcbiAgICAgICAgbmV3T3JpZ2luIC09IG9mZnNldFNoaWZ0O1xuICAgICAgICBuZXdDYXBhY2l0eSAtPSBvZmZzZXRTaGlmdDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobGlzdC5fX293bmVySUQpIHtcbiAgICAgIGxpc3Quc2l6ZSA9IG5ld0NhcGFjaXR5IC0gbmV3T3JpZ2luO1xuICAgICAgbGlzdC5fb3JpZ2luID0gbmV3T3JpZ2luO1xuICAgICAgbGlzdC5fY2FwYWNpdHkgPSBuZXdDYXBhY2l0eTtcbiAgICAgIGxpc3QuX2xldmVsID0gbmV3TGV2ZWw7XG4gICAgICBsaXN0Ll9yb290ID0gbmV3Um9vdDtcbiAgICAgIGxpc3QuX3RhaWwgPSBuZXdUYWlsO1xuICAgICAgbGlzdC5fX2hhc2ggPSB1bmRlZmluZWQ7XG4gICAgICBsaXN0Ll9fYWx0ZXJlZCA9IHRydWU7XG4gICAgICByZXR1cm4gbGlzdDtcbiAgICB9XG4gICAgcmV0dXJuIG1ha2VMaXN0KG5ld09yaWdpbiwgbmV3Q2FwYWNpdHksIG5ld0xldmVsLCBuZXdSb290LCBuZXdUYWlsKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldFRhaWxPZmZzZXQoc2l6ZSkge1xuICAgIHJldHVybiBzaXplIDwgU0laRSA/IDAgOiAoKHNpemUgLSAxKSA+Pj4gU0hJRlQpIDw8IFNISUZUO1xuICB9XG5cbiAgdmFyIE9yZGVyZWRNYXAgPSAvKkBfX1BVUkVfXyovKGZ1bmN0aW9uIChNYXApIHtcbiAgICBmdW5jdGlvbiBPcmRlcmVkTWFwKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gbnVsbFxuICAgICAgICA/IGVtcHR5T3JkZXJlZE1hcCgpXG4gICAgICAgIDogaXNPcmRlcmVkTWFwKHZhbHVlKVxuICAgICAgICA/IHZhbHVlXG4gICAgICAgIDogZW1wdHlPcmRlcmVkTWFwKCkud2l0aE11dGF0aW9ucyhmdW5jdGlvbiAobWFwKSB7XG4gICAgICAgICAgICB2YXIgaXRlciA9IEtleWVkQ29sbGVjdGlvbih2YWx1ZSk7XG4gICAgICAgICAgICBhc3NlcnROb3RJbmZpbml0ZShpdGVyLnNpemUpO1xuICAgICAgICAgICAgaXRlci5mb3JFYWNoKGZ1bmN0aW9uICh2LCBrKSB7IHJldHVybiBtYXAuc2V0KGssIHYpOyB9KTtcbiAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoIE1hcCApIE9yZGVyZWRNYXAuX19wcm90b19fID0gTWFwO1xuICAgIE9yZGVyZWRNYXAucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggTWFwICYmIE1hcC5wcm90b3R5cGUgKTtcbiAgICBPcmRlcmVkTWFwLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IE9yZGVyZWRNYXA7XG5cbiAgICBPcmRlcmVkTWFwLm9mID0gZnVuY3Rpb24gb2YgKC8qLi4udmFsdWVzKi8pIHtcbiAgICAgIHJldHVybiB0aGlzKGFyZ3VtZW50cyk7XG4gICAgfTtcblxuICAgIE9yZGVyZWRNYXAucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcgKCkge1xuICAgICAgcmV0dXJuIHRoaXMuX190b1N0cmluZygnT3JkZXJlZE1hcCB7JywgJ30nKTtcbiAgICB9O1xuXG4gICAgLy8gQHByYWdtYSBBY2Nlc3NcblxuICAgIE9yZGVyZWRNYXAucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uIGdldCAoaywgbm90U2V0VmFsdWUpIHtcbiAgICAgIHZhciBpbmRleCA9IHRoaXMuX21hcC5nZXQoayk7XG4gICAgICByZXR1cm4gaW5kZXggIT09IHVuZGVmaW5lZCA/IHRoaXMuX2xpc3QuZ2V0KGluZGV4KVsxXSA6IG5vdFNldFZhbHVlO1xuICAgIH07XG5cbiAgICAvLyBAcHJhZ21hIE1vZGlmaWNhdGlvblxuXG4gICAgT3JkZXJlZE1hcC5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbiBjbGVhciAoKSB7XG4gICAgICBpZiAodGhpcy5zaXplID09PSAwKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuX19vd25lcklEKSB7XG4gICAgICAgIHRoaXMuc2l6ZSA9IDA7XG4gICAgICAgIHRoaXMuX21hcC5jbGVhcigpO1xuICAgICAgICB0aGlzLl9saXN0LmNsZWFyKCk7XG4gICAgICAgIHRoaXMuX19hbHRlcmVkID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG4gICAgICByZXR1cm4gZW1wdHlPcmRlcmVkTWFwKCk7XG4gICAgfTtcblxuICAgIE9yZGVyZWRNYXAucHJvdG90eXBlLnNldCA9IGZ1bmN0aW9uIHNldCAoaywgdikge1xuICAgICAgcmV0dXJuIHVwZGF0ZU9yZGVyZWRNYXAodGhpcywgaywgdik7XG4gICAgfTtcblxuICAgIE9yZGVyZWRNYXAucHJvdG90eXBlLnJlbW92ZSA9IGZ1bmN0aW9uIHJlbW92ZSAoaykge1xuICAgICAgcmV0dXJuIHVwZGF0ZU9yZGVyZWRNYXAodGhpcywgaywgTk9UX1NFVCk7XG4gICAgfTtcblxuICAgIE9yZGVyZWRNYXAucHJvdG90eXBlLl9faXRlcmF0ZSA9IGZ1bmN0aW9uIF9faXRlcmF0ZSAoZm4sIHJldmVyc2UpIHtcbiAgICAgIHZhciB0aGlzJDEkMSA9IHRoaXM7XG5cbiAgICAgIHJldHVybiB0aGlzLl9saXN0Ll9faXRlcmF0ZShcbiAgICAgICAgZnVuY3Rpb24gKGVudHJ5KSB7IHJldHVybiBlbnRyeSAmJiBmbihlbnRyeVsxXSwgZW50cnlbMF0sIHRoaXMkMSQxKTsgfSxcbiAgICAgICAgcmV2ZXJzZVxuICAgICAgKTtcbiAgICB9O1xuXG4gICAgT3JkZXJlZE1hcC5wcm90b3R5cGUuX19pdGVyYXRvciA9IGZ1bmN0aW9uIF9faXRlcmF0b3IgKHR5cGUsIHJldmVyc2UpIHtcbiAgICAgIHJldHVybiB0aGlzLl9saXN0LmZyb21FbnRyeVNlcSgpLl9faXRlcmF0b3IodHlwZSwgcmV2ZXJzZSk7XG4gICAgfTtcblxuICAgIE9yZGVyZWRNYXAucHJvdG90eXBlLl9fZW5zdXJlT3duZXIgPSBmdW5jdGlvbiBfX2Vuc3VyZU93bmVyIChvd25lcklEKSB7XG4gICAgICBpZiAob3duZXJJRCA9PT0gdGhpcy5fX293bmVySUQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG4gICAgICB2YXIgbmV3TWFwID0gdGhpcy5fbWFwLl9fZW5zdXJlT3duZXIob3duZXJJRCk7XG4gICAgICB2YXIgbmV3TGlzdCA9IHRoaXMuX2xpc3QuX19lbnN1cmVPd25lcihvd25lcklEKTtcbiAgICAgIGlmICghb3duZXJJRCkge1xuICAgICAgICBpZiAodGhpcy5zaXplID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIGVtcHR5T3JkZXJlZE1hcCgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX19vd25lcklEID0gb3duZXJJRDtcbiAgICAgICAgdGhpcy5fX2FsdGVyZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fbWFwID0gbmV3TWFwO1xuICAgICAgICB0aGlzLl9saXN0ID0gbmV3TGlzdDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG4gICAgICByZXR1cm4gbWFrZU9yZGVyZWRNYXAobmV3TWFwLCBuZXdMaXN0LCBvd25lcklELCB0aGlzLl9faGFzaCk7XG4gICAgfTtcblxuICAgIHJldHVybiBPcmRlcmVkTWFwO1xuICB9KE1hcCkpO1xuXG4gIE9yZGVyZWRNYXAuaXNPcmRlcmVkTWFwID0gaXNPcmRlcmVkTWFwO1xuXG4gIE9yZGVyZWRNYXAucHJvdG90eXBlW0lTX09SREVSRURfU1lNQk9MXSA9IHRydWU7XG4gIE9yZGVyZWRNYXAucHJvdG90eXBlW0RFTEVURV0gPSBPcmRlcmVkTWFwLnByb3RvdHlwZS5yZW1vdmU7XG5cbiAgZnVuY3Rpb24gbWFrZU9yZGVyZWRNYXAobWFwLCBsaXN0LCBvd25lcklELCBoYXNoKSB7XG4gICAgdmFyIG9tYXAgPSBPYmplY3QuY3JlYXRlKE9yZGVyZWRNYXAucHJvdG90eXBlKTtcbiAgICBvbWFwLnNpemUgPSBtYXAgPyBtYXAuc2l6ZSA6IDA7XG4gICAgb21hcC5fbWFwID0gbWFwO1xuICAgIG9tYXAuX2xpc3QgPSBsaXN0O1xuICAgIG9tYXAuX19vd25lcklEID0gb3duZXJJRDtcbiAgICBvbWFwLl9faGFzaCA9IGhhc2g7XG4gICAgb21hcC5fX2FsdGVyZWQgPSBmYWxzZTtcbiAgICByZXR1cm4gb21hcDtcbiAgfVxuXG4gIHZhciBFTVBUWV9PUkRFUkVEX01BUDtcbiAgZnVuY3Rpb24gZW1wdHlPcmRlcmVkTWFwKCkge1xuICAgIHJldHVybiAoXG4gICAgICBFTVBUWV9PUkRFUkVEX01BUCB8fFxuICAgICAgKEVNUFRZX09SREVSRURfTUFQID0gbWFrZU9yZGVyZWRNYXAoZW1wdHlNYXAoKSwgZW1wdHlMaXN0KCkpKVxuICAgICk7XG4gIH1cblxuICBmdW5jdGlvbiB1cGRhdGVPcmRlcmVkTWFwKG9tYXAsIGssIHYpIHtcbiAgICB2YXIgbWFwID0gb21hcC5fbWFwO1xuICAgIHZhciBsaXN0ID0gb21hcC5fbGlzdDtcbiAgICB2YXIgaSA9IG1hcC5nZXQoayk7XG4gICAgdmFyIGhhcyA9IGkgIT09IHVuZGVmaW5lZDtcbiAgICB2YXIgbmV3TWFwO1xuICAgIHZhciBuZXdMaXN0O1xuICAgIGlmICh2ID09PSBOT1RfU0VUKSB7XG4gICAgICAvLyByZW1vdmVkXG4gICAgICBpZiAoIWhhcykge1xuICAgICAgICByZXR1cm4gb21hcDtcbiAgICAgIH1cbiAgICAgIGlmIChsaXN0LnNpemUgPj0gU0laRSAmJiBsaXN0LnNpemUgPj0gbWFwLnNpemUgKiAyKSB7XG4gICAgICAgIG5ld0xpc3QgPSBsaXN0LmZpbHRlcihmdW5jdGlvbiAoZW50cnksIGlkeCkgeyByZXR1cm4gZW50cnkgIT09IHVuZGVmaW5lZCAmJiBpICE9PSBpZHg7IH0pO1xuICAgICAgICBuZXdNYXAgPSBuZXdMaXN0XG4gICAgICAgICAgLnRvS2V5ZWRTZXEoKVxuICAgICAgICAgIC5tYXAoZnVuY3Rpb24gKGVudHJ5KSB7IHJldHVybiBlbnRyeVswXTsgfSlcbiAgICAgICAgICAuZmxpcCgpXG4gICAgICAgICAgLnRvTWFwKCk7XG4gICAgICAgIGlmIChvbWFwLl9fb3duZXJJRCkge1xuICAgICAgICAgIG5ld01hcC5fX293bmVySUQgPSBuZXdMaXN0Ll9fb3duZXJJRCA9IG9tYXAuX19vd25lcklEO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuZXdNYXAgPSBtYXAucmVtb3ZlKGspO1xuICAgICAgICBuZXdMaXN0ID0gaSA9PT0gbGlzdC5zaXplIC0gMSA/IGxpc3QucG9wKCkgOiBsaXN0LnNldChpLCB1bmRlZmluZWQpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoaGFzKSB7XG4gICAgICBpZiAodiA9PT0gbGlzdC5nZXQoaSlbMV0pIHtcbiAgICAgICAgcmV0dXJuIG9tYXA7XG4gICAgICB9XG4gICAgICBuZXdNYXAgPSBtYXA7XG4gICAgICBuZXdMaXN0ID0gbGlzdC5zZXQoaSwgW2ssIHZdKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbmV3TWFwID0gbWFwLnNldChrLCBsaXN0LnNpemUpO1xuICAgICAgbmV3TGlzdCA9IGxpc3Quc2V0KGxpc3Quc2l6ZSwgW2ssIHZdKTtcbiAgICB9XG4gICAgaWYgKG9tYXAuX19vd25lcklEKSB7XG4gICAgICBvbWFwLnNpemUgPSBuZXdNYXAuc2l6ZTtcbiAgICAgIG9tYXAuX21hcCA9IG5ld01hcDtcbiAgICAgIG9tYXAuX2xpc3QgPSBuZXdMaXN0O1xuICAgICAgb21hcC5fX2hhc2ggPSB1bmRlZmluZWQ7XG4gICAgICBvbWFwLl9fYWx0ZXJlZCA9IHRydWU7XG4gICAgICByZXR1cm4gb21hcDtcbiAgICB9XG4gICAgcmV0dXJuIG1ha2VPcmRlcmVkTWFwKG5ld01hcCwgbmV3TGlzdCk7XG4gIH1cblxuICB2YXIgSVNfU1RBQ0tfU1lNQk9MID0gJ0BAX19JTU1VVEFCTEVfU1RBQ0tfX0BAJztcblxuICBmdW5jdGlvbiBpc1N0YWNrKG1heWJlU3RhY2spIHtcbiAgICByZXR1cm4gQm9vbGVhbihtYXliZVN0YWNrICYmIG1heWJlU3RhY2tbSVNfU1RBQ0tfU1lNQk9MXSk7XG4gIH1cblxuICB2YXIgU3RhY2sgPSAvKkBfX1BVUkVfXyovKGZ1bmN0aW9uIChJbmRleGVkQ29sbGVjdGlvbikge1xuICAgIGZ1bmN0aW9uIFN0YWNrKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gbnVsbFxuICAgICAgICA/IGVtcHR5U3RhY2soKVxuICAgICAgICA6IGlzU3RhY2sodmFsdWUpXG4gICAgICAgID8gdmFsdWVcbiAgICAgICAgOiBlbXB0eVN0YWNrKCkucHVzaEFsbCh2YWx1ZSk7XG4gICAgfVxuXG4gICAgaWYgKCBJbmRleGVkQ29sbGVjdGlvbiApIFN0YWNrLl9fcHJvdG9fXyA9IEluZGV4ZWRDb2xsZWN0aW9uO1xuICAgIFN0YWNrLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEluZGV4ZWRDb2xsZWN0aW9uICYmIEluZGV4ZWRDb2xsZWN0aW9uLnByb3RvdHlwZSApO1xuICAgIFN0YWNrLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFN0YWNrO1xuXG4gICAgU3RhY2sub2YgPSBmdW5jdGlvbiBvZiAoLyouLi52YWx1ZXMqLykge1xuICAgICAgcmV0dXJuIHRoaXMoYXJndW1lbnRzKTtcbiAgICB9O1xuXG4gICAgU3RhY2sucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcgKCkge1xuICAgICAgcmV0dXJuIHRoaXMuX190b1N0cmluZygnU3RhY2sgWycsICddJyk7XG4gICAgfTtcblxuICAgIC8vIEBwcmFnbWEgQWNjZXNzXG5cbiAgICBTdGFjay5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gZ2V0IChpbmRleCwgbm90U2V0VmFsdWUpIHtcbiAgICAgIHZhciBoZWFkID0gdGhpcy5faGVhZDtcbiAgICAgIGluZGV4ID0gd3JhcEluZGV4KHRoaXMsIGluZGV4KTtcbiAgICAgIHdoaWxlIChoZWFkICYmIGluZGV4LS0pIHtcbiAgICAgICAgaGVhZCA9IGhlYWQubmV4dDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBoZWFkID8gaGVhZC52YWx1ZSA6IG5vdFNldFZhbHVlO1xuICAgIH07XG5cbiAgICBTdGFjay5wcm90b3R5cGUucGVlayA9IGZ1bmN0aW9uIHBlZWsgKCkge1xuICAgICAgcmV0dXJuIHRoaXMuX2hlYWQgJiYgdGhpcy5faGVhZC52YWx1ZTtcbiAgICB9O1xuXG4gICAgLy8gQHByYWdtYSBNb2RpZmljYXRpb25cblxuICAgIFN0YWNrLnByb3RvdHlwZS5wdXNoID0gZnVuY3Rpb24gcHVzaCAoLyouLi52YWx1ZXMqLykge1xuICAgICAgdmFyIGFyZ3VtZW50cyQxID0gYXJndW1lbnRzO1xuXG4gICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cbiAgICAgIHZhciBuZXdTaXplID0gdGhpcy5zaXplICsgYXJndW1lbnRzLmxlbmd0aDtcbiAgICAgIHZhciBoZWFkID0gdGhpcy5faGVhZDtcbiAgICAgIGZvciAodmFyIGlpID0gYXJndW1lbnRzLmxlbmd0aCAtIDE7IGlpID49IDA7IGlpLS0pIHtcbiAgICAgICAgaGVhZCA9IHtcbiAgICAgICAgICB2YWx1ZTogYXJndW1lbnRzJDFbaWldLFxuICAgICAgICAgIG5leHQ6IGhlYWQsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5fX293bmVySUQpIHtcbiAgICAgICAgdGhpcy5zaXplID0gbmV3U2l6ZTtcbiAgICAgICAgdGhpcy5faGVhZCA9IGhlYWQ7XG4gICAgICAgIHRoaXMuX19oYXNoID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLl9fYWx0ZXJlZCA9IHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG1ha2VTdGFjayhuZXdTaXplLCBoZWFkKTtcbiAgICB9O1xuXG4gICAgU3RhY2sucHJvdG90eXBlLnB1c2hBbGwgPSBmdW5jdGlvbiBwdXNoQWxsIChpdGVyKSB7XG4gICAgICBpdGVyID0gSW5kZXhlZENvbGxlY3Rpb24oaXRlcik7XG4gICAgICBpZiAoaXRlci5zaXplID09PSAwKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuc2l6ZSA9PT0gMCAmJiBpc1N0YWNrKGl0ZXIpKSB7XG4gICAgICAgIHJldHVybiBpdGVyO1xuICAgICAgfVxuICAgICAgYXNzZXJ0Tm90SW5maW5pdGUoaXRlci5zaXplKTtcbiAgICAgIHZhciBuZXdTaXplID0gdGhpcy5zaXplO1xuICAgICAgdmFyIGhlYWQgPSB0aGlzLl9oZWFkO1xuICAgICAgaXRlci5fX2l0ZXJhdGUoZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIG5ld1NpemUrKztcbiAgICAgICAgaGVhZCA9IHtcbiAgICAgICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICAgICAgbmV4dDogaGVhZCxcbiAgICAgICAgfTtcbiAgICAgIH0sIC8qIHJldmVyc2UgKi8gdHJ1ZSk7XG4gICAgICBpZiAodGhpcy5fX293bmVySUQpIHtcbiAgICAgICAgdGhpcy5zaXplID0gbmV3U2l6ZTtcbiAgICAgICAgdGhpcy5faGVhZCA9IGhlYWQ7XG4gICAgICAgIHRoaXMuX19oYXNoID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLl9fYWx0ZXJlZCA9IHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG1ha2VTdGFjayhuZXdTaXplLCBoZWFkKTtcbiAgICB9O1xuXG4gICAgU3RhY2sucHJvdG90eXBlLnBvcCA9IGZ1bmN0aW9uIHBvcCAoKSB7XG4gICAgICByZXR1cm4gdGhpcy5zbGljZSgxKTtcbiAgICB9O1xuXG4gICAgU3RhY2sucHJvdG90eXBlLmNsZWFyID0gZnVuY3Rpb24gY2xlYXIgKCkge1xuICAgICAgaWYgKHRoaXMuc2l6ZSA9PT0gMCkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLl9fb3duZXJJRCkge1xuICAgICAgICB0aGlzLnNpemUgPSAwO1xuICAgICAgICB0aGlzLl9oZWFkID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLl9faGFzaCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5fX2FsdGVyZWQgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cbiAgICAgIHJldHVybiBlbXB0eVN0YWNrKCk7XG4gICAgfTtcblxuICAgIFN0YWNrLnByb3RvdHlwZS5zbGljZSA9IGZ1bmN0aW9uIHNsaWNlIChiZWdpbiwgZW5kKSB7XG4gICAgICBpZiAod2hvbGVTbGljZShiZWdpbiwgZW5kLCB0aGlzLnNpemUpKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuICAgICAgdmFyIHJlc29sdmVkQmVnaW4gPSByZXNvbHZlQmVnaW4oYmVnaW4sIHRoaXMuc2l6ZSk7XG4gICAgICB2YXIgcmVzb2x2ZWRFbmQgPSByZXNvbHZlRW5kKGVuZCwgdGhpcy5zaXplKTtcbiAgICAgIGlmIChyZXNvbHZlZEVuZCAhPT0gdGhpcy5zaXplKSB7XG4gICAgICAgIC8vIHN1cGVyLnNsaWNlKGJlZ2luLCBlbmQpO1xuICAgICAgICByZXR1cm4gSW5kZXhlZENvbGxlY3Rpb24ucHJvdG90eXBlLnNsaWNlLmNhbGwodGhpcywgYmVnaW4sIGVuZCk7XG4gICAgICB9XG4gICAgICB2YXIgbmV3U2l6ZSA9IHRoaXMuc2l6ZSAtIHJlc29sdmVkQmVnaW47XG4gICAgICB2YXIgaGVhZCA9IHRoaXMuX2hlYWQ7XG4gICAgICB3aGlsZSAocmVzb2x2ZWRCZWdpbi0tKSB7XG4gICAgICAgIGhlYWQgPSBoZWFkLm5leHQ7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5fX293bmVySUQpIHtcbiAgICAgICAgdGhpcy5zaXplID0gbmV3U2l6ZTtcbiAgICAgICAgdGhpcy5faGVhZCA9IGhlYWQ7XG4gICAgICAgIHRoaXMuX19oYXNoID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLl9fYWx0ZXJlZCA9IHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG1ha2VTdGFjayhuZXdTaXplLCBoZWFkKTtcbiAgICB9O1xuXG4gICAgLy8gQHByYWdtYSBNdXRhYmlsaXR5XG5cbiAgICBTdGFjay5wcm90b3R5cGUuX19lbnN1cmVPd25lciA9IGZ1bmN0aW9uIF9fZW5zdXJlT3duZXIgKG93bmVySUQpIHtcbiAgICAgIGlmIChvd25lcklEID09PSB0aGlzLl9fb3duZXJJRCkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cbiAgICAgIGlmICghb3duZXJJRCkge1xuICAgICAgICBpZiAodGhpcy5zaXplID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIGVtcHR5U3RhY2soKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9fb3duZXJJRCA9IG93bmVySUQ7XG4gICAgICAgIHRoaXMuX19hbHRlcmVkID0gZmFsc2U7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG1ha2VTdGFjayh0aGlzLnNpemUsIHRoaXMuX2hlYWQsIG93bmVySUQsIHRoaXMuX19oYXNoKTtcbiAgICB9O1xuXG4gICAgLy8gQHByYWdtYSBJdGVyYXRpb25cblxuICAgIFN0YWNrLnByb3RvdHlwZS5fX2l0ZXJhdGUgPSBmdW5jdGlvbiBfX2l0ZXJhdGUgKGZuLCByZXZlcnNlKSB7XG4gICAgICB2YXIgdGhpcyQxJDEgPSB0aGlzO1xuXG4gICAgICBpZiAocmV2ZXJzZSkge1xuICAgICAgICByZXR1cm4gbmV3IEFycmF5U2VxKHRoaXMudG9BcnJheSgpKS5fX2l0ZXJhdGUoXG4gICAgICAgICAgZnVuY3Rpb24gKHYsIGspIHsgcmV0dXJuIGZuKHYsIGssIHRoaXMkMSQxKTsgfSxcbiAgICAgICAgICByZXZlcnNlXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICB2YXIgaXRlcmF0aW9ucyA9IDA7XG4gICAgICB2YXIgbm9kZSA9IHRoaXMuX2hlYWQ7XG4gICAgICB3aGlsZSAobm9kZSkge1xuICAgICAgICBpZiAoZm4obm9kZS52YWx1ZSwgaXRlcmF0aW9ucysrLCB0aGlzKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBub2RlID0gbm9kZS5uZXh0O1xuICAgICAgfVxuICAgICAgcmV0dXJuIGl0ZXJhdGlvbnM7XG4gICAgfTtcblxuICAgIFN0YWNrLnByb3RvdHlwZS5fX2l0ZXJhdG9yID0gZnVuY3Rpb24gX19pdGVyYXRvciAodHlwZSwgcmV2ZXJzZSkge1xuICAgICAgaWYgKHJldmVyc2UpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBcnJheVNlcSh0aGlzLnRvQXJyYXkoKSkuX19pdGVyYXRvcih0eXBlLCByZXZlcnNlKTtcbiAgICAgIH1cbiAgICAgIHZhciBpdGVyYXRpb25zID0gMDtcbiAgICAgIHZhciBub2RlID0gdGhpcy5faGVhZDtcbiAgICAgIHJldHVybiBuZXcgSXRlcmF0b3IoZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAobm9kZSkge1xuICAgICAgICAgIHZhciB2YWx1ZSA9IG5vZGUudmFsdWU7XG4gICAgICAgICAgbm9kZSA9IG5vZGUubmV4dDtcbiAgICAgICAgICByZXR1cm4gaXRlcmF0b3JWYWx1ZSh0eXBlLCBpdGVyYXRpb25zKyssIHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaXRlcmF0b3JEb25lKCk7XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIFN0YWNrO1xuICB9KEluZGV4ZWRDb2xsZWN0aW9uKSk7XG5cbiAgU3RhY2suaXNTdGFjayA9IGlzU3RhY2s7XG5cbiAgdmFyIFN0YWNrUHJvdG90eXBlID0gU3RhY2sucHJvdG90eXBlO1xuICBTdGFja1Byb3RvdHlwZVtJU19TVEFDS19TWU1CT0xdID0gdHJ1ZTtcbiAgU3RhY2tQcm90b3R5cGUuc2hpZnQgPSBTdGFja1Byb3RvdHlwZS5wb3A7XG4gIFN0YWNrUHJvdG90eXBlLnVuc2hpZnQgPSBTdGFja1Byb3RvdHlwZS5wdXNoO1xuICBTdGFja1Byb3RvdHlwZS51bnNoaWZ0QWxsID0gU3RhY2tQcm90b3R5cGUucHVzaEFsbDtcbiAgU3RhY2tQcm90b3R5cGUud2l0aE11dGF0aW9ucyA9IHdpdGhNdXRhdGlvbnM7XG4gIFN0YWNrUHJvdG90eXBlLndhc0FsdGVyZWQgPSB3YXNBbHRlcmVkO1xuICBTdGFja1Byb3RvdHlwZS5hc0ltbXV0YWJsZSA9IGFzSW1tdXRhYmxlO1xuICBTdGFja1Byb3RvdHlwZVsnQEB0cmFuc2R1Y2VyL2luaXQnXSA9IFN0YWNrUHJvdG90eXBlLmFzTXV0YWJsZSA9IGFzTXV0YWJsZTtcbiAgU3RhY2tQcm90b3R5cGVbJ0BAdHJhbnNkdWNlci9zdGVwJ10gPSBmdW5jdGlvbiAocmVzdWx0LCBhcnIpIHtcbiAgICByZXR1cm4gcmVzdWx0LnVuc2hpZnQoYXJyKTtcbiAgfTtcbiAgU3RhY2tQcm90b3R5cGVbJ0BAdHJhbnNkdWNlci9yZXN1bHQnXSA9IGZ1bmN0aW9uIChvYmopIHtcbiAgICByZXR1cm4gb2JqLmFzSW1tdXRhYmxlKCk7XG4gIH07XG5cbiAgZnVuY3Rpb24gbWFrZVN0YWNrKHNpemUsIGhlYWQsIG93bmVySUQsIGhhc2gpIHtcbiAgICB2YXIgbWFwID0gT2JqZWN0LmNyZWF0ZShTdGFja1Byb3RvdHlwZSk7XG4gICAgbWFwLnNpemUgPSBzaXplO1xuICAgIG1hcC5faGVhZCA9IGhlYWQ7XG4gICAgbWFwLl9fb3duZXJJRCA9IG93bmVySUQ7XG4gICAgbWFwLl9faGFzaCA9IGhhc2g7XG4gICAgbWFwLl9fYWx0ZXJlZCA9IGZhbHNlO1xuICAgIHJldHVybiBtYXA7XG4gIH1cblxuICB2YXIgRU1QVFlfU1RBQ0s7XG4gIGZ1bmN0aW9uIGVtcHR5U3RhY2soKSB7XG4gICAgcmV0dXJuIEVNUFRZX1NUQUNLIHx8IChFTVBUWV9TVEFDSyA9IG1ha2VTdGFjaygwKSk7XG4gIH1cblxuICB2YXIgSVNfU0VUX1NZTUJPTCA9ICdAQF9fSU1NVVRBQkxFX1NFVF9fQEAnO1xuXG4gIGZ1bmN0aW9uIGlzU2V0KG1heWJlU2V0KSB7XG4gICAgcmV0dXJuIEJvb2xlYW4obWF5YmVTZXQgJiYgbWF5YmVTZXRbSVNfU0VUX1NZTUJPTF0pO1xuICB9XG5cbiAgZnVuY3Rpb24gaXNPcmRlcmVkU2V0KG1heWJlT3JkZXJlZFNldCkge1xuICAgIHJldHVybiBpc1NldChtYXliZU9yZGVyZWRTZXQpICYmIGlzT3JkZXJlZChtYXliZU9yZGVyZWRTZXQpO1xuICB9XG5cbiAgZnVuY3Rpb24gZGVlcEVxdWFsKGEsIGIpIHtcbiAgICBpZiAoYSA9PT0gYikge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgIWlzQ29sbGVjdGlvbihiKSB8fFxuICAgICAgKGEuc2l6ZSAhPT0gdW5kZWZpbmVkICYmIGIuc2l6ZSAhPT0gdW5kZWZpbmVkICYmIGEuc2l6ZSAhPT0gYi5zaXplKSB8fFxuICAgICAgKGEuX19oYXNoICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgYi5fX2hhc2ggIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICBhLl9faGFzaCAhPT0gYi5fX2hhc2gpIHx8XG4gICAgICBpc0tleWVkKGEpICE9PSBpc0tleWVkKGIpIHx8XG4gICAgICBpc0luZGV4ZWQoYSkgIT09IGlzSW5kZXhlZChiKSB8fFxuICAgICAgaXNPcmRlcmVkKGEpICE9PSBpc09yZGVyZWQoYilcbiAgICApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoYS5zaXplID09PSAwICYmIGIuc2l6ZSA9PT0gMCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgdmFyIG5vdEFzc29jaWF0aXZlID0gIWlzQXNzb2NpYXRpdmUoYSk7XG5cbiAgICBpZiAoaXNPcmRlcmVkKGEpKSB7XG4gICAgICB2YXIgZW50cmllcyA9IGEuZW50cmllcygpO1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgYi5ldmVyeShmdW5jdGlvbiAodiwgaykge1xuICAgICAgICAgIHZhciBlbnRyeSA9IGVudHJpZXMubmV4dCgpLnZhbHVlO1xuICAgICAgICAgIHJldHVybiBlbnRyeSAmJiBpcyhlbnRyeVsxXSwgdikgJiYgKG5vdEFzc29jaWF0aXZlIHx8IGlzKGVudHJ5WzBdLCBrKSk7XG4gICAgICAgIH0pICYmIGVudHJpZXMubmV4dCgpLmRvbmVcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdmFyIGZsaXBwZWQgPSBmYWxzZTtcblxuICAgIGlmIChhLnNpemUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKGIuc2l6ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICh0eXBlb2YgYS5jYWNoZVJlc3VsdCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIGEuY2FjaGVSZXN1bHQoKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZmxpcHBlZCA9IHRydWU7XG4gICAgICAgIHZhciBfID0gYTtcbiAgICAgICAgYSA9IGI7XG4gICAgICAgIGIgPSBfO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBhbGxFcXVhbCA9IHRydWU7XG4gICAgdmFyIGJTaXplID0gYi5fX2l0ZXJhdGUoZnVuY3Rpb24gKHYsIGspIHtcbiAgICAgIGlmIChcbiAgICAgICAgbm90QXNzb2NpYXRpdmVcbiAgICAgICAgICA/ICFhLmhhcyh2KVxuICAgICAgICAgIDogZmxpcHBlZFxuICAgICAgICAgID8gIWlzKHYsIGEuZ2V0KGssIE5PVF9TRVQpKVxuICAgICAgICAgIDogIWlzKGEuZ2V0KGssIE5PVF9TRVQpLCB2KVxuICAgICAgKSB7XG4gICAgICAgIGFsbEVxdWFsID0gZmFsc2U7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBhbGxFcXVhbCAmJiBhLnNpemUgPT09IGJTaXplO1xuICB9XG5cbiAgZnVuY3Rpb24gbWl4aW4oY3RvciwgbWV0aG9kcykge1xuICAgIHZhciBrZXlDb3BpZXIgPSBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICBjdG9yLnByb3RvdHlwZVtrZXldID0gbWV0aG9kc1trZXldO1xuICAgIH07XG4gICAgT2JqZWN0LmtleXMobWV0aG9kcykuZm9yRWFjaChrZXlDb3BpZXIpO1xuICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgJiZcbiAgICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMobWV0aG9kcykuZm9yRWFjaChrZXlDb3BpZXIpO1xuICAgIHJldHVybiBjdG9yO1xuICB9XG5cbiAgZnVuY3Rpb24gdG9KUyh2YWx1ZSkge1xuICAgIGlmICghdmFsdWUgfHwgdHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0Jykge1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICBpZiAoIWlzQ29sbGVjdGlvbih2YWx1ZSkpIHtcbiAgICAgIGlmICghaXNEYXRhU3RydWN0dXJlKHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9XG4gICAgICB2YWx1ZSA9IFNlcSh2YWx1ZSk7XG4gICAgfVxuICAgIGlmIChpc0tleWVkKHZhbHVlKSkge1xuICAgICAgdmFyIHJlc3VsdCQxID0ge307XG4gICAgICB2YWx1ZS5fX2l0ZXJhdGUoZnVuY3Rpb24gKHYsIGspIHtcbiAgICAgICAgcmVzdWx0JDFba10gPSB0b0pTKHYpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gcmVzdWx0JDE7XG4gICAgfVxuICAgIHZhciByZXN1bHQgPSBbXTtcbiAgICB2YWx1ZS5fX2l0ZXJhdGUoZnVuY3Rpb24gKHYpIHtcbiAgICAgIHJlc3VsdC5wdXNoKHRvSlModikpO1xuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICB2YXIgU2V0ID0gLypAX19QVVJFX18qLyhmdW5jdGlvbiAoU2V0Q29sbGVjdGlvbikge1xuICAgIGZ1bmN0aW9uIFNldCh2YWx1ZSkge1xuICAgICAgcmV0dXJuIHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IG51bGxcbiAgICAgICAgPyBlbXB0eVNldCgpXG4gICAgICAgIDogaXNTZXQodmFsdWUpICYmICFpc09yZGVyZWQodmFsdWUpXG4gICAgICAgID8gdmFsdWVcbiAgICAgICAgOiBlbXB0eVNldCgpLndpdGhNdXRhdGlvbnMoZnVuY3Rpb24gKHNldCkge1xuICAgICAgICAgICAgdmFyIGl0ZXIgPSBTZXRDb2xsZWN0aW9uKHZhbHVlKTtcbiAgICAgICAgICAgIGFzc2VydE5vdEluZmluaXRlKGl0ZXIuc2l6ZSk7XG4gICAgICAgICAgICBpdGVyLmZvckVhY2goZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHNldC5hZGQodik7IH0pO1xuICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICggU2V0Q29sbGVjdGlvbiApIFNldC5fX3Byb3RvX18gPSBTZXRDb2xsZWN0aW9uO1xuICAgIFNldC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBTZXRDb2xsZWN0aW9uICYmIFNldENvbGxlY3Rpb24ucHJvdG90eXBlICk7XG4gICAgU2V0LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFNldDtcblxuICAgIFNldC5vZiA9IGZ1bmN0aW9uIG9mICgvKi4uLnZhbHVlcyovKSB7XG4gICAgICByZXR1cm4gdGhpcyhhcmd1bWVudHMpO1xuICAgIH07XG5cbiAgICBTZXQuZnJvbUtleXMgPSBmdW5jdGlvbiBmcm9tS2V5cyAodmFsdWUpIHtcbiAgICAgIHJldHVybiB0aGlzKEtleWVkQ29sbGVjdGlvbih2YWx1ZSkua2V5U2VxKCkpO1xuICAgIH07XG5cbiAgICBTZXQuaW50ZXJzZWN0ID0gZnVuY3Rpb24gaW50ZXJzZWN0IChzZXRzKSB7XG4gICAgICBzZXRzID0gQ29sbGVjdGlvbihzZXRzKS50b0FycmF5KCk7XG4gICAgICByZXR1cm4gc2V0cy5sZW5ndGhcbiAgICAgICAgPyBTZXRQcm90b3R5cGUuaW50ZXJzZWN0LmFwcGx5KFNldChzZXRzLnBvcCgpKSwgc2V0cylcbiAgICAgICAgOiBlbXB0eVNldCgpO1xuICAgIH07XG5cbiAgICBTZXQudW5pb24gPSBmdW5jdGlvbiB1bmlvbiAoc2V0cykge1xuICAgICAgc2V0cyA9IENvbGxlY3Rpb24oc2V0cykudG9BcnJheSgpO1xuICAgICAgcmV0dXJuIHNldHMubGVuZ3RoXG4gICAgICAgID8gU2V0UHJvdG90eXBlLnVuaW9uLmFwcGx5KFNldChzZXRzLnBvcCgpKSwgc2V0cylcbiAgICAgICAgOiBlbXB0eVNldCgpO1xuICAgIH07XG5cbiAgICBTZXQucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcgKCkge1xuICAgICAgcmV0dXJuIHRoaXMuX190b1N0cmluZygnU2V0IHsnLCAnfScpO1xuICAgIH07XG5cbiAgICAvLyBAcHJhZ21hIEFjY2Vzc1xuXG4gICAgU2V0LnByb3RvdHlwZS5oYXMgPSBmdW5jdGlvbiBoYXMgKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdGhpcy5fbWFwLmhhcyh2YWx1ZSk7XG4gICAgfTtcblxuICAgIC8vIEBwcmFnbWEgTW9kaWZpY2F0aW9uXG5cbiAgICBTZXQucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uIGFkZCAodmFsdWUpIHtcbiAgICAgIHJldHVybiB1cGRhdGVTZXQodGhpcywgdGhpcy5fbWFwLnNldCh2YWx1ZSwgdmFsdWUpKTtcbiAgICB9O1xuXG4gICAgU2V0LnByb3RvdHlwZS5yZW1vdmUgPSBmdW5jdGlvbiByZW1vdmUgKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdXBkYXRlU2V0KHRoaXMsIHRoaXMuX21hcC5yZW1vdmUodmFsdWUpKTtcbiAgICB9O1xuXG4gICAgU2V0LnByb3RvdHlwZS5jbGVhciA9IGZ1bmN0aW9uIGNsZWFyICgpIHtcbiAgICAgIHJldHVybiB1cGRhdGVTZXQodGhpcywgdGhpcy5fbWFwLmNsZWFyKCkpO1xuICAgIH07XG5cbiAgICAvLyBAcHJhZ21hIENvbXBvc2l0aW9uXG5cbiAgICBTZXQucHJvdG90eXBlLm1hcCA9IGZ1bmN0aW9uIG1hcCAobWFwcGVyLCBjb250ZXh0KSB7XG4gICAgICB2YXIgdGhpcyQxJDEgPSB0aGlzO1xuXG4gICAgICAvLyBrZWVwIHRyYWNrIGlmIHRoZSBzZXQgaXMgYWx0ZXJlZCBieSB0aGUgbWFwIGZ1bmN0aW9uXG4gICAgICB2YXIgZGlkQ2hhbmdlcyA9IGZhbHNlO1xuXG4gICAgICB2YXIgbmV3TWFwID0gdXBkYXRlU2V0KFxuICAgICAgICB0aGlzLFxuICAgICAgICB0aGlzLl9tYXAubWFwRW50cmllcyhmdW5jdGlvbiAocmVmKSB7XG4gICAgICAgICAgdmFyIHYgPSByZWZbMV07XG5cbiAgICAgICAgICB2YXIgbWFwcGVkID0gbWFwcGVyLmNhbGwoY29udGV4dCwgdiwgdiwgdGhpcyQxJDEpO1xuXG4gICAgICAgICAgaWYgKG1hcHBlZCAhPT0gdikge1xuICAgICAgICAgICAgZGlkQ2hhbmdlcyA9IHRydWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIFttYXBwZWQsIG1hcHBlZF07XG4gICAgICAgIH0sIGNvbnRleHQpXG4gICAgICApO1xuXG4gICAgICByZXR1cm4gZGlkQ2hhbmdlcyA/IG5ld01hcCA6IHRoaXM7XG4gICAgfTtcblxuICAgIFNldC5wcm90b3R5cGUudW5pb24gPSBmdW5jdGlvbiB1bmlvbiAoKSB7XG4gICAgICB2YXIgaXRlcnMgPSBbXSwgbGVuID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgICAgIHdoaWxlICggbGVuLS0gKSBpdGVyc1sgbGVuIF0gPSBhcmd1bWVudHNbIGxlbiBdO1xuXG4gICAgICBpdGVycyA9IGl0ZXJzLmZpbHRlcihmdW5jdGlvbiAoeCkgeyByZXR1cm4geC5zaXplICE9PSAwOyB9KTtcbiAgICAgIGlmIChpdGVycy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5zaXplID09PSAwICYmICF0aGlzLl9fb3duZXJJRCAmJiBpdGVycy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29uc3RydWN0b3IoaXRlcnNbMF0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMud2l0aE11dGF0aW9ucyhmdW5jdGlvbiAoc2V0KSB7XG4gICAgICAgIGZvciAodmFyIGlpID0gMDsgaWkgPCBpdGVycy5sZW5ndGg7IGlpKyspIHtcbiAgICAgICAgICBTZXRDb2xsZWN0aW9uKGl0ZXJzW2lpXSkuZm9yRWFjaChmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHNldC5hZGQodmFsdWUpOyB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIFNldC5wcm90b3R5cGUuaW50ZXJzZWN0ID0gZnVuY3Rpb24gaW50ZXJzZWN0ICgpIHtcbiAgICAgIHZhciBpdGVycyA9IFtdLCBsZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuICAgICAgd2hpbGUgKCBsZW4tLSApIGl0ZXJzWyBsZW4gXSA9IGFyZ3VtZW50c1sgbGVuIF07XG5cbiAgICAgIGlmIChpdGVycy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG4gICAgICBpdGVycyA9IGl0ZXJzLm1hcChmdW5jdGlvbiAoaXRlcikgeyByZXR1cm4gU2V0Q29sbGVjdGlvbihpdGVyKTsgfSk7XG4gICAgICB2YXIgdG9SZW1vdmUgPSBbXTtcbiAgICAgIHRoaXMuZm9yRWFjaChmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgaWYgKCFpdGVycy5ldmVyeShmdW5jdGlvbiAoaXRlcikgeyByZXR1cm4gaXRlci5pbmNsdWRlcyh2YWx1ZSk7IH0pKSB7XG4gICAgICAgICAgdG9SZW1vdmUucHVzaCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHRoaXMud2l0aE11dGF0aW9ucyhmdW5jdGlvbiAoc2V0KSB7XG4gICAgICAgIHRvUmVtb3ZlLmZvckVhY2goZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgc2V0LnJlbW92ZSh2YWx1ZSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIFNldC5wcm90b3R5cGUuc3VidHJhY3QgPSBmdW5jdGlvbiBzdWJ0cmFjdCAoKSB7XG4gICAgICB2YXIgaXRlcnMgPSBbXSwgbGVuID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgICAgIHdoaWxlICggbGVuLS0gKSBpdGVyc1sgbGVuIF0gPSBhcmd1bWVudHNbIGxlbiBdO1xuXG4gICAgICBpZiAoaXRlcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuICAgICAgaXRlcnMgPSBpdGVycy5tYXAoZnVuY3Rpb24gKGl0ZXIpIHsgcmV0dXJuIFNldENvbGxlY3Rpb24oaXRlcik7IH0pO1xuICAgICAgdmFyIHRvUmVtb3ZlID0gW107XG4gICAgICB0aGlzLmZvckVhY2goZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIGlmIChpdGVycy5zb21lKGZ1bmN0aW9uIChpdGVyKSB7IHJldHVybiBpdGVyLmluY2x1ZGVzKHZhbHVlKTsgfSkpIHtcbiAgICAgICAgICB0b1JlbW92ZS5wdXNoKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gdGhpcy53aXRoTXV0YXRpb25zKGZ1bmN0aW9uIChzZXQpIHtcbiAgICAgICAgdG9SZW1vdmUuZm9yRWFjaChmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICBzZXQucmVtb3ZlKHZhbHVlKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgU2V0LnByb3RvdHlwZS5zb3J0ID0gZnVuY3Rpb24gc29ydCAoY29tcGFyYXRvcikge1xuICAgICAgLy8gTGF0ZSBiaW5kaW5nXG4gICAgICByZXR1cm4gT3JkZXJlZFNldChzb3J0RmFjdG9yeSh0aGlzLCBjb21wYXJhdG9yKSk7XG4gICAgfTtcblxuICAgIFNldC5wcm90b3R5cGUuc29ydEJ5ID0gZnVuY3Rpb24gc29ydEJ5IChtYXBwZXIsIGNvbXBhcmF0b3IpIHtcbiAgICAgIC8vIExhdGUgYmluZGluZ1xuICAgICAgcmV0dXJuIE9yZGVyZWRTZXQoc29ydEZhY3RvcnkodGhpcywgY29tcGFyYXRvciwgbWFwcGVyKSk7XG4gICAgfTtcblxuICAgIFNldC5wcm90b3R5cGUud2FzQWx0ZXJlZCA9IGZ1bmN0aW9uIHdhc0FsdGVyZWQgKCkge1xuICAgICAgcmV0dXJuIHRoaXMuX21hcC53YXNBbHRlcmVkKCk7XG4gICAgfTtcblxuICAgIFNldC5wcm90b3R5cGUuX19pdGVyYXRlID0gZnVuY3Rpb24gX19pdGVyYXRlIChmbiwgcmV2ZXJzZSkge1xuICAgICAgdmFyIHRoaXMkMSQxID0gdGhpcztcblxuICAgICAgcmV0dXJuIHRoaXMuX21hcC5fX2l0ZXJhdGUoZnVuY3Rpb24gKGspIHsgcmV0dXJuIGZuKGssIGssIHRoaXMkMSQxKTsgfSwgcmV2ZXJzZSk7XG4gICAgfTtcblxuICAgIFNldC5wcm90b3R5cGUuX19pdGVyYXRvciA9IGZ1bmN0aW9uIF9faXRlcmF0b3IgKHR5cGUsIHJldmVyc2UpIHtcbiAgICAgIHJldHVybiB0aGlzLl9tYXAuX19pdGVyYXRvcih0eXBlLCByZXZlcnNlKTtcbiAgICB9O1xuXG4gICAgU2V0LnByb3RvdHlwZS5fX2Vuc3VyZU93bmVyID0gZnVuY3Rpb24gX19lbnN1cmVPd25lciAob3duZXJJRCkge1xuICAgICAgaWYgKG93bmVySUQgPT09IHRoaXMuX19vd25lcklEKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuICAgICAgdmFyIG5ld01hcCA9IHRoaXMuX21hcC5fX2Vuc3VyZU93bmVyKG93bmVySUQpO1xuICAgICAgaWYgKCFvd25lcklEKSB7XG4gICAgICAgIGlmICh0aGlzLnNpemUgPT09IDApIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5fX2VtcHR5KCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fX293bmVySUQgPSBvd25lcklEO1xuICAgICAgICB0aGlzLl9tYXAgPSBuZXdNYXA7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuX19tYWtlKG5ld01hcCwgb3duZXJJRCk7XG4gICAgfTtcblxuICAgIHJldHVybiBTZXQ7XG4gIH0oU2V0Q29sbGVjdGlvbikpO1xuXG4gIFNldC5pc1NldCA9IGlzU2V0O1xuXG4gIHZhciBTZXRQcm90b3R5cGUgPSBTZXQucHJvdG90eXBlO1xuICBTZXRQcm90b3R5cGVbSVNfU0VUX1NZTUJPTF0gPSB0cnVlO1xuICBTZXRQcm90b3R5cGVbREVMRVRFXSA9IFNldFByb3RvdHlwZS5yZW1vdmU7XG4gIFNldFByb3RvdHlwZS5tZXJnZSA9IFNldFByb3RvdHlwZS5jb25jYXQgPSBTZXRQcm90b3R5cGUudW5pb247XG4gIFNldFByb3RvdHlwZS53aXRoTXV0YXRpb25zID0gd2l0aE11dGF0aW9ucztcbiAgU2V0UHJvdG90eXBlLmFzSW1tdXRhYmxlID0gYXNJbW11dGFibGU7XG4gIFNldFByb3RvdHlwZVsnQEB0cmFuc2R1Y2VyL2luaXQnXSA9IFNldFByb3RvdHlwZS5hc011dGFibGUgPSBhc011dGFibGU7XG4gIFNldFByb3RvdHlwZVsnQEB0cmFuc2R1Y2VyL3N0ZXAnXSA9IGZ1bmN0aW9uIChyZXN1bHQsIGFycikge1xuICAgIHJldHVybiByZXN1bHQuYWRkKGFycik7XG4gIH07XG4gIFNldFByb3RvdHlwZVsnQEB0cmFuc2R1Y2VyL3Jlc3VsdCddID0gZnVuY3Rpb24gKG9iaikge1xuICAgIHJldHVybiBvYmouYXNJbW11dGFibGUoKTtcbiAgfTtcblxuICBTZXRQcm90b3R5cGUuX19lbXB0eSA9IGVtcHR5U2V0O1xuICBTZXRQcm90b3R5cGUuX19tYWtlID0gbWFrZVNldDtcblxuICBmdW5jdGlvbiB1cGRhdGVTZXQoc2V0LCBuZXdNYXApIHtcbiAgICBpZiAoc2V0Ll9fb3duZXJJRCkge1xuICAgICAgc2V0LnNpemUgPSBuZXdNYXAuc2l6ZTtcbiAgICAgIHNldC5fbWFwID0gbmV3TWFwO1xuICAgICAgcmV0dXJuIHNldDtcbiAgICB9XG4gICAgcmV0dXJuIG5ld01hcCA9PT0gc2V0Ll9tYXBcbiAgICAgID8gc2V0XG4gICAgICA6IG5ld01hcC5zaXplID09PSAwXG4gICAgICA/IHNldC5fX2VtcHR5KClcbiAgICAgIDogc2V0Ll9fbWFrZShuZXdNYXApO1xuICB9XG5cbiAgZnVuY3Rpb24gbWFrZVNldChtYXAsIG93bmVySUQpIHtcbiAgICB2YXIgc2V0ID0gT2JqZWN0LmNyZWF0ZShTZXRQcm90b3R5cGUpO1xuICAgIHNldC5zaXplID0gbWFwID8gbWFwLnNpemUgOiAwO1xuICAgIHNldC5fbWFwID0gbWFwO1xuICAgIHNldC5fX293bmVySUQgPSBvd25lcklEO1xuICAgIHJldHVybiBzZXQ7XG4gIH1cblxuICB2YXIgRU1QVFlfU0VUO1xuICBmdW5jdGlvbiBlbXB0eVNldCgpIHtcbiAgICByZXR1cm4gRU1QVFlfU0VUIHx8IChFTVBUWV9TRVQgPSBtYWtlU2V0KGVtcHR5TWFwKCkpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgbGF6eSBzZXEgb2YgbnVtcyBmcm9tIHN0YXJ0IChpbmNsdXNpdmUpIHRvIGVuZFxuICAgKiAoZXhjbHVzaXZlKSwgYnkgc3RlcCwgd2hlcmUgc3RhcnQgZGVmYXVsdHMgdG8gMCwgc3RlcCB0byAxLCBhbmQgZW5kIHRvXG4gICAqIGluZmluaXR5LiBXaGVuIHN0YXJ0IGlzIGVxdWFsIHRvIGVuZCwgcmV0dXJucyBlbXB0eSBsaXN0LlxuICAgKi9cbiAgdmFyIFJhbmdlID0gLypAX19QVVJFX18qLyhmdW5jdGlvbiAoSW5kZXhlZFNlcSkge1xuICAgIGZ1bmN0aW9uIFJhbmdlKHN0YXJ0LCBlbmQsIHN0ZXApIHtcbiAgICAgIGlmICghKHRoaXMgaW5zdGFuY2VvZiBSYW5nZSkpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBSYW5nZShzdGFydCwgZW5kLCBzdGVwKTtcbiAgICAgIH1cbiAgICAgIGludmFyaWFudChzdGVwICE9PSAwLCAnQ2Fubm90IHN0ZXAgYSBSYW5nZSBieSAwJyk7XG4gICAgICBzdGFydCA9IHN0YXJ0IHx8IDA7XG4gICAgICBpZiAoZW5kID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZW5kID0gSW5maW5pdHk7XG4gICAgICB9XG4gICAgICBzdGVwID0gc3RlcCA9PT0gdW5kZWZpbmVkID8gMSA6IE1hdGguYWJzKHN0ZXApO1xuICAgICAgaWYgKGVuZCA8IHN0YXJ0KSB7XG4gICAgICAgIHN0ZXAgPSAtc3RlcDtcbiAgICAgIH1cbiAgICAgIHRoaXMuX3N0YXJ0ID0gc3RhcnQ7XG4gICAgICB0aGlzLl9lbmQgPSBlbmQ7XG4gICAgICB0aGlzLl9zdGVwID0gc3RlcDtcbiAgICAgIHRoaXMuc2l6ZSA9IE1hdGgubWF4KDAsIE1hdGguY2VpbCgoZW5kIC0gc3RhcnQpIC8gc3RlcCAtIDEpICsgMSk7XG4gICAgICBpZiAodGhpcy5zaXplID09PSAwKSB7XG4gICAgICAgIGlmIChFTVBUWV9SQU5HRSkge1xuICAgICAgICAgIHJldHVybiBFTVBUWV9SQU5HRTtcbiAgICAgICAgfVxuICAgICAgICBFTVBUWV9SQU5HRSA9IHRoaXM7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCBJbmRleGVkU2VxICkgUmFuZ2UuX19wcm90b19fID0gSW5kZXhlZFNlcTtcbiAgICBSYW5nZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBJbmRleGVkU2VxICYmIEluZGV4ZWRTZXEucHJvdG90eXBlICk7XG4gICAgUmFuZ2UucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gUmFuZ2U7XG5cbiAgICBSYW5nZS5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZyAoKSB7XG4gICAgICBpZiAodGhpcy5zaXplID09PSAwKSB7XG4gICAgICAgIHJldHVybiAnUmFuZ2UgW10nO1xuICAgICAgfVxuICAgICAgcmV0dXJuIChcbiAgICAgICAgJ1JhbmdlIFsgJyArXG4gICAgICAgIHRoaXMuX3N0YXJ0ICtcbiAgICAgICAgJy4uLicgK1xuICAgICAgICB0aGlzLl9lbmQgK1xuICAgICAgICAodGhpcy5fc3RlcCAhPT0gMSA/ICcgYnkgJyArIHRoaXMuX3N0ZXAgOiAnJykgK1xuICAgICAgICAnIF0nXG4gICAgICApO1xuICAgIH07XG5cbiAgICBSYW5nZS5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gZ2V0IChpbmRleCwgbm90U2V0VmFsdWUpIHtcbiAgICAgIHJldHVybiB0aGlzLmhhcyhpbmRleClcbiAgICAgICAgPyB0aGlzLl9zdGFydCArIHdyYXBJbmRleCh0aGlzLCBpbmRleCkgKiB0aGlzLl9zdGVwXG4gICAgICAgIDogbm90U2V0VmFsdWU7XG4gICAgfTtcblxuICAgIFJhbmdlLnByb3RvdHlwZS5pbmNsdWRlcyA9IGZ1bmN0aW9uIGluY2x1ZGVzIChzZWFyY2hWYWx1ZSkge1xuICAgICAgdmFyIHBvc3NpYmxlSW5kZXggPSAoc2VhcmNoVmFsdWUgLSB0aGlzLl9zdGFydCkgLyB0aGlzLl9zdGVwO1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgcG9zc2libGVJbmRleCA+PSAwICYmXG4gICAgICAgIHBvc3NpYmxlSW5kZXggPCB0aGlzLnNpemUgJiZcbiAgICAgICAgcG9zc2libGVJbmRleCA9PT0gTWF0aC5mbG9vcihwb3NzaWJsZUluZGV4KVxuICAgICAgKTtcbiAgICB9O1xuXG4gICAgUmFuZ2UucHJvdG90eXBlLnNsaWNlID0gZnVuY3Rpb24gc2xpY2UgKGJlZ2luLCBlbmQpIHtcbiAgICAgIGlmICh3aG9sZVNsaWNlKGJlZ2luLCBlbmQsIHRoaXMuc2l6ZSkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG4gICAgICBiZWdpbiA9IHJlc29sdmVCZWdpbihiZWdpbiwgdGhpcy5zaXplKTtcbiAgICAgIGVuZCA9IHJlc29sdmVFbmQoZW5kLCB0aGlzLnNpemUpO1xuICAgICAgaWYgKGVuZCA8PSBiZWdpbikge1xuICAgICAgICByZXR1cm4gbmV3IFJhbmdlKDAsIDApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5ldyBSYW5nZShcbiAgICAgICAgdGhpcy5nZXQoYmVnaW4sIHRoaXMuX2VuZCksXG4gICAgICAgIHRoaXMuZ2V0KGVuZCwgdGhpcy5fZW5kKSxcbiAgICAgICAgdGhpcy5fc3RlcFxuICAgICAgKTtcbiAgICB9O1xuXG4gICAgUmFuZ2UucHJvdG90eXBlLmluZGV4T2YgPSBmdW5jdGlvbiBpbmRleE9mIChzZWFyY2hWYWx1ZSkge1xuICAgICAgdmFyIG9mZnNldFZhbHVlID0gc2VhcmNoVmFsdWUgLSB0aGlzLl9zdGFydDtcbiAgICAgIGlmIChvZmZzZXRWYWx1ZSAlIHRoaXMuX3N0ZXAgPT09IDApIHtcbiAgICAgICAgdmFyIGluZGV4ID0gb2Zmc2V0VmFsdWUgLyB0aGlzLl9zdGVwO1xuICAgICAgICBpZiAoaW5kZXggPj0gMCAmJiBpbmRleCA8IHRoaXMuc2l6ZSkge1xuICAgICAgICAgIHJldHVybiBpbmRleDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIC0xO1xuICAgIH07XG5cbiAgICBSYW5nZS5wcm90b3R5cGUubGFzdEluZGV4T2YgPSBmdW5jdGlvbiBsYXN0SW5kZXhPZiAoc2VhcmNoVmFsdWUpIHtcbiAgICAgIHJldHVybiB0aGlzLmluZGV4T2Yoc2VhcmNoVmFsdWUpO1xuICAgIH07XG5cbiAgICBSYW5nZS5wcm90b3R5cGUuX19pdGVyYXRlID0gZnVuY3Rpb24gX19pdGVyYXRlIChmbiwgcmV2ZXJzZSkge1xuICAgICAgdmFyIHNpemUgPSB0aGlzLnNpemU7XG4gICAgICB2YXIgc3RlcCA9IHRoaXMuX3N0ZXA7XG4gICAgICB2YXIgdmFsdWUgPSByZXZlcnNlID8gdGhpcy5fc3RhcnQgKyAoc2l6ZSAtIDEpICogc3RlcCA6IHRoaXMuX3N0YXJ0O1xuICAgICAgdmFyIGkgPSAwO1xuICAgICAgd2hpbGUgKGkgIT09IHNpemUpIHtcbiAgICAgICAgaWYgKGZuKHZhbHVlLCByZXZlcnNlID8gc2l6ZSAtICsraSA6IGkrKywgdGhpcykgPT09IGZhbHNlKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgdmFsdWUgKz0gcmV2ZXJzZSA/IC1zdGVwIDogc3RlcDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBpO1xuICAgIH07XG5cbiAgICBSYW5nZS5wcm90b3R5cGUuX19pdGVyYXRvciA9IGZ1bmN0aW9uIF9faXRlcmF0b3IgKHR5cGUsIHJldmVyc2UpIHtcbiAgICAgIHZhciBzaXplID0gdGhpcy5zaXplO1xuICAgICAgdmFyIHN0ZXAgPSB0aGlzLl9zdGVwO1xuICAgICAgdmFyIHZhbHVlID0gcmV2ZXJzZSA/IHRoaXMuX3N0YXJ0ICsgKHNpemUgLSAxKSAqIHN0ZXAgOiB0aGlzLl9zdGFydDtcbiAgICAgIHZhciBpID0gMDtcbiAgICAgIHJldHVybiBuZXcgSXRlcmF0b3IoZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoaSA9PT0gc2l6ZSkge1xuICAgICAgICAgIHJldHVybiBpdGVyYXRvckRvbmUoKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgdiA9IHZhbHVlO1xuICAgICAgICB2YWx1ZSArPSByZXZlcnNlID8gLXN0ZXAgOiBzdGVwO1xuICAgICAgICByZXR1cm4gaXRlcmF0b3JWYWx1ZSh0eXBlLCByZXZlcnNlID8gc2l6ZSAtICsraSA6IGkrKywgdik7XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgUmFuZ2UucHJvdG90eXBlLmVxdWFscyA9IGZ1bmN0aW9uIGVxdWFscyAob3RoZXIpIHtcbiAgICAgIHJldHVybiBvdGhlciBpbnN0YW5jZW9mIFJhbmdlXG4gICAgICAgID8gdGhpcy5fc3RhcnQgPT09IG90aGVyLl9zdGFydCAmJlxuICAgICAgICAgICAgdGhpcy5fZW5kID09PSBvdGhlci5fZW5kICYmXG4gICAgICAgICAgICB0aGlzLl9zdGVwID09PSBvdGhlci5fc3RlcFxuICAgICAgICA6IGRlZXBFcXVhbCh0aGlzLCBvdGhlcik7XG4gICAgfTtcblxuICAgIHJldHVybiBSYW5nZTtcbiAgfShJbmRleGVkU2VxKSk7XG5cbiAgdmFyIEVNUFRZX1JBTkdFO1xuXG4gIGZ1bmN0aW9uIGdldEluJDEoY29sbGVjdGlvbiwgc2VhcmNoS2V5UGF0aCwgbm90U2V0VmFsdWUpIHtcbiAgICB2YXIga2V5UGF0aCA9IGNvZXJjZUtleVBhdGgoc2VhcmNoS2V5UGF0aCk7XG4gICAgdmFyIGkgPSAwO1xuICAgIHdoaWxlIChpICE9PSBrZXlQYXRoLmxlbmd0aCkge1xuICAgICAgY29sbGVjdGlvbiA9IGdldChjb2xsZWN0aW9uLCBrZXlQYXRoW2krK10sIE5PVF9TRVQpO1xuICAgICAgaWYgKGNvbGxlY3Rpb24gPT09IE5PVF9TRVQpIHtcbiAgICAgICAgcmV0dXJuIG5vdFNldFZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY29sbGVjdGlvbjtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldEluKHNlYXJjaEtleVBhdGgsIG5vdFNldFZhbHVlKSB7XG4gICAgcmV0dXJuIGdldEluJDEodGhpcywgc2VhcmNoS2V5UGF0aCwgbm90U2V0VmFsdWUpO1xuICB9XG5cbiAgZnVuY3Rpb24gaGFzSW4kMShjb2xsZWN0aW9uLCBrZXlQYXRoKSB7XG4gICAgcmV0dXJuIGdldEluJDEoY29sbGVjdGlvbiwga2V5UGF0aCwgTk9UX1NFVCkgIT09IE5PVF9TRVQ7XG4gIH1cblxuICBmdW5jdGlvbiBoYXNJbihzZWFyY2hLZXlQYXRoKSB7XG4gICAgcmV0dXJuIGhhc0luJDEodGhpcywgc2VhcmNoS2V5UGF0aCk7XG4gIH1cblxuICBmdW5jdGlvbiB0b09iamVjdCgpIHtcbiAgICBhc3NlcnROb3RJbmZpbml0ZSh0aGlzLnNpemUpO1xuICAgIHZhciBvYmplY3QgPSB7fTtcbiAgICB0aGlzLl9faXRlcmF0ZShmdW5jdGlvbiAodiwgaykge1xuICAgICAgb2JqZWN0W2tdID0gdjtcbiAgICB9KTtcbiAgICByZXR1cm4gb2JqZWN0O1xuICB9XG5cbiAgLy8gTm90ZTogYWxsIG9mIHRoZXNlIG1ldGhvZHMgYXJlIGRlcHJlY2F0ZWQuXG4gIENvbGxlY3Rpb24uaXNJdGVyYWJsZSA9IGlzQ29sbGVjdGlvbjtcbiAgQ29sbGVjdGlvbi5pc0tleWVkID0gaXNLZXllZDtcbiAgQ29sbGVjdGlvbi5pc0luZGV4ZWQgPSBpc0luZGV4ZWQ7XG4gIENvbGxlY3Rpb24uaXNBc3NvY2lhdGl2ZSA9IGlzQXNzb2NpYXRpdmU7XG4gIENvbGxlY3Rpb24uaXNPcmRlcmVkID0gaXNPcmRlcmVkO1xuXG4gIENvbGxlY3Rpb24uSXRlcmF0b3IgPSBJdGVyYXRvcjtcblxuICBtaXhpbihDb2xsZWN0aW9uLCB7XG4gICAgLy8gIyMjIENvbnZlcnNpb24gdG8gb3RoZXIgdHlwZXNcblxuICAgIHRvQXJyYXk6IGZ1bmN0aW9uIHRvQXJyYXkoKSB7XG4gICAgICBhc3NlcnROb3RJbmZpbml0ZSh0aGlzLnNpemUpO1xuICAgICAgdmFyIGFycmF5ID0gbmV3IEFycmF5KHRoaXMuc2l6ZSB8fCAwKTtcbiAgICAgIHZhciB1c2VUdXBsZXMgPSBpc0tleWVkKHRoaXMpO1xuICAgICAgdmFyIGkgPSAwO1xuICAgICAgdGhpcy5fX2l0ZXJhdGUoZnVuY3Rpb24gKHYsIGspIHtcbiAgICAgICAgLy8gS2V5ZWQgY29sbGVjdGlvbnMgcHJvZHVjZSBhbiBhcnJheSBvZiB0dXBsZXMuXG4gICAgICAgIGFycmF5W2krK10gPSB1c2VUdXBsZXMgPyBbaywgdl0gOiB2O1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gYXJyYXk7XG4gICAgfSxcblxuICAgIHRvSW5kZXhlZFNlcTogZnVuY3Rpb24gdG9JbmRleGVkU2VxKCkge1xuICAgICAgcmV0dXJuIG5ldyBUb0luZGV4ZWRTZXF1ZW5jZSh0aGlzKTtcbiAgICB9LFxuXG4gICAgdG9KUzogZnVuY3Rpb24gdG9KUyQxKCkge1xuICAgICAgcmV0dXJuIHRvSlModGhpcyk7XG4gICAgfSxcblxuICAgIHRvS2V5ZWRTZXE6IGZ1bmN0aW9uIHRvS2V5ZWRTZXEoKSB7XG4gICAgICByZXR1cm4gbmV3IFRvS2V5ZWRTZXF1ZW5jZSh0aGlzLCB0cnVlKTtcbiAgICB9LFxuXG4gICAgdG9NYXA6IGZ1bmN0aW9uIHRvTWFwKCkge1xuICAgICAgLy8gVXNlIExhdGUgQmluZGluZyBoZXJlIHRvIHNvbHZlIHRoZSBjaXJjdWxhciBkZXBlbmRlbmN5LlxuICAgICAgcmV0dXJuIE1hcCh0aGlzLnRvS2V5ZWRTZXEoKSk7XG4gICAgfSxcblxuICAgIHRvT2JqZWN0OiB0b09iamVjdCxcblxuICAgIHRvT3JkZXJlZE1hcDogZnVuY3Rpb24gdG9PcmRlcmVkTWFwKCkge1xuICAgICAgLy8gVXNlIExhdGUgQmluZGluZyBoZXJlIHRvIHNvbHZlIHRoZSBjaXJjdWxhciBkZXBlbmRlbmN5LlxuICAgICAgcmV0dXJuIE9yZGVyZWRNYXAodGhpcy50b0tleWVkU2VxKCkpO1xuICAgIH0sXG5cbiAgICB0b09yZGVyZWRTZXQ6IGZ1bmN0aW9uIHRvT3JkZXJlZFNldCgpIHtcbiAgICAgIC8vIFVzZSBMYXRlIEJpbmRpbmcgaGVyZSB0byBzb2x2ZSB0aGUgY2lyY3VsYXIgZGVwZW5kZW5jeS5cbiAgICAgIHJldHVybiBPcmRlcmVkU2V0KGlzS2V5ZWQodGhpcykgPyB0aGlzLnZhbHVlU2VxKCkgOiB0aGlzKTtcbiAgICB9LFxuXG4gICAgdG9TZXQ6IGZ1bmN0aW9uIHRvU2V0KCkge1xuICAgICAgLy8gVXNlIExhdGUgQmluZGluZyBoZXJlIHRvIHNvbHZlIHRoZSBjaXJjdWxhciBkZXBlbmRlbmN5LlxuICAgICAgcmV0dXJuIFNldChpc0tleWVkKHRoaXMpID8gdGhpcy52YWx1ZVNlcSgpIDogdGhpcyk7XG4gICAgfSxcblxuICAgIHRvU2V0U2VxOiBmdW5jdGlvbiB0b1NldFNlcSgpIHtcbiAgICAgIHJldHVybiBuZXcgVG9TZXRTZXF1ZW5jZSh0aGlzKTtcbiAgICB9LFxuXG4gICAgdG9TZXE6IGZ1bmN0aW9uIHRvU2VxKCkge1xuICAgICAgcmV0dXJuIGlzSW5kZXhlZCh0aGlzKVxuICAgICAgICA/IHRoaXMudG9JbmRleGVkU2VxKClcbiAgICAgICAgOiBpc0tleWVkKHRoaXMpXG4gICAgICAgID8gdGhpcy50b0tleWVkU2VxKClcbiAgICAgICAgOiB0aGlzLnRvU2V0U2VxKCk7XG4gICAgfSxcblxuICAgIHRvU3RhY2s6IGZ1bmN0aW9uIHRvU3RhY2soKSB7XG4gICAgICAvLyBVc2UgTGF0ZSBCaW5kaW5nIGhlcmUgdG8gc29sdmUgdGhlIGNpcmN1bGFyIGRlcGVuZGVuY3kuXG4gICAgICByZXR1cm4gU3RhY2soaXNLZXllZCh0aGlzKSA/IHRoaXMudmFsdWVTZXEoKSA6IHRoaXMpO1xuICAgIH0sXG5cbiAgICB0b0xpc3Q6IGZ1bmN0aW9uIHRvTGlzdCgpIHtcbiAgICAgIC8vIFVzZSBMYXRlIEJpbmRpbmcgaGVyZSB0byBzb2x2ZSB0aGUgY2lyY3VsYXIgZGVwZW5kZW5jeS5cbiAgICAgIHJldHVybiBMaXN0KGlzS2V5ZWQodGhpcykgPyB0aGlzLnZhbHVlU2VxKCkgOiB0aGlzKTtcbiAgICB9LFxuXG4gICAgLy8gIyMjIENvbW1vbiBKYXZhU2NyaXB0IG1ldGhvZHMgYW5kIHByb3BlcnRpZXNcblxuICAgIHRvU3RyaW5nOiBmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgICAgIHJldHVybiAnW0NvbGxlY3Rpb25dJztcbiAgICB9LFxuXG4gICAgX190b1N0cmluZzogZnVuY3Rpb24gX190b1N0cmluZyhoZWFkLCB0YWlsKSB7XG4gICAgICBpZiAodGhpcy5zaXplID09PSAwKSB7XG4gICAgICAgIHJldHVybiBoZWFkICsgdGFpbDtcbiAgICAgIH1cbiAgICAgIHJldHVybiAoXG4gICAgICAgIGhlYWQgK1xuICAgICAgICAnICcgK1xuICAgICAgICB0aGlzLnRvU2VxKCkubWFwKHRoaXMuX190b1N0cmluZ01hcHBlcikuam9pbignLCAnKSArXG4gICAgICAgICcgJyArXG4gICAgICAgIHRhaWxcbiAgICAgICk7XG4gICAgfSxcblxuICAgIC8vICMjIyBFUzYgQ29sbGVjdGlvbiBtZXRob2RzIChFUzYgQXJyYXkgYW5kIE1hcClcblxuICAgIGNvbmNhdDogZnVuY3Rpb24gY29uY2F0KCkge1xuICAgICAgdmFyIHZhbHVlcyA9IFtdLCBsZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuICAgICAgd2hpbGUgKCBsZW4tLSApIHZhbHVlc1sgbGVuIF0gPSBhcmd1bWVudHNbIGxlbiBdO1xuXG4gICAgICByZXR1cm4gcmVpZnkodGhpcywgY29uY2F0RmFjdG9yeSh0aGlzLCB2YWx1ZXMpKTtcbiAgICB9LFxuXG4gICAgaW5jbHVkZXM6IGZ1bmN0aW9uIGluY2x1ZGVzKHNlYXJjaFZhbHVlKSB7XG4gICAgICByZXR1cm4gdGhpcy5zb21lKGZ1bmN0aW9uICh2YWx1ZSkgeyByZXR1cm4gaXModmFsdWUsIHNlYXJjaFZhbHVlKTsgfSk7XG4gICAgfSxcblxuICAgIGVudHJpZXM6IGZ1bmN0aW9uIGVudHJpZXMoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fX2l0ZXJhdG9yKElURVJBVEVfRU5UUklFUyk7XG4gICAgfSxcblxuICAgIGV2ZXJ5OiBmdW5jdGlvbiBldmVyeShwcmVkaWNhdGUsIGNvbnRleHQpIHtcbiAgICAgIGFzc2VydE5vdEluZmluaXRlKHRoaXMuc2l6ZSk7XG4gICAgICB2YXIgcmV0dXJuVmFsdWUgPSB0cnVlO1xuICAgICAgdGhpcy5fX2l0ZXJhdGUoZnVuY3Rpb24gKHYsIGssIGMpIHtcbiAgICAgICAgaWYgKCFwcmVkaWNhdGUuY2FsbChjb250ZXh0LCB2LCBrLCBjKSkge1xuICAgICAgICAgIHJldHVyblZhbHVlID0gZmFsc2U7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHJldHVybiByZXR1cm5WYWx1ZTtcbiAgICB9LFxuXG4gICAgZmlsdGVyOiBmdW5jdGlvbiBmaWx0ZXIocHJlZGljYXRlLCBjb250ZXh0KSB7XG4gICAgICByZXR1cm4gcmVpZnkodGhpcywgZmlsdGVyRmFjdG9yeSh0aGlzLCBwcmVkaWNhdGUsIGNvbnRleHQsIHRydWUpKTtcbiAgICB9LFxuXG4gICAgZmluZDogZnVuY3Rpb24gZmluZChwcmVkaWNhdGUsIGNvbnRleHQsIG5vdFNldFZhbHVlKSB7XG4gICAgICB2YXIgZW50cnkgPSB0aGlzLmZpbmRFbnRyeShwcmVkaWNhdGUsIGNvbnRleHQpO1xuICAgICAgcmV0dXJuIGVudHJ5ID8gZW50cnlbMV0gOiBub3RTZXRWYWx1ZTtcbiAgICB9LFxuXG4gICAgZm9yRWFjaDogZnVuY3Rpb24gZm9yRWFjaChzaWRlRWZmZWN0LCBjb250ZXh0KSB7XG4gICAgICBhc3NlcnROb3RJbmZpbml0ZSh0aGlzLnNpemUpO1xuICAgICAgcmV0dXJuIHRoaXMuX19pdGVyYXRlKGNvbnRleHQgPyBzaWRlRWZmZWN0LmJpbmQoY29udGV4dCkgOiBzaWRlRWZmZWN0KTtcbiAgICB9LFxuXG4gICAgam9pbjogZnVuY3Rpb24gam9pbihzZXBhcmF0b3IpIHtcbiAgICAgIGFzc2VydE5vdEluZmluaXRlKHRoaXMuc2l6ZSk7XG4gICAgICBzZXBhcmF0b3IgPSBzZXBhcmF0b3IgIT09IHVuZGVmaW5lZCA/ICcnICsgc2VwYXJhdG9yIDogJywnO1xuICAgICAgdmFyIGpvaW5lZCA9ICcnO1xuICAgICAgdmFyIGlzRmlyc3QgPSB0cnVlO1xuICAgICAgdGhpcy5fX2l0ZXJhdGUoZnVuY3Rpb24gKHYpIHtcbiAgICAgICAgaXNGaXJzdCA/IChpc0ZpcnN0ID0gZmFsc2UpIDogKGpvaW5lZCArPSBzZXBhcmF0b3IpO1xuICAgICAgICBqb2luZWQgKz0gdiAhPT0gbnVsbCAmJiB2ICE9PSB1bmRlZmluZWQgPyB2LnRvU3RyaW5nKCkgOiAnJztcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGpvaW5lZDtcbiAgICB9LFxuXG4gICAga2V5czogZnVuY3Rpb24ga2V5cygpIHtcbiAgICAgIHJldHVybiB0aGlzLl9faXRlcmF0b3IoSVRFUkFURV9LRVlTKTtcbiAgICB9LFxuXG4gICAgbWFwOiBmdW5jdGlvbiBtYXAobWFwcGVyLCBjb250ZXh0KSB7XG4gICAgICByZXR1cm4gcmVpZnkodGhpcywgbWFwRmFjdG9yeSh0aGlzLCBtYXBwZXIsIGNvbnRleHQpKTtcbiAgICB9LFxuXG4gICAgcmVkdWNlOiBmdW5jdGlvbiByZWR1Y2UkMShyZWR1Y2VyLCBpbml0aWFsUmVkdWN0aW9uLCBjb250ZXh0KSB7XG4gICAgICByZXR1cm4gcmVkdWNlKFxuICAgICAgICB0aGlzLFxuICAgICAgICByZWR1Y2VyLFxuICAgICAgICBpbml0aWFsUmVkdWN0aW9uLFxuICAgICAgICBjb250ZXh0LFxuICAgICAgICBhcmd1bWVudHMubGVuZ3RoIDwgMixcbiAgICAgICAgZmFsc2VcbiAgICAgICk7XG4gICAgfSxcblxuICAgIHJlZHVjZVJpZ2h0OiBmdW5jdGlvbiByZWR1Y2VSaWdodChyZWR1Y2VyLCBpbml0aWFsUmVkdWN0aW9uLCBjb250ZXh0KSB7XG4gICAgICByZXR1cm4gcmVkdWNlKFxuICAgICAgICB0aGlzLFxuICAgICAgICByZWR1Y2VyLFxuICAgICAgICBpbml0aWFsUmVkdWN0aW9uLFxuICAgICAgICBjb250ZXh0LFxuICAgICAgICBhcmd1bWVudHMubGVuZ3RoIDwgMixcbiAgICAgICAgdHJ1ZVxuICAgICAgKTtcbiAgICB9LFxuXG4gICAgcmV2ZXJzZTogZnVuY3Rpb24gcmV2ZXJzZSgpIHtcbiAgICAgIHJldHVybiByZWlmeSh0aGlzLCByZXZlcnNlRmFjdG9yeSh0aGlzLCB0cnVlKSk7XG4gICAgfSxcblxuICAgIHNsaWNlOiBmdW5jdGlvbiBzbGljZShiZWdpbiwgZW5kKSB7XG4gICAgICByZXR1cm4gcmVpZnkodGhpcywgc2xpY2VGYWN0b3J5KHRoaXMsIGJlZ2luLCBlbmQsIHRydWUpKTtcbiAgICB9LFxuXG4gICAgc29tZTogZnVuY3Rpb24gc29tZShwcmVkaWNhdGUsIGNvbnRleHQpIHtcbiAgICAgIHJldHVybiAhdGhpcy5ldmVyeShub3QocHJlZGljYXRlKSwgY29udGV4dCk7XG4gICAgfSxcblxuICAgIHNvcnQ6IGZ1bmN0aW9uIHNvcnQoY29tcGFyYXRvcikge1xuICAgICAgcmV0dXJuIHJlaWZ5KHRoaXMsIHNvcnRGYWN0b3J5KHRoaXMsIGNvbXBhcmF0b3IpKTtcbiAgICB9LFxuXG4gICAgdmFsdWVzOiBmdW5jdGlvbiB2YWx1ZXMoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fX2l0ZXJhdG9yKElURVJBVEVfVkFMVUVTKTtcbiAgICB9LFxuXG4gICAgLy8gIyMjIE1vcmUgc2VxdWVudGlhbCBtZXRob2RzXG5cbiAgICBidXRMYXN0OiBmdW5jdGlvbiBidXRMYXN0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuc2xpY2UoMCwgLTEpO1xuICAgIH0sXG5cbiAgICBpc0VtcHR5OiBmdW5jdGlvbiBpc0VtcHR5KCkge1xuICAgICAgcmV0dXJuIHRoaXMuc2l6ZSAhPT0gdW5kZWZpbmVkID8gdGhpcy5zaXplID09PSAwIDogIXRoaXMuc29tZShmdW5jdGlvbiAoKSB7IHJldHVybiB0cnVlOyB9KTtcbiAgICB9LFxuXG4gICAgY291bnQ6IGZ1bmN0aW9uIGNvdW50KHByZWRpY2F0ZSwgY29udGV4dCkge1xuICAgICAgcmV0dXJuIGVuc3VyZVNpemUoXG4gICAgICAgIHByZWRpY2F0ZSA/IHRoaXMudG9TZXEoKS5maWx0ZXIocHJlZGljYXRlLCBjb250ZXh0KSA6IHRoaXNcbiAgICAgICk7XG4gICAgfSxcblxuICAgIGNvdW50Qnk6IGZ1bmN0aW9uIGNvdW50QnkoZ3JvdXBlciwgY29udGV4dCkge1xuICAgICAgcmV0dXJuIGNvdW50QnlGYWN0b3J5KHRoaXMsIGdyb3VwZXIsIGNvbnRleHQpO1xuICAgIH0sXG5cbiAgICBlcXVhbHM6IGZ1bmN0aW9uIGVxdWFscyhvdGhlcikge1xuICAgICAgcmV0dXJuIGRlZXBFcXVhbCh0aGlzLCBvdGhlcik7XG4gICAgfSxcblxuICAgIGVudHJ5U2VxOiBmdW5jdGlvbiBlbnRyeVNlcSgpIHtcbiAgICAgIHZhciBjb2xsZWN0aW9uID0gdGhpcztcbiAgICAgIGlmIChjb2xsZWN0aW9uLl9jYWNoZSkge1xuICAgICAgICAvLyBXZSBjYWNoZSBhcyBhbiBlbnRyaWVzIGFycmF5LCBzbyB3ZSBjYW4ganVzdCByZXR1cm4gdGhlIGNhY2hlIVxuICAgICAgICByZXR1cm4gbmV3IEFycmF5U2VxKGNvbGxlY3Rpb24uX2NhY2hlKTtcbiAgICAgIH1cbiAgICAgIHZhciBlbnRyaWVzU2VxdWVuY2UgPSBjb2xsZWN0aW9uLnRvU2VxKCkubWFwKGVudHJ5TWFwcGVyKS50b0luZGV4ZWRTZXEoKTtcbiAgICAgIGVudHJpZXNTZXF1ZW5jZS5mcm9tRW50cnlTZXEgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBjb2xsZWN0aW9uLnRvU2VxKCk7IH07XG4gICAgICByZXR1cm4gZW50cmllc1NlcXVlbmNlO1xuICAgIH0sXG5cbiAgICBmaWx0ZXJOb3Q6IGZ1bmN0aW9uIGZpbHRlck5vdChwcmVkaWNhdGUsIGNvbnRleHQpIHtcbiAgICAgIHJldHVybiB0aGlzLmZpbHRlcihub3QocHJlZGljYXRlKSwgY29udGV4dCk7XG4gICAgfSxcblxuICAgIGZpbmRFbnRyeTogZnVuY3Rpb24gZmluZEVudHJ5KHByZWRpY2F0ZSwgY29udGV4dCwgbm90U2V0VmFsdWUpIHtcbiAgICAgIHZhciBmb3VuZCA9IG5vdFNldFZhbHVlO1xuICAgICAgdGhpcy5fX2l0ZXJhdGUoZnVuY3Rpb24gKHYsIGssIGMpIHtcbiAgICAgICAgaWYgKHByZWRpY2F0ZS5jYWxsKGNvbnRleHQsIHYsIGssIGMpKSB7XG4gICAgICAgICAgZm91bmQgPSBbaywgdl07XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBmb3VuZDtcbiAgICB9LFxuXG4gICAgZmluZEtleTogZnVuY3Rpb24gZmluZEtleShwcmVkaWNhdGUsIGNvbnRleHQpIHtcbiAgICAgIHZhciBlbnRyeSA9IHRoaXMuZmluZEVudHJ5KHByZWRpY2F0ZSwgY29udGV4dCk7XG4gICAgICByZXR1cm4gZW50cnkgJiYgZW50cnlbMF07XG4gICAgfSxcblxuICAgIGZpbmRMYXN0OiBmdW5jdGlvbiBmaW5kTGFzdChwcmVkaWNhdGUsIGNvbnRleHQsIG5vdFNldFZhbHVlKSB7XG4gICAgICByZXR1cm4gdGhpcy50b0tleWVkU2VxKCkucmV2ZXJzZSgpLmZpbmQocHJlZGljYXRlLCBjb250ZXh0LCBub3RTZXRWYWx1ZSk7XG4gICAgfSxcblxuICAgIGZpbmRMYXN0RW50cnk6IGZ1bmN0aW9uIGZpbmRMYXN0RW50cnkocHJlZGljYXRlLCBjb250ZXh0LCBub3RTZXRWYWx1ZSkge1xuICAgICAgcmV0dXJuIHRoaXMudG9LZXllZFNlcSgpXG4gICAgICAgIC5yZXZlcnNlKClcbiAgICAgICAgLmZpbmRFbnRyeShwcmVkaWNhdGUsIGNvbnRleHQsIG5vdFNldFZhbHVlKTtcbiAgICB9LFxuXG4gICAgZmluZExhc3RLZXk6IGZ1bmN0aW9uIGZpbmRMYXN0S2V5KHByZWRpY2F0ZSwgY29udGV4dCkge1xuICAgICAgcmV0dXJuIHRoaXMudG9LZXllZFNlcSgpLnJldmVyc2UoKS5maW5kS2V5KHByZWRpY2F0ZSwgY29udGV4dCk7XG4gICAgfSxcblxuICAgIGZpcnN0OiBmdW5jdGlvbiBmaXJzdChub3RTZXRWYWx1ZSkge1xuICAgICAgcmV0dXJuIHRoaXMuZmluZChyZXR1cm5UcnVlLCBudWxsLCBub3RTZXRWYWx1ZSk7XG4gICAgfSxcblxuICAgIGZsYXRNYXA6IGZ1bmN0aW9uIGZsYXRNYXAobWFwcGVyLCBjb250ZXh0KSB7XG4gICAgICByZXR1cm4gcmVpZnkodGhpcywgZmxhdE1hcEZhY3RvcnkodGhpcywgbWFwcGVyLCBjb250ZXh0KSk7XG4gICAgfSxcblxuICAgIGZsYXR0ZW46IGZ1bmN0aW9uIGZsYXR0ZW4oZGVwdGgpIHtcbiAgICAgIHJldHVybiByZWlmeSh0aGlzLCBmbGF0dGVuRmFjdG9yeSh0aGlzLCBkZXB0aCwgdHJ1ZSkpO1xuICAgIH0sXG5cbiAgICBmcm9tRW50cnlTZXE6IGZ1bmN0aW9uIGZyb21FbnRyeVNlcSgpIHtcbiAgICAgIHJldHVybiBuZXcgRnJvbUVudHJpZXNTZXF1ZW5jZSh0aGlzKTtcbiAgICB9LFxuXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoc2VhcmNoS2V5LCBub3RTZXRWYWx1ZSkge1xuICAgICAgcmV0dXJuIHRoaXMuZmluZChmdW5jdGlvbiAoXywga2V5KSB7IHJldHVybiBpcyhrZXksIHNlYXJjaEtleSk7IH0sIHVuZGVmaW5lZCwgbm90U2V0VmFsdWUpO1xuICAgIH0sXG5cbiAgICBnZXRJbjogZ2V0SW4sXG5cbiAgICBncm91cEJ5OiBmdW5jdGlvbiBncm91cEJ5KGdyb3VwZXIsIGNvbnRleHQpIHtcbiAgICAgIHJldHVybiBncm91cEJ5RmFjdG9yeSh0aGlzLCBncm91cGVyLCBjb250ZXh0KTtcbiAgICB9LFxuXG4gICAgaGFzOiBmdW5jdGlvbiBoYXMoc2VhcmNoS2V5KSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXQoc2VhcmNoS2V5LCBOT1RfU0VUKSAhPT0gTk9UX1NFVDtcbiAgICB9LFxuXG4gICAgaGFzSW46IGhhc0luLFxuXG4gICAgaXNTdWJzZXQ6IGZ1bmN0aW9uIGlzU3Vic2V0KGl0ZXIpIHtcbiAgICAgIGl0ZXIgPSB0eXBlb2YgaXRlci5pbmNsdWRlcyA9PT0gJ2Z1bmN0aW9uJyA/IGl0ZXIgOiBDb2xsZWN0aW9uKGl0ZXIpO1xuICAgICAgcmV0dXJuIHRoaXMuZXZlcnkoZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiBpdGVyLmluY2x1ZGVzKHZhbHVlKTsgfSk7XG4gICAgfSxcblxuICAgIGlzU3VwZXJzZXQ6IGZ1bmN0aW9uIGlzU3VwZXJzZXQoaXRlcikge1xuICAgICAgaXRlciA9IHR5cGVvZiBpdGVyLmlzU3Vic2V0ID09PSAnZnVuY3Rpb24nID8gaXRlciA6IENvbGxlY3Rpb24oaXRlcik7XG4gICAgICByZXR1cm4gaXRlci5pc1N1YnNldCh0aGlzKTtcbiAgICB9LFxuXG4gICAga2V5T2Y6IGZ1bmN0aW9uIGtleU9mKHNlYXJjaFZhbHVlKSB7XG4gICAgICByZXR1cm4gdGhpcy5maW5kS2V5KGZ1bmN0aW9uICh2YWx1ZSkgeyByZXR1cm4gaXModmFsdWUsIHNlYXJjaFZhbHVlKTsgfSk7XG4gICAgfSxcblxuICAgIGtleVNlcTogZnVuY3Rpb24ga2V5U2VxKCkge1xuICAgICAgcmV0dXJuIHRoaXMudG9TZXEoKS5tYXAoa2V5TWFwcGVyKS50b0luZGV4ZWRTZXEoKTtcbiAgICB9LFxuXG4gICAgbGFzdDogZnVuY3Rpb24gbGFzdChub3RTZXRWYWx1ZSkge1xuICAgICAgcmV0dXJuIHRoaXMudG9TZXEoKS5yZXZlcnNlKCkuZmlyc3Qobm90U2V0VmFsdWUpO1xuICAgIH0sXG5cbiAgICBsYXN0S2V5T2Y6IGZ1bmN0aW9uIGxhc3RLZXlPZihzZWFyY2hWYWx1ZSkge1xuICAgICAgcmV0dXJuIHRoaXMudG9LZXllZFNlcSgpLnJldmVyc2UoKS5rZXlPZihzZWFyY2hWYWx1ZSk7XG4gICAgfSxcblxuICAgIG1heDogZnVuY3Rpb24gbWF4KGNvbXBhcmF0b3IpIHtcbiAgICAgIHJldHVybiBtYXhGYWN0b3J5KHRoaXMsIGNvbXBhcmF0b3IpO1xuICAgIH0sXG5cbiAgICBtYXhCeTogZnVuY3Rpb24gbWF4QnkobWFwcGVyLCBjb21wYXJhdG9yKSB7XG4gICAgICByZXR1cm4gbWF4RmFjdG9yeSh0aGlzLCBjb21wYXJhdG9yLCBtYXBwZXIpO1xuICAgIH0sXG5cbiAgICBtaW46IGZ1bmN0aW9uIG1pbihjb21wYXJhdG9yKSB7XG4gICAgICByZXR1cm4gbWF4RmFjdG9yeShcbiAgICAgICAgdGhpcyxcbiAgICAgICAgY29tcGFyYXRvciA/IG5lZyhjb21wYXJhdG9yKSA6IGRlZmF1bHROZWdDb21wYXJhdG9yXG4gICAgICApO1xuICAgIH0sXG5cbiAgICBtaW5CeTogZnVuY3Rpb24gbWluQnkobWFwcGVyLCBjb21wYXJhdG9yKSB7XG4gICAgICByZXR1cm4gbWF4RmFjdG9yeShcbiAgICAgICAgdGhpcyxcbiAgICAgICAgY29tcGFyYXRvciA/IG5lZyhjb21wYXJhdG9yKSA6IGRlZmF1bHROZWdDb21wYXJhdG9yLFxuICAgICAgICBtYXBwZXJcbiAgICAgICk7XG4gICAgfSxcblxuICAgIHJlc3Q6IGZ1bmN0aW9uIHJlc3QoKSB7XG4gICAgICByZXR1cm4gdGhpcy5zbGljZSgxKTtcbiAgICB9LFxuXG4gICAgc2tpcDogZnVuY3Rpb24gc2tpcChhbW91bnQpIHtcbiAgICAgIHJldHVybiBhbW91bnQgPT09IDAgPyB0aGlzIDogdGhpcy5zbGljZShNYXRoLm1heCgwLCBhbW91bnQpKTtcbiAgICB9LFxuXG4gICAgc2tpcExhc3Q6IGZ1bmN0aW9uIHNraXBMYXN0KGFtb3VudCkge1xuICAgICAgcmV0dXJuIGFtb3VudCA9PT0gMCA/IHRoaXMgOiB0aGlzLnNsaWNlKDAsIC1NYXRoLm1heCgwLCBhbW91bnQpKTtcbiAgICB9LFxuXG4gICAgc2tpcFdoaWxlOiBmdW5jdGlvbiBza2lwV2hpbGUocHJlZGljYXRlLCBjb250ZXh0KSB7XG4gICAgICByZXR1cm4gcmVpZnkodGhpcywgc2tpcFdoaWxlRmFjdG9yeSh0aGlzLCBwcmVkaWNhdGUsIGNvbnRleHQsIHRydWUpKTtcbiAgICB9LFxuXG4gICAgc2tpcFVudGlsOiBmdW5jdGlvbiBza2lwVW50aWwocHJlZGljYXRlLCBjb250ZXh0KSB7XG4gICAgICByZXR1cm4gdGhpcy5za2lwV2hpbGUobm90KHByZWRpY2F0ZSksIGNvbnRleHQpO1xuICAgIH0sXG5cbiAgICBzb3J0Qnk6IGZ1bmN0aW9uIHNvcnRCeShtYXBwZXIsIGNvbXBhcmF0b3IpIHtcbiAgICAgIHJldHVybiByZWlmeSh0aGlzLCBzb3J0RmFjdG9yeSh0aGlzLCBjb21wYXJhdG9yLCBtYXBwZXIpKTtcbiAgICB9LFxuXG4gICAgdGFrZTogZnVuY3Rpb24gdGFrZShhbW91bnQpIHtcbiAgICAgIHJldHVybiB0aGlzLnNsaWNlKDAsIE1hdGgubWF4KDAsIGFtb3VudCkpO1xuICAgIH0sXG5cbiAgICB0YWtlTGFzdDogZnVuY3Rpb24gdGFrZUxhc3QoYW1vdW50KSB7XG4gICAgICByZXR1cm4gdGhpcy5zbGljZSgtTWF0aC5tYXgoMCwgYW1vdW50KSk7XG4gICAgfSxcblxuICAgIHRha2VXaGlsZTogZnVuY3Rpb24gdGFrZVdoaWxlKHByZWRpY2F0ZSwgY29udGV4dCkge1xuICAgICAgcmV0dXJuIHJlaWZ5KHRoaXMsIHRha2VXaGlsZUZhY3RvcnkodGhpcywgcHJlZGljYXRlLCBjb250ZXh0KSk7XG4gICAgfSxcblxuICAgIHRha2VVbnRpbDogZnVuY3Rpb24gdGFrZVVudGlsKHByZWRpY2F0ZSwgY29udGV4dCkge1xuICAgICAgcmV0dXJuIHRoaXMudGFrZVdoaWxlKG5vdChwcmVkaWNhdGUpLCBjb250ZXh0KTtcbiAgICB9LFxuXG4gICAgdXBkYXRlOiBmdW5jdGlvbiB1cGRhdGUoZm4pIHtcbiAgICAgIHJldHVybiBmbih0aGlzKTtcbiAgICB9LFxuXG4gICAgdmFsdWVTZXE6IGZ1bmN0aW9uIHZhbHVlU2VxKCkge1xuICAgICAgcmV0dXJuIHRoaXMudG9JbmRleGVkU2VxKCk7XG4gICAgfSxcblxuICAgIC8vICMjIyBIYXNoYWJsZSBPYmplY3RcblxuICAgIGhhc2hDb2RlOiBmdW5jdGlvbiBoYXNoQ29kZSgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9faGFzaCB8fCAodGhpcy5fX2hhc2ggPSBoYXNoQ29sbGVjdGlvbih0aGlzKSk7XG4gICAgfSxcblxuICAgIC8vICMjIyBJbnRlcm5hbFxuXG4gICAgLy8gYWJzdHJhY3QgX19pdGVyYXRlKGZuLCByZXZlcnNlKVxuXG4gICAgLy8gYWJzdHJhY3QgX19pdGVyYXRvcih0eXBlLCByZXZlcnNlKVxuICB9KTtcblxuICB2YXIgQ29sbGVjdGlvblByb3RvdHlwZSA9IENvbGxlY3Rpb24ucHJvdG90eXBlO1xuICBDb2xsZWN0aW9uUHJvdG90eXBlW0lTX0NPTExFQ1RJT05fU1lNQk9MXSA9IHRydWU7XG4gIENvbGxlY3Rpb25Qcm90b3R5cGVbSVRFUkFUT1JfU1lNQk9MXSA9IENvbGxlY3Rpb25Qcm90b3R5cGUudmFsdWVzO1xuICBDb2xsZWN0aW9uUHJvdG90eXBlLnRvSlNPTiA9IENvbGxlY3Rpb25Qcm90b3R5cGUudG9BcnJheTtcbiAgQ29sbGVjdGlvblByb3RvdHlwZS5fX3RvU3RyaW5nTWFwcGVyID0gcXVvdGVTdHJpbmc7XG4gIENvbGxlY3Rpb25Qcm90b3R5cGUuaW5zcGVjdCA9IENvbGxlY3Rpb25Qcm90b3R5cGUudG9Tb3VyY2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMudG9TdHJpbmcoKTtcbiAgfTtcbiAgQ29sbGVjdGlvblByb3RvdHlwZS5jaGFpbiA9IENvbGxlY3Rpb25Qcm90b3R5cGUuZmxhdE1hcDtcbiAgQ29sbGVjdGlvblByb3RvdHlwZS5jb250YWlucyA9IENvbGxlY3Rpb25Qcm90b3R5cGUuaW5jbHVkZXM7XG5cbiAgbWl4aW4oS2V5ZWRDb2xsZWN0aW9uLCB7XG4gICAgLy8gIyMjIE1vcmUgc2VxdWVudGlhbCBtZXRob2RzXG5cbiAgICBmbGlwOiBmdW5jdGlvbiBmbGlwKCkge1xuICAgICAgcmV0dXJuIHJlaWZ5KHRoaXMsIGZsaXBGYWN0b3J5KHRoaXMpKTtcbiAgICB9LFxuXG4gICAgbWFwRW50cmllczogZnVuY3Rpb24gbWFwRW50cmllcyhtYXBwZXIsIGNvbnRleHQpIHtcbiAgICAgIHZhciB0aGlzJDEkMSA9IHRoaXM7XG5cbiAgICAgIHZhciBpdGVyYXRpb25zID0gMDtcbiAgICAgIHJldHVybiByZWlmeShcbiAgICAgICAgdGhpcyxcbiAgICAgICAgdGhpcy50b1NlcSgpXG4gICAgICAgICAgLm1hcChmdW5jdGlvbiAodiwgaykgeyByZXR1cm4gbWFwcGVyLmNhbGwoY29udGV4dCwgW2ssIHZdLCBpdGVyYXRpb25zKyssIHRoaXMkMSQxKTsgfSlcbiAgICAgICAgICAuZnJvbUVudHJ5U2VxKClcbiAgICAgICk7XG4gICAgfSxcblxuICAgIG1hcEtleXM6IGZ1bmN0aW9uIG1hcEtleXMobWFwcGVyLCBjb250ZXh0KSB7XG4gICAgICB2YXIgdGhpcyQxJDEgPSB0aGlzO1xuXG4gICAgICByZXR1cm4gcmVpZnkoXG4gICAgICAgIHRoaXMsXG4gICAgICAgIHRoaXMudG9TZXEoKVxuICAgICAgICAgIC5mbGlwKClcbiAgICAgICAgICAubWFwKGZ1bmN0aW9uIChrLCB2KSB7IHJldHVybiBtYXBwZXIuY2FsbChjb250ZXh0LCBrLCB2LCB0aGlzJDEkMSk7IH0pXG4gICAgICAgICAgLmZsaXAoKVxuICAgICAgKTtcbiAgICB9LFxuICB9KTtcblxuICB2YXIgS2V5ZWRDb2xsZWN0aW9uUHJvdG90eXBlID0gS2V5ZWRDb2xsZWN0aW9uLnByb3RvdHlwZTtcbiAgS2V5ZWRDb2xsZWN0aW9uUHJvdG90eXBlW0lTX0tFWUVEX1NZTUJPTF0gPSB0cnVlO1xuICBLZXllZENvbGxlY3Rpb25Qcm90b3R5cGVbSVRFUkFUT1JfU1lNQk9MXSA9IENvbGxlY3Rpb25Qcm90b3R5cGUuZW50cmllcztcbiAgS2V5ZWRDb2xsZWN0aW9uUHJvdG90eXBlLnRvSlNPTiA9IHRvT2JqZWN0O1xuICBLZXllZENvbGxlY3Rpb25Qcm90b3R5cGUuX190b1N0cmluZ01hcHBlciA9IGZ1bmN0aW9uICh2LCBrKSB7IHJldHVybiBxdW90ZVN0cmluZyhrKSArICc6ICcgKyBxdW90ZVN0cmluZyh2KTsgfTtcblxuICBtaXhpbihJbmRleGVkQ29sbGVjdGlvbiwge1xuICAgIC8vICMjIyBDb252ZXJzaW9uIHRvIG90aGVyIHR5cGVzXG5cbiAgICB0b0tleWVkU2VxOiBmdW5jdGlvbiB0b0tleWVkU2VxKCkge1xuICAgICAgcmV0dXJuIG5ldyBUb0tleWVkU2VxdWVuY2UodGhpcywgZmFsc2UpO1xuICAgIH0sXG5cbiAgICAvLyAjIyMgRVM2IENvbGxlY3Rpb24gbWV0aG9kcyAoRVM2IEFycmF5IGFuZCBNYXApXG5cbiAgICBmaWx0ZXI6IGZ1bmN0aW9uIGZpbHRlcihwcmVkaWNhdGUsIGNvbnRleHQpIHtcbiAgICAgIHJldHVybiByZWlmeSh0aGlzLCBmaWx0ZXJGYWN0b3J5KHRoaXMsIHByZWRpY2F0ZSwgY29udGV4dCwgZmFsc2UpKTtcbiAgICB9LFxuXG4gICAgZmluZEluZGV4OiBmdW5jdGlvbiBmaW5kSW5kZXgocHJlZGljYXRlLCBjb250ZXh0KSB7XG4gICAgICB2YXIgZW50cnkgPSB0aGlzLmZpbmRFbnRyeShwcmVkaWNhdGUsIGNvbnRleHQpO1xuICAgICAgcmV0dXJuIGVudHJ5ID8gZW50cnlbMF0gOiAtMTtcbiAgICB9LFxuXG4gICAgaW5kZXhPZjogZnVuY3Rpb24gaW5kZXhPZihzZWFyY2hWYWx1ZSkge1xuICAgICAgdmFyIGtleSA9IHRoaXMua2V5T2Yoc2VhcmNoVmFsdWUpO1xuICAgICAgcmV0dXJuIGtleSA9PT0gdW5kZWZpbmVkID8gLTEgOiBrZXk7XG4gICAgfSxcblxuICAgIGxhc3RJbmRleE9mOiBmdW5jdGlvbiBsYXN0SW5kZXhPZihzZWFyY2hWYWx1ZSkge1xuICAgICAgdmFyIGtleSA9IHRoaXMubGFzdEtleU9mKHNlYXJjaFZhbHVlKTtcbiAgICAgIHJldHVybiBrZXkgPT09IHVuZGVmaW5lZCA/IC0xIDoga2V5O1xuICAgIH0sXG5cbiAgICByZXZlcnNlOiBmdW5jdGlvbiByZXZlcnNlKCkge1xuICAgICAgcmV0dXJuIHJlaWZ5KHRoaXMsIHJldmVyc2VGYWN0b3J5KHRoaXMsIGZhbHNlKSk7XG4gICAgfSxcblxuICAgIHNsaWNlOiBmdW5jdGlvbiBzbGljZShiZWdpbiwgZW5kKSB7XG4gICAgICByZXR1cm4gcmVpZnkodGhpcywgc2xpY2VGYWN0b3J5KHRoaXMsIGJlZ2luLCBlbmQsIGZhbHNlKSk7XG4gICAgfSxcblxuICAgIHNwbGljZTogZnVuY3Rpb24gc3BsaWNlKGluZGV4LCByZW1vdmVOdW0gLyosIC4uLnZhbHVlcyovKSB7XG4gICAgICB2YXIgbnVtQXJncyA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgICByZW1vdmVOdW0gPSBNYXRoLm1heChyZW1vdmVOdW0gfHwgMCwgMCk7XG4gICAgICBpZiAobnVtQXJncyA9PT0gMCB8fCAobnVtQXJncyA9PT0gMiAmJiAhcmVtb3ZlTnVtKSkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cbiAgICAgIC8vIElmIGluZGV4IGlzIG5lZ2F0aXZlLCBpdCBzaG91bGQgcmVzb2x2ZSByZWxhdGl2ZSB0byB0aGUgc2l6ZSBvZiB0aGVcbiAgICAgIC8vIGNvbGxlY3Rpb24uIEhvd2V2ZXIgc2l6ZSBtYXkgYmUgZXhwZW5zaXZlIHRvIGNvbXB1dGUgaWYgbm90IGNhY2hlZCwgc29cbiAgICAgIC8vIG9ubHkgY2FsbCBjb3VudCgpIGlmIHRoZSBudW1iZXIgaXMgaW4gZmFjdCBuZWdhdGl2ZS5cbiAgICAgIGluZGV4ID0gcmVzb2x2ZUJlZ2luKGluZGV4LCBpbmRleCA8IDAgPyB0aGlzLmNvdW50KCkgOiB0aGlzLnNpemUpO1xuICAgICAgdmFyIHNwbGljZWQgPSB0aGlzLnNsaWNlKDAsIGluZGV4KTtcbiAgICAgIHJldHVybiByZWlmeShcbiAgICAgICAgdGhpcyxcbiAgICAgICAgbnVtQXJncyA9PT0gMVxuICAgICAgICAgID8gc3BsaWNlZFxuICAgICAgICAgIDogc3BsaWNlZC5jb25jYXQoYXJyQ29weShhcmd1bWVudHMsIDIpLCB0aGlzLnNsaWNlKGluZGV4ICsgcmVtb3ZlTnVtKSlcbiAgICAgICk7XG4gICAgfSxcblxuICAgIC8vICMjIyBNb3JlIGNvbGxlY3Rpb24gbWV0aG9kc1xuXG4gICAgZmluZExhc3RJbmRleDogZnVuY3Rpb24gZmluZExhc3RJbmRleChwcmVkaWNhdGUsIGNvbnRleHQpIHtcbiAgICAgIHZhciBlbnRyeSA9IHRoaXMuZmluZExhc3RFbnRyeShwcmVkaWNhdGUsIGNvbnRleHQpO1xuICAgICAgcmV0dXJuIGVudHJ5ID8gZW50cnlbMF0gOiAtMTtcbiAgICB9LFxuXG4gICAgZmlyc3Q6IGZ1bmN0aW9uIGZpcnN0KG5vdFNldFZhbHVlKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXQoMCwgbm90U2V0VmFsdWUpO1xuICAgIH0sXG5cbiAgICBmbGF0dGVuOiBmdW5jdGlvbiBmbGF0dGVuKGRlcHRoKSB7XG4gICAgICByZXR1cm4gcmVpZnkodGhpcywgZmxhdHRlbkZhY3RvcnkodGhpcywgZGVwdGgsIGZhbHNlKSk7XG4gICAgfSxcblxuICAgIGdldDogZnVuY3Rpb24gZ2V0KGluZGV4LCBub3RTZXRWYWx1ZSkge1xuICAgICAgaW5kZXggPSB3cmFwSW5kZXgodGhpcywgaW5kZXgpO1xuICAgICAgcmV0dXJuIGluZGV4IDwgMCB8fFxuICAgICAgICB0aGlzLnNpemUgPT09IEluZmluaXR5IHx8XG4gICAgICAgICh0aGlzLnNpemUgIT09IHVuZGVmaW5lZCAmJiBpbmRleCA+IHRoaXMuc2l6ZSlcbiAgICAgICAgPyBub3RTZXRWYWx1ZVxuICAgICAgICA6IHRoaXMuZmluZChmdW5jdGlvbiAoXywga2V5KSB7IHJldHVybiBrZXkgPT09IGluZGV4OyB9LCB1bmRlZmluZWQsIG5vdFNldFZhbHVlKTtcbiAgICB9LFxuXG4gICAgaGFzOiBmdW5jdGlvbiBoYXMoaW5kZXgpIHtcbiAgICAgIGluZGV4ID0gd3JhcEluZGV4KHRoaXMsIGluZGV4KTtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIGluZGV4ID49IDAgJiZcbiAgICAgICAgKHRoaXMuc2l6ZSAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgPyB0aGlzLnNpemUgPT09IEluZmluaXR5IHx8IGluZGV4IDwgdGhpcy5zaXplXG4gICAgICAgICAgOiB0aGlzLmluZGV4T2YoaW5kZXgpICE9PSAtMSlcbiAgICAgICk7XG4gICAgfSxcblxuICAgIGludGVycG9zZTogZnVuY3Rpb24gaW50ZXJwb3NlKHNlcGFyYXRvcikge1xuICAgICAgcmV0dXJuIHJlaWZ5KHRoaXMsIGludGVycG9zZUZhY3RvcnkodGhpcywgc2VwYXJhdG9yKSk7XG4gICAgfSxcblxuICAgIGludGVybGVhdmU6IGZ1bmN0aW9uIGludGVybGVhdmUoLyouLi5jb2xsZWN0aW9ucyovKSB7XG4gICAgICB2YXIgY29sbGVjdGlvbnMgPSBbdGhpc10uY29uY2F0KGFyckNvcHkoYXJndW1lbnRzKSk7XG4gICAgICB2YXIgemlwcGVkID0gemlwV2l0aEZhY3RvcnkodGhpcy50b1NlcSgpLCBJbmRleGVkU2VxLm9mLCBjb2xsZWN0aW9ucyk7XG4gICAgICB2YXIgaW50ZXJsZWF2ZWQgPSB6aXBwZWQuZmxhdHRlbih0cnVlKTtcbiAgICAgIGlmICh6aXBwZWQuc2l6ZSkge1xuICAgICAgICBpbnRlcmxlYXZlZC5zaXplID0gemlwcGVkLnNpemUgKiBjb2xsZWN0aW9ucy5sZW5ndGg7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVpZnkodGhpcywgaW50ZXJsZWF2ZWQpO1xuICAgIH0sXG5cbiAgICBrZXlTZXE6IGZ1bmN0aW9uIGtleVNlcSgpIHtcbiAgICAgIHJldHVybiBSYW5nZSgwLCB0aGlzLnNpemUpO1xuICAgIH0sXG5cbiAgICBsYXN0OiBmdW5jdGlvbiBsYXN0KG5vdFNldFZhbHVlKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXQoLTEsIG5vdFNldFZhbHVlKTtcbiAgICB9LFxuXG4gICAgc2tpcFdoaWxlOiBmdW5jdGlvbiBza2lwV2hpbGUocHJlZGljYXRlLCBjb250ZXh0KSB7XG4gICAgICByZXR1cm4gcmVpZnkodGhpcywgc2tpcFdoaWxlRmFjdG9yeSh0aGlzLCBwcmVkaWNhdGUsIGNvbnRleHQsIGZhbHNlKSk7XG4gICAgfSxcblxuICAgIHppcDogZnVuY3Rpb24gemlwKC8qLCAuLi5jb2xsZWN0aW9ucyAqLykge1xuICAgICAgdmFyIGNvbGxlY3Rpb25zID0gW3RoaXNdLmNvbmNhdChhcnJDb3B5KGFyZ3VtZW50cykpO1xuICAgICAgcmV0dXJuIHJlaWZ5KHRoaXMsIHppcFdpdGhGYWN0b3J5KHRoaXMsIGRlZmF1bHRaaXBwZXIsIGNvbGxlY3Rpb25zKSk7XG4gICAgfSxcblxuICAgIHppcEFsbDogZnVuY3Rpb24gemlwQWxsKC8qLCAuLi5jb2xsZWN0aW9ucyAqLykge1xuICAgICAgdmFyIGNvbGxlY3Rpb25zID0gW3RoaXNdLmNvbmNhdChhcnJDb3B5KGFyZ3VtZW50cykpO1xuICAgICAgcmV0dXJuIHJlaWZ5KHRoaXMsIHppcFdpdGhGYWN0b3J5KHRoaXMsIGRlZmF1bHRaaXBwZXIsIGNvbGxlY3Rpb25zLCB0cnVlKSk7XG4gICAgfSxcblxuICAgIHppcFdpdGg6IGZ1bmN0aW9uIHppcFdpdGgoemlwcGVyIC8qLCAuLi5jb2xsZWN0aW9ucyAqLykge1xuICAgICAgdmFyIGNvbGxlY3Rpb25zID0gYXJyQ29weShhcmd1bWVudHMpO1xuICAgICAgY29sbGVjdGlvbnNbMF0gPSB0aGlzO1xuICAgICAgcmV0dXJuIHJlaWZ5KHRoaXMsIHppcFdpdGhGYWN0b3J5KHRoaXMsIHppcHBlciwgY29sbGVjdGlvbnMpKTtcbiAgICB9LFxuICB9KTtcblxuICB2YXIgSW5kZXhlZENvbGxlY3Rpb25Qcm90b3R5cGUgPSBJbmRleGVkQ29sbGVjdGlvbi5wcm90b3R5cGU7XG4gIEluZGV4ZWRDb2xsZWN0aW9uUHJvdG90eXBlW0lTX0lOREVYRURfU1lNQk9MXSA9IHRydWU7XG4gIEluZGV4ZWRDb2xsZWN0aW9uUHJvdG90eXBlW0lTX09SREVSRURfU1lNQk9MXSA9IHRydWU7XG5cbiAgbWl4aW4oU2V0Q29sbGVjdGlvbiwge1xuICAgIC8vICMjIyBFUzYgQ29sbGVjdGlvbiBtZXRob2RzIChFUzYgQXJyYXkgYW5kIE1hcClcblxuICAgIGdldDogZnVuY3Rpb24gZ2V0KHZhbHVlLCBub3RTZXRWYWx1ZSkge1xuICAgICAgcmV0dXJuIHRoaXMuaGFzKHZhbHVlKSA/IHZhbHVlIDogbm90U2V0VmFsdWU7XG4gICAgfSxcblxuICAgIGluY2x1ZGVzOiBmdW5jdGlvbiBpbmNsdWRlcyh2YWx1ZSkge1xuICAgICAgcmV0dXJuIHRoaXMuaGFzKHZhbHVlKTtcbiAgICB9LFxuXG4gICAgLy8gIyMjIE1vcmUgc2VxdWVudGlhbCBtZXRob2RzXG5cbiAgICBrZXlTZXE6IGZ1bmN0aW9uIGtleVNlcSgpIHtcbiAgICAgIHJldHVybiB0aGlzLnZhbHVlU2VxKCk7XG4gICAgfSxcbiAgfSk7XG5cbiAgdmFyIFNldENvbGxlY3Rpb25Qcm90b3R5cGUgPSBTZXRDb2xsZWN0aW9uLnByb3RvdHlwZTtcbiAgU2V0Q29sbGVjdGlvblByb3RvdHlwZS5oYXMgPSBDb2xsZWN0aW9uUHJvdG90eXBlLmluY2x1ZGVzO1xuICBTZXRDb2xsZWN0aW9uUHJvdG90eXBlLmNvbnRhaW5zID0gU2V0Q29sbGVjdGlvblByb3RvdHlwZS5pbmNsdWRlcztcbiAgU2V0Q29sbGVjdGlvblByb3RvdHlwZS5rZXlzID0gU2V0Q29sbGVjdGlvblByb3RvdHlwZS52YWx1ZXM7XG5cbiAgLy8gTWl4aW4gc3ViY2xhc3Nlc1xuXG4gIG1peGluKEtleWVkU2VxLCBLZXllZENvbGxlY3Rpb25Qcm90b3R5cGUpO1xuICBtaXhpbihJbmRleGVkU2VxLCBJbmRleGVkQ29sbGVjdGlvblByb3RvdHlwZSk7XG4gIG1peGluKFNldFNlcSwgU2V0Q29sbGVjdGlvblByb3RvdHlwZSk7XG5cbiAgLy8gI3ByYWdtYSBIZWxwZXIgZnVuY3Rpb25zXG5cbiAgZnVuY3Rpb24gcmVkdWNlKGNvbGxlY3Rpb24sIHJlZHVjZXIsIHJlZHVjdGlvbiwgY29udGV4dCwgdXNlRmlyc3QsIHJldmVyc2UpIHtcbiAgICBhc3NlcnROb3RJbmZpbml0ZShjb2xsZWN0aW9uLnNpemUpO1xuICAgIGNvbGxlY3Rpb24uX19pdGVyYXRlKGZ1bmN0aW9uICh2LCBrLCBjKSB7XG4gICAgICBpZiAodXNlRmlyc3QpIHtcbiAgICAgICAgdXNlRmlyc3QgPSBmYWxzZTtcbiAgICAgICAgcmVkdWN0aW9uID0gdjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlZHVjdGlvbiA9IHJlZHVjZXIuY2FsbChjb250ZXh0LCByZWR1Y3Rpb24sIHYsIGssIGMpO1xuICAgICAgfVxuICAgIH0sIHJldmVyc2UpO1xuICAgIHJldHVybiByZWR1Y3Rpb247XG4gIH1cblxuICBmdW5jdGlvbiBrZXlNYXBwZXIodiwgaykge1xuICAgIHJldHVybiBrO1xuICB9XG5cbiAgZnVuY3Rpb24gZW50cnlNYXBwZXIodiwgaykge1xuICAgIHJldHVybiBbaywgdl07XG4gIH1cblxuICBmdW5jdGlvbiBub3QocHJlZGljYXRlKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiAhcHJlZGljYXRlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG5lZyhwcmVkaWNhdGUpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIC1wcmVkaWNhdGUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9O1xuICB9XG5cbiAgZnVuY3Rpb24gZGVmYXVsdFppcHBlcigpIHtcbiAgICByZXR1cm4gYXJyQ29weShhcmd1bWVudHMpO1xuICB9XG5cbiAgZnVuY3Rpb24gZGVmYXVsdE5lZ0NvbXBhcmF0b3IoYSwgYikge1xuICAgIHJldHVybiBhIDwgYiA/IDEgOiBhID4gYiA/IC0xIDogMDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGhhc2hDb2xsZWN0aW9uKGNvbGxlY3Rpb24pIHtcbiAgICBpZiAoY29sbGVjdGlvbi5zaXplID09PSBJbmZpbml0eSkge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICAgIHZhciBvcmRlcmVkID0gaXNPcmRlcmVkKGNvbGxlY3Rpb24pO1xuICAgIHZhciBrZXllZCA9IGlzS2V5ZWQoY29sbGVjdGlvbik7XG4gICAgdmFyIGggPSBvcmRlcmVkID8gMSA6IDA7XG4gICAgdmFyIHNpemUgPSBjb2xsZWN0aW9uLl9faXRlcmF0ZShcbiAgICAgIGtleWVkXG4gICAgICAgID8gb3JkZXJlZFxuICAgICAgICAgID8gZnVuY3Rpb24gKHYsIGspIHtcbiAgICAgICAgICAgICAgaCA9ICgzMSAqIGggKyBoYXNoTWVyZ2UoaGFzaCh2KSwgaGFzaChrKSkpIHwgMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICA6IGZ1bmN0aW9uICh2LCBrKSB7XG4gICAgICAgICAgICAgIGggPSAoaCArIGhhc2hNZXJnZShoYXNoKHYpLCBoYXNoKGspKSkgfCAwO1xuICAgICAgICAgICAgfVxuICAgICAgICA6IG9yZGVyZWRcbiAgICAgICAgPyBmdW5jdGlvbiAodikge1xuICAgICAgICAgICAgaCA9ICgzMSAqIGggKyBoYXNoKHYpKSB8IDA7XG4gICAgICAgICAgfVxuICAgICAgICA6IGZ1bmN0aW9uICh2KSB7XG4gICAgICAgICAgICBoID0gKGggKyBoYXNoKHYpKSB8IDA7XG4gICAgICAgICAgfVxuICAgICk7XG4gICAgcmV0dXJuIG11cm11ckhhc2hPZlNpemUoc2l6ZSwgaCk7XG4gIH1cblxuICBmdW5jdGlvbiBtdXJtdXJIYXNoT2ZTaXplKHNpemUsIGgpIHtcbiAgICBoID0gaW11bChoLCAweGNjOWUyZDUxKTtcbiAgICBoID0gaW11bCgoaCA8PCAxNSkgfCAoaCA+Pj4gLTE1KSwgMHgxYjg3MzU5Myk7XG4gICAgaCA9IGltdWwoKGggPDwgMTMpIHwgKGggPj4+IC0xMyksIDUpO1xuICAgIGggPSAoKGggKyAweGU2NTQ2YjY0KSB8IDApIF4gc2l6ZTtcbiAgICBoID0gaW11bChoIF4gKGggPj4+IDE2KSwgMHg4NWViY2E2Yik7XG4gICAgaCA9IGltdWwoaCBeIChoID4+PiAxMyksIDB4YzJiMmFlMzUpO1xuICAgIGggPSBzbWkoaCBeIChoID4+PiAxNikpO1xuICAgIHJldHVybiBoO1xuICB9XG5cbiAgZnVuY3Rpb24gaGFzaE1lcmdlKGEsIGIpIHtcbiAgICByZXR1cm4gKGEgXiAoYiArIDB4OWUzNzc5YjkgKyAoYSA8PCA2KSArIChhID4+IDIpKSkgfCAwOyAvLyBpbnRcbiAgfVxuXG4gIHZhciBPcmRlcmVkU2V0ID0gLypAX19QVVJFX18qLyhmdW5jdGlvbiAoU2V0KSB7XG4gICAgZnVuY3Rpb24gT3JkZXJlZFNldCh2YWx1ZSkge1xuICAgICAgcmV0dXJuIHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IG51bGxcbiAgICAgICAgPyBlbXB0eU9yZGVyZWRTZXQoKVxuICAgICAgICA6IGlzT3JkZXJlZFNldCh2YWx1ZSlcbiAgICAgICAgPyB2YWx1ZVxuICAgICAgICA6IGVtcHR5T3JkZXJlZFNldCgpLndpdGhNdXRhdGlvbnMoZnVuY3Rpb24gKHNldCkge1xuICAgICAgICAgICAgdmFyIGl0ZXIgPSBTZXRDb2xsZWN0aW9uKHZhbHVlKTtcbiAgICAgICAgICAgIGFzc2VydE5vdEluZmluaXRlKGl0ZXIuc2l6ZSk7XG4gICAgICAgICAgICBpdGVyLmZvckVhY2goZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHNldC5hZGQodik7IH0pO1xuICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICggU2V0ICkgT3JkZXJlZFNldC5fX3Byb3RvX18gPSBTZXQ7XG4gICAgT3JkZXJlZFNldC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBTZXQgJiYgU2V0LnByb3RvdHlwZSApO1xuICAgIE9yZGVyZWRTZXQucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gT3JkZXJlZFNldDtcblxuICAgIE9yZGVyZWRTZXQub2YgPSBmdW5jdGlvbiBvZiAoLyouLi52YWx1ZXMqLykge1xuICAgICAgcmV0dXJuIHRoaXMoYXJndW1lbnRzKTtcbiAgICB9O1xuXG4gICAgT3JkZXJlZFNldC5mcm9tS2V5cyA9IGZ1bmN0aW9uIGZyb21LZXlzICh2YWx1ZSkge1xuICAgICAgcmV0dXJuIHRoaXMoS2V5ZWRDb2xsZWN0aW9uKHZhbHVlKS5rZXlTZXEoKSk7XG4gICAgfTtcblxuICAgIE9yZGVyZWRTZXQucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcgKCkge1xuICAgICAgcmV0dXJuIHRoaXMuX190b1N0cmluZygnT3JkZXJlZFNldCB7JywgJ30nKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIE9yZGVyZWRTZXQ7XG4gIH0oU2V0KSk7XG5cbiAgT3JkZXJlZFNldC5pc09yZGVyZWRTZXQgPSBpc09yZGVyZWRTZXQ7XG5cbiAgdmFyIE9yZGVyZWRTZXRQcm90b3R5cGUgPSBPcmRlcmVkU2V0LnByb3RvdHlwZTtcbiAgT3JkZXJlZFNldFByb3RvdHlwZVtJU19PUkRFUkVEX1NZTUJPTF0gPSB0cnVlO1xuICBPcmRlcmVkU2V0UHJvdG90eXBlLnppcCA9IEluZGV4ZWRDb2xsZWN0aW9uUHJvdG90eXBlLnppcDtcbiAgT3JkZXJlZFNldFByb3RvdHlwZS56aXBXaXRoID0gSW5kZXhlZENvbGxlY3Rpb25Qcm90b3R5cGUuemlwV2l0aDtcbiAgT3JkZXJlZFNldFByb3RvdHlwZS56aXBBbGwgPSBJbmRleGVkQ29sbGVjdGlvblByb3RvdHlwZS56aXBBbGw7XG5cbiAgT3JkZXJlZFNldFByb3RvdHlwZS5fX2VtcHR5ID0gZW1wdHlPcmRlcmVkU2V0O1xuICBPcmRlcmVkU2V0UHJvdG90eXBlLl9fbWFrZSA9IG1ha2VPcmRlcmVkU2V0O1xuXG4gIGZ1bmN0aW9uIG1ha2VPcmRlcmVkU2V0KG1hcCwgb3duZXJJRCkge1xuICAgIHZhciBzZXQgPSBPYmplY3QuY3JlYXRlKE9yZGVyZWRTZXRQcm90b3R5cGUpO1xuICAgIHNldC5zaXplID0gbWFwID8gbWFwLnNpemUgOiAwO1xuICAgIHNldC5fbWFwID0gbWFwO1xuICAgIHNldC5fX293bmVySUQgPSBvd25lcklEO1xuICAgIHJldHVybiBzZXQ7XG4gIH1cblxuICB2YXIgRU1QVFlfT1JERVJFRF9TRVQ7XG4gIGZ1bmN0aW9uIGVtcHR5T3JkZXJlZFNldCgpIHtcbiAgICByZXR1cm4gKFxuICAgICAgRU1QVFlfT1JERVJFRF9TRVQgfHwgKEVNUFRZX09SREVSRURfU0VUID0gbWFrZU9yZGVyZWRTZXQoZW1wdHlPcmRlcmVkTWFwKCkpKVxuICAgICk7XG4gIH1cblxuICBmdW5jdGlvbiB0aHJvd09uSW52YWxpZERlZmF1bHRWYWx1ZXMoZGVmYXVsdFZhbHVlcykge1xuICAgIGlmIChpc1JlY29yZChkZWZhdWx0VmFsdWVzKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnQ2FuIG5vdCBjYWxsIGBSZWNvcmRgIHdpdGggYW4gaW1tdXRhYmxlIFJlY29yZCBhcyBkZWZhdWx0IHZhbHVlcy4gVXNlIGEgcGxhaW4gamF2YXNjcmlwdCBvYmplY3QgaW5zdGVhZC4nXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChpc0ltbXV0YWJsZShkZWZhdWx0VmFsdWVzKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnQ2FuIG5vdCBjYWxsIGBSZWNvcmRgIHdpdGggYW4gaW1tdXRhYmxlIENvbGxlY3Rpb24gYXMgZGVmYXVsdCB2YWx1ZXMuIFVzZSBhIHBsYWluIGphdmFzY3JpcHQgb2JqZWN0IGluc3RlYWQuJ1xuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoZGVmYXVsdFZhbHVlcyA9PT0gbnVsbCB8fCB0eXBlb2YgZGVmYXVsdFZhbHVlcyAhPT0gJ29iamVjdCcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ0NhbiBub3QgY2FsbCBgUmVjb3JkYCB3aXRoIGEgbm9uLW9iamVjdCBhcyBkZWZhdWx0IHZhbHVlcy4gVXNlIGEgcGxhaW4gamF2YXNjcmlwdCBvYmplY3QgaW5zdGVhZC4nXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHZhciBSZWNvcmQgPSBmdW5jdGlvbiBSZWNvcmQoZGVmYXVsdFZhbHVlcywgbmFtZSkge1xuICAgIHZhciBoYXNJbml0aWFsaXplZDtcblxuICAgIHRocm93T25JbnZhbGlkRGVmYXVsdFZhbHVlcyhkZWZhdWx0VmFsdWVzKTtcblxuICAgIHZhciBSZWNvcmRUeXBlID0gZnVuY3Rpb24gUmVjb3JkKHZhbHVlcykge1xuICAgICAgdmFyIHRoaXMkMSQxID0gdGhpcztcblxuICAgICAgaWYgKHZhbHVlcyBpbnN0YW5jZW9mIFJlY29yZFR5cGUpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlcztcbiAgICAgIH1cbiAgICAgIGlmICghKHRoaXMgaW5zdGFuY2VvZiBSZWNvcmRUeXBlKSkge1xuICAgICAgICByZXR1cm4gbmV3IFJlY29yZFR5cGUodmFsdWVzKTtcbiAgICAgIH1cbiAgICAgIGlmICghaGFzSW5pdGlhbGl6ZWQpIHtcbiAgICAgICAgaGFzSW5pdGlhbGl6ZWQgPSB0cnVlO1xuICAgICAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKGRlZmF1bHRWYWx1ZXMpO1xuICAgICAgICB2YXIgaW5kaWNlcyA9IChSZWNvcmRUeXBlUHJvdG90eXBlLl9pbmRpY2VzID0ge30pO1xuICAgICAgICAvLyBEZXByZWNhdGVkOiBsZWZ0IHRvIGF0dGVtcHQgbm90IHRvIGJyZWFrIGFueSBleHRlcm5hbCBjb2RlIHdoaWNoXG4gICAgICAgIC8vIHJlbGllcyBvbiBhIC5fbmFtZSBwcm9wZXJ0eSBleGlzdGluZyBvbiByZWNvcmQgaW5zdGFuY2VzLlxuICAgICAgICAvLyBVc2UgUmVjb3JkLmdldERlc2NyaXB0aXZlTmFtZSgpIGluc3RlYWRcbiAgICAgICAgUmVjb3JkVHlwZVByb3RvdHlwZS5fbmFtZSA9IG5hbWU7XG4gICAgICAgIFJlY29yZFR5cGVQcm90b3R5cGUuX2tleXMgPSBrZXlzO1xuICAgICAgICBSZWNvcmRUeXBlUHJvdG90eXBlLl9kZWZhdWx0VmFsdWVzID0gZGVmYXVsdFZhbHVlcztcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgdmFyIHByb3BOYW1lID0ga2V5c1tpXTtcbiAgICAgICAgICBpbmRpY2VzW3Byb3BOYW1lXSA9IGk7XG4gICAgICAgICAgaWYgKFJlY29yZFR5cGVQcm90b3R5cGVbcHJvcE5hbWVdKSB7XG4gICAgICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZSBuby1jb25zb2xlICovXG4gICAgICAgICAgICB0eXBlb2YgY29uc29sZSA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgICAgICAgY29uc29sZS53YXJuICYmXG4gICAgICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgICAgICAnQ2Fubm90IGRlZmluZSAnICtcbiAgICAgICAgICAgICAgICAgIHJlY29yZE5hbWUodGhpcykgK1xuICAgICAgICAgICAgICAgICAgJyB3aXRoIHByb3BlcnR5IFwiJyArXG4gICAgICAgICAgICAgICAgICBwcm9wTmFtZSArXG4gICAgICAgICAgICAgICAgICAnXCIgc2luY2UgdGhhdCBwcm9wZXJ0eSBuYW1lIGlzIHBhcnQgb2YgdGhlIFJlY29yZCBBUEkuJ1xuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgLyogZXNsaW50LWVuYWJsZSBuby1jb25zb2xlICovXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNldFByb3AoUmVjb3JkVHlwZVByb3RvdHlwZSwgcHJvcE5hbWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5fX293bmVySUQgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl92YWx1ZXMgPSBMaXN0KCkud2l0aE11dGF0aW9ucyhmdW5jdGlvbiAobCkge1xuICAgICAgICBsLnNldFNpemUodGhpcyQxJDEuX2tleXMubGVuZ3RoKTtcbiAgICAgICAgS2V5ZWRDb2xsZWN0aW9uKHZhbHVlcykuZm9yRWFjaChmdW5jdGlvbiAodiwgaykge1xuICAgICAgICAgIGwuc2V0KHRoaXMkMSQxLl9pbmRpY2VzW2tdLCB2ID09PSB0aGlzJDEkMS5fZGVmYXVsdFZhbHVlc1trXSA/IHVuZGVmaW5lZCA6IHYpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuICAgIHZhciBSZWNvcmRUeXBlUHJvdG90eXBlID0gKFJlY29yZFR5cGUucHJvdG90eXBlID1cbiAgICAgIE9iamVjdC5jcmVhdGUoUmVjb3JkUHJvdG90eXBlKSk7XG4gICAgUmVjb3JkVHlwZVByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFJlY29yZFR5cGU7XG5cbiAgICBpZiAobmFtZSkge1xuICAgICAgUmVjb3JkVHlwZS5kaXNwbGF5TmFtZSA9IG5hbWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIFJlY29yZFR5cGU7XG4gIH07XG5cbiAgUmVjb3JkLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nICgpIHtcbiAgICB2YXIgc3RyID0gcmVjb3JkTmFtZSh0aGlzKSArICcgeyAnO1xuICAgIHZhciBrZXlzID0gdGhpcy5fa2V5cztcbiAgICB2YXIgaztcbiAgICBmb3IgKHZhciBpID0gMCwgbCA9IGtleXMubGVuZ3RoOyBpICE9PSBsOyBpKyspIHtcbiAgICAgIGsgPSBrZXlzW2ldO1xuICAgICAgc3RyICs9IChpID8gJywgJyA6ICcnKSArIGsgKyAnOiAnICsgcXVvdGVTdHJpbmcodGhpcy5nZXQoaykpO1xuICAgIH1cbiAgICByZXR1cm4gc3RyICsgJyB9JztcbiAgfTtcblxuICBSZWNvcmQucHJvdG90eXBlLmVxdWFscyA9IGZ1bmN0aW9uIGVxdWFscyAob3RoZXIpIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcyA9PT0gb3RoZXIgfHxcbiAgICAgIChpc1JlY29yZChvdGhlcikgJiYgcmVjb3JkU2VxKHRoaXMpLmVxdWFscyhyZWNvcmRTZXEob3RoZXIpKSlcbiAgICApO1xuICB9O1xuXG4gIFJlY29yZC5wcm90b3R5cGUuaGFzaENvZGUgPSBmdW5jdGlvbiBoYXNoQ29kZSAoKSB7XG4gICAgcmV0dXJuIHJlY29yZFNlcSh0aGlzKS5oYXNoQ29kZSgpO1xuICB9O1xuXG4gIC8vIEBwcmFnbWEgQWNjZXNzXG5cbiAgUmVjb3JkLnByb3RvdHlwZS5oYXMgPSBmdW5jdGlvbiBoYXMgKGspIHtcbiAgICByZXR1cm4gdGhpcy5faW5kaWNlcy5oYXNPd25Qcm9wZXJ0eShrKTtcbiAgfTtcblxuICBSZWNvcmQucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uIGdldCAoaywgbm90U2V0VmFsdWUpIHtcbiAgICBpZiAoIXRoaXMuaGFzKGspKSB7XG4gICAgICByZXR1cm4gbm90U2V0VmFsdWU7XG4gICAgfVxuICAgIHZhciBpbmRleCA9IHRoaXMuX2luZGljZXNba107XG4gICAgdmFyIHZhbHVlID0gdGhpcy5fdmFsdWVzLmdldChpbmRleCk7XG4gICAgcmV0dXJuIHZhbHVlID09PSB1bmRlZmluZWQgPyB0aGlzLl9kZWZhdWx0VmFsdWVzW2tdIDogdmFsdWU7XG4gIH07XG5cbiAgLy8gQHByYWdtYSBNb2RpZmljYXRpb25cblxuICBSZWNvcmQucHJvdG90eXBlLnNldCA9IGZ1bmN0aW9uIHNldCAoaywgdikge1xuICAgIGlmICh0aGlzLmhhcyhrKSkge1xuICAgICAgdmFyIG5ld1ZhbHVlcyA9IHRoaXMuX3ZhbHVlcy5zZXQoXG4gICAgICAgIHRoaXMuX2luZGljZXNba10sXG4gICAgICAgIHYgPT09IHRoaXMuX2RlZmF1bHRWYWx1ZXNba10gPyB1bmRlZmluZWQgOiB2XG4gICAgICApO1xuICAgICAgaWYgKG5ld1ZhbHVlcyAhPT0gdGhpcy5fdmFsdWVzICYmICF0aGlzLl9fb3duZXJJRCkge1xuICAgICAgICByZXR1cm4gbWFrZVJlY29yZCh0aGlzLCBuZXdWYWx1ZXMpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICBSZWNvcmQucHJvdG90eXBlLnJlbW92ZSA9IGZ1bmN0aW9uIHJlbW92ZSAoaykge1xuICAgIHJldHVybiB0aGlzLnNldChrKTtcbiAgfTtcblxuICBSZWNvcmQucHJvdG90eXBlLmNsZWFyID0gZnVuY3Rpb24gY2xlYXIgKCkge1xuICAgIHZhciBuZXdWYWx1ZXMgPSB0aGlzLl92YWx1ZXMuY2xlYXIoKS5zZXRTaXplKHRoaXMuX2tleXMubGVuZ3RoKTtcblxuICAgIHJldHVybiB0aGlzLl9fb3duZXJJRCA/IHRoaXMgOiBtYWtlUmVjb3JkKHRoaXMsIG5ld1ZhbHVlcyk7XG4gIH07XG5cbiAgUmVjb3JkLnByb3RvdHlwZS53YXNBbHRlcmVkID0gZnVuY3Rpb24gd2FzQWx0ZXJlZCAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3ZhbHVlcy53YXNBbHRlcmVkKCk7XG4gIH07XG5cbiAgUmVjb3JkLnByb3RvdHlwZS50b1NlcSA9IGZ1bmN0aW9uIHRvU2VxICgpIHtcbiAgICByZXR1cm4gcmVjb3JkU2VxKHRoaXMpO1xuICB9O1xuXG4gIFJlY29yZC5wcm90b3R5cGUudG9KUyA9IGZ1bmN0aW9uIHRvSlMkMSAoKSB7XG4gICAgcmV0dXJuIHRvSlModGhpcyk7XG4gIH07XG5cbiAgUmVjb3JkLnByb3RvdHlwZS5lbnRyaWVzID0gZnVuY3Rpb24gZW50cmllcyAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX19pdGVyYXRvcihJVEVSQVRFX0VOVFJJRVMpO1xuICB9O1xuXG4gIFJlY29yZC5wcm90b3R5cGUuX19pdGVyYXRvciA9IGZ1bmN0aW9uIF9faXRlcmF0b3IgKHR5cGUsIHJldmVyc2UpIHtcbiAgICByZXR1cm4gcmVjb3JkU2VxKHRoaXMpLl9faXRlcmF0b3IodHlwZSwgcmV2ZXJzZSk7XG4gIH07XG5cbiAgUmVjb3JkLnByb3RvdHlwZS5fX2l0ZXJhdGUgPSBmdW5jdGlvbiBfX2l0ZXJhdGUgKGZuLCByZXZlcnNlKSB7XG4gICAgcmV0dXJuIHJlY29yZFNlcSh0aGlzKS5fX2l0ZXJhdGUoZm4sIHJldmVyc2UpO1xuICB9O1xuXG4gIFJlY29yZC5wcm90b3R5cGUuX19lbnN1cmVPd25lciA9IGZ1bmN0aW9uIF9fZW5zdXJlT3duZXIgKG93bmVySUQpIHtcbiAgICBpZiAob3duZXJJRCA9PT0gdGhpcy5fX293bmVySUQpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICB2YXIgbmV3VmFsdWVzID0gdGhpcy5fdmFsdWVzLl9fZW5zdXJlT3duZXIob3duZXJJRCk7XG4gICAgaWYgKCFvd25lcklEKSB7XG4gICAgICB0aGlzLl9fb3duZXJJRCA9IG93bmVySUQ7XG4gICAgICB0aGlzLl92YWx1ZXMgPSBuZXdWYWx1ZXM7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIG1ha2VSZWNvcmQodGhpcywgbmV3VmFsdWVzLCBvd25lcklEKTtcbiAgfTtcblxuICBSZWNvcmQuaXNSZWNvcmQgPSBpc1JlY29yZDtcbiAgUmVjb3JkLmdldERlc2NyaXB0aXZlTmFtZSA9IHJlY29yZE5hbWU7XG4gIHZhciBSZWNvcmRQcm90b3R5cGUgPSBSZWNvcmQucHJvdG90eXBlO1xuICBSZWNvcmRQcm90b3R5cGVbSVNfUkVDT1JEX1NZTUJPTF0gPSB0cnVlO1xuICBSZWNvcmRQcm90b3R5cGVbREVMRVRFXSA9IFJlY29yZFByb3RvdHlwZS5yZW1vdmU7XG4gIFJlY29yZFByb3RvdHlwZS5kZWxldGVJbiA9IFJlY29yZFByb3RvdHlwZS5yZW1vdmVJbiA9IGRlbGV0ZUluO1xuICBSZWNvcmRQcm90b3R5cGUuZ2V0SW4gPSBnZXRJbjtcbiAgUmVjb3JkUHJvdG90eXBlLmhhc0luID0gQ29sbGVjdGlvblByb3RvdHlwZS5oYXNJbjtcbiAgUmVjb3JkUHJvdG90eXBlLm1lcmdlID0gbWVyZ2UkMTtcbiAgUmVjb3JkUHJvdG90eXBlLm1lcmdlV2l0aCA9IG1lcmdlV2l0aCQxO1xuICBSZWNvcmRQcm90b3R5cGUubWVyZ2VJbiA9IG1lcmdlSW47XG4gIFJlY29yZFByb3RvdHlwZS5tZXJnZURlZXAgPSBtZXJnZURlZXA7XG4gIFJlY29yZFByb3RvdHlwZS5tZXJnZURlZXBXaXRoID0gbWVyZ2VEZWVwV2l0aDtcbiAgUmVjb3JkUHJvdG90eXBlLm1lcmdlRGVlcEluID0gbWVyZ2VEZWVwSW47XG4gIFJlY29yZFByb3RvdHlwZS5zZXRJbiA9IHNldEluO1xuICBSZWNvcmRQcm90b3R5cGUudXBkYXRlID0gdXBkYXRlO1xuICBSZWNvcmRQcm90b3R5cGUudXBkYXRlSW4gPSB1cGRhdGVJbjtcbiAgUmVjb3JkUHJvdG90eXBlLndpdGhNdXRhdGlvbnMgPSB3aXRoTXV0YXRpb25zO1xuICBSZWNvcmRQcm90b3R5cGUuYXNNdXRhYmxlID0gYXNNdXRhYmxlO1xuICBSZWNvcmRQcm90b3R5cGUuYXNJbW11dGFibGUgPSBhc0ltbXV0YWJsZTtcbiAgUmVjb3JkUHJvdG90eXBlW0lURVJBVE9SX1NZTUJPTF0gPSBSZWNvcmRQcm90b3R5cGUuZW50cmllcztcbiAgUmVjb3JkUHJvdG90eXBlLnRvSlNPTiA9IFJlY29yZFByb3RvdHlwZS50b09iamVjdCA9XG4gICAgQ29sbGVjdGlvblByb3RvdHlwZS50b09iamVjdDtcbiAgUmVjb3JkUHJvdG90eXBlLmluc3BlY3QgPSBSZWNvcmRQcm90b3R5cGUudG9Tb3VyY2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMudG9TdHJpbmcoKTtcbiAgfTtcblxuICBmdW5jdGlvbiBtYWtlUmVjb3JkKGxpa2VSZWNvcmQsIHZhbHVlcywgb3duZXJJRCkge1xuICAgIHZhciByZWNvcmQgPSBPYmplY3QuY3JlYXRlKE9iamVjdC5nZXRQcm90b3R5cGVPZihsaWtlUmVjb3JkKSk7XG4gICAgcmVjb3JkLl92YWx1ZXMgPSB2YWx1ZXM7XG4gICAgcmVjb3JkLl9fb3duZXJJRCA9IG93bmVySUQ7XG4gICAgcmV0dXJuIHJlY29yZDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlY29yZE5hbWUocmVjb3JkKSB7XG4gICAgcmV0dXJuIHJlY29yZC5jb25zdHJ1Y3Rvci5kaXNwbGF5TmFtZSB8fCByZWNvcmQuY29uc3RydWN0b3IubmFtZSB8fCAnUmVjb3JkJztcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlY29yZFNlcShyZWNvcmQpIHtcbiAgICByZXR1cm4ga2V5ZWRTZXFGcm9tVmFsdWUocmVjb3JkLl9rZXlzLm1hcChmdW5jdGlvbiAoaykgeyByZXR1cm4gW2ssIHJlY29yZC5nZXQoayldOyB9KSk7XG4gIH1cblxuICBmdW5jdGlvbiBzZXRQcm9wKHByb3RvdHlwZSwgbmFtZSkge1xuICAgIHRyeSB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocHJvdG90eXBlLCBuYW1lLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLmdldChuYW1lKTtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICBpbnZhcmlhbnQodGhpcy5fX293bmVySUQsICdDYW5ub3Qgc2V0IG9uIGFuIGltbXV0YWJsZSByZWNvcmQuJyk7XG4gICAgICAgICAgdGhpcy5zZXQobmFtZSwgdmFsdWUpO1xuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSBmYWlsZWQuIFByb2JhYmx5IElFOC5cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIGxhenkgU2VxIG9mIGB2YWx1ZWAgcmVwZWF0ZWQgYHRpbWVzYCB0aW1lcy4gV2hlbiBgdGltZXNgIGlzXG4gICAqIHVuZGVmaW5lZCwgcmV0dXJucyBhbiBpbmZpbml0ZSBzZXF1ZW5jZSBvZiBgdmFsdWVgLlxuICAgKi9cbiAgdmFyIFJlcGVhdCA9IC8qQF9fUFVSRV9fKi8oZnVuY3Rpb24gKEluZGV4ZWRTZXEpIHtcbiAgICBmdW5jdGlvbiBSZXBlYXQodmFsdWUsIHRpbWVzKSB7XG4gICAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgUmVwZWF0KSkge1xuICAgICAgICByZXR1cm4gbmV3IFJlcGVhdCh2YWx1ZSwgdGltZXMpO1xuICAgICAgfVxuICAgICAgdGhpcy5fdmFsdWUgPSB2YWx1ZTtcbiAgICAgIHRoaXMuc2l6ZSA9IHRpbWVzID09PSB1bmRlZmluZWQgPyBJbmZpbml0eSA6IE1hdGgubWF4KDAsIHRpbWVzKTtcbiAgICAgIGlmICh0aGlzLnNpemUgPT09IDApIHtcbiAgICAgICAgaWYgKEVNUFRZX1JFUEVBVCkge1xuICAgICAgICAgIHJldHVybiBFTVBUWV9SRVBFQVQ7XG4gICAgICAgIH1cbiAgICAgICAgRU1QVFlfUkVQRUFUID0gdGhpcztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIEluZGV4ZWRTZXEgKSBSZXBlYXQuX19wcm90b19fID0gSW5kZXhlZFNlcTtcbiAgICBSZXBlYXQucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggSW5kZXhlZFNlcSAmJiBJbmRleGVkU2VxLnByb3RvdHlwZSApO1xuICAgIFJlcGVhdC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBSZXBlYXQ7XG5cbiAgICBSZXBlYXQucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcgKCkge1xuICAgICAgaWYgKHRoaXMuc2l6ZSA9PT0gMCkge1xuICAgICAgICByZXR1cm4gJ1JlcGVhdCBbXSc7XG4gICAgICB9XG4gICAgICByZXR1cm4gJ1JlcGVhdCBbICcgKyB0aGlzLl92YWx1ZSArICcgJyArIHRoaXMuc2l6ZSArICcgdGltZXMgXSc7XG4gICAgfTtcblxuICAgIFJlcGVhdC5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gZ2V0IChpbmRleCwgbm90U2V0VmFsdWUpIHtcbiAgICAgIHJldHVybiB0aGlzLmhhcyhpbmRleCkgPyB0aGlzLl92YWx1ZSA6IG5vdFNldFZhbHVlO1xuICAgIH07XG5cbiAgICBSZXBlYXQucHJvdG90eXBlLmluY2x1ZGVzID0gZnVuY3Rpb24gaW5jbHVkZXMgKHNlYXJjaFZhbHVlKSB7XG4gICAgICByZXR1cm4gaXModGhpcy5fdmFsdWUsIHNlYXJjaFZhbHVlKTtcbiAgICB9O1xuXG4gICAgUmVwZWF0LnByb3RvdHlwZS5zbGljZSA9IGZ1bmN0aW9uIHNsaWNlIChiZWdpbiwgZW5kKSB7XG4gICAgICB2YXIgc2l6ZSA9IHRoaXMuc2l6ZTtcbiAgICAgIHJldHVybiB3aG9sZVNsaWNlKGJlZ2luLCBlbmQsIHNpemUpXG4gICAgICAgID8gdGhpc1xuICAgICAgICA6IG5ldyBSZXBlYXQoXG4gICAgICAgICAgICB0aGlzLl92YWx1ZSxcbiAgICAgICAgICAgIHJlc29sdmVFbmQoZW5kLCBzaXplKSAtIHJlc29sdmVCZWdpbihiZWdpbiwgc2l6ZSlcbiAgICAgICAgICApO1xuICAgIH07XG5cbiAgICBSZXBlYXQucHJvdG90eXBlLnJldmVyc2UgPSBmdW5jdGlvbiByZXZlcnNlICgpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG5cbiAgICBSZXBlYXQucHJvdG90eXBlLmluZGV4T2YgPSBmdW5jdGlvbiBpbmRleE9mIChzZWFyY2hWYWx1ZSkge1xuICAgICAgaWYgKGlzKHRoaXMuX3ZhbHVlLCBzZWFyY2hWYWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICB9XG4gICAgICByZXR1cm4gLTE7XG4gICAgfTtcblxuICAgIFJlcGVhdC5wcm90b3R5cGUubGFzdEluZGV4T2YgPSBmdW5jdGlvbiBsYXN0SW5kZXhPZiAoc2VhcmNoVmFsdWUpIHtcbiAgICAgIGlmIChpcyh0aGlzLl92YWx1ZSwgc2VhcmNoVmFsdWUpKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNpemU7XG4gICAgICB9XG4gICAgICByZXR1cm4gLTE7XG4gICAgfTtcblxuICAgIFJlcGVhdC5wcm90b3R5cGUuX19pdGVyYXRlID0gZnVuY3Rpb24gX19pdGVyYXRlIChmbiwgcmV2ZXJzZSkge1xuICAgICAgdmFyIHNpemUgPSB0aGlzLnNpemU7XG4gICAgICB2YXIgaSA9IDA7XG4gICAgICB3aGlsZSAoaSAhPT0gc2l6ZSkge1xuICAgICAgICBpZiAoZm4odGhpcy5fdmFsdWUsIHJldmVyc2UgPyBzaXplIC0gKytpIDogaSsrLCB0aGlzKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGk7XG4gICAgfTtcblxuICAgIFJlcGVhdC5wcm90b3R5cGUuX19pdGVyYXRvciA9IGZ1bmN0aW9uIF9faXRlcmF0b3IgKHR5cGUsIHJldmVyc2UpIHtcbiAgICAgIHZhciB0aGlzJDEkMSA9IHRoaXM7XG5cbiAgICAgIHZhciBzaXplID0gdGhpcy5zaXplO1xuICAgICAgdmFyIGkgPSAwO1xuICAgICAgcmV0dXJuIG5ldyBJdGVyYXRvcihmdW5jdGlvbiAoKSB7IHJldHVybiBpID09PSBzaXplXG4gICAgICAgICAgPyBpdGVyYXRvckRvbmUoKVxuICAgICAgICAgIDogaXRlcmF0b3JWYWx1ZSh0eXBlLCByZXZlcnNlID8gc2l6ZSAtICsraSA6IGkrKywgdGhpcyQxJDEuX3ZhbHVlKTsgfVxuICAgICAgKTtcbiAgICB9O1xuXG4gICAgUmVwZWF0LnByb3RvdHlwZS5lcXVhbHMgPSBmdW5jdGlvbiBlcXVhbHMgKG90aGVyKSB7XG4gICAgICByZXR1cm4gb3RoZXIgaW5zdGFuY2VvZiBSZXBlYXRcbiAgICAgICAgPyBpcyh0aGlzLl92YWx1ZSwgb3RoZXIuX3ZhbHVlKVxuICAgICAgICA6IGRlZXBFcXVhbChvdGhlcik7XG4gICAgfTtcblxuICAgIHJldHVybiBSZXBlYXQ7XG4gIH0oSW5kZXhlZFNlcSkpO1xuXG4gIHZhciBFTVBUWV9SRVBFQVQ7XG5cbiAgZnVuY3Rpb24gZnJvbUpTKHZhbHVlLCBjb252ZXJ0ZXIpIHtcbiAgICByZXR1cm4gZnJvbUpTV2l0aChcbiAgICAgIFtdLFxuICAgICAgY29udmVydGVyIHx8IGRlZmF1bHRDb252ZXJ0ZXIsXG4gICAgICB2YWx1ZSxcbiAgICAgICcnLFxuICAgICAgY29udmVydGVyICYmIGNvbnZlcnRlci5sZW5ndGggPiAyID8gW10gOiB1bmRlZmluZWQsXG4gICAgICB7ICcnOiB2YWx1ZSB9XG4gICAgKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZyb21KU1dpdGgoc3RhY2ssIGNvbnZlcnRlciwgdmFsdWUsIGtleSwga2V5UGF0aCwgcGFyZW50VmFsdWUpIHtcbiAgICBpZiAoXG4gICAgICB0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnICYmXG4gICAgICAhaXNJbW11dGFibGUodmFsdWUpICYmXG4gICAgICAoaXNBcnJheUxpa2UodmFsdWUpIHx8IGhhc0l0ZXJhdG9yKHZhbHVlKSB8fCBpc1BsYWluT2JqZWN0KHZhbHVlKSlcbiAgICApIHtcbiAgICAgIGlmICh+c3RhY2suaW5kZXhPZih2YWx1ZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQ2Fubm90IGNvbnZlcnQgY2lyY3VsYXIgc3RydWN0dXJlIHRvIEltbXV0YWJsZScpO1xuICAgICAgfVxuICAgICAgc3RhY2sucHVzaCh2YWx1ZSk7XG4gICAgICBrZXlQYXRoICYmIGtleSAhPT0gJycgJiYga2V5UGF0aC5wdXNoKGtleSk7XG4gICAgICB2YXIgY29udmVydGVkID0gY29udmVydGVyLmNhbGwoXG4gICAgICAgIHBhcmVudFZhbHVlLFxuICAgICAgICBrZXksXG4gICAgICAgIFNlcSh2YWx1ZSkubWFwKGZ1bmN0aW9uICh2LCBrKSB7IHJldHVybiBmcm9tSlNXaXRoKHN0YWNrLCBjb252ZXJ0ZXIsIHYsIGssIGtleVBhdGgsIHZhbHVlKTsgfVxuICAgICAgICApLFxuICAgICAgICBrZXlQYXRoICYmIGtleVBhdGguc2xpY2UoKVxuICAgICAgKTtcbiAgICAgIHN0YWNrLnBvcCgpO1xuICAgICAga2V5UGF0aCAmJiBrZXlQYXRoLnBvcCgpO1xuICAgICAgcmV0dXJuIGNvbnZlcnRlZDtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgZnVuY3Rpb24gZGVmYXVsdENvbnZlcnRlcihrLCB2KSB7XG4gICAgLy8gRWZmZWN0aXZlbHkgdGhlIG9wcG9zaXRlIG9mIFwiQ29sbGVjdGlvbi50b1NlcSgpXCJcbiAgICByZXR1cm4gaXNJbmRleGVkKHYpID8gdi50b0xpc3QoKSA6IGlzS2V5ZWQodikgPyB2LnRvTWFwKCkgOiB2LnRvU2V0KCk7XG4gIH1cblxuICB2YXIgdmVyc2lvbiA9IFwiNC4xLjBcIjtcblxuICB2YXIgSW1tdXRhYmxlID0ge1xuICAgIHZlcnNpb246IHZlcnNpb24sXG5cbiAgICBDb2xsZWN0aW9uOiBDb2xsZWN0aW9uLFxuICAgIC8vIE5vdGU6IEl0ZXJhYmxlIGlzIGRlcHJlY2F0ZWRcbiAgICBJdGVyYWJsZTogQ29sbGVjdGlvbixcblxuICAgIFNlcTogU2VxLFxuICAgIE1hcDogTWFwLFxuICAgIE9yZGVyZWRNYXA6IE9yZGVyZWRNYXAsXG4gICAgTGlzdDogTGlzdCxcbiAgICBTdGFjazogU3RhY2ssXG4gICAgU2V0OiBTZXQsXG4gICAgT3JkZXJlZFNldDogT3JkZXJlZFNldCxcblxuICAgIFJlY29yZDogUmVjb3JkLFxuICAgIFJhbmdlOiBSYW5nZSxcbiAgICBSZXBlYXQ6IFJlcGVhdCxcblxuICAgIGlzOiBpcyxcbiAgICBmcm9tSlM6IGZyb21KUyxcbiAgICBoYXNoOiBoYXNoLFxuXG4gICAgaXNJbW11dGFibGU6IGlzSW1tdXRhYmxlLFxuICAgIGlzQ29sbGVjdGlvbjogaXNDb2xsZWN0aW9uLFxuICAgIGlzS2V5ZWQ6IGlzS2V5ZWQsXG4gICAgaXNJbmRleGVkOiBpc0luZGV4ZWQsXG4gICAgaXNBc3NvY2lhdGl2ZTogaXNBc3NvY2lhdGl2ZSxcbiAgICBpc09yZGVyZWQ6IGlzT3JkZXJlZCxcbiAgICBpc1ZhbHVlT2JqZWN0OiBpc1ZhbHVlT2JqZWN0LFxuICAgIGlzUGxhaW5PYmplY3Q6IGlzUGxhaW5PYmplY3QsXG4gICAgaXNTZXE6IGlzU2VxLFxuICAgIGlzTGlzdDogaXNMaXN0LFxuICAgIGlzTWFwOiBpc01hcCxcbiAgICBpc09yZGVyZWRNYXA6IGlzT3JkZXJlZE1hcCxcbiAgICBpc1N0YWNrOiBpc1N0YWNrLFxuICAgIGlzU2V0OiBpc1NldCxcbiAgICBpc09yZGVyZWRTZXQ6IGlzT3JkZXJlZFNldCxcbiAgICBpc1JlY29yZDogaXNSZWNvcmQsXG5cbiAgICBnZXQ6IGdldCxcbiAgICBnZXRJbjogZ2V0SW4kMSxcbiAgICBoYXM6IGhhcyxcbiAgICBoYXNJbjogaGFzSW4kMSxcbiAgICBtZXJnZTogbWVyZ2UsXG4gICAgbWVyZ2VEZWVwOiBtZXJnZURlZXAkMSxcbiAgICBtZXJnZVdpdGg6IG1lcmdlV2l0aCxcbiAgICBtZXJnZURlZXBXaXRoOiBtZXJnZURlZXBXaXRoJDEsXG4gICAgcmVtb3ZlOiByZW1vdmUsXG4gICAgcmVtb3ZlSW46IHJlbW92ZUluLFxuICAgIHNldDogc2V0LFxuICAgIHNldEluOiBzZXRJbiQxLFxuICAgIHVwZGF0ZTogdXBkYXRlJDEsXG4gICAgdXBkYXRlSW46IHVwZGF0ZUluJDEsXG4gIH07XG5cbiAgLy8gTm90ZTogSXRlcmFibGUgaXMgZGVwcmVjYXRlZFxuICB2YXIgSXRlcmFibGUgPSBDb2xsZWN0aW9uO1xuXG4gIGV4cG9ydHMuQ29sbGVjdGlvbiA9IENvbGxlY3Rpb247XG4gIGV4cG9ydHMuSXRlcmFibGUgPSBJdGVyYWJsZTtcbiAgZXhwb3J0cy5MaXN0ID0gTGlzdDtcbiAgZXhwb3J0cy5NYXAgPSBNYXA7XG4gIGV4cG9ydHMuT3JkZXJlZE1hcCA9IE9yZGVyZWRNYXA7XG4gIGV4cG9ydHMuT3JkZXJlZFNldCA9IE9yZGVyZWRTZXQ7XG4gIGV4cG9ydHMuUmFuZ2UgPSBSYW5nZTtcbiAgZXhwb3J0cy5SZWNvcmQgPSBSZWNvcmQ7XG4gIGV4cG9ydHMuUmVwZWF0ID0gUmVwZWF0O1xuICBleHBvcnRzLlNlcSA9IFNlcTtcbiAgZXhwb3J0cy5TZXQgPSBTZXQ7XG4gIGV4cG9ydHMuU3RhY2sgPSBTdGFjaztcbiAgZXhwb3J0cy5kZWZhdWx0ID0gSW1tdXRhYmxlO1xuICBleHBvcnRzLmZyb21KUyA9IGZyb21KUztcbiAgZXhwb3J0cy5nZXQgPSBnZXQ7XG4gIGV4cG9ydHMuZ2V0SW4gPSBnZXRJbiQxO1xuICBleHBvcnRzLmhhcyA9IGhhcztcbiAgZXhwb3J0cy5oYXNJbiA9IGhhc0luJDE7XG4gIGV4cG9ydHMuaGFzaCA9IGhhc2g7XG4gIGV4cG9ydHMuaXMgPSBpcztcbiAgZXhwb3J0cy5pc0Fzc29jaWF0aXZlID0gaXNBc3NvY2lhdGl2ZTtcbiAgZXhwb3J0cy5pc0NvbGxlY3Rpb24gPSBpc0NvbGxlY3Rpb247XG4gIGV4cG9ydHMuaXNJbW11dGFibGUgPSBpc0ltbXV0YWJsZTtcbiAgZXhwb3J0cy5pc0luZGV4ZWQgPSBpc0luZGV4ZWQ7XG4gIGV4cG9ydHMuaXNLZXllZCA9IGlzS2V5ZWQ7XG4gIGV4cG9ydHMuaXNMaXN0ID0gaXNMaXN0O1xuICBleHBvcnRzLmlzTWFwID0gaXNNYXA7XG4gIGV4cG9ydHMuaXNPcmRlcmVkID0gaXNPcmRlcmVkO1xuICBleHBvcnRzLmlzT3JkZXJlZE1hcCA9IGlzT3JkZXJlZE1hcDtcbiAgZXhwb3J0cy5pc09yZGVyZWRTZXQgPSBpc09yZGVyZWRTZXQ7XG4gIGV4cG9ydHMuaXNQbGFpbk9iamVjdCA9IGlzUGxhaW5PYmplY3Q7XG4gIGV4cG9ydHMuaXNSZWNvcmQgPSBpc1JlY29yZDtcbiAgZXhwb3J0cy5pc1NlcSA9IGlzU2VxO1xuICBleHBvcnRzLmlzU2V0ID0gaXNTZXQ7XG4gIGV4cG9ydHMuaXNTdGFjayA9IGlzU3RhY2s7XG4gIGV4cG9ydHMuaXNWYWx1ZU9iamVjdCA9IGlzVmFsdWVPYmplY3Q7XG4gIGV4cG9ydHMubWVyZ2UgPSBtZXJnZTtcbiAgZXhwb3J0cy5tZXJnZURlZXAgPSBtZXJnZURlZXAkMTtcbiAgZXhwb3J0cy5tZXJnZURlZXBXaXRoID0gbWVyZ2VEZWVwV2l0aCQxO1xuICBleHBvcnRzLm1lcmdlV2l0aCA9IG1lcmdlV2l0aDtcbiAgZXhwb3J0cy5yZW1vdmUgPSByZW1vdmU7XG4gIGV4cG9ydHMucmVtb3ZlSW4gPSByZW1vdmVJbjtcbiAgZXhwb3J0cy5zZXQgPSBzZXQ7XG4gIGV4cG9ydHMuc2V0SW4gPSBzZXRJbiQxO1xuICBleHBvcnRzLnVwZGF0ZSA9IHVwZGF0ZSQxO1xuICBleHBvcnRzLnVwZGF0ZUluID0gdXBkYXRlSW4kMTtcbiAgZXhwb3J0cy52ZXJzaW9uID0gdmVyc2lvbjtcblxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuXG59KSkpO1xuIiwiaWYgKHR5cGVvZiBPYmplY3QuY3JlYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gIC8vIGltcGxlbWVudGF0aW9uIGZyb20gc3RhbmRhcmQgbm9kZS5qcyAndXRpbCcgbW9kdWxlXG4gIG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaW5oZXJpdHMoY3Rvciwgc3VwZXJDdG9yKSB7XG4gICAgaWYgKHN1cGVyQ3Rvcikge1xuICAgICAgY3Rvci5zdXBlcl8gPSBzdXBlckN0b3JcbiAgICAgIGN0b3IucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckN0b3IucHJvdG90eXBlLCB7XG4gICAgICAgIGNvbnN0cnVjdG9yOiB7XG4gICAgICAgICAgdmFsdWU6IGN0b3IsXG4gICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuICB9O1xufSBlbHNlIHtcbiAgLy8gb2xkIHNjaG9vbCBzaGltIGZvciBvbGQgYnJvd3NlcnNcbiAgbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpbmhlcml0cyhjdG9yLCBzdXBlckN0b3IpIHtcbiAgICBpZiAoc3VwZXJDdG9yKSB7XG4gICAgICBjdG9yLnN1cGVyXyA9IHN1cGVyQ3RvclxuICAgICAgdmFyIFRlbXBDdG9yID0gZnVuY3Rpb24gKCkge31cbiAgICAgIFRlbXBDdG9yLnByb3RvdHlwZSA9IHN1cGVyQ3Rvci5wcm90b3R5cGVcbiAgICAgIGN0b3IucHJvdG90eXBlID0gbmV3IFRlbXBDdG9yKClcbiAgICAgIGN0b3IucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gY3RvclxuICAgIH1cbiAgfVxufVxuIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9pbXBscy8kYXBwZW5kL2FwcGVuZC5qcycpLl9fYXBwZW5kOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vaW1wbHMvYXBwbHkvYXBwbHkuanMnKS5fX2FwcGx5OyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vaW1wbHMvYXJyYXktcmV2ZXJzZS9hcnJheS1yZXZlcnNlLmpzJykuX19hcnJheVJldmVyc2U7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9pbXBscy8kYXBwZW5kL2FzeW5jLWFwcGVuZC5qcycpLl9fYXN5bmNBcHBlbmQ7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9pbXBscy8kYmF0Y2gvYXN5bmMtYmF0Y2guanMnKS5fX2FzeW5jQmF0Y2g7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9pbXBscy8kYmlzZWN0L2FzeW5jLWJpc2VjdC5qcycpLl9fYXN5bmNCaXNlY3Q7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9pbXBscy9hc3luYy1idWZmZXIvYXN5bmMtYnVmZmVyLmpzJykuX19hc3luY0J1ZmZlcjsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL2ltcGxzLyRjb2xsYXRlL2FzeW5jLWNvbGxhdGUuanMnKS5fX2FzeW5jQ29sbGF0ZTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL2ltcGxzLyRjb21wcmVzcy9hc3luYy1jb21wcmVzcy5qcycpLl9fYXN5bmNDb21wcmVzczsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL2ltcGxzLyRjb25jYXQvYXN5bmMtY29uY2F0LmpzJykuX19hc3luY0NvbmNhdDsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL2ltcGxzLyRjb25zdW1lL2FzeW5jLWNvbnN1bWUuanMnKS5fX2FzeW5jQ29uc3VtZTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL2ltcGxzLyRjeWNsZS10aW1lcy9hc3luYy1jeWNsZS10aW1lcy5qcycpLl9fYXN5bmNDeWNsZVRpbWVzOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vaW1wbHMvJGN5Y2xlL2FzeW5jLWN5Y2xlLmpzJykuX19hc3luY0N5Y2xlOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vaW1wbHMvJGRlZXAtZXF1YWwvYXN5bmMtZGVlcC1lcXVhbC5qcycpLl9fYXN5bmNEZWVwRXF1YWw7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9pbXBscy8kZGlzdGluY3QvYXN5bmMtZGlzdGluY3QuanMnKS5fX2FzeW5jRGlzdGluY3Q7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9pbXBscy8kZHJvcC13aGlsZS9hc3luYy1kcm9wLXdoaWxlLmpzJykuX19hc3luY0Ryb3BXaGlsZTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL2ltcGxzLyRkcm9wL2FzeW5jLWRyb3AuanMnKS5fX2FzeW5jRHJvcDsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL2ltcGxzLyRlbnVtZXJhdGUvYXN5bmMtZW51bWVyYXRlLmpzJykuX19hc3luY0VudW1lcmF0ZTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL2ltcGxzLyRlcXVhbC9hc3luYy1lcXVhbC5qcycpLl9fYXN5bmNFcXVhbDsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL2ltcGxzLyRldmVyeS9hc3luYy1ldmVyeS5qcycpLl9fYXN5bmNFdmVyeTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL2ltcGxzLyRmaWx0ZXIvYXN5bmMtZmlsdGVyLmpzJykuX19hc3luY0ZpbHRlcjsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL2ltcGxzLyRmaW5kLWJlc3Qtb3IvYXN5bmMtZmluZC1iZXN0LW9yLmpzJykuX19hc3luY0ZpbmRCZXN0T3I7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9pbXBscy8kZmluZC1iZXN0L2FzeW5jLWZpbmQtYmVzdC5qcycpLl9fYXN5bmNGaW5kQmVzdDsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL2ltcGxzLyRmaW5kLW9yL2FzeW5jLWZpbmQtb3IuanMnKS5fX2FzeW5jRmluZE9yOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vaW1wbHMvJGZpbmQvYXN5bmMtZmluZC5qcycpLl9fYXN5bmNGaW5kOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vaW1wbHMvJGZpcnN0LW9yL2FzeW5jLWZpcnN0LW9yLmpzJykuX19hc3luY0ZpcnN0T3I7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9pbXBscy8kZmlyc3QvYXN5bmMtZmlyc3QuanMnKS5fX2FzeW5jRmlyc3Q7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9pbXBscy8kZmxhdC1tYXAvYXN5bmMtZmxhdC1tYXAuanMnKS5fX2FzeW5jRmxhdE1hcDsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL2ltcGxzLyRmbGF0L2FzeW5jLWZsYXQuanMnKS5fX2FzeW5jRmxhdDsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL2ltcGxzLyRmb3ItZWFjaC9hc3luYy1mb3ItZWFjaC5qcycpLl9fYXN5bmNGb3JFYWNoOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vaW1wbHMvJGZvcmsvYXN5bmMtZm9yay5qcycpLl9fYXN5bmNGb3JrOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vaW1wbHMvJGZvcmtlcmF0ZS9hc3luYy1mb3JrZXJhdGUuanMnKS5fX2FzeW5jRm9ya2VyYXRlOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vaW1wbHMvJGluY2x1ZGVzLWFueS1zZXEvYXN5bmMtaW5jbHVkZXMtYW55LXNlcS5qcycpLl9fYXN5bmNJbmNsdWRlc0FueVNlcTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL2ltcGxzLyRpbmNsdWRlcy1hbnkvYXN5bmMtaW5jbHVkZXMtYW55LmpzJykuX19hc3luY0luY2x1ZGVzQW55OyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vaW1wbHMvJGluY2x1ZGVzLXNlcS9hc3luYy1pbmNsdWRlcy1zZXEuanMnKS5fX2FzeW5jSW5jbHVkZXNTZXE7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9pbXBscy8kaW5jbHVkZXMvYXN5bmMtaW5jbHVkZXMuanMnKS5fX2FzeW5jSW5jbHVkZXM7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9pbXBscy9hc3luYy1pbnRlcmxlYXZlLXJlYWR5L2FzeW5jLWludGVybGVhdmUtcmVhZHkuanMnKS5fX2FzeW5jSW50ZXJsZWF2ZVJlYWR5OyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vaW1wbHMvJGludGVybGVhdmUvYXN5bmMtaW50ZXJsZWF2ZS5qcycpLl9fYXN5bmNJbnRlcmxlYXZlOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vaW1wbHMvJGludGVycG9zZS1zZXEvYXN5bmMtaW50ZXJwb3NlLXNlcS5qcycpLl9fYXN5bmNJbnRlcnBvc2VTZXE7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9pbXBscy8kaW50ZXJwb3NlL2FzeW5jLWludGVycG9zZS5qcycpLl9fYXN5bmNJbnRlcnBvc2U7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9pbXBscy8kaXMtZW1wdHkvYXN5bmMtaXMtZW1wdHkuanMnKS5fX2FzeW5jSXNFbXB0eTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL2ltcGxzLyRpcy1zb3J0ZWQvYXN5bmMtaXMtc29ydGVkLmpzJykuX19hc3luY0lzU29ydGVkOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vaW1wbHMvJGpvaW4td2l0aC1zZXEvYXN5bmMtam9pbi13aXRoLXNlcS5qcycpLl9fYXN5bmNKb2luV2l0aFNlcTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL2ltcGxzLyRqb2luLXdpdGgvYXN5bmMtam9pbi13aXRoLmpzJykuX19hc3luY0pvaW5XaXRoOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vaW1wbHMvJGpvaW4vYXN5bmMtam9pbi5qcycpLl9fYXN5bmNKb2luOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vaW1wbHMvJG1hcC9hc3luYy1tYXAuanMnKS5fX2FzeW5jTWFwOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vaW1wbHMvJHBlZWtlcmF0ZS9hc3luYy1wZWVrZXJhdGUuanMnKS5fX2FzeW5jUGVla2VyYXRlOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vaW1wbHMvJHByZXBlbmQvYXN5bmMtcHJlcGVuZC5qcycpLl9fYXN5bmNQcmVwZW5kOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vaW1wbHMvJHJlZHVjZS9hc3luYy1yZWR1Y2UuanMnKS5fX2FzeW5jUmVkdWNlOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vaW1wbHMvJHJldmVyc2UvYXN5bmMtcmV2ZXJzZS5qcycpLl9fYXN5bmNSZXZlcnNlOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vaW1wbHMvJHJvdW5kLXJvYmluL2FzeW5jLXJvdW5kLXJvYmluLmpzJykuX19hc3luY1JvdW5kUm9iaW47IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9pbXBscy8kc2l6ZS9hc3luYy1zaXplLmpzJykuX19hc3luY1NpemU7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9pbXBscy8kc2xpY2UvYXN5bmMtc2xpY2UuanMnKS5fX2FzeW5jU2xpY2VGcm9tU3RhcnQ7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9pbXBscy8kc29tZS9hc3luYy1zb21lLmpzJykuX19hc3luY1NvbWU7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9pbXBscy8kc3BsaXQtZ3JvdXBzL2FzeW5jLXNwbGl0LWdyb3Vwcy5qcycpLl9fYXN5bmNTcGxpdEdyb3VwczsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL2ltcGxzLyRzcGxpdC1vbi1hbnktc2VxL2FzeW5jLXNwbGl0LW9uLWFueS1zZXEuanMnKS5fX2FzeW5jU3BsaXRPbkFueVNlcTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL2ltcGxzLyRzcGxpdC1vbi1hbnkvYXN5bmMtc3BsaXQtb24tYW55LmpzJykuX19hc3luY1NwbGl0T25Bbnk7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9pbXBscy8kc3BsaXQtb24tc2VxL2FzeW5jLXNwbGl0LW9uLXNlcS5qcycpLl9fYXN5bmNTcGxpdE9uU2VxOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vaW1wbHMvJHNwbGl0LW9uL2FzeW5jLXNwbGl0LW9uLmpzJykuX19hc3luY1NwbGl0T247IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9pbXBscy8kc3BsaXQtd2hlbi9hc3luYy1zcGxpdC13aGVuLmpzJykuX19hc3luY1NwbGl0V2hlbjsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL2ltcGxzLyRzcGxpdC9hc3luYy1zcGxpdC5qcycpLl9fYXN5bmNTcGxpdDsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL2ltcGxzLyRzcGxpdGVyYXRlLWdyb3VwZWQvYXN5bmMtc3BsaXRlcmF0ZS1ncm91cGVkLmpzJykuX19hc3luY1NwbGl0ZXJhdGVHcm91cGVkOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vaW1wbHMvJHNwbGl0ZXJhdGUvYXN5bmMtc3BsaXRlcmF0ZS5qcycpLl9fYXN5bmNTcGxpdGVyYXRlOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vaW1wbHMvJHN0YXJ0cy13aXRoLWFueS1zZXEvYXN5bmMtc3RhcnRzLXdpdGgtYW55LXNlcS5qcycpLl9fYXN5bmNTdGFydHNXaXRoQW55U2VxOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vaW1wbHMvJHN0YXJ0cy13aXRoLWFueS9hc3luYy1zdGFydHMtd2l0aC1hbnkuanMnKS5fX2FzeW5jU3RhcnRzV2l0aEFueTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL2ltcGxzLyRzdGFydHMtd2l0aC1zZXEvYXN5bmMtc3RhcnRzLXdpdGgtc2VxLmpzJykuX19hc3luY1N0YXJ0c1dpdGhTZXE7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9pbXBscy8kc3RhcnRzLXdpdGgvYXN5bmMtc3RhcnRzLXdpdGguanMnKS5fX2FzeW5jU3RhcnRzV2l0aDsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL2ltcGxzLyRzdHIvYXN5bmMtc3RyLmpzJykuX19hc3luY1N0cjsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL2ltcGxzLyR0YWtlLWxhc3Qtb3IvYXN5bmMtdGFrZS1sYXN0LW9yLmpzJykuX19hc3luY1Rha2VMYXN0T3I7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9pbXBscy8kdGFrZS1sYXN0L2FzeW5jLXRha2UtbGFzdC5qcycpLl9fYXN5bmNUYWtlTGFzdDsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL2ltcGxzLyR0YWtlLXNvcnRlZC9hc3luYy10YWtlLXNvcnRlZC5qcycpLl9fYXN5bmNUYWtlU29ydGVkOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vaW1wbHMvJHRha2Utd2hpbGUvYXN5bmMtdGFrZS13aGlsZS5qcycpLl9fYXN5bmNUYWtlV2hpbGU7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9pbXBscy8kdGFrZS9hc3luYy10YWtlLmpzJykuX19hc3luY1Rha2U7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9pbXBscy8kdGFwL2FzeW5jLXRhcC5qcycpLl9fYXN5bmNUYXA7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9pbXBscy9hc3luYy10aHJvdHRsZS9hc3luYy10aHJvdHRsZS5qcycpLl9fYXN5bmNUaHJvdHRsZTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL2ltcGxzLyR0by1hcnJheS9hc3luYy10by1hcnJheS5qcycpLl9fYXN5bmNUb0FycmF5OyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vaW1wbHMvJHRvLW9iamVjdC9hc3luYy10by1vYmplY3QuanMnKS5fX2FzeW5jVG9PYmplY3Q7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9pbXBscy8kd2luZG93LWFoZWFkL2FzeW5jLXdpbmRvdy1haGVhZC5qcycpLl9fYXN5bmNXaW5kb3dBaGVhZDsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL2ltcGxzLyR3aW5kb3ctYmVoaW5kL2FzeW5jLXdpbmRvdy1iZWhpbmQuanMnKS5fX2FzeW5jV2luZG93QmVoaW5kOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vaW1wbHMvJHdpbmRvdy9hc3luYy13aW5kb3cuanMnKS5fX2FzeW5jV2luZG93OyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vaW1wbHMvJHppcC1hbGwvYXN5bmMtemlwLWFsbC5qcycpLl9fYXN5bmNaaXBBbGw7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9pbXBscy8kemlwL2FzeW5jLXppcC5qcycpLl9fYXN5bmNaaXA7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9pbXBscy8kYmF0Y2gvYmF0Y2guanMnKS5fX2JhdGNoOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vaW1wbHMvJGJpc2VjdC9iaXNlY3QuanMnKS5fX2Jpc2VjdDsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL2ltcGxzL2NhbGwvY2FsbC5qcycpLl9fY2FsbDsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL2ltcGxzLyRjb2xsYXRlL2NvbGxhdGUuanMnKS5fX2NvbGxhdGU7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9pbXBscy8kY29tcHJlc3MvY29tcHJlc3MuanMnKS5fX2NvbXByZXNzOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vaW1wbHMvJGNvbmNhdC9jb25jYXQuanMnKS5fX2NvbmNhdDsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL2ltcGxzLyRjb25zdW1lL2NvbnN1bWUuanMnKS5fX2NvbnN1bWU7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9pbXBscy8kY3ljbGUtdGltZXMvY3ljbGUtdGltZXMuanMnKS5fX2N5Y2xlVGltZXM7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9pbXBscy8kY3ljbGUvY3ljbGUuanMnKS5fX2N5Y2xlOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vaW1wbHMvJGRlZXAtZXF1YWwvZGVlcC1lcXVhbC5qcycpLl9fZGVlcEVxdWFsOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vaW1wbHMvJGRpc3RpbmN0L2Rpc3RpbmN0LmpzJykuX19kaXN0aW5jdDsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL2ltcGxzLyRkcm9wLXdoaWxlL2Ryb3Atd2hpbGUuanMnKS5fX2Ryb3BXaGlsZTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL2ltcGxzLyRkcm9wL2Ryb3AuanMnKS5fX2Ryb3A7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9pbXBscy8kZW51bWVyYXRlL2VudW1lcmF0ZS5qcycpLl9fZW51bWVyYXRlOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vaW1wbHMvJGVxdWFsL2VxdWFsLmpzJykuX19lcXVhbDsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL2ltcGxzLyRldmVyeS9ldmVyeS5qcycpLl9fZXZlcnk7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9pbXBscy8kZmlsdGVyL2ZpbHRlci5qcycpLl9fZmlsdGVyOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vaW1wbHMvJGZpbmQtYmVzdC1vci9maW5kLWJlc3Qtb3IuanMnKS5fX2ZpbmRCZXN0T3I7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9pbXBscy8kZmluZC1iZXN0L2ZpbmQtYmVzdC5qcycpLl9fZmluZEJlc3Q7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9pbXBscy8kZmluZC1vci9maW5kLW9yLmpzJykuX19maW5kT3I7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9pbXBscy8kZmluZC9maW5kLmpzJykuX19maW5kOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vaW1wbHMvJGZpcnN0LW9yL2ZpcnN0LW9yLmpzJykuX19maXJzdE9yOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vaW1wbHMvJGZpcnN0L2ZpcnN0LmpzJykuX19maXJzdDsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL2ltcGxzLyRmbGF0LW1hcC9mbGF0LW1hcC5qcycpLl9fZmxhdE1hcDsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL2ltcGxzLyRmbGF0L2ZsYXQuanMnKS5fX2ZsYXQ7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9pbXBscy8kZm9yLWVhY2gvZm9yLWVhY2guanMnKS5fX2ZvckVhY2g7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9pbXBscy8kZm9yay9mb3JrLmpzJykuX19mb3JrOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vaW1wbHMvJGZvcmtlcmF0ZS9mb3JrZXJhdGUuanMnKS5fX2ZvcmtlcmF0ZTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL2ltcGxzLyRpbmNsdWRlcy1hbnktc2VxL2luY2x1ZGVzLWFueS1zZXEuanMnKS5fX2luY2x1ZGVzQW55U2VxOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vaW1wbHMvJGluY2x1ZGVzLWFueS9pbmNsdWRlcy1hbnkuanMnKS5fX2luY2x1ZGVzQW55OyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vaW1wbHMvJGluY2x1ZGVzLXNlcS9pbmNsdWRlcy1zZXEuanMnKS5fX2luY2x1ZGVzU2VxOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vaW1wbHMvJGluY2x1ZGVzL2luY2x1ZGVzLmpzJykuX19pbmNsdWRlczsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL2ltcGxzLyRpbnRlcmxlYXZlL2ludGVybGVhdmUuanMnKS5fX2ludGVybGVhdmU7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9pbXBscy8kaW50ZXJwb3NlLXNlcS9pbnRlcnBvc2Utc2VxLmpzJykuX19pbnRlcnBvc2VTZXE7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9pbXBscy8kaW50ZXJwb3NlL2ludGVycG9zZS5qcycpLl9faW50ZXJwb3NlOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vaW1wbHMvJGlzLWVtcHR5L2lzLWVtcHR5LmpzJykuX19pc0VtcHR5OyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vaW1wbHMvJGlzLXNvcnRlZC9pcy1zb3J0ZWQuanMnKS5fX2lzU29ydGVkOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vaW1wbHMvJGpvaW4td2l0aC1zZXEvam9pbi13aXRoLXNlcS5qcycpLl9fam9pbldpdGhTZXE7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9pbXBscy8kam9pbi13aXRoL2pvaW4td2l0aC5qcycpLl9fam9pbldpdGg7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9pbXBscy8kam9pbi9qb2luLmpzJykuX19qb2luOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vaW1wbHMvJG1hcC9tYXAuanMnKS5fX21hcDsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL2ltcGxzL29iamVjdC1lbnRyaWVzL29iamVjdC1lbnRyaWVzLmpzJykuX19vYmplY3RFbnRyaWVzOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vaW1wbHMvb2JqZWN0LWtleXMvb2JqZWN0LWtleXMuanMnKS5fX29iamVjdEtleXM7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9pbXBscy9vYmplY3QtdmFsdWVzL29iamVjdC12YWx1ZXMuanMnKS5fX29iamVjdFZhbHVlczsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL2ltcGxzLyRwZWVrZXJhdGUvcGVla2VyYXRlLmpzJykuX19wZWVrZXJhdGU7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9pbXBscy8kcHJlcGVuZC9wcmVwZW5kLmpzJykuX19wcmVwZW5kOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vaW1wbHMvcmFuZ2UvcmFuZ2UuanMnKS5fX3JhbmdlOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vaW1wbHMvJHJlZHVjZS9yZWR1Y2UuanMnKS5fX3JlZHVjZTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL2ltcGxzL3JlcGVhdC10aW1lcy9yZXBlYXQtdGltZXMuanMnKS5fX3JlcGVhdFRpbWVzOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vaW1wbHMvcmVwZWF0L3JlcGVhdC5qcycpLl9fcmVwZWF0OyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vaW1wbHMvJHJldmVyc2UvcmV2ZXJzZS5qcycpLl9fcmV2ZXJzZTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL2ltcGxzLyRyb3VuZC1yb2Jpbi9yb3VuZC1yb2Jpbi5qcycpLl9fcm91bmRSb2JpbjsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL2ltcGxzLyRzaXplL3NpemUuanMnKS5fX3NpemU7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9pbXBscy8kc2xpY2Uvc2xpY2UuanMnKS5fX3NsaWNlRnJvbVN0YXJ0OyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vaW1wbHMvJHNvbWUvc29tZS5qcycpLl9fc29tZTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL2ltcGxzLyRzcGxpdC1ncm91cHMvc3BsaXQtZ3JvdXBzLmpzJykuX19zcGxpdEdyb3VwczsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL2ltcGxzLyRzcGxpdC1vbi1hbnktc2VxL3NwbGl0LW9uLWFueS1zZXEuanMnKS5fX3NwbGl0T25BbnlTZXE7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9pbXBscy8kc3BsaXQtb24tYW55L3NwbGl0LW9uLWFueS5qcycpLl9fc3BsaXRPbkFueTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL2ltcGxzLyRzcGxpdC1vbi1zZXEvc3BsaXQtb24tc2VxLmpzJykuX19zcGxpdE9uU2VxOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vaW1wbHMvJHNwbGl0LW9uL3NwbGl0LW9uLmpzJykuX19zcGxpdE9uOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vaW1wbHMvJHNwbGl0LXdoZW4vc3BsaXQtd2hlbi5qcycpLl9fc3BsaXRXaGVuOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vaW1wbHMvJHNwbGl0L3NwbGl0LmpzJykuX19zcGxpdDsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL2ltcGxzLyRzcGxpdGVyYXRlLWdyb3VwZWQvc3BsaXRlcmF0ZS1ncm91cGVkLmpzJykuX19zcGxpdGVyYXRlR3JvdXBlZDsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL2ltcGxzLyRzcGxpdGVyYXRlL3NwbGl0ZXJhdGUuanMnKS5fX3NwbGl0ZXJhdGU7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9pbXBscy8kc3RhcnRzLXdpdGgtYW55LXNlcS9zdGFydHMtd2l0aC1hbnktc2VxLmpzJykuX19zdGFydHNXaXRoQW55U2VxOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vaW1wbHMvJHN0YXJ0cy13aXRoLWFueS9zdGFydHMtd2l0aC1hbnkuanMnKS5fX3N0YXJ0c1dpdGhBbnk7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9pbXBscy8kc3RhcnRzLXdpdGgtc2VxL3N0YXJ0cy13aXRoLXNlcS5qcycpLl9fc3RhcnRzV2l0aFNlcTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL2ltcGxzLyRzdGFydHMtd2l0aC9zdGFydHMtd2l0aC5qcycpLl9fc3RhcnRzV2l0aDsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL2ltcGxzLyRzdHIvc3RyLmpzJykuX19zdHI7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9pbXBscy8kdGFrZS1sYXN0LW9yL3Rha2UtbGFzdC1vci5qcycpLl9fdGFrZUxhc3RPcjsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL2ltcGxzLyR0YWtlLWxhc3QvdGFrZS1sYXN0LmpzJykuX190YWtlTGFzdDsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL2ltcGxzLyR0YWtlLXNvcnRlZC90YWtlLXNvcnRlZC5qcycpLl9fdGFrZVNvcnRlZDsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL2ltcGxzLyR0YWtlLXdoaWxlL3Rha2Utd2hpbGUuanMnKS5fX3Rha2VXaGlsZTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL2ltcGxzLyR0YWtlL3Rha2UuanMnKS5fX3Rha2U7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9pbXBscy8kdGFwL3RhcC5qcycpLl9fdGFwOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vaW1wbHMvJHRvLWFycmF5L3RvLWFycmF5LmpzJykuX190b0FycmF5OyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vaW1wbHMvJHRvLW9iamVjdC90by1vYmplY3QuanMnKS5fX3RvT2JqZWN0OyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vaW1wbHMvJHdpbmRvdy1haGVhZC93aW5kb3ctYWhlYWQuanMnKS5fX3dpbmRvd0FoZWFkOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vaW1wbHMvJHdpbmRvdy1iZWhpbmQvd2luZG93LWJlaGluZC5qcycpLl9fd2luZG93QmVoaW5kOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vaW1wbHMvJHdpbmRvdy93aW5kb3cuanMnKS5fX3dpbmRvdzsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL2ltcGxzL3dyYXAtZW50cmllcy93cmFwLWVudHJpZXMuanMnKS5fX3dyYXBFbnRyaWVzOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vaW1wbHMvd3JhcC1rZXlzL3dyYXAta2V5cy5qcycpLl9fd3JhcEtleXM7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9pbXBscy93cmFwLXZhbHVlcy93cmFwLXZhbHVlcy5qcycpLl9fd3JhcFZhbHVlczsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL2ltcGxzLyR6aXAtYWxsL3ppcC1hbGwuanMnKS5fX3ppcEFsbDsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL2ltcGxzLyR6aXAvemlwLmpzJykuX196aXA7IiwidmFyIF9yZWdlbmVyYXRvclJ1bnRpbWUgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvcmVnZW5lcmF0b3JcIik7XG5cbnZhciBfbWFya2VkID0gLyojX19QVVJFX18qL19yZWdlbmVyYXRvclJ1bnRpbWUubWFyayhfX2FwcGVuZCk7XG5cbnZhciBfcmVxdWlyZSA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFsL2l0ZXJhYmxlLmpzJyksXG4gICAgaXRlcmFibGVDdXJyeSA9IF9yZXF1aXJlLml0ZXJhYmxlQ3Vycnk7XG5cbmZ1bmN0aW9uIF9fYXBwZW5kKHNvdXJjZSwgdmFsdWUpIHtcbiAgcmV0dXJuIF9yZWdlbmVyYXRvclJ1bnRpbWUud3JhcChmdW5jdGlvbiBfX2FwcGVuZCQoX2NvbnRleHQpIHtcbiAgICB3aGlsZSAoMSkge1xuICAgICAgc3dpdGNoIChfY29udGV4dC5wcmV2ID0gX2NvbnRleHQubmV4dCkge1xuICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgcmV0dXJuIF9jb250ZXh0LmRlbGVnYXRlWWllbGQoc291cmNlLCBcInQwXCIsIDEpO1xuXG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMztcbiAgICAgICAgICByZXR1cm4gdmFsdWU7XG5cbiAgICAgICAgY2FzZSAzOlxuICAgICAgICBjYXNlIFwiZW5kXCI6XG4gICAgICAgICAgcmV0dXJuIF9jb250ZXh0LnN0b3AoKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIF9tYXJrZWQpO1xufVxuXG5leHBvcnRzLl9fYXBwZW5kID0gX19hcHBlbmQ7XG52YXIgYXBwZW5kID0gLyojX19QVVJFX18qL2l0ZXJhYmxlQ3VycnkoX19hcHBlbmQpO1xuZXhwb3J0cy5hcHBlbmQgPSBhcHBlbmQ7IiwidmFyIF9yZWdlbmVyYXRvclJ1bnRpbWUgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvcmVnZW5lcmF0b3JcIik7XG5cbnZhciBfd3JhcEFzeW5jR2VuZXJhdG9yID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvd3JhcEFzeW5jR2VuZXJhdG9yXCIpO1xuXG52YXIgX2F3YWl0QXN5bmNHZW5lcmF0b3IgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9hd2FpdEFzeW5jR2VuZXJhdG9yXCIpO1xuXG52YXIgX2FzeW5jSXRlcmF0b3IgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9hc3luY0l0ZXJhdG9yXCIpO1xuXG52YXIgX2FzeW5jR2VuZXJhdG9yRGVsZWdhdGUgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9hc3luY0dlbmVyYXRvckRlbGVnYXRlXCIpO1xuXG52YXIgX3JlcXVpcmUgPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbC9hc3luYy1pdGVyYWJsZS5qcycpLFxuICAgIGFzeW5jSXRlcmFibGVDdXJyeSA9IF9yZXF1aXJlLmFzeW5jSXRlcmFibGVDdXJyeTtcblxuZnVuY3Rpb24gX19hc3luY0FwcGVuZChfeCwgX3gyKSB7XG4gIHJldHVybiBfYXN5bmNBcHBlbmQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cblxuZXhwb3J0cy5fX2FzeW5jQXBwZW5kID0gX19hc3luY0FwcGVuZDtcblxuZnVuY3Rpb24gX2FzeW5jQXBwZW5kKCkge1xuICBfYXN5bmNBcHBlbmQgPSBfd3JhcEFzeW5jR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yUnVudGltZS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUoc291cmNlLCB2YWx1ZSkge1xuICAgIHJldHVybiBfcmVnZW5lcmF0b3JSdW50aW1lLndyYXAoZnVuY3Rpb24gX2NhbGxlZSQoX2NvbnRleHQpIHtcbiAgICAgIHdoaWxlICgxKSB7XG4gICAgICAgIHN3aXRjaCAoX2NvbnRleHQucHJldiA9IF9jb250ZXh0Lm5leHQpIHtcbiAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuZGVsZWdhdGVZaWVsZChfYXN5bmNHZW5lcmF0b3JEZWxlZ2F0ZShfYXN5bmNJdGVyYXRvcihzb3VyY2UpLCBfYXdhaXRBc3luY0dlbmVyYXRvciksIFwidDBcIiwgMSk7XG5cbiAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMztcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcblxuICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICBjYXNlIFwiZW5kXCI6XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuc3RvcCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwgX2NhbGxlZSk7XG4gIH0pKTtcbiAgcmV0dXJuIF9hc3luY0FwcGVuZC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuXG52YXIgYXN5bmNBcHBlbmQgPSAvKiNfX1BVUkVfXyovYXN5bmNJdGVyYWJsZUN1cnJ5KF9fYXN5bmNBcHBlbmQpO1xuZXhwb3J0cy5hc3luY0FwcGVuZCA9IGFzeW5jQXBwZW5kOyIsInZhciBfcmVnZW5lcmF0b3JSdW50aW1lID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL3JlZ2VuZXJhdG9yXCIpO1xuXG52YXIgX2F3YWl0QXN5bmNHZW5lcmF0b3IgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9hd2FpdEFzeW5jR2VuZXJhdG9yXCIpO1xuXG52YXIgX3dyYXBBc3luY0dlbmVyYXRvciA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3dyYXBBc3luY0dlbmVyYXRvclwiKTtcblxudmFyIF9hc3luY0l0ZXJhdG9yID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvYXN5bmNJdGVyYXRvclwiKTtcblxudmFyIF9yZXF1aXJlID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWwvYXN5bmMtaXRlcmFibGUuanMnKSxcbiAgICBhc3luY0l0ZXJhYmxlQ3VycnkgPSBfcmVxdWlyZS5hc3luY0l0ZXJhYmxlQ3Vycnk7XG5cbnZhciBfcmVxdWlyZTIgPSByZXF1aXJlKCcuLi8kc3BsaXRlcmF0ZS9hc3luYy1zcGxpdGVyYXRlLmpzJyksXG4gICAgX19hc3luY1NwbGl0ZXJhdGUgPSBfcmVxdWlyZTIuX19hc3luY1NwbGl0ZXJhdGU7XG5cbmZ1bmN0aW9uIGFzeW5jQmF0Y2hTcGxpdGVyYXRvcihfeCwgX3gyLCBfeDMpIHtcbiAgcmV0dXJuIF9hc3luY0JhdGNoU3BsaXRlcmF0b3IuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cblxuZnVuY3Rpb24gX2FzeW5jQmF0Y2hTcGxpdGVyYXRvcigpIHtcbiAgX2FzeW5jQmF0Y2hTcGxpdGVyYXRvciA9IF93cmFwQXN5bmNHZW5lcmF0b3IoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3JSdW50aW1lLm1hcmsoZnVuY3Rpb24gX2NhbGxlZShzcGxpdCwgX3JlZiwgc291cmNlKSB7XG4gICAgdmFyIHNpemUsIGksIF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24sIF9kaWRJdGVyYXRvckVycm9yLCBfaXRlcmF0b3JFcnJvciwgX2l0ZXJhdG9yLCBfc3RlcCwgX3ZhbHVlLCB2YWx1ZTtcblxuICAgIHJldHVybiBfcmVnZW5lcmF0b3JSdW50aW1lLndyYXAoZnVuY3Rpb24gX2NhbGxlZSQoX2NvbnRleHQpIHtcbiAgICAgIHdoaWxlICgxKSB7XG4gICAgICAgIHN3aXRjaCAoX2NvbnRleHQucHJldiA9IF9jb250ZXh0Lm5leHQpIHtcbiAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICBzaXplID0gX3JlZi5zaXplO1xuICAgICAgICAgICAgaSA9IDA7XG4gICAgICAgICAgICBfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uID0gdHJ1ZTtcbiAgICAgICAgICAgIF9kaWRJdGVyYXRvckVycm9yID0gZmFsc2U7XG4gICAgICAgICAgICBfY29udGV4dC5wcmV2ID0gNDtcbiAgICAgICAgICAgIF9pdGVyYXRvciA9IF9hc3luY0l0ZXJhdG9yKHNvdXJjZSk7XG5cbiAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gODtcbiAgICAgICAgICAgIHJldHVybiBfYXdhaXRBc3luY0dlbmVyYXRvcihfaXRlcmF0b3IubmV4dCgpKTtcblxuICAgICAgICAgIGNhc2UgODpcbiAgICAgICAgICAgIF9zdGVwID0gX2NvbnRleHQuc2VudDtcbiAgICAgICAgICAgIF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24gPSBfc3RlcC5kb25lO1xuICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDEyO1xuICAgICAgICAgICAgcmV0dXJuIF9hd2FpdEFzeW5jR2VuZXJhdG9yKF9zdGVwLnZhbHVlKTtcblxuICAgICAgICAgIGNhc2UgMTI6XG4gICAgICAgICAgICBfdmFsdWUgPSBfY29udGV4dC5zZW50O1xuXG4gICAgICAgICAgICBpZiAoX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbikge1xuICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMjU7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YWx1ZSA9IF92YWx1ZTtcblxuICAgICAgICAgICAgaWYgKCEoaSA9PT0gc2l6ZSkpIHtcbiAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDE5O1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDE4O1xuICAgICAgICAgICAgcmV0dXJuIHNwbGl0O1xuXG4gICAgICAgICAgY2FzZSAxODpcbiAgICAgICAgICAgIGkgPSAwO1xuXG4gICAgICAgICAgY2FzZSAxOTpcbiAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAyMTtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcblxuICAgICAgICAgIGNhc2UgMjE6XG4gICAgICAgICAgICBpKys7XG5cbiAgICAgICAgICBjYXNlIDIyOlxuICAgICAgICAgICAgX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbiA9IHRydWU7XG4gICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gNjtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSAyNTpcbiAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAzMTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSAyNzpcbiAgICAgICAgICAgIF9jb250ZXh0LnByZXYgPSAyNztcbiAgICAgICAgICAgIF9jb250ZXh0LnQwID0gX2NvbnRleHRbXCJjYXRjaFwiXSg0KTtcbiAgICAgICAgICAgIF9kaWRJdGVyYXRvckVycm9yID0gdHJ1ZTtcbiAgICAgICAgICAgIF9pdGVyYXRvckVycm9yID0gX2NvbnRleHQudDA7XG5cbiAgICAgICAgICBjYXNlIDMxOlxuICAgICAgICAgICAgX2NvbnRleHQucHJldiA9IDMxO1xuICAgICAgICAgICAgX2NvbnRleHQucHJldiA9IDMyO1xuXG4gICAgICAgICAgICBpZiAoISghX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbiAmJiBfaXRlcmF0b3JbXCJyZXR1cm5cIl0gIT0gbnVsbCkpIHtcbiAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDM2O1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDM2O1xuICAgICAgICAgICAgcmV0dXJuIF9hd2FpdEFzeW5jR2VuZXJhdG9yKF9pdGVyYXRvcltcInJldHVyblwiXSgpKTtcblxuICAgICAgICAgIGNhc2UgMzY6XG4gICAgICAgICAgICBfY29udGV4dC5wcmV2ID0gMzY7XG5cbiAgICAgICAgICAgIGlmICghX2RpZEl0ZXJhdG9yRXJyb3IpIHtcbiAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDM5O1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhyb3cgX2l0ZXJhdG9yRXJyb3I7XG5cbiAgICAgICAgICBjYXNlIDM5OlxuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LmZpbmlzaCgzNik7XG5cbiAgICAgICAgICBjYXNlIDQwOlxuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LmZpbmlzaCgzMSk7XG5cbiAgICAgICAgICBjYXNlIDQxOlxuICAgICAgICAgIGNhc2UgXCJlbmRcIjpcbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5zdG9wKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCBfY2FsbGVlLCBudWxsLCBbWzQsIDI3LCAzMSwgNDFdLCBbMzIsLCAzNiwgNDBdXSk7XG4gIH0pKTtcbiAgcmV0dXJuIF9hc3luY0JhdGNoU3BsaXRlcmF0b3IuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cblxuZnVuY3Rpb24gX19hc3luY0JhdGNoKHNvdXJjZSwgc2l6ZSkge1xuICByZXR1cm4gX19hc3luY1NwbGl0ZXJhdGUoc291cmNlLCBhc3luY0JhdGNoU3BsaXRlcmF0b3IsIHtcbiAgICBzaXplOiBzaXplXG4gIH0pO1xufVxuXG5leHBvcnRzLl9fYXN5bmNCYXRjaCA9IF9fYXN5bmNCYXRjaDtcbnZhciBhc3luY0JhdGNoID0gLyojX19QVVJFX18qL2FzeW5jSXRlcmFibGVDdXJyeShfX2FzeW5jQmF0Y2gsIHtcbiAgdmFsaWRhdGVBcmdzOiBmdW5jdGlvbiB2YWxpZGF0ZUFyZ3MoYXJncykge1xuICAgIGlmICh0eXBlb2YgYXJnc1sxXSAhPT0gJ251bWJlcicgfHwgYXJnc1sxXSA8IDEpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2JhdGNoIHNpemUgc2hvdWxkIGJlIGEgbnVtYmVyIGdyZWF0ZXIgdGhhbiB6ZXJvJyk7XG4gICAgfVxuICB9XG59KTtcbmV4cG9ydHMuYXN5bmNCYXRjaCA9IGFzeW5jQmF0Y2g7IiwidmFyIF9yZWdlbmVyYXRvclJ1bnRpbWUgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvcmVnZW5lcmF0b3JcIik7XG5cbnZhciBfbWFya2VkID0gLyojX19QVVJFX18qL19yZWdlbmVyYXRvclJ1bnRpbWUubWFyayhiYXRjaFNwbGl0ZXJhdG9yKTtcblxuZnVuY3Rpb24gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIobywgYWxsb3dBcnJheUxpa2UpIHsgdmFyIGl0OyBpZiAodHlwZW9mIFN5bWJvbCA9PT0gXCJ1bmRlZmluZWRcIiB8fCBvW1N5bWJvbC5pdGVyYXRvcl0gPT0gbnVsbCkgeyBpZiAoQXJyYXkuaXNBcnJheShvKSB8fCAoaXQgPSBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkobykpIHx8IGFsbG93QXJyYXlMaWtlICYmIG8gJiYgdHlwZW9mIG8ubGVuZ3RoID09PSBcIm51bWJlclwiKSB7IGlmIChpdCkgbyA9IGl0OyB2YXIgaSA9IDA7IHZhciBGID0gZnVuY3Rpb24gRigpIHt9OyByZXR1cm4geyBzOiBGLCBuOiBmdW5jdGlvbiBuKCkgeyBpZiAoaSA+PSBvLmxlbmd0aCkgcmV0dXJuIHsgZG9uZTogdHJ1ZSB9OyByZXR1cm4geyBkb25lOiBmYWxzZSwgdmFsdWU6IG9baSsrXSB9OyB9LCBlOiBmdW5jdGlvbiBlKF9lKSB7IHRocm93IF9lOyB9LCBmOiBGIH07IH0gdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBpdGVyYXRlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpOyB9IHZhciBub3JtYWxDb21wbGV0aW9uID0gdHJ1ZSwgZGlkRXJyID0gZmFsc2UsIGVycjsgcmV0dXJuIHsgczogZnVuY3Rpb24gcygpIHsgaXQgPSBvW1N5bWJvbC5pdGVyYXRvcl0oKTsgfSwgbjogZnVuY3Rpb24gbigpIHsgdmFyIHN0ZXAgPSBpdC5uZXh0KCk7IG5vcm1hbENvbXBsZXRpb24gPSBzdGVwLmRvbmU7IHJldHVybiBzdGVwOyB9LCBlOiBmdW5jdGlvbiBlKF9lMikgeyBkaWRFcnIgPSB0cnVlOyBlcnIgPSBfZTI7IH0sIGY6IGZ1bmN0aW9uIGYoKSB7IHRyeSB7IGlmICghbm9ybWFsQ29tcGxldGlvbiAmJiBpdFtcInJldHVyblwiXSAhPSBudWxsKSBpdFtcInJldHVyblwiXSgpOyB9IGZpbmFsbHkgeyBpZiAoZGlkRXJyKSB0aHJvdyBlcnI7IH0gfSB9OyB9XG5cbmZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvLCBtaW5MZW4pIHsgaWYgKCFvKSByZXR1cm47IGlmICh0eXBlb2YgbyA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IHZhciBuID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pLnNsaWNlKDgsIC0xKTsgaWYgKG4gPT09IFwiT2JqZWN0XCIgJiYgby5jb25zdHJ1Y3RvcikgbiA9IG8uY29uc3RydWN0b3IubmFtZTsgaWYgKG4gPT09IFwiTWFwXCIgfHwgbiA9PT0gXCJTZXRcIikgcmV0dXJuIEFycmF5LmZyb20obyk7IGlmIChuID09PSBcIkFyZ3VtZW50c1wiIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTsgfVxuXG5mdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheShhcnIsIGxlbikgeyBpZiAobGVuID09IG51bGwgfHwgbGVuID4gYXJyLmxlbmd0aCkgbGVuID0gYXJyLmxlbmd0aDsgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkobGVuKTsgaSA8IGxlbjsgaSsrKSB7IGFycjJbaV0gPSBhcnJbaV07IH0gcmV0dXJuIGFycjI7IH1cblxudmFyIF9yZXF1aXJlID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWwvaXRlcmFibGUuanMnKSxcbiAgICBpdGVyYWJsZUN1cnJ5ID0gX3JlcXVpcmUuaXRlcmFibGVDdXJyeTtcblxudmFyIF9yZXF1aXJlMiA9IHJlcXVpcmUoJy4uLyRzcGxpdGVyYXRlL3NwbGl0ZXJhdGUuanMnKSxcbiAgICBfX3NwbGl0ZXJhdGUgPSBfcmVxdWlyZTIuX19zcGxpdGVyYXRlO1xuXG5mdW5jdGlvbiBiYXRjaFNwbGl0ZXJhdG9yKHNwbGl0LCBfcmVmLCBzb3VyY2UpIHtcbiAgdmFyIHNpemUsIGksIF9pdGVyYXRvciwgX3N0ZXAsIHZhbHVlO1xuXG4gIHJldHVybiBfcmVnZW5lcmF0b3JSdW50aW1lLndyYXAoZnVuY3Rpb24gYmF0Y2hTcGxpdGVyYXRvciQoX2NvbnRleHQpIHtcbiAgICB3aGlsZSAoMSkge1xuICAgICAgc3dpdGNoIChfY29udGV4dC5wcmV2ID0gX2NvbnRleHQubmV4dCkge1xuICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgc2l6ZSA9IF9yZWYuc2l6ZTtcbiAgICAgICAgICBpID0gMDtcbiAgICAgICAgICBfaXRlcmF0b3IgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihzb3VyY2UpO1xuICAgICAgICAgIF9jb250ZXh0LnByZXYgPSAzO1xuXG4gICAgICAgICAgX2l0ZXJhdG9yLnMoKTtcblxuICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgaWYgKChfc3RlcCA9IF9pdGVyYXRvci5uKCkpLmRvbmUpIHtcbiAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAxNjtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhbHVlID0gX3N0ZXAudmFsdWU7XG5cbiAgICAgICAgICBpZiAoIShpID09PSBzaXplKSkge1xuICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDExO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgX2NvbnRleHQubmV4dCA9IDEwO1xuICAgICAgICAgIHJldHVybiBzcGxpdDtcblxuICAgICAgICBjYXNlIDEwOlxuICAgICAgICAgIGkgPSAwO1xuXG4gICAgICAgIGNhc2UgMTE6XG4gICAgICAgICAgX2NvbnRleHQubmV4dCA9IDEzO1xuICAgICAgICAgIHJldHVybiB2YWx1ZTtcblxuICAgICAgICBjYXNlIDEzOlxuICAgICAgICAgIGkrKztcblxuICAgICAgICBjYXNlIDE0OlxuICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSA1O1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgMTY6XG4gICAgICAgICAgX2NvbnRleHQubmV4dCA9IDIxO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgMTg6XG4gICAgICAgICAgX2NvbnRleHQucHJldiA9IDE4O1xuICAgICAgICAgIF9jb250ZXh0LnQwID0gX2NvbnRleHRbXCJjYXRjaFwiXSgzKTtcblxuICAgICAgICAgIF9pdGVyYXRvci5lKF9jb250ZXh0LnQwKTtcblxuICAgICAgICBjYXNlIDIxOlxuICAgICAgICAgIF9jb250ZXh0LnByZXYgPSAyMTtcblxuICAgICAgICAgIF9pdGVyYXRvci5mKCk7XG5cbiAgICAgICAgICByZXR1cm4gX2NvbnRleHQuZmluaXNoKDIxKTtcblxuICAgICAgICBjYXNlIDI0OlxuICAgICAgICBjYXNlIFwiZW5kXCI6XG4gICAgICAgICAgcmV0dXJuIF9jb250ZXh0LnN0b3AoKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIF9tYXJrZWQsIG51bGwsIFtbMywgMTgsIDIxLCAyNF1dKTtcbn1cblxuZnVuY3Rpb24gX19iYXRjaChzb3VyY2UsIHNpemUpIHtcbiAgcmV0dXJuIF9fc3BsaXRlcmF0ZShzb3VyY2UsIGJhdGNoU3BsaXRlcmF0b3IsIHtcbiAgICBzaXplOiBzaXplXG4gIH0pO1xufVxuXG5leHBvcnRzLl9fYmF0Y2ggPSBfX2JhdGNoO1xudmFyIGJhdGNoID0gLyojX19QVVJFX18qL2l0ZXJhYmxlQ3VycnkoX19iYXRjaCwge1xuICB2YWxpZGF0ZUFyZ3M6IGZ1bmN0aW9uIHZhbGlkYXRlQXJncyhhcmdzKSB7XG4gICAgaWYgKHR5cGVvZiBhcmdzWzFdICE9PSAnbnVtYmVyJyB8fCBhcmdzWzFdIDwgMSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignYmF0Y2ggc2l6ZSBzaG91bGQgYmUgYSBudW1iZXIgZ3JlYXRlciB0aGFuIHplcm8nKTtcbiAgICB9XG4gIH1cbn0pO1xuZXhwb3J0cy5iYXRjaCA9IGJhdGNoOyIsInZhciBfcmVnZW5lcmF0b3JSdW50aW1lID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL3JlZ2VuZXJhdG9yXCIpO1xuXG52YXIgX2FzeW5jSXRlcmF0b3IgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9hc3luY0l0ZXJhdG9yXCIpO1xuXG52YXIgX2F3YWl0QXN5bmNHZW5lcmF0b3IgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9hd2FpdEFzeW5jR2VuZXJhdG9yXCIpO1xuXG52YXIgX3dyYXBBc3luY0dlbmVyYXRvciA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3dyYXBBc3luY0dlbmVyYXRvclwiKTtcblxudmFyIF9yZXF1aXJlID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWwvYXN5bmMtaXRlcmFibGUuanMnKSxcbiAgICBhc3luY0l0ZXJhYmxlQ3VycnkgPSBfcmVxdWlyZS5hc3luY0l0ZXJhYmxlQ3Vycnk7XG5cbnZhciBfcmVxdWlyZTIgPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbC9hc3luYy1iaXNlY3Rvci5qcycpLFxuICAgIEFzeW5jQmlzZWN0b3IgPSBfcmVxdWlyZTIuQXN5bmNCaXNlY3RvcjtcblxudmFyIF9yZXF1aXJlMyA9IHJlcXVpcmUoJy4uLyR0by1hcnJheS9hc3luYy10by1hcnJheS5qcycpLFxuICAgIF9fYXN5bmNUb0FycmF5ID0gX3JlcXVpcmUzLl9fYXN5bmNUb0FycmF5O1xuXG52YXIgX3JlcXVpcmU0ID0gcmVxdWlyZSgnLi4vJHBlZWtlcmF0ZS9hc3luYy1wZWVrZXJhdGUuanMnKSxcbiAgICBfX2FzeW5jUGVla2VyYXRlID0gX3JlcXVpcmU0Ll9fYXN5bmNQZWVrZXJhdGU7XG5cbmZ1bmN0aW9uIGFzeW5jSW5kZXhTdHJhdGVneShfeCwgX3gyLCBfeDMpIHtcbiAgcmV0dXJuIF9hc3luY0luZGV4U3RyYXRlZ3kuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cblxuZXhwb3J0cy5hc3luY0luZGV4U3RyYXRlZ3kgPSBhc3luY0luZGV4U3RyYXRlZ3k7XG5cbmZ1bmN0aW9uIF9hc3luY0luZGV4U3RyYXRlZ3koKSB7XG4gIF9hc3luY0luZGV4U3RyYXRlZ3kgPSBfd3JhcEFzeW5jR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yUnVudGltZS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUoc3BsaXQsIF9yZWYsIHNvdXJjZSkge1xuICAgIHZhciBhdCwgX3NvdXJjZSwgaWR4LCBwZWVrcjtcblxuICAgIHJldHVybiBfcmVnZW5lcmF0b3JSdW50aW1lLndyYXAoZnVuY3Rpb24gX2NhbGxlZSQoX2NvbnRleHQpIHtcbiAgICAgIHdoaWxlICgxKSB7XG4gICAgICAgIHN3aXRjaCAoX2NvbnRleHQucHJldiA9IF9jb250ZXh0Lm5leHQpIHtcbiAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICBhdCA9IF9yZWYuYXQ7XG5cbiAgICAgICAgICAgIGlmICghKGF0IDwgMCkpIHtcbiAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDc7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gNDtcbiAgICAgICAgICAgIHJldHVybiBfYXdhaXRBc3luY0dlbmVyYXRvcihfX2FzeW5jVG9BcnJheShzb3VyY2UpKTtcblxuICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgIF9jb250ZXh0LnQwID0gX2NvbnRleHQuc2VudDtcbiAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSA4O1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgICBfY29udGV4dC50MCA9IHNvdXJjZTtcblxuICAgICAgICAgIGNhc2UgODpcbiAgICAgICAgICAgIF9zb3VyY2UgPSBfY29udGV4dC50MDtcbiAgICAgICAgICAgIGlkeCA9IGF0IDwgMCA/IF9zb3VyY2UubGVuZ3RoICsgYXQgOiBhdDtcbiAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAxMjtcbiAgICAgICAgICAgIHJldHVybiBfYXdhaXRBc3luY0dlbmVyYXRvcihfX2FzeW5jUGVla2VyYXRlKF9zb3VyY2UpKTtcblxuICAgICAgICAgIGNhc2UgMTI6XG4gICAgICAgICAgICBwZWVrciA9IF9jb250ZXh0LnNlbnQ7XG4gICAgICAgICAgICBfY29udGV4dC5wcmV2ID0gMTM7XG5cbiAgICAgICAgICBjYXNlIDE0OlxuICAgICAgICAgICAgaWYgKHBlZWtyLmRvbmUpIHtcbiAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDI0O1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCEocGVla3IuaW5kZXggPT09IGlkeCkpIHtcbiAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDE4O1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDE4O1xuICAgICAgICAgICAgcmV0dXJuIHNwbGl0O1xuXG4gICAgICAgICAgY2FzZSAxODpcbiAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAyMDtcbiAgICAgICAgICAgIHJldHVybiBwZWVrci52YWx1ZTtcblxuICAgICAgICAgIGNhc2UgMjA6XG4gICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMjI7XG4gICAgICAgICAgICByZXR1cm4gX2F3YWl0QXN5bmNHZW5lcmF0b3IocGVla3IuYWR2YW5jZSgpKTtcblxuICAgICAgICAgIGNhc2UgMjI6XG4gICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMTQ7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgMjQ6XG4gICAgICAgICAgICBfY29udGV4dC5wcmV2ID0gMjQ7XG4gICAgICAgICAgICBwZWVrcltcInJldHVyblwiXSgpO1xuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LmZpbmlzaCgyNCk7XG5cbiAgICAgICAgICBjYXNlIDI3OlxuICAgICAgICAgIGNhc2UgXCJlbmRcIjpcbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5zdG9wKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCBfY2FsbGVlLCBudWxsLCBbWzEzLCwgMjQsIDI3XV0pO1xuICB9KSk7XG4gIHJldHVybiBfYXN5bmNJbmRleFN0cmF0ZWd5LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5cbmZ1bmN0aW9uIGFzeW5jQ29uZGl0aW9uU3RyYXRlZ3koX3g0LCBfeDUsIF94Nikge1xuICByZXR1cm4gX2FzeW5jQ29uZGl0aW9uU3RyYXRlZ3kuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cblxuZXhwb3J0cy5hc3luY0NvbmRpdGlvblN0cmF0ZWd5ID0gYXN5bmNDb25kaXRpb25TdHJhdGVneTtcblxuZnVuY3Rpb24gX2FzeW5jQ29uZGl0aW9uU3RyYXRlZ3koKSB7XG4gIF9hc3luY0NvbmRpdGlvblN0cmF0ZWd5ID0gX3dyYXBBc3luY0dlbmVyYXRvciggLyojX19QVVJFX18qL19yZWdlbmVyYXRvclJ1bnRpbWUubWFyayhmdW5jdGlvbiBfY2FsbGVlMihzcGxpdCwgX3JlZjIsIHNvdXJjZSkge1xuICAgIHZhciBwcmVkaWNhdGUsIGksIHNwbGF0LCBfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uLCBfZGlkSXRlcmF0b3JFcnJvciwgX2l0ZXJhdG9yRXJyb3IsIF9pdGVyYXRvciwgX3N0ZXAsIF92YWx1ZSwgdmFsdWU7XG5cbiAgICByZXR1cm4gX3JlZ2VuZXJhdG9yUnVudGltZS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUyJChfY29udGV4dDIpIHtcbiAgICAgIHdoaWxlICgxKSB7XG4gICAgICAgIHN3aXRjaCAoX2NvbnRleHQyLnByZXYgPSBfY29udGV4dDIubmV4dCkge1xuICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgIHByZWRpY2F0ZSA9IF9yZWYyLmF0O1xuICAgICAgICAgICAgaSA9IDA7XG4gICAgICAgICAgICBzcGxhdCA9IGZhbHNlO1xuICAgICAgICAgICAgX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbiA9IHRydWU7XG4gICAgICAgICAgICBfZGlkSXRlcmF0b3JFcnJvciA9IGZhbHNlO1xuICAgICAgICAgICAgX2NvbnRleHQyLnByZXYgPSA1O1xuICAgICAgICAgICAgX2l0ZXJhdG9yID0gX2FzeW5jSXRlcmF0b3Ioc291cmNlKTtcblxuICAgICAgICAgIGNhc2UgNzpcbiAgICAgICAgICAgIF9jb250ZXh0Mi5uZXh0ID0gOTtcbiAgICAgICAgICAgIHJldHVybiBfYXdhaXRBc3luY0dlbmVyYXRvcihfaXRlcmF0b3IubmV4dCgpKTtcblxuICAgICAgICAgIGNhc2UgOTpcbiAgICAgICAgICAgIF9zdGVwID0gX2NvbnRleHQyLnNlbnQ7XG4gICAgICAgICAgICBfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uID0gX3N0ZXAuZG9uZTtcbiAgICAgICAgICAgIF9jb250ZXh0Mi5uZXh0ID0gMTM7XG4gICAgICAgICAgICByZXR1cm4gX2F3YWl0QXN5bmNHZW5lcmF0b3IoX3N0ZXAudmFsdWUpO1xuXG4gICAgICAgICAgY2FzZSAxMzpcbiAgICAgICAgICAgIF92YWx1ZSA9IF9jb250ZXh0Mi5zZW50O1xuXG4gICAgICAgICAgICBpZiAoX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbikge1xuICAgICAgICAgICAgICBfY29udGV4dDIubmV4dCA9IDMwO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFsdWUgPSBfdmFsdWU7XG4gICAgICAgICAgICBfY29udGV4dDIudDAgPSAhc3BsYXQ7XG5cbiAgICAgICAgICAgIGlmICghX2NvbnRleHQyLnQwKSB7XG4gICAgICAgICAgICAgIF9jb250ZXh0Mi5uZXh0ID0gMjE7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBfY29udGV4dDIubmV4dCA9IDIwO1xuICAgICAgICAgICAgcmV0dXJuIF9hd2FpdEFzeW5jR2VuZXJhdG9yKHByZWRpY2F0ZSh2YWx1ZSwgaSsrKSk7XG5cbiAgICAgICAgICBjYXNlIDIwOlxuICAgICAgICAgICAgX2NvbnRleHQyLnQwID0gX2NvbnRleHQyLnNlbnQ7XG5cbiAgICAgICAgICBjYXNlIDIxOlxuICAgICAgICAgICAgaWYgKCFfY29udGV4dDIudDApIHtcbiAgICAgICAgICAgICAgX2NvbnRleHQyLm5leHQgPSAyNTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIF9jb250ZXh0Mi5uZXh0ID0gMjQ7XG4gICAgICAgICAgICByZXR1cm4gc3BsaXQ7XG5cbiAgICAgICAgICBjYXNlIDI0OlxuICAgICAgICAgICAgc3BsYXQgPSB0cnVlO1xuXG4gICAgICAgICAgY2FzZSAyNTpcbiAgICAgICAgICAgIF9jb250ZXh0Mi5uZXh0ID0gMjc7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG5cbiAgICAgICAgICBjYXNlIDI3OlxuICAgICAgICAgICAgX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbiA9IHRydWU7XG4gICAgICAgICAgICBfY29udGV4dDIubmV4dCA9IDc7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgMzA6XG4gICAgICAgICAgICBfY29udGV4dDIubmV4dCA9IDM2O1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlIDMyOlxuICAgICAgICAgICAgX2NvbnRleHQyLnByZXYgPSAzMjtcbiAgICAgICAgICAgIF9jb250ZXh0Mi50MSA9IF9jb250ZXh0MltcImNhdGNoXCJdKDUpO1xuICAgICAgICAgICAgX2RpZEl0ZXJhdG9yRXJyb3IgPSB0cnVlO1xuICAgICAgICAgICAgX2l0ZXJhdG9yRXJyb3IgPSBfY29udGV4dDIudDE7XG5cbiAgICAgICAgICBjYXNlIDM2OlxuICAgICAgICAgICAgX2NvbnRleHQyLnByZXYgPSAzNjtcbiAgICAgICAgICAgIF9jb250ZXh0Mi5wcmV2ID0gMzc7XG5cbiAgICAgICAgICAgIGlmICghKCFfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uICYmIF9pdGVyYXRvcltcInJldHVyblwiXSAhPSBudWxsKSkge1xuICAgICAgICAgICAgICBfY29udGV4dDIubmV4dCA9IDQxO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgX2NvbnRleHQyLm5leHQgPSA0MTtcbiAgICAgICAgICAgIHJldHVybiBfYXdhaXRBc3luY0dlbmVyYXRvcihfaXRlcmF0b3JbXCJyZXR1cm5cIl0oKSk7XG5cbiAgICAgICAgICBjYXNlIDQxOlxuICAgICAgICAgICAgX2NvbnRleHQyLnByZXYgPSA0MTtcblxuICAgICAgICAgICAgaWYgKCFfZGlkSXRlcmF0b3JFcnJvcikge1xuICAgICAgICAgICAgICBfY29udGV4dDIubmV4dCA9IDQ0O1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhyb3cgX2l0ZXJhdG9yRXJyb3I7XG5cbiAgICAgICAgICBjYXNlIDQ0OlxuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0Mi5maW5pc2goNDEpO1xuXG4gICAgICAgICAgY2FzZSA0NTpcbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dDIuZmluaXNoKDM2KTtcblxuICAgICAgICAgIGNhc2UgNDY6XG4gICAgICAgICAgY2FzZSBcImVuZFwiOlxuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0Mi5zdG9wKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCBfY2FsbGVlMiwgbnVsbCwgW1s1LCAzMiwgMzYsIDQ2XSwgWzM3LCwgNDEsIDQ1XV0pO1xuICB9KSk7XG4gIHJldHVybiBfYXN5bmNDb25kaXRpb25TdHJhdGVneS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuXG5mdW5jdGlvbiBfX2FzeW5jQmlzZWN0KHNvdXJjZSwgYXQpIHtcbiAgdmFyIHN0cmF0ZWd5ID0gdHlwZW9mIGF0ID09PSAnbnVtYmVyJyA/IGFzeW5jSW5kZXhTdHJhdGVneSA6IGFzeW5jQ29uZGl0aW9uU3RyYXRlZ3k7XG4gIHJldHVybiBuZXcgQXN5bmNCaXNlY3Rvcihzb3VyY2UsIHN0cmF0ZWd5LCB7XG4gICAgYXQ6IGF0XG4gIH0pO1xufVxuXG5leHBvcnRzLl9fYXN5bmNCaXNlY3QgPSBfX2FzeW5jQmlzZWN0O1xudmFyIGFzeW5jQmlzZWN0ID0gLyojX19QVVJFX18qL2FzeW5jSXRlcmFibGVDdXJyeShfX2FzeW5jQmlzZWN0LCB7XG4gIGZvcmNlU3luYzogdHJ1ZVxufSk7XG5leHBvcnRzLmFzeW5jQmlzZWN0ID0gYXN5bmNCaXNlY3Q7IiwiZnVuY3Rpb24gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIobywgYWxsb3dBcnJheUxpa2UpIHsgdmFyIGl0OyBpZiAodHlwZW9mIFN5bWJvbCA9PT0gXCJ1bmRlZmluZWRcIiB8fCBvW1N5bWJvbC5pdGVyYXRvcl0gPT0gbnVsbCkgeyBpZiAoQXJyYXkuaXNBcnJheShvKSB8fCAoaXQgPSBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkobykpIHx8IGFsbG93QXJyYXlMaWtlICYmIG8gJiYgdHlwZW9mIG8ubGVuZ3RoID09PSBcIm51bWJlclwiKSB7IGlmIChpdCkgbyA9IGl0OyB2YXIgaSA9IDA7IHZhciBGID0gZnVuY3Rpb24gRigpIHt9OyByZXR1cm4geyBzOiBGLCBuOiBmdW5jdGlvbiBuKCkgeyBpZiAoaSA+PSBvLmxlbmd0aCkgcmV0dXJuIHsgZG9uZTogdHJ1ZSB9OyByZXR1cm4geyBkb25lOiBmYWxzZSwgdmFsdWU6IG9baSsrXSB9OyB9LCBlOiBmdW5jdGlvbiBlKF9lKSB7IHRocm93IF9lOyB9LCBmOiBGIH07IH0gdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBpdGVyYXRlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpOyB9IHZhciBub3JtYWxDb21wbGV0aW9uID0gdHJ1ZSwgZGlkRXJyID0gZmFsc2UsIGVycjsgcmV0dXJuIHsgczogZnVuY3Rpb24gcygpIHsgaXQgPSBvW1N5bWJvbC5pdGVyYXRvcl0oKTsgfSwgbjogZnVuY3Rpb24gbigpIHsgdmFyIHN0ZXAgPSBpdC5uZXh0KCk7IG5vcm1hbENvbXBsZXRpb24gPSBzdGVwLmRvbmU7IHJldHVybiBzdGVwOyB9LCBlOiBmdW5jdGlvbiBlKF9lMikgeyBkaWRFcnIgPSB0cnVlOyBlcnIgPSBfZTI7IH0sIGY6IGZ1bmN0aW9uIGYoKSB7IHRyeSB7IGlmICghbm9ybWFsQ29tcGxldGlvbiAmJiBpdFtcInJldHVyblwiXSAhPSBudWxsKSBpdFtcInJldHVyblwiXSgpOyB9IGZpbmFsbHkgeyBpZiAoZGlkRXJyKSB0aHJvdyBlcnI7IH0gfSB9OyB9XG5cbmZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvLCBtaW5MZW4pIHsgaWYgKCFvKSByZXR1cm47IGlmICh0eXBlb2YgbyA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IHZhciBuID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pLnNsaWNlKDgsIC0xKTsgaWYgKG4gPT09IFwiT2JqZWN0XCIgJiYgby5jb25zdHJ1Y3RvcikgbiA9IG8uY29uc3RydWN0b3IubmFtZTsgaWYgKG4gPT09IFwiTWFwXCIgfHwgbiA9PT0gXCJTZXRcIikgcmV0dXJuIEFycmF5LmZyb20obyk7IGlmIChuID09PSBcIkFyZ3VtZW50c1wiIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTsgfVxuXG5mdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheShhcnIsIGxlbikgeyBpZiAobGVuID09IG51bGwgfHwgbGVuID4gYXJyLmxlbmd0aCkgbGVuID0gYXJyLmxlbmd0aDsgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkobGVuKTsgaSA8IGxlbjsgaSsrKSB7IGFycjJbaV0gPSBhcnJbaV07IH0gcmV0dXJuIGFycjI7IH1cblxudmFyIF9yZWdlbmVyYXRvclJ1bnRpbWUgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvcmVnZW5lcmF0b3JcIik7XG5cbnZhciBfbWFya2VkID0gLyojX19QVVJFX18qL19yZWdlbmVyYXRvclJ1bnRpbWUubWFyayhpbmRleFN0cmF0ZWd5KSxcbiAgICBfbWFya2VkMiA9IC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3JSdW50aW1lLm1hcmsoY29uZGl0aW9uU3RyYXRlZ3kpO1xuXG52YXIgX3JlcXVpcmUgPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbC9pdGVyYWJsZS5qcycpLFxuICAgIGl0ZXJhYmxlQ3VycnkgPSBfcmVxdWlyZS5pdGVyYWJsZUN1cnJ5O1xuXG52YXIgX3JlcXVpcmUyID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWwvYmlzZWN0b3IuanMnKSxcbiAgICBCaXNlY3RvciA9IF9yZXF1aXJlMi5CaXNlY3RvcjtcblxudmFyIF9yZXF1aXJlMyA9IHJlcXVpcmUoJy4uLyR0by1hcnJheS90by1hcnJheS5qcycpLFxuICAgIF9fdG9BcnJheSA9IF9yZXF1aXJlMy5fX3RvQXJyYXk7XG5cbnZhciBfcmVxdWlyZTQgPSByZXF1aXJlKCcuLi8kcGVla2VyYXRlL3BlZWtlcmF0ZS5qcycpLFxuICAgIF9fcGVla2VyYXRlID0gX3JlcXVpcmU0Ll9fcGVla2VyYXRlO1xuXG5mdW5jdGlvbiBpbmRleFN0cmF0ZWd5KHNwbGl0LCBfcmVmLCBzb3VyY2UpIHtcbiAgdmFyIGF0LCBfc291cmNlLCBpZHgsIHBlZWtyO1xuXG4gIHJldHVybiBfcmVnZW5lcmF0b3JSdW50aW1lLndyYXAoZnVuY3Rpb24gaW5kZXhTdHJhdGVneSQoX2NvbnRleHQpIHtcbiAgICB3aGlsZSAoMSkge1xuICAgICAgc3dpdGNoIChfY29udGV4dC5wcmV2ID0gX2NvbnRleHQubmV4dCkge1xuICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgYXQgPSBfcmVmLmF0O1xuICAgICAgICAgIF9zb3VyY2UgPSBhdCA8IDAgPyBfX3RvQXJyYXkoc291cmNlKSA6IHNvdXJjZTtcbiAgICAgICAgICBpZHggPSBhdCA8IDAgPyBfc291cmNlLmxlbmd0aCArIGF0IDogYXQ7XG4gICAgICAgICAgcGVla3IgPSBfX3BlZWtlcmF0ZShfc291cmNlKTtcbiAgICAgICAgICBfY29udGV4dC5wcmV2ID0gNDtcblxuICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgaWYgKHBlZWtyLmRvbmUpIHtcbiAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAxNDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICghKHBlZWtyLmluZGV4ID09PSBpZHgpKSB7XG4gICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gOTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSA5O1xuICAgICAgICAgIHJldHVybiBzcGxpdDtcblxuICAgICAgICBjYXNlIDk6XG4gICAgICAgICAgX2NvbnRleHQubmV4dCA9IDExO1xuICAgICAgICAgIHJldHVybiBwZWVrci52YWx1ZTtcblxuICAgICAgICBjYXNlIDExOlxuICAgICAgICAgIHBlZWtyLmFkdmFuY2UoKTtcbiAgICAgICAgICBfY29udGV4dC5uZXh0ID0gNTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIDE0OlxuICAgICAgICAgIF9jb250ZXh0LnByZXYgPSAxNDtcbiAgICAgICAgICBwZWVrcltcInJldHVyblwiXSgpO1xuICAgICAgICAgIHJldHVybiBfY29udGV4dC5maW5pc2goMTQpO1xuXG4gICAgICAgIGNhc2UgMTc6XG4gICAgICAgIGNhc2UgXCJlbmRcIjpcbiAgICAgICAgICByZXR1cm4gX2NvbnRleHQuc3RvcCgpO1xuICAgICAgfVxuICAgIH1cbiAgfSwgX21hcmtlZCwgbnVsbCwgW1s0LCwgMTQsIDE3XV0pO1xufVxuXG5leHBvcnRzLmluZGV4U3RyYXRlZ3kgPSBpbmRleFN0cmF0ZWd5O1xuXG5mdW5jdGlvbiBjb25kaXRpb25TdHJhdGVneShzcGxpdCwgX3JlZjIsIHNvdXJjZSkge1xuICB2YXIgcHJlZGljYXRlLCBpLCBzcGxhdCwgX2l0ZXJhdG9yLCBfc3RlcCwgdmFsdWU7XG5cbiAgcmV0dXJuIF9yZWdlbmVyYXRvclJ1bnRpbWUud3JhcChmdW5jdGlvbiBjb25kaXRpb25TdHJhdGVneSQoX2NvbnRleHQyKSB7XG4gICAgd2hpbGUgKDEpIHtcbiAgICAgIHN3aXRjaCAoX2NvbnRleHQyLnByZXYgPSBfY29udGV4dDIubmV4dCkge1xuICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgcHJlZGljYXRlID0gX3JlZjIuYXQ7XG4gICAgICAgICAgaSA9IDA7XG4gICAgICAgICAgc3BsYXQgPSBmYWxzZTtcbiAgICAgICAgICBfaXRlcmF0b3IgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihzb3VyY2UpO1xuICAgICAgICAgIF9jb250ZXh0Mi5wcmV2ID0gNDtcblxuICAgICAgICAgIF9pdGVyYXRvci5zKCk7XG5cbiAgICAgICAgY2FzZSA2OlxuICAgICAgICAgIGlmICgoX3N0ZXAgPSBfaXRlcmF0b3IubigpKS5kb25lKSB7XG4gICAgICAgICAgICBfY29udGV4dDIubmV4dCA9IDE2O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFsdWUgPSBfc3RlcC52YWx1ZTtcblxuICAgICAgICAgIGlmICghKCFzcGxhdCAmJiBwcmVkaWNhdGUodmFsdWUsIGkrKykpKSB7XG4gICAgICAgICAgICBfY29udGV4dDIubmV4dCA9IDEyO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgX2NvbnRleHQyLm5leHQgPSAxMTtcbiAgICAgICAgICByZXR1cm4gc3BsaXQ7XG5cbiAgICAgICAgY2FzZSAxMTpcbiAgICAgICAgICBzcGxhdCA9IHRydWU7XG5cbiAgICAgICAgY2FzZSAxMjpcbiAgICAgICAgICBfY29udGV4dDIubmV4dCA9IDE0O1xuICAgICAgICAgIHJldHVybiB2YWx1ZTtcblxuICAgICAgICBjYXNlIDE0OlxuICAgICAgICAgIF9jb250ZXh0Mi5uZXh0ID0gNjtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIDE2OlxuICAgICAgICAgIF9jb250ZXh0Mi5uZXh0ID0gMjE7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAxODpcbiAgICAgICAgICBfY29udGV4dDIucHJldiA9IDE4O1xuICAgICAgICAgIF9jb250ZXh0Mi50MCA9IF9jb250ZXh0MltcImNhdGNoXCJdKDQpO1xuXG4gICAgICAgICAgX2l0ZXJhdG9yLmUoX2NvbnRleHQyLnQwKTtcblxuICAgICAgICBjYXNlIDIxOlxuICAgICAgICAgIF9jb250ZXh0Mi5wcmV2ID0gMjE7XG5cbiAgICAgICAgICBfaXRlcmF0b3IuZigpO1xuXG4gICAgICAgICAgcmV0dXJuIF9jb250ZXh0Mi5maW5pc2goMjEpO1xuXG4gICAgICAgIGNhc2UgMjQ6XG4gICAgICAgIGNhc2UgXCJlbmRcIjpcbiAgICAgICAgICByZXR1cm4gX2NvbnRleHQyLnN0b3AoKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIF9tYXJrZWQyLCBudWxsLCBbWzQsIDE4LCAyMSwgMjRdXSk7XG59XG5cbmV4cG9ydHMuY29uZGl0aW9uU3RyYXRlZ3kgPSBjb25kaXRpb25TdHJhdGVneTtcblxuZnVuY3Rpb24gX19iaXNlY3Qoc291cmNlLCBhdCkge1xuICB2YXIgc3RyYXRlZ3kgPSB0eXBlb2YgYXQgPT09ICdudW1iZXInID8gaW5kZXhTdHJhdGVneSA6IGNvbmRpdGlvblN0cmF0ZWd5O1xuICByZXR1cm4gbmV3IEJpc2VjdG9yKHNvdXJjZSwgc3RyYXRlZ3ksIHtcbiAgICBhdDogYXRcbiAgfSk7XG59XG5cbmV4cG9ydHMuX19iaXNlY3QgPSBfX2Jpc2VjdDtcbnZhciBiaXNlY3QgPSAvKiNfX1BVUkVfXyovaXRlcmFibGVDdXJyeShfX2Jpc2VjdCwge1xuICBmb3JjZVN5bmM6IHRydWVcbn0pO1xuZXhwb3J0cy5iaXNlY3QgPSBiaXNlY3Q7IiwidmFyIF9yZWdlbmVyYXRvclJ1bnRpbWUgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvcmVnZW5lcmF0b3JcIik7XG5cbmZ1bmN0aW9uIF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKG8sIGFsbG93QXJyYXlMaWtlKSB7IHZhciBpdDsgaWYgKHR5cGVvZiBTeW1ib2wgPT09IFwidW5kZWZpbmVkXCIgfHwgb1tTeW1ib2wuaXRlcmF0b3JdID09IG51bGwpIHsgaWYgKEFycmF5LmlzQXJyYXkobykgfHwgKGl0ID0gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8pKSB8fCBhbGxvd0FycmF5TGlrZSAmJiBvICYmIHR5cGVvZiBvLmxlbmd0aCA9PT0gXCJudW1iZXJcIikgeyBpZiAoaXQpIG8gPSBpdDsgdmFyIGkgPSAwOyB2YXIgRiA9IGZ1bmN0aW9uIEYoKSB7fTsgcmV0dXJuIHsgczogRiwgbjogZnVuY3Rpb24gbigpIHsgaWYgKGkgPj0gby5sZW5ndGgpIHJldHVybiB7IGRvbmU6IHRydWUgfTsgcmV0dXJuIHsgZG9uZTogZmFsc2UsIHZhbHVlOiBvW2krK10gfTsgfSwgZTogZnVuY3Rpb24gZShfZSkgeyB0aHJvdyBfZTsgfSwgZjogRiB9OyB9IHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gaXRlcmF0ZSBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTsgfSB2YXIgbm9ybWFsQ29tcGxldGlvbiA9IHRydWUsIGRpZEVyciA9IGZhbHNlLCBlcnI7IHJldHVybiB7IHM6IGZ1bmN0aW9uIHMoKSB7IGl0ID0gb1tTeW1ib2wuaXRlcmF0b3JdKCk7IH0sIG46IGZ1bmN0aW9uIG4oKSB7IHZhciBzdGVwID0gaXQubmV4dCgpOyBub3JtYWxDb21wbGV0aW9uID0gc3RlcC5kb25lOyByZXR1cm4gc3RlcDsgfSwgZTogZnVuY3Rpb24gZShfZTIpIHsgZGlkRXJyID0gdHJ1ZTsgZXJyID0gX2UyOyB9LCBmOiBmdW5jdGlvbiBmKCkgeyB0cnkgeyBpZiAoIW5vcm1hbENvbXBsZXRpb24gJiYgaXRbXCJyZXR1cm5cIl0gIT0gbnVsbCkgaXRbXCJyZXR1cm5cIl0oKTsgfSBmaW5hbGx5IHsgaWYgKGRpZEVycikgdGhyb3cgZXJyOyB9IH0gfTsgfVxuXG5mdW5jdGlvbiBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkobywgbWluTGVuKSB7IGlmICghbykgcmV0dXJuOyBpZiAodHlwZW9mIG8gPT09IFwic3RyaW5nXCIpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pOyB2YXIgbiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKS5zbGljZSg4LCAtMSk7IGlmIChuID09PSBcIk9iamVjdFwiICYmIG8uY29uc3RydWN0b3IpIG4gPSBvLmNvbnN0cnVjdG9yLm5hbWU7IGlmIChuID09PSBcIk1hcFwiIHx8IG4gPT09IFwiU2V0XCIpIHJldHVybiBBcnJheS5mcm9tKG8pOyBpZiAobiA9PT0gXCJBcmd1bWVudHNcIiB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSkgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IH1cblxuZnVuY3Rpb24gX2FycmF5TGlrZVRvQXJyYXkoYXJyLCBsZW4pIHsgaWYgKGxlbiA9PSBudWxsIHx8IGxlbiA+IGFyci5sZW5ndGgpIGxlbiA9IGFyci5sZW5ndGg7IGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGxlbik7IGkgPCBsZW47IGkrKykgeyBhcnIyW2ldID0gYXJyW2ldOyB9IHJldHVybiBhcnIyOyB9XG5cbnZhciBfYXdhaXRBc3luY0dlbmVyYXRvciA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2F3YWl0QXN5bmNHZW5lcmF0b3JcIik7XG5cbnZhciBfd3JhcEFzeW5jR2VuZXJhdG9yID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvd3JhcEFzeW5jR2VuZXJhdG9yXCIpO1xuXG52YXIgX3JlcXVpcmUgPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbC9hc3luYy1pdGVyYWJsZS5qcycpLFxuICAgIGFzeW5jSXRlcmFibGVDdXJyeSA9IF9yZXF1aXJlLmFzeW5jSXRlcmFibGVDdXJyeTtcblxudmFyIF9yZXF1aXJlMiA9IHJlcXVpcmUoJy4uLyRpbnRlcmxlYXZlL2FzeW5jLWludGVybGVhdmUuanMnKSxcbiAgICBfX2FzeW5jSW50ZXJsZWF2ZSA9IF9yZXF1aXJlMi5fX2FzeW5jSW50ZXJsZWF2ZTtcblxuZnVuY3Rpb24gYXN5bmNCeUNvbXBhcmlzb24oX3gsIF94Mikge1xuICByZXR1cm4gX2FzeW5jQnlDb21wYXJpc29uLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5cbmZ1bmN0aW9uIF9hc3luY0J5Q29tcGFyaXNvbigpIHtcbiAgX2FzeW5jQnlDb21wYXJpc29uID0gX3dyYXBBc3luY0dlbmVyYXRvciggLyojX19QVVJFX18qL19yZWdlbmVyYXRvclJ1bnRpbWUubWFyayhmdW5jdGlvbiBfY2FsbGVlKF9yZWYsIGFsbCkge1xuICAgIHZhciBjb21wYXJlLFxuICAgICAgICBjYW5kaWRhdGUsXG4gICAgICAgIF9sZW4sXG4gICAgICAgIHBlZWtycyxcbiAgICAgICAgX2tleSxcbiAgICAgICAgX2l0ZXJhdG9yLFxuICAgICAgICBfc3RlcCxcbiAgICAgICAgcGVla3IsXG4gICAgICAgIF9hcmdzID0gYXJndW1lbnRzO1xuXG4gICAgcmV0dXJuIF9yZWdlbmVyYXRvclJ1bnRpbWUud3JhcChmdW5jdGlvbiBfY2FsbGVlJChfY29udGV4dCkge1xuICAgICAgd2hpbGUgKDEpIHtcbiAgICAgICAgc3dpdGNoIChfY29udGV4dC5wcmV2ID0gX2NvbnRleHQubmV4dCkge1xuICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgIGNvbXBhcmUgPSBfcmVmLmNvbXBhcmU7XG5cbiAgICAgICAgICAgIGZvciAoX2xlbiA9IF9hcmdzLmxlbmd0aCwgcGVla3JzID0gbmV3IEFycmF5KF9sZW4gPiAyID8gX2xlbiAtIDIgOiAwKSwgX2tleSA9IDI7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgICAgICAgICAgcGVla3JzW19rZXkgLSAyXSA9IF9hcmdzW19rZXldO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgaWYgKGFsbC5kb25lKSB7XG4gICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAxMjtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNhbmRpZGF0ZSA9IGFsbC52YWx1ZTtcbiAgICAgICAgICAgIF9pdGVyYXRvciA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKHBlZWtycyk7XG5cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGZvciAoX2l0ZXJhdG9yLnMoKTsgIShfc3RlcCA9IF9pdGVyYXRvci5uKCkpLmRvbmU7KSB7XG4gICAgICAgICAgICAgICAgcGVla3IgPSBfc3RlcC52YWx1ZTtcblxuICAgICAgICAgICAgICAgIGlmICghcGVla3IuZG9uZSAmJiBjb21wYXJlKHBlZWtyLnZhbHVlLCBjYW5kaWRhdGUudmFsdWUpIDwgMCkge1xuICAgICAgICAgICAgICAgICAgY2FuZGlkYXRlID0gcGVla3I7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgX2l0ZXJhdG9yLmUoZXJyKTtcbiAgICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAgIF9pdGVyYXRvci5mKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSA4O1xuICAgICAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZS52YWx1ZTtcblxuICAgICAgICAgIGNhc2UgODpcbiAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAxMDtcbiAgICAgICAgICAgIHJldHVybiBfYXdhaXRBc3luY0dlbmVyYXRvcihjYW5kaWRhdGUuYWR2YW5jZSgpKTtcblxuICAgICAgICAgIGNhc2UgMTA6XG4gICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMjtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSAxMjpcbiAgICAgICAgICBjYXNlIFwiZW5kXCI6XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuc3RvcCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwgX2NhbGxlZSk7XG4gIH0pKTtcbiAgcmV0dXJuIF9hc3luY0J5Q29tcGFyaXNvbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuXG5mdW5jdGlvbiBfX2FzeW5jQ29sbGF0ZShzb3VyY2VzLCBjb21wYXJlKSB7XG4gIHJldHVybiBfX2FzeW5jSW50ZXJsZWF2ZShzb3VyY2VzLCBhc3luY0J5Q29tcGFyaXNvbiwge1xuICAgIGNvbXBhcmU6IGNvbXBhcmVcbiAgfSk7XG59XG5cbmV4cG9ydHMuX19hc3luY0NvbGxhdGUgPSBfX2FzeW5jQ29sbGF0ZTtcbnZhciBhc3luY0NvbGxhdGUgPSAvKiNfX1BVUkVfXyovYXN5bmNJdGVyYWJsZUN1cnJ5KF9fYXN5bmNDb2xsYXRlLCB7XG4gIHZhcmlhZGljOiB0cnVlXG59KTtcbmV4cG9ydHMuYXN5bmNDb2xsYXRlID0gYXN5bmNDb2xsYXRlOyIsInZhciBfcmVnZW5lcmF0b3JSdW50aW1lID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL3JlZ2VuZXJhdG9yXCIpO1xuXG52YXIgX21hcmtlZCA9IC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3JSdW50aW1lLm1hcmsoYnlDb21wYXJpc29uKTtcblxuZnVuY3Rpb24gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIobywgYWxsb3dBcnJheUxpa2UpIHsgdmFyIGl0OyBpZiAodHlwZW9mIFN5bWJvbCA9PT0gXCJ1bmRlZmluZWRcIiB8fCBvW1N5bWJvbC5pdGVyYXRvcl0gPT0gbnVsbCkgeyBpZiAoQXJyYXkuaXNBcnJheShvKSB8fCAoaXQgPSBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkobykpIHx8IGFsbG93QXJyYXlMaWtlICYmIG8gJiYgdHlwZW9mIG8ubGVuZ3RoID09PSBcIm51bWJlclwiKSB7IGlmIChpdCkgbyA9IGl0OyB2YXIgaSA9IDA7IHZhciBGID0gZnVuY3Rpb24gRigpIHt9OyByZXR1cm4geyBzOiBGLCBuOiBmdW5jdGlvbiBuKCkgeyBpZiAoaSA+PSBvLmxlbmd0aCkgcmV0dXJuIHsgZG9uZTogdHJ1ZSB9OyByZXR1cm4geyBkb25lOiBmYWxzZSwgdmFsdWU6IG9baSsrXSB9OyB9LCBlOiBmdW5jdGlvbiBlKF9lKSB7IHRocm93IF9lOyB9LCBmOiBGIH07IH0gdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBpdGVyYXRlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpOyB9IHZhciBub3JtYWxDb21wbGV0aW9uID0gdHJ1ZSwgZGlkRXJyID0gZmFsc2UsIGVycjsgcmV0dXJuIHsgczogZnVuY3Rpb24gcygpIHsgaXQgPSBvW1N5bWJvbC5pdGVyYXRvcl0oKTsgfSwgbjogZnVuY3Rpb24gbigpIHsgdmFyIHN0ZXAgPSBpdC5uZXh0KCk7IG5vcm1hbENvbXBsZXRpb24gPSBzdGVwLmRvbmU7IHJldHVybiBzdGVwOyB9LCBlOiBmdW5jdGlvbiBlKF9lMikgeyBkaWRFcnIgPSB0cnVlOyBlcnIgPSBfZTI7IH0sIGY6IGZ1bmN0aW9uIGYoKSB7IHRyeSB7IGlmICghbm9ybWFsQ29tcGxldGlvbiAmJiBpdFtcInJldHVyblwiXSAhPSBudWxsKSBpdFtcInJldHVyblwiXSgpOyB9IGZpbmFsbHkgeyBpZiAoZGlkRXJyKSB0aHJvdyBlcnI7IH0gfSB9OyB9XG5cbmZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvLCBtaW5MZW4pIHsgaWYgKCFvKSByZXR1cm47IGlmICh0eXBlb2YgbyA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IHZhciBuID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pLnNsaWNlKDgsIC0xKTsgaWYgKG4gPT09IFwiT2JqZWN0XCIgJiYgby5jb25zdHJ1Y3RvcikgbiA9IG8uY29uc3RydWN0b3IubmFtZTsgaWYgKG4gPT09IFwiTWFwXCIgfHwgbiA9PT0gXCJTZXRcIikgcmV0dXJuIEFycmF5LmZyb20obyk7IGlmIChuID09PSBcIkFyZ3VtZW50c1wiIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTsgfVxuXG5mdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheShhcnIsIGxlbikgeyBpZiAobGVuID09IG51bGwgfHwgbGVuID4gYXJyLmxlbmd0aCkgbGVuID0gYXJyLmxlbmd0aDsgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkobGVuKTsgaSA8IGxlbjsgaSsrKSB7IGFycjJbaV0gPSBhcnJbaV07IH0gcmV0dXJuIGFycjI7IH1cblxudmFyIF9yZXF1aXJlID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWwvaXRlcmFibGUuanMnKSxcbiAgICBpdGVyYWJsZUN1cnJ5ID0gX3JlcXVpcmUuaXRlcmFibGVDdXJyeTtcblxudmFyIF9yZXF1aXJlMiA9IHJlcXVpcmUoJy4uLyRpbnRlcmxlYXZlL2ludGVybGVhdmUuanMnKSxcbiAgICBfX2ludGVybGVhdmUgPSBfcmVxdWlyZTIuX19pbnRlcmxlYXZlO1xuXG5mdW5jdGlvbiBieUNvbXBhcmlzb24oX3JlZiwgYWxsKSB7XG4gIHZhciBjb21wYXJlLFxuICAgICAgY2FuZGlkYXRlLFxuICAgICAgX2xlbixcbiAgICAgIHBlZWtycyxcbiAgICAgIF9rZXksXG4gICAgICBfaXRlcmF0b3IsXG4gICAgICBfc3RlcCxcbiAgICAgIHBlZWtyLFxuICAgICAgX2FyZ3MgPSBhcmd1bWVudHM7XG5cbiAgcmV0dXJuIF9yZWdlbmVyYXRvclJ1bnRpbWUud3JhcChmdW5jdGlvbiBieUNvbXBhcmlzb24kKF9jb250ZXh0KSB7XG4gICAgd2hpbGUgKDEpIHtcbiAgICAgIHN3aXRjaCAoX2NvbnRleHQucHJldiA9IF9jb250ZXh0Lm5leHQpIHtcbiAgICAgICAgY2FzZSAwOlxuICAgICAgICAgIGNvbXBhcmUgPSBfcmVmLmNvbXBhcmU7XG5cbiAgICAgICAgICBmb3IgKF9sZW4gPSBfYXJncy5sZW5ndGgsIHBlZWtycyA9IG5ldyBBcnJheShfbGVuID4gMiA/IF9sZW4gLSAyIDogMCksIF9rZXkgPSAyOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICAgICAgICBwZWVrcnNbX2tleSAtIDJdID0gX2FyZ3NbX2tleV07XG4gICAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgICBpZiAoYWxsLmRvbmUpIHtcbiAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAxMTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNhbmRpZGF0ZSA9IGFsbC52YWx1ZTtcbiAgICAgICAgICBfaXRlcmF0b3IgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihwZWVrcnMpO1xuXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGZvciAoX2l0ZXJhdG9yLnMoKTsgIShfc3RlcCA9IF9pdGVyYXRvci5uKCkpLmRvbmU7KSB7XG4gICAgICAgICAgICAgIHBlZWtyID0gX3N0ZXAudmFsdWU7XG5cbiAgICAgICAgICAgICAgaWYgKCFwZWVrci5kb25lICYmIGNvbXBhcmUocGVla3IudmFsdWUsIGNhbmRpZGF0ZS52YWx1ZSkgPCAwKSB7XG4gICAgICAgICAgICAgICAgY2FuZGlkYXRlID0gcGVla3I7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIF9pdGVyYXRvci5lKGVycik7XG4gICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIF9pdGVyYXRvci5mKCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgX2NvbnRleHQubmV4dCA9IDg7XG4gICAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZS52YWx1ZTtcblxuICAgICAgICBjYXNlIDg6XG4gICAgICAgICAgY2FuZGlkYXRlLmFkdmFuY2UoKTtcbiAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMjtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIDExOlxuICAgICAgICBjYXNlIFwiZW5kXCI6XG4gICAgICAgICAgcmV0dXJuIF9jb250ZXh0LnN0b3AoKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIF9tYXJrZWQpO1xufVxuXG5mdW5jdGlvbiBfX2NvbGxhdGUoc291cmNlcywgY29tcGFyZSkge1xuICByZXR1cm4gX19pbnRlcmxlYXZlKHNvdXJjZXMsIGJ5Q29tcGFyaXNvbiwge1xuICAgIGNvbXBhcmU6IGNvbXBhcmVcbiAgfSk7XG59XG5cbmV4cG9ydHMuX19jb2xsYXRlID0gX19jb2xsYXRlO1xudmFyIGNvbGxhdGUgPSAvKiNfX1BVUkVfXyovaXRlcmFibGVDdXJyeShfX2NvbGxhdGUsIHtcbiAgdmFyaWFkaWM6IHRydWVcbn0pO1xuZXhwb3J0cy5jb2xsYXRlID0gY29sbGF0ZTsiLCJ2YXIgX3NsaWNlZFRvQXJyYXkgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9zbGljZWRUb0FycmF5XCIpO1xuXG52YXIgX3JlcXVpcmUgPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbC9hc3luYy1pdGVyYWJsZS5qcycpLFxuICAgIGFzeW5jRW5zdXJlSXRlcmFibGUgPSBfcmVxdWlyZS5hc3luY0Vuc3VyZUl0ZXJhYmxlO1xuXG52YXIgX3JlcXVpcmUyID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWwvY3VycnkuanMnKSxcbiAgICBjdXJyeSA9IF9yZXF1aXJlMi5jdXJyeTtcblxudmFyIF9yZXF1aXJlMyA9IHJlcXVpcmUoJy4uLyR6aXAvYXN5bmMtemlwLmpzJyksXG4gICAgX19hc3luY1ppcCA9IF9yZXF1aXJlMy5fX2FzeW5jWmlwO1xuXG52YXIgX3JlcXVpcmU0ID0gcmVxdWlyZSgnLi4vJGZpbHRlci9hc3luYy1maWx0ZXIuanMnKSxcbiAgICBfX2FzeW5jRmlsdGVyID0gX3JlcXVpcmU0Ll9fYXN5bmNGaWx0ZXI7XG5cbnZhciBfcmVxdWlyZTUgPSByZXF1aXJlKCcuLi8kbWFwL2FzeW5jLW1hcC5qcycpLFxuICAgIF9fYXN5bmNNYXAgPSBfcmVxdWlyZTUuX19hc3luY01hcDtcblxuZnVuY3Rpb24gX19hc3luY0NvbXByZXNzKHNvdXJjZSwgaW5jbHVkZWQpIHtcbiAgcmV0dXJuIF9fYXN5bmNNYXAoX19hc3luY0ZpbHRlcihfX2FzeW5jWmlwKFtzb3VyY2UsIGluY2x1ZGVkXSksIGZ1bmN0aW9uIChfcmVmKSB7XG4gICAgdmFyIF9yZWYyID0gX3NsaWNlZFRvQXJyYXkoX3JlZiwgMiksXG4gICAgICAgIGlzSW5jbHVkZWQgPSBfcmVmMlsxXTtcblxuICAgIHJldHVybiBpc0luY2x1ZGVkO1xuICB9KSwgZnVuY3Rpb24gKF9yZWYzKSB7XG4gICAgdmFyIF9yZWY0ID0gX3NsaWNlZFRvQXJyYXkoX3JlZjMsIDEpLFxuICAgICAgICB2YWx1ZSA9IF9yZWY0WzBdO1xuXG4gICAgcmV0dXJuIHZhbHVlO1xuICB9KTtcbn1cblxuZXhwb3J0cy5fX2FzeW5jQ29tcHJlc3MgPSBfX2FzeW5jQ29tcHJlc3M7XG52YXIgYXN5bmNDb21wcmVzcyA9IC8qI19fUFVSRV9fKi9jdXJyeShmdW5jdGlvbiAkY29tcHJlc3Moc291cmNlLCBpbmNsdWRlZCkge1xuICByZXR1cm4gX19hc3luY0NvbXByZXNzKGFzeW5jRW5zdXJlSXRlcmFibGUoc291cmNlKSwgYXN5bmNFbnN1cmVJdGVyYWJsZShpbmNsdWRlZCkpO1xufSk7XG5leHBvcnRzLmFzeW5jQ29tcHJlc3MgPSBhc3luY0NvbXByZXNzOyIsInZhciBfc2xpY2VkVG9BcnJheSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3NsaWNlZFRvQXJyYXlcIik7XG5cbnZhciBfcmVxdWlyZSA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFsL2l0ZXJhYmxlLmpzJyksXG4gICAgZW5zdXJlSXRlcmFibGUgPSBfcmVxdWlyZS5lbnN1cmVJdGVyYWJsZTtcblxudmFyIF9yZXF1aXJlMiA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFsL2N1cnJ5LmpzJyksXG4gICAgY3VycnkgPSBfcmVxdWlyZTIuY3Vycnk7XG5cbnZhciBfcmVxdWlyZTMgPSByZXF1aXJlKCcuLi8kemlwL3ppcC5qcycpLFxuICAgIF9femlwID0gX3JlcXVpcmUzLl9femlwO1xuXG52YXIgX3JlcXVpcmU0ID0gcmVxdWlyZSgnLi4vJGZpbHRlci9maWx0ZXIuanMnKSxcbiAgICBfX2ZpbHRlciA9IF9yZXF1aXJlNC5fX2ZpbHRlcjtcblxudmFyIF9yZXF1aXJlNSA9IHJlcXVpcmUoJy4uLyRtYXAvbWFwLmpzJyksXG4gICAgX19tYXAgPSBfcmVxdWlyZTUuX19tYXA7XG5cbmZ1bmN0aW9uIF9fY29tcHJlc3Moc291cmNlLCBpbmNsdWRlZCkge1xuICByZXR1cm4gX19tYXAoX19maWx0ZXIoX196aXAoW3NvdXJjZSwgaW5jbHVkZWRdKSwgZnVuY3Rpb24gKF9yZWYpIHtcbiAgICB2YXIgX3JlZjIgPSBfc2xpY2VkVG9BcnJheShfcmVmLCAyKSxcbiAgICAgICAgaXNJbmNsdWRlZCA9IF9yZWYyWzFdO1xuXG4gICAgcmV0dXJuIGlzSW5jbHVkZWQ7XG4gIH0pLCBmdW5jdGlvbiAoX3JlZjMpIHtcbiAgICB2YXIgX3JlZjQgPSBfc2xpY2VkVG9BcnJheShfcmVmMywgMSksXG4gICAgICAgIHZhbHVlID0gX3JlZjRbMF07XG5cbiAgICByZXR1cm4gdmFsdWU7XG4gIH0pO1xufVxuXG5leHBvcnRzLl9fY29tcHJlc3MgPSBfX2NvbXByZXNzO1xudmFyIGNvbXByZXNzID0gLyojX19QVVJFX18qL2N1cnJ5KGZ1bmN0aW9uICRjb21wcmVzcyhzb3VyY2UsIGluY2x1ZGVkKSB7XG4gIHJldHVybiBfX2NvbXByZXNzKGVuc3VyZUl0ZXJhYmxlKHNvdXJjZSksIGVuc3VyZUl0ZXJhYmxlKGluY2x1ZGVkKSk7XG59KTtcbmV4cG9ydHMuY29tcHJlc3MgPSBjb21wcmVzczsiLCJ2YXIgX3JlZ2VuZXJhdG9yUnVudGltZSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9yZWdlbmVyYXRvclwiKTtcblxudmFyIF93cmFwQXN5bmNHZW5lcmF0b3IgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy93cmFwQXN5bmNHZW5lcmF0b3JcIik7XG5cbnZhciBfYXdhaXRBc3luY0dlbmVyYXRvciA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2F3YWl0QXN5bmNHZW5lcmF0b3JcIik7XG5cbnZhciBfYXN5bmNJdGVyYXRvciA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2FzeW5jSXRlcmF0b3JcIik7XG5cbnZhciBfYXN5bmNHZW5lcmF0b3JEZWxlZ2F0ZSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2FzeW5jR2VuZXJhdG9yRGVsZWdhdGVcIik7XG5cbnZhciBfcmVxdWlyZSA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFsL2FzeW5jLWl0ZXJhYmxlLmpzJyksXG4gICAgYXN5bmNXcmFwV2l0aEl0ZXJhYmxlSXRlcmF0b3IgPSBfcmVxdWlyZS5hc3luY1dyYXBXaXRoSXRlcmFibGVJdGVyYXRvcixcbiAgICBhc3luY0Vuc3VyZUl0ZXJhYmxlID0gX3JlcXVpcmUuYXN5bmNFbnN1cmVJdGVyYWJsZTtcblxuZnVuY3Rpb24gX19hc3luY0NvbmNhdCgpIHtcbiAgcmV0dXJuIF9hc3luY0NvbmNhdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuXG5leHBvcnRzLl9fYXN5bmNDb25jYXQgPSBfX2FzeW5jQ29uY2F0O1xuXG5mdW5jdGlvbiBfYXN5bmNDb25jYXQoKSB7XG4gIF9hc3luY0NvbmNhdCA9IF93cmFwQXN5bmNHZW5lcmF0b3IoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3JSdW50aW1lLm1hcmsoZnVuY3Rpb24gX2NhbGxlZSgpIHtcbiAgICB2YXIgX2xlbixcbiAgICAgICAgc291cmNlcyxcbiAgICAgICAgX2tleSxcbiAgICAgICAgX2ksXG4gICAgICAgIF9zb3VyY2VzLFxuICAgICAgICBpdGVyYWJsZSxcbiAgICAgICAgX2FyZ3MgPSBhcmd1bWVudHM7XG5cbiAgICByZXR1cm4gX3JlZ2VuZXJhdG9yUnVudGltZS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUkKF9jb250ZXh0KSB7XG4gICAgICB3aGlsZSAoMSkge1xuICAgICAgICBzd2l0Y2ggKF9jb250ZXh0LnByZXYgPSBfY29udGV4dC5uZXh0KSB7XG4gICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgZm9yIChfbGVuID0gX2FyZ3MubGVuZ3RoLCBzb3VyY2VzID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgICAgICAgICBzb3VyY2VzW19rZXldID0gX2FyZ3NbX2tleV07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIF9pID0gMCwgX3NvdXJjZXMgPSBzb3VyY2VzO1xuXG4gICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgaWYgKCEoX2kgPCBfc291cmNlcy5sZW5ndGgpKSB7XG4gICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSA4O1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaXRlcmFibGUgPSBfc291cmNlc1tfaV07XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuZGVsZWdhdGVZaWVsZChfYXN5bmNHZW5lcmF0b3JEZWxlZ2F0ZShfYXN5bmNJdGVyYXRvcihhc3luY0Vuc3VyZUl0ZXJhYmxlKGl0ZXJhYmxlKSksIF9hd2FpdEFzeW5jR2VuZXJhdG9yKSwgXCJ0MFwiLCA1KTtcblxuICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgIF9pKys7XG4gICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMjtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSA4OlxuICAgICAgICAgIGNhc2UgXCJlbmRcIjpcbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5zdG9wKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCBfY2FsbGVlKTtcbiAgfSkpO1xuICByZXR1cm4gX2FzeW5jQ29uY2F0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5cbnZhciBhc3luY0NvbmNhdCA9IC8qI19fUFVSRV9fKi9hc3luY1dyYXBXaXRoSXRlcmFibGVJdGVyYXRvcihfX2FzeW5jQ29uY2F0KTtcbmV4cG9ydHMuYXN5bmNDb25jYXQgPSBhc3luY0NvbmNhdDsiLCJ2YXIgX3JlZ2VuZXJhdG9yUnVudGltZSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9yZWdlbmVyYXRvclwiKTtcblxudmFyIF9tYXJrZWQgPSAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yUnVudGltZS5tYXJrKF9fY29uY2F0KTtcblxudmFyIF9yZXF1aXJlID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWwvaXRlcmFibGUuanMnKSxcbiAgICB3cmFwV2l0aEl0ZXJhYmxlSXRlcmF0b3IgPSBfcmVxdWlyZS53cmFwV2l0aEl0ZXJhYmxlSXRlcmF0b3IsXG4gICAgZW5zdXJlSXRlcmFibGUgPSBfcmVxdWlyZS5lbnN1cmVJdGVyYWJsZTtcblxuZnVuY3Rpb24gX19jb25jYXQoKSB7XG4gIHZhciBfbGVuLFxuICAgICAgc291cmNlcyxcbiAgICAgIF9rZXksXG4gICAgICBfaSxcbiAgICAgIF9zb3VyY2VzLFxuICAgICAgaXRlcmFibGUsXG4gICAgICBfYXJncyA9IGFyZ3VtZW50cztcblxuICByZXR1cm4gX3JlZ2VuZXJhdG9yUnVudGltZS53cmFwKGZ1bmN0aW9uIF9fY29uY2F0JChfY29udGV4dCkge1xuICAgIHdoaWxlICgxKSB7XG4gICAgICBzd2l0Y2ggKF9jb250ZXh0LnByZXYgPSBfY29udGV4dC5uZXh0KSB7XG4gICAgICAgIGNhc2UgMDpcbiAgICAgICAgICBmb3IgKF9sZW4gPSBfYXJncy5sZW5ndGgsIHNvdXJjZXMgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICAgICAgICBzb3VyY2VzW19rZXldID0gX2FyZ3NbX2tleV07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgX2kgPSAwLCBfc291cmNlcyA9IHNvdXJjZXM7XG5cbiAgICAgICAgY2FzZSAyOlxuICAgICAgICAgIGlmICghKF9pIDwgX3NvdXJjZXMubGVuZ3RoKSkge1xuICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDg7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpdGVyYWJsZSA9IF9zb3VyY2VzW19pXTtcbiAgICAgICAgICByZXR1cm4gX2NvbnRleHQuZGVsZWdhdGVZaWVsZChlbnN1cmVJdGVyYWJsZShpdGVyYWJsZSksIFwidDBcIiwgNSk7XG5cbiAgICAgICAgY2FzZSA1OlxuICAgICAgICAgIF9pKys7XG4gICAgICAgICAgX2NvbnRleHQubmV4dCA9IDI7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSA4OlxuICAgICAgICBjYXNlIFwiZW5kXCI6XG4gICAgICAgICAgcmV0dXJuIF9jb250ZXh0LnN0b3AoKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIF9tYXJrZWQpO1xufVxuXG5leHBvcnRzLl9fY29uY2F0ID0gX19jb25jYXQ7XG52YXIgY29uY2F0ID0gLyojX19QVVJFX18qL3dyYXBXaXRoSXRlcmFibGVJdGVyYXRvcihfX2NvbmNhdCk7XG5leHBvcnRzLmNvbmNhdCA9IGNvbmNhdDsiLCJ2YXIgX3JlZ2VuZXJhdG9yUnVudGltZSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9yZWdlbmVyYXRvclwiKTtcblxudmFyIF9hc3luY1RvR2VuZXJhdG9yID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvYXN5bmNUb0dlbmVyYXRvclwiKTtcblxudmFyIF9hc3luY0l0ZXJhdG9yID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvYXN5bmNJdGVyYXRvclwiKTtcblxudmFyIF9yZXF1aXJlID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWwvYXN5bmMtaXRlcmFibGUuanMnKSxcbiAgICBhc3luY0l0ZXJhYmxlQ3VycnkgPSBfcmVxdWlyZS5hc3luY0l0ZXJhYmxlQ3Vycnk7XG5cbmZ1bmN0aW9uIF9fYXN5bmNDb25zdW1lKF94KSB7XG4gIHJldHVybiBfYXN5bmNDb25zdW1lLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5cbmZ1bmN0aW9uIF9hc3luY0NvbnN1bWUoKSB7XG4gIF9hc3luY0NvbnN1bWUgPSBfYXN5bmNUb0dlbmVyYXRvciggLyojX19QVVJFX18qL19yZWdlbmVyYXRvclJ1bnRpbWUubWFyayhmdW5jdGlvbiBfY2FsbGVlKGl0ZXJhYmxlKSB7XG4gICAgdmFyIF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24sIF9kaWRJdGVyYXRvckVycm9yLCBfaXRlcmF0b3JFcnJvciwgX2l0ZXJhdG9yLCBfc3RlcCwgX3ZhbHVlLCBfO1xuXG4gICAgcmV0dXJuIF9yZWdlbmVyYXRvclJ1bnRpbWUud3JhcChmdW5jdGlvbiBfY2FsbGVlJChfY29udGV4dCkge1xuICAgICAgd2hpbGUgKDEpIHtcbiAgICAgICAgc3dpdGNoIChfY29udGV4dC5wcmV2ID0gX2NvbnRleHQubmV4dCkge1xuICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgIF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24gPSB0cnVlO1xuICAgICAgICAgICAgX2RpZEl0ZXJhdG9yRXJyb3IgPSBmYWxzZTtcbiAgICAgICAgICAgIF9jb250ZXh0LnByZXYgPSAyO1xuICAgICAgICAgICAgX2l0ZXJhdG9yID0gX2FzeW5jSXRlcmF0b3IoaXRlcmFibGUpO1xuXG4gICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDY7XG4gICAgICAgICAgICByZXR1cm4gX2l0ZXJhdG9yLm5leHQoKTtcblxuICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgIF9zdGVwID0gX2NvbnRleHQuc2VudDtcbiAgICAgICAgICAgIF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24gPSBfc3RlcC5kb25lO1xuICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDEwO1xuICAgICAgICAgICAgcmV0dXJuIF9zdGVwLnZhbHVlO1xuXG4gICAgICAgICAgY2FzZSAxMDpcbiAgICAgICAgICAgIF92YWx1ZSA9IF9jb250ZXh0LnNlbnQ7XG5cbiAgICAgICAgICAgIGlmIChfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uKSB7XG4gICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAxNjtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIF8gPSBfdmFsdWU7XG5cbiAgICAgICAgICBjYXNlIDEzOlxuICAgICAgICAgICAgX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbiA9IHRydWU7XG4gICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gNDtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSAxNjpcbiAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAyMjtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSAxODpcbiAgICAgICAgICAgIF9jb250ZXh0LnByZXYgPSAxODtcbiAgICAgICAgICAgIF9jb250ZXh0LnQwID0gX2NvbnRleHRbXCJjYXRjaFwiXSgyKTtcbiAgICAgICAgICAgIF9kaWRJdGVyYXRvckVycm9yID0gdHJ1ZTtcbiAgICAgICAgICAgIF9pdGVyYXRvckVycm9yID0gX2NvbnRleHQudDA7XG5cbiAgICAgICAgICBjYXNlIDIyOlxuICAgICAgICAgICAgX2NvbnRleHQucHJldiA9IDIyO1xuICAgICAgICAgICAgX2NvbnRleHQucHJldiA9IDIzO1xuXG4gICAgICAgICAgICBpZiAoISghX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbiAmJiBfaXRlcmF0b3JbXCJyZXR1cm5cIl0gIT0gbnVsbCkpIHtcbiAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDI3O1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDI3O1xuICAgICAgICAgICAgcmV0dXJuIF9pdGVyYXRvcltcInJldHVyblwiXSgpO1xuXG4gICAgICAgICAgY2FzZSAyNzpcbiAgICAgICAgICAgIF9jb250ZXh0LnByZXYgPSAyNztcblxuICAgICAgICAgICAgaWYgKCFfZGlkSXRlcmF0b3JFcnJvcikge1xuICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMzA7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aHJvdyBfaXRlcmF0b3JFcnJvcjtcblxuICAgICAgICAgIGNhc2UgMzA6XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuZmluaXNoKDI3KTtcblxuICAgICAgICAgIGNhc2UgMzE6XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuZmluaXNoKDIyKTtcblxuICAgICAgICAgIGNhc2UgMzI6XG4gICAgICAgICAgY2FzZSBcImVuZFwiOlxuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LnN0b3AoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sIF9jYWxsZWUsIG51bGwsIFtbMiwgMTgsIDIyLCAzMl0sIFsyMywsIDI3LCAzMV1dKTtcbiAgfSkpO1xuICByZXR1cm4gX2FzeW5jQ29uc3VtZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuXG5leHBvcnRzLl9fYXN5bmNDb25zdW1lID0gX19hc3luY0NvbnN1bWU7XG52YXIgYXN5bmNDb25zdW1lID0gLyojX19QVVJFX18qL2FzeW5jSXRlcmFibGVDdXJyeShfX2FzeW5jQ29uc3VtZSwge1xuICByZWR1Y2VzOiB0cnVlXG59KTtcbmV4cG9ydHMuYXN5bmNDb25zdW1lID0gYXN5bmNDb25zdW1lOyIsImZ1bmN0aW9uIF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKG8sIGFsbG93QXJyYXlMaWtlKSB7IHZhciBpdDsgaWYgKHR5cGVvZiBTeW1ib2wgPT09IFwidW5kZWZpbmVkXCIgfHwgb1tTeW1ib2wuaXRlcmF0b3JdID09IG51bGwpIHsgaWYgKEFycmF5LmlzQXJyYXkobykgfHwgKGl0ID0gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8pKSB8fCBhbGxvd0FycmF5TGlrZSAmJiBvICYmIHR5cGVvZiBvLmxlbmd0aCA9PT0gXCJudW1iZXJcIikgeyBpZiAoaXQpIG8gPSBpdDsgdmFyIGkgPSAwOyB2YXIgRiA9IGZ1bmN0aW9uIEYoKSB7fTsgcmV0dXJuIHsgczogRiwgbjogZnVuY3Rpb24gbigpIHsgaWYgKGkgPj0gby5sZW5ndGgpIHJldHVybiB7IGRvbmU6IHRydWUgfTsgcmV0dXJuIHsgZG9uZTogZmFsc2UsIHZhbHVlOiBvW2krK10gfTsgfSwgZTogZnVuY3Rpb24gZShfZSkgeyB0aHJvdyBfZTsgfSwgZjogRiB9OyB9IHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gaXRlcmF0ZSBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTsgfSB2YXIgbm9ybWFsQ29tcGxldGlvbiA9IHRydWUsIGRpZEVyciA9IGZhbHNlLCBlcnI7IHJldHVybiB7IHM6IGZ1bmN0aW9uIHMoKSB7IGl0ID0gb1tTeW1ib2wuaXRlcmF0b3JdKCk7IH0sIG46IGZ1bmN0aW9uIG4oKSB7IHZhciBzdGVwID0gaXQubmV4dCgpOyBub3JtYWxDb21wbGV0aW9uID0gc3RlcC5kb25lOyByZXR1cm4gc3RlcDsgfSwgZTogZnVuY3Rpb24gZShfZTIpIHsgZGlkRXJyID0gdHJ1ZTsgZXJyID0gX2UyOyB9LCBmOiBmdW5jdGlvbiBmKCkgeyB0cnkgeyBpZiAoIW5vcm1hbENvbXBsZXRpb24gJiYgaXRbXCJyZXR1cm5cIl0gIT0gbnVsbCkgaXRbXCJyZXR1cm5cIl0oKTsgfSBmaW5hbGx5IHsgaWYgKGRpZEVycikgdGhyb3cgZXJyOyB9IH0gfTsgfVxuXG5mdW5jdGlvbiBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkobywgbWluTGVuKSB7IGlmICghbykgcmV0dXJuOyBpZiAodHlwZW9mIG8gPT09IFwic3RyaW5nXCIpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pOyB2YXIgbiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKS5zbGljZSg4LCAtMSk7IGlmIChuID09PSBcIk9iamVjdFwiICYmIG8uY29uc3RydWN0b3IpIG4gPSBvLmNvbnN0cnVjdG9yLm5hbWU7IGlmIChuID09PSBcIk1hcFwiIHx8IG4gPT09IFwiU2V0XCIpIHJldHVybiBBcnJheS5mcm9tKG8pOyBpZiAobiA9PT0gXCJBcmd1bWVudHNcIiB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSkgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IH1cblxuZnVuY3Rpb24gX2FycmF5TGlrZVRvQXJyYXkoYXJyLCBsZW4pIHsgaWYgKGxlbiA9PSBudWxsIHx8IGxlbiA+IGFyci5sZW5ndGgpIGxlbiA9IGFyci5sZW5ndGg7IGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGxlbik7IGkgPCBsZW47IGkrKykgeyBhcnIyW2ldID0gYXJyW2ldOyB9IHJldHVybiBhcnIyOyB9XG5cbnZhciBfcmVxdWlyZSA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFsL2l0ZXJhYmxlLmpzJyksXG4gICAgaXRlcmFibGVDdXJyeSA9IF9yZXF1aXJlLml0ZXJhYmxlQ3Vycnk7XG5cbmZ1bmN0aW9uIF9fY29uc3VtZShpdGVyYWJsZSkge1xuICB2YXIgX2l0ZXJhdG9yID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIoaXRlcmFibGUpLFxuICAgICAgX3N0ZXA7XG5cbiAgdHJ5IHtcbiAgICBmb3IgKF9pdGVyYXRvci5zKCk7ICEoX3N0ZXAgPSBfaXRlcmF0b3IubigpKS5kb25lOykge1xuICAgICAgdmFyIF8gPSBfc3RlcC52YWx1ZTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIF9pdGVyYXRvci5lKGVycik7XG4gIH0gZmluYWxseSB7XG4gICAgX2l0ZXJhdG9yLmYoKTtcbiAgfVxufVxuXG5leHBvcnRzLl9fY29uc3VtZSA9IF9fY29uc3VtZTtcbnZhciBjb25zdW1lID0gLyojX19QVVJFX18qL2l0ZXJhYmxlQ3VycnkoX19jb25zdW1lLCB7XG4gIHJlZHVjZXM6IHRydWVcbn0pO1xuZXhwb3J0cy5jb25zdW1lID0gY29uc3VtZTsiLCJ2YXIgX3JlZ2VuZXJhdG9yUnVudGltZSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9yZWdlbmVyYXRvclwiKTtcblxudmFyIF93cmFwQXN5bmNHZW5lcmF0b3IgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy93cmFwQXN5bmNHZW5lcmF0b3JcIik7XG5cbnZhciBfYXdhaXRBc3luY0dlbmVyYXRvciA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2F3YWl0QXN5bmNHZW5lcmF0b3JcIik7XG5cbnZhciBfYXN5bmNJdGVyYXRvciA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2FzeW5jSXRlcmF0b3JcIik7XG5cbnZhciBfYXN5bmNHZW5lcmF0b3JEZWxlZ2F0ZSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2FzeW5jR2VuZXJhdG9yRGVsZWdhdGVcIik7XG5cbnZhciBfcmVxdWlyZSA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFsL2FzeW5jLWl0ZXJhYmxlLmpzJyksXG4gICAgYXN5bmNJdGVyYWJsZUN1cnJ5ID0gX3JlcXVpcmUuYXN5bmNJdGVyYWJsZUN1cnJ5O1xuXG52YXIgX3JlcXVpcmUyID0gcmVxdWlyZSgnLi4vJHRvLWFycmF5L2FzeW5jLXRvLWFycmF5LmpzJyksXG4gICAgX19hc3luY1RvQXJyYXkgPSBfcmVxdWlyZTIuX19hc3luY1RvQXJyYXk7XG5cbnZhciBfcmVxdWlyZTMgPSByZXF1aXJlKCcuL2N5Y2xlLXRpbWVzLmpzJyksXG4gICAgX19jeWNsZVRpbWVzID0gX3JlcXVpcmUzLl9fY3ljbGVUaW1lcztcblxuZnVuY3Rpb24gX19hc3luY0N5Y2xlVGltZXMoX3gsIF94Mikge1xuICByZXR1cm4gX2FzeW5jQ3ljbGVUaW1lcy5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuXG5leHBvcnRzLl9fYXN5bmNDeWNsZVRpbWVzID0gX19hc3luY0N5Y2xlVGltZXM7XG5cbmZ1bmN0aW9uIF9hc3luY0N5Y2xlVGltZXMoKSB7XG4gIF9hc3luY0N5Y2xlVGltZXMgPSBfd3JhcEFzeW5jR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yUnVudGltZS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUoc291cmNlLCBuKSB7XG4gICAgcmV0dXJuIF9yZWdlbmVyYXRvclJ1bnRpbWUud3JhcChmdW5jdGlvbiBfY2FsbGVlJChfY29udGV4dCkge1xuICAgICAgd2hpbGUgKDEpIHtcbiAgICAgICAgc3dpdGNoIChfY29udGV4dC5wcmV2ID0gX2NvbnRleHQubmV4dCkge1xuICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgIF9jb250ZXh0LnQwID0gX2FzeW5jR2VuZXJhdG9yRGVsZWdhdGU7XG4gICAgICAgICAgICBfY29udGV4dC50MSA9IF9hc3luY0l0ZXJhdG9yO1xuICAgICAgICAgICAgX2NvbnRleHQudDIgPSBfX2N5Y2xlVGltZXM7XG4gICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gNTtcbiAgICAgICAgICAgIHJldHVybiBfYXdhaXRBc3luY0dlbmVyYXRvcihfX2FzeW5jVG9BcnJheShzb3VyY2UpKTtcblxuICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgIF9jb250ZXh0LnQzID0gX2NvbnRleHQuc2VudDtcbiAgICAgICAgICAgIF9jb250ZXh0LnQ0ID0gbjtcbiAgICAgICAgICAgIF9jb250ZXh0LnQ1ID0gKDAsIF9jb250ZXh0LnQyKShfY29udGV4dC50MywgX2NvbnRleHQudDQpO1xuICAgICAgICAgICAgX2NvbnRleHQudDYgPSAoMCwgX2NvbnRleHQudDEpKF9jb250ZXh0LnQ1KTtcbiAgICAgICAgICAgIF9jb250ZXh0LnQ3ID0gX2F3YWl0QXN5bmNHZW5lcmF0b3I7XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuZGVsZWdhdGVZaWVsZCgoMCwgX2NvbnRleHQudDApKF9jb250ZXh0LnQ2LCBfY29udGV4dC50NyksIFwidDhcIiwgMTEpO1xuXG4gICAgICAgICAgY2FzZSAxMTpcbiAgICAgICAgICBjYXNlIFwiZW5kXCI6XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuc3RvcCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwgX2NhbGxlZSk7XG4gIH0pKTtcbiAgcmV0dXJuIF9hc3luY0N5Y2xlVGltZXMuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cblxudmFyIGFzeW5jQ3ljbGVUaW1lcyA9IC8qI19fUFVSRV9fKi9hc3luY0l0ZXJhYmxlQ3VycnkoX19hc3luY0N5Y2xlVGltZXMpO1xuZXhwb3J0cy5hc3luY0N5Y2xlVGltZXMgPSBhc3luY0N5Y2xlVGltZXM7IiwidmFyIF9yZWdlbmVyYXRvclJ1bnRpbWUgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvcmVnZW5lcmF0b3JcIik7XG5cbnZhciBfbWFya2VkID0gLyojX19QVVJFX18qL19yZWdlbmVyYXRvclJ1bnRpbWUubWFyayhfX2N5Y2xlVGltZXMpO1xuXG52YXIgX3JlcXVpcmUgPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbC9pdGVyYWJsZS5qcycpLFxuICAgIGl0ZXJhYmxlQ3VycnkgPSBfcmVxdWlyZS5pdGVyYWJsZUN1cnJ5O1xuXG52YXIgX3JlcXVpcmUyID0gcmVxdWlyZSgnLi4vJHRvLWFycmF5L3RvLWFycmF5LmpzJyksXG4gICAgX190b0FycmF5ID0gX3JlcXVpcmUyLl9fdG9BcnJheTtcblxuZnVuY3Rpb24gX19jeWNsZVRpbWVzKHNvdXJjZSwgbikge1xuICB2YXIgYXJyO1xuICByZXR1cm4gX3JlZ2VuZXJhdG9yUnVudGltZS53cmFwKGZ1bmN0aW9uIF9fY3ljbGVUaW1lcyQoX2NvbnRleHQpIHtcbiAgICB3aGlsZSAoMSkge1xuICAgICAgc3dpdGNoIChfY29udGV4dC5wcmV2ID0gX2NvbnRleHQubmV4dCkge1xuICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgYXJyID0gQXJyYXkuaXNBcnJheShzb3VyY2UpID8gc291cmNlIDogX190b0FycmF5KHNvdXJjZSk7XG5cbiAgICAgICAgICBpZiAoYXJyLmxlbmd0aCkge1xuICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDM7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gX2NvbnRleHQuYWJydXB0KFwicmV0dXJuXCIpO1xuXG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgICBpZiAoIW4tLSkge1xuICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDc7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gX2NvbnRleHQuZGVsZWdhdGVZaWVsZChhcnIsIFwidDBcIiwgNSk7XG5cbiAgICAgICAgY2FzZSA1OlxuICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAzO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgNzpcbiAgICAgICAgY2FzZSBcImVuZFwiOlxuICAgICAgICAgIHJldHVybiBfY29udGV4dC5zdG9wKCk7XG4gICAgICB9XG4gICAgfVxuICB9LCBfbWFya2VkKTtcbn1cblxuZXhwb3J0cy5fX2N5Y2xlVGltZXMgPSBfX2N5Y2xlVGltZXM7XG52YXIgY3ljbGVUaW1lcyA9IC8qI19fUFVSRV9fKi9pdGVyYWJsZUN1cnJ5KF9fY3ljbGVUaW1lcyk7XG5leHBvcnRzLmN5Y2xlVGltZXMgPSBjeWNsZVRpbWVzOyIsInZhciBfcmVxdWlyZSA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFsL2FzeW5jLWl0ZXJhYmxlLmpzJyksXG4gICAgYXN5bmNJdGVyYWJsZUN1cnJ5ID0gX3JlcXVpcmUuYXN5bmNJdGVyYWJsZUN1cnJ5O1xuXG52YXIgX3JlcXVpcmUyID0gcmVxdWlyZSgnLi4vJGN5Y2xlLXRpbWVzL2FzeW5jLWN5Y2xlLXRpbWVzLmpzJyksXG4gICAgX19hc3luY0N5Y2xlVGltZXMgPSBfcmVxdWlyZTIuX19hc3luY0N5Y2xlVGltZXM7XG5cbmZ1bmN0aW9uIF9fYXN5bmNDeWNsZShzb3VyY2UpIHtcbiAgcmV0dXJuIF9fYXN5bmNDeWNsZVRpbWVzKHNvdXJjZSwgSW5maW5pdHkpO1xufVxuXG5leHBvcnRzLl9fYXN5bmNDeWNsZSA9IF9fYXN5bmNDeWNsZTtcbnZhciBhc3luY0N5Y2xlID0gLyojX19QVVJFX18qL2FzeW5jSXRlcmFibGVDdXJyeShfX2FzeW5jQ3ljbGUpO1xuZXhwb3J0cy5hc3luY0N5Y2xlID0gYXN5bmNDeWNsZTsiLCJ2YXIgX3JlcXVpcmUgPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbC9pdGVyYWJsZS5qcycpLFxuICAgIGl0ZXJhYmxlQ3VycnkgPSBfcmVxdWlyZS5pdGVyYWJsZUN1cnJ5O1xuXG52YXIgX3JlcXVpcmUyID0gcmVxdWlyZSgnLi4vJGN5Y2xlLXRpbWVzL2N5Y2xlLXRpbWVzLmpzJyksXG4gICAgX19jeWNsZVRpbWVzID0gX3JlcXVpcmUyLl9fY3ljbGVUaW1lcztcblxuZnVuY3Rpb24gX19jeWNsZShzb3VyY2UpIHtcbiAgcmV0dXJuIF9fY3ljbGVUaW1lcyhzb3VyY2UsIEluZmluaXR5KTtcbn1cblxuZXhwb3J0cy5fX2N5Y2xlID0gX19jeWNsZTtcbnZhciBjeWNsZSA9IC8qI19fUFVSRV9fKi9pdGVyYWJsZUN1cnJ5KF9fY3ljbGUpO1xuZXhwb3J0cy5jeWNsZSA9IGN5Y2xlOyIsInZhciBfYXN5bmNUb0dlbmVyYXRvciA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2FzeW5jVG9HZW5lcmF0b3JcIik7XG5cbnZhciBfcmVnZW5lcmF0b3JSdW50aW1lID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL3JlZ2VuZXJhdG9yXCIpO1xuXG5mdW5jdGlvbiBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihvLCBhbGxvd0FycmF5TGlrZSkgeyB2YXIgaXQ7IGlmICh0eXBlb2YgU3ltYm9sID09PSBcInVuZGVmaW5lZFwiIHx8IG9bU3ltYm9sLml0ZXJhdG9yXSA9PSBudWxsKSB7IGlmIChBcnJheS5pc0FycmF5KG8pIHx8IChpdCA9IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvKSkgfHwgYWxsb3dBcnJheUxpa2UgJiYgbyAmJiB0eXBlb2Ygby5sZW5ndGggPT09IFwibnVtYmVyXCIpIHsgaWYgKGl0KSBvID0gaXQ7IHZhciBpID0gMDsgdmFyIEYgPSBmdW5jdGlvbiBGKCkge307IHJldHVybiB7IHM6IEYsIG46IGZ1bmN0aW9uIG4oKSB7IGlmIChpID49IG8ubGVuZ3RoKSByZXR1cm4geyBkb25lOiB0cnVlIH07IHJldHVybiB7IGRvbmU6IGZhbHNlLCB2YWx1ZTogb1tpKytdIH07IH0sIGU6IGZ1bmN0aW9uIGUoX2UpIHsgdGhyb3cgX2U7IH0sIGY6IEYgfTsgfSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIGl0ZXJhdGUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIik7IH0gdmFyIG5vcm1hbENvbXBsZXRpb24gPSB0cnVlLCBkaWRFcnIgPSBmYWxzZSwgZXJyOyByZXR1cm4geyBzOiBmdW5jdGlvbiBzKCkgeyBpdCA9IG9bU3ltYm9sLml0ZXJhdG9yXSgpOyB9LCBuOiBmdW5jdGlvbiBuKCkgeyB2YXIgc3RlcCA9IGl0Lm5leHQoKTsgbm9ybWFsQ29tcGxldGlvbiA9IHN0ZXAuZG9uZTsgcmV0dXJuIHN0ZXA7IH0sIGU6IGZ1bmN0aW9uIGUoX2UyKSB7IGRpZEVyciA9IHRydWU7IGVyciA9IF9lMjsgfSwgZjogZnVuY3Rpb24gZigpIHsgdHJ5IHsgaWYgKCFub3JtYWxDb21wbGV0aW9uICYmIGl0W1wicmV0dXJuXCJdICE9IG51bGwpIGl0W1wicmV0dXJuXCJdKCk7IH0gZmluYWxseSB7IGlmIChkaWRFcnIpIHRocm93IGVycjsgfSB9IH07IH1cblxuZnVuY3Rpb24gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8sIG1pbkxlbikgeyBpZiAoIW8pIHJldHVybjsgaWYgKHR5cGVvZiBvID09PSBcInN0cmluZ1wiKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTsgdmFyIG4gPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykuc2xpY2UoOCwgLTEpOyBpZiAobiA9PT0gXCJPYmplY3RcIiAmJiBvLmNvbnN0cnVjdG9yKSBuID0gby5jb25zdHJ1Y3Rvci5uYW1lOyBpZiAobiA9PT0gXCJNYXBcIiB8fCBuID09PSBcIlNldFwiKSByZXR1cm4gQXJyYXkuZnJvbShvKTsgaWYgKG4gPT09IFwiQXJndW1lbnRzXCIgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QobikpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pOyB9XG5cbmZ1bmN0aW9uIF9hcnJheUxpa2VUb0FycmF5KGFyciwgbGVuKSB7IGlmIChsZW4gPT0gbnVsbCB8fCBsZW4gPiBhcnIubGVuZ3RoKSBsZW4gPSBhcnIubGVuZ3RoOyBmb3IgKHZhciBpID0gMCwgYXJyMiA9IG5ldyBBcnJheShsZW4pOyBpIDwgbGVuOyBpKyspIHsgYXJyMltpXSA9IGFycltpXTsgfSByZXR1cm4gYXJyMjsgfVxuXG52YXIgX2FzeW5jSXRlcmF0b3IgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9hc3luY0l0ZXJhdG9yXCIpO1xuXG52YXIgX2F3YWl0QXN5bmNHZW5lcmF0b3IgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9hd2FpdEFzeW5jR2VuZXJhdG9yXCIpO1xuXG52YXIgX3dyYXBBc3luY0dlbmVyYXRvciA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3dyYXBBc3luY0dlbmVyYXRvclwiKTtcblxudmFyIF9yZXF1aXJlID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWwvYXN5bmMtaXRlcmFibGUuanMnKSxcbiAgICBhc3luY0lzSXRlcmFibGUgPSBfcmVxdWlyZS5hc3luY0lzSXRlcmFibGUsXG4gICAgYXN5bmNJc1dyYXBwYWJsZSA9IF9yZXF1aXJlLmFzeW5jSXNXcmFwcGFibGU7XG5cbnZhciBfcmVxdWlyZTIgPSByZXF1aXJlKCcuLi8kbWFwL21hcC5qcycpLFxuICAgIF9fbWFwID0gX3JlcXVpcmUyLl9fbWFwO1xuXG52YXIgX3JlcXVpcmUzID0gcmVxdWlyZSgnLi4vJGV2ZXJ5L2V2ZXJ5LmpzJyksXG4gICAgX19ldmVyeSA9IF9yZXF1aXJlMy5fX2V2ZXJ5O1xuXG52YXIgX3JlcXVpcmU0ID0gcmVxdWlyZSgnLi4vJHppcC1hbGwvYXN5bmMtemlwLWFsbC5qcycpLFxuICAgIF9fYXN5bmNaaXBBbGwgPSBfcmVxdWlyZTQuX19hc3luY1ppcEFsbDtcblxudmFyIF9yZXF1aXJlNSA9IHJlcXVpcmUoJy4uLyRzbGljZS9zbGljZS5qcycpLFxuICAgIF9fc2xpY2VGcm9tU3RhcnQgPSBfcmVxdWlyZTUuX19zbGljZUZyb21TdGFydDtcblxudmFyIG5vbmUgPSBTeW1ib2woJ25vbmUnKTtcbnZhciB6aXBBbGxDb25maWcgPSB7XG4gIGZpbGxlcjogbm9uZVxufTtcblxudmFyIGFzeW5jRW1wdHkgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICB2YXIgX3JlZiA9IF93cmFwQXN5bmNHZW5lcmF0b3IoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3JSdW50aW1lLm1hcmsoZnVuY3Rpb24gX2NhbGxlZSgpIHtcbiAgICByZXR1cm4gX3JlZ2VuZXJhdG9yUnVudGltZS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUkKF9jb250ZXh0KSB7XG4gICAgICB3aGlsZSAoMSkge1xuICAgICAgICBzd2l0Y2ggKF9jb250ZXh0LnByZXYgPSBfY29udGV4dC5uZXh0KSB7XG4gICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgIGNhc2UgXCJlbmRcIjpcbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5zdG9wKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCBfY2FsbGVlKTtcbiAgfSkpO1xuXG4gIHJldHVybiBmdW5jdGlvbiBhc3luY0VtcHR5KCkge1xuICAgIHJldHVybiBfcmVmLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH07XG59KCk7XG5cbnZhciBhc3luY0l0ZXJhYmxlT3JFbXB0eSA9IGZ1bmN0aW9uIGFzeW5jSXRlcmFibGVPckVtcHR5KHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSA9PSBudWxsID8gYXN5bmNFbXB0eSgpIDogdmFsdWU7XG59O1xuXG5mdW5jdGlvbiBfYXN5bmNEZWVwRXF1YWwoX3gsIF94MiwgX3gzKSB7XG4gIHJldHVybiBfYXN5bmNEZWVwRXF1YWwyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5cbmZ1bmN0aW9uIF9hc3luY0RlZXBFcXVhbDIoKSB7XG4gIF9hc3luY0RlZXBFcXVhbDIgPSBfYXN5bmNUb0dlbmVyYXRvciggLyojX19QVVJFX18qL19yZWdlbmVyYXRvclJ1bnRpbWUubWFyayhmdW5jdGlvbiBfY2FsbGVlMih2YWx1ZXMsIHNhbWUsIGlzSXRlcmFibGUpIHtcbiAgICB2YXIgZGVwdGgsXG4gICAgICAgIF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24sXG4gICAgICAgIF9kaWRJdGVyYXRvckVycm9yLFxuICAgICAgICBfaXRlcmF0b3JFcnJvcixcbiAgICAgICAgX2l0ZXJhdG9yLFxuICAgICAgICBfc3RlcCxcbiAgICAgICAgX3ZhbHVlLFxuICAgICAgICBzdGVwVmFsdWVzLFxuICAgICAgICBmaXJzdFZhbHVlLFxuICAgICAgICBfaXRlcmF0b3IyLFxuICAgICAgICBfc3RlcDIsXG4gICAgICAgIHZhbHVlLFxuICAgICAgICBfYXJnczIgPSBhcmd1bWVudHM7XG5cbiAgICByZXR1cm4gX3JlZ2VuZXJhdG9yUnVudGltZS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUyJChfY29udGV4dDIpIHtcbiAgICAgIHdoaWxlICgxKSB7XG4gICAgICAgIHN3aXRjaCAoX2NvbnRleHQyLnByZXYgPSBfY29udGV4dDIubmV4dCkge1xuICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgIGRlcHRoID0gX2FyZ3MyLmxlbmd0aCA+IDMgJiYgX2FyZ3MyWzNdICE9PSB1bmRlZmluZWQgPyBfYXJnczJbM10gOiAwO1xuXG4gICAgICAgICAgICBpZiAoIV9fZXZlcnkodmFsdWVzLCBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycgJiYgaXNJdGVyYWJsZSh2YWx1ZSk7XG4gICAgICAgICAgICB9KSkge1xuICAgICAgICAgICAgICBfY29udGV4dDIubmV4dCA9IDQwO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbiA9IHRydWU7XG4gICAgICAgICAgICBfZGlkSXRlcmF0b3JFcnJvciA9IGZhbHNlO1xuICAgICAgICAgICAgX2NvbnRleHQyLnByZXYgPSA0O1xuICAgICAgICAgICAgX2l0ZXJhdG9yID0gX2FzeW5jSXRlcmF0b3IoX19hc3luY1ppcEFsbChfX21hcCh2YWx1ZXMsIGFzeW5jSXRlcmFibGVPckVtcHR5KSwgemlwQWxsQ29uZmlnKSk7XG5cbiAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICBfY29udGV4dDIubmV4dCA9IDg7XG4gICAgICAgICAgICByZXR1cm4gX2l0ZXJhdG9yLm5leHQoKTtcblxuICAgICAgICAgIGNhc2UgODpcbiAgICAgICAgICAgIF9zdGVwID0gX2NvbnRleHQyLnNlbnQ7XG4gICAgICAgICAgICBfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uID0gX3N0ZXAuZG9uZTtcbiAgICAgICAgICAgIF9jb250ZXh0Mi5uZXh0ID0gMTI7XG4gICAgICAgICAgICByZXR1cm4gX3N0ZXAudmFsdWU7XG5cbiAgICAgICAgICBjYXNlIDEyOlxuICAgICAgICAgICAgX3ZhbHVlID0gX2NvbnRleHQyLnNlbnQ7XG5cbiAgICAgICAgICAgIGlmIChfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uKSB7XG4gICAgICAgICAgICAgIF9jb250ZXh0Mi5uZXh0ID0gMjI7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzdGVwVmFsdWVzID0gX3ZhbHVlO1xuICAgICAgICAgICAgX2NvbnRleHQyLm5leHQgPSAxNztcbiAgICAgICAgICAgIHJldHVybiBfYXN5bmNEZWVwRXF1YWwoc3RlcFZhbHVlcywgc2FtZSwgaXNJdGVyYWJsZSwgZGVwdGggKyAxKTtcblxuICAgICAgICAgIGNhc2UgMTc6XG4gICAgICAgICAgICBpZiAoX2NvbnRleHQyLnNlbnQpIHtcbiAgICAgICAgICAgICAgX2NvbnRleHQyLm5leHQgPSAxOTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dDIuYWJydXB0KFwicmV0dXJuXCIsIGZhbHNlKTtcblxuICAgICAgICAgIGNhc2UgMTk6XG4gICAgICAgICAgICBfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uID0gdHJ1ZTtcbiAgICAgICAgICAgIF9jb250ZXh0Mi5uZXh0ID0gNjtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSAyMjpcbiAgICAgICAgICAgIF9jb250ZXh0Mi5uZXh0ID0gMjg7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgMjQ6XG4gICAgICAgICAgICBfY29udGV4dDIucHJldiA9IDI0O1xuICAgICAgICAgICAgX2NvbnRleHQyLnQwID0gX2NvbnRleHQyW1wiY2F0Y2hcIl0oNCk7XG4gICAgICAgICAgICBfZGlkSXRlcmF0b3JFcnJvciA9IHRydWU7XG4gICAgICAgICAgICBfaXRlcmF0b3JFcnJvciA9IF9jb250ZXh0Mi50MDtcblxuICAgICAgICAgIGNhc2UgMjg6XG4gICAgICAgICAgICBfY29udGV4dDIucHJldiA9IDI4O1xuICAgICAgICAgICAgX2NvbnRleHQyLnByZXYgPSAyOTtcblxuICAgICAgICAgICAgaWYgKCEoIV9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24gJiYgX2l0ZXJhdG9yW1wicmV0dXJuXCJdICE9IG51bGwpKSB7XG4gICAgICAgICAgICAgIF9jb250ZXh0Mi5uZXh0ID0gMzM7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBfY29udGV4dDIubmV4dCA9IDMzO1xuICAgICAgICAgICAgcmV0dXJuIF9pdGVyYXRvcltcInJldHVyblwiXSgpO1xuXG4gICAgICAgICAgY2FzZSAzMzpcbiAgICAgICAgICAgIF9jb250ZXh0Mi5wcmV2ID0gMzM7XG5cbiAgICAgICAgICAgIGlmICghX2RpZEl0ZXJhdG9yRXJyb3IpIHtcbiAgICAgICAgICAgICAgX2NvbnRleHQyLm5leHQgPSAzNjtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRocm93IF9pdGVyYXRvckVycm9yO1xuXG4gICAgICAgICAgY2FzZSAzNjpcbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dDIuZmluaXNoKDMzKTtcblxuICAgICAgICAgIGNhc2UgMzc6XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQyLmZpbmlzaCgyOCk7XG5cbiAgICAgICAgICBjYXNlIDM4OlxuICAgICAgICAgICAgX2NvbnRleHQyLm5leHQgPSA1ODtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSA0MDpcbiAgICAgICAgICAgIGZpcnN0VmFsdWUgPSB2YWx1ZXNbMF07XG4gICAgICAgICAgICBfaXRlcmF0b3IyID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIoX19zbGljZUZyb21TdGFydCh2YWx1ZXMsIDEpKTtcbiAgICAgICAgICAgIF9jb250ZXh0Mi5wcmV2ID0gNDI7XG5cbiAgICAgICAgICAgIF9pdGVyYXRvcjIucygpO1xuXG4gICAgICAgICAgY2FzZSA0NDpcbiAgICAgICAgICAgIGlmICgoX3N0ZXAyID0gX2l0ZXJhdG9yMi5uKCkpLmRvbmUpIHtcbiAgICAgICAgICAgICAgX2NvbnRleHQyLm5leHQgPSA1MDtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhbHVlID0gX3N0ZXAyLnZhbHVlO1xuXG4gICAgICAgICAgICBpZiAoc2FtZSh2YWx1ZSwgZmlyc3RWYWx1ZSwgZGVwdGgpKSB7XG4gICAgICAgICAgICAgIF9jb250ZXh0Mi5uZXh0ID0gNDg7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQyLmFicnVwdChcInJldHVyblwiLCBmYWxzZSk7XG5cbiAgICAgICAgICBjYXNlIDQ4OlxuICAgICAgICAgICAgX2NvbnRleHQyLm5leHQgPSA0NDtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSA1MDpcbiAgICAgICAgICAgIF9jb250ZXh0Mi5uZXh0ID0gNTU7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgNTI6XG4gICAgICAgICAgICBfY29udGV4dDIucHJldiA9IDUyO1xuICAgICAgICAgICAgX2NvbnRleHQyLnQxID0gX2NvbnRleHQyW1wiY2F0Y2hcIl0oNDIpO1xuXG4gICAgICAgICAgICBfaXRlcmF0b3IyLmUoX2NvbnRleHQyLnQxKTtcblxuICAgICAgICAgIGNhc2UgNTU6XG4gICAgICAgICAgICBfY29udGV4dDIucHJldiA9IDU1O1xuXG4gICAgICAgICAgICBfaXRlcmF0b3IyLmYoKTtcblxuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0Mi5maW5pc2goNTUpO1xuXG4gICAgICAgICAgY2FzZSA1ODpcbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dDIuYWJydXB0KFwicmV0dXJuXCIsIHRydWUpO1xuXG4gICAgICAgICAgY2FzZSA1OTpcbiAgICAgICAgICBjYXNlIFwiZW5kXCI6XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQyLnN0b3AoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sIF9jYWxsZWUyLCBudWxsLCBbWzQsIDI0LCAyOCwgMzhdLCBbMjksLCAzMywgMzddLCBbNDIsIDUyLCA1NSwgNThdXSk7XG4gIH0pKTtcbiAgcmV0dXJuIF9hc3luY0RlZXBFcXVhbDIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cblxuZXhwb3J0cy5fYXN5bmNEZWVwRXF1YWwgPSBfYXN5bmNEZWVwRXF1YWw7XG5cbmZ1bmN0aW9uIF9fYXN5bmNEZWVwRXF1YWwodmFsdWVzKSB7XG4gIHZhciBzYW1lID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBPYmplY3QuaXM7XG4gIHZhciBjb2VyY2VOaWwgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IHRydWU7XG4gIHJldHVybiB2YWx1ZXMubGVuZ3RoIDw9IDEgPyB0cnVlIDogX2FzeW5jRGVlcEVxdWFsKHZhbHVlcywgc2FtZSwgY29lcmNlTmlsID8gYXN5bmNJc1dyYXBwYWJsZSA6IGFzeW5jSXNJdGVyYWJsZSk7XG59XG5cbmV4cG9ydHMuX19hc3luY0RlZXBFcXVhbCA9IF9fYXN5bmNEZWVwRXF1YWw7XG5cbmZ1bmN0aW9uIGFzeW5jRGVlcEVxdWFsKCkge1xuICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgdmFsdWVzID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgIHZhbHVlc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgfVxuXG4gIHJldHVybiBfX2FzeW5jRGVlcEVxdWFsKHZhbHVlcyk7XG59XG5cbmV4cG9ydHMuYXN5bmNEZWVwRXF1YWwgPSBhc3luY0RlZXBFcXVhbDsiLCJ2YXIgX3JlZ2VuZXJhdG9yUnVudGltZSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9yZWdlbmVyYXRvclwiKTtcblxuZnVuY3Rpb24gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIobywgYWxsb3dBcnJheUxpa2UpIHsgdmFyIGl0OyBpZiAodHlwZW9mIFN5bWJvbCA9PT0gXCJ1bmRlZmluZWRcIiB8fCBvW1N5bWJvbC5pdGVyYXRvcl0gPT0gbnVsbCkgeyBpZiAoQXJyYXkuaXNBcnJheShvKSB8fCAoaXQgPSBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkobykpIHx8IGFsbG93QXJyYXlMaWtlICYmIG8gJiYgdHlwZW9mIG8ubGVuZ3RoID09PSBcIm51bWJlclwiKSB7IGlmIChpdCkgbyA9IGl0OyB2YXIgaSA9IDA7IHZhciBGID0gZnVuY3Rpb24gRigpIHt9OyByZXR1cm4geyBzOiBGLCBuOiBmdW5jdGlvbiBuKCkgeyBpZiAoaSA+PSBvLmxlbmd0aCkgcmV0dXJuIHsgZG9uZTogdHJ1ZSB9OyByZXR1cm4geyBkb25lOiBmYWxzZSwgdmFsdWU6IG9baSsrXSB9OyB9LCBlOiBmdW5jdGlvbiBlKF9lKSB7IHRocm93IF9lOyB9LCBmOiBGIH07IH0gdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBpdGVyYXRlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpOyB9IHZhciBub3JtYWxDb21wbGV0aW9uID0gdHJ1ZSwgZGlkRXJyID0gZmFsc2UsIGVycjsgcmV0dXJuIHsgczogZnVuY3Rpb24gcygpIHsgaXQgPSBvW1N5bWJvbC5pdGVyYXRvcl0oKTsgfSwgbjogZnVuY3Rpb24gbigpIHsgdmFyIHN0ZXAgPSBpdC5uZXh0KCk7IG5vcm1hbENvbXBsZXRpb24gPSBzdGVwLmRvbmU7IHJldHVybiBzdGVwOyB9LCBlOiBmdW5jdGlvbiBlKF9lMikgeyBkaWRFcnIgPSB0cnVlOyBlcnIgPSBfZTI7IH0sIGY6IGZ1bmN0aW9uIGYoKSB7IHRyeSB7IGlmICghbm9ybWFsQ29tcGxldGlvbiAmJiBpdFtcInJldHVyblwiXSAhPSBudWxsKSBpdFtcInJldHVyblwiXSgpOyB9IGZpbmFsbHkgeyBpZiAoZGlkRXJyKSB0aHJvdyBlcnI7IH0gfSB9OyB9XG5cbmZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvLCBtaW5MZW4pIHsgaWYgKCFvKSByZXR1cm47IGlmICh0eXBlb2YgbyA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IHZhciBuID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pLnNsaWNlKDgsIC0xKTsgaWYgKG4gPT09IFwiT2JqZWN0XCIgJiYgby5jb25zdHJ1Y3RvcikgbiA9IG8uY29uc3RydWN0b3IubmFtZTsgaWYgKG4gPT09IFwiTWFwXCIgfHwgbiA9PT0gXCJTZXRcIikgcmV0dXJuIEFycmF5LmZyb20obyk7IGlmIChuID09PSBcIkFyZ3VtZW50c1wiIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTsgfVxuXG5mdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheShhcnIsIGxlbikgeyBpZiAobGVuID09IG51bGwgfHwgbGVuID4gYXJyLmxlbmd0aCkgbGVuID0gYXJyLmxlbmd0aDsgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkobGVuKTsgaSA8IGxlbjsgaSsrKSB7IGFycjJbaV0gPSBhcnJbaV07IH0gcmV0dXJuIGFycjI7IH1cblxudmFyIF9yZXF1aXJlID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWwvaXRlcmFibGUuanMnKSxcbiAgICBpc0l0ZXJhYmxlID0gX3JlcXVpcmUuaXNJdGVyYWJsZSxcbiAgICBpc1dyYXBwYWJsZSA9IF9yZXF1aXJlLmlzV3JhcHBhYmxlO1xuXG52YXIgX3JlcXVpcmUyID0gcmVxdWlyZSgnLi4vJG1hcC9tYXAuanMnKSxcbiAgICBfX21hcCA9IF9yZXF1aXJlMi5fX21hcDtcblxudmFyIF9yZXF1aXJlMyA9IHJlcXVpcmUoJy4uLyRldmVyeS9ldmVyeS5qcycpLFxuICAgIF9fZXZlcnkgPSBfcmVxdWlyZTMuX19ldmVyeTtcblxudmFyIF9yZXF1aXJlNCA9IHJlcXVpcmUoJy4uLyR6aXAtYWxsL3ppcC1hbGwuanMnKSxcbiAgICBfX3ppcEFsbCA9IF9yZXF1aXJlNC5fX3ppcEFsbDtcblxudmFyIF9yZXF1aXJlNSA9IHJlcXVpcmUoJy4uLyRzbGljZS9zbGljZS5qcycpLFxuICAgIF9fc2xpY2VGcm9tU3RhcnQgPSBfcmVxdWlyZTUuX19zbGljZUZyb21TdGFydDtcblxudmFyIG5vbmUgPSBTeW1ib2woJ25vbmUnKTtcbnZhciB6aXBBbGxDb25maWcgPSB7XG4gIGZpbGxlcjogbm9uZVxufTtcblxudmFyIGVtcHR5ID0gLyojX19QVVJFX18qL19yZWdlbmVyYXRvclJ1bnRpbWUubWFyayhmdW5jdGlvbiBlbXB0eSgpIHtcbiAgcmV0dXJuIF9yZWdlbmVyYXRvclJ1bnRpbWUud3JhcChmdW5jdGlvbiBlbXB0eSQoX2NvbnRleHQpIHtcbiAgICB3aGlsZSAoMSkge1xuICAgICAgc3dpdGNoIChfY29udGV4dC5wcmV2ID0gX2NvbnRleHQubmV4dCkge1xuICAgICAgICBjYXNlIDA6XG4gICAgICAgIGNhc2UgXCJlbmRcIjpcbiAgICAgICAgICByZXR1cm4gX2NvbnRleHQuc3RvcCgpO1xuICAgICAgfVxuICAgIH1cbiAgfSwgZW1wdHkpO1xufSk7XG5cbnZhciBpdGVyYWJsZU9yRW1wdHkgPSBmdW5jdGlvbiBpdGVyYWJsZU9yRW1wdHkodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlID09IG51bGwgPyBlbXB0eSgpIDogdmFsdWU7XG59O1xuXG5mdW5jdGlvbiBfZGVlcEVxdWFsKHZhbHVlcywgc2FtZSwgaXNJdGVyYWJsZSkge1xuICB2YXIgZGVwdGggPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiBhcmd1bWVudHNbM10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1szXSA6IDA7XG5cbiAgaWYgKF9fZXZlcnkodmFsdWVzLCBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJyAmJiBpc0l0ZXJhYmxlKHZhbHVlKTtcbiAgfSkpIHtcbiAgICB2YXIgX2l0ZXJhdG9yID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIoX196aXBBbGwoX19tYXAodmFsdWVzLCBpdGVyYWJsZU9yRW1wdHkpLCB6aXBBbGxDb25maWcpKSxcbiAgICAgICAgX3N0ZXA7XG5cbiAgICB0cnkge1xuICAgICAgZm9yIChfaXRlcmF0b3IucygpOyAhKF9zdGVwID0gX2l0ZXJhdG9yLm4oKSkuZG9uZTspIHtcbiAgICAgICAgdmFyIHN0ZXBWYWx1ZXMgPSBfc3RlcC52YWx1ZTtcbiAgICAgICAgaWYgKCFfZGVlcEVxdWFsKHN0ZXBWYWx1ZXMsIHNhbWUsIGlzSXRlcmFibGUsIGRlcHRoICsgMSkpIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIF9pdGVyYXRvci5lKGVycik7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIF9pdGVyYXRvci5mKCk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHZhciBmaXJzdFZhbHVlID0gdmFsdWVzWzBdO1xuXG4gICAgdmFyIF9pdGVyYXRvcjIgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihfX3NsaWNlRnJvbVN0YXJ0KHZhbHVlcywgMSkpLFxuICAgICAgICBfc3RlcDI7XG5cbiAgICB0cnkge1xuICAgICAgZm9yIChfaXRlcmF0b3IyLnMoKTsgIShfc3RlcDIgPSBfaXRlcmF0b3IyLm4oKSkuZG9uZTspIHtcbiAgICAgICAgdmFyIHZhbHVlID0gX3N0ZXAyLnZhbHVlO1xuICAgICAgICBpZiAoIXNhbWUodmFsdWUsIGZpcnN0VmFsdWUsIGRlcHRoKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgX2l0ZXJhdG9yMi5lKGVycik7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIF9pdGVyYXRvcjIuZigpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5leHBvcnRzLl9kZWVwRXF1YWwgPSBfZGVlcEVxdWFsO1xuXG5mdW5jdGlvbiBfX2RlZXBFcXVhbCh2YWx1ZXMpIHtcbiAgdmFyIHNhbWUgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IE9iamVjdC5pcztcbiAgdmFyIGNvZXJjZU5pbCA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogdHJ1ZTtcbiAgcmV0dXJuIHZhbHVlcy5sZW5ndGggPD0gMSA/IHRydWUgOiBfZGVlcEVxdWFsKHZhbHVlcywgc2FtZSwgY29lcmNlTmlsID8gaXNXcmFwcGFibGUgOiBpc0l0ZXJhYmxlKTtcbn1cblxuZXhwb3J0cy5fX2RlZXBFcXVhbCA9IF9fZGVlcEVxdWFsO1xuXG5mdW5jdGlvbiBkZWVwRXF1YWwoKSB7XG4gIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCB2YWx1ZXMgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgdmFsdWVzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICB9XG5cbiAgcmV0dXJuIF9fZGVlcEVxdWFsKHZhbHVlcyk7XG59XG5cbmV4cG9ydHMuZGVlcEVxdWFsID0gZGVlcEVxdWFsOyIsInZhciBfcmVnZW5lcmF0b3JSdW50aW1lID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL3JlZ2VuZXJhdG9yXCIpO1xuXG52YXIgX2F3YWl0QXN5bmNHZW5lcmF0b3IgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9hd2FpdEFzeW5jR2VuZXJhdG9yXCIpO1xuXG52YXIgX3dyYXBBc3luY0dlbmVyYXRvciA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3dyYXBBc3luY0dlbmVyYXRvclwiKTtcblxudmFyIF9hc3luY0l0ZXJhdG9yID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvYXN5bmNJdGVyYXRvclwiKTtcblxudmFyIF9yZXF1aXJlID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWwvYXN5bmMtaXRlcmFibGUuanMnKSxcbiAgICBhc3luY0l0ZXJhYmxlQ3VycnkgPSBfcmVxdWlyZS5hc3luY0l0ZXJhYmxlQ3Vycnk7XG5cbmZ1bmN0aW9uIF9fYXN5bmNEaXN0aW5jdChfeCwgX3gyKSB7XG4gIHJldHVybiBfYXN5bmNEaXN0aW5jdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuXG5leHBvcnRzLl9fYXN5bmNEaXN0aW5jdCA9IF9fYXN5bmNEaXN0aW5jdDtcblxuZnVuY3Rpb24gX2FzeW5jRGlzdGluY3QoKSB7XG4gIF9hc3luY0Rpc3RpbmN0ID0gX3dyYXBBc3luY0dlbmVyYXRvciggLyojX19QVVJFX18qL19yZWdlbmVyYXRvclJ1bnRpbWUubWFyayhmdW5jdGlvbiBfY2FsbGVlKHNvdXJjZSwgc2VsZWN0b3IpIHtcbiAgICB2YXIgc2V0LCBfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uLCBfZGlkSXRlcmF0b3JFcnJvciwgX2l0ZXJhdG9yRXJyb3IsIF9pdGVyYXRvciwgX3N0ZXAsIF92YWx1ZSwgdmFsdWUsIGtleTtcblxuICAgIHJldHVybiBfcmVnZW5lcmF0b3JSdW50aW1lLndyYXAoZnVuY3Rpb24gX2NhbGxlZSQoX2NvbnRleHQpIHtcbiAgICAgIHdoaWxlICgxKSB7XG4gICAgICAgIHN3aXRjaCAoX2NvbnRleHQucHJldiA9IF9jb250ZXh0Lm5leHQpIHtcbiAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICBzZXQgPSBuZXcgU2V0KCk7XG4gICAgICAgICAgICBfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uID0gdHJ1ZTtcbiAgICAgICAgICAgIF9kaWRJdGVyYXRvckVycm9yID0gZmFsc2U7XG4gICAgICAgICAgICBfY29udGV4dC5wcmV2ID0gMztcbiAgICAgICAgICAgIF9pdGVyYXRvciA9IF9hc3luY0l0ZXJhdG9yKHNvdXJjZSk7XG5cbiAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gNztcbiAgICAgICAgICAgIHJldHVybiBfYXdhaXRBc3luY0dlbmVyYXRvcihfaXRlcmF0b3IubmV4dCgpKTtcblxuICAgICAgICAgIGNhc2UgNzpcbiAgICAgICAgICAgIF9zdGVwID0gX2NvbnRleHQuc2VudDtcbiAgICAgICAgICAgIF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24gPSBfc3RlcC5kb25lO1xuICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDExO1xuICAgICAgICAgICAgcmV0dXJuIF9hd2FpdEFzeW5jR2VuZXJhdG9yKF9zdGVwLnZhbHVlKTtcblxuICAgICAgICAgIGNhc2UgMTE6XG4gICAgICAgICAgICBfdmFsdWUgPSBfY29udGV4dC5zZW50O1xuXG4gICAgICAgICAgICBpZiAoX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbikge1xuICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMjM7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YWx1ZSA9IF92YWx1ZTtcbiAgICAgICAgICAgIGtleSA9IHNlbGVjdG9yID8gc2VsZWN0b3IodmFsdWUpIDogdmFsdWU7XG5cbiAgICAgICAgICAgIGlmICghc2V0LmhhcyhrZXkpKSB7XG4gICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAxNztcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5hYnJ1cHQoXCJjb250aW51ZVwiLCAyMCk7XG5cbiAgICAgICAgICBjYXNlIDE3OlxuICAgICAgICAgICAgc2V0LmFkZChrZXkpO1xuICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDIwO1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuXG4gICAgICAgICAgY2FzZSAyMDpcbiAgICAgICAgICAgIF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24gPSB0cnVlO1xuICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDU7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgMjM6XG4gICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMjk7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgMjU6XG4gICAgICAgICAgICBfY29udGV4dC5wcmV2ID0gMjU7XG4gICAgICAgICAgICBfY29udGV4dC50MCA9IF9jb250ZXh0W1wiY2F0Y2hcIl0oMyk7XG4gICAgICAgICAgICBfZGlkSXRlcmF0b3JFcnJvciA9IHRydWU7XG4gICAgICAgICAgICBfaXRlcmF0b3JFcnJvciA9IF9jb250ZXh0LnQwO1xuXG4gICAgICAgICAgY2FzZSAyOTpcbiAgICAgICAgICAgIF9jb250ZXh0LnByZXYgPSAyOTtcbiAgICAgICAgICAgIF9jb250ZXh0LnByZXYgPSAzMDtcblxuICAgICAgICAgICAgaWYgKCEoIV9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24gJiYgX2l0ZXJhdG9yW1wicmV0dXJuXCJdICE9IG51bGwpKSB7XG4gICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAzNDtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAzNDtcbiAgICAgICAgICAgIHJldHVybiBfYXdhaXRBc3luY0dlbmVyYXRvcihfaXRlcmF0b3JbXCJyZXR1cm5cIl0oKSk7XG5cbiAgICAgICAgICBjYXNlIDM0OlxuICAgICAgICAgICAgX2NvbnRleHQucHJldiA9IDM0O1xuXG4gICAgICAgICAgICBpZiAoIV9kaWRJdGVyYXRvckVycm9yKSB7XG4gICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAzNztcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRocm93IF9pdGVyYXRvckVycm9yO1xuXG4gICAgICAgICAgY2FzZSAzNzpcbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5maW5pc2goMzQpO1xuXG4gICAgICAgICAgY2FzZSAzODpcbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5maW5pc2goMjkpO1xuXG4gICAgICAgICAgY2FzZSAzOTpcbiAgICAgICAgICBjYXNlIFwiZW5kXCI6XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuc3RvcCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwgX2NhbGxlZSwgbnVsbCwgW1szLCAyNSwgMjksIDM5XSwgWzMwLCwgMzQsIDM4XV0pO1xuICB9KSk7XG4gIHJldHVybiBfYXN5bmNEaXN0aW5jdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuXG52YXIgYXN5bmNEaXN0aW5jdCA9IGFzeW5jSXRlcmFibGVDdXJyeShfX2FzeW5jRGlzdGluY3QsIHtcbiAgbWluQXJnczogMCxcbiAgbWF4QXJnczogMVxufSk7XG5leHBvcnRzLmFzeW5jRGlzdGluY3QgPSBhc3luY0Rpc3RpbmN0OyIsInZhciBfcmVnZW5lcmF0b3JSdW50aW1lID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL3JlZ2VuZXJhdG9yXCIpO1xuXG52YXIgX21hcmtlZCA9IC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3JSdW50aW1lLm1hcmsoX19kaXN0aW5jdCk7XG5cbmZ1bmN0aW9uIF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKG8sIGFsbG93QXJyYXlMaWtlKSB7IHZhciBpdDsgaWYgKHR5cGVvZiBTeW1ib2wgPT09IFwidW5kZWZpbmVkXCIgfHwgb1tTeW1ib2wuaXRlcmF0b3JdID09IG51bGwpIHsgaWYgKEFycmF5LmlzQXJyYXkobykgfHwgKGl0ID0gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8pKSB8fCBhbGxvd0FycmF5TGlrZSAmJiBvICYmIHR5cGVvZiBvLmxlbmd0aCA9PT0gXCJudW1iZXJcIikgeyBpZiAoaXQpIG8gPSBpdDsgdmFyIGkgPSAwOyB2YXIgRiA9IGZ1bmN0aW9uIEYoKSB7fTsgcmV0dXJuIHsgczogRiwgbjogZnVuY3Rpb24gbigpIHsgaWYgKGkgPj0gby5sZW5ndGgpIHJldHVybiB7IGRvbmU6IHRydWUgfTsgcmV0dXJuIHsgZG9uZTogZmFsc2UsIHZhbHVlOiBvW2krK10gfTsgfSwgZTogZnVuY3Rpb24gZShfZSkgeyB0aHJvdyBfZTsgfSwgZjogRiB9OyB9IHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gaXRlcmF0ZSBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTsgfSB2YXIgbm9ybWFsQ29tcGxldGlvbiA9IHRydWUsIGRpZEVyciA9IGZhbHNlLCBlcnI7IHJldHVybiB7IHM6IGZ1bmN0aW9uIHMoKSB7IGl0ID0gb1tTeW1ib2wuaXRlcmF0b3JdKCk7IH0sIG46IGZ1bmN0aW9uIG4oKSB7IHZhciBzdGVwID0gaXQubmV4dCgpOyBub3JtYWxDb21wbGV0aW9uID0gc3RlcC5kb25lOyByZXR1cm4gc3RlcDsgfSwgZTogZnVuY3Rpb24gZShfZTIpIHsgZGlkRXJyID0gdHJ1ZTsgZXJyID0gX2UyOyB9LCBmOiBmdW5jdGlvbiBmKCkgeyB0cnkgeyBpZiAoIW5vcm1hbENvbXBsZXRpb24gJiYgaXRbXCJyZXR1cm5cIl0gIT0gbnVsbCkgaXRbXCJyZXR1cm5cIl0oKTsgfSBmaW5hbGx5IHsgaWYgKGRpZEVycikgdGhyb3cgZXJyOyB9IH0gfTsgfVxuXG5mdW5jdGlvbiBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkobywgbWluTGVuKSB7IGlmICghbykgcmV0dXJuOyBpZiAodHlwZW9mIG8gPT09IFwic3RyaW5nXCIpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pOyB2YXIgbiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKS5zbGljZSg4LCAtMSk7IGlmIChuID09PSBcIk9iamVjdFwiICYmIG8uY29uc3RydWN0b3IpIG4gPSBvLmNvbnN0cnVjdG9yLm5hbWU7IGlmIChuID09PSBcIk1hcFwiIHx8IG4gPT09IFwiU2V0XCIpIHJldHVybiBBcnJheS5mcm9tKG8pOyBpZiAobiA9PT0gXCJBcmd1bWVudHNcIiB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSkgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IH1cblxuZnVuY3Rpb24gX2FycmF5TGlrZVRvQXJyYXkoYXJyLCBsZW4pIHsgaWYgKGxlbiA9PSBudWxsIHx8IGxlbiA+IGFyci5sZW5ndGgpIGxlbiA9IGFyci5sZW5ndGg7IGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGxlbik7IGkgPCBsZW47IGkrKykgeyBhcnIyW2ldID0gYXJyW2ldOyB9IHJldHVybiBhcnIyOyB9XG5cbnZhciBfcmVxdWlyZSA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFsL2l0ZXJhYmxlLmpzJyksXG4gICAgaXRlcmFibGVDdXJyeSA9IF9yZXF1aXJlLml0ZXJhYmxlQ3Vycnk7XG5cbmZ1bmN0aW9uIF9fZGlzdGluY3Qoc291cmNlLCBzZWxlY3Rvcikge1xuICB2YXIgc2V0LCBfaXRlcmF0b3IsIF9zdGVwLCB2YWx1ZSwga2V5O1xuXG4gIHJldHVybiBfcmVnZW5lcmF0b3JSdW50aW1lLndyYXAoZnVuY3Rpb24gX19kaXN0aW5jdCQoX2NvbnRleHQpIHtcbiAgICB3aGlsZSAoMSkge1xuICAgICAgc3dpdGNoIChfY29udGV4dC5wcmV2ID0gX2NvbnRleHQubmV4dCkge1xuICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgc2V0ID0gbmV3IFNldCgpO1xuICAgICAgICAgIF9pdGVyYXRvciA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKHNvdXJjZSk7XG4gICAgICAgICAgX2NvbnRleHQucHJldiA9IDI7XG5cbiAgICAgICAgICBfaXRlcmF0b3IucygpO1xuXG4gICAgICAgIGNhc2UgNDpcbiAgICAgICAgICBpZiAoKF9zdGVwID0gX2l0ZXJhdG9yLm4oKSkuZG9uZSkge1xuICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDE0O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFsdWUgPSBfc3RlcC52YWx1ZTtcbiAgICAgICAgICBrZXkgPSBzZWxlY3RvciA/IHNlbGVjdG9yKHZhbHVlKSA6IHZhbHVlO1xuXG4gICAgICAgICAgaWYgKCFzZXQuaGFzKGtleSkpIHtcbiAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSA5O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIF9jb250ZXh0LmFicnVwdChcImNvbnRpbnVlXCIsIDEyKTtcblxuICAgICAgICBjYXNlIDk6XG4gICAgICAgICAgc2V0LmFkZChrZXkpO1xuICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAxMjtcbiAgICAgICAgICByZXR1cm4gdmFsdWU7XG5cbiAgICAgICAgY2FzZSAxMjpcbiAgICAgICAgICBfY29udGV4dC5uZXh0ID0gNDtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIDE0OlxuICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAxOTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIDE2OlxuICAgICAgICAgIF9jb250ZXh0LnByZXYgPSAxNjtcbiAgICAgICAgICBfY29udGV4dC50MCA9IF9jb250ZXh0W1wiY2F0Y2hcIl0oMik7XG5cbiAgICAgICAgICBfaXRlcmF0b3IuZShfY29udGV4dC50MCk7XG5cbiAgICAgICAgY2FzZSAxOTpcbiAgICAgICAgICBfY29udGV4dC5wcmV2ID0gMTk7XG5cbiAgICAgICAgICBfaXRlcmF0b3IuZigpO1xuXG4gICAgICAgICAgcmV0dXJuIF9jb250ZXh0LmZpbmlzaCgxOSk7XG5cbiAgICAgICAgY2FzZSAyMjpcbiAgICAgICAgY2FzZSBcImVuZFwiOlxuICAgICAgICAgIHJldHVybiBfY29udGV4dC5zdG9wKCk7XG4gICAgICB9XG4gICAgfVxuICB9LCBfbWFya2VkLCBudWxsLCBbWzIsIDE2LCAxOSwgMjJdXSk7XG59XG5cbmV4cG9ydHMuX19kaXN0aW5jdCA9IF9fZGlzdGluY3Q7XG52YXIgZGlzdGluY3QgPSBpdGVyYWJsZUN1cnJ5KF9fZGlzdGluY3QsIHtcbiAgbWluQXJnczogMCxcbiAgbWF4QXJnczogMVxufSk7XG5leHBvcnRzLmRpc3RpbmN0ID0gZGlzdGluY3Q7IiwidmFyIF9yZWdlbmVyYXRvclJ1bnRpbWUgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvcmVnZW5lcmF0b3JcIik7XG5cbnZhciBfYXdhaXRBc3luY0dlbmVyYXRvciA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2F3YWl0QXN5bmNHZW5lcmF0b3JcIik7XG5cbnZhciBfd3JhcEFzeW5jR2VuZXJhdG9yID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvd3JhcEFzeW5jR2VuZXJhdG9yXCIpO1xuXG52YXIgX2FzeW5jSXRlcmF0b3IgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9hc3luY0l0ZXJhdG9yXCIpO1xuXG52YXIgX3JlcXVpcmUgPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbC9hc3luYy1pdGVyYWJsZS5qcycpLFxuICAgIGFzeW5jSXRlcmFibGVDdXJyeSA9IF9yZXF1aXJlLmFzeW5jSXRlcmFibGVDdXJyeTtcblxuZnVuY3Rpb24gX19hc3luY0Ryb3BXaGlsZShfeCwgX3gyKSB7XG4gIHJldHVybiBfYXN5bmNEcm9wV2hpbGUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cblxuZXhwb3J0cy5fX2FzeW5jRHJvcFdoaWxlID0gX19hc3luY0Ryb3BXaGlsZTtcblxuZnVuY3Rpb24gX2FzeW5jRHJvcFdoaWxlKCkge1xuICBfYXN5bmNEcm9wV2hpbGUgPSBfd3JhcEFzeW5jR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yUnVudGltZS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUoc291cmNlLCBwcmVkaWNhdGUpIHtcbiAgICB2YXIgZHJvcCwgYywgX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbiwgX2RpZEl0ZXJhdG9yRXJyb3IsIF9pdGVyYXRvckVycm9yLCBfaXRlcmF0b3IsIF9zdGVwLCBfdmFsdWUsIHZhbHVlO1xuXG4gICAgcmV0dXJuIF9yZWdlbmVyYXRvclJ1bnRpbWUud3JhcChmdW5jdGlvbiBfY2FsbGVlJChfY29udGV4dCkge1xuICAgICAgd2hpbGUgKDEpIHtcbiAgICAgICAgc3dpdGNoIChfY29udGV4dC5wcmV2ID0gX2NvbnRleHQubmV4dCkge1xuICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgIGRyb3AgPSB0cnVlO1xuICAgICAgICAgICAgYyA9IDA7XG4gICAgICAgICAgICBfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uID0gdHJ1ZTtcbiAgICAgICAgICAgIF9kaWRJdGVyYXRvckVycm9yID0gZmFsc2U7XG4gICAgICAgICAgICBfY29udGV4dC5wcmV2ID0gNDtcbiAgICAgICAgICAgIF9pdGVyYXRvciA9IF9hc3luY0l0ZXJhdG9yKHNvdXJjZSk7XG5cbiAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gODtcbiAgICAgICAgICAgIHJldHVybiBfYXdhaXRBc3luY0dlbmVyYXRvcihfaXRlcmF0b3IubmV4dCgpKTtcblxuICAgICAgICAgIGNhc2UgODpcbiAgICAgICAgICAgIF9zdGVwID0gX2NvbnRleHQuc2VudDtcbiAgICAgICAgICAgIF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24gPSBfc3RlcC5kb25lO1xuICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDEyO1xuICAgICAgICAgICAgcmV0dXJuIF9hd2FpdEFzeW5jR2VuZXJhdG9yKF9zdGVwLnZhbHVlKTtcblxuICAgICAgICAgIGNhc2UgMTI6XG4gICAgICAgICAgICBfdmFsdWUgPSBfY29udGV4dC5zZW50O1xuXG4gICAgICAgICAgICBpZiAoX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbikge1xuICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMjk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YWx1ZSA9IF92YWx1ZTtcblxuICAgICAgICAgICAgaWYgKGRyb3ApIHtcbiAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDIwO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDE4O1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuXG4gICAgICAgICAgY2FzZSAxODpcbiAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAyNjtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSAyMDpcbiAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAyMjtcbiAgICAgICAgICAgIHJldHVybiBfYXdhaXRBc3luY0dlbmVyYXRvcihwcmVkaWNhdGUodmFsdWUsIGMrKykpO1xuXG4gICAgICAgICAgY2FzZSAyMjpcbiAgICAgICAgICAgIGRyb3AgPSBfY29udGV4dC5zZW50O1xuXG4gICAgICAgICAgICBpZiAoZHJvcCkge1xuICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMjY7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMjY7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG5cbiAgICAgICAgICBjYXNlIDI2OlxuICAgICAgICAgICAgX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbiA9IHRydWU7XG4gICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gNjtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSAyOTpcbiAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAzNTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSAzMTpcbiAgICAgICAgICAgIF9jb250ZXh0LnByZXYgPSAzMTtcbiAgICAgICAgICAgIF9jb250ZXh0LnQwID0gX2NvbnRleHRbXCJjYXRjaFwiXSg0KTtcbiAgICAgICAgICAgIF9kaWRJdGVyYXRvckVycm9yID0gdHJ1ZTtcbiAgICAgICAgICAgIF9pdGVyYXRvckVycm9yID0gX2NvbnRleHQudDA7XG5cbiAgICAgICAgICBjYXNlIDM1OlxuICAgICAgICAgICAgX2NvbnRleHQucHJldiA9IDM1O1xuICAgICAgICAgICAgX2NvbnRleHQucHJldiA9IDM2O1xuXG4gICAgICAgICAgICBpZiAoISghX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbiAmJiBfaXRlcmF0b3JbXCJyZXR1cm5cIl0gIT0gbnVsbCkpIHtcbiAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDQwO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDQwO1xuICAgICAgICAgICAgcmV0dXJuIF9hd2FpdEFzeW5jR2VuZXJhdG9yKF9pdGVyYXRvcltcInJldHVyblwiXSgpKTtcblxuICAgICAgICAgIGNhc2UgNDA6XG4gICAgICAgICAgICBfY29udGV4dC5wcmV2ID0gNDA7XG5cbiAgICAgICAgICAgIGlmICghX2RpZEl0ZXJhdG9yRXJyb3IpIHtcbiAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDQzO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhyb3cgX2l0ZXJhdG9yRXJyb3I7XG5cbiAgICAgICAgICBjYXNlIDQzOlxuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LmZpbmlzaCg0MCk7XG5cbiAgICAgICAgICBjYXNlIDQ0OlxuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LmZpbmlzaCgzNSk7XG5cbiAgICAgICAgICBjYXNlIDQ1OlxuICAgICAgICAgIGNhc2UgXCJlbmRcIjpcbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5zdG9wKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCBfY2FsbGVlLCBudWxsLCBbWzQsIDMxLCAzNSwgNDVdLCBbMzYsLCA0MCwgNDRdXSk7XG4gIH0pKTtcbiAgcmV0dXJuIF9hc3luY0Ryb3BXaGlsZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuXG52YXIgYXN5bmNEcm9wV2hpbGUgPSAvKiNfX1BVUkVfXyovYXN5bmNJdGVyYWJsZUN1cnJ5KF9fYXN5bmNEcm9wV2hpbGUpO1xuZXhwb3J0cy5hc3luY0Ryb3BXaGlsZSA9IGFzeW5jRHJvcFdoaWxlOyIsInZhciBfcmVnZW5lcmF0b3JSdW50aW1lID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL3JlZ2VuZXJhdG9yXCIpO1xuXG52YXIgX21hcmtlZCA9IC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3JSdW50aW1lLm1hcmsoX19kcm9wV2hpbGUpO1xuXG5mdW5jdGlvbiBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihvLCBhbGxvd0FycmF5TGlrZSkgeyB2YXIgaXQ7IGlmICh0eXBlb2YgU3ltYm9sID09PSBcInVuZGVmaW5lZFwiIHx8IG9bU3ltYm9sLml0ZXJhdG9yXSA9PSBudWxsKSB7IGlmIChBcnJheS5pc0FycmF5KG8pIHx8IChpdCA9IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvKSkgfHwgYWxsb3dBcnJheUxpa2UgJiYgbyAmJiB0eXBlb2Ygby5sZW5ndGggPT09IFwibnVtYmVyXCIpIHsgaWYgKGl0KSBvID0gaXQ7IHZhciBpID0gMDsgdmFyIEYgPSBmdW5jdGlvbiBGKCkge307IHJldHVybiB7IHM6IEYsIG46IGZ1bmN0aW9uIG4oKSB7IGlmIChpID49IG8ubGVuZ3RoKSByZXR1cm4geyBkb25lOiB0cnVlIH07IHJldHVybiB7IGRvbmU6IGZhbHNlLCB2YWx1ZTogb1tpKytdIH07IH0sIGU6IGZ1bmN0aW9uIGUoX2UpIHsgdGhyb3cgX2U7IH0sIGY6IEYgfTsgfSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIGl0ZXJhdGUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIik7IH0gdmFyIG5vcm1hbENvbXBsZXRpb24gPSB0cnVlLCBkaWRFcnIgPSBmYWxzZSwgZXJyOyByZXR1cm4geyBzOiBmdW5jdGlvbiBzKCkgeyBpdCA9IG9bU3ltYm9sLml0ZXJhdG9yXSgpOyB9LCBuOiBmdW5jdGlvbiBuKCkgeyB2YXIgc3RlcCA9IGl0Lm5leHQoKTsgbm9ybWFsQ29tcGxldGlvbiA9IHN0ZXAuZG9uZTsgcmV0dXJuIHN0ZXA7IH0sIGU6IGZ1bmN0aW9uIGUoX2UyKSB7IGRpZEVyciA9IHRydWU7IGVyciA9IF9lMjsgfSwgZjogZnVuY3Rpb24gZigpIHsgdHJ5IHsgaWYgKCFub3JtYWxDb21wbGV0aW9uICYmIGl0W1wicmV0dXJuXCJdICE9IG51bGwpIGl0W1wicmV0dXJuXCJdKCk7IH0gZmluYWxseSB7IGlmIChkaWRFcnIpIHRocm93IGVycjsgfSB9IH07IH1cblxuZnVuY3Rpb24gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8sIG1pbkxlbikgeyBpZiAoIW8pIHJldHVybjsgaWYgKHR5cGVvZiBvID09PSBcInN0cmluZ1wiKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTsgdmFyIG4gPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykuc2xpY2UoOCwgLTEpOyBpZiAobiA9PT0gXCJPYmplY3RcIiAmJiBvLmNvbnN0cnVjdG9yKSBuID0gby5jb25zdHJ1Y3Rvci5uYW1lOyBpZiAobiA9PT0gXCJNYXBcIiB8fCBuID09PSBcIlNldFwiKSByZXR1cm4gQXJyYXkuZnJvbShvKTsgaWYgKG4gPT09IFwiQXJndW1lbnRzXCIgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QobikpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pOyB9XG5cbmZ1bmN0aW9uIF9hcnJheUxpa2VUb0FycmF5KGFyciwgbGVuKSB7IGlmIChsZW4gPT0gbnVsbCB8fCBsZW4gPiBhcnIubGVuZ3RoKSBsZW4gPSBhcnIubGVuZ3RoOyBmb3IgKHZhciBpID0gMCwgYXJyMiA9IG5ldyBBcnJheShsZW4pOyBpIDwgbGVuOyBpKyspIHsgYXJyMltpXSA9IGFycltpXTsgfSByZXR1cm4gYXJyMjsgfVxuXG52YXIgX3JlcXVpcmUgPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbC9pdGVyYWJsZS5qcycpLFxuICAgIGl0ZXJhYmxlQ3VycnkgPSBfcmVxdWlyZS5pdGVyYWJsZUN1cnJ5O1xuXG5mdW5jdGlvbiBfX2Ryb3BXaGlsZShzb3VyY2UsIHByZWRpY2F0ZSkge1xuICB2YXIgZHJvcCwgYywgX2l0ZXJhdG9yLCBfc3RlcCwgdmFsdWU7XG5cbiAgcmV0dXJuIF9yZWdlbmVyYXRvclJ1bnRpbWUud3JhcChmdW5jdGlvbiBfX2Ryb3BXaGlsZSQoX2NvbnRleHQpIHtcbiAgICB3aGlsZSAoMSkge1xuICAgICAgc3dpdGNoIChfY29udGV4dC5wcmV2ID0gX2NvbnRleHQubmV4dCkge1xuICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgZHJvcCA9IHRydWU7XG4gICAgICAgICAgYyA9IDA7XG4gICAgICAgICAgX2l0ZXJhdG9yID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIoc291cmNlKTtcbiAgICAgICAgICBfY29udGV4dC5wcmV2ID0gMztcblxuICAgICAgICAgIF9pdGVyYXRvci5zKCk7XG5cbiAgICAgICAgY2FzZSA1OlxuICAgICAgICAgIGlmICgoX3N0ZXAgPSBfaXRlcmF0b3IubigpKS5kb25lKSB7XG4gICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMTg7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YWx1ZSA9IF9zdGVwLnZhbHVlO1xuXG4gICAgICAgICAgaWYgKGRyb3ApIHtcbiAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAxMjtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAxMDtcbiAgICAgICAgICByZXR1cm4gdmFsdWU7XG5cbiAgICAgICAgY2FzZSAxMDpcbiAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMTY7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAxMjpcbiAgICAgICAgICBkcm9wID0gcHJlZGljYXRlKHZhbHVlLCBjKyspO1xuXG4gICAgICAgICAgaWYgKGRyb3ApIHtcbiAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAxNjtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAxNjtcbiAgICAgICAgICByZXR1cm4gdmFsdWU7XG5cbiAgICAgICAgY2FzZSAxNjpcbiAgICAgICAgICBfY29udGV4dC5uZXh0ID0gNTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIDE4OlxuICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAyMztcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIDIwOlxuICAgICAgICAgIF9jb250ZXh0LnByZXYgPSAyMDtcbiAgICAgICAgICBfY29udGV4dC50MCA9IF9jb250ZXh0W1wiY2F0Y2hcIl0oMyk7XG5cbiAgICAgICAgICBfaXRlcmF0b3IuZShfY29udGV4dC50MCk7XG5cbiAgICAgICAgY2FzZSAyMzpcbiAgICAgICAgICBfY29udGV4dC5wcmV2ID0gMjM7XG5cbiAgICAgICAgICBfaXRlcmF0b3IuZigpO1xuXG4gICAgICAgICAgcmV0dXJuIF9jb250ZXh0LmZpbmlzaCgyMyk7XG5cbiAgICAgICAgY2FzZSAyNjpcbiAgICAgICAgY2FzZSBcImVuZFwiOlxuICAgICAgICAgIHJldHVybiBfY29udGV4dC5zdG9wKCk7XG4gICAgICB9XG4gICAgfVxuICB9LCBfbWFya2VkLCBudWxsLCBbWzMsIDIwLCAyMywgMjZdXSk7XG59XG5cbmV4cG9ydHMuX19kcm9wV2hpbGUgPSBfX2Ryb3BXaGlsZTtcbnZhciBkcm9wV2hpbGUgPSAvKiNfX1BVUkVfXyovaXRlcmFibGVDdXJyeShfX2Ryb3BXaGlsZSk7XG5leHBvcnRzLmRyb3BXaGlsZSA9IGRyb3BXaGlsZTsiLCJ2YXIgX3JlZ2VuZXJhdG9yUnVudGltZSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9yZWdlbmVyYXRvclwiKTtcblxudmFyIF9hd2FpdEFzeW5jR2VuZXJhdG9yID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvYXdhaXRBc3luY0dlbmVyYXRvclwiKTtcblxudmFyIF93cmFwQXN5bmNHZW5lcmF0b3IgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy93cmFwQXN5bmNHZW5lcmF0b3JcIik7XG5cbnZhciBfYXN5bmNJdGVyYXRvciA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2FzeW5jSXRlcmF0b3JcIik7XG5cbnZhciBfcmVxdWlyZSA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFsL2FzeW5jLWl0ZXJhYmxlLmpzJyksXG4gICAgYXN5bmNJdGVyYWJsZUN1cnJ5ID0gX3JlcXVpcmUuYXN5bmNJdGVyYWJsZUN1cnJ5O1xuXG5mdW5jdGlvbiBfX2FzeW5jRHJvcChfeCwgX3gyKSB7XG4gIHJldHVybiBfYXN5bmNEcm9wLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5cbmV4cG9ydHMuX19hc3luY0Ryb3AgPSBfX2FzeW5jRHJvcDtcblxuZnVuY3Rpb24gX2FzeW5jRHJvcCgpIHtcbiAgX2FzeW5jRHJvcCA9IF93cmFwQXN5bmNHZW5lcmF0b3IoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3JSdW50aW1lLm1hcmsoZnVuY3Rpb24gX2NhbGxlZShpdGVyYWJsZSwgbikge1xuICAgIHZhciBpLCBfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uLCBfZGlkSXRlcmF0b3JFcnJvciwgX2l0ZXJhdG9yRXJyb3IsIF9pdGVyYXRvciwgX3N0ZXAsIF92YWx1ZSwgdmFsdWU7XG5cbiAgICByZXR1cm4gX3JlZ2VuZXJhdG9yUnVudGltZS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUkKF9jb250ZXh0KSB7XG4gICAgICB3aGlsZSAoMSkge1xuICAgICAgICBzd2l0Y2ggKF9jb250ZXh0LnByZXYgPSBfY29udGV4dC5uZXh0KSB7XG4gICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgaSA9IDA7XG4gICAgICAgICAgICBfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uID0gdHJ1ZTtcbiAgICAgICAgICAgIF9kaWRJdGVyYXRvckVycm9yID0gZmFsc2U7XG4gICAgICAgICAgICBfY29udGV4dC5wcmV2ID0gMztcbiAgICAgICAgICAgIF9pdGVyYXRvciA9IF9hc3luY0l0ZXJhdG9yKGl0ZXJhYmxlKTtcblxuICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSA3O1xuICAgICAgICAgICAgcmV0dXJuIF9hd2FpdEFzeW5jR2VuZXJhdG9yKF9pdGVyYXRvci5uZXh0KCkpO1xuXG4gICAgICAgICAgY2FzZSA3OlxuICAgICAgICAgICAgX3N0ZXAgPSBfY29udGV4dC5zZW50O1xuICAgICAgICAgICAgX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbiA9IF9zdGVwLmRvbmU7XG4gICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMTE7XG4gICAgICAgICAgICByZXR1cm4gX2F3YWl0QXN5bmNHZW5lcmF0b3IoX3N0ZXAudmFsdWUpO1xuXG4gICAgICAgICAgY2FzZSAxMTpcbiAgICAgICAgICAgIF92YWx1ZSA9IF9jb250ZXh0LnNlbnQ7XG5cbiAgICAgICAgICAgIGlmIChfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uKSB7XG4gICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAyMDtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhbHVlID0gX3ZhbHVlO1xuXG4gICAgICAgICAgICBpZiAoIShpKysgPj0gbikpIHtcbiAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDE3O1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDE3O1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuXG4gICAgICAgICAgY2FzZSAxNzpcbiAgICAgICAgICAgIF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24gPSB0cnVlO1xuICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDU7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgMjA6XG4gICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMjY7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgMjI6XG4gICAgICAgICAgICBfY29udGV4dC5wcmV2ID0gMjI7XG4gICAgICAgICAgICBfY29udGV4dC50MCA9IF9jb250ZXh0W1wiY2F0Y2hcIl0oMyk7XG4gICAgICAgICAgICBfZGlkSXRlcmF0b3JFcnJvciA9IHRydWU7XG4gICAgICAgICAgICBfaXRlcmF0b3JFcnJvciA9IF9jb250ZXh0LnQwO1xuXG4gICAgICAgICAgY2FzZSAyNjpcbiAgICAgICAgICAgIF9jb250ZXh0LnByZXYgPSAyNjtcbiAgICAgICAgICAgIF9jb250ZXh0LnByZXYgPSAyNztcblxuICAgICAgICAgICAgaWYgKCEoIV9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24gJiYgX2l0ZXJhdG9yW1wicmV0dXJuXCJdICE9IG51bGwpKSB7XG4gICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAzMTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAzMTtcbiAgICAgICAgICAgIHJldHVybiBfYXdhaXRBc3luY0dlbmVyYXRvcihfaXRlcmF0b3JbXCJyZXR1cm5cIl0oKSk7XG5cbiAgICAgICAgICBjYXNlIDMxOlxuICAgICAgICAgICAgX2NvbnRleHQucHJldiA9IDMxO1xuXG4gICAgICAgICAgICBpZiAoIV9kaWRJdGVyYXRvckVycm9yKSB7XG4gICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAzNDtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRocm93IF9pdGVyYXRvckVycm9yO1xuXG4gICAgICAgICAgY2FzZSAzNDpcbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5maW5pc2goMzEpO1xuXG4gICAgICAgICAgY2FzZSAzNTpcbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5maW5pc2goMjYpO1xuXG4gICAgICAgICAgY2FzZSAzNjpcbiAgICAgICAgICBjYXNlIFwiZW5kXCI6XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuc3RvcCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwgX2NhbGxlZSwgbnVsbCwgW1szLCAyMiwgMjYsIDM2XSwgWzI3LCwgMzEsIDM1XV0pO1xuICB9KSk7XG4gIHJldHVybiBfYXN5bmNEcm9wLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5cbnZhciBhc3luY0Ryb3AgPSAvKiNfX1BVUkVfXyovYXN5bmNJdGVyYWJsZUN1cnJ5KF9fYXN5bmNEcm9wKTtcbmV4cG9ydHMuYXN5bmNEcm9wID0gYXN5bmNEcm9wOyIsInZhciBfcmVnZW5lcmF0b3JSdW50aW1lID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL3JlZ2VuZXJhdG9yXCIpO1xuXG52YXIgX21hcmtlZCA9IC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3JSdW50aW1lLm1hcmsoX19kcm9wKTtcblxuZnVuY3Rpb24gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIobywgYWxsb3dBcnJheUxpa2UpIHsgdmFyIGl0OyBpZiAodHlwZW9mIFN5bWJvbCA9PT0gXCJ1bmRlZmluZWRcIiB8fCBvW1N5bWJvbC5pdGVyYXRvcl0gPT0gbnVsbCkgeyBpZiAoQXJyYXkuaXNBcnJheShvKSB8fCAoaXQgPSBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkobykpIHx8IGFsbG93QXJyYXlMaWtlICYmIG8gJiYgdHlwZW9mIG8ubGVuZ3RoID09PSBcIm51bWJlclwiKSB7IGlmIChpdCkgbyA9IGl0OyB2YXIgaSA9IDA7IHZhciBGID0gZnVuY3Rpb24gRigpIHt9OyByZXR1cm4geyBzOiBGLCBuOiBmdW5jdGlvbiBuKCkgeyBpZiAoaSA+PSBvLmxlbmd0aCkgcmV0dXJuIHsgZG9uZTogdHJ1ZSB9OyByZXR1cm4geyBkb25lOiBmYWxzZSwgdmFsdWU6IG9baSsrXSB9OyB9LCBlOiBmdW5jdGlvbiBlKF9lKSB7IHRocm93IF9lOyB9LCBmOiBGIH07IH0gdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBpdGVyYXRlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpOyB9IHZhciBub3JtYWxDb21wbGV0aW9uID0gdHJ1ZSwgZGlkRXJyID0gZmFsc2UsIGVycjsgcmV0dXJuIHsgczogZnVuY3Rpb24gcygpIHsgaXQgPSBvW1N5bWJvbC5pdGVyYXRvcl0oKTsgfSwgbjogZnVuY3Rpb24gbigpIHsgdmFyIHN0ZXAgPSBpdC5uZXh0KCk7IG5vcm1hbENvbXBsZXRpb24gPSBzdGVwLmRvbmU7IHJldHVybiBzdGVwOyB9LCBlOiBmdW5jdGlvbiBlKF9lMikgeyBkaWRFcnIgPSB0cnVlOyBlcnIgPSBfZTI7IH0sIGY6IGZ1bmN0aW9uIGYoKSB7IHRyeSB7IGlmICghbm9ybWFsQ29tcGxldGlvbiAmJiBpdFtcInJldHVyblwiXSAhPSBudWxsKSBpdFtcInJldHVyblwiXSgpOyB9IGZpbmFsbHkgeyBpZiAoZGlkRXJyKSB0aHJvdyBlcnI7IH0gfSB9OyB9XG5cbmZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvLCBtaW5MZW4pIHsgaWYgKCFvKSByZXR1cm47IGlmICh0eXBlb2YgbyA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IHZhciBuID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pLnNsaWNlKDgsIC0xKTsgaWYgKG4gPT09IFwiT2JqZWN0XCIgJiYgby5jb25zdHJ1Y3RvcikgbiA9IG8uY29uc3RydWN0b3IubmFtZTsgaWYgKG4gPT09IFwiTWFwXCIgfHwgbiA9PT0gXCJTZXRcIikgcmV0dXJuIEFycmF5LmZyb20obyk7IGlmIChuID09PSBcIkFyZ3VtZW50c1wiIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTsgfVxuXG5mdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheShhcnIsIGxlbikgeyBpZiAobGVuID09IG51bGwgfHwgbGVuID4gYXJyLmxlbmd0aCkgbGVuID0gYXJyLmxlbmd0aDsgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkobGVuKTsgaSA8IGxlbjsgaSsrKSB7IGFycjJbaV0gPSBhcnJbaV07IH0gcmV0dXJuIGFycjI7IH1cblxudmFyIF9yZXF1aXJlID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWwvaXRlcmFibGUuanMnKSxcbiAgICBpdGVyYWJsZUN1cnJ5ID0gX3JlcXVpcmUuaXRlcmFibGVDdXJyeTtcblxuZnVuY3Rpb24gX19kcm9wKGl0ZXJhYmxlLCBuKSB7XG4gIHZhciBpLCBfaXRlcmF0b3IsIF9zdGVwLCB2YWx1ZTtcblxuICByZXR1cm4gX3JlZ2VuZXJhdG9yUnVudGltZS53cmFwKGZ1bmN0aW9uIF9fZHJvcCQoX2NvbnRleHQpIHtcbiAgICB3aGlsZSAoMSkge1xuICAgICAgc3dpdGNoIChfY29udGV4dC5wcmV2ID0gX2NvbnRleHQubmV4dCkge1xuICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgaSA9IDA7XG4gICAgICAgICAgX2l0ZXJhdG9yID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIoaXRlcmFibGUpO1xuICAgICAgICAgIF9jb250ZXh0LnByZXYgPSAyO1xuXG4gICAgICAgICAgX2l0ZXJhdG9yLnMoKTtcblxuICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgaWYgKChfc3RlcCA9IF9pdGVyYXRvci5uKCkpLmRvbmUpIHtcbiAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAxMTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhbHVlID0gX3N0ZXAudmFsdWU7XG5cbiAgICAgICAgICBpZiAoIShpKysgPj0gbikpIHtcbiAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSA5O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgX2NvbnRleHQubmV4dCA9IDk7XG4gICAgICAgICAgcmV0dXJuIHZhbHVlO1xuXG4gICAgICAgIGNhc2UgOTpcbiAgICAgICAgICBfY29udGV4dC5uZXh0ID0gNDtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIDExOlxuICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAxNjtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIDEzOlxuICAgICAgICAgIF9jb250ZXh0LnByZXYgPSAxMztcbiAgICAgICAgICBfY29udGV4dC50MCA9IF9jb250ZXh0W1wiY2F0Y2hcIl0oMik7XG5cbiAgICAgICAgICBfaXRlcmF0b3IuZShfY29udGV4dC50MCk7XG5cbiAgICAgICAgY2FzZSAxNjpcbiAgICAgICAgICBfY29udGV4dC5wcmV2ID0gMTY7XG5cbiAgICAgICAgICBfaXRlcmF0b3IuZigpO1xuXG4gICAgICAgICAgcmV0dXJuIF9jb250ZXh0LmZpbmlzaCgxNik7XG5cbiAgICAgICAgY2FzZSAxOTpcbiAgICAgICAgY2FzZSBcImVuZFwiOlxuICAgICAgICAgIHJldHVybiBfY29udGV4dC5zdG9wKCk7XG4gICAgICB9XG4gICAgfVxuICB9LCBfbWFya2VkLCBudWxsLCBbWzIsIDEzLCAxNiwgMTldXSk7XG59XG5cbmV4cG9ydHMuX19kcm9wID0gX19kcm9wO1xudmFyIGRyb3AgPSAvKiNfX1BVUkVfXyovaXRlcmFibGVDdXJyeShfX2Ryb3ApO1xuZXhwb3J0cy5kcm9wID0gZHJvcDsiLCJ2YXIgX3JlcXVpcmUgPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbC9hc3luYy1pdGVyYWJsZS5qcycpLFxuICAgIGFzeW5jSXRlcmFibGVDdXJyeSA9IF9yZXF1aXJlLmFzeW5jSXRlcmFibGVDdXJyeTtcblxudmFyIF9yZXF1aXJlMiA9IHJlcXVpcmUoJy4uLyRtYXAvYXN5bmMtbWFwLmpzJyksXG4gICAgX19hc3luY01hcCA9IF9yZXF1aXJlMi5fX2FzeW5jTWFwO1xuXG5mdW5jdGlvbiBfX2FzeW5jRW51bWVyYXRlKHNvdXJjZSkge1xuICB2YXIgc3RhcnQgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IDA7XG4gIHJldHVybiBfX2FzeW5jTWFwKHNvdXJjZSwgZnVuY3Rpb24gKHZhbHVlLCBpKSB7XG4gICAgcmV0dXJuIFtzdGFydCArIGksIHZhbHVlXTtcbiAgfSk7XG59XG5cbmV4cG9ydHMuX19hc3luY0VudW1lcmF0ZSA9IF9fYXN5bmNFbnVtZXJhdGU7XG52YXIgYXN5bmNFbnVtZXJhdGUgPSAvKiNfX1BVUkVfXyovYXN5bmNJdGVyYWJsZUN1cnJ5KF9fYXN5bmNFbnVtZXJhdGUsIHtcbiAgbWluQXJnczogMCxcbiAgbWF4QXJnczogMVxufSk7XG5leHBvcnRzLmFzeW5jRW51bWVyYXRlID0gYXN5bmNFbnVtZXJhdGU7IiwidmFyIF9yZXF1aXJlID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWwvaXRlcmFibGUuanMnKSxcbiAgICBpdGVyYWJsZUN1cnJ5ID0gX3JlcXVpcmUuaXRlcmFibGVDdXJyeTtcblxudmFyIF9yZXF1aXJlMiA9IHJlcXVpcmUoJy4uLyRtYXAvbWFwLmpzJyksXG4gICAgX19tYXAgPSBfcmVxdWlyZTIuX19tYXA7XG5cbmZ1bmN0aW9uIF9fZW51bWVyYXRlKHNvdXJjZSkge1xuICB2YXIgc3RhcnQgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IDA7XG4gIHJldHVybiBfX21hcChzb3VyY2UsIGZ1bmN0aW9uICh2YWx1ZSwgaSkge1xuICAgIHJldHVybiBbc3RhcnQgKyBpLCB2YWx1ZV07XG4gIH0pO1xufVxuXG5leHBvcnRzLl9fZW51bWVyYXRlID0gX19lbnVtZXJhdGU7XG52YXIgZW51bWVyYXRlID0gLyojX19QVVJFX18qL2l0ZXJhYmxlQ3VycnkoX19lbnVtZXJhdGUsIHtcbiAgbWluQXJnczogMCxcbiAgbWF4QXJnczogMVxufSk7XG5leHBvcnRzLmVudW1lcmF0ZSA9IGVudW1lcmF0ZTsiLCJ2YXIgX3JlZ2VuZXJhdG9yUnVudGltZSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9yZWdlbmVyYXRvclwiKTtcblxudmFyIF9hc3luY1RvR2VuZXJhdG9yID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvYXN5bmNUb0dlbmVyYXRvclwiKTtcblxuZnVuY3Rpb24gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIobywgYWxsb3dBcnJheUxpa2UpIHsgdmFyIGl0OyBpZiAodHlwZW9mIFN5bWJvbCA9PT0gXCJ1bmRlZmluZWRcIiB8fCBvW1N5bWJvbC5pdGVyYXRvcl0gPT0gbnVsbCkgeyBpZiAoQXJyYXkuaXNBcnJheShvKSB8fCAoaXQgPSBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkobykpIHx8IGFsbG93QXJyYXlMaWtlICYmIG8gJiYgdHlwZW9mIG8ubGVuZ3RoID09PSBcIm51bWJlclwiKSB7IGlmIChpdCkgbyA9IGl0OyB2YXIgaSA9IDA7IHZhciBGID0gZnVuY3Rpb24gRigpIHt9OyByZXR1cm4geyBzOiBGLCBuOiBmdW5jdGlvbiBuKCkgeyBpZiAoaSA+PSBvLmxlbmd0aCkgcmV0dXJuIHsgZG9uZTogdHJ1ZSB9OyByZXR1cm4geyBkb25lOiBmYWxzZSwgdmFsdWU6IG9baSsrXSB9OyB9LCBlOiBmdW5jdGlvbiBlKF9lKSB7IHRocm93IF9lOyB9LCBmOiBGIH07IH0gdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBpdGVyYXRlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpOyB9IHZhciBub3JtYWxDb21wbGV0aW9uID0gdHJ1ZSwgZGlkRXJyID0gZmFsc2UsIGVycjsgcmV0dXJuIHsgczogZnVuY3Rpb24gcygpIHsgaXQgPSBvW1N5bWJvbC5pdGVyYXRvcl0oKTsgfSwgbjogZnVuY3Rpb24gbigpIHsgdmFyIHN0ZXAgPSBpdC5uZXh0KCk7IG5vcm1hbENvbXBsZXRpb24gPSBzdGVwLmRvbmU7IHJldHVybiBzdGVwOyB9LCBlOiBmdW5jdGlvbiBlKF9lMikgeyBkaWRFcnIgPSB0cnVlOyBlcnIgPSBfZTI7IH0sIGY6IGZ1bmN0aW9uIGYoKSB7IHRyeSB7IGlmICghbm9ybWFsQ29tcGxldGlvbiAmJiBpdFtcInJldHVyblwiXSAhPSBudWxsKSBpdFtcInJldHVyblwiXSgpOyB9IGZpbmFsbHkgeyBpZiAoZGlkRXJyKSB0aHJvdyBlcnI7IH0gfSB9OyB9XG5cbmZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvLCBtaW5MZW4pIHsgaWYgKCFvKSByZXR1cm47IGlmICh0eXBlb2YgbyA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IHZhciBuID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pLnNsaWNlKDgsIC0xKTsgaWYgKG4gPT09IFwiT2JqZWN0XCIgJiYgby5jb25zdHJ1Y3RvcikgbiA9IG8uY29uc3RydWN0b3IubmFtZTsgaWYgKG4gPT09IFwiTWFwXCIgfHwgbiA9PT0gXCJTZXRcIikgcmV0dXJuIEFycmF5LmZyb20obyk7IGlmIChuID09PSBcIkFyZ3VtZW50c1wiIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTsgfVxuXG5mdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheShhcnIsIGxlbikgeyBpZiAobGVuID09IG51bGwgfHwgbGVuID4gYXJyLmxlbmd0aCkgbGVuID0gYXJyLmxlbmd0aDsgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkobGVuKTsgaSA8IGxlbjsgaSsrKSB7IGFycjJbaV0gPSBhcnJbaV07IH0gcmV0dXJuIGFycjI7IH1cblxudmFyIF9hc3luY0l0ZXJhdG9yID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvYXN5bmNJdGVyYXRvclwiKTtcblxudmFyIF9yZXF1aXJlID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWwvYXN5bmMtaXRlcmFibGUuanMnKSxcbiAgICBhc3luY0l0ZXJhYmxlQ3VycnkgPSBfcmVxdWlyZS5hc3luY0l0ZXJhYmxlQ3Vycnk7XG5cbnZhciBfcmVxdWlyZTIgPSByZXF1aXJlKCcuLi8kemlwLWFsbC9hc3luYy16aXAtYWxsLmpzJyksXG4gICAgX19hc3luY1ppcEFsbCA9IF9yZXF1aXJlMi5fX2FzeW5jWmlwQWxsO1xuXG52YXIgX3JlcXVpcmUzID0gcmVxdWlyZSgnLi4vJHNsaWNlL3NsaWNlLmpzJyksXG4gICAgX19zbGljZUZyb21TdGFydCA9IF9yZXF1aXJlMy5fX3NsaWNlRnJvbVN0YXJ0O1xuXG52YXIgbm9uZSA9IFN5bWJvbCgnbm9uZScpO1xudmFyIHppcEFsbENvbmZpZyA9IHtcbiAgZmlsbGVyOiBub25lXG59O1xuXG5mdW5jdGlvbiBfX2FzeW5jRXF1YWwoX3gpIHtcbiAgcmV0dXJuIF9hc3luY0VxdWFsLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5cbmZ1bmN0aW9uIF9hc3luY0VxdWFsKCkge1xuICBfYXN5bmNFcXVhbCA9IF9hc3luY1RvR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yUnVudGltZS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUoaXRlcmFibGVzKSB7XG4gICAgdmFyIHNhbWUsXG4gICAgICAgIF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24sXG4gICAgICAgIF9kaWRJdGVyYXRvckVycm9yLFxuICAgICAgICBfaXRlcmF0b3JFcnJvcixcbiAgICAgICAgX2l0ZXJhdG9yLFxuICAgICAgICBfc3RlcCxcbiAgICAgICAgX3ZhbHVlLFxuICAgICAgICBzdGVwVmFsdWVzLFxuICAgICAgICBmaXJzdFZhbHVlLFxuICAgICAgICBfaXRlcmF0b3IyLFxuICAgICAgICBfc3RlcDIsXG4gICAgICAgIHZhbHVlLFxuICAgICAgICBfYXJncyA9IGFyZ3VtZW50cztcblxuICAgIHJldHVybiBfcmVnZW5lcmF0b3JSdW50aW1lLndyYXAoZnVuY3Rpb24gX2NhbGxlZSQoX2NvbnRleHQpIHtcbiAgICAgIHdoaWxlICgxKSB7XG4gICAgICAgIHN3aXRjaCAoX2NvbnRleHQucHJldiA9IF9jb250ZXh0Lm5leHQpIHtcbiAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICBzYW1lID0gX2FyZ3MubGVuZ3RoID4gMSAmJiBfYXJnc1sxXSAhPT0gdW5kZWZpbmVkID8gX2FyZ3NbMV0gOiBPYmplY3QuaXM7XG5cbiAgICAgICAgICAgIGlmICghKGl0ZXJhYmxlcy5sZW5ndGggPD0gMSkpIHtcbiAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDM7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuYWJydXB0KFwicmV0dXJuXCIsIHRydWUpO1xuXG4gICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbiA9IHRydWU7XG4gICAgICAgICAgICBfZGlkSXRlcmF0b3JFcnJvciA9IGZhbHNlO1xuICAgICAgICAgICAgX2NvbnRleHQucHJldiA9IDU7XG4gICAgICAgICAgICBfaXRlcmF0b3IgPSBfYXN5bmNJdGVyYXRvcihfX2FzeW5jWmlwQWxsKGl0ZXJhYmxlcywgemlwQWxsQ29uZmlnKSk7XG5cbiAgICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gOTtcbiAgICAgICAgICAgIHJldHVybiBfaXRlcmF0b3IubmV4dCgpO1xuXG4gICAgICAgICAgY2FzZSA5OlxuICAgICAgICAgICAgX3N0ZXAgPSBfY29udGV4dC5zZW50O1xuICAgICAgICAgICAgX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbiA9IF9zdGVwLmRvbmU7XG4gICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMTM7XG4gICAgICAgICAgICByZXR1cm4gX3N0ZXAudmFsdWU7XG5cbiAgICAgICAgICBjYXNlIDEzOlxuICAgICAgICAgICAgX3ZhbHVlID0gX2NvbnRleHQuc2VudDtcblxuICAgICAgICAgICAgaWYgKF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24pIHtcbiAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDM3O1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgc3RlcFZhbHVlcyA9IF92YWx1ZTtcbiAgICAgICAgICAgIGZpcnN0VmFsdWUgPSBzdGVwVmFsdWVzWzBdO1xuICAgICAgICAgICAgX2l0ZXJhdG9yMiA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKF9fc2xpY2VGcm9tU3RhcnQoc3RlcFZhbHVlcywgMSkpO1xuICAgICAgICAgICAgX2NvbnRleHQucHJldiA9IDE4O1xuXG4gICAgICAgICAgICBfaXRlcmF0b3IyLnMoKTtcblxuICAgICAgICAgIGNhc2UgMjA6XG4gICAgICAgICAgICBpZiAoKF9zdGVwMiA9IF9pdGVyYXRvcjIubigpKS5kb25lKSB7XG4gICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAyNjtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhbHVlID0gX3N0ZXAyLnZhbHVlO1xuXG4gICAgICAgICAgICBpZiAoc2FtZSh2YWx1ZSwgZmlyc3RWYWx1ZSkpIHtcbiAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDI0O1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LmFicnVwdChcInJldHVyblwiLCBmYWxzZSk7XG5cbiAgICAgICAgICBjYXNlIDI0OlxuICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDIwO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlIDI2OlxuICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDMxO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlIDI4OlxuICAgICAgICAgICAgX2NvbnRleHQucHJldiA9IDI4O1xuICAgICAgICAgICAgX2NvbnRleHQudDAgPSBfY29udGV4dFtcImNhdGNoXCJdKDE4KTtcblxuICAgICAgICAgICAgX2l0ZXJhdG9yMi5lKF9jb250ZXh0LnQwKTtcblxuICAgICAgICAgIGNhc2UgMzE6XG4gICAgICAgICAgICBfY29udGV4dC5wcmV2ID0gMzE7XG5cbiAgICAgICAgICAgIF9pdGVyYXRvcjIuZigpO1xuXG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuZmluaXNoKDMxKTtcblxuICAgICAgICAgIGNhc2UgMzQ6XG4gICAgICAgICAgICBfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uID0gdHJ1ZTtcbiAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSA3O1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlIDM3OlxuICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDQzO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlIDM5OlxuICAgICAgICAgICAgX2NvbnRleHQucHJldiA9IDM5O1xuICAgICAgICAgICAgX2NvbnRleHQudDEgPSBfY29udGV4dFtcImNhdGNoXCJdKDUpO1xuICAgICAgICAgICAgX2RpZEl0ZXJhdG9yRXJyb3IgPSB0cnVlO1xuICAgICAgICAgICAgX2l0ZXJhdG9yRXJyb3IgPSBfY29udGV4dC50MTtcblxuICAgICAgICAgIGNhc2UgNDM6XG4gICAgICAgICAgICBfY29udGV4dC5wcmV2ID0gNDM7XG4gICAgICAgICAgICBfY29udGV4dC5wcmV2ID0gNDQ7XG5cbiAgICAgICAgICAgIGlmICghKCFfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uICYmIF9pdGVyYXRvcltcInJldHVyblwiXSAhPSBudWxsKSkge1xuICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gNDg7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gNDg7XG4gICAgICAgICAgICByZXR1cm4gX2l0ZXJhdG9yW1wicmV0dXJuXCJdKCk7XG5cbiAgICAgICAgICBjYXNlIDQ4OlxuICAgICAgICAgICAgX2NvbnRleHQucHJldiA9IDQ4O1xuXG4gICAgICAgICAgICBpZiAoIV9kaWRJdGVyYXRvckVycm9yKSB7XG4gICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSA1MTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRocm93IF9pdGVyYXRvckVycm9yO1xuXG4gICAgICAgICAgY2FzZSA1MTpcbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5maW5pc2goNDgpO1xuXG4gICAgICAgICAgY2FzZSA1MjpcbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5maW5pc2goNDMpO1xuXG4gICAgICAgICAgY2FzZSA1MzpcbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5hYnJ1cHQoXCJyZXR1cm5cIiwgdHJ1ZSk7XG5cbiAgICAgICAgICBjYXNlIDU0OlxuICAgICAgICAgIGNhc2UgXCJlbmRcIjpcbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5zdG9wKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCBfY2FsbGVlLCBudWxsLCBbWzUsIDM5LCA0MywgNTNdLCBbMTgsIDI4LCAzMSwgMzRdLCBbNDQsLCA0OCwgNTJdXSk7XG4gIH0pKTtcbiAgcmV0dXJuIF9hc3luY0VxdWFsLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5cbmV4cG9ydHMuX19hc3luY0VxdWFsID0gX19hc3luY0VxdWFsO1xudmFyIGFzeW5jRXF1YWwgPSAvKiNfX1BVUkVfXyovYXN5bmNJdGVyYWJsZUN1cnJ5KF9fYXN5bmNFcXVhbCwge1xuICBtaW5BcmdzOiAwLFxuICBtYXhBcmdzOiAxLFxuICB2YXJpYWRpYzogdHJ1ZSxcbiAgcmVkdWNlczogdHJ1ZVxufSk7XG5leHBvcnRzLmFzeW5jRXF1YWwgPSBhc3luY0VxdWFsOyIsImZ1bmN0aW9uIF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKG8sIGFsbG93QXJyYXlMaWtlKSB7IHZhciBpdDsgaWYgKHR5cGVvZiBTeW1ib2wgPT09IFwidW5kZWZpbmVkXCIgfHwgb1tTeW1ib2wuaXRlcmF0b3JdID09IG51bGwpIHsgaWYgKEFycmF5LmlzQXJyYXkobykgfHwgKGl0ID0gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8pKSB8fCBhbGxvd0FycmF5TGlrZSAmJiBvICYmIHR5cGVvZiBvLmxlbmd0aCA9PT0gXCJudW1iZXJcIikgeyBpZiAoaXQpIG8gPSBpdDsgdmFyIGkgPSAwOyB2YXIgRiA9IGZ1bmN0aW9uIEYoKSB7fTsgcmV0dXJuIHsgczogRiwgbjogZnVuY3Rpb24gbigpIHsgaWYgKGkgPj0gby5sZW5ndGgpIHJldHVybiB7IGRvbmU6IHRydWUgfTsgcmV0dXJuIHsgZG9uZTogZmFsc2UsIHZhbHVlOiBvW2krK10gfTsgfSwgZTogZnVuY3Rpb24gZShfZSkgeyB0aHJvdyBfZTsgfSwgZjogRiB9OyB9IHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gaXRlcmF0ZSBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTsgfSB2YXIgbm9ybWFsQ29tcGxldGlvbiA9IHRydWUsIGRpZEVyciA9IGZhbHNlLCBlcnI7IHJldHVybiB7IHM6IGZ1bmN0aW9uIHMoKSB7IGl0ID0gb1tTeW1ib2wuaXRlcmF0b3JdKCk7IH0sIG46IGZ1bmN0aW9uIG4oKSB7IHZhciBzdGVwID0gaXQubmV4dCgpOyBub3JtYWxDb21wbGV0aW9uID0gc3RlcC5kb25lOyByZXR1cm4gc3RlcDsgfSwgZTogZnVuY3Rpb24gZShfZTIpIHsgZGlkRXJyID0gdHJ1ZTsgZXJyID0gX2UyOyB9LCBmOiBmdW5jdGlvbiBmKCkgeyB0cnkgeyBpZiAoIW5vcm1hbENvbXBsZXRpb24gJiYgaXRbXCJyZXR1cm5cIl0gIT0gbnVsbCkgaXRbXCJyZXR1cm5cIl0oKTsgfSBmaW5hbGx5IHsgaWYgKGRpZEVycikgdGhyb3cgZXJyOyB9IH0gfTsgfVxuXG5mdW5jdGlvbiBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkobywgbWluTGVuKSB7IGlmICghbykgcmV0dXJuOyBpZiAodHlwZW9mIG8gPT09IFwic3RyaW5nXCIpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pOyB2YXIgbiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKS5zbGljZSg4LCAtMSk7IGlmIChuID09PSBcIk9iamVjdFwiICYmIG8uY29uc3RydWN0b3IpIG4gPSBvLmNvbnN0cnVjdG9yLm5hbWU7IGlmIChuID09PSBcIk1hcFwiIHx8IG4gPT09IFwiU2V0XCIpIHJldHVybiBBcnJheS5mcm9tKG8pOyBpZiAobiA9PT0gXCJBcmd1bWVudHNcIiB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSkgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IH1cblxuZnVuY3Rpb24gX2FycmF5TGlrZVRvQXJyYXkoYXJyLCBsZW4pIHsgaWYgKGxlbiA9PSBudWxsIHx8IGxlbiA+IGFyci5sZW5ndGgpIGxlbiA9IGFyci5sZW5ndGg7IGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGxlbik7IGkgPCBsZW47IGkrKykgeyBhcnIyW2ldID0gYXJyW2ldOyB9IHJldHVybiBhcnIyOyB9XG5cbnZhciBfcmVxdWlyZSA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFsL2l0ZXJhYmxlLmpzJyksXG4gICAgaXRlcmFibGVDdXJyeSA9IF9yZXF1aXJlLml0ZXJhYmxlQ3Vycnk7XG5cbnZhciBfcmVxdWlyZTIgPSByZXF1aXJlKCcuLi8kemlwLWFsbC96aXAtYWxsLmpzJyksXG4gICAgX196aXBBbGwgPSBfcmVxdWlyZTIuX196aXBBbGw7XG5cbnZhciBfcmVxdWlyZTMgPSByZXF1aXJlKCcuLi8kc2xpY2Uvc2xpY2UuanMnKSxcbiAgICBfX3NsaWNlRnJvbVN0YXJ0ID0gX3JlcXVpcmUzLl9fc2xpY2VGcm9tU3RhcnQ7XG5cbnZhciBub25lID0gU3ltYm9sKCdub25lJyk7XG52YXIgemlwQWxsQ29uZmlnID0ge1xuICBmaWxsZXI6IG5vbmVcbn07XG5cbmZ1bmN0aW9uIF9fZXF1YWwoaXRlcmFibGVzKSB7XG4gIHZhciBzYW1lID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBPYmplY3QuaXM7XG4gIGlmIChpdGVyYWJsZXMubGVuZ3RoIDw9IDEpIHJldHVybiB0cnVlO1xuXG4gIHZhciBfaXRlcmF0b3IgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihfX3ppcEFsbChpdGVyYWJsZXMsIHppcEFsbENvbmZpZykpLFxuICAgICAgX3N0ZXA7XG5cbiAgdHJ5IHtcbiAgICBmb3IgKF9pdGVyYXRvci5zKCk7ICEoX3N0ZXAgPSBfaXRlcmF0b3IubigpKS5kb25lOykge1xuICAgICAgdmFyIHN0ZXBWYWx1ZXMgPSBfc3RlcC52YWx1ZTtcbiAgICAgIHZhciBmaXJzdFZhbHVlID0gc3RlcFZhbHVlc1swXTtcblxuICAgICAgdmFyIF9pdGVyYXRvcjIgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihfX3NsaWNlRnJvbVN0YXJ0KHN0ZXBWYWx1ZXMsIDEpKSxcbiAgICAgICAgICBfc3RlcDI7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGZvciAoX2l0ZXJhdG9yMi5zKCk7ICEoX3N0ZXAyID0gX2l0ZXJhdG9yMi5uKCkpLmRvbmU7KSB7XG4gICAgICAgICAgdmFyIHZhbHVlID0gX3N0ZXAyLnZhbHVlO1xuICAgICAgICAgIGlmICghc2FtZSh2YWx1ZSwgZmlyc3RWYWx1ZSkpIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIF9pdGVyYXRvcjIuZShlcnIpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgX2l0ZXJhdG9yMi5mKCk7XG4gICAgICB9XG4gICAgfVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBfaXRlcmF0b3IuZShlcnIpO1xuICB9IGZpbmFsbHkge1xuICAgIF9pdGVyYXRvci5mKCk7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZXhwb3J0cy5fX2VxdWFsID0gX19lcXVhbDtcbnZhciBlcXVhbCA9IC8qI19fUFVSRV9fKi9pdGVyYWJsZUN1cnJ5KF9fZXF1YWwsIHtcbiAgbWluQXJnczogMCxcbiAgbWF4QXJnczogMSxcbiAgdmFyaWFkaWM6IHRydWUsXG4gIHJlZHVjZXM6IHRydWVcbn0pO1xuZXhwb3J0cy5lcXVhbCA9IGVxdWFsOyIsInZhciBfcmVnZW5lcmF0b3JSdW50aW1lID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL3JlZ2VuZXJhdG9yXCIpO1xuXG52YXIgX2FzeW5jVG9HZW5lcmF0b3IgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9hc3luY1RvR2VuZXJhdG9yXCIpO1xuXG52YXIgX2FzeW5jSXRlcmF0b3IgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9hc3luY0l0ZXJhdG9yXCIpO1xuXG52YXIgX3JlcXVpcmUgPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbC9hc3luYy1pdGVyYWJsZS5qcycpLFxuICAgIGFzeW5jSXRlcmFibGVDdXJyeSA9IF9yZXF1aXJlLmFzeW5jSXRlcmFibGVDdXJyeTtcblxuZnVuY3Rpb24gX19hc3luY0V2ZXJ5KF94LCBfeDIpIHtcbiAgcmV0dXJuIF9hc3luY0V2ZXJ5LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5cbmZ1bmN0aW9uIF9hc3luY0V2ZXJ5KCkge1xuICBfYXN5bmNFdmVyeSA9IF9hc3luY1RvR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yUnVudGltZS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUoaXRlcmFibGUsIHByZWRpY2F0ZSkge1xuICAgIHZhciBjLCBfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uLCBfZGlkSXRlcmF0b3JFcnJvciwgX2l0ZXJhdG9yRXJyb3IsIF9pdGVyYXRvciwgX3N0ZXAsIF92YWx1ZSwgdmFsdWU7XG5cbiAgICByZXR1cm4gX3JlZ2VuZXJhdG9yUnVudGltZS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUkKF9jb250ZXh0KSB7XG4gICAgICB3aGlsZSAoMSkge1xuICAgICAgICBzd2l0Y2ggKF9jb250ZXh0LnByZXYgPSBfY29udGV4dC5uZXh0KSB7XG4gICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgYyA9IDA7XG4gICAgICAgICAgICBfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uID0gdHJ1ZTtcbiAgICAgICAgICAgIF9kaWRJdGVyYXRvckVycm9yID0gZmFsc2U7XG4gICAgICAgICAgICBfY29udGV4dC5wcmV2ID0gMztcbiAgICAgICAgICAgIF9pdGVyYXRvciA9IF9hc3luY0l0ZXJhdG9yKGl0ZXJhYmxlKTtcblxuICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSA3O1xuICAgICAgICAgICAgcmV0dXJuIF9pdGVyYXRvci5uZXh0KCk7XG5cbiAgICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgICBfc3RlcCA9IF9jb250ZXh0LnNlbnQ7XG4gICAgICAgICAgICBfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uID0gX3N0ZXAuZG9uZTtcbiAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAxMTtcbiAgICAgICAgICAgIHJldHVybiBfc3RlcC52YWx1ZTtcblxuICAgICAgICAgIGNhc2UgMTE6XG4gICAgICAgICAgICBfdmFsdWUgPSBfY29udGV4dC5zZW50O1xuXG4gICAgICAgICAgICBpZiAoX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbikge1xuICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMjE7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YWx1ZSA9IF92YWx1ZTtcbiAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAxNjtcbiAgICAgICAgICAgIHJldHVybiBwcmVkaWNhdGUodmFsdWUsIGMrKyk7XG5cbiAgICAgICAgICBjYXNlIDE2OlxuICAgICAgICAgICAgaWYgKF9jb250ZXh0LnNlbnQpIHtcbiAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDE4O1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LmFicnVwdChcInJldHVyblwiLCBmYWxzZSk7XG5cbiAgICAgICAgICBjYXNlIDE4OlxuICAgICAgICAgICAgX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbiA9IHRydWU7XG4gICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gNTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSAyMTpcbiAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAyNztcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSAyMzpcbiAgICAgICAgICAgIF9jb250ZXh0LnByZXYgPSAyMztcbiAgICAgICAgICAgIF9jb250ZXh0LnQwID0gX2NvbnRleHRbXCJjYXRjaFwiXSgzKTtcbiAgICAgICAgICAgIF9kaWRJdGVyYXRvckVycm9yID0gdHJ1ZTtcbiAgICAgICAgICAgIF9pdGVyYXRvckVycm9yID0gX2NvbnRleHQudDA7XG5cbiAgICAgICAgICBjYXNlIDI3OlxuICAgICAgICAgICAgX2NvbnRleHQucHJldiA9IDI3O1xuICAgICAgICAgICAgX2NvbnRleHQucHJldiA9IDI4O1xuXG4gICAgICAgICAgICBpZiAoISghX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbiAmJiBfaXRlcmF0b3JbXCJyZXR1cm5cIl0gIT0gbnVsbCkpIHtcbiAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDMyO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDMyO1xuICAgICAgICAgICAgcmV0dXJuIF9pdGVyYXRvcltcInJldHVyblwiXSgpO1xuXG4gICAgICAgICAgY2FzZSAzMjpcbiAgICAgICAgICAgIF9jb250ZXh0LnByZXYgPSAzMjtcblxuICAgICAgICAgICAgaWYgKCFfZGlkSXRlcmF0b3JFcnJvcikge1xuICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMzU7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aHJvdyBfaXRlcmF0b3JFcnJvcjtcblxuICAgICAgICAgIGNhc2UgMzU6XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuZmluaXNoKDMyKTtcblxuICAgICAgICAgIGNhc2UgMzY6XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuZmluaXNoKDI3KTtcblxuICAgICAgICAgIGNhc2UgMzc6XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuYWJydXB0KFwicmV0dXJuXCIsIHRydWUpO1xuXG4gICAgICAgICAgY2FzZSAzODpcbiAgICAgICAgICBjYXNlIFwiZW5kXCI6XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuc3RvcCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwgX2NhbGxlZSwgbnVsbCwgW1szLCAyMywgMjcsIDM3XSwgWzI4LCwgMzIsIDM2XV0pO1xuICB9KSk7XG4gIHJldHVybiBfYXN5bmNFdmVyeS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuXG5leHBvcnRzLl9fYXN5bmNFdmVyeSA9IF9fYXN5bmNFdmVyeTtcbnZhciBhc3luY0V2ZXJ5ID0gLyojX19QVVJFX18qL2FzeW5jSXRlcmFibGVDdXJyeShfX2FzeW5jRXZlcnksIHtcbiAgcmVkdWNlczogdHJ1ZVxufSk7XG5leHBvcnRzLmFzeW5jRXZlcnkgPSBhc3luY0V2ZXJ5OyIsImZ1bmN0aW9uIF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKG8sIGFsbG93QXJyYXlMaWtlKSB7IHZhciBpdDsgaWYgKHR5cGVvZiBTeW1ib2wgPT09IFwidW5kZWZpbmVkXCIgfHwgb1tTeW1ib2wuaXRlcmF0b3JdID09IG51bGwpIHsgaWYgKEFycmF5LmlzQXJyYXkobykgfHwgKGl0ID0gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8pKSB8fCBhbGxvd0FycmF5TGlrZSAmJiBvICYmIHR5cGVvZiBvLmxlbmd0aCA9PT0gXCJudW1iZXJcIikgeyBpZiAoaXQpIG8gPSBpdDsgdmFyIGkgPSAwOyB2YXIgRiA9IGZ1bmN0aW9uIEYoKSB7fTsgcmV0dXJuIHsgczogRiwgbjogZnVuY3Rpb24gbigpIHsgaWYgKGkgPj0gby5sZW5ndGgpIHJldHVybiB7IGRvbmU6IHRydWUgfTsgcmV0dXJuIHsgZG9uZTogZmFsc2UsIHZhbHVlOiBvW2krK10gfTsgfSwgZTogZnVuY3Rpb24gZShfZSkgeyB0aHJvdyBfZTsgfSwgZjogRiB9OyB9IHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gaXRlcmF0ZSBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTsgfSB2YXIgbm9ybWFsQ29tcGxldGlvbiA9IHRydWUsIGRpZEVyciA9IGZhbHNlLCBlcnI7IHJldHVybiB7IHM6IGZ1bmN0aW9uIHMoKSB7IGl0ID0gb1tTeW1ib2wuaXRlcmF0b3JdKCk7IH0sIG46IGZ1bmN0aW9uIG4oKSB7IHZhciBzdGVwID0gaXQubmV4dCgpOyBub3JtYWxDb21wbGV0aW9uID0gc3RlcC5kb25lOyByZXR1cm4gc3RlcDsgfSwgZTogZnVuY3Rpb24gZShfZTIpIHsgZGlkRXJyID0gdHJ1ZTsgZXJyID0gX2UyOyB9LCBmOiBmdW5jdGlvbiBmKCkgeyB0cnkgeyBpZiAoIW5vcm1hbENvbXBsZXRpb24gJiYgaXRbXCJyZXR1cm5cIl0gIT0gbnVsbCkgaXRbXCJyZXR1cm5cIl0oKTsgfSBmaW5hbGx5IHsgaWYgKGRpZEVycikgdGhyb3cgZXJyOyB9IH0gfTsgfVxuXG5mdW5jdGlvbiBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkobywgbWluTGVuKSB7IGlmICghbykgcmV0dXJuOyBpZiAodHlwZW9mIG8gPT09IFwic3RyaW5nXCIpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pOyB2YXIgbiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKS5zbGljZSg4LCAtMSk7IGlmIChuID09PSBcIk9iamVjdFwiICYmIG8uY29uc3RydWN0b3IpIG4gPSBvLmNvbnN0cnVjdG9yLm5hbWU7IGlmIChuID09PSBcIk1hcFwiIHx8IG4gPT09IFwiU2V0XCIpIHJldHVybiBBcnJheS5mcm9tKG8pOyBpZiAobiA9PT0gXCJBcmd1bWVudHNcIiB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSkgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IH1cblxuZnVuY3Rpb24gX2FycmF5TGlrZVRvQXJyYXkoYXJyLCBsZW4pIHsgaWYgKGxlbiA9PSBudWxsIHx8IGxlbiA+IGFyci5sZW5ndGgpIGxlbiA9IGFyci5sZW5ndGg7IGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGxlbik7IGkgPCBsZW47IGkrKykgeyBhcnIyW2ldID0gYXJyW2ldOyB9IHJldHVybiBhcnIyOyB9XG5cbnZhciBfcmVxdWlyZSA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFsL2l0ZXJhYmxlLmpzJyksXG4gICAgaXRlcmFibGVDdXJyeSA9IF9yZXF1aXJlLml0ZXJhYmxlQ3Vycnk7XG5cbmZ1bmN0aW9uIF9fZXZlcnkoaXRlcmFibGUsIHByZWRpY2F0ZSkge1xuICB2YXIgYyA9IDA7XG5cbiAgdmFyIF9pdGVyYXRvciA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKGl0ZXJhYmxlKSxcbiAgICAgIF9zdGVwO1xuXG4gIHRyeSB7XG4gICAgZm9yIChfaXRlcmF0b3IucygpOyAhKF9zdGVwID0gX2l0ZXJhdG9yLm4oKSkuZG9uZTspIHtcbiAgICAgIHZhciB2YWx1ZSA9IF9zdGVwLnZhbHVlO1xuXG4gICAgICBpZiAoIXByZWRpY2F0ZSh2YWx1ZSwgYysrKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBfaXRlcmF0b3IuZShlcnIpO1xuICB9IGZpbmFsbHkge1xuICAgIF9pdGVyYXRvci5mKCk7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZXhwb3J0cy5fX2V2ZXJ5ID0gX19ldmVyeTtcbnZhciBldmVyeSA9IC8qI19fUFVSRV9fKi9pdGVyYWJsZUN1cnJ5KF9fZXZlcnksIHtcbiAgcmVkdWNlczogdHJ1ZVxufSk7XG5leHBvcnRzLmV2ZXJ5ID0gZXZlcnk7IiwidmFyIF9yZWdlbmVyYXRvclJ1bnRpbWUgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvcmVnZW5lcmF0b3JcIik7XG5cbnZhciBfYXdhaXRBc3luY0dlbmVyYXRvciA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2F3YWl0QXN5bmNHZW5lcmF0b3JcIik7XG5cbnZhciBfd3JhcEFzeW5jR2VuZXJhdG9yID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvd3JhcEFzeW5jR2VuZXJhdG9yXCIpO1xuXG52YXIgX2FzeW5jSXRlcmF0b3IgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9hc3luY0l0ZXJhdG9yXCIpO1xuXG52YXIgX3JlcXVpcmUgPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbC9hc3luYy1pdGVyYWJsZS5qcycpLFxuICAgIGFzeW5jSXRlcmFibGVDdXJyeSA9IF9yZXF1aXJlLmFzeW5jSXRlcmFibGVDdXJyeTtcblxuZnVuY3Rpb24gX19hc3luY0ZpbHRlcihfeCwgX3gyKSB7XG4gIHJldHVybiBfYXN5bmNGaWx0ZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cblxuZXhwb3J0cy5fX2FzeW5jRmlsdGVyID0gX19hc3luY0ZpbHRlcjtcblxuZnVuY3Rpb24gX2FzeW5jRmlsdGVyKCkge1xuICBfYXN5bmNGaWx0ZXIgPSBfd3JhcEFzeW5jR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yUnVudGltZS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUoc291cmNlLCBwcmVkaWNhdGUpIHtcbiAgICB2YXIgYywgX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbiwgX2RpZEl0ZXJhdG9yRXJyb3IsIF9pdGVyYXRvckVycm9yLCBfaXRlcmF0b3IsIF9zdGVwLCBfdmFsdWUsIHZhbHVlO1xuXG4gICAgcmV0dXJuIF9yZWdlbmVyYXRvclJ1bnRpbWUud3JhcChmdW5jdGlvbiBfY2FsbGVlJChfY29udGV4dCkge1xuICAgICAgd2hpbGUgKDEpIHtcbiAgICAgICAgc3dpdGNoIChfY29udGV4dC5wcmV2ID0gX2NvbnRleHQubmV4dCkge1xuICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgIGMgPSAwO1xuICAgICAgICAgICAgX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbiA9IHRydWU7XG4gICAgICAgICAgICBfZGlkSXRlcmF0b3JFcnJvciA9IGZhbHNlO1xuICAgICAgICAgICAgX2NvbnRleHQucHJldiA9IDM7XG4gICAgICAgICAgICBfaXRlcmF0b3IgPSBfYXN5bmNJdGVyYXRvcihzb3VyY2UpO1xuXG4gICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDc7XG4gICAgICAgICAgICByZXR1cm4gX2F3YWl0QXN5bmNHZW5lcmF0b3IoX2l0ZXJhdG9yLm5leHQoKSk7XG5cbiAgICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgICBfc3RlcCA9IF9jb250ZXh0LnNlbnQ7XG4gICAgICAgICAgICBfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uID0gX3N0ZXAuZG9uZTtcbiAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAxMTtcbiAgICAgICAgICAgIHJldHVybiBfYXdhaXRBc3luY0dlbmVyYXRvcihfc3RlcC52YWx1ZSk7XG5cbiAgICAgICAgICBjYXNlIDExOlxuICAgICAgICAgICAgX3ZhbHVlID0gX2NvbnRleHQuc2VudDtcblxuICAgICAgICAgICAgaWYgKF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24pIHtcbiAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDIyO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFsdWUgPSBfdmFsdWU7XG4gICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMTY7XG4gICAgICAgICAgICByZXR1cm4gX2F3YWl0QXN5bmNHZW5lcmF0b3IocHJlZGljYXRlKHZhbHVlLCBjKyspKTtcblxuICAgICAgICAgIGNhc2UgMTY6XG4gICAgICAgICAgICBpZiAoIV9jb250ZXh0LnNlbnQpIHtcbiAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDE5O1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDE5O1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuXG4gICAgICAgICAgY2FzZSAxOTpcbiAgICAgICAgICAgIF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24gPSB0cnVlO1xuICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDU7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgMjI6XG4gICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMjg7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgMjQ6XG4gICAgICAgICAgICBfY29udGV4dC5wcmV2ID0gMjQ7XG4gICAgICAgICAgICBfY29udGV4dC50MCA9IF9jb250ZXh0W1wiY2F0Y2hcIl0oMyk7XG4gICAgICAgICAgICBfZGlkSXRlcmF0b3JFcnJvciA9IHRydWU7XG4gICAgICAgICAgICBfaXRlcmF0b3JFcnJvciA9IF9jb250ZXh0LnQwO1xuXG4gICAgICAgICAgY2FzZSAyODpcbiAgICAgICAgICAgIF9jb250ZXh0LnByZXYgPSAyODtcbiAgICAgICAgICAgIF9jb250ZXh0LnByZXYgPSAyOTtcblxuICAgICAgICAgICAgaWYgKCEoIV9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24gJiYgX2l0ZXJhdG9yW1wicmV0dXJuXCJdICE9IG51bGwpKSB7XG4gICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAzMztcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAzMztcbiAgICAgICAgICAgIHJldHVybiBfYXdhaXRBc3luY0dlbmVyYXRvcihfaXRlcmF0b3JbXCJyZXR1cm5cIl0oKSk7XG5cbiAgICAgICAgICBjYXNlIDMzOlxuICAgICAgICAgICAgX2NvbnRleHQucHJldiA9IDMzO1xuXG4gICAgICAgICAgICBpZiAoIV9kaWRJdGVyYXRvckVycm9yKSB7XG4gICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAzNjtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRocm93IF9pdGVyYXRvckVycm9yO1xuXG4gICAgICAgICAgY2FzZSAzNjpcbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5maW5pc2goMzMpO1xuXG4gICAgICAgICAgY2FzZSAzNzpcbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5maW5pc2goMjgpO1xuXG4gICAgICAgICAgY2FzZSAzODpcbiAgICAgICAgICBjYXNlIFwiZW5kXCI6XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuc3RvcCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwgX2NhbGxlZSwgbnVsbCwgW1szLCAyNCwgMjgsIDM4XSwgWzI5LCwgMzMsIDM3XV0pO1xuICB9KSk7XG4gIHJldHVybiBfYXN5bmNGaWx0ZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cblxudmFyIGFzeW5jRmlsdGVyID0gLyojX19QVVJFX18qL2FzeW5jSXRlcmFibGVDdXJyeShfX2FzeW5jRmlsdGVyKTtcbmV4cG9ydHMuYXN5bmNGaWx0ZXIgPSBhc3luY0ZpbHRlcjsiLCJ2YXIgX3JlZ2VuZXJhdG9yUnVudGltZSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9yZWdlbmVyYXRvclwiKTtcblxudmFyIF9tYXJrZWQgPSAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yUnVudGltZS5tYXJrKF9fZmlsdGVyKTtcblxuZnVuY3Rpb24gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIobywgYWxsb3dBcnJheUxpa2UpIHsgdmFyIGl0OyBpZiAodHlwZW9mIFN5bWJvbCA9PT0gXCJ1bmRlZmluZWRcIiB8fCBvW1N5bWJvbC5pdGVyYXRvcl0gPT0gbnVsbCkgeyBpZiAoQXJyYXkuaXNBcnJheShvKSB8fCAoaXQgPSBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkobykpIHx8IGFsbG93QXJyYXlMaWtlICYmIG8gJiYgdHlwZW9mIG8ubGVuZ3RoID09PSBcIm51bWJlclwiKSB7IGlmIChpdCkgbyA9IGl0OyB2YXIgaSA9IDA7IHZhciBGID0gZnVuY3Rpb24gRigpIHt9OyByZXR1cm4geyBzOiBGLCBuOiBmdW5jdGlvbiBuKCkgeyBpZiAoaSA+PSBvLmxlbmd0aCkgcmV0dXJuIHsgZG9uZTogdHJ1ZSB9OyByZXR1cm4geyBkb25lOiBmYWxzZSwgdmFsdWU6IG9baSsrXSB9OyB9LCBlOiBmdW5jdGlvbiBlKF9lKSB7IHRocm93IF9lOyB9LCBmOiBGIH07IH0gdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBpdGVyYXRlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpOyB9IHZhciBub3JtYWxDb21wbGV0aW9uID0gdHJ1ZSwgZGlkRXJyID0gZmFsc2UsIGVycjsgcmV0dXJuIHsgczogZnVuY3Rpb24gcygpIHsgaXQgPSBvW1N5bWJvbC5pdGVyYXRvcl0oKTsgfSwgbjogZnVuY3Rpb24gbigpIHsgdmFyIHN0ZXAgPSBpdC5uZXh0KCk7IG5vcm1hbENvbXBsZXRpb24gPSBzdGVwLmRvbmU7IHJldHVybiBzdGVwOyB9LCBlOiBmdW5jdGlvbiBlKF9lMikgeyBkaWRFcnIgPSB0cnVlOyBlcnIgPSBfZTI7IH0sIGY6IGZ1bmN0aW9uIGYoKSB7IHRyeSB7IGlmICghbm9ybWFsQ29tcGxldGlvbiAmJiBpdFtcInJldHVyblwiXSAhPSBudWxsKSBpdFtcInJldHVyblwiXSgpOyB9IGZpbmFsbHkgeyBpZiAoZGlkRXJyKSB0aHJvdyBlcnI7IH0gfSB9OyB9XG5cbmZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvLCBtaW5MZW4pIHsgaWYgKCFvKSByZXR1cm47IGlmICh0eXBlb2YgbyA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IHZhciBuID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pLnNsaWNlKDgsIC0xKTsgaWYgKG4gPT09IFwiT2JqZWN0XCIgJiYgby5jb25zdHJ1Y3RvcikgbiA9IG8uY29uc3RydWN0b3IubmFtZTsgaWYgKG4gPT09IFwiTWFwXCIgfHwgbiA9PT0gXCJTZXRcIikgcmV0dXJuIEFycmF5LmZyb20obyk7IGlmIChuID09PSBcIkFyZ3VtZW50c1wiIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTsgfVxuXG5mdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheShhcnIsIGxlbikgeyBpZiAobGVuID09IG51bGwgfHwgbGVuID4gYXJyLmxlbmd0aCkgbGVuID0gYXJyLmxlbmd0aDsgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkobGVuKTsgaSA8IGxlbjsgaSsrKSB7IGFycjJbaV0gPSBhcnJbaV07IH0gcmV0dXJuIGFycjI7IH1cblxudmFyIF9yZXF1aXJlID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWwvaXRlcmFibGUuanMnKSxcbiAgICBpdGVyYWJsZUN1cnJ5ID0gX3JlcXVpcmUuaXRlcmFibGVDdXJyeTtcblxuZnVuY3Rpb24gX19maWx0ZXIoc291cmNlLCBwcmVkaWNhdGUpIHtcbiAgdmFyIGMsIF9pdGVyYXRvciwgX3N0ZXAsIHZhbHVlO1xuXG4gIHJldHVybiBfcmVnZW5lcmF0b3JSdW50aW1lLndyYXAoZnVuY3Rpb24gX19maWx0ZXIkKF9jb250ZXh0KSB7XG4gICAgd2hpbGUgKDEpIHtcbiAgICAgIHN3aXRjaCAoX2NvbnRleHQucHJldiA9IF9jb250ZXh0Lm5leHQpIHtcbiAgICAgICAgY2FzZSAwOlxuICAgICAgICAgIGMgPSAwO1xuICAgICAgICAgIF9pdGVyYXRvciA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKHNvdXJjZSk7XG4gICAgICAgICAgX2NvbnRleHQucHJldiA9IDI7XG5cbiAgICAgICAgICBfaXRlcmF0b3IucygpO1xuXG4gICAgICAgIGNhc2UgNDpcbiAgICAgICAgICBpZiAoKF9zdGVwID0gX2l0ZXJhdG9yLm4oKSkuZG9uZSkge1xuICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDExO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFsdWUgPSBfc3RlcC52YWx1ZTtcblxuICAgICAgICAgIGlmICghcHJlZGljYXRlKHZhbHVlLCBjKyspKSB7XG4gICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gOTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSA5O1xuICAgICAgICAgIHJldHVybiB2YWx1ZTtcblxuICAgICAgICBjYXNlIDk6XG4gICAgICAgICAgX2NvbnRleHQubmV4dCA9IDQ7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAxMTpcbiAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMTY7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAxMzpcbiAgICAgICAgICBfY29udGV4dC5wcmV2ID0gMTM7XG4gICAgICAgICAgX2NvbnRleHQudDAgPSBfY29udGV4dFtcImNhdGNoXCJdKDIpO1xuXG4gICAgICAgICAgX2l0ZXJhdG9yLmUoX2NvbnRleHQudDApO1xuXG4gICAgICAgIGNhc2UgMTY6XG4gICAgICAgICAgX2NvbnRleHQucHJldiA9IDE2O1xuXG4gICAgICAgICAgX2l0ZXJhdG9yLmYoKTtcblxuICAgICAgICAgIHJldHVybiBfY29udGV4dC5maW5pc2goMTYpO1xuXG4gICAgICAgIGNhc2UgMTk6XG4gICAgICAgIGNhc2UgXCJlbmRcIjpcbiAgICAgICAgICByZXR1cm4gX2NvbnRleHQuc3RvcCgpO1xuICAgICAgfVxuICAgIH1cbiAgfSwgX21hcmtlZCwgbnVsbCwgW1syLCAxMywgMTYsIDE5XV0pO1xufVxuXG5leHBvcnRzLl9fZmlsdGVyID0gX19maWx0ZXI7XG52YXIgZmlsdGVyID0gLyojX19QVVJFX18qL2l0ZXJhYmxlQ3VycnkoX19maWx0ZXIpO1xuZXhwb3J0cy5maWx0ZXIgPSBmaWx0ZXI7IiwidmFyIF9yZWdlbmVyYXRvclJ1bnRpbWUgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvcmVnZW5lcmF0b3JcIik7XG5cbnZhciBfYXN5bmNUb0dlbmVyYXRvciA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2FzeW5jVG9HZW5lcmF0b3JcIik7XG5cbnZhciBfcmVxdWlyZSA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFsL2FzeW5jLWl0ZXJhYmxlLmpzJyksXG4gICAgYXN5bmNJdGVyYWJsZUN1cnJ5ID0gX3JlcXVpcmUuYXN5bmNJdGVyYWJsZUN1cnJ5O1xuXG52YXIgX3JlcXVpcmUyID0gcmVxdWlyZSgnLi4vJHBlZWtlcmF0ZS9hc3luYy1wZWVrZXJhdGUuanMnKSxcbiAgICBfX2FzeW5jUGVla2VyYXRlID0gX3JlcXVpcmUyLl9fYXN5bmNQZWVrZXJhdGU7XG5cbmZ1bmN0aW9uIF9fYXN5bmNGaW5kQmVzdE9yKF94LCBfeDIsIF94Mykge1xuICByZXR1cm4gX2FzeW5jRmluZEJlc3RPci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuXG5mdW5jdGlvbiBfYXN5bmNGaW5kQmVzdE9yKCkge1xuICBfYXN5bmNGaW5kQmVzdE9yID0gX2FzeW5jVG9HZW5lcmF0b3IoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3JSdW50aW1lLm1hcmsoZnVuY3Rpb24gX2NhbGxlZShpdGVyYWJsZSwgbm90Rm91bmRWYWx1ZSwgY29tcGFyZXIpIHtcbiAgICB2YXIgbWFwcGVyLFxuICAgICAgICBwZWVrcixcbiAgICAgICAgYmVzdCxcbiAgICAgICAgYmVzdFZhbHVlLFxuICAgICAgICBjYW5kaWRhdGUsXG4gICAgICAgIGNhbmRpZGF0ZVZhbHVlLFxuICAgICAgICBfYXJncyA9IGFyZ3VtZW50cztcbiAgICByZXR1cm4gX3JlZ2VuZXJhdG9yUnVudGltZS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUkKF9jb250ZXh0KSB7XG4gICAgICB3aGlsZSAoMSkge1xuICAgICAgICBzd2l0Y2ggKF9jb250ZXh0LnByZXYgPSBfY29udGV4dC5uZXh0KSB7XG4gICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgbWFwcGVyID0gX2FyZ3MubGVuZ3RoID4gMyAmJiBfYXJnc1szXSAhPT0gdW5kZWZpbmVkID8gX2FyZ3NbM10gOiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAzO1xuICAgICAgICAgICAgcmV0dXJuIF9fYXN5bmNQZWVrZXJhdGUoaXRlcmFibGUpO1xuXG4gICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgcGVla3IgPSBfY29udGV4dC5zZW50O1xuXG4gICAgICAgICAgICBpZiAoIXBlZWtyLmRvbmUpIHtcbiAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDg7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuYWJydXB0KFwicmV0dXJuXCIsIG5vdEZvdW5kVmFsdWUpO1xuXG4gICAgICAgICAgY2FzZSA4OlxuICAgICAgICAgICAgYmVzdCA9IHBlZWtyLnZhbHVlO1xuICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDExO1xuICAgICAgICAgICAgcmV0dXJuIG1hcHBlcihiZXN0LCBwZWVrci5pbmRleCk7XG5cbiAgICAgICAgICBjYXNlIDExOlxuICAgICAgICAgICAgYmVzdFZhbHVlID0gX2NvbnRleHQuc2VudDtcbiAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAxNDtcbiAgICAgICAgICAgIHJldHVybiBwZWVrci5hZHZhbmNlKCk7XG5cbiAgICAgICAgICBjYXNlIDE0OlxuICAgICAgICAgICAgaWYgKHBlZWtyLmRvbmUpIHtcbiAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDI0O1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY2FuZGlkYXRlID0gcGVla3IudmFsdWU7XG4gICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMTg7XG4gICAgICAgICAgICByZXR1cm4gbWFwcGVyKGNhbmRpZGF0ZSwgcGVla3IuaW5kZXgpO1xuXG4gICAgICAgICAgY2FzZSAxODpcbiAgICAgICAgICAgIGNhbmRpZGF0ZVZhbHVlID0gX2NvbnRleHQuc2VudDtcblxuICAgICAgICAgICAgaWYgKGNvbXBhcmVyKGJlc3RWYWx1ZSwgY2FuZGlkYXRlVmFsdWUpKSB7XG4gICAgICAgICAgICAgIGJlc3QgPSBjYW5kaWRhdGU7XG4gICAgICAgICAgICAgIGJlc3RWYWx1ZSA9IGNhbmRpZGF0ZVZhbHVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMjI7XG4gICAgICAgICAgICByZXR1cm4gcGVla3IuYWR2YW5jZSgpO1xuXG4gICAgICAgICAgY2FzZSAyMjpcbiAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAxNDtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSAyNDpcbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5hYnJ1cHQoXCJyZXR1cm5cIiwgYmVzdCk7XG5cbiAgICAgICAgICBjYXNlIDI1OlxuICAgICAgICAgIGNhc2UgXCJlbmRcIjpcbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5zdG9wKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCBfY2FsbGVlKTtcbiAgfSkpO1xuICByZXR1cm4gX2FzeW5jRmluZEJlc3RPci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuXG5leHBvcnRzLl9fYXN5bmNGaW5kQmVzdE9yID0gX19hc3luY0ZpbmRCZXN0T3I7XG52YXIgYXN5bmNGaW5kQmVzdE9yID0gYXN5bmNJdGVyYWJsZUN1cnJ5KF9fYXN5bmNGaW5kQmVzdE9yLCB7XG4gIHJlZHVjZXM6IHRydWUsXG4gIG1pbkFyZ3M6IDIsXG4gIG1heEFyZ3M6IDMsXG4gIGdyb3dSaWdodDogdHJ1ZVxufSk7XG5leHBvcnRzLmFzeW5jRmluZEJlc3RPciA9IGFzeW5jRmluZEJlc3RPcjsiLCJ2YXIgX3JlcXVpcmUgPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbC9pdGVyYWJsZS5qcycpLFxuICAgIGl0ZXJhYmxlQ3VycnkgPSBfcmVxdWlyZS5pdGVyYWJsZUN1cnJ5O1xuXG52YXIgX3JlcXVpcmUyID0gcmVxdWlyZSgnLi4vJHBlZWtlcmF0ZS9wZWVrZXJhdGUuanMnKSxcbiAgICBfX3BlZWtlcmF0ZSA9IF9yZXF1aXJlMi5fX3BlZWtlcmF0ZTtcblxuZnVuY3Rpb24gX19maW5kQmVzdE9yKGl0ZXJhYmxlLCBub3RGb3VuZFZhbHVlLCBjb21wYXJlcikge1xuICB2YXIgbWFwcGVyID0gYXJndW1lbnRzLmxlbmd0aCA+IDMgJiYgYXJndW1lbnRzWzNdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbM10gOiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH07XG5cbiAgdmFyIHBlZWtyID0gX19wZWVrZXJhdGUoaXRlcmFibGUpO1xuXG4gIGlmIChwZWVrci5kb25lKSB7XG4gICAgcmV0dXJuIG5vdEZvdW5kVmFsdWU7XG4gIH0gZWxzZSB7XG4gICAgdmFyIGJlc3QgPSBwZWVrci52YWx1ZTtcbiAgICB2YXIgYmVzdFZhbHVlID0gbWFwcGVyKGJlc3QsIHBlZWtyLmluZGV4KTtcbiAgICBwZWVrci5hZHZhbmNlKCk7XG5cbiAgICB3aGlsZSAoIXBlZWtyLmRvbmUpIHtcbiAgICAgIHZhciBjYW5kaWRhdGUgPSBwZWVrci52YWx1ZTtcbiAgICAgIHZhciBjYW5kaWRhdGVWYWx1ZSA9IG1hcHBlcihjYW5kaWRhdGUsIHBlZWtyLmluZGV4KTtcblxuICAgICAgaWYgKGNvbXBhcmVyKGJlc3RWYWx1ZSwgY2FuZGlkYXRlVmFsdWUpKSB7XG4gICAgICAgIGJlc3QgPSBjYW5kaWRhdGU7XG4gICAgICAgIGJlc3RWYWx1ZSA9IGNhbmRpZGF0ZVZhbHVlO1xuICAgICAgfVxuXG4gICAgICBwZWVrci5hZHZhbmNlKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGJlc3Q7XG4gIH1cbn1cblxuZXhwb3J0cy5fX2ZpbmRCZXN0T3IgPSBfX2ZpbmRCZXN0T3I7XG52YXIgZmluZEJlc3RPciA9IGl0ZXJhYmxlQ3VycnkoX19maW5kQmVzdE9yLCB7XG4gIHJlZHVjZXM6IHRydWUsXG4gIG1pbkFyZ3M6IDIsXG4gIG1heEFyZ3M6IDMsXG4gIGdyb3dSaWdodDogdHJ1ZVxufSk7XG5leHBvcnRzLmZpbmRCZXN0T3IgPSBmaW5kQmVzdE9yOyIsInZhciBfcmVnZW5lcmF0b3JSdW50aW1lID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL3JlZ2VuZXJhdG9yXCIpO1xuXG52YXIgX2FzeW5jVG9HZW5lcmF0b3IgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9hc3luY1RvR2VuZXJhdG9yXCIpO1xuXG52YXIgX3JlcXVpcmUgPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbC9hc3luYy1pdGVyYWJsZS5qcycpLFxuICAgIGFzeW5jSXRlcmFibGVDdXJyeSA9IF9yZXF1aXJlLmFzeW5jSXRlcmFibGVDdXJyeTtcblxudmFyIF9yZXF1aXJlMiA9IHJlcXVpcmUoJy4uLyRmaW5kLWJlc3Qtb3IvYXN5bmMtZmluZC1iZXN0LW9yLmpzJyksXG4gICAgX19hc3luY0ZpbmRCZXN0T3IgPSBfcmVxdWlyZTIuX19hc3luY0ZpbmRCZXN0T3I7XG5cbmZ1bmN0aW9uIF9fYXN5bmNGaW5kQmVzdChfeCwgX3gyKSB7XG4gIHJldHVybiBfYXN5bmNGaW5kQmVzdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuXG5mdW5jdGlvbiBfYXN5bmNGaW5kQmVzdCgpIHtcbiAgX2FzeW5jRmluZEJlc3QgPSBfYXN5bmNUb0dlbmVyYXRvciggLyojX19QVVJFX18qL19yZWdlbmVyYXRvclJ1bnRpbWUubWFyayhmdW5jdGlvbiBfY2FsbGVlKGl0ZXJhYmxlLCBjb21wYXJlcikge1xuICAgIHZhciBtYXBwZXIsXG4gICAgICAgIF9hcmdzID0gYXJndW1lbnRzO1xuICAgIHJldHVybiBfcmVnZW5lcmF0b3JSdW50aW1lLndyYXAoZnVuY3Rpb24gX2NhbGxlZSQoX2NvbnRleHQpIHtcbiAgICAgIHdoaWxlICgxKSB7XG4gICAgICAgIHN3aXRjaCAoX2NvbnRleHQucHJldiA9IF9jb250ZXh0Lm5leHQpIHtcbiAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICBtYXBwZXIgPSBfYXJncy5sZW5ndGggPiAyICYmIF9hcmdzWzJdICE9PSB1bmRlZmluZWQgPyBfYXJnc1syXSA6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDM7XG4gICAgICAgICAgICByZXR1cm4gX19hc3luY0ZpbmRCZXN0T3IoaXRlcmFibGUsIHVuZGVmaW5lZCwgY29tcGFyZXIsIG1hcHBlcik7XG5cbiAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuYWJydXB0KFwicmV0dXJuXCIsIF9jb250ZXh0LnNlbnQpO1xuXG4gICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgIGNhc2UgXCJlbmRcIjpcbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5zdG9wKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCBfY2FsbGVlKTtcbiAgfSkpO1xuICByZXR1cm4gX2FzeW5jRmluZEJlc3QuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cblxuZXhwb3J0cy5fX2FzeW5jRmluZEJlc3QgPSBfX2FzeW5jRmluZEJlc3Q7XG52YXIgYXN5bmNGaW5kQmVzdCA9IGFzeW5jSXRlcmFibGVDdXJyeShfX2FzeW5jRmluZEJlc3QsIHtcbiAgcmVkdWNlczogdHJ1ZSxcbiAgbWluQXJnczogMSxcbiAgbWF4QXJnczogMixcbiAgZ3Jvd1JpZ2h0OiB0cnVlXG59KTtcbmV4cG9ydHMuYXN5bmNGaW5kQmVzdCA9IGFzeW5jRmluZEJlc3Q7IiwidmFyIF9yZXF1aXJlID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWwvaXRlcmFibGUuanMnKSxcbiAgICBpdGVyYWJsZUN1cnJ5ID0gX3JlcXVpcmUuaXRlcmFibGVDdXJyeTtcblxudmFyIF9yZXF1aXJlMiA9IHJlcXVpcmUoJy4uLyRmaW5kLWJlc3Qtb3IvZmluZC1iZXN0LW9yLmpzJyksXG4gICAgX19maW5kQmVzdE9yID0gX3JlcXVpcmUyLl9fZmluZEJlc3RPcjtcblxuZnVuY3Rpb24gX19maW5kQmVzdChpdGVyYWJsZSwgY29tcGFyZXIpIHtcbiAgdmFyIG1hcHBlciA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9O1xuICByZXR1cm4gX19maW5kQmVzdE9yKGl0ZXJhYmxlLCB1bmRlZmluZWQsIGNvbXBhcmVyLCBtYXBwZXIpO1xufVxuXG5leHBvcnRzLl9fZmluZEJlc3QgPSBfX2ZpbmRCZXN0O1xudmFyIGZpbmRCZXN0ID0gaXRlcmFibGVDdXJyeShfX2ZpbmRCZXN0LCB7XG4gIHJlZHVjZXM6IHRydWUsXG4gIG1pbkFyZ3M6IDEsXG4gIG1heEFyZ3M6IDIsXG4gIGdyb3dSaWdodDogdHJ1ZVxufSk7XG5leHBvcnRzLmZpbmRCZXN0ID0gZmluZEJlc3Q7IiwidmFyIF9yZWdlbmVyYXRvclJ1bnRpbWUgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvcmVnZW5lcmF0b3JcIik7XG5cbnZhciBfYXN5bmNUb0dlbmVyYXRvciA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2FzeW5jVG9HZW5lcmF0b3JcIik7XG5cbnZhciBfYXN5bmNJdGVyYXRvciA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2FzeW5jSXRlcmF0b3JcIik7XG5cbnZhciBfcmVxdWlyZSA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFsL2FzeW5jLWl0ZXJhYmxlLmpzJyksXG4gICAgYXN5bmNJdGVyYWJsZUN1cnJ5ID0gX3JlcXVpcmUuYXN5bmNJdGVyYWJsZUN1cnJ5O1xuXG5mdW5jdGlvbiBfX2FzeW5jRmluZE9yKF94LCBfeDIsIF94Mykge1xuICByZXR1cm4gX2FzeW5jRmluZE9yLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5cbmZ1bmN0aW9uIF9hc3luY0ZpbmRPcigpIHtcbiAgX2FzeW5jRmluZE9yID0gX2FzeW5jVG9HZW5lcmF0b3IoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3JSdW50aW1lLm1hcmsoZnVuY3Rpb24gX2NhbGxlZShpdGVyYWJsZSwgbm90Rm91bmRWYWx1ZSwgZnVuYykge1xuICAgIHZhciBjLCBfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uLCBfZGlkSXRlcmF0b3JFcnJvciwgX2l0ZXJhdG9yRXJyb3IsIF9pdGVyYXRvciwgX3N0ZXAsIF92YWx1ZSwgdmFsdWU7XG5cbiAgICByZXR1cm4gX3JlZ2VuZXJhdG9yUnVudGltZS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUkKF9jb250ZXh0KSB7XG4gICAgICB3aGlsZSAoMSkge1xuICAgICAgICBzd2l0Y2ggKF9jb250ZXh0LnByZXYgPSBfY29udGV4dC5uZXh0KSB7XG4gICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgYyA9IDA7XG4gICAgICAgICAgICBfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uID0gdHJ1ZTtcbiAgICAgICAgICAgIF9kaWRJdGVyYXRvckVycm9yID0gZmFsc2U7XG4gICAgICAgICAgICBfY29udGV4dC5wcmV2ID0gMztcbiAgICAgICAgICAgIF9pdGVyYXRvciA9IF9hc3luY0l0ZXJhdG9yKGl0ZXJhYmxlKTtcblxuICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSA3O1xuICAgICAgICAgICAgcmV0dXJuIF9pdGVyYXRvci5uZXh0KCk7XG5cbiAgICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgICBfc3RlcCA9IF9jb250ZXh0LnNlbnQ7XG4gICAgICAgICAgICBfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uID0gX3N0ZXAuZG9uZTtcbiAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAxMTtcbiAgICAgICAgICAgIHJldHVybiBfc3RlcC52YWx1ZTtcblxuICAgICAgICAgIGNhc2UgMTE6XG4gICAgICAgICAgICBfdmFsdWUgPSBfY29udGV4dC5zZW50O1xuXG4gICAgICAgICAgICBpZiAoX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbikge1xuICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMjE7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YWx1ZSA9IF92YWx1ZTtcbiAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAxNjtcbiAgICAgICAgICAgIHJldHVybiBmdW5jKHZhbHVlLCBjKyspO1xuXG4gICAgICAgICAgY2FzZSAxNjpcbiAgICAgICAgICAgIGlmICghX2NvbnRleHQuc2VudCkge1xuICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMTg7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuYWJydXB0KFwicmV0dXJuXCIsIHZhbHVlKTtcblxuICAgICAgICAgIGNhc2UgMTg6XG4gICAgICAgICAgICBfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uID0gdHJ1ZTtcbiAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSA1O1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlIDIxOlxuICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDI3O1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlIDIzOlxuICAgICAgICAgICAgX2NvbnRleHQucHJldiA9IDIzO1xuICAgICAgICAgICAgX2NvbnRleHQudDAgPSBfY29udGV4dFtcImNhdGNoXCJdKDMpO1xuICAgICAgICAgICAgX2RpZEl0ZXJhdG9yRXJyb3IgPSB0cnVlO1xuICAgICAgICAgICAgX2l0ZXJhdG9yRXJyb3IgPSBfY29udGV4dC50MDtcblxuICAgICAgICAgIGNhc2UgMjc6XG4gICAgICAgICAgICBfY29udGV4dC5wcmV2ID0gMjc7XG4gICAgICAgICAgICBfY29udGV4dC5wcmV2ID0gMjg7XG5cbiAgICAgICAgICAgIGlmICghKCFfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uICYmIF9pdGVyYXRvcltcInJldHVyblwiXSAhPSBudWxsKSkge1xuICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMzI7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMzI7XG4gICAgICAgICAgICByZXR1cm4gX2l0ZXJhdG9yW1wicmV0dXJuXCJdKCk7XG5cbiAgICAgICAgICBjYXNlIDMyOlxuICAgICAgICAgICAgX2NvbnRleHQucHJldiA9IDMyO1xuXG4gICAgICAgICAgICBpZiAoIV9kaWRJdGVyYXRvckVycm9yKSB7XG4gICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAzNTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRocm93IF9pdGVyYXRvckVycm9yO1xuXG4gICAgICAgICAgY2FzZSAzNTpcbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5maW5pc2goMzIpO1xuXG4gICAgICAgICAgY2FzZSAzNjpcbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5maW5pc2goMjcpO1xuXG4gICAgICAgICAgY2FzZSAzNzpcbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5hYnJ1cHQoXCJyZXR1cm5cIiwgbm90Rm91bmRWYWx1ZSk7XG5cbiAgICAgICAgICBjYXNlIDM4OlxuICAgICAgICAgIGNhc2UgXCJlbmRcIjpcbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5zdG9wKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCBfY2FsbGVlLCBudWxsLCBbWzMsIDIzLCAyNywgMzddLCBbMjgsLCAzMiwgMzZdXSk7XG4gIH0pKTtcbiAgcmV0dXJuIF9hc3luY0ZpbmRPci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuXG5leHBvcnRzLl9fYXN5bmNGaW5kT3IgPSBfX2FzeW5jRmluZE9yO1xudmFyIGFzeW5jRmluZE9yID0gLyojX19QVVJFX18qL2FzeW5jSXRlcmFibGVDdXJyeShfX2FzeW5jRmluZE9yLCB7XG4gIGdyb3dSaWdodDogdHJ1ZSxcbiAgcmVkdWNlczogdHJ1ZVxufSk7XG5leHBvcnRzLmFzeW5jRmluZE9yID0gYXN5bmNGaW5kT3I7IiwiZnVuY3Rpb24gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIobywgYWxsb3dBcnJheUxpa2UpIHsgdmFyIGl0OyBpZiAodHlwZW9mIFN5bWJvbCA9PT0gXCJ1bmRlZmluZWRcIiB8fCBvW1N5bWJvbC5pdGVyYXRvcl0gPT0gbnVsbCkgeyBpZiAoQXJyYXkuaXNBcnJheShvKSB8fCAoaXQgPSBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkobykpIHx8IGFsbG93QXJyYXlMaWtlICYmIG8gJiYgdHlwZW9mIG8ubGVuZ3RoID09PSBcIm51bWJlclwiKSB7IGlmIChpdCkgbyA9IGl0OyB2YXIgaSA9IDA7IHZhciBGID0gZnVuY3Rpb24gRigpIHt9OyByZXR1cm4geyBzOiBGLCBuOiBmdW5jdGlvbiBuKCkgeyBpZiAoaSA+PSBvLmxlbmd0aCkgcmV0dXJuIHsgZG9uZTogdHJ1ZSB9OyByZXR1cm4geyBkb25lOiBmYWxzZSwgdmFsdWU6IG9baSsrXSB9OyB9LCBlOiBmdW5jdGlvbiBlKF9lKSB7IHRocm93IF9lOyB9LCBmOiBGIH07IH0gdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBpdGVyYXRlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpOyB9IHZhciBub3JtYWxDb21wbGV0aW9uID0gdHJ1ZSwgZGlkRXJyID0gZmFsc2UsIGVycjsgcmV0dXJuIHsgczogZnVuY3Rpb24gcygpIHsgaXQgPSBvW1N5bWJvbC5pdGVyYXRvcl0oKTsgfSwgbjogZnVuY3Rpb24gbigpIHsgdmFyIHN0ZXAgPSBpdC5uZXh0KCk7IG5vcm1hbENvbXBsZXRpb24gPSBzdGVwLmRvbmU7IHJldHVybiBzdGVwOyB9LCBlOiBmdW5jdGlvbiBlKF9lMikgeyBkaWRFcnIgPSB0cnVlOyBlcnIgPSBfZTI7IH0sIGY6IGZ1bmN0aW9uIGYoKSB7IHRyeSB7IGlmICghbm9ybWFsQ29tcGxldGlvbiAmJiBpdFtcInJldHVyblwiXSAhPSBudWxsKSBpdFtcInJldHVyblwiXSgpOyB9IGZpbmFsbHkgeyBpZiAoZGlkRXJyKSB0aHJvdyBlcnI7IH0gfSB9OyB9XG5cbmZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvLCBtaW5MZW4pIHsgaWYgKCFvKSByZXR1cm47IGlmICh0eXBlb2YgbyA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IHZhciBuID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pLnNsaWNlKDgsIC0xKTsgaWYgKG4gPT09IFwiT2JqZWN0XCIgJiYgby5jb25zdHJ1Y3RvcikgbiA9IG8uY29uc3RydWN0b3IubmFtZTsgaWYgKG4gPT09IFwiTWFwXCIgfHwgbiA9PT0gXCJTZXRcIikgcmV0dXJuIEFycmF5LmZyb20obyk7IGlmIChuID09PSBcIkFyZ3VtZW50c1wiIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTsgfVxuXG5mdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheShhcnIsIGxlbikgeyBpZiAobGVuID09IG51bGwgfHwgbGVuID4gYXJyLmxlbmd0aCkgbGVuID0gYXJyLmxlbmd0aDsgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkobGVuKTsgaSA8IGxlbjsgaSsrKSB7IGFycjJbaV0gPSBhcnJbaV07IH0gcmV0dXJuIGFycjI7IH1cblxudmFyIF9yZXF1aXJlID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWwvaXRlcmFibGUuanMnKSxcbiAgICBpdGVyYWJsZUN1cnJ5ID0gX3JlcXVpcmUuaXRlcmFibGVDdXJyeTtcblxuZnVuY3Rpb24gX19maW5kT3IoaXRlcmFibGUsIG5vdEZvdW5kVmFsdWUsIGZ1bmMpIHtcbiAgdmFyIGMgPSAwO1xuXG4gIHZhciBfaXRlcmF0b3IgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihpdGVyYWJsZSksXG4gICAgICBfc3RlcDtcblxuICB0cnkge1xuICAgIGZvciAoX2l0ZXJhdG9yLnMoKTsgIShfc3RlcCA9IF9pdGVyYXRvci5uKCkpLmRvbmU7KSB7XG4gICAgICB2YXIgdmFsdWUgPSBfc3RlcC52YWx1ZTtcblxuICAgICAgaWYgKGZ1bmModmFsdWUsIGMrKykpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgX2l0ZXJhdG9yLmUoZXJyKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBfaXRlcmF0b3IuZigpO1xuICB9XG5cbiAgcmV0dXJuIG5vdEZvdW5kVmFsdWU7XG59XG5cbmV4cG9ydHMuX19maW5kT3IgPSBfX2ZpbmRPcjtcbnZhciBmaW5kT3IgPSAvKiNfX1BVUkVfXyovaXRlcmFibGVDdXJyeShfX2ZpbmRPciwge1xuICBncm93UmlnaHQ6IHRydWUsXG4gIHJlZHVjZXM6IHRydWVcbn0pO1xuZXhwb3J0cy5maW5kT3IgPSBmaW5kT3I7IiwidmFyIF9yZXF1aXJlID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWwvYXN5bmMtaXRlcmFibGUuanMnKSxcbiAgICBhc3luY0l0ZXJhYmxlQ3VycnkgPSBfcmVxdWlyZS5hc3luY0l0ZXJhYmxlQ3Vycnk7XG5cbnZhciBfcmVxdWlyZTIgPSByZXF1aXJlKCcuLi8kZmluZC1vci9hc3luYy1maW5kLW9yLmpzJyksXG4gICAgX19hc3luY0ZpbmRPciA9IF9yZXF1aXJlMi5fX2FzeW5jRmluZE9yO1xuXG5mdW5jdGlvbiBfX2FzeW5jRmluZChpdGVyYWJsZSwgcHJlZGljYXRlKSB7XG4gIHJldHVybiBfX2FzeW5jRmluZE9yKGl0ZXJhYmxlLCB1bmRlZmluZWQsIHByZWRpY2F0ZSk7XG59XG5cbmV4cG9ydHMuX19hc3luY0ZpbmQgPSBfX2FzeW5jRmluZDtcbnZhciBhc3luY0ZpbmQgPSAvKiNfX1BVUkVfXyovYXN5bmNJdGVyYWJsZUN1cnJ5KF9fYXN5bmNGaW5kLCB7XG4gIHJlZHVjZXM6IHRydWVcbn0pO1xuZXhwb3J0cy5hc3luY0ZpbmQgPSBhc3luY0ZpbmQ7IiwidmFyIF9yZXF1aXJlID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWwvaXRlcmFibGUuanMnKSxcbiAgICBpdGVyYWJsZUN1cnJ5ID0gX3JlcXVpcmUuaXRlcmFibGVDdXJyeTtcblxudmFyIF9yZXF1aXJlMiA9IHJlcXVpcmUoJy4uLyRmaW5kLW9yL2ZpbmQtb3IuanMnKSxcbiAgICBfX2ZpbmRPciA9IF9yZXF1aXJlMi5fX2ZpbmRPcjtcblxuZnVuY3Rpb24gX19maW5kKGl0ZXJhYmxlLCBwcmVkaWNhdGUpIHtcbiAgcmV0dXJuIF9fZmluZE9yKGl0ZXJhYmxlLCB1bmRlZmluZWQsIHByZWRpY2F0ZSk7XG59XG5cbmV4cG9ydHMuX19maW5kID0gX19maW5kO1xudmFyIGZpbmQgPSAvKiNfX1BVUkVfXyovaXRlcmFibGVDdXJyeShfX2ZpbmQsIHtcbiAgcmVkdWNlczogdHJ1ZVxufSk7XG5leHBvcnRzLmZpbmQgPSBmaW5kOyIsInZhciBfcmVnZW5lcmF0b3JSdW50aW1lID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL3JlZ2VuZXJhdG9yXCIpO1xuXG52YXIgX2FzeW5jVG9HZW5lcmF0b3IgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9hc3luY1RvR2VuZXJhdG9yXCIpO1xuXG52YXIgX3JlcXVpcmUgPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbC9hc3luYy1pdGVyYWJsZS5qcycpLFxuICAgIGFzeW5jSXRlcmFibGVDdXJyeSA9IF9yZXF1aXJlLmFzeW5jSXRlcmFibGVDdXJyeSxcbiAgICBhc3luY0NhbGxSZXR1cm4gPSBfcmVxdWlyZS5hc3luY0NhbGxSZXR1cm47XG5cbmZ1bmN0aW9uIF9fYXN5bmNGaXJzdE9yKF94LCBfeDIpIHtcbiAgcmV0dXJuIF9hc3luY0ZpcnN0T3IuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cblxuZnVuY3Rpb24gX2FzeW5jRmlyc3RPcigpIHtcbiAgX2FzeW5jRmlyc3RPciA9IF9hc3luY1RvR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yUnVudGltZS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUoaXRlcmFibGUsIHdoZW5FbXB0eSkge1xuICAgIHZhciBpdGVyLCBfeWllbGQkaXRlciRuZXh0LCB2YWx1ZSwgZG9uZTtcblxuICAgIHJldHVybiBfcmVnZW5lcmF0b3JSdW50aW1lLndyYXAoZnVuY3Rpb24gX2NhbGxlZSQoX2NvbnRleHQpIHtcbiAgICAgIHdoaWxlICgxKSB7XG4gICAgICAgIHN3aXRjaCAoX2NvbnRleHQucHJldiA9IF9jb250ZXh0Lm5leHQpIHtcbiAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICBpdGVyID0gaXRlcmFibGVbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCk7XG4gICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMztcbiAgICAgICAgICAgIHJldHVybiBpdGVyLm5leHQoKTtcblxuICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgIF95aWVsZCRpdGVyJG5leHQgPSBfY29udGV4dC5zZW50O1xuICAgICAgICAgICAgdmFsdWUgPSBfeWllbGQkaXRlciRuZXh0LnZhbHVlO1xuICAgICAgICAgICAgZG9uZSA9IF95aWVsZCRpdGVyJG5leHQuZG9uZTtcblxuICAgICAgICAgICAgaWYgKCFkb25lKSB7XG4gICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSA4O1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LmFicnVwdChcInJldHVyblwiLCB3aGVuRW1wdHkpO1xuXG4gICAgICAgICAgY2FzZSA4OlxuICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDEwO1xuICAgICAgICAgICAgcmV0dXJuIGFzeW5jQ2FsbFJldHVybihpdGVyKTtcblxuICAgICAgICAgIGNhc2UgMTA6XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuYWJydXB0KFwicmV0dXJuXCIsIHZhbHVlKTtcblxuICAgICAgICAgIGNhc2UgMTE6XG4gICAgICAgICAgY2FzZSBcImVuZFwiOlxuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LnN0b3AoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sIF9jYWxsZWUpO1xuICB9KSk7XG4gIHJldHVybiBfYXN5bmNGaXJzdE9yLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5cbmV4cG9ydHMuX19hc3luY0ZpcnN0T3IgPSBfX2FzeW5jRmlyc3RPcjtcbnZhciBhc3luY0ZpcnN0T3IgPSAvKiNfX1BVUkVfXyovYXN5bmNJdGVyYWJsZUN1cnJ5KF9fYXN5bmNGaXJzdE9yLCB7XG4gIHJlZHVjZXM6IHRydWVcbn0pO1xuZXhwb3J0cy5hc3luY0ZpcnN0T3IgPSBhc3luY0ZpcnN0T3I7IiwidmFyIF9yZXF1aXJlID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWwvaXRlcmFibGUuanMnKSxcbiAgICBpdGVyYWJsZUN1cnJ5ID0gX3JlcXVpcmUuaXRlcmFibGVDdXJyeSxcbiAgICBjYWxsUmV0dXJuID0gX3JlcXVpcmUuY2FsbFJldHVybjtcblxuZnVuY3Rpb24gX19maXJzdE9yKGl0ZXJhYmxlLCB3aGVuRW1wdHkpIHtcbiAgdmFyIGl0ZXIgPSBpdGVyYWJsZVtTeW1ib2wuaXRlcmF0b3JdKCk7XG5cbiAgdmFyIF9pdGVyJG5leHQgPSBpdGVyLm5leHQoKSxcbiAgICAgIHZhbHVlID0gX2l0ZXIkbmV4dC52YWx1ZSxcbiAgICAgIGRvbmUgPSBfaXRlciRuZXh0LmRvbmU7XG5cbiAgaWYgKGRvbmUpIHJldHVybiB3aGVuRW1wdHk7XG4gIGNhbGxSZXR1cm4oaXRlcik7XG4gIHJldHVybiB2YWx1ZTtcbn1cblxuZXhwb3J0cy5fX2ZpcnN0T3IgPSBfX2ZpcnN0T3I7XG52YXIgZmlyc3RPciA9IC8qI19fUFVSRV9fKi9pdGVyYWJsZUN1cnJ5KF9fZmlyc3RPciwge1xuICByZWR1Y2VzOiB0cnVlXG59KTtcbmV4cG9ydHMuZmlyc3RPciA9IGZpcnN0T3I7IiwidmFyIF9yZXF1aXJlID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWwvYXN5bmMtaXRlcmFibGUuanMnKSxcbiAgICBhc3luY0l0ZXJhYmxlQ3VycnkgPSBfcmVxdWlyZS5hc3luY0l0ZXJhYmxlQ3Vycnk7XG5cbnZhciBfcmVxdWlyZTIgPSByZXF1aXJlKCcuLi8kZmlyc3Qtb3IvYXN5bmMtZmlyc3Qtb3IuanMnKSxcbiAgICBfX2FzeW5jRmlyc3RPciA9IF9yZXF1aXJlMi5fX2FzeW5jRmlyc3RPcjtcblxuZnVuY3Rpb24gX19hc3luY0ZpcnN0KGl0ZXJhYmxlKSB7XG4gIHJldHVybiBfX2FzeW5jRmlyc3RPcihpdGVyYWJsZSwgdW5kZWZpbmVkKTtcbn1cblxuZXhwb3J0cy5fX2FzeW5jRmlyc3QgPSBfX2FzeW5jRmlyc3Q7XG52YXIgYXN5bmNGaXJzdCA9IC8qI19fUFVSRV9fKi9hc3luY0l0ZXJhYmxlQ3VycnkoX19hc3luY0ZpcnN0LCB7XG4gIHJlZHVjZXM6IHRydWVcbn0pO1xuZXhwb3J0cy5hc3luY0ZpcnN0ID0gYXN5bmNGaXJzdDsiLCJ2YXIgX3JlcXVpcmUgPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbC9pdGVyYWJsZS5qcycpLFxuICAgIGl0ZXJhYmxlQ3VycnkgPSBfcmVxdWlyZS5pdGVyYWJsZUN1cnJ5O1xuXG52YXIgX3JlcXVpcmUyID0gcmVxdWlyZSgnLi4vJGZpcnN0LW9yL2ZpcnN0LW9yLmpzJyksXG4gICAgX19maXJzdE9yID0gX3JlcXVpcmUyLl9fZmlyc3RPcjtcblxuZnVuY3Rpb24gX19maXJzdChpdGVyYWJsZSkge1xuICByZXR1cm4gX19maXJzdE9yKGl0ZXJhYmxlLCB1bmRlZmluZWQpO1xufVxuXG5leHBvcnRzLl9fZmlyc3QgPSBfX2ZpcnN0O1xudmFyIGZpcnN0ID0gLyojX19QVVJFX18qL2l0ZXJhYmxlQ3VycnkoX19maXJzdCwge1xuICByZWR1Y2VzOiB0cnVlXG59KTtcbmV4cG9ydHMuZmlyc3QgPSBmaXJzdDsiLCJ2YXIgX3JlZ2VuZXJhdG9yUnVudGltZSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9yZWdlbmVyYXRvclwiKTtcblxudmFyIF93cmFwQXN5bmNHZW5lcmF0b3IgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy93cmFwQXN5bmNHZW5lcmF0b3JcIik7XG5cbnZhciBfYXdhaXRBc3luY0dlbmVyYXRvciA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2F3YWl0QXN5bmNHZW5lcmF0b3JcIik7XG5cbnZhciBfYXN5bmNHZW5lcmF0b3JEZWxlZ2F0ZSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2FzeW5jR2VuZXJhdG9yRGVsZWdhdGVcIik7XG5cbnZhciBfYXN5bmNJdGVyYXRvciA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2FzeW5jSXRlcmF0b3JcIik7XG5cbnZhciBfcmVxdWlyZSA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFsL2FzeW5jLWl0ZXJhYmxlLmpzJyksXG4gICAgYXN5bmNJdGVyYWJsZUN1cnJ5ID0gX3JlcXVpcmUuYXN5bmNJdGVyYWJsZUN1cnJ5O1xuXG52YXIgX3JlcXVpcmUyID0gcmVxdWlyZSgnLi4vJG1hcC9hc3luYy1tYXAuanMnKSxcbiAgICBfX2FzeW5jTWFwID0gX3JlcXVpcmUyLl9fYXN5bmNNYXA7XG5cbmZ1bmN0aW9uIF9fYXN5bmNGbGF0TWFwKF94LCBfeDIpIHtcbiAgcmV0dXJuIF9hc3luY0ZsYXRNYXAuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cblxuZXhwb3J0cy5fX2FzeW5jRmxhdE1hcCA9IF9fYXN5bmNGbGF0TWFwO1xuXG5mdW5jdGlvbiBfYXN5bmNGbGF0TWFwKCkge1xuICBfYXN5bmNGbGF0TWFwID0gX3dyYXBBc3luY0dlbmVyYXRvciggLyojX19QVVJFX18qL19yZWdlbmVyYXRvclJ1bnRpbWUubWFyayhmdW5jdGlvbiBfY2FsbGVlKHNvdXJjZSwgZnVuYykge1xuICAgIHZhciBfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uLCBfZGlkSXRlcmF0b3JFcnJvciwgX2l0ZXJhdG9yRXJyb3IsIF9pdGVyYXRvciwgX3N0ZXAsIF92YWx1ZSwgdmFsdWU7XG5cbiAgICByZXR1cm4gX3JlZ2VuZXJhdG9yUnVudGltZS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUkKF9jb250ZXh0KSB7XG4gICAgICB3aGlsZSAoMSkge1xuICAgICAgICBzd2l0Y2ggKF9jb250ZXh0LnByZXYgPSBfY29udGV4dC5uZXh0KSB7XG4gICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbiA9IHRydWU7XG4gICAgICAgICAgICBfZGlkSXRlcmF0b3JFcnJvciA9IGZhbHNlO1xuICAgICAgICAgICAgX2NvbnRleHQucHJldiA9IDI7XG4gICAgICAgICAgICBfaXRlcmF0b3IgPSBfYXN5bmNJdGVyYXRvcihfX2FzeW5jTWFwKHNvdXJjZSwgZnVuYykpO1xuXG4gICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDY7XG4gICAgICAgICAgICByZXR1cm4gX2F3YWl0QXN5bmNHZW5lcmF0b3IoX2l0ZXJhdG9yLm5leHQoKSk7XG5cbiAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICBfc3RlcCA9IF9jb250ZXh0LnNlbnQ7XG4gICAgICAgICAgICBfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uID0gX3N0ZXAuZG9uZTtcbiAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAxMDtcbiAgICAgICAgICAgIHJldHVybiBfYXdhaXRBc3luY0dlbmVyYXRvcihfc3RlcC52YWx1ZSk7XG5cbiAgICAgICAgICBjYXNlIDEwOlxuICAgICAgICAgICAgX3ZhbHVlID0gX2NvbnRleHQuc2VudDtcblxuICAgICAgICAgICAgaWYgKF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24pIHtcbiAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDE3O1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFsdWUgPSBfdmFsdWU7XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuZGVsZWdhdGVZaWVsZChfYXN5bmNHZW5lcmF0b3JEZWxlZ2F0ZShfYXN5bmNJdGVyYXRvcih2YWx1ZSksIF9hd2FpdEFzeW5jR2VuZXJhdG9yKSwgXCJ0MFwiLCAxNCk7XG5cbiAgICAgICAgICBjYXNlIDE0OlxuICAgICAgICAgICAgX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbiA9IHRydWU7XG4gICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gNDtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSAxNzpcbiAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAyMztcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSAxOTpcbiAgICAgICAgICAgIF9jb250ZXh0LnByZXYgPSAxOTtcbiAgICAgICAgICAgIF9jb250ZXh0LnQxID0gX2NvbnRleHRbXCJjYXRjaFwiXSgyKTtcbiAgICAgICAgICAgIF9kaWRJdGVyYXRvckVycm9yID0gdHJ1ZTtcbiAgICAgICAgICAgIF9pdGVyYXRvckVycm9yID0gX2NvbnRleHQudDE7XG5cbiAgICAgICAgICBjYXNlIDIzOlxuICAgICAgICAgICAgX2NvbnRleHQucHJldiA9IDIzO1xuICAgICAgICAgICAgX2NvbnRleHQucHJldiA9IDI0O1xuXG4gICAgICAgICAgICBpZiAoISghX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbiAmJiBfaXRlcmF0b3JbXCJyZXR1cm5cIl0gIT0gbnVsbCkpIHtcbiAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDI4O1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDI4O1xuICAgICAgICAgICAgcmV0dXJuIF9hd2FpdEFzeW5jR2VuZXJhdG9yKF9pdGVyYXRvcltcInJldHVyblwiXSgpKTtcblxuICAgICAgICAgIGNhc2UgMjg6XG4gICAgICAgICAgICBfY29udGV4dC5wcmV2ID0gMjg7XG5cbiAgICAgICAgICAgIGlmICghX2RpZEl0ZXJhdG9yRXJyb3IpIHtcbiAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDMxO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhyb3cgX2l0ZXJhdG9yRXJyb3I7XG5cbiAgICAgICAgICBjYXNlIDMxOlxuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LmZpbmlzaCgyOCk7XG5cbiAgICAgICAgICBjYXNlIDMyOlxuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LmZpbmlzaCgyMyk7XG5cbiAgICAgICAgICBjYXNlIDMzOlxuICAgICAgICAgIGNhc2UgXCJlbmRcIjpcbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5zdG9wKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCBfY2FsbGVlLCBudWxsLCBbWzIsIDE5LCAyMywgMzNdLCBbMjQsLCAyOCwgMzJdXSk7XG4gIH0pKTtcbiAgcmV0dXJuIF9hc3luY0ZsYXRNYXAuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cblxudmFyIGFzeW5jRmxhdE1hcCA9IC8qI19fUFVSRV9fKi9hc3luY0l0ZXJhYmxlQ3VycnkoX19hc3luY0ZsYXRNYXApO1xuZXhwb3J0cy5hc3luY0ZsYXRNYXAgPSBhc3luY0ZsYXRNYXA7IiwidmFyIF9yZWdlbmVyYXRvclJ1bnRpbWUgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvcmVnZW5lcmF0b3JcIik7XG5cbnZhciBfbWFya2VkID0gLyojX19QVVJFX18qL19yZWdlbmVyYXRvclJ1bnRpbWUubWFyayhfX2ZsYXRNYXApO1xuXG5mdW5jdGlvbiBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihvLCBhbGxvd0FycmF5TGlrZSkgeyB2YXIgaXQ7IGlmICh0eXBlb2YgU3ltYm9sID09PSBcInVuZGVmaW5lZFwiIHx8IG9bU3ltYm9sLml0ZXJhdG9yXSA9PSBudWxsKSB7IGlmIChBcnJheS5pc0FycmF5KG8pIHx8IChpdCA9IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvKSkgfHwgYWxsb3dBcnJheUxpa2UgJiYgbyAmJiB0eXBlb2Ygby5sZW5ndGggPT09IFwibnVtYmVyXCIpIHsgaWYgKGl0KSBvID0gaXQ7IHZhciBpID0gMDsgdmFyIEYgPSBmdW5jdGlvbiBGKCkge307IHJldHVybiB7IHM6IEYsIG46IGZ1bmN0aW9uIG4oKSB7IGlmIChpID49IG8ubGVuZ3RoKSByZXR1cm4geyBkb25lOiB0cnVlIH07IHJldHVybiB7IGRvbmU6IGZhbHNlLCB2YWx1ZTogb1tpKytdIH07IH0sIGU6IGZ1bmN0aW9uIGUoX2UpIHsgdGhyb3cgX2U7IH0sIGY6IEYgfTsgfSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIGl0ZXJhdGUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIik7IH0gdmFyIG5vcm1hbENvbXBsZXRpb24gPSB0cnVlLCBkaWRFcnIgPSBmYWxzZSwgZXJyOyByZXR1cm4geyBzOiBmdW5jdGlvbiBzKCkgeyBpdCA9IG9bU3ltYm9sLml0ZXJhdG9yXSgpOyB9LCBuOiBmdW5jdGlvbiBuKCkgeyB2YXIgc3RlcCA9IGl0Lm5leHQoKTsgbm9ybWFsQ29tcGxldGlvbiA9IHN0ZXAuZG9uZTsgcmV0dXJuIHN0ZXA7IH0sIGU6IGZ1bmN0aW9uIGUoX2UyKSB7IGRpZEVyciA9IHRydWU7IGVyciA9IF9lMjsgfSwgZjogZnVuY3Rpb24gZigpIHsgdHJ5IHsgaWYgKCFub3JtYWxDb21wbGV0aW9uICYmIGl0W1wicmV0dXJuXCJdICE9IG51bGwpIGl0W1wicmV0dXJuXCJdKCk7IH0gZmluYWxseSB7IGlmIChkaWRFcnIpIHRocm93IGVycjsgfSB9IH07IH1cblxuZnVuY3Rpb24gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8sIG1pbkxlbikgeyBpZiAoIW8pIHJldHVybjsgaWYgKHR5cGVvZiBvID09PSBcInN0cmluZ1wiKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTsgdmFyIG4gPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykuc2xpY2UoOCwgLTEpOyBpZiAobiA9PT0gXCJPYmplY3RcIiAmJiBvLmNvbnN0cnVjdG9yKSBuID0gby5jb25zdHJ1Y3Rvci5uYW1lOyBpZiAobiA9PT0gXCJNYXBcIiB8fCBuID09PSBcIlNldFwiKSByZXR1cm4gQXJyYXkuZnJvbShvKTsgaWYgKG4gPT09IFwiQXJndW1lbnRzXCIgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QobikpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pOyB9XG5cbmZ1bmN0aW9uIF9hcnJheUxpa2VUb0FycmF5KGFyciwgbGVuKSB7IGlmIChsZW4gPT0gbnVsbCB8fCBsZW4gPiBhcnIubGVuZ3RoKSBsZW4gPSBhcnIubGVuZ3RoOyBmb3IgKHZhciBpID0gMCwgYXJyMiA9IG5ldyBBcnJheShsZW4pOyBpIDwgbGVuOyBpKyspIHsgYXJyMltpXSA9IGFycltpXTsgfSByZXR1cm4gYXJyMjsgfVxuXG52YXIgX3JlcXVpcmUgPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbC9pdGVyYWJsZS5qcycpLFxuICAgIGl0ZXJhYmxlQ3VycnkgPSBfcmVxdWlyZS5pdGVyYWJsZUN1cnJ5O1xuXG52YXIgX3JlcXVpcmUyID0gcmVxdWlyZSgnLi4vJG1hcC9tYXAuanMnKSxcbiAgICBfX21hcCA9IF9yZXF1aXJlMi5fX21hcDtcblxuZnVuY3Rpb24gX19mbGF0TWFwKHNvdXJjZSwgZnVuYykge1xuICB2YXIgX2l0ZXJhdG9yLCBfc3RlcCwgdmFsdWU7XG5cbiAgcmV0dXJuIF9yZWdlbmVyYXRvclJ1bnRpbWUud3JhcChmdW5jdGlvbiBfX2ZsYXRNYXAkKF9jb250ZXh0KSB7XG4gICAgd2hpbGUgKDEpIHtcbiAgICAgIHN3aXRjaCAoX2NvbnRleHQucHJldiA9IF9jb250ZXh0Lm5leHQpIHtcbiAgICAgICAgY2FzZSAwOlxuICAgICAgICAgIF9pdGVyYXRvciA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKF9fbWFwKHNvdXJjZSwgZnVuYykpO1xuICAgICAgICAgIF9jb250ZXh0LnByZXYgPSAxO1xuXG4gICAgICAgICAgX2l0ZXJhdG9yLnMoKTtcblxuICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgaWYgKChfc3RlcCA9IF9pdGVyYXRvci5uKCkpLmRvbmUpIHtcbiAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSA4O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFsdWUgPSBfc3RlcC52YWx1ZTtcbiAgICAgICAgICByZXR1cm4gX2NvbnRleHQuZGVsZWdhdGVZaWVsZCh2YWx1ZSwgXCJ0MFwiLCA2KTtcblxuICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgX2NvbnRleHQubmV4dCA9IDM7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSA4OlxuICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAxMztcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIDEwOlxuICAgICAgICAgIF9jb250ZXh0LnByZXYgPSAxMDtcbiAgICAgICAgICBfY29udGV4dC50MSA9IF9jb250ZXh0W1wiY2F0Y2hcIl0oMSk7XG5cbiAgICAgICAgICBfaXRlcmF0b3IuZShfY29udGV4dC50MSk7XG5cbiAgICAgICAgY2FzZSAxMzpcbiAgICAgICAgICBfY29udGV4dC5wcmV2ID0gMTM7XG5cbiAgICAgICAgICBfaXRlcmF0b3IuZigpO1xuXG4gICAgICAgICAgcmV0dXJuIF9jb250ZXh0LmZpbmlzaCgxMyk7XG5cbiAgICAgICAgY2FzZSAxNjpcbiAgICAgICAgY2FzZSBcImVuZFwiOlxuICAgICAgICAgIHJldHVybiBfY29udGV4dC5zdG9wKCk7XG4gICAgICB9XG4gICAgfVxuICB9LCBfbWFya2VkLCBudWxsLCBbWzEsIDEwLCAxMywgMTZdXSk7XG59XG5cbmV4cG9ydHMuX19mbGF0TWFwID0gX19mbGF0TWFwO1xudmFyIGZsYXRNYXAgPSAvKiNfX1BVUkVfXyovaXRlcmFibGVDdXJyeShfX2ZsYXRNYXApO1xuZXhwb3J0cy5mbGF0TWFwID0gZmxhdE1hcDsiLCJ2YXIgX3JlZ2VuZXJhdG9yUnVudGltZSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9yZWdlbmVyYXRvclwiKTtcblxudmFyIF93cmFwQXN5bmNHZW5lcmF0b3IgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy93cmFwQXN5bmNHZW5lcmF0b3JcIik7XG5cbnZhciBfYXdhaXRBc3luY0dlbmVyYXRvciA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2F3YWl0QXN5bmNHZW5lcmF0b3JcIik7XG5cbnZhciBfYXN5bmNHZW5lcmF0b3JEZWxlZ2F0ZSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2FzeW5jR2VuZXJhdG9yRGVsZWdhdGVcIik7XG5cbnZhciBfYXN5bmNJdGVyYXRvciA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2FzeW5jSXRlcmF0b3JcIik7XG5cbnZhciBfcmVxdWlyZSA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFsL2FzeW5jLWl0ZXJhYmxlLmpzJyksXG4gICAgYXN5bmNJdGVyYWJsZUN1cnJ5ID0gX3JlcXVpcmUuYXN5bmNJdGVyYWJsZUN1cnJ5LFxuICAgIGFzeW5jSXNMb29wYWJsZSA9IF9yZXF1aXJlLmFzeW5jSXNMb29wYWJsZTtcblxudmFyIF9yZXF1aXJlMiA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvdmFsaWRhdGUtYXJncy5qcycpLFxuICAgIHZhbGlkYXRlQXJncyA9IF9yZXF1aXJlMi52YWxpZGF0ZUFyZ3M7XG5cbnZhciBkZWZhdWx0U2hvdWxkRmxhdCA9IGZ1bmN0aW9uIGRlZmF1bHRTaG91bGRGbGF0KHZhbHVlKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnICYmIGFzeW5jSXNMb29wYWJsZSh2YWx1ZSk7XG59O1xuXG5mdW5jdGlvbiBhc3luY0ZsYXRJbnRlcm5hbChfeCwgX3gyLCBfeDMsIF94NCkge1xuICByZXR1cm4gX2FzeW5jRmxhdEludGVybmFsLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5cbmZ1bmN0aW9uIF9hc3luY0ZsYXRJbnRlcm5hbCgpIHtcbiAgX2FzeW5jRmxhdEludGVybmFsID0gX3dyYXBBc3luY0dlbmVyYXRvciggLyojX19QVVJFX18qL19yZWdlbmVyYXRvclJ1bnRpbWUubWFyayhmdW5jdGlvbiBfY2FsbGVlKHNob3VsZEZsYXQsIGRlcHRoLCBjdXJyZW50RGVwdGgsIHNvdXJjZSkge1xuICAgIHZhciBfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uLCBfZGlkSXRlcmF0b3JFcnJvciwgX2l0ZXJhdG9yRXJyb3IsIF9pdGVyYXRvciwgX3N0ZXAsIF92YWx1ZSwgdmFsdWU7XG5cbiAgICByZXR1cm4gX3JlZ2VuZXJhdG9yUnVudGltZS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUkKF9jb250ZXh0KSB7XG4gICAgICB3aGlsZSAoMSkge1xuICAgICAgICBzd2l0Y2ggKF9jb250ZXh0LnByZXYgPSBfY29udGV4dC5uZXh0KSB7XG4gICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbiA9IHRydWU7XG4gICAgICAgICAgICBfZGlkSXRlcmF0b3JFcnJvciA9IGZhbHNlO1xuICAgICAgICAgICAgX2NvbnRleHQucHJldiA9IDI7XG4gICAgICAgICAgICBfaXRlcmF0b3IgPSBfYXN5bmNJdGVyYXRvcihzb3VyY2UpO1xuXG4gICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDY7XG4gICAgICAgICAgICByZXR1cm4gX2F3YWl0QXN5bmNHZW5lcmF0b3IoX2l0ZXJhdG9yLm5leHQoKSk7XG5cbiAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICBfc3RlcCA9IF9jb250ZXh0LnNlbnQ7XG4gICAgICAgICAgICBfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uID0gX3N0ZXAuZG9uZTtcbiAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAxMDtcbiAgICAgICAgICAgIHJldHVybiBfYXdhaXRBc3luY0dlbmVyYXRvcihfc3RlcC52YWx1ZSk7XG5cbiAgICAgICAgICBjYXNlIDEwOlxuICAgICAgICAgICAgX3ZhbHVlID0gX2NvbnRleHQuc2VudDtcblxuICAgICAgICAgICAgaWYgKF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24pIHtcbiAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDI3O1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFsdWUgPSBfdmFsdWU7XG4gICAgICAgICAgICBfY29udGV4dC50MCA9IGN1cnJlbnREZXB0aCA8IGRlcHRoO1xuXG4gICAgICAgICAgICBpZiAoIV9jb250ZXh0LnQwKSB7XG4gICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAxODtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAxNztcbiAgICAgICAgICAgIHJldHVybiBfYXdhaXRBc3luY0dlbmVyYXRvcihzaG91bGRGbGF0KHZhbHVlKSk7XG5cbiAgICAgICAgICBjYXNlIDE3OlxuICAgICAgICAgICAgX2NvbnRleHQudDAgPSBfY29udGV4dC5zZW50O1xuXG4gICAgICAgICAgY2FzZSAxODpcbiAgICAgICAgICAgIGlmICghX2NvbnRleHQudDApIHtcbiAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDIyO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LmRlbGVnYXRlWWllbGQoX2FzeW5jR2VuZXJhdG9yRGVsZWdhdGUoX2FzeW5jSXRlcmF0b3IoYXN5bmNGbGF0SW50ZXJuYWwoc2hvdWxkRmxhdCwgZGVwdGgsIGN1cnJlbnREZXB0aCArIDEsIHZhbHVlKSksIF9hd2FpdEFzeW5jR2VuZXJhdG9yKSwgXCJ0MVwiLCAyMCk7XG5cbiAgICAgICAgICBjYXNlIDIwOlxuICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDI0O1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlIDIyOlxuICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDI0O1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuXG4gICAgICAgICAgY2FzZSAyNDpcbiAgICAgICAgICAgIF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24gPSB0cnVlO1xuICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDQ7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgMjc6XG4gICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMzM7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgMjk6XG4gICAgICAgICAgICBfY29udGV4dC5wcmV2ID0gMjk7XG4gICAgICAgICAgICBfY29udGV4dC50MiA9IF9jb250ZXh0W1wiY2F0Y2hcIl0oMik7XG4gICAgICAgICAgICBfZGlkSXRlcmF0b3JFcnJvciA9IHRydWU7XG4gICAgICAgICAgICBfaXRlcmF0b3JFcnJvciA9IF9jb250ZXh0LnQyO1xuXG4gICAgICAgICAgY2FzZSAzMzpcbiAgICAgICAgICAgIF9jb250ZXh0LnByZXYgPSAzMztcbiAgICAgICAgICAgIF9jb250ZXh0LnByZXYgPSAzNDtcblxuICAgICAgICAgICAgaWYgKCEoIV9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24gJiYgX2l0ZXJhdG9yW1wicmV0dXJuXCJdICE9IG51bGwpKSB7XG4gICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAzODtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAzODtcbiAgICAgICAgICAgIHJldHVybiBfYXdhaXRBc3luY0dlbmVyYXRvcihfaXRlcmF0b3JbXCJyZXR1cm5cIl0oKSk7XG5cbiAgICAgICAgICBjYXNlIDM4OlxuICAgICAgICAgICAgX2NvbnRleHQucHJldiA9IDM4O1xuXG4gICAgICAgICAgICBpZiAoIV9kaWRJdGVyYXRvckVycm9yKSB7XG4gICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSA0MTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRocm93IF9pdGVyYXRvckVycm9yO1xuXG4gICAgICAgICAgY2FzZSA0MTpcbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5maW5pc2goMzgpO1xuXG4gICAgICAgICAgY2FzZSA0MjpcbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5maW5pc2goMzMpO1xuXG4gICAgICAgICAgY2FzZSA0MzpcbiAgICAgICAgICBjYXNlIFwiZW5kXCI6XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuc3RvcCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwgX2NhbGxlZSwgbnVsbCwgW1syLCAyOSwgMzMsIDQzXSwgWzM0LCwgMzgsIDQyXV0pO1xuICB9KSk7XG4gIHJldHVybiBfYXN5bmNGbGF0SW50ZXJuYWwuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cblxuZnVuY3Rpb24gX19hc3luY0ZsYXQoc291cmNlKSB7XG4gIHZhciBkZXB0aCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogMTtcbiAgdmFyIHNob3VsZEZsYXQgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IGRlZmF1bHRTaG91bGRGbGF0O1xuICByZXR1cm4gYXN5bmNGbGF0SW50ZXJuYWwoc2hvdWxkRmxhdCwgZGVwdGgsIDAsIHNvdXJjZSk7XG59XG5cbmV4cG9ydHMuX19hc3luY0ZsYXQgPSBfX2FzeW5jRmxhdDtcbnZhciBhc3luY0ZsYXQgPSAvKiNfX1BVUkVfXyovYXN5bmNJdGVyYWJsZUN1cnJ5KF9fYXN5bmNGbGF0LCB7XG4gIG1pbkFyZ3M6IDAsXG4gIG1heEFyZ3M6IDIsXG4gIHZhbGlkYXRlQXJnczogdmFsaWRhdGVBcmdzXG59KTtcbmV4cG9ydHMuYXN5bmNGbGF0ID0gYXN5bmNGbGF0OyIsInZhciBfcmVnZW5lcmF0b3JSdW50aW1lID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL3JlZ2VuZXJhdG9yXCIpO1xuXG52YXIgX21hcmtlZCA9IC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3JSdW50aW1lLm1hcmsoZmxhdEludGVybmFsKTtcblxuZnVuY3Rpb24gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIobywgYWxsb3dBcnJheUxpa2UpIHsgdmFyIGl0OyBpZiAodHlwZW9mIFN5bWJvbCA9PT0gXCJ1bmRlZmluZWRcIiB8fCBvW1N5bWJvbC5pdGVyYXRvcl0gPT0gbnVsbCkgeyBpZiAoQXJyYXkuaXNBcnJheShvKSB8fCAoaXQgPSBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkobykpIHx8IGFsbG93QXJyYXlMaWtlICYmIG8gJiYgdHlwZW9mIG8ubGVuZ3RoID09PSBcIm51bWJlclwiKSB7IGlmIChpdCkgbyA9IGl0OyB2YXIgaSA9IDA7IHZhciBGID0gZnVuY3Rpb24gRigpIHt9OyByZXR1cm4geyBzOiBGLCBuOiBmdW5jdGlvbiBuKCkgeyBpZiAoaSA+PSBvLmxlbmd0aCkgcmV0dXJuIHsgZG9uZTogdHJ1ZSB9OyByZXR1cm4geyBkb25lOiBmYWxzZSwgdmFsdWU6IG9baSsrXSB9OyB9LCBlOiBmdW5jdGlvbiBlKF9lKSB7IHRocm93IF9lOyB9LCBmOiBGIH07IH0gdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBpdGVyYXRlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpOyB9IHZhciBub3JtYWxDb21wbGV0aW9uID0gdHJ1ZSwgZGlkRXJyID0gZmFsc2UsIGVycjsgcmV0dXJuIHsgczogZnVuY3Rpb24gcygpIHsgaXQgPSBvW1N5bWJvbC5pdGVyYXRvcl0oKTsgfSwgbjogZnVuY3Rpb24gbigpIHsgdmFyIHN0ZXAgPSBpdC5uZXh0KCk7IG5vcm1hbENvbXBsZXRpb24gPSBzdGVwLmRvbmU7IHJldHVybiBzdGVwOyB9LCBlOiBmdW5jdGlvbiBlKF9lMikgeyBkaWRFcnIgPSB0cnVlOyBlcnIgPSBfZTI7IH0sIGY6IGZ1bmN0aW9uIGYoKSB7IHRyeSB7IGlmICghbm9ybWFsQ29tcGxldGlvbiAmJiBpdFtcInJldHVyblwiXSAhPSBudWxsKSBpdFtcInJldHVyblwiXSgpOyB9IGZpbmFsbHkgeyBpZiAoZGlkRXJyKSB0aHJvdyBlcnI7IH0gfSB9OyB9XG5cbmZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvLCBtaW5MZW4pIHsgaWYgKCFvKSByZXR1cm47IGlmICh0eXBlb2YgbyA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IHZhciBuID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pLnNsaWNlKDgsIC0xKTsgaWYgKG4gPT09IFwiT2JqZWN0XCIgJiYgby5jb25zdHJ1Y3RvcikgbiA9IG8uY29uc3RydWN0b3IubmFtZTsgaWYgKG4gPT09IFwiTWFwXCIgfHwgbiA9PT0gXCJTZXRcIikgcmV0dXJuIEFycmF5LmZyb20obyk7IGlmIChuID09PSBcIkFyZ3VtZW50c1wiIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTsgfVxuXG5mdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheShhcnIsIGxlbikgeyBpZiAobGVuID09IG51bGwgfHwgbGVuID4gYXJyLmxlbmd0aCkgbGVuID0gYXJyLmxlbmd0aDsgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkobGVuKTsgaSA8IGxlbjsgaSsrKSB7IGFycjJbaV0gPSBhcnJbaV07IH0gcmV0dXJuIGFycjI7IH1cblxudmFyIF9yZXF1aXJlID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWwvaXRlcmFibGUuanMnKSxcbiAgICBpdGVyYWJsZUN1cnJ5ID0gX3JlcXVpcmUuaXRlcmFibGVDdXJyeSxcbiAgICBpc0xvb3BhYmxlID0gX3JlcXVpcmUuaXNMb29wYWJsZTtcblxudmFyIF9yZXF1aXJlMiA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvdmFsaWRhdGUtYXJncy5qcycpLFxuICAgIHZhbGlkYXRlQXJncyA9IF9yZXF1aXJlMi52YWxpZGF0ZUFyZ3M7XG5cbnZhciBkZWZhdWx0U2hvdWxkRmxhdCA9IGZ1bmN0aW9uIGRlZmF1bHRTaG91bGRGbGF0KHZhbHVlKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnICYmIGlzTG9vcGFibGUodmFsdWUpO1xufTtcblxuZnVuY3Rpb24gZmxhdEludGVybmFsKHNob3VsZEZsYXQsIGRlcHRoLCBjdXJyZW50RGVwdGgsIHNvdXJjZSkge1xuICB2YXIgX2l0ZXJhdG9yLCBfc3RlcCwgdmFsdWU7XG5cbiAgcmV0dXJuIF9yZWdlbmVyYXRvclJ1bnRpbWUud3JhcChmdW5jdGlvbiBmbGF0SW50ZXJuYWwkKF9jb250ZXh0KSB7XG4gICAgd2hpbGUgKDEpIHtcbiAgICAgIHN3aXRjaCAoX2NvbnRleHQucHJldiA9IF9jb250ZXh0Lm5leHQpIHtcbiAgICAgICAgY2FzZSAwOlxuICAgICAgICAgIF9pdGVyYXRvciA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKHNvdXJjZSk7XG4gICAgICAgICAgX2NvbnRleHQucHJldiA9IDE7XG5cbiAgICAgICAgICBfaXRlcmF0b3IucygpO1xuXG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgICBpZiAoKF9zdGVwID0gX2l0ZXJhdG9yLm4oKSkuZG9uZSkge1xuICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDEzO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFsdWUgPSBfc3RlcC52YWx1ZTtcblxuICAgICAgICAgIGlmICghKGN1cnJlbnREZXB0aCA8IGRlcHRoICYmIHNob3VsZEZsYXQodmFsdWUpKSkge1xuICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gX2NvbnRleHQuZGVsZWdhdGVZaWVsZChmbGF0SW50ZXJuYWwoc2hvdWxkRmxhdCwgZGVwdGgsIGN1cnJlbnREZXB0aCArIDEsIHZhbHVlKSwgXCJ0MFwiLCA3KTtcblxuICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgX2NvbnRleHQubmV4dCA9IDExO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgOTpcbiAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMTE7XG4gICAgICAgICAgcmV0dXJuIHZhbHVlO1xuXG4gICAgICAgIGNhc2UgMTE6XG4gICAgICAgICAgX2NvbnRleHQubmV4dCA9IDM7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAxMzpcbiAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMTg7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAxNTpcbiAgICAgICAgICBfY29udGV4dC5wcmV2ID0gMTU7XG4gICAgICAgICAgX2NvbnRleHQudDEgPSBfY29udGV4dFtcImNhdGNoXCJdKDEpO1xuXG4gICAgICAgICAgX2l0ZXJhdG9yLmUoX2NvbnRleHQudDEpO1xuXG4gICAgICAgIGNhc2UgMTg6XG4gICAgICAgICAgX2NvbnRleHQucHJldiA9IDE4O1xuXG4gICAgICAgICAgX2l0ZXJhdG9yLmYoKTtcblxuICAgICAgICAgIHJldHVybiBfY29udGV4dC5maW5pc2goMTgpO1xuXG4gICAgICAgIGNhc2UgMjE6XG4gICAgICAgIGNhc2UgXCJlbmRcIjpcbiAgICAgICAgICByZXR1cm4gX2NvbnRleHQuc3RvcCgpO1xuICAgICAgfVxuICAgIH1cbiAgfSwgX21hcmtlZCwgbnVsbCwgW1sxLCAxNSwgMTgsIDIxXV0pO1xufVxuXG5mdW5jdGlvbiBfX2ZsYXQoc291cmNlKSB7XG4gIHZhciBkZXB0aCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogMTtcbiAgdmFyIHNob3VsZEZsYXQgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IGRlZmF1bHRTaG91bGRGbGF0O1xuICByZXR1cm4gZmxhdEludGVybmFsKHNob3VsZEZsYXQsIGRlcHRoLCAwLCBzb3VyY2UpO1xufVxuXG5leHBvcnRzLl9fZmxhdCA9IF9fZmxhdDtcbnZhciBmbGF0ID0gLyojX19QVVJFX18qL2l0ZXJhYmxlQ3VycnkoX19mbGF0LCB7XG4gIG1pbkFyZ3M6IDAsXG4gIG1heEFyZ3M6IDIsXG4gIHZhbGlkYXRlQXJnczogdmFsaWRhdGVBcmdzXG59KTtcbmV4cG9ydHMuZmxhdCA9IGZsYXQ7IiwidmFyIF9yZXF1aXJlID0gcmVxdWlyZSgnLi4vLi4vaXMtb2JqZWN0L2lzLW9iamVjdC5qcycpLFxuICAgIGlzT2JqZWN0ID0gX3JlcXVpcmUuaXNPYmplY3Q7XG5cbmZ1bmN0aW9uIHZhbGlkYXRlQXJncyhhcmdzKSB7XG4gIHZhciBkZXB0aE9yT3B0aW9ucyA9IGFyZ3NbMV07XG4gIHZhciBzaG91bGRGbGF0ID0gYXJnc1syXTtcbiAgdmFyIGRlcHRoID0gZGVwdGhPck9wdGlvbnM7XG5cbiAgaWYgKGlzT2JqZWN0KGRlcHRoT3JPcHRpb25zKSkge1xuICAgIHNob3VsZEZsYXQgPSBkZXB0aE9yT3B0aW9ucy5zaG91bGRGbGF0O1xuICAgIGRlcHRoID0gZGVwdGhPck9wdGlvbnMuZGVwdGg7XG4gIH1cblxuICBhcmdzWzJdID0gc2hvdWxkRmxhdDtcbiAgYXJnc1sxXSA9IGRlcHRoO1xufVxuXG5leHBvcnRzLnZhbGlkYXRlQXJncyA9IHZhbGlkYXRlQXJnczsiLCJ2YXIgX3JlZ2VuZXJhdG9yUnVudGltZSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9yZWdlbmVyYXRvclwiKTtcblxudmFyIF9hc3luY1RvR2VuZXJhdG9yID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvYXN5bmNUb0dlbmVyYXRvclwiKTtcblxudmFyIF9hc3luY0l0ZXJhdG9yID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvYXN5bmNJdGVyYXRvclwiKTtcblxudmFyIF9yZXF1aXJlID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWwvYXN5bmMtaXRlcmFibGUuanMnKSxcbiAgICBhc3luY0l0ZXJhYmxlQ3VycnkgPSBfcmVxdWlyZS5hc3luY0l0ZXJhYmxlQ3Vycnk7XG5cbmZ1bmN0aW9uIF9fYXN5bmNGb3JFYWNoKF94LCBfeDIpIHtcbiAgcmV0dXJuIF9hc3luY0ZvckVhY2guYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cblxuZnVuY3Rpb24gX2FzeW5jRm9yRWFjaCgpIHtcbiAgX2FzeW5jRm9yRWFjaCA9IF9hc3luY1RvR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yUnVudGltZS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUoaXRlcmFibGUsIGNhbGxiYWNrKSB7XG4gICAgdmFyIGMsIF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24sIF9kaWRJdGVyYXRvckVycm9yLCBfaXRlcmF0b3JFcnJvciwgX2l0ZXJhdG9yLCBfc3RlcCwgX3ZhbHVlLCB2YWx1ZTtcblxuICAgIHJldHVybiBfcmVnZW5lcmF0b3JSdW50aW1lLndyYXAoZnVuY3Rpb24gX2NhbGxlZSQoX2NvbnRleHQpIHtcbiAgICAgIHdoaWxlICgxKSB7XG4gICAgICAgIHN3aXRjaCAoX2NvbnRleHQucHJldiA9IF9jb250ZXh0Lm5leHQpIHtcbiAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICBjID0gMDtcbiAgICAgICAgICAgIF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24gPSB0cnVlO1xuICAgICAgICAgICAgX2RpZEl0ZXJhdG9yRXJyb3IgPSBmYWxzZTtcbiAgICAgICAgICAgIF9jb250ZXh0LnByZXYgPSAzO1xuICAgICAgICAgICAgX2l0ZXJhdG9yID0gX2FzeW5jSXRlcmF0b3IoaXRlcmFibGUpO1xuXG4gICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDc7XG4gICAgICAgICAgICByZXR1cm4gX2l0ZXJhdG9yLm5leHQoKTtcblxuICAgICAgICAgIGNhc2UgNzpcbiAgICAgICAgICAgIF9zdGVwID0gX2NvbnRleHQuc2VudDtcbiAgICAgICAgICAgIF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24gPSBfc3RlcC5kb25lO1xuICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDExO1xuICAgICAgICAgICAgcmV0dXJuIF9zdGVwLnZhbHVlO1xuXG4gICAgICAgICAgY2FzZSAxMTpcbiAgICAgICAgICAgIF92YWx1ZSA9IF9jb250ZXh0LnNlbnQ7XG5cbiAgICAgICAgICAgIGlmIChfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uKSB7XG4gICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAxOTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhbHVlID0gX3ZhbHVlO1xuICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDE2O1xuICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKHZhbHVlLCBjKyspO1xuXG4gICAgICAgICAgY2FzZSAxNjpcbiAgICAgICAgICAgIF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24gPSB0cnVlO1xuICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDU7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgMTk6XG4gICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMjU7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgMjE6XG4gICAgICAgICAgICBfY29udGV4dC5wcmV2ID0gMjE7XG4gICAgICAgICAgICBfY29udGV4dC50MCA9IF9jb250ZXh0W1wiY2F0Y2hcIl0oMyk7XG4gICAgICAgICAgICBfZGlkSXRlcmF0b3JFcnJvciA9IHRydWU7XG4gICAgICAgICAgICBfaXRlcmF0b3JFcnJvciA9IF9jb250ZXh0LnQwO1xuXG4gICAgICAgICAgY2FzZSAyNTpcbiAgICAgICAgICAgIF9jb250ZXh0LnByZXYgPSAyNTtcbiAgICAgICAgICAgIF9jb250ZXh0LnByZXYgPSAyNjtcblxuICAgICAgICAgICAgaWYgKCEoIV9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24gJiYgX2l0ZXJhdG9yW1wicmV0dXJuXCJdICE9IG51bGwpKSB7XG4gICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAzMDtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAzMDtcbiAgICAgICAgICAgIHJldHVybiBfaXRlcmF0b3JbXCJyZXR1cm5cIl0oKTtcblxuICAgICAgICAgIGNhc2UgMzA6XG4gICAgICAgICAgICBfY29udGV4dC5wcmV2ID0gMzA7XG5cbiAgICAgICAgICAgIGlmICghX2RpZEl0ZXJhdG9yRXJyb3IpIHtcbiAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDMzO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhyb3cgX2l0ZXJhdG9yRXJyb3I7XG5cbiAgICAgICAgICBjYXNlIDMzOlxuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LmZpbmlzaCgzMCk7XG5cbiAgICAgICAgICBjYXNlIDM0OlxuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LmZpbmlzaCgyNSk7XG5cbiAgICAgICAgICBjYXNlIDM1OlxuICAgICAgICAgIGNhc2UgXCJlbmRcIjpcbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5zdG9wKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCBfY2FsbGVlLCBudWxsLCBbWzMsIDIxLCAyNSwgMzVdLCBbMjYsLCAzMCwgMzRdXSk7XG4gIH0pKTtcbiAgcmV0dXJuIF9hc3luY0ZvckVhY2guYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cblxuZXhwb3J0cy5fX2FzeW5jRm9yRWFjaCA9IF9fYXN5bmNGb3JFYWNoO1xudmFyIGFzeW5jRm9yRWFjaCA9IC8qI19fUFVSRV9fKi9hc3luY0l0ZXJhYmxlQ3VycnkoX19hc3luY0ZvckVhY2gsIHtcbiAgcmVkdWNlczogdHJ1ZVxufSk7XG5leHBvcnRzLmFzeW5jRm9yRWFjaCA9IGFzeW5jRm9yRWFjaDsiLCJmdW5jdGlvbiBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihvLCBhbGxvd0FycmF5TGlrZSkgeyB2YXIgaXQ7IGlmICh0eXBlb2YgU3ltYm9sID09PSBcInVuZGVmaW5lZFwiIHx8IG9bU3ltYm9sLml0ZXJhdG9yXSA9PSBudWxsKSB7IGlmIChBcnJheS5pc0FycmF5KG8pIHx8IChpdCA9IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvKSkgfHwgYWxsb3dBcnJheUxpa2UgJiYgbyAmJiB0eXBlb2Ygby5sZW5ndGggPT09IFwibnVtYmVyXCIpIHsgaWYgKGl0KSBvID0gaXQ7IHZhciBpID0gMDsgdmFyIEYgPSBmdW5jdGlvbiBGKCkge307IHJldHVybiB7IHM6IEYsIG46IGZ1bmN0aW9uIG4oKSB7IGlmIChpID49IG8ubGVuZ3RoKSByZXR1cm4geyBkb25lOiB0cnVlIH07IHJldHVybiB7IGRvbmU6IGZhbHNlLCB2YWx1ZTogb1tpKytdIH07IH0sIGU6IGZ1bmN0aW9uIGUoX2UpIHsgdGhyb3cgX2U7IH0sIGY6IEYgfTsgfSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIGl0ZXJhdGUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIik7IH0gdmFyIG5vcm1hbENvbXBsZXRpb24gPSB0cnVlLCBkaWRFcnIgPSBmYWxzZSwgZXJyOyByZXR1cm4geyBzOiBmdW5jdGlvbiBzKCkgeyBpdCA9IG9bU3ltYm9sLml0ZXJhdG9yXSgpOyB9LCBuOiBmdW5jdGlvbiBuKCkgeyB2YXIgc3RlcCA9IGl0Lm5leHQoKTsgbm9ybWFsQ29tcGxldGlvbiA9IHN0ZXAuZG9uZTsgcmV0dXJuIHN0ZXA7IH0sIGU6IGZ1bmN0aW9uIGUoX2UyKSB7IGRpZEVyciA9IHRydWU7IGVyciA9IF9lMjsgfSwgZjogZnVuY3Rpb24gZigpIHsgdHJ5IHsgaWYgKCFub3JtYWxDb21wbGV0aW9uICYmIGl0W1wicmV0dXJuXCJdICE9IG51bGwpIGl0W1wicmV0dXJuXCJdKCk7IH0gZmluYWxseSB7IGlmIChkaWRFcnIpIHRocm93IGVycjsgfSB9IH07IH1cblxuZnVuY3Rpb24gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8sIG1pbkxlbikgeyBpZiAoIW8pIHJldHVybjsgaWYgKHR5cGVvZiBvID09PSBcInN0cmluZ1wiKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTsgdmFyIG4gPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykuc2xpY2UoOCwgLTEpOyBpZiAobiA9PT0gXCJPYmplY3RcIiAmJiBvLmNvbnN0cnVjdG9yKSBuID0gby5jb25zdHJ1Y3Rvci5uYW1lOyBpZiAobiA9PT0gXCJNYXBcIiB8fCBuID09PSBcIlNldFwiKSByZXR1cm4gQXJyYXkuZnJvbShvKTsgaWYgKG4gPT09IFwiQXJndW1lbnRzXCIgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QobikpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pOyB9XG5cbmZ1bmN0aW9uIF9hcnJheUxpa2VUb0FycmF5KGFyciwgbGVuKSB7IGlmIChsZW4gPT0gbnVsbCB8fCBsZW4gPiBhcnIubGVuZ3RoKSBsZW4gPSBhcnIubGVuZ3RoOyBmb3IgKHZhciBpID0gMCwgYXJyMiA9IG5ldyBBcnJheShsZW4pOyBpIDwgbGVuOyBpKyspIHsgYXJyMltpXSA9IGFycltpXTsgfSByZXR1cm4gYXJyMjsgfVxuXG52YXIgX3JlcXVpcmUgPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbC9pdGVyYWJsZS5qcycpLFxuICAgIGl0ZXJhYmxlQ3VycnkgPSBfcmVxdWlyZS5pdGVyYWJsZUN1cnJ5O1xuXG5mdW5jdGlvbiBfX2ZvckVhY2goaXRlcmFibGUsIGNhbGxiYWNrKSB7XG4gIHZhciBjID0gMDtcblxuICB2YXIgX2l0ZXJhdG9yID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIoaXRlcmFibGUpLFxuICAgICAgX3N0ZXA7XG5cbiAgdHJ5IHtcbiAgICBmb3IgKF9pdGVyYXRvci5zKCk7ICEoX3N0ZXAgPSBfaXRlcmF0b3IubigpKS5kb25lOykge1xuICAgICAgdmFyIHZhbHVlID0gX3N0ZXAudmFsdWU7XG4gICAgICBjYWxsYmFjayh2YWx1ZSwgYysrKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIF9pdGVyYXRvci5lKGVycik7XG4gIH0gZmluYWxseSB7XG4gICAgX2l0ZXJhdG9yLmYoKTtcbiAgfVxufVxuXG5leHBvcnRzLl9fZm9yRWFjaCA9IF9fZm9yRWFjaDtcbnZhciBmb3JFYWNoID0gLyojX19QVVJFX18qL2l0ZXJhYmxlQ3VycnkoX19mb3JFYWNoLCB7XG4gIHJlZHVjZXM6IHRydWVcbn0pO1xuZXhwb3J0cy5mb3JFYWNoID0gZm9yRWFjaDsiLCJ2YXIgX3JlZ2VuZXJhdG9yUnVudGltZSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9yZWdlbmVyYXRvclwiKTtcblxudmFyIF9tYXJrZWQgPSAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yUnVudGltZS5tYXJrKF9fYXN5bmNGb3JrKTtcblxudmFyIF9yZXF1aXJlID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWwvYXN5bmMtaXRlcmFibGUuanMnKSxcbiAgICBhc3luY0l0ZXJhYmxlQ3VycnkgPSBfcmVxdWlyZS5hc3luY0l0ZXJhYmxlQ3Vycnk7XG5cbnZhciBfcmVxdWlyZTIgPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbC9hc3luYy1mb3JrLmpzJyksXG4gICAgQXN5bmNFeGNoYW5nZSA9IF9yZXF1aXJlMi5Bc3luY0V4Y2hhbmdlO1xuXG5mdW5jdGlvbiBfX2FzeW5jRm9yayhzb3VyY2UpIHtcbiAgdmFyIGV4Y2hhbmdlLCBkdW1teUZvcms7XG4gIHJldHVybiBfcmVnZW5lcmF0b3JSdW50aW1lLndyYXAoZnVuY3Rpb24gX19hc3luY0ZvcmskKF9jb250ZXh0KSB7XG4gICAgd2hpbGUgKDEpIHtcbiAgICAgIHN3aXRjaCAoX2NvbnRleHQucHJldiA9IF9jb250ZXh0Lm5leHQpIHtcbiAgICAgICAgY2FzZSAwOlxuICAgICAgICAgIGV4Y2hhbmdlID0gbmV3IEFzeW5jRXhjaGFuZ2Uoc291cmNlW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpKTtcbiAgICAgICAgICBkdW1teUZvcmsgPSBleGNoYW5nZS5mb3JrKCk7XG4gICAgICAgICAgX2NvbnRleHQucHJldiA9IDI7XG5cbiAgICAgICAgY2FzZSAzOlxuICAgICAgICAgIGlmICghdHJ1ZSkge1xuICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDg7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBfY29udGV4dC5uZXh0ID0gNjtcbiAgICAgICAgICByZXR1cm4gZXhjaGFuZ2UuZm9yaygpO1xuXG4gICAgICAgIGNhc2UgNjpcbiAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMztcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIDg6XG4gICAgICAgICAgX2NvbnRleHQucHJldiA9IDg7XG4gICAgICAgICAgZHVtbXlGb3JrW1wicmV0dXJuXCJdKCk7XG4gICAgICAgICAgcmV0dXJuIF9jb250ZXh0LmZpbmlzaCg4KTtcblxuICAgICAgICBjYXNlIDExOlxuICAgICAgICBjYXNlIFwiZW5kXCI6XG4gICAgICAgICAgcmV0dXJuIF9jb250ZXh0LnN0b3AoKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIF9tYXJrZWQsIG51bGwsIFtbMiwsIDgsIDExXV0pO1xufVxuXG5leHBvcnRzLl9fYXN5bmNGb3JrID0gX19hc3luY0Zvcms7XG52YXIgYXN5bmNGb3JrID0gLyojX19QVVJFX18qL2FzeW5jSXRlcmFibGVDdXJyeShfX2FzeW5jRm9yaywge1xuICBmb3JjZVN5bmM6IHRydWVcbn0pO1xuZXhwb3J0cy5hc3luY0ZvcmsgPSBhc3luY0Zvcms7IiwidmFyIF9yZWdlbmVyYXRvclJ1bnRpbWUgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvcmVnZW5lcmF0b3JcIik7XG5cbnZhciBfbWFya2VkID0gLyojX19QVVJFX18qL19yZWdlbmVyYXRvclJ1bnRpbWUubWFyayhfX2ZvcmspO1xuXG52YXIgX3JlcXVpcmUgPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbC9pdGVyYWJsZS5qcycpLFxuICAgIGl0ZXJhYmxlQ3VycnkgPSBfcmVxdWlyZS5pdGVyYWJsZUN1cnJ5O1xuXG52YXIgX3JlcXVpcmUyID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWwvZm9yay5qcycpLFxuICAgIEV4Y2hhbmdlID0gX3JlcXVpcmUyLkV4Y2hhbmdlO1xuXG5mdW5jdGlvbiBfX2Zvcmsoc291cmNlKSB7XG4gIHZhciBleGNoYW5nZSwgZHVtbXlGb3JrO1xuICByZXR1cm4gX3JlZ2VuZXJhdG9yUnVudGltZS53cmFwKGZ1bmN0aW9uIF9fZm9yayQoX2NvbnRleHQpIHtcbiAgICB3aGlsZSAoMSkge1xuICAgICAgc3dpdGNoIChfY29udGV4dC5wcmV2ID0gX2NvbnRleHQubmV4dCkge1xuICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgZXhjaGFuZ2UgPSBuZXcgRXhjaGFuZ2Uoc291cmNlW1N5bWJvbC5pdGVyYXRvcl0oKSk7XG4gICAgICAgICAgZHVtbXlGb3JrID0gZXhjaGFuZ2UuZm9yaygpO1xuICAgICAgICAgIF9jb250ZXh0LnByZXYgPSAyO1xuXG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgICBpZiAoIXRydWUpIHtcbiAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSA4O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgX2NvbnRleHQubmV4dCA9IDY7XG4gICAgICAgICAgcmV0dXJuIGV4Y2hhbmdlLmZvcmsoKTtcblxuICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgX2NvbnRleHQubmV4dCA9IDM7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSA4OlxuICAgICAgICAgIF9jb250ZXh0LnByZXYgPSA4O1xuICAgICAgICAgIGR1bW15Rm9ya1tcInJldHVyblwiXSgpO1xuICAgICAgICAgIHJldHVybiBfY29udGV4dC5maW5pc2goOCk7XG5cbiAgICAgICAgY2FzZSAxMTpcbiAgICAgICAgY2FzZSBcImVuZFwiOlxuICAgICAgICAgIHJldHVybiBfY29udGV4dC5zdG9wKCk7XG4gICAgICB9XG4gICAgfVxuICB9LCBfbWFya2VkLCBudWxsLCBbWzIsLCA4LCAxMV1dKTtcbn1cblxuZXhwb3J0cy5fX2ZvcmsgPSBfX2Zvcms7XG52YXIgZm9yayA9IC8qI19fUFVSRV9fKi9pdGVyYWJsZUN1cnJ5KF9fZm9yaywge1xuICBmb3JjZVN5bmM6IHRydWVcbn0pO1xuZXhwb3J0cy5mb3JrID0gZm9yazsiLCJ2YXIgX3JlZ2VuZXJhdG9yUnVudGltZSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9yZWdlbmVyYXRvclwiKTtcblxudmFyIF9hc3luY1RvR2VuZXJhdG9yID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvYXN5bmNUb0dlbmVyYXRvclwiKTtcblxudmFyIF9jbGFzc0NhbGxDaGVjayA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrXCIpO1xuXG52YXIgX2NyZWF0ZUNsYXNzID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY3JlYXRlQ2xhc3NcIik7XG5cbnZhciBfaW5oZXJpdHMgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbmhlcml0c1wiKTtcblxudmFyIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvcG9zc2libGVDb25zdHJ1Y3RvclJldHVyblwiKTtcblxudmFyIF9nZXQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9nZXRcIik7XG5cbnZhciBfZ2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9nZXRQcm90b3R5cGVPZlwiKTtcblxuZnVuY3Rpb24gX2NyZWF0ZVN1cGVyKERlcml2ZWQpIHsgdmFyIGhhc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QgPSBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCk7IHJldHVybiBmdW5jdGlvbiBfY3JlYXRlU3VwZXJJbnRlcm5hbCgpIHsgdmFyIFN1cGVyID0gX2dldFByb3RvdHlwZU9mKERlcml2ZWQpLCByZXN1bHQ7IGlmIChoYXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KSB7IHZhciBOZXdUYXJnZXQgPSBfZ2V0UHJvdG90eXBlT2YodGhpcykuY29uc3RydWN0b3I7IHJlc3VsdCA9IFJlZmxlY3QuY29uc3RydWN0KFN1cGVyLCBhcmd1bWVudHMsIE5ld1RhcmdldCk7IH0gZWxzZSB7IHJlc3VsdCA9IFN1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH0gcmV0dXJuIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIHJlc3VsdCk7IH07IH1cblxuZnVuY3Rpb24gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpIHsgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcInVuZGVmaW5lZFwiIHx8ICFSZWZsZWN0LmNvbnN0cnVjdCkgcmV0dXJuIGZhbHNlOyBpZiAoUmVmbGVjdC5jb25zdHJ1Y3Quc2hhbSkgcmV0dXJuIGZhbHNlOyBpZiAodHlwZW9mIFByb3h5ID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiB0cnVlOyB0cnkgeyBEYXRlLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKFJlZmxlY3QuY29uc3RydWN0KERhdGUsIFtdLCBmdW5jdGlvbiAoKSB7fSkpOyByZXR1cm4gdHJ1ZTsgfSBjYXRjaCAoZSkgeyByZXR1cm4gZmFsc2U7IH0gfVxuXG52YXIgX3JlcXVpcmUgPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbC9hc3luYy1pdGVyYWJsZS5qcycpLFxuICAgIGFzeW5jRW5zdXJlSXRlcmFibGUgPSBfcmVxdWlyZS5hc3luY0Vuc3VyZUl0ZXJhYmxlO1xuXG52YXIgX3JlcXVpcmUyID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWwvYXN5bmMtZm9yay5qcycpLFxuICAgIEFzeW5jRXhjaGFuZ2UgPSBfcmVxdWlyZTIuQXN5bmNFeGNoYW5nZTtcblxudmFyIF9yZXF1aXJlMyA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFsL2FzeW5jLXBlZWtlcmF0b3IuanMnKSxcbiAgICBBc3luY1BlZWtlcmF0b3IgPSBfcmVxdWlyZTMuQXN5bmNQZWVrZXJhdG9yO1xuXG52YXIgXyA9IFN5bWJvbFtcImZvclwiXSgnXycpO1xuXG52YXIgQXN5bmNGb3JrZXJhdG9yID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfQXN5bmNQZWVrZXJhdG9yKSB7XG4gIF9pbmhlcml0cyhBc3luY0ZvcmtlcmF0b3IsIF9Bc3luY1BlZWtlcmF0b3IpO1xuXG4gIHZhciBfc3VwZXIgPSBfY3JlYXRlU3VwZXIoQXN5bmNGb3JrZXJhdG9yKTtcblxuICBfY3JlYXRlQ2xhc3MoQXN5bmNGb3JrZXJhdG9yLCBudWxsLCBbe1xuICAgIGtleTogXCJmcm9tXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBfZnJvbSA9IF9hc3luY1RvR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yUnVudGltZS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUoc291cmNlKSB7XG4gICAgICAgIHZhciBleGNoYW5nZTtcbiAgICAgICAgcmV0dXJuIF9yZWdlbmVyYXRvclJ1bnRpbWUud3JhcChmdW5jdGlvbiBfY2FsbGVlJChfY29udGV4dCkge1xuICAgICAgICAgIHdoaWxlICgxKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKF9jb250ZXh0LnByZXYgPSBfY29udGV4dC5uZXh0KSB7XG4gICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICBleGNoYW5nZSA9IG5ldyBBc3luY0V4Y2hhbmdlKGFzeW5jRW5zdXJlSXRlcmFibGUoc291cmNlKVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKSk7XG4gICAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDM7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9nZXQoX2dldFByb3RvdHlwZU9mKEFzeW5jRm9ya2VyYXRvciksIFwiZnJvbVwiLCB0aGlzKS5jYWxsKHRoaXMsIGV4Y2hhbmdlLmZvcmsoKSwgZXhjaGFuZ2UpO1xuXG4gICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuYWJydXB0KFwicmV0dXJuXCIsIF9jb250ZXh0LnNlbnQpO1xuXG4gICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgY2FzZSBcImVuZFwiOlxuICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5zdG9wKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9LCBfY2FsbGVlLCB0aGlzKTtcbiAgICAgIH0pKTtcblxuICAgICAgZnVuY3Rpb24gZnJvbShfeCkge1xuICAgICAgICByZXR1cm4gX2Zyb20uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZyb207XG4gICAgfSgpXG4gIH1dKTtcblxuICBmdW5jdGlvbiBBc3luY0ZvcmtlcmF0b3IoaXRlcmF0b3IsIGZpcnN0LCBleGNoYW5nZSkge1xuICAgIHZhciBfdGhpcztcblxuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBBc3luY0ZvcmtlcmF0b3IpO1xuXG4gICAgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBpdGVyYXRvciwgZmlyc3QpO1xuICAgIF90aGlzW19dLmV4Y2hhbmdlID0gZXhjaGFuZ2U7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKEFzeW5jRm9ya2VyYXRvciwgW3tcbiAgICBrZXk6IFwiYWR2YW5jZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgX2FkdmFuY2UgPSBfYXN5bmNUb0dlbmVyYXRvciggLyojX19QVVJFX18qL19yZWdlbmVyYXRvclJ1bnRpbWUubWFyayhmdW5jdGlvbiBfY2FsbGVlMigpIHtcbiAgICAgICAgdmFyIG4sXG4gICAgICAgICAgICBpLFxuICAgICAgICAgICAgX2FyZ3MyID0gYXJndW1lbnRzO1xuICAgICAgICByZXR1cm4gX3JlZ2VuZXJhdG9yUnVudGltZS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUyJChfY29udGV4dDIpIHtcbiAgICAgICAgICB3aGlsZSAoMSkge1xuICAgICAgICAgICAgc3dpdGNoIChfY29udGV4dDIucHJldiA9IF9jb250ZXh0Mi5uZXh0KSB7XG4gICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICBuID0gX2FyZ3MyLmxlbmd0aCA+IDAgJiYgX2FyZ3MyWzBdICE9PSB1bmRlZmluZWQgPyBfYXJnczJbMF0gOiAxO1xuICAgICAgICAgICAgICAgIGkgPSAwO1xuXG4gICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICBpZiAoIShpIDwgbikpIHtcbiAgICAgICAgICAgICAgICAgIF9jb250ZXh0Mi5uZXh0ID0gOTtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIF9jb250ZXh0Mi5uZXh0ID0gNTtcbiAgICAgICAgICAgICAgICByZXR1cm4gX2dldChfZ2V0UHJvdG90eXBlT2YoQXN5bmNGb3JrZXJhdG9yLnByb3RvdHlwZSksIFwiYWR2YW5jZVwiLCB0aGlzKS5jYWxsKHRoaXMpO1xuXG4gICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICB0aGlzW19dLmV4Y2hhbmdlLmFkdmFuY2UoKTtcblxuICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICAgIF9jb250ZXh0Mi5uZXh0ID0gMjtcbiAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICBjYXNlIDk6XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0Mi5hYnJ1cHQoXCJyZXR1cm5cIiwgdGhpcyk7XG5cbiAgICAgICAgICAgICAgY2FzZSAxMDpcbiAgICAgICAgICAgICAgY2FzZSBcImVuZFwiOlxuICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDIuc3RvcCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSwgX2NhbGxlZTIsIHRoaXMpO1xuICAgICAgfSkpO1xuXG4gICAgICBmdW5jdGlvbiBhZHZhbmNlKCkge1xuICAgICAgICByZXR1cm4gX2FkdmFuY2UuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGFkdmFuY2U7XG4gICAgfSgpXG4gIH0sIHtcbiAgICBrZXk6IFwiZm9ya1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBmb3JrKCkge1xuICAgICAgcmV0dXJuIHRoaXNbX10uZXhjaGFuZ2UuZm9yaygpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogU3ltYm9sLmFzeW5jSXRlcmF0b3IsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHZhbHVlKCkge1xuICAgICAgcmV0dXJuIHRoaXNbX10uZXhjaGFuZ2UuZm9yaygpO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBBc3luY0ZvcmtlcmF0b3I7XG59KEFzeW5jUGVla2VyYXRvcik7XG5cbmZ1bmN0aW9uIF9fYXN5bmNGb3JrZXJhdGUoc291cmNlKSB7XG4gIHJldHVybiBBc3luY0ZvcmtlcmF0b3IuZnJvbShzb3VyY2UpO1xufVxuXG5leHBvcnRzLl9fYXN5bmNGb3JrZXJhdGUgPSBfX2FzeW5jRm9ya2VyYXRlO1xuXG5mdW5jdGlvbiBhc3luY1dyYXBXaXRoRW5zdXJlSXRlcmFibGUoZm4pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChzb3VyY2UpIHtcbiAgICByZXR1cm4gZm4oYXN5bmNFbnN1cmVJdGVyYWJsZShzb3VyY2UpKTtcbiAgfTtcbn1cblxudmFyIGFzeW5jRm9ya2VyYXRlID0gYXN5bmNXcmFwV2l0aEVuc3VyZUl0ZXJhYmxlKF9fYXN5bmNGb3JrZXJhdGUpO1xuZXhwb3J0cy5hc3luY0ZvcmtlcmF0ZSA9IGFzeW5jRm9ya2VyYXRlOyIsInZhciBfY2xhc3NDYWxsQ2hlY2sgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVja1wiKTtcblxudmFyIF9jcmVhdGVDbGFzcyA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NyZWF0ZUNsYXNzXCIpO1xuXG52YXIgX2luaGVyaXRzID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW5oZXJpdHNcIik7XG5cbnZhciBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybiA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm5cIik7XG5cbnZhciBfZ2V0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZ2V0XCIpO1xuXG52YXIgX2dldFByb3RvdHlwZU9mID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZ2V0UHJvdG90eXBlT2ZcIik7XG5cbmZ1bmN0aW9uIF9jcmVhdGVTdXBlcihEZXJpdmVkKSB7IHZhciBoYXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0ID0gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpOyByZXR1cm4gZnVuY3Rpb24gX2NyZWF0ZVN1cGVySW50ZXJuYWwoKSB7IHZhciBTdXBlciA9IF9nZXRQcm90b3R5cGVPZihEZXJpdmVkKSwgcmVzdWx0OyBpZiAoaGFzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCkgeyB2YXIgTmV3VGFyZ2V0ID0gX2dldFByb3RvdHlwZU9mKHRoaXMpLmNvbnN0cnVjdG9yOyByZXN1bHQgPSBSZWZsZWN0LmNvbnN0cnVjdChTdXBlciwgYXJndW1lbnRzLCBOZXdUYXJnZXQpOyB9IGVsc2UgeyByZXN1bHQgPSBTdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9IHJldHVybiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCByZXN1bHQpOyB9OyB9XG5cbmZ1bmN0aW9uIF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKSB7IGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJ1bmRlZmluZWRcIiB8fCAhUmVmbGVjdC5jb25zdHJ1Y3QpIHJldHVybiBmYWxzZTsgaWYgKFJlZmxlY3QuY29uc3RydWN0LnNoYW0pIHJldHVybiBmYWxzZTsgaWYgKHR5cGVvZiBQcm94eSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gdHJ1ZTsgdHJ5IHsgRGF0ZS5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChEYXRlLCBbXSwgZnVuY3Rpb24gKCkge30pKTsgcmV0dXJuIHRydWU7IH0gY2F0Y2ggKGUpIHsgcmV0dXJuIGZhbHNlOyB9IH1cblxudmFyIF9yZXF1aXJlID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWwvaXRlcmFibGUuanMnKSxcbiAgICBlbnN1cmVJdGVyYWJsZSA9IF9yZXF1aXJlLmVuc3VyZUl0ZXJhYmxlO1xuXG52YXIgX3JlcXVpcmUyID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWwvZm9yay5qcycpLFxuICAgIEV4Y2hhbmdlID0gX3JlcXVpcmUyLkV4Y2hhbmdlO1xuXG52YXIgX3JlcXVpcmUzID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWwvcGVla2VyYXRvci5qcycpLFxuICAgIFBlZWtlcmF0b3IgPSBfcmVxdWlyZTMuUGVla2VyYXRvcjtcblxudmFyIF8gPSBTeW1ib2xbXCJmb3JcIl0oJ18nKTtcblxudmFyIEZvcmtlcmF0b3IgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9QZWVrZXJhdG9yKSB7XG4gIF9pbmhlcml0cyhGb3JrZXJhdG9yLCBfUGVla2VyYXRvcik7XG5cbiAgdmFyIF9zdXBlciA9IF9jcmVhdGVTdXBlcihGb3JrZXJhdG9yKTtcblxuICBfY3JlYXRlQ2xhc3MoRm9ya2VyYXRvciwgbnVsbCwgW3tcbiAgICBrZXk6IFwiZnJvbVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBmcm9tKHNvdXJjZSkge1xuICAgICAgdmFyIGV4Y2hhbmdlID0gbmV3IEV4Y2hhbmdlKGVuc3VyZUl0ZXJhYmxlKHNvdXJjZSlbU3ltYm9sLml0ZXJhdG9yXSgpKTtcbiAgICAgIHJldHVybiBfZ2V0KF9nZXRQcm90b3R5cGVPZihGb3JrZXJhdG9yKSwgXCJmcm9tXCIsIHRoaXMpLmNhbGwodGhpcywgZXhjaGFuZ2UuZm9yaygpLCBleGNoYW5nZSk7XG4gICAgfVxuICB9XSk7XG5cbiAgZnVuY3Rpb24gRm9ya2VyYXRvcihpdGVyYXRvciwgZmlyc3QsIGV4Y2hhbmdlKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEZvcmtlcmF0b3IpO1xuXG4gICAgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBpdGVyYXRvciwgZmlyc3QpO1xuICAgIF90aGlzW19dLmV4Y2hhbmdlID0gZXhjaGFuZ2U7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKEZvcmtlcmF0b3IsIFt7XG4gICAga2V5OiBcImFkdmFuY2VcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYWR2YW5jZSgpIHtcbiAgICAgIHZhciBuID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiAxO1xuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG47IGkrKykge1xuICAgICAgICBfZ2V0KF9nZXRQcm90b3R5cGVPZihGb3JrZXJhdG9yLnByb3RvdHlwZSksIFwiYWR2YW5jZVwiLCB0aGlzKS5jYWxsKHRoaXMpO1xuXG4gICAgICAgIHRoaXNbX10uZXhjaGFuZ2UuYWR2YW5jZSgpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZm9ya1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBmb3JrKCkge1xuICAgICAgcmV0dXJuIHRoaXNbX10uZXhjaGFuZ2UuZm9yaygpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogU3ltYm9sLml0ZXJhdG9yLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB2YWx1ZSgpIHtcbiAgICAgIHJldHVybiB0aGlzW19dLmV4Y2hhbmdlLmZvcmsoKTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gRm9ya2VyYXRvcjtcbn0oUGVla2VyYXRvcik7XG5cbmZ1bmN0aW9uIF9fZm9ya2VyYXRlKHNvdXJjZSkge1xuICByZXR1cm4gRm9ya2VyYXRvci5mcm9tKHNvdXJjZSk7XG59XG5cbmV4cG9ydHMuX19mb3JrZXJhdGUgPSBfX2ZvcmtlcmF0ZTtcblxuZnVuY3Rpb24gd3JhcFdpdGhFbnN1cmVJdGVyYWJsZShmbikge1xuICByZXR1cm4gZnVuY3Rpb24gKHNvdXJjZSkge1xuICAgIHJldHVybiBmbihlbnN1cmVJdGVyYWJsZShzb3VyY2UpKTtcbiAgfTtcbn1cblxudmFyIGZvcmtlcmF0ZSA9IHdyYXBXaXRoRW5zdXJlSXRlcmFibGUoX19mb3JrZXJhdGUpO1xuZXhwb3J0cy5mb3JrZXJhdGUgPSBmb3JrZXJhdGU7IiwidmFyIF9yZWdlbmVyYXRvclJ1bnRpbWUgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvcmVnZW5lcmF0b3JcIik7XG5cbnZhciBfYXN5bmNUb0dlbmVyYXRvciA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2FzeW5jVG9HZW5lcmF0b3JcIik7XG5cbnZhciBfYXN5bmNJdGVyYXRvciA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2FzeW5jSXRlcmF0b3JcIik7XG5cbnZhciBfcmVxdWlyZSA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFsL2FzeW5jLWl0ZXJhYmxlLmpzJyksXG4gICAgYXN5bmNJdGVyYWJsZUN1cnJ5ID0gX3JlcXVpcmUuYXN5bmNJdGVyYWJsZUN1cnJ5O1xuXG52YXIgX3JlcXVpcmUyID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWwvYXN5bmMtYW55LXNlcS5qcycpLFxuICAgIGFzeW5jU2Vxc1RvQXJyYXkgPSBfcmVxdWlyZTIuYXN5bmNTZXFzVG9BcnJheTtcblxudmFyIF9yZXF1aXJlMyA9IHJlcXVpcmUoJy4uLyR3aW5kb3ctYWhlYWQvYXN5bmMtd2luZG93LWFoZWFkLmpzJyksXG4gICAgX19hc3luY1dpbmRvd0FoZWFkID0gX3JlcXVpcmUzLl9fYXN5bmNXaW5kb3dBaGVhZDtcblxudmFyIF9yZXF1aXJlNCA9IHJlcXVpcmUoJy4uLyRzdGFydHMtd2l0aC1hbnktc2VxL3N0YXJ0cy13aXRoLWFueS1zZXEuanMnKSxcbiAgICBfX3N0YXJ0c1dpdGhBbnlTZXEgPSBfcmVxdWlyZTQuX19zdGFydHNXaXRoQW55U2VxO1xuXG5mdW5jdGlvbiBfX2FzeW5jSW5jbHVkZXNBbnlTZXEoX3gsIF94Mikge1xuICByZXR1cm4gX2FzeW5jSW5jbHVkZXNBbnlTZXEuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cblxuZnVuY3Rpb24gX2FzeW5jSW5jbHVkZXNBbnlTZXEoKSB7XG4gIF9hc3luY0luY2x1ZGVzQW55U2VxID0gX2FzeW5jVG9HZW5lcmF0b3IoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3JSdW50aW1lLm1hcmsoZnVuY3Rpb24gX2NhbGxlZShpdGVyYWJsZSwgc2Vxcykge1xuICAgIHZhciBzYW1lLFxuICAgICAgICBzZXFzQXJyLFxuICAgICAgICBtYXhNYXRjaExlbmd0aCxcbiAgICAgICAgX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbixcbiAgICAgICAgX2RpZEl0ZXJhdG9yRXJyb3IsXG4gICAgICAgIF9pdGVyYXRvckVycm9yLFxuICAgICAgICBfaXRlcmF0b3IsXG4gICAgICAgIF9zdGVwLFxuICAgICAgICBfdmFsdWUsXG4gICAgICAgIGJ1ZmZlcixcbiAgICAgICAgX2FyZ3MgPSBhcmd1bWVudHM7XG5cbiAgICByZXR1cm4gX3JlZ2VuZXJhdG9yUnVudGltZS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUkKF9jb250ZXh0KSB7XG4gICAgICB3aGlsZSAoMSkge1xuICAgICAgICBzd2l0Y2ggKF9jb250ZXh0LnByZXYgPSBfY29udGV4dC5uZXh0KSB7XG4gICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgc2FtZSA9IF9hcmdzLmxlbmd0aCA+IDIgJiYgX2FyZ3NbMl0gIT09IHVuZGVmaW5lZCA/IF9hcmdzWzJdIDogT2JqZWN0LmlzO1xuICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDM7XG4gICAgICAgICAgICByZXR1cm4gYXN5bmNTZXFzVG9BcnJheShzZXFzKTtcblxuICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgIHNlcXNBcnIgPSBfY29udGV4dC5zZW50O1xuXG4gICAgICAgICAgICBpZiAoc2Vxc0Fyci5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDY7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuYWJydXB0KFwicmV0dXJuXCIsIGZhbHNlKTtcblxuICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgIGlmICghc2Vxc0Fyci5maW5kKGZ1bmN0aW9uIChzZXEpIHtcbiAgICAgICAgICAgICAgcmV0dXJuICFzZXEubGVuZ3RoO1xuICAgICAgICAgICAgfSkpIHtcbiAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDg7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuYWJydXB0KFwicmV0dXJuXCIsIHRydWUpO1xuXG4gICAgICAgICAgY2FzZSA4OlxuICAgICAgICAgICAgbWF4TWF0Y2hMZW5ndGggPSBzZXFzQXJyLnJlZHVjZShmdW5jdGlvbiAobWF4LCBfcmVmKSB7XG4gICAgICAgICAgICAgIHZhciBsZW5ndGggPSBfcmVmLmxlbmd0aDtcbiAgICAgICAgICAgICAgcmV0dXJuIE1hdGgubWF4KG1heCwgbGVuZ3RoKTtcbiAgICAgICAgICAgIH0sIDEpO1xuICAgICAgICAgICAgX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbiA9IHRydWU7XG4gICAgICAgICAgICBfZGlkSXRlcmF0b3JFcnJvciA9IGZhbHNlO1xuICAgICAgICAgICAgX2NvbnRleHQucHJldiA9IDExO1xuICAgICAgICAgICAgX2l0ZXJhdG9yID0gX2FzeW5jSXRlcmF0b3IoX19hc3luY1dpbmRvd0FoZWFkKGl0ZXJhYmxlLCBtYXhNYXRjaExlbmd0aCkpO1xuXG4gICAgICAgICAgY2FzZSAxMzpcbiAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAxNTtcbiAgICAgICAgICAgIHJldHVybiBfaXRlcmF0b3IubmV4dCgpO1xuXG4gICAgICAgICAgY2FzZSAxNTpcbiAgICAgICAgICAgIF9zdGVwID0gX2NvbnRleHQuc2VudDtcbiAgICAgICAgICAgIF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24gPSBfc3RlcC5kb25lO1xuICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDE5O1xuICAgICAgICAgICAgcmV0dXJuIF9zdGVwLnZhbHVlO1xuXG4gICAgICAgICAgY2FzZSAxOTpcbiAgICAgICAgICAgIF92YWx1ZSA9IF9jb250ZXh0LnNlbnQ7XG5cbiAgICAgICAgICAgIGlmIChfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uKSB7XG4gICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAyNztcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGJ1ZmZlciA9IF92YWx1ZTtcblxuICAgICAgICAgICAgaWYgKCFfX3N0YXJ0c1dpdGhBbnlTZXEoYnVmZmVyLCBzZXFzQXJyLCBzYW1lKSkge1xuICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMjQ7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuYWJydXB0KFwicmV0dXJuXCIsIHRydWUpO1xuXG4gICAgICAgICAgY2FzZSAyNDpcbiAgICAgICAgICAgIF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24gPSB0cnVlO1xuICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDEzO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlIDI3OlxuICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDMzO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlIDI5OlxuICAgICAgICAgICAgX2NvbnRleHQucHJldiA9IDI5O1xuICAgICAgICAgICAgX2NvbnRleHQudDAgPSBfY29udGV4dFtcImNhdGNoXCJdKDExKTtcbiAgICAgICAgICAgIF9kaWRJdGVyYXRvckVycm9yID0gdHJ1ZTtcbiAgICAgICAgICAgIF9pdGVyYXRvckVycm9yID0gX2NvbnRleHQudDA7XG5cbiAgICAgICAgICBjYXNlIDMzOlxuICAgICAgICAgICAgX2NvbnRleHQucHJldiA9IDMzO1xuICAgICAgICAgICAgX2NvbnRleHQucHJldiA9IDM0O1xuXG4gICAgICAgICAgICBpZiAoISghX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbiAmJiBfaXRlcmF0b3JbXCJyZXR1cm5cIl0gIT0gbnVsbCkpIHtcbiAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDM4O1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDM4O1xuICAgICAgICAgICAgcmV0dXJuIF9pdGVyYXRvcltcInJldHVyblwiXSgpO1xuXG4gICAgICAgICAgY2FzZSAzODpcbiAgICAgICAgICAgIF9jb250ZXh0LnByZXYgPSAzODtcblxuICAgICAgICAgICAgaWYgKCFfZGlkSXRlcmF0b3JFcnJvcikge1xuICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gNDE7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aHJvdyBfaXRlcmF0b3JFcnJvcjtcblxuICAgICAgICAgIGNhc2UgNDE6XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuZmluaXNoKDM4KTtcblxuICAgICAgICAgIGNhc2UgNDI6XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuZmluaXNoKDMzKTtcblxuICAgICAgICAgIGNhc2UgNDM6XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuYWJydXB0KFwicmV0dXJuXCIsIGZhbHNlKTtcblxuICAgICAgICAgIGNhc2UgNDQ6XG4gICAgICAgICAgY2FzZSBcImVuZFwiOlxuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LnN0b3AoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sIF9jYWxsZWUsIG51bGwsIFtbMTEsIDI5LCAzMywgNDNdLCBbMzQsLCAzOCwgNDJdXSk7XG4gIH0pKTtcbiAgcmV0dXJuIF9hc3luY0luY2x1ZGVzQW55U2VxLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5cbmV4cG9ydHMuX19hc3luY0luY2x1ZGVzQW55U2VxID0gX19hc3luY0luY2x1ZGVzQW55U2VxO1xudmFyIGFzeW5jSW5jbHVkZXNBbnlTZXEgPSAvKiNfX1BVUkVfXyovYXN5bmNJdGVyYWJsZUN1cnJ5KF9fYXN5bmNJbmNsdWRlc0FueVNlcSwge1xuICBtaW5BcmdzOiAxLFxuICBtYXhBcmdzOiAyLFxuICByZWR1Y2VzOiB0cnVlXG59KTtcbmV4cG9ydHMuYXN5bmNJbmNsdWRlc0FueVNlcSA9IGFzeW5jSW5jbHVkZXNBbnlTZXE7IiwiZnVuY3Rpb24gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIobywgYWxsb3dBcnJheUxpa2UpIHsgdmFyIGl0OyBpZiAodHlwZW9mIFN5bWJvbCA9PT0gXCJ1bmRlZmluZWRcIiB8fCBvW1N5bWJvbC5pdGVyYXRvcl0gPT0gbnVsbCkgeyBpZiAoQXJyYXkuaXNBcnJheShvKSB8fCAoaXQgPSBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkobykpIHx8IGFsbG93QXJyYXlMaWtlICYmIG8gJiYgdHlwZW9mIG8ubGVuZ3RoID09PSBcIm51bWJlclwiKSB7IGlmIChpdCkgbyA9IGl0OyB2YXIgaSA9IDA7IHZhciBGID0gZnVuY3Rpb24gRigpIHt9OyByZXR1cm4geyBzOiBGLCBuOiBmdW5jdGlvbiBuKCkgeyBpZiAoaSA+PSBvLmxlbmd0aCkgcmV0dXJuIHsgZG9uZTogdHJ1ZSB9OyByZXR1cm4geyBkb25lOiBmYWxzZSwgdmFsdWU6IG9baSsrXSB9OyB9LCBlOiBmdW5jdGlvbiBlKF9lKSB7IHRocm93IF9lOyB9LCBmOiBGIH07IH0gdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBpdGVyYXRlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpOyB9IHZhciBub3JtYWxDb21wbGV0aW9uID0gdHJ1ZSwgZGlkRXJyID0gZmFsc2UsIGVycjsgcmV0dXJuIHsgczogZnVuY3Rpb24gcygpIHsgaXQgPSBvW1N5bWJvbC5pdGVyYXRvcl0oKTsgfSwgbjogZnVuY3Rpb24gbigpIHsgdmFyIHN0ZXAgPSBpdC5uZXh0KCk7IG5vcm1hbENvbXBsZXRpb24gPSBzdGVwLmRvbmU7IHJldHVybiBzdGVwOyB9LCBlOiBmdW5jdGlvbiBlKF9lMikgeyBkaWRFcnIgPSB0cnVlOyBlcnIgPSBfZTI7IH0sIGY6IGZ1bmN0aW9uIGYoKSB7IHRyeSB7IGlmICghbm9ybWFsQ29tcGxldGlvbiAmJiBpdFtcInJldHVyblwiXSAhPSBudWxsKSBpdFtcInJldHVyblwiXSgpOyB9IGZpbmFsbHkgeyBpZiAoZGlkRXJyKSB0aHJvdyBlcnI7IH0gfSB9OyB9XG5cbmZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvLCBtaW5MZW4pIHsgaWYgKCFvKSByZXR1cm47IGlmICh0eXBlb2YgbyA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IHZhciBuID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pLnNsaWNlKDgsIC0xKTsgaWYgKG4gPT09IFwiT2JqZWN0XCIgJiYgby5jb25zdHJ1Y3RvcikgbiA9IG8uY29uc3RydWN0b3IubmFtZTsgaWYgKG4gPT09IFwiTWFwXCIgfHwgbiA9PT0gXCJTZXRcIikgcmV0dXJuIEFycmF5LmZyb20obyk7IGlmIChuID09PSBcIkFyZ3VtZW50c1wiIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTsgfVxuXG5mdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheShhcnIsIGxlbikgeyBpZiAobGVuID09IG51bGwgfHwgbGVuID4gYXJyLmxlbmd0aCkgbGVuID0gYXJyLmxlbmd0aDsgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkobGVuKTsgaSA8IGxlbjsgaSsrKSB7IGFycjJbaV0gPSBhcnJbaV07IH0gcmV0dXJuIGFycjI7IH1cblxudmFyIF9yZXF1aXJlID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWwvaXRlcmFibGUuanMnKSxcbiAgICBpdGVyYWJsZUN1cnJ5ID0gX3JlcXVpcmUuaXRlcmFibGVDdXJyeTtcblxudmFyIF9yZXF1aXJlMiA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFsL2FueS1zZXEuanMnKSxcbiAgICBzZXFzVG9BcnJheSA9IF9yZXF1aXJlMi5zZXFzVG9BcnJheTtcblxudmFyIF9yZXF1aXJlMyA9IHJlcXVpcmUoJy4uLyR3aW5kb3ctYWhlYWQvd2luZG93LWFoZWFkLmpzJyksXG4gICAgX193aW5kb3dBaGVhZCA9IF9yZXF1aXJlMy5fX3dpbmRvd0FoZWFkO1xuXG52YXIgX3JlcXVpcmU0ID0gcmVxdWlyZSgnLi4vJHN0YXJ0cy13aXRoLWFueS1zZXEvc3RhcnRzLXdpdGgtYW55LXNlcS5qcycpLFxuICAgIF9fc3RhcnRzV2l0aEFueVNlcSA9IF9yZXF1aXJlNC5fX3N0YXJ0c1dpdGhBbnlTZXE7XG5cbmZ1bmN0aW9uIF9faW5jbHVkZXNBbnlTZXEoaXRlcmFibGUsIHNlcXMpIHtcbiAgdmFyIHNhbWUgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IE9iamVjdC5pcztcbiAgdmFyIHNlcXNBcnIgPSBzZXFzVG9BcnJheShzZXFzKTtcbiAgaWYgKCFzZXFzQXJyLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICBpZiAoc2Vxc0Fyci5maW5kKGZ1bmN0aW9uIChzZXEpIHtcbiAgICByZXR1cm4gIXNlcS5sZW5ndGg7XG4gIH0pKSByZXR1cm4gdHJ1ZTtcbiAgdmFyIG1heE1hdGNoTGVuZ3RoID0gc2Vxc0Fyci5yZWR1Y2UoZnVuY3Rpb24gKG1heCwgX3JlZikge1xuICAgIHZhciBsZW5ndGggPSBfcmVmLmxlbmd0aDtcbiAgICByZXR1cm4gTWF0aC5tYXgobWF4LCBsZW5ndGgpO1xuICB9LCAxKTtcblxuICB2YXIgX2l0ZXJhdG9yID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIoX193aW5kb3dBaGVhZChpdGVyYWJsZSwgbWF4TWF0Y2hMZW5ndGgpKSxcbiAgICAgIF9zdGVwO1xuXG4gIHRyeSB7XG4gICAgZm9yIChfaXRlcmF0b3IucygpOyAhKF9zdGVwID0gX2l0ZXJhdG9yLm4oKSkuZG9uZTspIHtcbiAgICAgIHZhciBidWZmZXIgPSBfc3RlcC52YWx1ZTtcblxuICAgICAgaWYgKF9fc3RhcnRzV2l0aEFueVNlcShidWZmZXIsIHNlcXNBcnIsIHNhbWUpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgX2l0ZXJhdG9yLmUoZXJyKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBfaXRlcmF0b3IuZigpO1xuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5leHBvcnRzLl9faW5jbHVkZXNBbnlTZXEgPSBfX2luY2x1ZGVzQW55U2VxO1xudmFyIGluY2x1ZGVzQW55U2VxID0gLyojX19QVVJFX18qL2l0ZXJhYmxlQ3VycnkoX19pbmNsdWRlc0FueVNlcSwge1xuICBtaW5BcmdzOiAxLFxuICBtYXhBcmdzOiAyLFxuICByZWR1Y2VzOiB0cnVlXG59KTtcbmV4cG9ydHMuaW5jbHVkZXNBbnlTZXEgPSBpbmNsdWRlc0FueVNlcTsiLCJ2YXIgX3JlZ2VuZXJhdG9yUnVudGltZSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9yZWdlbmVyYXRvclwiKTtcblxudmFyIF9hc3luY1RvR2VuZXJhdG9yID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvYXN5bmNUb0dlbmVyYXRvclwiKTtcblxudmFyIF9yZXF1aXJlID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWwvYXN5bmMtaXRlcmFibGUuanMnKSxcbiAgICBhc3luY0l0ZXJhYmxlQ3VycnkgPSBfcmVxdWlyZS5hc3luY0l0ZXJhYmxlQ3Vycnk7XG5cbnZhciBfcmVxdWlyZTIgPSByZXF1aXJlKCcuLi8kZmluZC1vci9hc3luYy1maW5kLW9yLmpzJyksXG4gICAgX19hc3luY0ZpbmRPciA9IF9yZXF1aXJlMi5fX2FzeW5jRmluZE9yO1xuXG52YXIgX3JlcXVpcmUzID0gcmVxdWlyZSgnLi4vJGluY2x1ZGVzL2luY2x1ZGVzLmpzJyksXG4gICAgX19pbmNsdWRlcyA9IF9yZXF1aXJlMy5fX2luY2x1ZGVzO1xuXG52YXIgbm9uZSA9IFN5bWJvbCgnbm9uZScpO1xuXG5mdW5jdGlvbiBfX2FzeW5jSW5jbHVkZXNBbnkoX3gsIF94Mikge1xuICByZXR1cm4gX2FzeW5jSW5jbHVkZXNBbnkuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cblxuZnVuY3Rpb24gX2FzeW5jSW5jbHVkZXNBbnkoKSB7XG4gIF9hc3luY0luY2x1ZGVzQW55ID0gX2FzeW5jVG9HZW5lcmF0b3IoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3JSdW50aW1lLm1hcmsoZnVuY3Rpb24gX2NhbGxlZShpdGVyYWJsZSwgdmFsdWVzKSB7XG4gICAgdmFyIHNhbWUsXG4gICAgICAgIF9hcmdzID0gYXJndW1lbnRzO1xuICAgIHJldHVybiBfcmVnZW5lcmF0b3JSdW50aW1lLndyYXAoZnVuY3Rpb24gX2NhbGxlZSQoX2NvbnRleHQpIHtcbiAgICAgIHdoaWxlICgxKSB7XG4gICAgICAgIHN3aXRjaCAoX2NvbnRleHQucHJldiA9IF9jb250ZXh0Lm5leHQpIHtcbiAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICBzYW1lID0gX2FyZ3MubGVuZ3RoID4gMiAmJiBfYXJnc1syXSAhPT0gdW5kZWZpbmVkID8gX2FyZ3NbMl0gOiBPYmplY3QuaXM7XG4gICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMztcbiAgICAgICAgICAgIHJldHVybiBfX2FzeW5jRmluZE9yKGl0ZXJhYmxlLCBub25lLCBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIF9faW5jbHVkZXModmFsdWVzLCB2YWx1ZSwgZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc2FtZShiLCBhKTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgIF9jb250ZXh0LnQwID0gX2NvbnRleHQuc2VudDtcbiAgICAgICAgICAgIF9jb250ZXh0LnQxID0gbm9uZTtcbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5hYnJ1cHQoXCJyZXR1cm5cIiwgX2NvbnRleHQudDAgIT09IF9jb250ZXh0LnQxKTtcblxuICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICBjYXNlIFwiZW5kXCI6XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuc3RvcCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwgX2NhbGxlZSk7XG4gIH0pKTtcbiAgcmV0dXJuIF9hc3luY0luY2x1ZGVzQW55LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5cbmV4cG9ydHMuX19hc3luY0luY2x1ZGVzQW55ID0gX19hc3luY0luY2x1ZGVzQW55O1xudmFyIGFzeW5jSW5jbHVkZXNBbnkgPSAvKiNfX1BVUkVfXyovYXN5bmNJdGVyYWJsZUN1cnJ5KF9fYXN5bmNJbmNsdWRlc0FueSwge1xuICBtaW5BcmdzOiAxLFxuICBtYXhBcmdzOiAyLFxuICByZWR1Y2VzOiB0cnVlLFxuICB2YWxpZGF0ZUFyZ3M6IGZ1bmN0aW9uIHZhbGlkYXRlQXJncyhhcmdzKSB7fVxufSk7XG5leHBvcnRzLmFzeW5jSW5jbHVkZXNBbnkgPSBhc3luY0luY2x1ZGVzQW55OyIsInZhciBfcmVxdWlyZSA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFsL2l0ZXJhYmxlLmpzJyksXG4gICAgaXRlcmFibGVDdXJyeSA9IF9yZXF1aXJlLml0ZXJhYmxlQ3Vycnk7XG5cbnZhciBfcmVxdWlyZTIgPSByZXF1aXJlKCcuLi8kZmluZC1vci9maW5kLW9yLmpzJyksXG4gICAgX19maW5kT3IgPSBfcmVxdWlyZTIuX19maW5kT3I7XG5cbnZhciBfcmVxdWlyZTMgPSByZXF1aXJlKCcuLi8kaW5jbHVkZXMvaW5jbHVkZXMuanMnKSxcbiAgICBfX2luY2x1ZGVzID0gX3JlcXVpcmUzLl9faW5jbHVkZXM7XG5cbnZhciBub25lID0gU3ltYm9sKCdub25lJyk7XG5cbmZ1bmN0aW9uIF9faW5jbHVkZXNBbnkoaXRlcmFibGUsIHZhbHVlcykge1xuICB2YXIgc2FtZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogT2JqZWN0LmlzO1xuICByZXR1cm4gX19maW5kT3IoaXRlcmFibGUsIG5vbmUsIGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgIHJldHVybiBfX2luY2x1ZGVzKHZhbHVlcywgdmFsdWUsIGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICByZXR1cm4gc2FtZShiLCBhKTtcbiAgICB9KTtcbiAgfSkgIT09IG5vbmU7XG59XG5cbmV4cG9ydHMuX19pbmNsdWRlc0FueSA9IF9faW5jbHVkZXNBbnk7XG52YXIgaW5jbHVkZXNBbnkgPSAvKiNfX1BVUkVfXyovaXRlcmFibGVDdXJyeShfX2luY2x1ZGVzQW55LCB7XG4gIG1pbkFyZ3M6IDEsXG4gIG1heEFyZ3M6IDIsXG4gIHJlZHVjZXM6IHRydWUsXG4gIHZhbGlkYXRlQXJnczogZnVuY3Rpb24gdmFsaWRhdGVBcmdzKGFyZ3MpIHtcbiAgICBpZiAodHJ1ZSAmJiB0eXBlb2YgYXJnc1swXSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGNvbnNvbGUud2FybihcIkZvciBzdHJpbmcgaW5wdXRzIHVzZSBpbmNsdWRlc0FueVNlcSBpbnN0ZWFkIG9mIGluY2x1ZGVzQW55XCIpO1xuICAgIH1cbiAgfVxufSk7XG5leHBvcnRzLmluY2x1ZGVzQW55ID0gaW5jbHVkZXNBbnk7IiwidmFyIF9yZXF1aXJlID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWwvYXN5bmMtaXRlcmFibGUuanMnKSxcbiAgICBhc3luY0l0ZXJhYmxlQ3VycnkgPSBfcmVxdWlyZS5hc3luY0l0ZXJhYmxlQ3VycnksXG4gICAgYXN5bmNFbnN1cmVJdGVyYWJsZSA9IF9yZXF1aXJlLmFzeW5jRW5zdXJlSXRlcmFibGU7XG5cbnZhciBfcmVxdWlyZTIgPSByZXF1aXJlKCcuLi8kaW5jbHVkZXMtYW55LXNlcS9hc3luYy1pbmNsdWRlcy1hbnktc2VxLmpzJyksXG4gICAgX19hc3luY0luY2x1ZGVzQW55U2VxID0gX3JlcXVpcmUyLl9fYXN5bmNJbmNsdWRlc0FueVNlcTtcblxuZnVuY3Rpb24gX19hc3luY0luY2x1ZGVzU2VxKGl0ZXJhYmxlLCBzZXEpIHtcbiAgdmFyIHNhbWUgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IE9iamVjdC5pcztcbiAgcmV0dXJuIF9fYXN5bmNJbmNsdWRlc0FueVNlcShpdGVyYWJsZSwgW3NlcV0sIHNhbWUpO1xufVxuXG5leHBvcnRzLl9fYXN5bmNJbmNsdWRlc1NlcSA9IF9fYXN5bmNJbmNsdWRlc1NlcTtcbnZhciBhc3luY0luY2x1ZGVzU2VxID0gLyojX19QVVJFX18qL2FzeW5jSXRlcmFibGVDdXJyeShfX2FzeW5jSW5jbHVkZXNTZXEsIHtcbiAgbWluQXJnczogMSxcbiAgbWF4QXJnczogMixcbiAgcmVkdWNlczogdHJ1ZSxcbiAgdmFsaWRhdGVBcmdzOiBmdW5jdGlvbiB2YWxpZGF0ZUFyZ3MoYXJncykge1xuICAgIGFyZ3NbMV0gPSBhc3luY0Vuc3VyZUl0ZXJhYmxlKGFyZ3NbMV0pO1xuICB9XG59KTtcbmV4cG9ydHMuYXN5bmNJbmNsdWRlc1NlcSA9IGFzeW5jSW5jbHVkZXNTZXE7IiwidmFyIF9yZXF1aXJlID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWwvaXRlcmFibGUuanMnKSxcbiAgICBpdGVyYWJsZUN1cnJ5ID0gX3JlcXVpcmUuaXRlcmFibGVDdXJyeSxcbiAgICBlbnN1cmVJdGVyYWJsZSA9IF9yZXF1aXJlLmVuc3VyZUl0ZXJhYmxlO1xuXG52YXIgX3JlcXVpcmUyID0gcmVxdWlyZSgnLi4vJGluY2x1ZGVzLWFueS1zZXEvaW5jbHVkZXMtYW55LXNlcS5qcycpLFxuICAgIF9faW5jbHVkZXNBbnlTZXEgPSBfcmVxdWlyZTIuX19pbmNsdWRlc0FueVNlcTtcblxuZnVuY3Rpb24gX19pbmNsdWRlc1NlcShpdGVyYWJsZSwgc2VxKSB7XG4gIHZhciBzYW1lID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiBPYmplY3QuaXM7XG4gIHJldHVybiBfX2luY2x1ZGVzQW55U2VxKGl0ZXJhYmxlLCBbc2VxXSwgc2FtZSk7XG59XG5cbmV4cG9ydHMuX19pbmNsdWRlc1NlcSA9IF9faW5jbHVkZXNTZXE7XG52YXIgaW5jbHVkZXNTZXEgPSAvKiNfX1BVUkVfXyovaXRlcmFibGVDdXJyeShfX2luY2x1ZGVzU2VxLCB7XG4gIG1pbkFyZ3M6IDEsXG4gIG1heEFyZ3M6IDIsXG4gIHJlZHVjZXM6IHRydWUsXG4gIHZhbGlkYXRlQXJnczogZnVuY3Rpb24gdmFsaWRhdGVBcmdzKGFyZ3MpIHtcbiAgICBhcmdzWzFdID0gZW5zdXJlSXRlcmFibGUoYXJnc1sxXSk7XG4gIH1cbn0pO1xuZXhwb3J0cy5pbmNsdWRlc1NlcSA9IGluY2x1ZGVzU2VxOyIsInZhciBfcmVnZW5lcmF0b3JSdW50aW1lID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL3JlZ2VuZXJhdG9yXCIpO1xuXG52YXIgX2FzeW5jVG9HZW5lcmF0b3IgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9hc3luY1RvR2VuZXJhdG9yXCIpO1xuXG52YXIgX3JlcXVpcmUgPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbC9hc3luYy1pdGVyYWJsZS5qcycpLFxuICAgIGFzeW5jSXRlcmFibGVDdXJyeSA9IF9yZXF1aXJlLmFzeW5jSXRlcmFibGVDdXJyeTtcblxudmFyIF9yZXF1aXJlMiA9IHJlcXVpcmUoJy4uLyRmaW5kLW9yL2FzeW5jLWZpbmQtb3IuanMnKSxcbiAgICBfX2FzeW5jRmluZE9yID0gX3JlcXVpcmUyLl9fYXN5bmNGaW5kT3I7XG5cbnZhciBub25lID0gU3ltYm9sKCdub25lJyk7XG5cbmZ1bmN0aW9uIF9fYXN5bmNJbmNsdWRlcyhfeCwgX3gyKSB7XG4gIHJldHVybiBfYXN5bmNJbmNsdWRlcy5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuXG5mdW5jdGlvbiBfYXN5bmNJbmNsdWRlcygpIHtcbiAgX2FzeW5jSW5jbHVkZXMgPSBfYXN5bmNUb0dlbmVyYXRvciggLyojX19QVVJFX18qL19yZWdlbmVyYXRvclJ1bnRpbWUubWFyayhmdW5jdGlvbiBfY2FsbGVlKGl0ZXJhYmxlLCB2YWx1ZSkge1xuICAgIHZhciBzYW1lLFxuICAgICAgICBfYXJncyA9IGFyZ3VtZW50cztcbiAgICByZXR1cm4gX3JlZ2VuZXJhdG9yUnVudGltZS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUkKF9jb250ZXh0KSB7XG4gICAgICB3aGlsZSAoMSkge1xuICAgICAgICBzd2l0Y2ggKF9jb250ZXh0LnByZXYgPSBfY29udGV4dC5uZXh0KSB7XG4gICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgc2FtZSA9IF9hcmdzLmxlbmd0aCA+IDIgJiYgX2FyZ3NbMl0gIT09IHVuZGVmaW5lZCA/IF9hcmdzWzJdIDogT2JqZWN0LmlzO1xuICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDM7XG4gICAgICAgICAgICByZXR1cm4gX19hc3luY0ZpbmRPcihpdGVyYWJsZSwgbm9uZSwgZnVuY3Rpb24gKHYpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHNhbWUodmFsdWUsIHYpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICBfY29udGV4dC50MCA9IF9jb250ZXh0LnNlbnQ7XG4gICAgICAgICAgICBfY29udGV4dC50MSA9IG5vbmU7XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuYWJydXB0KFwicmV0dXJuXCIsIF9jb250ZXh0LnQwICE9PSBfY29udGV4dC50MSk7XG5cbiAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgY2FzZSBcImVuZFwiOlxuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LnN0b3AoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sIF9jYWxsZWUpO1xuICB9KSk7XG4gIHJldHVybiBfYXN5bmNJbmNsdWRlcy5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuXG5leHBvcnRzLl9fYXN5bmNJbmNsdWRlcyA9IF9fYXN5bmNJbmNsdWRlcztcbnZhciBhc3luY0luY2x1ZGVzID0gLyojX19QVVJFX18qL2FzeW5jSXRlcmFibGVDdXJyeShfX2FzeW5jSW5jbHVkZXMsIHtcbiAgbWluQXJnczogMSxcbiAgbWF4QXJnczogMixcbiAgcmVkdWNlczogdHJ1ZSxcbiAgdmFsaWRhdGVBcmdzOiBmdW5jdGlvbiB2YWxpZGF0ZUFyZ3MoYXJncykge31cbn0pO1xuZXhwb3J0cy5hc3luY0luY2x1ZGVzID0gYXN5bmNJbmNsdWRlczsiLCJ2YXIgX3JlcXVpcmUgPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbC9pdGVyYWJsZS5qcycpLFxuICAgIGl0ZXJhYmxlQ3VycnkgPSBfcmVxdWlyZS5pdGVyYWJsZUN1cnJ5O1xuXG52YXIgX3JlcXVpcmUyID0gcmVxdWlyZSgnLi4vJGZpbmQtb3IvZmluZC1vci5qcycpLFxuICAgIF9fZmluZE9yID0gX3JlcXVpcmUyLl9fZmluZE9yO1xuXG52YXIgbm9uZSA9IFN5bWJvbCgnbm9uZScpO1xuXG5mdW5jdGlvbiBfX2luY2x1ZGVzKGl0ZXJhYmxlLCB2YWx1ZSkge1xuICB2YXIgc2FtZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogT2JqZWN0LmlzO1xuICByZXR1cm4gX19maW5kT3IoaXRlcmFibGUsIG5vbmUsIGZ1bmN0aW9uICh2KSB7XG4gICAgcmV0dXJuIHNhbWUodmFsdWUsIHYpO1xuICB9KSAhPT0gbm9uZTtcbn1cblxuZXhwb3J0cy5fX2luY2x1ZGVzID0gX19pbmNsdWRlcztcbnZhciBpbmNsdWRlcyA9IC8qI19fUFVSRV9fKi9pdGVyYWJsZUN1cnJ5KF9faW5jbHVkZXMsIHtcbiAgbWluQXJnczogMSxcbiAgbWF4QXJnczogMixcbiAgcmVkdWNlczogdHJ1ZSxcbiAgdmFsaWRhdGVBcmdzOiBmdW5jdGlvbiB2YWxpZGF0ZUFyZ3MoYXJncykge1xuICAgIGlmICh0cnVlICYmIHR5cGVvZiBhcmdzWzBdID09PSAnc3RyaW5nJykge1xuICAgICAgY29uc29sZS53YXJuKFwiRm9yIHN0cmluZyBpbnB1dHMgdXNlIGluY2x1ZGVzU2VxIGluc3RlYWQgb2YgaW5jbHVkZXNcIik7XG4gICAgfVxuICB9XG59KTtcbmV4cG9ydHMuaW5jbHVkZXMgPSBpbmNsdWRlczsiLCJ2YXIgX3RvQ29uc3VtYWJsZUFycmF5ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvdG9Db25zdW1hYmxlQXJyYXlcIik7XG5cbnZhciBfcmVnZW5lcmF0b3JSdW50aW1lID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL3JlZ2VuZXJhdG9yXCIpO1xuXG52YXIgX2FzeW5jVG9HZW5lcmF0b3IgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9hc3luY1RvR2VuZXJhdG9yXCIpO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY2xhc3NDYWxsQ2hlY2tcIik7XG5cbnZhciBfY3JlYXRlQ2xhc3MgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jcmVhdGVDbGFzc1wiKTtcblxudmFyIF9nZXQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9nZXRcIik7XG5cbnZhciBfaW5oZXJpdHMgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbmhlcml0c1wiKTtcblxudmFyIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvcG9zc2libGVDb25zdHJ1Y3RvclJldHVyblwiKTtcblxudmFyIF9nZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2dldFByb3RvdHlwZU9mXCIpO1xuXG5mdW5jdGlvbiBfY3JlYXRlU3VwZXIoRGVyaXZlZCkgeyB2YXIgaGFzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCA9IF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKTsgcmV0dXJuIGZ1bmN0aW9uIF9jcmVhdGVTdXBlckludGVybmFsKCkgeyB2YXIgU3VwZXIgPSBfZ2V0UHJvdG90eXBlT2YoRGVyaXZlZCksIHJlc3VsdDsgaWYgKGhhc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QpIHsgdmFyIE5ld1RhcmdldCA9IF9nZXRQcm90b3R5cGVPZih0aGlzKS5jb25zdHJ1Y3RvcjsgcmVzdWx0ID0gUmVmbGVjdC5jb25zdHJ1Y3QoU3VwZXIsIGFyZ3VtZW50cywgTmV3VGFyZ2V0KTsgfSBlbHNlIHsgcmVzdWx0ID0gU3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgfSByZXR1cm4gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgcmVzdWx0KTsgfTsgfVxuXG5mdW5jdGlvbiBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCkgeyBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwidW5kZWZpbmVkXCIgfHwgIVJlZmxlY3QuY29uc3RydWN0KSByZXR1cm4gZmFsc2U7IGlmIChSZWZsZWN0LmNvbnN0cnVjdC5zaGFtKSByZXR1cm4gZmFsc2U7IGlmICh0eXBlb2YgUHJveHkgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIHRydWU7IHRyeSB7IERhdGUucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoUmVmbGVjdC5jb25zdHJ1Y3QoRGF0ZSwgW10sIGZ1bmN0aW9uICgpIHt9KSk7IHJldHVybiB0cnVlOyB9IGNhdGNoIChlKSB7IHJldHVybiBmYWxzZTsgfSB9XG5cbnZhciBfcmVxdWlyZSA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFsL2FzeW5jLWl0ZXJhYmxlLmpzJyksXG4gICAgYXN5bmNJdGVyYWJsZUN1cnJ5ID0gX3JlcXVpcmUuYXN5bmNJdGVyYWJsZUN1cnJ5LFxuICAgIGFzeW5jQ2FsbFJldHVybiA9IF9yZXF1aXJlLmFzeW5jQ2FsbFJldHVybjtcblxudmFyIF9yZXF1aXJlMiA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFsL2FzeW5jLWl0ZXJhYmxlLWl0ZXJhdG9yLmpzJyksXG4gICAgQXN5bmNJdGVyYWJsZUl0ZXJhdG9yID0gX3JlcXVpcmUyLkFzeW5jSXRlcmFibGVJdGVyYXRvcjtcblxudmFyIF9yZXF1aXJlMyA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFsL2FzeW5jLXBhcmFsbGVsLWVhY2guanMnKSxcbiAgICBhc3luY1BhcmFsbGVsRWFjaCA9IF9yZXF1aXJlMy5hc3luY1BhcmFsbGVsRWFjaDtcblxudmFyIF9yZXF1aXJlNCA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFsL2FzeW5jLXBlZWtlcmF0b3IuanMnKSxcbiAgICBBc3luY1BlZWtlcmF0b3IgPSBfcmVxdWlyZTQuQXN5bmNQZWVrZXJhdG9yO1xuXG52YXIgX3JlcXVpcmU1ID0gcmVxdWlyZSgnLi4vJG1hcC9hc3luYy1tYXAuanMnKSxcbiAgICBfX2FzeW5jTWFwID0gX3JlcXVpcmU1Ll9fYXN5bmNNYXA7XG5cbnZhciBfcmVxdWlyZTYgPSByZXF1aXJlKCcuLi8kdG8tYXJyYXkvYXN5bmMtdG8tYXJyYXkuanMnKSxcbiAgICBfX2FzeW5jVG9BcnJheSA9IF9yZXF1aXJlNi5fX2FzeW5jVG9BcnJheTtcblxudmFyIF8gPSBTeW1ib2xbXCJmb3JcIl0oJ18nKTtcblxudmFyIF9fYWR2YW5jZSA9IFN5bWJvbFtcImZvclwiXSgnX19hZHZhbmNlJyk7XG5cbnZhciBBc3luY1N1bW1hcml6ZWRQZWVrZXJhdG9yID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfQXN5bmNQZWVrZXJhdG9yKSB7XG4gIF9pbmhlcml0cyhBc3luY1N1bW1hcml6ZWRQZWVrZXJhdG9yLCBfQXN5bmNQZWVrZXJhdG9yKTtcblxuICB2YXIgX3N1cGVyID0gX2NyZWF0ZVN1cGVyKEFzeW5jU3VtbWFyaXplZFBlZWtlcmF0b3IpO1xuXG4gIGZ1bmN0aW9uIEFzeW5jU3VtbWFyaXplZFBlZWtlcmF0b3IoaXRlcmF0b3IsIGZpcnN0LCBpbnB1dFN1bW1hcnkpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgQXN5bmNTdW1tYXJpemVkUGVla2VyYXRvcik7XG5cbiAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIGl0ZXJhdG9yLCBmaXJzdCk7XG4gICAgX3RoaXNbX10uaW5wdXRTdW1tYXJ5ID0gaW5wdXRTdW1tYXJ5O1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhBc3luY1N1bW1hcml6ZWRQZWVrZXJhdG9yLCBbe1xuICAgIGtleTogXCJhZHZhbmNlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBfYWR2YW5jZSA9IF9hc3luY1RvR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yUnVudGltZS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUoKSB7XG4gICAgICAgIHJldHVybiBfcmVnZW5lcmF0b3JSdW50aW1lLndyYXAoZnVuY3Rpb24gX2NhbGxlZSQoX2NvbnRleHQpIHtcbiAgICAgICAgICB3aGlsZSAoMSkge1xuICAgICAgICAgICAgc3dpdGNoIChfY29udGV4dC5wcmV2ID0gX2NvbnRleHQubmV4dCkge1xuICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDI7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXNbX10uaW5wdXRTdW1tYXJ5LmFkdmFuY2VCdWZmZXIodGhpcyk7XG5cbiAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICBjYXNlIFwiZW5kXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LnN0b3AoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sIF9jYWxsZWUsIHRoaXMpO1xuICAgICAgfSkpO1xuXG4gICAgICBmdW5jdGlvbiBhZHZhbmNlKCkge1xuICAgICAgICByZXR1cm4gX2FkdmFuY2UuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGFkdmFuY2U7XG4gICAgfSgpXG4gIH0sIHtcbiAgICBrZXk6IF9fYWR2YW5jZSxcbiAgICB2YWx1ZTogZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIF92YWx1ZSA9IF9hc3luY1RvR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yUnVudGltZS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUyKCkge1xuICAgICAgICByZXR1cm4gX3JlZ2VuZXJhdG9yUnVudGltZS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUyJChfY29udGV4dDIpIHtcbiAgICAgICAgICB3aGlsZSAoMSkge1xuICAgICAgICAgICAgc3dpdGNoIChfY29udGV4dDIucHJldiA9IF9jb250ZXh0Mi5uZXh0KSB7XG4gICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICBfY29udGV4dDIubmV4dCA9IDI7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9nZXQoX2dldFByb3RvdHlwZU9mKEFzeW5jU3VtbWFyaXplZFBlZWtlcmF0b3IucHJvdG90eXBlKSwgXCJhZHZhbmNlXCIsIHRoaXMpLmNhbGwodGhpcyk7XG5cbiAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICBjYXNlIFwiZW5kXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0Mi5zdG9wKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9LCBfY2FsbGVlMiwgdGhpcyk7XG4gICAgICB9KSk7XG5cbiAgICAgIGZ1bmN0aW9uIHZhbHVlKCkge1xuICAgICAgICByZXR1cm4gX3ZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9KClcbiAgfV0pO1xuXG4gIHJldHVybiBBc3luY1N1bW1hcml6ZWRQZWVrZXJhdG9yO1xufShBc3luY1BlZWtlcmF0b3IpO1xuXG52YXIgQXN5bmNJbnB1dFN1bW1hcnlJbnRlcm5hbCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIEFzeW5jSW5wdXRTdW1tYXJ5SW50ZXJuYWwoKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEFzeW5jSW5wdXRTdW1tYXJ5SW50ZXJuYWwpO1xuXG4gICAgdGhpcy5idWZmZXJzID0gW107XG4gICAgdGhpcy5ub3REb25lQnVmZmVyID0gbnVsbDtcbiAgICB0aGlzLmluZGV4ID0gMDtcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhBc3luY0lucHV0U3VtbWFyeUludGVybmFsLCBbe1xuICAgIGtleTogXCJpbml0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGluaXQoYnVmZmVycykge1xuICAgICAgdGhpcy5idWZmZXJzID0gYnVmZmVycztcbiAgICAgIHRoaXMudXBkYXRlTm90RG9uZSgpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJ1cGRhdGVOb3REb25lXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHVwZGF0ZU5vdERvbmUoKSB7XG4gICAgICB0aGlzLm5vdERvbmVCdWZmZXIgPSB0aGlzLmJ1ZmZlcnMuZmluZChmdW5jdGlvbiAoYnVmZmVyKSB7XG4gICAgICAgIHJldHVybiAhYnVmZmVyLmRvbmU7XG4gICAgICB9KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiYWR2YW5jZUJ1ZmZlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgX2FkdmFuY2VCdWZmZXIgPSBfYXN5bmNUb0dlbmVyYXRvciggLyojX19QVVJFX18qL19yZWdlbmVyYXRvclJ1bnRpbWUubWFyayhmdW5jdGlvbiBfY2FsbGVlMyhidWZmZXIpIHtcbiAgICAgICAgdmFyIHdhc0RvbmU7XG4gICAgICAgIHJldHVybiBfcmVnZW5lcmF0b3JSdW50aW1lLndyYXAoZnVuY3Rpb24gX2NhbGxlZTMkKF9jb250ZXh0Mykge1xuICAgICAgICAgIHdoaWxlICgxKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKF9jb250ZXh0My5wcmV2ID0gX2NvbnRleHQzLm5leHQpIHtcbiAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgIHdhc0RvbmUgPSBidWZmZXIuZG9uZTtcbiAgICAgICAgICAgICAgICBfY29udGV4dDMubmV4dCA9IDM7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGJ1ZmZlcltfX2FkdmFuY2VdKCk7XG5cbiAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgIHRoaXMuaW5kZXgrKztcblxuICAgICAgICAgICAgICAgIGlmICghd2FzRG9uZSAmJiBidWZmZXIuZG9uZSkge1xuICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVOb3REb25lKCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgY2FzZSBcImVuZFwiOlxuICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDMuc3RvcCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSwgX2NhbGxlZTMsIHRoaXMpO1xuICAgICAgfSkpO1xuXG4gICAgICBmdW5jdGlvbiBhZHZhbmNlQnVmZmVyKF94KSB7XG4gICAgICAgIHJldHVybiBfYWR2YW5jZUJ1ZmZlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gYWR2YW5jZUJ1ZmZlcjtcbiAgICB9KClcbiAgfV0pO1xuXG4gIHJldHVybiBBc3luY0lucHV0U3VtbWFyeUludGVybmFsO1xufSgpO1xuXG52YXIgQXN5bmNJbnB1dFN1bW1hcnkgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBBc3luY0lucHV0U3VtbWFyeShpbnRlcm5hbCkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBBc3luY0lucHV0U3VtbWFyeSk7XG5cbiAgICB0aGlzW19dID0gaW50ZXJuYWw7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoQXN5bmNJbnB1dFN1bW1hcnksIFt7XG4gICAga2V5OiBcImFkdmFuY2VcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYWR2YW5jZSgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignYWR2YW5jZSgpIGlzIG5vdCBzdXBwb3J0ZWQgb24gYW4gaW50ZXJsZWF2ZSBzdW1tYXJ5Jyk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImN1cnJlbnRcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHZhbHVlOiB0aGlzLnZhbHVlLFxuICAgICAgICBkb25lOiB0aGlzLmRvbmVcbiAgICAgIH07XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInZhbHVlXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpc1tfXS5ub3REb25lQnVmZmVyO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJkb25lXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpc1tfXS5ub3REb25lQnVmZmVyID09PSB1bmRlZmluZWQ7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImluZGV4XCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpc1tfXS5pbmRleDtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gQXN5bmNJbnB1dFN1bW1hcnk7XG59KCk7XG5cbmV4cG9ydHMuQXN5bmNJbnB1dFN1bW1hcnkgPSBBc3luY0lucHV0U3VtbWFyeTtcblxudmFyIEFzeW5jSW50ZXJsZWF2ZXIgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9Bc3luY0l0ZXJhYmxlSXRlcmF0bykge1xuICBfaW5oZXJpdHMoQXN5bmNJbnRlcmxlYXZlciwgX0FzeW5jSXRlcmFibGVJdGVyYXRvKTtcblxuICB2YXIgX3N1cGVyMiA9IF9jcmVhdGVTdXBlcihBc3luY0ludGVybGVhdmVyKTtcblxuICBmdW5jdGlvbiBBc3luY0ludGVybGVhdmVyKHNvdXJjZXMsIHN0cmF0ZWd5LCBvcHRpb25zKSB7XG4gICAgdmFyIF90aGlzMjtcblxuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBBc3luY0ludGVybGVhdmVyKTtcblxuICAgIF90aGlzMiA9IF9zdXBlcjIuY2FsbCh0aGlzKTtcbiAgICBfdGhpczIuc291cmNlcyA9IHNvdXJjZXM7XG4gICAgX3RoaXMyLnN0cmF0ZWd5ID0gc3RyYXRlZ3k7XG4gICAgX3RoaXMyLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgIF90aGlzMi5pbml0aWFsaXplZCA9IGZhbHNlO1xuICAgIF90aGlzMi5pbnB1dFN1bW1hcnkgPSBuZXcgQXN5bmNJbnB1dFN1bW1hcnlJbnRlcm5hbChzb3VyY2VzKTtcbiAgICByZXR1cm4gX3RoaXMyO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKEFzeW5jSW50ZXJsZWF2ZXIsIFt7XG4gICAga2V5OiBcImluaXRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIF9pbml0ID0gX2FzeW5jVG9HZW5lcmF0b3IoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3JSdW50aW1lLm1hcmsoZnVuY3Rpb24gX2NhbGxlZTQoKSB7XG4gICAgICAgIHZhciBzdHJhdGVneSwgb3B0aW9ucywgaW5wdXRTdW1tYXJ5O1xuICAgICAgICByZXR1cm4gX3JlZ2VuZXJhdG9yUnVudGltZS53cmFwKGZ1bmN0aW9uIF9jYWxsZWU0JChfY29udGV4dDQpIHtcbiAgICAgICAgICB3aGlsZSAoMSkge1xuICAgICAgICAgICAgc3dpdGNoIChfY29udGV4dDQucHJldiA9IF9jb250ZXh0NC5uZXh0KSB7XG4gICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICB0aGlzLmluaXRpYWxpemVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBzdHJhdGVneSA9IHRoaXMuc3RyYXRlZ3ksIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnMsIGlucHV0U3VtbWFyeSA9IHRoaXMuaW5wdXRTdW1tYXJ5O1xuICAgICAgICAgICAgICAgIF9jb250ZXh0NC5uZXh0ID0gNDtcbiAgICAgICAgICAgICAgICByZXR1cm4gX19hc3luY1RvQXJyYXkoX19hc3luY01hcCh0aGlzLnNvdXJjZXMsIGZ1bmN0aW9uIChzb3VyY2UpIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBBc3luY1N1bW1hcml6ZWRQZWVrZXJhdG9yLmZyb20oc291cmNlLCBpbnB1dFN1bW1hcnkpO1xuICAgICAgICAgICAgICAgIH0pKTtcblxuICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgdGhpcy5idWZmZXJzID0gX2NvbnRleHQ0LnNlbnQ7XG4gICAgICAgICAgICAgICAgdGhpcy5pdGVyYXRvciA9IHN0cmF0ZWd5LmFwcGx5KHZvaWQgMCwgW29wdGlvbnMsIG5ldyBBc3luY0lucHV0U3VtbWFyeShpbnB1dFN1bW1hcnkpXS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5KHRoaXMuYnVmZmVycykpKTtcbiAgICAgICAgICAgICAgICBfY29udGV4dDQubmV4dCA9IDg7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlucHV0U3VtbWFyeS5pbml0KHRoaXMuYnVmZmVycyk7XG5cbiAgICAgICAgICAgICAgY2FzZSA4OlxuICAgICAgICAgICAgICBjYXNlIFwiZW5kXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0NC5zdG9wKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9LCBfY2FsbGVlNCwgdGhpcyk7XG4gICAgICB9KSk7XG5cbiAgICAgIGZ1bmN0aW9uIGluaXQoKSB7XG4gICAgICAgIHJldHVybiBfaW5pdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gaW5pdDtcbiAgICB9KClcbiAgfSwge1xuICAgIGtleTogXCJyZXR1cm5CdWZmZXJzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBfcmV0dXJuQnVmZmVycyA9IF9hc3luY1RvR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yUnVudGltZS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWU1KCkge1xuICAgICAgICByZXR1cm4gX3JlZ2VuZXJhdG9yUnVudGltZS53cmFwKGZ1bmN0aW9uIF9jYWxsZWU1JChfY29udGV4dDUpIHtcbiAgICAgICAgICB3aGlsZSAoMSkge1xuICAgICAgICAgICAgc3dpdGNoIChfY29udGV4dDUucHJldiA9IF9jb250ZXh0NS5uZXh0KSB7XG4gICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICBfY29udGV4dDUubmV4dCA9IDI7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFzeW5jUGFyYWxsZWxFYWNoKHRoaXMuYnVmZmVycywgZnVuY3Rpb24gKGJ1ZmZlcikge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIGJ1ZmZlcltcInJldHVyblwiXSgpO1xuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgY2FzZSBcImVuZFwiOlxuICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDUuc3RvcCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSwgX2NhbGxlZTUsIHRoaXMpO1xuICAgICAgfSkpO1xuXG4gICAgICBmdW5jdGlvbiByZXR1cm5CdWZmZXJzKCkge1xuICAgICAgICByZXR1cm4gX3JldHVybkJ1ZmZlcnMuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJldHVybkJ1ZmZlcnM7XG4gICAgfSgpXG4gIH0sIHtcbiAgICBrZXk6IFwibmV4dFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgX25leHQgPSBfYXN5bmNUb0dlbmVyYXRvciggLyojX19QVVJFX18qL19yZWdlbmVyYXRvclJ1bnRpbWUubWFyayhmdW5jdGlvbiBfY2FsbGVlNigpIHtcbiAgICAgICAgdmFyIHN0ZXA7XG4gICAgICAgIHJldHVybiBfcmVnZW5lcmF0b3JSdW50aW1lLndyYXAoZnVuY3Rpb24gX2NhbGxlZTYkKF9jb250ZXh0Nikge1xuICAgICAgICAgIHdoaWxlICgxKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKF9jb250ZXh0Ni5wcmV2ID0gX2NvbnRleHQ2Lm5leHQpIHtcbiAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmluaXRpYWxpemVkKSB7XG4gICAgICAgICAgICAgICAgICBfY29udGV4dDYubmV4dCA9IDM7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBfY29udGV4dDYubmV4dCA9IDM7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW5pdCgpO1xuXG4gICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICBfY29udGV4dDYubmV4dCA9IDU7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuaXRlcmF0b3IubmV4dCgpO1xuXG4gICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICBzdGVwID0gX2NvbnRleHQ2LnNlbnQ7XG5cbiAgICAgICAgICAgICAgICBpZiAoIXN0ZXAuZG9uZSkge1xuICAgICAgICAgICAgICAgICAgX2NvbnRleHQ2Lm5leHQgPSA5O1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgX2NvbnRleHQ2Lm5leHQgPSA5O1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnJldHVybkJ1ZmZlcnMoKTtcblxuICAgICAgICAgICAgICBjYXNlIDk6XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0Ni5hYnJ1cHQoXCJyZXR1cm5cIiwgc3RlcCk7XG5cbiAgICAgICAgICAgICAgY2FzZSAxMDpcbiAgICAgICAgICAgICAgY2FzZSBcImVuZFwiOlxuICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDYuc3RvcCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSwgX2NhbGxlZTYsIHRoaXMpO1xuICAgICAgfSkpO1xuXG4gICAgICBmdW5jdGlvbiBuZXh0KCkge1xuICAgICAgICByZXR1cm4gX25leHQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG5leHQ7XG4gICAgfSgpXG4gIH0sIHtcbiAgICBrZXk6IFwicmV0dXJuXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBfcmV0dXJuMiA9IF9hc3luY1RvR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yUnVudGltZS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWU3KCkge1xuICAgICAgICByZXR1cm4gX3JlZ2VuZXJhdG9yUnVudGltZS53cmFwKGZ1bmN0aW9uIF9jYWxsZWU3JChfY29udGV4dDcpIHtcbiAgICAgICAgICB3aGlsZSAoMSkge1xuICAgICAgICAgICAgc3dpdGNoIChfY29udGV4dDcucHJldiA9IF9jb250ZXh0Ny5uZXh0KSB7XG4gICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICBfY29udGV4dDcubmV4dCA9IDI7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFzeW5jQ2FsbFJldHVybih0aGlzLml0ZXJhdG9yKTtcblxuICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgX2NvbnRleHQ3Lm5leHQgPSA0O1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnJldHVybkJ1ZmZlcnMoKTtcblxuICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0Ny5hYnJ1cHQoXCJyZXR1cm5cIiwge1xuICAgICAgICAgICAgICAgICAgdmFsdWU6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgIGRvbmU6IHRydWVcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgIGNhc2UgXCJlbmRcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQ3LnN0b3AoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sIF9jYWxsZWU3LCB0aGlzKTtcbiAgICAgIH0pKTtcblxuICAgICAgZnVuY3Rpb24gX3JldHVybigpIHtcbiAgICAgICAgcmV0dXJuIF9yZXR1cm4yLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBfcmV0dXJuO1xuICAgIH0oKVxuICB9XSk7XG5cbiAgcmV0dXJuIEFzeW5jSW50ZXJsZWF2ZXI7XG59KEFzeW5jSXRlcmFibGVJdGVyYXRvcik7XG5cbmZ1bmN0aW9uIF9fYXN5bmNJbnRlcmxlYXZlKHNvdXJjZXMsIHN0cmF0ZWd5KSB7XG4gIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiB7fTtcbiAgcmV0dXJuIG5ldyBBc3luY0ludGVybGVhdmVyKHNvdXJjZXMsIHN0cmF0ZWd5LCBvcHRpb25zKTtcbn1cblxuZXhwb3J0cy5fX2FzeW5jSW50ZXJsZWF2ZSA9IF9fYXN5bmNJbnRlcmxlYXZlO1xudmFyIGFzeW5jSW50ZXJsZWF2ZSA9IC8qI19fUFVSRV9fKi9hc3luY0l0ZXJhYmxlQ3VycnkoX19hc3luY0ludGVybGVhdmUsIHtcbiAgdmFyaWFkaWM6IHRydWUsXG4gIGdyb3dSaWdodDogdHJ1ZSxcbiAgbWluQXJnczogMSxcbiAgbWF4QXJnczogMlxufSk7XG5leHBvcnRzLmFzeW5jSW50ZXJsZWF2ZSA9IGFzeW5jSW50ZXJsZWF2ZTsiLCJ2YXIgX3RvQ29uc3VtYWJsZUFycmF5ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvdG9Db25zdW1hYmxlQXJyYXlcIik7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2sgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVja1wiKTtcblxudmFyIF9jcmVhdGVDbGFzcyA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NyZWF0ZUNsYXNzXCIpO1xuXG52YXIgX2dldCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2dldFwiKTtcblxudmFyIF9pbmhlcml0cyA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2luaGVyaXRzXCIpO1xuXG52YXIgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4gPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuXCIpO1xuXG52YXIgX2dldFByb3RvdHlwZU9mID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZ2V0UHJvdG90eXBlT2ZcIik7XG5cbmZ1bmN0aW9uIF9jcmVhdGVTdXBlcihEZXJpdmVkKSB7IHZhciBoYXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0ID0gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpOyByZXR1cm4gZnVuY3Rpb24gX2NyZWF0ZVN1cGVySW50ZXJuYWwoKSB7IHZhciBTdXBlciA9IF9nZXRQcm90b3R5cGVPZihEZXJpdmVkKSwgcmVzdWx0OyBpZiAoaGFzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCkgeyB2YXIgTmV3VGFyZ2V0ID0gX2dldFByb3RvdHlwZU9mKHRoaXMpLmNvbnN0cnVjdG9yOyByZXN1bHQgPSBSZWZsZWN0LmNvbnN0cnVjdChTdXBlciwgYXJndW1lbnRzLCBOZXdUYXJnZXQpOyB9IGVsc2UgeyByZXN1bHQgPSBTdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9IHJldHVybiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCByZXN1bHQpOyB9OyB9XG5cbmZ1bmN0aW9uIF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKSB7IGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJ1bmRlZmluZWRcIiB8fCAhUmVmbGVjdC5jb25zdHJ1Y3QpIHJldHVybiBmYWxzZTsgaWYgKFJlZmxlY3QuY29uc3RydWN0LnNoYW0pIHJldHVybiBmYWxzZTsgaWYgKHR5cGVvZiBQcm94eSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gdHJ1ZTsgdHJ5IHsgRGF0ZS5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChEYXRlLCBbXSwgZnVuY3Rpb24gKCkge30pKTsgcmV0dXJuIHRydWU7IH0gY2F0Y2ggKGUpIHsgcmV0dXJuIGZhbHNlOyB9IH1cblxudmFyIF9yZXF1aXJlID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWwvaXRlcmFibGUuanMnKSxcbiAgICBpdGVyYWJsZUN1cnJ5ID0gX3JlcXVpcmUuaXRlcmFibGVDdXJyeSxcbiAgICBjYWxsUmV0dXJuID0gX3JlcXVpcmUuY2FsbFJldHVybjtcblxudmFyIF9yZXF1aXJlMiA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFsL2l0ZXJhYmxlLWl0ZXJhdG9yLmpzJyksXG4gICAgSXRlcmFibGVJdGVyYXRvciA9IF9yZXF1aXJlMi5JdGVyYWJsZUl0ZXJhdG9yO1xuXG52YXIgX3JlcXVpcmUzID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWwvcGFyYWxsZWwtZWFjaC5qcycpLFxuICAgIHBhcmFsbGVsRWFjaCA9IF9yZXF1aXJlMy5wYXJhbGxlbEVhY2g7XG5cbnZhciBfcmVxdWlyZTQgPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbC9wZWVrZXJhdG9yLmpzJyksXG4gICAgUGVla2VyYXRvciA9IF9yZXF1aXJlNC5QZWVrZXJhdG9yO1xuXG52YXIgX3JlcXVpcmU1ID0gcmVxdWlyZSgnLi4vJG1hcC9tYXAuanMnKSxcbiAgICBfX21hcCA9IF9yZXF1aXJlNS5fX21hcDtcblxudmFyIF9yZXF1aXJlNiA9IHJlcXVpcmUoJy4uLyR0by1hcnJheS90by1hcnJheS5qcycpLFxuICAgIF9fdG9BcnJheSA9IF9yZXF1aXJlNi5fX3RvQXJyYXk7XG5cbnZhciBfID0gU3ltYm9sW1wiZm9yXCJdKCdfJyk7XG5cbnZhciBfX2FkdmFuY2UgPSBTeW1ib2xbXCJmb3JcIl0oJ19fYWR2YW5jZScpO1xuXG52YXIgU3VtbWFyaXplZFBlZWtlcmF0b3IgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9QZWVrZXJhdG9yKSB7XG4gIF9pbmhlcml0cyhTdW1tYXJpemVkUGVla2VyYXRvciwgX1BlZWtlcmF0b3IpO1xuXG4gIHZhciBfc3VwZXIgPSBfY3JlYXRlU3VwZXIoU3VtbWFyaXplZFBlZWtlcmF0b3IpO1xuXG4gIGZ1bmN0aW9uIFN1bW1hcml6ZWRQZWVrZXJhdG9yKGl0ZXJhdG9yLCBmaXJzdCwgaW5wdXRTdW1tYXJ5KSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFN1bW1hcml6ZWRQZWVrZXJhdG9yKTtcblxuICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgaXRlcmF0b3IsIGZpcnN0KTtcbiAgICBfdGhpc1tfXS5pbnB1dFN1bW1hcnkgPSBpbnB1dFN1bW1hcnk7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKFN1bW1hcml6ZWRQZWVrZXJhdG9yLCBbe1xuICAgIGtleTogXCJhZHZhbmNlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGFkdmFuY2UoKSB7XG4gICAgICB0aGlzW19dLmlucHV0U3VtbWFyeS5hZHZhbmNlQnVmZmVyKHRoaXMpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogX19hZHZhbmNlLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB2YWx1ZSgpIHtcbiAgICAgIF9nZXQoX2dldFByb3RvdHlwZU9mKFN1bW1hcml6ZWRQZWVrZXJhdG9yLnByb3RvdHlwZSksIFwiYWR2YW5jZVwiLCB0aGlzKS5jYWxsKHRoaXMpO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBTdW1tYXJpemVkUGVla2VyYXRvcjtcbn0oUGVla2VyYXRvcik7XG5cbnZhciBJbnB1dFN1bW1hcnlJbnRlcm5hbCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIElucHV0U3VtbWFyeUludGVybmFsKCkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBJbnB1dFN1bW1hcnlJbnRlcm5hbCk7XG5cbiAgICB0aGlzLmJ1ZmZlcnMgPSBbXTtcbiAgICB0aGlzLm5vdERvbmVCdWZmZXIgPSBudWxsO1xuICAgIHRoaXMuaW5kZXggPSAwO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKElucHV0U3VtbWFyeUludGVybmFsLCBbe1xuICAgIGtleTogXCJpbml0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGluaXQoYnVmZmVycykge1xuICAgICAgdGhpcy5idWZmZXJzID0gYnVmZmVycztcbiAgICAgIHRoaXMudXBkYXRlTm90RG9uZSgpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJ1cGRhdGVOb3REb25lXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHVwZGF0ZU5vdERvbmUoKSB7XG4gICAgICB0aGlzLm5vdERvbmVCdWZmZXIgPSB0aGlzLmJ1ZmZlcnMuZmluZChmdW5jdGlvbiAoYnVmZmVyKSB7XG4gICAgICAgIHJldHVybiAhYnVmZmVyLmRvbmU7XG4gICAgICB9KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiYWR2YW5jZUJ1ZmZlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBhZHZhbmNlQnVmZmVyKGJ1ZmZlcikge1xuICAgICAgdmFyIHdhc0RvbmUgPSBidWZmZXIuZG9uZTtcblxuICAgICAgYnVmZmVyW19fYWR2YW5jZV0oKTtcblxuICAgICAgdGhpcy5pbmRleCsrO1xuXG4gICAgICBpZiAoIXdhc0RvbmUgJiYgYnVmZmVyLmRvbmUpIHtcbiAgICAgICAgdGhpcy51cGRhdGVOb3REb25lKCk7XG4gICAgICB9XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIElucHV0U3VtbWFyeUludGVybmFsO1xufSgpO1xuXG52YXIgSW5wdXRTdW1tYXJ5ID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gSW5wdXRTdW1tYXJ5KGludGVybmFsKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIElucHV0U3VtbWFyeSk7XG5cbiAgICB0aGlzW19dID0gaW50ZXJuYWw7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoSW5wdXRTdW1tYXJ5LCBbe1xuICAgIGtleTogXCJhZHZhbmNlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGFkdmFuY2UoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2FkdmFuY2UoKSBpcyBub3Qgc3VwcG9ydGVkIG9uIGFuIGludGVybGVhdmUgc3VtbWFyeScpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJjdXJyZW50XCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB2YWx1ZTogdGhpcy52YWx1ZSxcbiAgICAgICAgZG9uZTogdGhpcy5kb25lXG4gICAgICB9O1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJ2YWx1ZVwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXNbX10ubm90RG9uZUJ1ZmZlcjtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZG9uZVwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXNbX10ubm90RG9uZUJ1ZmZlciA9PT0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJpbmRleFwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXNbX10uaW5kZXg7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIElucHV0U3VtbWFyeTtcbn0oKTtcblxuZXhwb3J0cy5JbnB1dFN1bW1hcnkgPSBJbnB1dFN1bW1hcnk7XG5cbnZhciBJbnRlcmxlYXZlciA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX0l0ZXJhYmxlSXRlcmF0b3IpIHtcbiAgX2luaGVyaXRzKEludGVybGVhdmVyLCBfSXRlcmFibGVJdGVyYXRvcik7XG5cbiAgdmFyIF9zdXBlcjIgPSBfY3JlYXRlU3VwZXIoSW50ZXJsZWF2ZXIpO1xuXG4gIGZ1bmN0aW9uIEludGVybGVhdmVyKHNvdXJjZXMsIHN0cmF0ZWd5LCBvcHRpb25zKSB7XG4gICAgdmFyIF90aGlzMjtcblxuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBJbnRlcmxlYXZlcik7XG5cbiAgICBfdGhpczIgPSBfc3VwZXIyLmNhbGwodGhpcyk7XG4gICAgX3RoaXMyLnNvdXJjZXMgPSBzb3VyY2VzO1xuICAgIF90aGlzMi5zdHJhdGVneSA9IHN0cmF0ZWd5O1xuICAgIF90aGlzMi5vcHRpb25zID0gb3B0aW9ucztcbiAgICBfdGhpczIuaW5pdGlhbGl6ZWQgPSBmYWxzZTtcbiAgICBfdGhpczIuaW5wdXRTdW1tYXJ5ID0gbmV3IElucHV0U3VtbWFyeUludGVybmFsKHNvdXJjZXMpO1xuICAgIHJldHVybiBfdGhpczI7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoSW50ZXJsZWF2ZXIsIFt7XG4gICAga2V5OiBcImluaXRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gaW5pdCgpIHtcbiAgICAgIHRoaXMuaW5pdGlhbGl6ZWQgPSB0cnVlO1xuICAgICAgdmFyIHN0cmF0ZWd5ID0gdGhpcy5zdHJhdGVneSxcbiAgICAgICAgICBvcHRpb25zID0gdGhpcy5vcHRpb25zLFxuICAgICAgICAgIGlucHV0U3VtbWFyeSA9IHRoaXMuaW5wdXRTdW1tYXJ5O1xuICAgICAgdGhpcy5idWZmZXJzID0gX190b0FycmF5KF9fbWFwKHRoaXMuc291cmNlcywgZnVuY3Rpb24gKHNvdXJjZSkge1xuICAgICAgICByZXR1cm4gU3VtbWFyaXplZFBlZWtlcmF0b3IuZnJvbShzb3VyY2UsIGlucHV0U3VtbWFyeSk7XG4gICAgICB9KSk7XG4gICAgICB0aGlzLml0ZXJhdG9yID0gc3RyYXRlZ3kuYXBwbHkodm9pZCAwLCBbb3B0aW9ucywgbmV3IElucHV0U3VtbWFyeShpbnB1dFN1bW1hcnkpXS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5KHRoaXMuYnVmZmVycykpKTtcbiAgICAgIGlucHV0U3VtbWFyeS5pbml0KHRoaXMuYnVmZmVycyk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJldHVybkJ1ZmZlcnNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmV0dXJuQnVmZmVycygpIHtcbiAgICAgIHBhcmFsbGVsRWFjaCh0aGlzLmJ1ZmZlcnMsIGZ1bmN0aW9uIChidWZmZXIpIHtcbiAgICAgICAgcmV0dXJuIGJ1ZmZlcltcInJldHVyblwiXSgpO1xuICAgICAgfSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIm5leHRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gbmV4dCgpIHtcbiAgICAgIGlmICghdGhpcy5pbml0aWFsaXplZCkgdGhpcy5pbml0KCk7XG4gICAgICB2YXIgc3RlcCA9IHRoaXMuaXRlcmF0b3IubmV4dCgpO1xuICAgICAgaWYgKHN0ZXAuZG9uZSkgdGhpcy5yZXR1cm5CdWZmZXJzKCk7XG4gICAgICByZXR1cm4gc3RlcDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmV0dXJuXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9yZXR1cm4oKSB7XG4gICAgICBjYWxsUmV0dXJuKHRoaXMuaXRlcmF0b3IpO1xuICAgICAgdGhpcy5yZXR1cm5CdWZmZXJzKCk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB2YWx1ZTogdW5kZWZpbmVkLFxuICAgICAgICBkb25lOiB0cnVlXG4gICAgICB9O1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBJbnRlcmxlYXZlcjtcbn0oSXRlcmFibGVJdGVyYXRvcik7XG5cbmZ1bmN0aW9uIF9faW50ZXJsZWF2ZShzb3VyY2VzLCBzdHJhdGVneSkge1xuICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDoge307XG4gIHJldHVybiBuZXcgSW50ZXJsZWF2ZXIoc291cmNlcywgc3RyYXRlZ3ksIG9wdGlvbnMpO1xufVxuXG5leHBvcnRzLl9faW50ZXJsZWF2ZSA9IF9faW50ZXJsZWF2ZTtcbnZhciBpbnRlcmxlYXZlID0gLyojX19QVVJFX18qL2l0ZXJhYmxlQ3VycnkoX19pbnRlcmxlYXZlLCB7XG4gIHZhcmlhZGljOiB0cnVlLFxuICBncm93UmlnaHQ6IHRydWUsXG4gIG1pbkFyZ3M6IDEsXG4gIG1heEFyZ3M6IDJcbn0pO1xuZXhwb3J0cy5pbnRlcmxlYXZlID0gaW50ZXJsZWF2ZTsiLCJ2YXIgX3JlZ2VuZXJhdG9yUnVudGltZSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9yZWdlbmVyYXRvclwiKTtcblxudmFyIF93cmFwQXN5bmNHZW5lcmF0b3IgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy93cmFwQXN5bmNHZW5lcmF0b3JcIik7XG5cbnZhciBfYXdhaXRBc3luY0dlbmVyYXRvciA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2F3YWl0QXN5bmNHZW5lcmF0b3JcIik7XG5cbnZhciBfYXN5bmNHZW5lcmF0b3JEZWxlZ2F0ZSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2FzeW5jR2VuZXJhdG9yRGVsZWdhdGVcIik7XG5cbnZhciBfYXN5bmNJdGVyYXRvciA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2FzeW5jSXRlcmF0b3JcIik7XG5cbnZhciBfcmVxdWlyZSA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFsL2FzeW5jLWl0ZXJhYmxlLmpzJyksXG4gICAgYXN5bmNJdGVyYWJsZUN1cnJ5ID0gX3JlcXVpcmUuYXN5bmNJdGVyYWJsZUN1cnJ5LFxuICAgIGFzeW5jQ2FjaGUgPSBfcmVxdWlyZS5hc3luY0NhY2hlO1xuXG5mdW5jdGlvbiBfX2FzeW5jSW50ZXJwb3NlU2VxKF94LCBfeDIpIHtcbiAgcmV0dXJuIF9hc3luY0ludGVycG9zZVNlcS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuXG5leHBvcnRzLl9fYXN5bmNJbnRlcnBvc2VTZXEgPSBfX2FzeW5jSW50ZXJwb3NlU2VxO1xuXG5mdW5jdGlvbiBfYXN5bmNJbnRlcnBvc2VTZXEoKSB7XG4gIF9hc3luY0ludGVycG9zZVNlcSA9IF93cmFwQXN5bmNHZW5lcmF0b3IoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3JSdW50aW1lLm1hcmsoZnVuY3Rpb24gX2NhbGxlZShzb3VyY2UsIHNlcSkge1xuICAgIHZhciBzdWJzZXFfLCBmaXJzdCwgX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbiwgX2RpZEl0ZXJhdG9yRXJyb3IsIF9pdGVyYXRvckVycm9yLCBfaXRlcmF0b3IsIF9zdGVwLCBfdmFsdWUsIHNvdXJjZVZhbHVlO1xuXG4gICAgcmV0dXJuIF9yZWdlbmVyYXRvclJ1bnRpbWUud3JhcChmdW5jdGlvbiBfY2FsbGVlJChfY29udGV4dCkge1xuICAgICAgd2hpbGUgKDEpIHtcbiAgICAgICAgc3dpdGNoIChfY29udGV4dC5wcmV2ID0gX2NvbnRleHQubmV4dCkge1xuICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAyO1xuICAgICAgICAgICAgcmV0dXJuIF9hd2FpdEFzeW5jR2VuZXJhdG9yKGFzeW5jQ2FjaGUoc2VxKSk7XG5cbiAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICBzdWJzZXFfID0gX2NvbnRleHQuc2VudDtcbiAgICAgICAgICAgIGZpcnN0ID0gdHJ1ZTtcbiAgICAgICAgICAgIF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24gPSB0cnVlO1xuICAgICAgICAgICAgX2RpZEl0ZXJhdG9yRXJyb3IgPSBmYWxzZTtcbiAgICAgICAgICAgIF9jb250ZXh0LnByZXYgPSA2O1xuICAgICAgICAgICAgX2l0ZXJhdG9yID0gX2FzeW5jSXRlcmF0b3Ioc291cmNlKTtcblxuICAgICAgICAgIGNhc2UgODpcbiAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAxMDtcbiAgICAgICAgICAgIHJldHVybiBfYXdhaXRBc3luY0dlbmVyYXRvcihfaXRlcmF0b3IubmV4dCgpKTtcblxuICAgICAgICAgIGNhc2UgMTA6XG4gICAgICAgICAgICBfc3RlcCA9IF9jb250ZXh0LnNlbnQ7XG4gICAgICAgICAgICBfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uID0gX3N0ZXAuZG9uZTtcbiAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAxNDtcbiAgICAgICAgICAgIHJldHVybiBfYXdhaXRBc3luY0dlbmVyYXRvcihfc3RlcC52YWx1ZSk7XG5cbiAgICAgICAgICBjYXNlIDE0OlxuICAgICAgICAgICAgX3ZhbHVlID0gX2NvbnRleHQuc2VudDtcblxuICAgICAgICAgICAgaWYgKF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24pIHtcbiAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDI1O1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgc291cmNlVmFsdWUgPSBfdmFsdWU7XG5cbiAgICAgICAgICAgIGlmIChmaXJzdCkge1xuICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMTk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuZGVsZWdhdGVZaWVsZChfYXN5bmNHZW5lcmF0b3JEZWxlZ2F0ZShfYXN5bmNJdGVyYXRvcihzdWJzZXFfKSwgX2F3YWl0QXN5bmNHZW5lcmF0b3IpLCBcInQwXCIsIDE5KTtcblxuICAgICAgICAgIGNhc2UgMTk6XG4gICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMjE7XG4gICAgICAgICAgICByZXR1cm4gc291cmNlVmFsdWU7XG5cbiAgICAgICAgICBjYXNlIDIxOlxuICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTtcblxuICAgICAgICAgIGNhc2UgMjI6XG4gICAgICAgICAgICBfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uID0gdHJ1ZTtcbiAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSA4O1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlIDI1OlxuICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDMxO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlIDI3OlxuICAgICAgICAgICAgX2NvbnRleHQucHJldiA9IDI3O1xuICAgICAgICAgICAgX2NvbnRleHQudDEgPSBfY29udGV4dFtcImNhdGNoXCJdKDYpO1xuICAgICAgICAgICAgX2RpZEl0ZXJhdG9yRXJyb3IgPSB0cnVlO1xuICAgICAgICAgICAgX2l0ZXJhdG9yRXJyb3IgPSBfY29udGV4dC50MTtcblxuICAgICAgICAgIGNhc2UgMzE6XG4gICAgICAgICAgICBfY29udGV4dC5wcmV2ID0gMzE7XG4gICAgICAgICAgICBfY29udGV4dC5wcmV2ID0gMzI7XG5cbiAgICAgICAgICAgIGlmICghKCFfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uICYmIF9pdGVyYXRvcltcInJldHVyblwiXSAhPSBudWxsKSkge1xuICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMzY7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMzY7XG4gICAgICAgICAgICByZXR1cm4gX2F3YWl0QXN5bmNHZW5lcmF0b3IoX2l0ZXJhdG9yW1wicmV0dXJuXCJdKCkpO1xuXG4gICAgICAgICAgY2FzZSAzNjpcbiAgICAgICAgICAgIF9jb250ZXh0LnByZXYgPSAzNjtcblxuICAgICAgICAgICAgaWYgKCFfZGlkSXRlcmF0b3JFcnJvcikge1xuICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMzk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aHJvdyBfaXRlcmF0b3JFcnJvcjtcblxuICAgICAgICAgIGNhc2UgMzk6XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuZmluaXNoKDM2KTtcblxuICAgICAgICAgIGNhc2UgNDA6XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuZmluaXNoKDMxKTtcblxuICAgICAgICAgIGNhc2UgNDE6XG4gICAgICAgICAgY2FzZSBcImVuZFwiOlxuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LnN0b3AoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sIF9jYWxsZWUsIG51bGwsIFtbNiwgMjcsIDMxLCA0MV0sIFszMiwsIDM2LCA0MF1dKTtcbiAgfSkpO1xuICByZXR1cm4gX2FzeW5jSW50ZXJwb3NlU2VxLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5cbnZhciBhc3luY0ludGVycG9zZVNlcSA9IC8qI19fUFVSRV9fKi9hc3luY0l0ZXJhYmxlQ3VycnkoX19hc3luY0ludGVycG9zZVNlcSk7XG5leHBvcnRzLmFzeW5jSW50ZXJwb3NlU2VxID0gYXN5bmNJbnRlcnBvc2VTZXE7IiwidmFyIF9yZWdlbmVyYXRvclJ1bnRpbWUgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvcmVnZW5lcmF0b3JcIik7XG5cbnZhciBfbWFya2VkID0gLyojX19QVVJFX18qL19yZWdlbmVyYXRvclJ1bnRpbWUubWFyayhfX2ludGVycG9zZVNlcSk7XG5cbmZ1bmN0aW9uIF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKG8sIGFsbG93QXJyYXlMaWtlKSB7IHZhciBpdDsgaWYgKHR5cGVvZiBTeW1ib2wgPT09IFwidW5kZWZpbmVkXCIgfHwgb1tTeW1ib2wuaXRlcmF0b3JdID09IG51bGwpIHsgaWYgKEFycmF5LmlzQXJyYXkobykgfHwgKGl0ID0gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8pKSB8fCBhbGxvd0FycmF5TGlrZSAmJiBvICYmIHR5cGVvZiBvLmxlbmd0aCA9PT0gXCJudW1iZXJcIikgeyBpZiAoaXQpIG8gPSBpdDsgdmFyIGkgPSAwOyB2YXIgRiA9IGZ1bmN0aW9uIEYoKSB7fTsgcmV0dXJuIHsgczogRiwgbjogZnVuY3Rpb24gbigpIHsgaWYgKGkgPj0gby5sZW5ndGgpIHJldHVybiB7IGRvbmU6IHRydWUgfTsgcmV0dXJuIHsgZG9uZTogZmFsc2UsIHZhbHVlOiBvW2krK10gfTsgfSwgZTogZnVuY3Rpb24gZShfZSkgeyB0aHJvdyBfZTsgfSwgZjogRiB9OyB9IHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gaXRlcmF0ZSBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTsgfSB2YXIgbm9ybWFsQ29tcGxldGlvbiA9IHRydWUsIGRpZEVyciA9IGZhbHNlLCBlcnI7IHJldHVybiB7IHM6IGZ1bmN0aW9uIHMoKSB7IGl0ID0gb1tTeW1ib2wuaXRlcmF0b3JdKCk7IH0sIG46IGZ1bmN0aW9uIG4oKSB7IHZhciBzdGVwID0gaXQubmV4dCgpOyBub3JtYWxDb21wbGV0aW9uID0gc3RlcC5kb25lOyByZXR1cm4gc3RlcDsgfSwgZTogZnVuY3Rpb24gZShfZTIpIHsgZGlkRXJyID0gdHJ1ZTsgZXJyID0gX2UyOyB9LCBmOiBmdW5jdGlvbiBmKCkgeyB0cnkgeyBpZiAoIW5vcm1hbENvbXBsZXRpb24gJiYgaXRbXCJyZXR1cm5cIl0gIT0gbnVsbCkgaXRbXCJyZXR1cm5cIl0oKTsgfSBmaW5hbGx5IHsgaWYgKGRpZEVycikgdGhyb3cgZXJyOyB9IH0gfTsgfVxuXG5mdW5jdGlvbiBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkobywgbWluTGVuKSB7IGlmICghbykgcmV0dXJuOyBpZiAodHlwZW9mIG8gPT09IFwic3RyaW5nXCIpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pOyB2YXIgbiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKS5zbGljZSg4LCAtMSk7IGlmIChuID09PSBcIk9iamVjdFwiICYmIG8uY29uc3RydWN0b3IpIG4gPSBvLmNvbnN0cnVjdG9yLm5hbWU7IGlmIChuID09PSBcIk1hcFwiIHx8IG4gPT09IFwiU2V0XCIpIHJldHVybiBBcnJheS5mcm9tKG8pOyBpZiAobiA9PT0gXCJBcmd1bWVudHNcIiB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSkgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IH1cblxuZnVuY3Rpb24gX2FycmF5TGlrZVRvQXJyYXkoYXJyLCBsZW4pIHsgaWYgKGxlbiA9PSBudWxsIHx8IGxlbiA+IGFyci5sZW5ndGgpIGxlbiA9IGFyci5sZW5ndGg7IGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGxlbik7IGkgPCBsZW47IGkrKykgeyBhcnIyW2ldID0gYXJyW2ldOyB9IHJldHVybiBhcnIyOyB9XG5cbnZhciBfcmVxdWlyZSA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFsL2l0ZXJhYmxlLmpzJyksXG4gICAgaXRlcmFibGVDdXJyeSA9IF9yZXF1aXJlLml0ZXJhYmxlQ3VycnksXG4gICAgY2FjaGUgPSBfcmVxdWlyZS5jYWNoZTtcblxuZnVuY3Rpb24gX19pbnRlcnBvc2VTZXEoc291cmNlLCBzZXEpIHtcbiAgdmFyIHN1YnNlcV8sIGZpcnN0LCBfaXRlcmF0b3IsIF9zdGVwLCBzb3VyY2VWYWx1ZTtcblxuICByZXR1cm4gX3JlZ2VuZXJhdG9yUnVudGltZS53cmFwKGZ1bmN0aW9uIF9faW50ZXJwb3NlU2VxJChfY29udGV4dCkge1xuICAgIHdoaWxlICgxKSB7XG4gICAgICBzd2l0Y2ggKF9jb250ZXh0LnByZXYgPSBfY29udGV4dC5uZXh0KSB7XG4gICAgICAgIGNhc2UgMDpcbiAgICAgICAgICBzdWJzZXFfID0gY2FjaGUoc2VxKTtcbiAgICAgICAgICBmaXJzdCA9IHRydWU7XG4gICAgICAgICAgX2l0ZXJhdG9yID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIoc291cmNlKTtcbiAgICAgICAgICBfY29udGV4dC5wcmV2ID0gMztcblxuICAgICAgICAgIF9pdGVyYXRvci5zKCk7XG5cbiAgICAgICAgY2FzZSA1OlxuICAgICAgICAgIGlmICgoX3N0ZXAgPSBfaXRlcmF0b3IubigpKS5kb25lKSB7XG4gICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMTQ7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBzb3VyY2VWYWx1ZSA9IF9zdGVwLnZhbHVlO1xuXG4gICAgICAgICAgaWYgKGZpcnN0KSB7XG4gICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gOTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBfY29udGV4dC5kZWxlZ2F0ZVlpZWxkKHN1YnNlcV8sIFwidDBcIiwgOSk7XG5cbiAgICAgICAgY2FzZSA5OlxuICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAxMTtcbiAgICAgICAgICByZXR1cm4gc291cmNlVmFsdWU7XG5cbiAgICAgICAgY2FzZSAxMTpcbiAgICAgICAgICBmaXJzdCA9IGZhbHNlO1xuXG4gICAgICAgIGNhc2UgMTI6XG4gICAgICAgICAgX2NvbnRleHQubmV4dCA9IDU7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAxNDpcbiAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMTk7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAxNjpcbiAgICAgICAgICBfY29udGV4dC5wcmV2ID0gMTY7XG4gICAgICAgICAgX2NvbnRleHQudDEgPSBfY29udGV4dFtcImNhdGNoXCJdKDMpO1xuXG4gICAgICAgICAgX2l0ZXJhdG9yLmUoX2NvbnRleHQudDEpO1xuXG4gICAgICAgIGNhc2UgMTk6XG4gICAgICAgICAgX2NvbnRleHQucHJldiA9IDE5O1xuXG4gICAgICAgICAgX2l0ZXJhdG9yLmYoKTtcblxuICAgICAgICAgIHJldHVybiBfY29udGV4dC5maW5pc2goMTkpO1xuXG4gICAgICAgIGNhc2UgMjI6XG4gICAgICAgIGNhc2UgXCJlbmRcIjpcbiAgICAgICAgICByZXR1cm4gX2NvbnRleHQuc3RvcCgpO1xuICAgICAgfVxuICAgIH1cbiAgfSwgX21hcmtlZCwgbnVsbCwgW1szLCAxNiwgMTksIDIyXV0pO1xufVxuXG5leHBvcnRzLl9faW50ZXJwb3NlU2VxID0gX19pbnRlcnBvc2VTZXE7XG52YXIgaW50ZXJwb3NlU2VxID0gLyojX19QVVJFX18qL2l0ZXJhYmxlQ3VycnkoX19pbnRlcnBvc2VTZXEpO1xuZXhwb3J0cy5pbnRlcnBvc2VTZXEgPSBpbnRlcnBvc2VTZXE7IiwidmFyIF9yZXF1aXJlID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWwvYXN5bmMtaXRlcmFibGUuanMnKSxcbiAgICBhc3luY0l0ZXJhYmxlQ3VycnkgPSBfcmVxdWlyZS5hc3luY0l0ZXJhYmxlQ3Vycnk7XG5cbnZhciBfcmVxdWlyZTIgPSByZXF1aXJlKCcuLi8kaW50ZXJwb3NlLXNlcS9hc3luYy1pbnRlcnBvc2Utc2VxLmpzJyksXG4gICAgX19hc3luY0ludGVycG9zZVNlcSA9IF9yZXF1aXJlMi5fX2FzeW5jSW50ZXJwb3NlU2VxO1xuXG5mdW5jdGlvbiBfX2FzeW5jSW50ZXJwb3NlKHNvdXJjZSwgdmFsdWUpIHtcbiAgcmV0dXJuIF9fYXN5bmNJbnRlcnBvc2VTZXEoc291cmNlLCBbdmFsdWVdKTtcbn1cblxuZXhwb3J0cy5fX2FzeW5jSW50ZXJwb3NlID0gX19hc3luY0ludGVycG9zZTtcbnZhciBhc3luY0ludGVycG9zZSA9IC8qI19fUFVSRV9fKi9hc3luY0l0ZXJhYmxlQ3VycnkoX19hc3luY0ludGVycG9zZSwge1xuICB2YWxpZGF0ZUFyZ3M6IGZ1bmN0aW9uIHZhbGlkYXRlQXJncyhhcmdzKSB7fVxufSk7XG5leHBvcnRzLmFzeW5jSW50ZXJwb3NlID0gYXN5bmNJbnRlcnBvc2U7IiwidmFyIF9yZXF1aXJlID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWwvaXRlcmFibGUuanMnKSxcbiAgICBpdGVyYWJsZUN1cnJ5ID0gX3JlcXVpcmUuaXRlcmFibGVDdXJyeTtcblxudmFyIF9yZXF1aXJlMiA9IHJlcXVpcmUoJy4uLyRpbnRlcnBvc2Utc2VxL2ludGVycG9zZS1zZXEuanMnKSxcbiAgICBfX2ludGVycG9zZVNlcSA9IF9yZXF1aXJlMi5fX2ludGVycG9zZVNlcTtcblxuZnVuY3Rpb24gX19pbnRlcnBvc2Uoc291cmNlLCB2YWx1ZSkge1xuICByZXR1cm4gX19pbnRlcnBvc2VTZXEoc291cmNlLCBbdmFsdWVdKTtcbn1cblxuZXhwb3J0cy5fX2ludGVycG9zZSA9IF9faW50ZXJwb3NlO1xudmFyIGludGVycG9zZSA9IC8qI19fUFVSRV9fKi9pdGVyYWJsZUN1cnJ5KF9faW50ZXJwb3NlLCB7XG4gIHZhbGlkYXRlQXJnczogZnVuY3Rpb24gdmFsaWRhdGVBcmdzKGFyZ3MpIHtcbiAgICBpZiAodHJ1ZSAmJiB0eXBlb2YgYXJnc1swXSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGNvbnNvbGUud2FybihcIkZvciBzdHJpbmcgaW5wdXRzIHVzZSBpbnRlcnBvc2VTZXEgaW5zdGVhZCBvZiBpbnRlcnBvc2VcIik7XG4gICAgfVxuICB9XG59KTtcbmV4cG9ydHMuaW50ZXJwb3NlID0gaW50ZXJwb3NlOyIsInZhciBfcmVnZW5lcmF0b3JSdW50aW1lID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL3JlZ2VuZXJhdG9yXCIpO1xuXG52YXIgX2FzeW5jVG9HZW5lcmF0b3IgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9hc3luY1RvR2VuZXJhdG9yXCIpO1xuXG52YXIgX3JlcXVpcmUgPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbC9hc3luYy1pdGVyYWJsZS5qcycpLFxuICAgIGFzeW5jSXRlcmFibGVDdXJyeSA9IF9yZXF1aXJlLmFzeW5jSXRlcmFibGVDdXJyeTtcblxudmFyIF9yZXF1aXJlMiA9IHJlcXVpcmUoJy4uLyRmaXJzdC1vci9hc3luYy1maXJzdC1vci5qcycpLFxuICAgIF9fYXN5bmNGaXJzdE9yID0gX3JlcXVpcmUyLl9fYXN5bmNGaXJzdE9yO1xuXG52YXIgbm9uZSA9IFN5bWJvbCgnbm9uZScpO1xuXG5mdW5jdGlvbiBfX2FzeW5jSXNFbXB0eShfeCkge1xuICByZXR1cm4gX2FzeW5jSXNFbXB0eS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuXG5mdW5jdGlvbiBfYXN5bmNJc0VtcHR5KCkge1xuICBfYXN5bmNJc0VtcHR5ID0gX2FzeW5jVG9HZW5lcmF0b3IoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3JSdW50aW1lLm1hcmsoZnVuY3Rpb24gX2NhbGxlZShpdGVyYWJsZSkge1xuICAgIHJldHVybiBfcmVnZW5lcmF0b3JSdW50aW1lLndyYXAoZnVuY3Rpb24gX2NhbGxlZSQoX2NvbnRleHQpIHtcbiAgICAgIHdoaWxlICgxKSB7XG4gICAgICAgIHN3aXRjaCAoX2NvbnRleHQucHJldiA9IF9jb250ZXh0Lm5leHQpIHtcbiAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMjtcbiAgICAgICAgICAgIHJldHVybiBfX2FzeW5jRmlyc3RPcihpdGVyYWJsZSwgbm9uZSk7XG5cbiAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICBfY29udGV4dC50MCA9IF9jb250ZXh0LnNlbnQ7XG4gICAgICAgICAgICBfY29udGV4dC50MSA9IG5vbmU7XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuYWJydXB0KFwicmV0dXJuXCIsIF9jb250ZXh0LnQwID09PSBfY29udGV4dC50MSk7XG5cbiAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgY2FzZSBcImVuZFwiOlxuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LnN0b3AoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sIF9jYWxsZWUpO1xuICB9KSk7XG4gIHJldHVybiBfYXN5bmNJc0VtcHR5LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5cbmV4cG9ydHMuX19hc3luY0lzRW1wdHkgPSBfX2FzeW5jSXNFbXB0eTtcbnZhciBhc3luY0lzRW1wdHkgPSAvKiNfX1BVUkVfXyovYXN5bmNJdGVyYWJsZUN1cnJ5KF9fYXN5bmNJc0VtcHR5LCB7XG4gIHJlZHVjZXM6IHRydWVcbn0pO1xuZXhwb3J0cy5hc3luY0lzRW1wdHkgPSBhc3luY0lzRW1wdHk7IiwidmFyIF9yZXF1aXJlID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWwvaXRlcmFibGUuanMnKSxcbiAgICBpdGVyYWJsZUN1cnJ5ID0gX3JlcXVpcmUuaXRlcmFibGVDdXJyeTtcblxudmFyIF9yZXF1aXJlMiA9IHJlcXVpcmUoJy4uLyRmaXJzdC1vci9maXJzdC1vci5qcycpLFxuICAgIF9fZmlyc3RPciA9IF9yZXF1aXJlMi5fX2ZpcnN0T3I7XG5cbnZhciBub25lID0gU3ltYm9sKCdub25lJyk7XG5cbmZ1bmN0aW9uIF9faXNFbXB0eShpdGVyYWJsZSkge1xuICByZXR1cm4gX19maXJzdE9yKGl0ZXJhYmxlLCBub25lKSA9PT0gbm9uZTtcbn1cblxuZXhwb3J0cy5fX2lzRW1wdHkgPSBfX2lzRW1wdHk7XG52YXIgaXNFbXB0eSA9IC8qI19fUFVSRV9fKi9pdGVyYWJsZUN1cnJ5KF9faXNFbXB0eSwge1xuICByZWR1Y2VzOiB0cnVlXG59KTtcbmV4cG9ydHMuaXNFbXB0eSA9IGlzRW1wdHk7IiwidmFyIF9yZWdlbmVyYXRvclJ1bnRpbWUgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvcmVnZW5lcmF0b3JcIik7XG5cbnZhciBfYXN5bmNUb0dlbmVyYXRvciA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2FzeW5jVG9HZW5lcmF0b3JcIik7XG5cbnZhciBfcmVxdWlyZSA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFsL2FzeW5jLWl0ZXJhYmxlLmpzJyksXG4gICAgYXN5bmNJdGVyYWJsZUN1cnJ5ID0gX3JlcXVpcmUuYXN5bmNJdGVyYWJsZUN1cnJ5O1xuXG52YXIgX3JlcXVpcmUyID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWwvY29tcGFyZS5qcycpLFxuICAgIGRlZmF1bHRDb21wYXJlT3JkZXIgPSBfcmVxdWlyZTIuZGVmYXVsdENvbXBhcmVPcmRlcjtcblxudmFyIF9yZXF1aXJlMyA9IHJlcXVpcmUoJy4uLyRwZWVrZXJhdGUvYXN5bmMtcGVla2VyYXRlLmpzJyksXG4gICAgX19hc3luY1BlZWtlcmF0ZSA9IF9yZXF1aXJlMy5fX2FzeW5jUGVla2VyYXRlO1xuXG5mdW5jdGlvbiBfX2FzeW5jSXNTb3J0ZWQoX3gpIHtcbiAgcmV0dXJuIF9hc3luY0lzU29ydGVkLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5cbmZ1bmN0aW9uIF9hc3luY0lzU29ydGVkKCkge1xuICBfYXN5bmNJc1NvcnRlZCA9IF9hc3luY1RvR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yUnVudGltZS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUoaXRlcmFibGUpIHtcbiAgICB2YXIgY29tcGFyZSxcbiAgICAgICAgcGVla3IsXG4gICAgICAgIHZhbHVlLFxuICAgICAgICBfYXJncyA9IGFyZ3VtZW50cztcbiAgICByZXR1cm4gX3JlZ2VuZXJhdG9yUnVudGltZS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUkKF9jb250ZXh0KSB7XG4gICAgICB3aGlsZSAoMSkge1xuICAgICAgICBzd2l0Y2ggKF9jb250ZXh0LnByZXYgPSBfY29udGV4dC5uZXh0KSB7XG4gICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgY29tcGFyZSA9IF9hcmdzLmxlbmd0aCA+IDEgJiYgX2FyZ3NbMV0gIT09IHVuZGVmaW5lZCA/IF9hcmdzWzFdIDogZGVmYXVsdENvbXBhcmVPcmRlcjtcbiAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAzO1xuICAgICAgICAgICAgcmV0dXJuIF9fYXN5bmNQZWVrZXJhdGUoaXRlcmFibGUpO1xuXG4gICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgcGVla3IgPSBfY29udGV4dC5zZW50O1xuXG4gICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgaWYgKHBlZWtyLmRvbmUpIHtcbiAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDE0O1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFsdWUgPSBwZWVrci52YWx1ZTtcbiAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSA4O1xuICAgICAgICAgICAgcmV0dXJuIHBlZWtyLmFkdmFuY2UoKTtcblxuICAgICAgICAgIGNhc2UgODpcbiAgICAgICAgICAgIGlmICghKCFwZWVrci5kb25lICYmIGNvbXBhcmUodmFsdWUsIHBlZWtyLnZhbHVlKSA+IDApKSB7XG4gICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAxMjtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAxMTtcbiAgICAgICAgICAgIHJldHVybiBwZWVrcltcInJldHVyblwiXSgpO1xuXG4gICAgICAgICAgY2FzZSAxMTpcbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5hYnJ1cHQoXCJyZXR1cm5cIiwgZmFsc2UpO1xuXG4gICAgICAgICAgY2FzZSAxMjpcbiAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSA0O1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlIDE0OlxuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LmFicnVwdChcInJldHVyblwiLCB0cnVlKTtcblxuICAgICAgICAgIGNhc2UgMTU6XG4gICAgICAgICAgY2FzZSBcImVuZFwiOlxuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LnN0b3AoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sIF9jYWxsZWUpO1xuICB9KSk7XG4gIHJldHVybiBfYXN5bmNJc1NvcnRlZC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuXG5leHBvcnRzLl9fYXN5bmNJc1NvcnRlZCA9IF9fYXN5bmNJc1NvcnRlZDtcbnZhciBhc3luY0lzU29ydGVkID0gLyojX19QVVJFX18qL2FzeW5jSXRlcmFibGVDdXJyeShfX2FzeW5jSXNTb3J0ZWQsIHtcbiAgcmVkdWNlczogdHJ1ZSxcbiAgbWluQXJnczogMCxcbiAgbWF4QXJnczogMVxufSk7XG5leHBvcnRzLmFzeW5jSXNTb3J0ZWQgPSBhc3luY0lzU29ydGVkOyIsInZhciBfcmVxdWlyZSA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFsL2l0ZXJhYmxlLmpzJyksXG4gICAgaXRlcmFibGVDdXJyeSA9IF9yZXF1aXJlLml0ZXJhYmxlQ3Vycnk7XG5cbnZhciBfcmVxdWlyZTIgPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbC9jb21wYXJlLmpzJyksXG4gICAgZGVmYXVsdENvbXBhcmVPcmRlciA9IF9yZXF1aXJlMi5kZWZhdWx0Q29tcGFyZU9yZGVyO1xuXG52YXIgX3JlcXVpcmUzID0gcmVxdWlyZSgnLi4vJHBlZWtlcmF0ZS9wZWVrZXJhdGUuanMnKSxcbiAgICBfX3BlZWtlcmF0ZSA9IF9yZXF1aXJlMy5fX3BlZWtlcmF0ZTtcblxuZnVuY3Rpb24gX19pc1NvcnRlZChpdGVyYWJsZSkge1xuICB2YXIgY29tcGFyZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogZGVmYXVsdENvbXBhcmVPcmRlcjtcblxuICB2YXIgcGVla3IgPSBfX3BlZWtlcmF0ZShpdGVyYWJsZSk7XG5cbiAgd2hpbGUgKCFwZWVrci5kb25lKSB7XG4gICAgdmFyIHZhbHVlID0gcGVla3IudmFsdWU7XG4gICAgcGVla3IuYWR2YW5jZSgpO1xuXG4gICAgaWYgKCFwZWVrci5kb25lICYmIGNvbXBhcmUodmFsdWUsIHBlZWtyLnZhbHVlKSA+IDApIHtcbiAgICAgIHBlZWtyW1wicmV0dXJuXCJdKCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydHMuX19pc1NvcnRlZCA9IF9faXNTb3J0ZWQ7XG52YXIgaXNTb3J0ZWQgPSAvKiNfX1BVUkVfXyovaXRlcmFibGVDdXJyeShfX2lzU29ydGVkLCB7XG4gIHJlZHVjZXM6IHRydWUsXG4gIG1pbkFyZ3M6IDAsXG4gIG1heEFyZ3M6IDFcbn0pO1xuZXhwb3J0cy5pc1NvcnRlZCA9IGlzU29ydGVkOyIsInZhciBfcmVnZW5lcmF0b3JSdW50aW1lID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL3JlZ2VuZXJhdG9yXCIpO1xuXG52YXIgX3dyYXBBc3luY0dlbmVyYXRvciA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3dyYXBBc3luY0dlbmVyYXRvclwiKTtcblxudmFyIF9hd2FpdEFzeW5jR2VuZXJhdG9yID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvYXdhaXRBc3luY0dlbmVyYXRvclwiKTtcblxudmFyIF9hc3luY0dlbmVyYXRvckRlbGVnYXRlID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvYXN5bmNHZW5lcmF0b3JEZWxlZ2F0ZVwiKTtcblxudmFyIF9hc3luY0l0ZXJhdG9yID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvYXN5bmNJdGVyYXRvclwiKTtcblxudmFyIF9yZXF1aXJlID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWwvYXN5bmMtaXRlcmFibGUuanMnKSxcbiAgICBhc3luY0l0ZXJhYmxlQ3VycnkgPSBfcmVxdWlyZS5hc3luY0l0ZXJhYmxlQ3Vycnk7XG5cbnZhciBfcmVxdWlyZTIgPSByZXF1aXJlKCcuLi8kdG8tYXJyYXkvYXN5bmMtdG8tYXJyYXkuanMnKSxcbiAgICBfX2FzeW5jVG9BcnJheSA9IF9yZXF1aXJlMi5fX2FzeW5jVG9BcnJheTtcblxuZnVuY3Rpb24gX19hc3luY0pvaW5XaXRoU2VxKF94LCBfeDIpIHtcbiAgcmV0dXJuIF9hc3luY0pvaW5XaXRoU2VxLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5cbmV4cG9ydHMuX19hc3luY0pvaW5XaXRoU2VxID0gX19hc3luY0pvaW5XaXRoU2VxO1xuXG5mdW5jdGlvbiBfYXN5bmNKb2luV2l0aFNlcSgpIHtcbiAgX2FzeW5jSm9pbldpdGhTZXEgPSBfd3JhcEFzeW5jR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yUnVudGltZS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUoc291cmNlLCBzZXBhcmF0b3JTZXEpIHtcbiAgICB2YXIgX3NlcGFyYXRvclNlcSwgaXNGaXJzdCwgX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbiwgX2RpZEl0ZXJhdG9yRXJyb3IsIF9pdGVyYXRvckVycm9yLCBfaXRlcmF0b3IsIF9zdGVwLCBfdmFsdWUsIHZhbHVlO1xuXG4gICAgcmV0dXJuIF9yZWdlbmVyYXRvclJ1bnRpbWUud3JhcChmdW5jdGlvbiBfY2FsbGVlJChfY29udGV4dCkge1xuICAgICAgd2hpbGUgKDEpIHtcbiAgICAgICAgc3dpdGNoIChfY29udGV4dC5wcmV2ID0gX2NvbnRleHQubmV4dCkge1xuICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAyO1xuICAgICAgICAgICAgcmV0dXJuIF9hd2FpdEFzeW5jR2VuZXJhdG9yKF9fYXN5bmNUb0FycmF5KHNlcGFyYXRvclNlcSkpO1xuXG4gICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgX3NlcGFyYXRvclNlcSA9IF9jb250ZXh0LnNlbnQ7XG4gICAgICAgICAgICBpc0ZpcnN0ID0gdHJ1ZTtcbiAgICAgICAgICAgIF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24gPSB0cnVlO1xuICAgICAgICAgICAgX2RpZEl0ZXJhdG9yRXJyb3IgPSBmYWxzZTtcbiAgICAgICAgICAgIF9jb250ZXh0LnByZXYgPSA2O1xuICAgICAgICAgICAgX2l0ZXJhdG9yID0gX2FzeW5jSXRlcmF0b3Ioc291cmNlKTtcblxuICAgICAgICAgIGNhc2UgODpcbiAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAxMDtcbiAgICAgICAgICAgIHJldHVybiBfYXdhaXRBc3luY0dlbmVyYXRvcihfaXRlcmF0b3IubmV4dCgpKTtcblxuICAgICAgICAgIGNhc2UgMTA6XG4gICAgICAgICAgICBfc3RlcCA9IF9jb250ZXh0LnNlbnQ7XG4gICAgICAgICAgICBfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uID0gX3N0ZXAuZG9uZTtcbiAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAxNDtcbiAgICAgICAgICAgIHJldHVybiBfYXdhaXRBc3luY0dlbmVyYXRvcihfc3RlcC52YWx1ZSk7XG5cbiAgICAgICAgICBjYXNlIDE0OlxuICAgICAgICAgICAgX3ZhbHVlID0gX2NvbnRleHQuc2VudDtcblxuICAgICAgICAgICAgaWYgKF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24pIHtcbiAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDI0O1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFsdWUgPSBfdmFsdWU7XG5cbiAgICAgICAgICAgIGlmIChpc0ZpcnN0KSB7XG4gICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAxOTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5kZWxlZ2F0ZVlpZWxkKF9hc3luY0dlbmVyYXRvckRlbGVnYXRlKF9hc3luY0l0ZXJhdG9yKF9zZXBhcmF0b3JTZXEpLCBfYXdhaXRBc3luY0dlbmVyYXRvciksIFwidDBcIiwgMTkpO1xuXG4gICAgICAgICAgY2FzZSAxOTpcbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5kZWxlZ2F0ZVlpZWxkKF9hc3luY0dlbmVyYXRvckRlbGVnYXRlKF9hc3luY0l0ZXJhdG9yKHZhbHVlKSwgX2F3YWl0QXN5bmNHZW5lcmF0b3IpLCBcInQxXCIsIDIwKTtcblxuICAgICAgICAgIGNhc2UgMjA6XG4gICAgICAgICAgICBpc0ZpcnN0ID0gZmFsc2U7XG5cbiAgICAgICAgICBjYXNlIDIxOlxuICAgICAgICAgICAgX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbiA9IHRydWU7XG4gICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gODtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSAyNDpcbiAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAzMDtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSAyNjpcbiAgICAgICAgICAgIF9jb250ZXh0LnByZXYgPSAyNjtcbiAgICAgICAgICAgIF9jb250ZXh0LnQyID0gX2NvbnRleHRbXCJjYXRjaFwiXSg2KTtcbiAgICAgICAgICAgIF9kaWRJdGVyYXRvckVycm9yID0gdHJ1ZTtcbiAgICAgICAgICAgIF9pdGVyYXRvckVycm9yID0gX2NvbnRleHQudDI7XG5cbiAgICAgICAgICBjYXNlIDMwOlxuICAgICAgICAgICAgX2NvbnRleHQucHJldiA9IDMwO1xuICAgICAgICAgICAgX2NvbnRleHQucHJldiA9IDMxO1xuXG4gICAgICAgICAgICBpZiAoISghX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbiAmJiBfaXRlcmF0b3JbXCJyZXR1cm5cIl0gIT0gbnVsbCkpIHtcbiAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDM1O1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDM1O1xuICAgICAgICAgICAgcmV0dXJuIF9hd2FpdEFzeW5jR2VuZXJhdG9yKF9pdGVyYXRvcltcInJldHVyblwiXSgpKTtcblxuICAgICAgICAgIGNhc2UgMzU6XG4gICAgICAgICAgICBfY29udGV4dC5wcmV2ID0gMzU7XG5cbiAgICAgICAgICAgIGlmICghX2RpZEl0ZXJhdG9yRXJyb3IpIHtcbiAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDM4O1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhyb3cgX2l0ZXJhdG9yRXJyb3I7XG5cbiAgICAgICAgICBjYXNlIDM4OlxuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LmZpbmlzaCgzNSk7XG5cbiAgICAgICAgICBjYXNlIDM5OlxuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LmZpbmlzaCgzMCk7XG5cbiAgICAgICAgICBjYXNlIDQwOlxuICAgICAgICAgIGNhc2UgXCJlbmRcIjpcbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5zdG9wKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCBfY2FsbGVlLCBudWxsLCBbWzYsIDI2LCAzMCwgNDBdLCBbMzEsLCAzNSwgMzldXSk7XG4gIH0pKTtcbiAgcmV0dXJuIF9hc3luY0pvaW5XaXRoU2VxLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5cbnZhciBhc3luY0pvaW5XaXRoU2VxID0gLyojX19QVVJFX18qL2FzeW5jSXRlcmFibGVDdXJyeShfX2FzeW5jSm9pbldpdGhTZXEpO1xuZXhwb3J0cy5hc3luY0pvaW5XaXRoU2VxID0gYXN5bmNKb2luV2l0aFNlcTsiLCJ2YXIgX3JlZ2VuZXJhdG9yUnVudGltZSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9yZWdlbmVyYXRvclwiKTtcblxudmFyIF9tYXJrZWQgPSAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yUnVudGltZS5tYXJrKF9fam9pbldpdGhTZXEpO1xuXG5mdW5jdGlvbiBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihvLCBhbGxvd0FycmF5TGlrZSkgeyB2YXIgaXQ7IGlmICh0eXBlb2YgU3ltYm9sID09PSBcInVuZGVmaW5lZFwiIHx8IG9bU3ltYm9sLml0ZXJhdG9yXSA9PSBudWxsKSB7IGlmIChBcnJheS5pc0FycmF5KG8pIHx8IChpdCA9IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvKSkgfHwgYWxsb3dBcnJheUxpa2UgJiYgbyAmJiB0eXBlb2Ygby5sZW5ndGggPT09IFwibnVtYmVyXCIpIHsgaWYgKGl0KSBvID0gaXQ7IHZhciBpID0gMDsgdmFyIEYgPSBmdW5jdGlvbiBGKCkge307IHJldHVybiB7IHM6IEYsIG46IGZ1bmN0aW9uIG4oKSB7IGlmIChpID49IG8ubGVuZ3RoKSByZXR1cm4geyBkb25lOiB0cnVlIH07IHJldHVybiB7IGRvbmU6IGZhbHNlLCB2YWx1ZTogb1tpKytdIH07IH0sIGU6IGZ1bmN0aW9uIGUoX2UpIHsgdGhyb3cgX2U7IH0sIGY6IEYgfTsgfSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIGl0ZXJhdGUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIik7IH0gdmFyIG5vcm1hbENvbXBsZXRpb24gPSB0cnVlLCBkaWRFcnIgPSBmYWxzZSwgZXJyOyByZXR1cm4geyBzOiBmdW5jdGlvbiBzKCkgeyBpdCA9IG9bU3ltYm9sLml0ZXJhdG9yXSgpOyB9LCBuOiBmdW5jdGlvbiBuKCkgeyB2YXIgc3RlcCA9IGl0Lm5leHQoKTsgbm9ybWFsQ29tcGxldGlvbiA9IHN0ZXAuZG9uZTsgcmV0dXJuIHN0ZXA7IH0sIGU6IGZ1bmN0aW9uIGUoX2UyKSB7IGRpZEVyciA9IHRydWU7IGVyciA9IF9lMjsgfSwgZjogZnVuY3Rpb24gZigpIHsgdHJ5IHsgaWYgKCFub3JtYWxDb21wbGV0aW9uICYmIGl0W1wicmV0dXJuXCJdICE9IG51bGwpIGl0W1wicmV0dXJuXCJdKCk7IH0gZmluYWxseSB7IGlmIChkaWRFcnIpIHRocm93IGVycjsgfSB9IH07IH1cblxuZnVuY3Rpb24gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8sIG1pbkxlbikgeyBpZiAoIW8pIHJldHVybjsgaWYgKHR5cGVvZiBvID09PSBcInN0cmluZ1wiKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTsgdmFyIG4gPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykuc2xpY2UoOCwgLTEpOyBpZiAobiA9PT0gXCJPYmplY3RcIiAmJiBvLmNvbnN0cnVjdG9yKSBuID0gby5jb25zdHJ1Y3Rvci5uYW1lOyBpZiAobiA9PT0gXCJNYXBcIiB8fCBuID09PSBcIlNldFwiKSByZXR1cm4gQXJyYXkuZnJvbShvKTsgaWYgKG4gPT09IFwiQXJndW1lbnRzXCIgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QobikpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pOyB9XG5cbmZ1bmN0aW9uIF9hcnJheUxpa2VUb0FycmF5KGFyciwgbGVuKSB7IGlmIChsZW4gPT0gbnVsbCB8fCBsZW4gPiBhcnIubGVuZ3RoKSBsZW4gPSBhcnIubGVuZ3RoOyBmb3IgKHZhciBpID0gMCwgYXJyMiA9IG5ldyBBcnJheShsZW4pOyBpIDwgbGVuOyBpKyspIHsgYXJyMltpXSA9IGFycltpXTsgfSByZXR1cm4gYXJyMjsgfVxuXG52YXIgX3JlcXVpcmUgPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbC9pdGVyYWJsZS5qcycpLFxuICAgIGl0ZXJhYmxlQ3VycnkgPSBfcmVxdWlyZS5pdGVyYWJsZUN1cnJ5O1xuXG52YXIgX3JlcXVpcmUyID0gcmVxdWlyZSgnLi4vJHRvLWFycmF5L3RvLWFycmF5LmpzJyksXG4gICAgX190b0FycmF5ID0gX3JlcXVpcmUyLl9fdG9BcnJheTtcblxuZnVuY3Rpb24gX19qb2luV2l0aFNlcShzb3VyY2UsIHNlcGFyYXRvclNlcSkge1xuICB2YXIgX3NlcGFyYXRvclNlcSwgaXNGaXJzdCwgX2l0ZXJhdG9yLCBfc3RlcCwgdmFsdWU7XG5cbiAgcmV0dXJuIF9yZWdlbmVyYXRvclJ1bnRpbWUud3JhcChmdW5jdGlvbiBfX2pvaW5XaXRoU2VxJChfY29udGV4dCkge1xuICAgIHdoaWxlICgxKSB7XG4gICAgICBzd2l0Y2ggKF9jb250ZXh0LnByZXYgPSBfY29udGV4dC5uZXh0KSB7XG4gICAgICAgIGNhc2UgMDpcbiAgICAgICAgICBfc2VwYXJhdG9yU2VxID0gX190b0FycmF5KHNlcGFyYXRvclNlcSk7XG4gICAgICAgICAgaXNGaXJzdCA9IHRydWU7XG4gICAgICAgICAgX2l0ZXJhdG9yID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIoc291cmNlKTtcbiAgICAgICAgICBfY29udGV4dC5wcmV2ID0gMztcblxuICAgICAgICAgIF9pdGVyYXRvci5zKCk7XG5cbiAgICAgICAgY2FzZSA1OlxuICAgICAgICAgIGlmICgoX3N0ZXAgPSBfaXRlcmF0b3IubigpKS5kb25lKSB7XG4gICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMTM7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YWx1ZSA9IF9zdGVwLnZhbHVlO1xuXG4gICAgICAgICAgaWYgKGlzRmlyc3QpIHtcbiAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSA5O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIF9jb250ZXh0LmRlbGVnYXRlWWllbGQoX3NlcGFyYXRvclNlcSwgXCJ0MFwiLCA5KTtcblxuICAgICAgICBjYXNlIDk6XG4gICAgICAgICAgcmV0dXJuIF9jb250ZXh0LmRlbGVnYXRlWWllbGQodmFsdWUsIFwidDFcIiwgMTApO1xuXG4gICAgICAgIGNhc2UgMTA6XG4gICAgICAgICAgaXNGaXJzdCA9IGZhbHNlO1xuXG4gICAgICAgIGNhc2UgMTE6XG4gICAgICAgICAgX2NvbnRleHQubmV4dCA9IDU7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAxMzpcbiAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMTg7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAxNTpcbiAgICAgICAgICBfY29udGV4dC5wcmV2ID0gMTU7XG4gICAgICAgICAgX2NvbnRleHQudDIgPSBfY29udGV4dFtcImNhdGNoXCJdKDMpO1xuXG4gICAgICAgICAgX2l0ZXJhdG9yLmUoX2NvbnRleHQudDIpO1xuXG4gICAgICAgIGNhc2UgMTg6XG4gICAgICAgICAgX2NvbnRleHQucHJldiA9IDE4O1xuXG4gICAgICAgICAgX2l0ZXJhdG9yLmYoKTtcblxuICAgICAgICAgIHJldHVybiBfY29udGV4dC5maW5pc2goMTgpO1xuXG4gICAgICAgIGNhc2UgMjE6XG4gICAgICAgIGNhc2UgXCJlbmRcIjpcbiAgICAgICAgICByZXR1cm4gX2NvbnRleHQuc3RvcCgpO1xuICAgICAgfVxuICAgIH1cbiAgfSwgX21hcmtlZCwgbnVsbCwgW1szLCAxNSwgMTgsIDIxXV0pO1xufVxuXG5leHBvcnRzLl9fam9pbldpdGhTZXEgPSBfX2pvaW5XaXRoU2VxO1xudmFyIGpvaW5XaXRoU2VxID0gLyojX19QVVJFX18qL2l0ZXJhYmxlQ3VycnkoX19qb2luV2l0aFNlcSk7XG5leHBvcnRzLmpvaW5XaXRoU2VxID0gam9pbldpdGhTZXE7IiwidmFyIF9yZXF1aXJlID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWwvYXN5bmMtaXRlcmFibGUuanMnKSxcbiAgICBhc3luY0l0ZXJhYmxlQ3VycnkgPSBfcmVxdWlyZS5hc3luY0l0ZXJhYmxlQ3Vycnk7XG5cbnZhciBfcmVxdWlyZTIgPSByZXF1aXJlKCcuLi8kam9pbi13aXRoLXNlcS9hc3luYy1qb2luLXdpdGgtc2VxLmpzJyksXG4gICAgX19hc3luY0pvaW5XaXRoU2VxID0gX3JlcXVpcmUyLl9fYXN5bmNKb2luV2l0aFNlcTtcblxuZnVuY3Rpb24gX19hc3luY0pvaW5XaXRoKHNvdXJjZSwgc2VwYXJhdG9yKSB7XG4gIHJldHVybiBfX2FzeW5jSm9pbldpdGhTZXEoc291cmNlLCBbc2VwYXJhdG9yXSk7XG59XG5cbmV4cG9ydHMuX19hc3luY0pvaW5XaXRoID0gX19hc3luY0pvaW5XaXRoO1xudmFyIGFzeW5jSm9pbldpdGggPSAvKiNfX1BVUkVfXyovYXN5bmNJdGVyYWJsZUN1cnJ5KF9fYXN5bmNKb2luV2l0aCwge1xuICB2YWxpZGF0ZUFyZ3M6IGZ1bmN0aW9uIHZhbGlkYXRlQXJncyhhcmdzKSB7fVxufSk7XG5leHBvcnRzLmFzeW5jSm9pbldpdGggPSBhc3luY0pvaW5XaXRoOyIsInZhciBfcmVxdWlyZSA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFsL2l0ZXJhYmxlLmpzJyksXG4gICAgaXRlcmFibGVDdXJyeSA9IF9yZXF1aXJlLml0ZXJhYmxlQ3Vycnk7XG5cbnZhciBfcmVxdWlyZTIgPSByZXF1aXJlKCcuLi8kam9pbi13aXRoLXNlcS9qb2luLXdpdGgtc2VxLmpzJyksXG4gICAgX19qb2luV2l0aFNlcSA9IF9yZXF1aXJlMi5fX2pvaW5XaXRoU2VxO1xuXG5mdW5jdGlvbiBfX2pvaW5XaXRoKHNvdXJjZSwgc2VwYXJhdG9yKSB7XG4gIHJldHVybiBfX2pvaW5XaXRoU2VxKHNvdXJjZSwgW3NlcGFyYXRvcl0pO1xufVxuXG5leHBvcnRzLl9fam9pbldpdGggPSBfX2pvaW5XaXRoO1xudmFyIGpvaW5XaXRoID0gLyojX19QVVJFX18qL2l0ZXJhYmxlQ3VycnkoX19qb2luV2l0aCwge1xuICB2YWxpZGF0ZUFyZ3M6IGZ1bmN0aW9uIHZhbGlkYXRlQXJncyhhcmdzKSB7XG4gICAgaWYgKHRydWUgJiYgdHlwZW9mIGFyZ3NbMF0gPT09ICdzdHJpbmcnKSB7XG4gICAgICBjb25zb2xlLndhcm4oXCJGb3Igc3RyaW5nIGlucHV0cyB1c2Ugam9pbldpdGhTZXEgaW5zdGVhZCBvZiBqb2luV2l0aFwiKTtcbiAgICB9XG4gIH1cbn0pO1xuZXhwb3J0cy5qb2luV2l0aCA9IGpvaW5XaXRoOyIsInZhciBfcmVxdWlyZSA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFsL2FzeW5jLWl0ZXJhYmxlLmpzJyksXG4gICAgYXN5bmNXcmFwV2l0aEl0ZXJhYmxlSXRlcmF0b3IgPSBfcmVxdWlyZS5hc3luY1dyYXBXaXRoSXRlcmFibGVJdGVyYXRvcixcbiAgICBhc3luY0Vuc3VyZUl0ZXJhYmxlID0gX3JlcXVpcmUuYXN5bmNFbnN1cmVJdGVyYWJsZTtcblxudmFyIF9yZXF1aXJlMiA9IHJlcXVpcmUoJy4uLyRqb2luLXdpdGgtc2VxL2FzeW5jLWpvaW4td2l0aC1zZXEuanMnKSxcbiAgICBfX2FzeW5jSm9pbldpdGhTZXEgPSBfcmVxdWlyZTIuX19hc3luY0pvaW5XaXRoU2VxO1xuXG52YXIgZW1wdHlTZXEgPSBbXTtcblxuZnVuY3Rpb24gX19hc3luY0pvaW4oc291cmNlKSB7XG4gIHJldHVybiBfX2FzeW5jSm9pbldpdGhTZXEoYXN5bmNFbnN1cmVJdGVyYWJsZShzb3VyY2UpLCBlbXB0eVNlcSk7XG59XG5cbmV4cG9ydHMuX19hc3luY0pvaW4gPSBfX2FzeW5jSm9pbjtcbnZhciBhc3luY0pvaW4gPSAvKiNfX1BVUkVfXyovYXN5bmNXcmFwV2l0aEl0ZXJhYmxlSXRlcmF0b3IoX19hc3luY0pvaW4pO1xuZXhwb3J0cy5hc3luY0pvaW4gPSBhc3luY0pvaW47IiwidmFyIF9yZXF1aXJlID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWwvaXRlcmFibGUuanMnKSxcbiAgICB3cmFwV2l0aEl0ZXJhYmxlSXRlcmF0b3IgPSBfcmVxdWlyZS53cmFwV2l0aEl0ZXJhYmxlSXRlcmF0b3IsXG4gICAgZW5zdXJlSXRlcmFibGUgPSBfcmVxdWlyZS5lbnN1cmVJdGVyYWJsZTtcblxudmFyIF9yZXF1aXJlMiA9IHJlcXVpcmUoJy4uLyRqb2luLXdpdGgtc2VxL2pvaW4td2l0aC1zZXEuanMnKSxcbiAgICBfX2pvaW5XaXRoU2VxID0gX3JlcXVpcmUyLl9fam9pbldpdGhTZXE7XG5cbnZhciBlbXB0eVNlcSA9IFtdO1xuXG5mdW5jdGlvbiBfX2pvaW4oc291cmNlKSB7XG4gIHJldHVybiBfX2pvaW5XaXRoU2VxKGVuc3VyZUl0ZXJhYmxlKHNvdXJjZSksIGVtcHR5U2VxKTtcbn1cblxuZXhwb3J0cy5fX2pvaW4gPSBfX2pvaW47XG52YXIgam9pbiA9IC8qI19fUFVSRV9fKi93cmFwV2l0aEl0ZXJhYmxlSXRlcmF0b3IoX19qb2luKTtcbmV4cG9ydHMuam9pbiA9IGpvaW47IiwidmFyIF9yZWdlbmVyYXRvclJ1bnRpbWUgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvcmVnZW5lcmF0b3JcIik7XG5cbnZhciBfYXdhaXRBc3luY0dlbmVyYXRvciA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2F3YWl0QXN5bmNHZW5lcmF0b3JcIik7XG5cbnZhciBfd3JhcEFzeW5jR2VuZXJhdG9yID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvd3JhcEFzeW5jR2VuZXJhdG9yXCIpO1xuXG52YXIgX2FzeW5jSXRlcmF0b3IgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9hc3luY0l0ZXJhdG9yXCIpO1xuXG52YXIgX3JlcXVpcmUgPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbC9hc3luYy1pdGVyYWJsZS5qcycpLFxuICAgIGFzeW5jSXRlcmFibGVDdXJyeSA9IF9yZXF1aXJlLmFzeW5jSXRlcmFibGVDdXJyeTtcblxuZnVuY3Rpb24gX19hc3luY01hcChfeCwgX3gyKSB7XG4gIHJldHVybiBfYXN5bmNNYXAuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cblxuZXhwb3J0cy5fX2FzeW5jTWFwID0gX19hc3luY01hcDtcblxuZnVuY3Rpb24gX2FzeW5jTWFwKCkge1xuICBfYXN5bmNNYXAgPSBfd3JhcEFzeW5jR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yUnVudGltZS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUoc291cmNlLCBmdW5jKSB7XG4gICAgdmFyIGMsIF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24sIF9kaWRJdGVyYXRvckVycm9yLCBfaXRlcmF0b3JFcnJvciwgX2l0ZXJhdG9yLCBfc3RlcCwgX3ZhbHVlLCB2YWx1ZTtcblxuICAgIHJldHVybiBfcmVnZW5lcmF0b3JSdW50aW1lLndyYXAoZnVuY3Rpb24gX2NhbGxlZSQoX2NvbnRleHQpIHtcbiAgICAgIHdoaWxlICgxKSB7XG4gICAgICAgIHN3aXRjaCAoX2NvbnRleHQucHJldiA9IF9jb250ZXh0Lm5leHQpIHtcbiAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICBjID0gMDtcbiAgICAgICAgICAgIF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24gPSB0cnVlO1xuICAgICAgICAgICAgX2RpZEl0ZXJhdG9yRXJyb3IgPSBmYWxzZTtcbiAgICAgICAgICAgIF9jb250ZXh0LnByZXYgPSAzO1xuICAgICAgICAgICAgX2l0ZXJhdG9yID0gX2FzeW5jSXRlcmF0b3Ioc291cmNlKTtcblxuICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSA3O1xuICAgICAgICAgICAgcmV0dXJuIF9hd2FpdEFzeW5jR2VuZXJhdG9yKF9pdGVyYXRvci5uZXh0KCkpO1xuXG4gICAgICAgICAgY2FzZSA3OlxuICAgICAgICAgICAgX3N0ZXAgPSBfY29udGV4dC5zZW50O1xuICAgICAgICAgICAgX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbiA9IF9zdGVwLmRvbmU7XG4gICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMTE7XG4gICAgICAgICAgICByZXR1cm4gX2F3YWl0QXN5bmNHZW5lcmF0b3IoX3N0ZXAudmFsdWUpO1xuXG4gICAgICAgICAgY2FzZSAxMTpcbiAgICAgICAgICAgIF92YWx1ZSA9IF9jb250ZXh0LnNlbnQ7XG5cbiAgICAgICAgICAgIGlmIChfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uKSB7XG4gICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAxOTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhbHVlID0gX3ZhbHVlO1xuICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDE2O1xuICAgICAgICAgICAgcmV0dXJuIGZ1bmModmFsdWUsIGMrKyk7XG5cbiAgICAgICAgICBjYXNlIDE2OlxuICAgICAgICAgICAgX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbiA9IHRydWU7XG4gICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gNTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSAxOTpcbiAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAyNTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSAyMTpcbiAgICAgICAgICAgIF9jb250ZXh0LnByZXYgPSAyMTtcbiAgICAgICAgICAgIF9jb250ZXh0LnQwID0gX2NvbnRleHRbXCJjYXRjaFwiXSgzKTtcbiAgICAgICAgICAgIF9kaWRJdGVyYXRvckVycm9yID0gdHJ1ZTtcbiAgICAgICAgICAgIF9pdGVyYXRvckVycm9yID0gX2NvbnRleHQudDA7XG5cbiAgICAgICAgICBjYXNlIDI1OlxuICAgICAgICAgICAgX2NvbnRleHQucHJldiA9IDI1O1xuICAgICAgICAgICAgX2NvbnRleHQucHJldiA9IDI2O1xuXG4gICAgICAgICAgICBpZiAoISghX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbiAmJiBfaXRlcmF0b3JbXCJyZXR1cm5cIl0gIT0gbnVsbCkpIHtcbiAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDMwO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDMwO1xuICAgICAgICAgICAgcmV0dXJuIF9hd2FpdEFzeW5jR2VuZXJhdG9yKF9pdGVyYXRvcltcInJldHVyblwiXSgpKTtcblxuICAgICAgICAgIGNhc2UgMzA6XG4gICAgICAgICAgICBfY29udGV4dC5wcmV2ID0gMzA7XG5cbiAgICAgICAgICAgIGlmICghX2RpZEl0ZXJhdG9yRXJyb3IpIHtcbiAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDMzO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhyb3cgX2l0ZXJhdG9yRXJyb3I7XG5cbiAgICAgICAgICBjYXNlIDMzOlxuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LmZpbmlzaCgzMCk7XG5cbiAgICAgICAgICBjYXNlIDM0OlxuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LmZpbmlzaCgyNSk7XG5cbiAgICAgICAgICBjYXNlIDM1OlxuICAgICAgICAgIGNhc2UgXCJlbmRcIjpcbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5zdG9wKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCBfY2FsbGVlLCBudWxsLCBbWzMsIDIxLCAyNSwgMzVdLCBbMjYsLCAzMCwgMzRdXSk7XG4gIH0pKTtcbiAgcmV0dXJuIF9hc3luY01hcC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuXG52YXIgYXN5bmNNYXAgPSAvKiNfX1BVUkVfXyovYXN5bmNJdGVyYWJsZUN1cnJ5KF9fYXN5bmNNYXApO1xuZXhwb3J0cy5hc3luY01hcCA9IGFzeW5jTWFwOyIsInZhciBfcmVnZW5lcmF0b3JSdW50aW1lID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL3JlZ2VuZXJhdG9yXCIpO1xuXG52YXIgX21hcmtlZCA9IC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3JSdW50aW1lLm1hcmsoX19tYXApO1xuXG5mdW5jdGlvbiBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihvLCBhbGxvd0FycmF5TGlrZSkgeyB2YXIgaXQ7IGlmICh0eXBlb2YgU3ltYm9sID09PSBcInVuZGVmaW5lZFwiIHx8IG9bU3ltYm9sLml0ZXJhdG9yXSA9PSBudWxsKSB7IGlmIChBcnJheS5pc0FycmF5KG8pIHx8IChpdCA9IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvKSkgfHwgYWxsb3dBcnJheUxpa2UgJiYgbyAmJiB0eXBlb2Ygby5sZW5ndGggPT09IFwibnVtYmVyXCIpIHsgaWYgKGl0KSBvID0gaXQ7IHZhciBpID0gMDsgdmFyIEYgPSBmdW5jdGlvbiBGKCkge307IHJldHVybiB7IHM6IEYsIG46IGZ1bmN0aW9uIG4oKSB7IGlmIChpID49IG8ubGVuZ3RoKSByZXR1cm4geyBkb25lOiB0cnVlIH07IHJldHVybiB7IGRvbmU6IGZhbHNlLCB2YWx1ZTogb1tpKytdIH07IH0sIGU6IGZ1bmN0aW9uIGUoX2UpIHsgdGhyb3cgX2U7IH0sIGY6IEYgfTsgfSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIGl0ZXJhdGUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIik7IH0gdmFyIG5vcm1hbENvbXBsZXRpb24gPSB0cnVlLCBkaWRFcnIgPSBmYWxzZSwgZXJyOyByZXR1cm4geyBzOiBmdW5jdGlvbiBzKCkgeyBpdCA9IG9bU3ltYm9sLml0ZXJhdG9yXSgpOyB9LCBuOiBmdW5jdGlvbiBuKCkgeyB2YXIgc3RlcCA9IGl0Lm5leHQoKTsgbm9ybWFsQ29tcGxldGlvbiA9IHN0ZXAuZG9uZTsgcmV0dXJuIHN0ZXA7IH0sIGU6IGZ1bmN0aW9uIGUoX2UyKSB7IGRpZEVyciA9IHRydWU7IGVyciA9IF9lMjsgfSwgZjogZnVuY3Rpb24gZigpIHsgdHJ5IHsgaWYgKCFub3JtYWxDb21wbGV0aW9uICYmIGl0W1wicmV0dXJuXCJdICE9IG51bGwpIGl0W1wicmV0dXJuXCJdKCk7IH0gZmluYWxseSB7IGlmIChkaWRFcnIpIHRocm93IGVycjsgfSB9IH07IH1cblxuZnVuY3Rpb24gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8sIG1pbkxlbikgeyBpZiAoIW8pIHJldHVybjsgaWYgKHR5cGVvZiBvID09PSBcInN0cmluZ1wiKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTsgdmFyIG4gPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykuc2xpY2UoOCwgLTEpOyBpZiAobiA9PT0gXCJPYmplY3RcIiAmJiBvLmNvbnN0cnVjdG9yKSBuID0gby5jb25zdHJ1Y3Rvci5uYW1lOyBpZiAobiA9PT0gXCJNYXBcIiB8fCBuID09PSBcIlNldFwiKSByZXR1cm4gQXJyYXkuZnJvbShvKTsgaWYgKG4gPT09IFwiQXJndW1lbnRzXCIgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QobikpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pOyB9XG5cbmZ1bmN0aW9uIF9hcnJheUxpa2VUb0FycmF5KGFyciwgbGVuKSB7IGlmIChsZW4gPT0gbnVsbCB8fCBsZW4gPiBhcnIubGVuZ3RoKSBsZW4gPSBhcnIubGVuZ3RoOyBmb3IgKHZhciBpID0gMCwgYXJyMiA9IG5ldyBBcnJheShsZW4pOyBpIDwgbGVuOyBpKyspIHsgYXJyMltpXSA9IGFycltpXTsgfSByZXR1cm4gYXJyMjsgfVxuXG52YXIgX3JlcXVpcmUgPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbC9pdGVyYWJsZS5qcycpLFxuICAgIGl0ZXJhYmxlQ3VycnkgPSBfcmVxdWlyZS5pdGVyYWJsZUN1cnJ5O1xuXG5mdW5jdGlvbiBfX21hcChzb3VyY2UsIGZ1bmMpIHtcbiAgdmFyIGMsIF9pdGVyYXRvciwgX3N0ZXAsIHZhbHVlO1xuXG4gIHJldHVybiBfcmVnZW5lcmF0b3JSdW50aW1lLndyYXAoZnVuY3Rpb24gX19tYXAkKF9jb250ZXh0KSB7XG4gICAgd2hpbGUgKDEpIHtcbiAgICAgIHN3aXRjaCAoX2NvbnRleHQucHJldiA9IF9jb250ZXh0Lm5leHQpIHtcbiAgICAgICAgY2FzZSAwOlxuICAgICAgICAgIGMgPSAwO1xuICAgICAgICAgIF9pdGVyYXRvciA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKHNvdXJjZSk7XG4gICAgICAgICAgX2NvbnRleHQucHJldiA9IDI7XG5cbiAgICAgICAgICBfaXRlcmF0b3IucygpO1xuXG4gICAgICAgIGNhc2UgNDpcbiAgICAgICAgICBpZiAoKF9zdGVwID0gX2l0ZXJhdG9yLm4oKSkuZG9uZSkge1xuICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDEwO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFsdWUgPSBfc3RlcC52YWx1ZTtcbiAgICAgICAgICBfY29udGV4dC5uZXh0ID0gODtcbiAgICAgICAgICByZXR1cm4gZnVuYyh2YWx1ZSwgYysrKTtcblxuICAgICAgICBjYXNlIDg6XG4gICAgICAgICAgX2NvbnRleHQubmV4dCA9IDQ7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAxMDpcbiAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMTU7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAxMjpcbiAgICAgICAgICBfY29udGV4dC5wcmV2ID0gMTI7XG4gICAgICAgICAgX2NvbnRleHQudDAgPSBfY29udGV4dFtcImNhdGNoXCJdKDIpO1xuXG4gICAgICAgICAgX2l0ZXJhdG9yLmUoX2NvbnRleHQudDApO1xuXG4gICAgICAgIGNhc2UgMTU6XG4gICAgICAgICAgX2NvbnRleHQucHJldiA9IDE1O1xuXG4gICAgICAgICAgX2l0ZXJhdG9yLmYoKTtcblxuICAgICAgICAgIHJldHVybiBfY29udGV4dC5maW5pc2goMTUpO1xuXG4gICAgICAgIGNhc2UgMTg6XG4gICAgICAgIGNhc2UgXCJlbmRcIjpcbiAgICAgICAgICByZXR1cm4gX2NvbnRleHQuc3RvcCgpO1xuICAgICAgfVxuICAgIH1cbiAgfSwgX21hcmtlZCwgbnVsbCwgW1syLCAxMiwgMTUsIDE4XV0pO1xufVxuXG5leHBvcnRzLl9fbWFwID0gX19tYXA7XG52YXIgbWFwID0gLyojX19QVVJFX18qL2l0ZXJhYmxlQ3VycnkoX19tYXApO1xuZXhwb3J0cy5tYXAgPSBtYXA7IiwidmFyIF9yZXF1aXJlID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWwvYXN5bmMtaXRlcmFibGUuanMnKSxcbiAgICBhc3luY0Vuc3VyZUl0ZXJhYmxlID0gX3JlcXVpcmUuYXN5bmNFbnN1cmVJdGVyYWJsZTtcblxudmFyIF9yZXF1aXJlMiA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFsL2FzeW5jLXBlZWtlcmF0b3IuanMnKSxcbiAgICBBc3luY1BlZWtlcmF0b3IgPSBfcmVxdWlyZTIuQXN5bmNQZWVrZXJhdG9yO1xuXG5mdW5jdGlvbiBfX2FzeW5jUGVla2VyYXRlKHNvdXJjZSkge1xuICByZXR1cm4gQXN5bmNQZWVrZXJhdG9yLmZyb20oc291cmNlKTtcbn1cblxuZXhwb3J0cy5fX2FzeW5jUGVla2VyYXRlID0gX19hc3luY1BlZWtlcmF0ZTtcblxuZnVuY3Rpb24gYXN5bmNXcmFwV2l0aEVuc3VyZUl0ZXJhYmxlKGZuKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoc291cmNlKSB7XG4gICAgcmV0dXJuIGZuKGFzeW5jRW5zdXJlSXRlcmFibGUoc291cmNlKSk7XG4gIH07XG59XG5cbnZhciBhc3luY1BlZWtlcmF0ZSA9IGFzeW5jV3JhcFdpdGhFbnN1cmVJdGVyYWJsZShfX2FzeW5jUGVla2VyYXRlKTtcbmV4cG9ydHMuYXN5bmNQZWVrZXJhdGUgPSBhc3luY1BlZWtlcmF0ZTsiLCJ2YXIgX3JlcXVpcmUgPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbC9pdGVyYWJsZS5qcycpLFxuICAgIGVuc3VyZUl0ZXJhYmxlID0gX3JlcXVpcmUuZW5zdXJlSXRlcmFibGU7XG5cbnZhciBfcmVxdWlyZTIgPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbC9wZWVrZXJhdG9yLmpzJyksXG4gICAgUGVla2VyYXRvciA9IF9yZXF1aXJlMi5QZWVrZXJhdG9yO1xuXG5mdW5jdGlvbiBfX3BlZWtlcmF0ZShzb3VyY2UpIHtcbiAgcmV0dXJuIFBlZWtlcmF0b3IuZnJvbShzb3VyY2UpO1xufVxuXG5leHBvcnRzLl9fcGVla2VyYXRlID0gX19wZWVrZXJhdGU7XG5cbmZ1bmN0aW9uIHdyYXBXaXRoRW5zdXJlSXRlcmFibGUoZm4pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChzb3VyY2UpIHtcbiAgICByZXR1cm4gZm4oZW5zdXJlSXRlcmFibGUoc291cmNlKSk7XG4gIH07XG59XG5cbnZhciBwZWVrZXJhdGUgPSB3cmFwV2l0aEVuc3VyZUl0ZXJhYmxlKF9fcGVla2VyYXRlKTtcbmV4cG9ydHMucGVla2VyYXRlID0gcGVla2VyYXRlOyIsInZhciBfcmVnZW5lcmF0b3JSdW50aW1lID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL3JlZ2VuZXJhdG9yXCIpO1xuXG52YXIgX3dyYXBBc3luY0dlbmVyYXRvciA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3dyYXBBc3luY0dlbmVyYXRvclwiKTtcblxudmFyIF9hd2FpdEFzeW5jR2VuZXJhdG9yID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvYXdhaXRBc3luY0dlbmVyYXRvclwiKTtcblxudmFyIF9hc3luY0l0ZXJhdG9yID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvYXN5bmNJdGVyYXRvclwiKTtcblxudmFyIF9hc3luY0dlbmVyYXRvckRlbGVnYXRlID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvYXN5bmNHZW5lcmF0b3JEZWxlZ2F0ZVwiKTtcblxudmFyIF9yZXF1aXJlID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWwvYXN5bmMtaXRlcmFibGUuanMnKSxcbiAgICBhc3luY0l0ZXJhYmxlQ3VycnkgPSBfcmVxdWlyZS5hc3luY0l0ZXJhYmxlQ3Vycnk7XG5cbmZ1bmN0aW9uIF9fYXN5bmNQcmVwZW5kKF94LCBfeDIpIHtcbiAgcmV0dXJuIF9hc3luY1ByZXBlbmQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cblxuZXhwb3J0cy5fX2FzeW5jUHJlcGVuZCA9IF9fYXN5bmNQcmVwZW5kO1xuXG5mdW5jdGlvbiBfYXN5bmNQcmVwZW5kKCkge1xuICBfYXN5bmNQcmVwZW5kID0gX3dyYXBBc3luY0dlbmVyYXRvciggLyojX19QVVJFX18qL19yZWdlbmVyYXRvclJ1bnRpbWUubWFyayhmdW5jdGlvbiBfY2FsbGVlKHNvdXJjZSwgdmFsdWUpIHtcbiAgICByZXR1cm4gX3JlZ2VuZXJhdG9yUnVudGltZS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUkKF9jb250ZXh0KSB7XG4gICAgICB3aGlsZSAoMSkge1xuICAgICAgICBzd2l0Y2ggKF9jb250ZXh0LnByZXYgPSBfY29udGV4dC5uZXh0KSB7XG4gICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDI7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG5cbiAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuZGVsZWdhdGVZaWVsZChfYXN5bmNHZW5lcmF0b3JEZWxlZ2F0ZShfYXN5bmNJdGVyYXRvcihzb3VyY2UpLCBfYXdhaXRBc3luY0dlbmVyYXRvciksIFwidDBcIiwgMyk7XG5cbiAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgY2FzZSBcImVuZFwiOlxuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LnN0b3AoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sIF9jYWxsZWUpO1xuICB9KSk7XG4gIHJldHVybiBfYXN5bmNQcmVwZW5kLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5cbnZhciBhc3luY1ByZXBlbmQgPSAvKiNfX1BVUkVfXyovYXN5bmNJdGVyYWJsZUN1cnJ5KF9fYXN5bmNQcmVwZW5kKTtcbmV4cG9ydHMuYXN5bmNQcmVwZW5kID0gYXN5bmNQcmVwZW5kOyIsInZhciBfcmVnZW5lcmF0b3JSdW50aW1lID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL3JlZ2VuZXJhdG9yXCIpO1xuXG52YXIgX21hcmtlZCA9IC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3JSdW50aW1lLm1hcmsoX19wcmVwZW5kKTtcblxudmFyIF9yZXF1aXJlID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWwvaXRlcmFibGUuanMnKSxcbiAgICBpdGVyYWJsZUN1cnJ5ID0gX3JlcXVpcmUuaXRlcmFibGVDdXJyeTtcblxuZnVuY3Rpb24gX19wcmVwZW5kKHNvdXJjZSwgdmFsdWUpIHtcbiAgcmV0dXJuIF9yZWdlbmVyYXRvclJ1bnRpbWUud3JhcChmdW5jdGlvbiBfX3ByZXBlbmQkKF9jb250ZXh0KSB7XG4gICAgd2hpbGUgKDEpIHtcbiAgICAgIHN3aXRjaCAoX2NvbnRleHQucHJldiA9IF9jb250ZXh0Lm5leHQpIHtcbiAgICAgICAgY2FzZSAwOlxuICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAyO1xuICAgICAgICAgIHJldHVybiB2YWx1ZTtcblxuICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgcmV0dXJuIF9jb250ZXh0LmRlbGVnYXRlWWllbGQoc291cmNlLCBcInQwXCIsIDMpO1xuXG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgY2FzZSBcImVuZFwiOlxuICAgICAgICAgIHJldHVybiBfY29udGV4dC5zdG9wKCk7XG4gICAgICB9XG4gICAgfVxuICB9LCBfbWFya2VkKTtcbn1cblxuZXhwb3J0cy5fX3ByZXBlbmQgPSBfX3ByZXBlbmQ7XG52YXIgcHJlcGVuZCA9IC8qI19fUFVSRV9fKi9pdGVyYWJsZUN1cnJ5KF9fcHJlcGVuZCk7XG5leHBvcnRzLnByZXBlbmQgPSBwcmVwZW5kOyIsInZhciBfcmVnZW5lcmF0b3JSdW50aW1lID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL3JlZ2VuZXJhdG9yXCIpO1xuXG52YXIgX2FzeW5jVG9HZW5lcmF0b3IgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9hc3luY1RvR2VuZXJhdG9yXCIpO1xuXG52YXIgX3JlcXVpcmUgPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbC9hc3luYy1pdGVyYWJsZS5qcycpLFxuICAgIGFzeW5jSXRlcmFibGVDdXJyeSA9IF9yZXF1aXJlLmFzeW5jSXRlcmFibGVDdXJyeTtcblxudmFyIF9yZXF1aXJlMiA9IHJlcXVpcmUoJy4uLyRwZWVrZXJhdGUvYXN5bmMtcGVla2VyYXRlLmpzJyksXG4gICAgX19hc3luY1BlZWtlcmF0ZSA9IF9yZXF1aXJlMi5fX2FzeW5jUGVla2VyYXRlO1xuXG5mdW5jdGlvbiBfX2FzeW5jUmVkdWNlKF94LCBfeDIpIHtcbiAgcmV0dXJuIF9hc3luY1JlZHVjZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuXG5mdW5jdGlvbiBfYXN5bmNSZWR1Y2UoKSB7XG4gIF9hc3luY1JlZHVjZSA9IF9hc3luY1RvR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yUnVudGltZS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUoaXRlcmFibGUsIHJlZHVjZXIpIHtcbiAgICB2YXIgaW5pdGlhbCxcbiAgICAgICAgYyxcbiAgICAgICAgcmVzdWx0LFxuICAgICAgICBwZWVrcixcbiAgICAgICAgX2FyZ3MgPSBhcmd1bWVudHM7XG4gICAgcmV0dXJuIF9yZWdlbmVyYXRvclJ1bnRpbWUud3JhcChmdW5jdGlvbiBfY2FsbGVlJChfY29udGV4dCkge1xuICAgICAgd2hpbGUgKDEpIHtcbiAgICAgICAgc3dpdGNoIChfY29udGV4dC5wcmV2ID0gX2NvbnRleHQubmV4dCkge1xuICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgIGluaXRpYWwgPSBfYXJncy5sZW5ndGggPiAyICYmIF9hcmdzWzJdICE9PSB1bmRlZmluZWQgPyBfYXJnc1syXSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGMgPSAwO1xuICAgICAgICAgICAgcmVzdWx0ID0gaW5pdGlhbDtcbiAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSA1O1xuICAgICAgICAgICAgcmV0dXJuIF9fYXN5bmNQZWVrZXJhdGUoaXRlcmFibGUpO1xuXG4gICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgcGVla3IgPSBfY29udGV4dC5zZW50O1xuICAgICAgICAgICAgX2NvbnRleHQucHJldiA9IDY7XG5cbiAgICAgICAgICAgIGlmICghKGluaXRpYWwgPT09IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDE0O1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCFwZWVrci5kb25lKSB7XG4gICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAxMDtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IHJlZHVjZTogbm8gaW5pdGlhbCB2YWx1ZSBzcGVjaWZpZWQgYW5kIGl0ZXJhYmxlIHdhcyBlbXB0eScpO1xuXG4gICAgICAgICAgY2FzZSAxMDpcbiAgICAgICAgICAgIHJlc3VsdCA9IHBlZWtyLnZhbHVlO1xuICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDEzO1xuICAgICAgICAgICAgcmV0dXJuIHBlZWtyLmFkdmFuY2UoKTtcblxuICAgICAgICAgIGNhc2UgMTM6XG4gICAgICAgICAgICBjID0gMTtcblxuICAgICAgICAgIGNhc2UgMTQ6XG4gICAgICAgICAgICBpZiAocGVla3IuZG9uZSkge1xuICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMjI7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMTc7XG4gICAgICAgICAgICByZXR1cm4gcmVkdWNlcihyZXN1bHQsIHBlZWtyLnZhbHVlLCBjKyspO1xuXG4gICAgICAgICAgY2FzZSAxNzpcbiAgICAgICAgICAgIHJlc3VsdCA9IF9jb250ZXh0LnNlbnQ7XG4gICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMjA7XG4gICAgICAgICAgICByZXR1cm4gcGVla3IuYWR2YW5jZSgpO1xuXG4gICAgICAgICAgY2FzZSAyMDpcbiAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAxNDtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSAyMjpcbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5hYnJ1cHQoXCJyZXR1cm5cIiwgcmVzdWx0KTtcblxuICAgICAgICAgIGNhc2UgMjM6XG4gICAgICAgICAgICBfY29udGV4dC5wcmV2ID0gMjM7XG4gICAgICAgICAgICBwZWVrcltcInJldHVyblwiXSgpO1xuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LmZpbmlzaCgyMyk7XG5cbiAgICAgICAgICBjYXNlIDI2OlxuICAgICAgICAgIGNhc2UgXCJlbmRcIjpcbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5zdG9wKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCBfY2FsbGVlLCBudWxsLCBbWzYsLCAyMywgMjZdXSk7XG4gIH0pKTtcbiAgcmV0dXJuIF9hc3luY1JlZHVjZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuXG5leHBvcnRzLl9fYXN5bmNSZWR1Y2UgPSBfX2FzeW5jUmVkdWNlO1xudmFyIGFzeW5jUmVkdWNlID0gLyojX19QVVJFX18qL2FzeW5jSXRlcmFibGVDdXJyeShfX2FzeW5jUmVkdWNlLCB7XG4gIHJlZHVjZXM6IHRydWUsXG4gIG1pbkFyZ3M6IDEsXG4gIG1heEFyZ3M6IDJcbn0pO1xuZXhwb3J0cy5hc3luY1JlZHVjZSA9IGFzeW5jUmVkdWNlOyIsInZhciBfcmVxdWlyZSA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFsL2l0ZXJhYmxlLmpzJyksXG4gICAgaXRlcmFibGVDdXJyeSA9IF9yZXF1aXJlLml0ZXJhYmxlQ3Vycnk7XG5cbnZhciBfcmVxdWlyZTIgPSByZXF1aXJlKCcuLi8kcGVla2VyYXRlL3BlZWtlcmF0ZS5qcycpLFxuICAgIF9fcGVla2VyYXRlID0gX3JlcXVpcmUyLl9fcGVla2VyYXRlO1xuXG5mdW5jdGlvbiBfX3JlZHVjZShpdGVyYWJsZSwgcmVkdWNlcikge1xuICB2YXIgaW5pdGlhbCA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogdW5kZWZpbmVkO1xuICB2YXIgYyA9IDA7XG4gIHZhciByZXN1bHQgPSBpbml0aWFsO1xuXG4gIHZhciBwZWVrciA9IF9fcGVla2VyYXRlKGl0ZXJhYmxlKTtcblxuICB0cnkge1xuICAgIGlmIChpbml0aWFsID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmIChwZWVrci5kb25lKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IHJlZHVjZTogbm8gaW5pdGlhbCB2YWx1ZSBzcGVjaWZpZWQgYW5kIGl0ZXJhYmxlIHdhcyBlbXB0eScpO1xuICAgICAgfVxuXG4gICAgICByZXN1bHQgPSBwZWVrci52YWx1ZTtcbiAgICAgIHBlZWtyLmFkdmFuY2UoKTtcbiAgICAgIGMgPSAxO1xuICAgIH1cblxuICAgIHdoaWxlICghcGVla3IuZG9uZSkge1xuICAgICAgcmVzdWx0ID0gcmVkdWNlcihyZXN1bHQsIHBlZWtyLnZhbHVlLCBjKyspO1xuICAgICAgcGVla3IuYWR2YW5jZSgpO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH0gZmluYWxseSB7XG4gICAgcGVla3JbXCJyZXR1cm5cIl0oKTtcbiAgfVxufVxuXG5leHBvcnRzLl9fcmVkdWNlID0gX19yZWR1Y2U7XG52YXIgcmVkdWNlID0gLyojX19QVVJFX18qL2l0ZXJhYmxlQ3VycnkoX19yZWR1Y2UsIHtcbiAgcmVkdWNlczogdHJ1ZSxcbiAgbWluQXJnczogMSxcbiAgbWF4QXJnczogMlxufSk7XG5leHBvcnRzLnJlZHVjZSA9IHJlZHVjZTsiLCJ2YXIgX3JlZ2VuZXJhdG9yUnVudGltZSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9yZWdlbmVyYXRvclwiKTtcblxudmFyIF93cmFwQXN5bmNHZW5lcmF0b3IgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy93cmFwQXN5bmNHZW5lcmF0b3JcIik7XG5cbnZhciBfYXdhaXRBc3luY0dlbmVyYXRvciA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2F3YWl0QXN5bmNHZW5lcmF0b3JcIik7XG5cbnZhciBfYXN5bmNJdGVyYXRvciA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2FzeW5jSXRlcmF0b3JcIik7XG5cbnZhciBfYXN5bmNHZW5lcmF0b3JEZWxlZ2F0ZSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2FzeW5jR2VuZXJhdG9yRGVsZWdhdGVcIik7XG5cbnZhciBfcmVxdWlyZSA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFsL2FzeW5jLWl0ZXJhYmxlLmpzJyksXG4gICAgYXN5bmNJdGVyYWJsZUN1cnJ5ID0gX3JlcXVpcmUuYXN5bmNJdGVyYWJsZUN1cnJ5O1xuXG52YXIgX3JlcXVpcmUyID0gcmVxdWlyZSgnLi4vJHRvLWFycmF5L2FzeW5jLXRvLWFycmF5LmpzJyksXG4gICAgX19hc3luY1RvQXJyYXkgPSBfcmVxdWlyZTIuX19hc3luY1RvQXJyYXk7XG5cbmZ1bmN0aW9uIF9fYXN5bmNSZXZlcnNlKF94KSB7XG4gIHJldHVybiBfYXN5bmNSZXZlcnNlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5cbmV4cG9ydHMuX19hc3luY1JldmVyc2UgPSBfX2FzeW5jUmV2ZXJzZTtcblxuZnVuY3Rpb24gX2FzeW5jUmV2ZXJzZSgpIHtcbiAgX2FzeW5jUmV2ZXJzZSA9IF93cmFwQXN5bmNHZW5lcmF0b3IoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3JSdW50aW1lLm1hcmsoZnVuY3Rpb24gX2NhbGxlZShzb3VyY2UpIHtcbiAgICByZXR1cm4gX3JlZ2VuZXJhdG9yUnVudGltZS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUkKF9jb250ZXh0KSB7XG4gICAgICB3aGlsZSAoMSkge1xuICAgICAgICBzd2l0Y2ggKF9jb250ZXh0LnByZXYgPSBfY29udGV4dC5uZXh0KSB7XG4gICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgX2NvbnRleHQudDAgPSBfYXN5bmNHZW5lcmF0b3JEZWxlZ2F0ZTtcbiAgICAgICAgICAgIF9jb250ZXh0LnQxID0gX2FzeW5jSXRlcmF0b3I7XG4gICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gNDtcbiAgICAgICAgICAgIHJldHVybiBfYXdhaXRBc3luY0dlbmVyYXRvcihfX2FzeW5jVG9BcnJheShzb3VyY2UpKTtcblxuICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgIF9jb250ZXh0LnQyID0gX2NvbnRleHQuc2VudC5yZXZlcnNlKCk7XG4gICAgICAgICAgICBfY29udGV4dC50MyA9ICgwLCBfY29udGV4dC50MSkoX2NvbnRleHQudDIpO1xuICAgICAgICAgICAgX2NvbnRleHQudDQgPSBfYXdhaXRBc3luY0dlbmVyYXRvcjtcbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5kZWxlZ2F0ZVlpZWxkKCgwLCBfY29udGV4dC50MCkoX2NvbnRleHQudDMsIF9jb250ZXh0LnQ0KSwgXCJ0NVwiLCA4KTtcblxuICAgICAgICAgIGNhc2UgODpcbiAgICAgICAgICBjYXNlIFwiZW5kXCI6XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuc3RvcCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwgX2NhbGxlZSk7XG4gIH0pKTtcbiAgcmV0dXJuIF9hc3luY1JldmVyc2UuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cblxudmFyIGFzeW5jUmV2ZXJzZSA9IC8qI19fUFVSRV9fKi9hc3luY0l0ZXJhYmxlQ3VycnkoX19hc3luY1JldmVyc2UpO1xuZXhwb3J0cy5hc3luY1JldmVyc2UgPSBhc3luY1JldmVyc2U7IiwidmFyIF9yZWdlbmVyYXRvclJ1bnRpbWUgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvcmVnZW5lcmF0b3JcIik7XG5cbnZhciBfbWFya2VkID0gLyojX19QVVJFX18qL19yZWdlbmVyYXRvclJ1bnRpbWUubWFyayhfX3JldmVyc2UpO1xuXG52YXIgX3JlcXVpcmUgPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbC9pdGVyYWJsZS5qcycpLFxuICAgIGl0ZXJhYmxlQ3VycnkgPSBfcmVxdWlyZS5pdGVyYWJsZUN1cnJ5O1xuXG52YXIgX3JlcXVpcmUyID0gcmVxdWlyZSgnLi4vJHRvLWFycmF5L3RvLWFycmF5LmpzJyksXG4gICAgX190b0FycmF5ID0gX3JlcXVpcmUyLl9fdG9BcnJheTtcblxuZnVuY3Rpb24gX19yZXZlcnNlKHNvdXJjZSkge1xuICByZXR1cm4gX3JlZ2VuZXJhdG9yUnVudGltZS53cmFwKGZ1bmN0aW9uIF9fcmV2ZXJzZSQoX2NvbnRleHQpIHtcbiAgICB3aGlsZSAoMSkge1xuICAgICAgc3dpdGNoIChfY29udGV4dC5wcmV2ID0gX2NvbnRleHQubmV4dCkge1xuICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgcmV0dXJuIF9jb250ZXh0LmRlbGVnYXRlWWllbGQoX190b0FycmF5KHNvdXJjZSkucmV2ZXJzZSgpLCBcInQwXCIsIDEpO1xuXG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgY2FzZSBcImVuZFwiOlxuICAgICAgICAgIHJldHVybiBfY29udGV4dC5zdG9wKCk7XG4gICAgICB9XG4gICAgfVxuICB9LCBfbWFya2VkKTtcbn1cblxuZXhwb3J0cy5fX3JldmVyc2UgPSBfX3JldmVyc2U7XG52YXIgcmV2ZXJzZSA9IC8qI19fUFVSRV9fKi9pdGVyYWJsZUN1cnJ5KF9fcmV2ZXJzZSk7XG5leHBvcnRzLnJldmVyc2UgPSByZXZlcnNlOyIsInZhciBfcmVnZW5lcmF0b3JSdW50aW1lID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL3JlZ2VuZXJhdG9yXCIpO1xuXG52YXIgX2F3YWl0QXN5bmNHZW5lcmF0b3IgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9hd2FpdEFzeW5jR2VuZXJhdG9yXCIpO1xuXG52YXIgX3dyYXBBc3luY0dlbmVyYXRvciA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3dyYXBBc3luY0dlbmVyYXRvclwiKTtcblxudmFyIF9yZXF1aXJlID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWwvYXN5bmMtaXRlcmFibGUuanMnKSxcbiAgICBhc3luY0l0ZXJhYmxlQ3VycnkgPSBfcmVxdWlyZS5hc3luY0l0ZXJhYmxlQ3Vycnk7XG5cbnZhciBfcmVxdWlyZTIgPSByZXF1aXJlKCcuLi8kaW50ZXJsZWF2ZS9hc3luYy1pbnRlcmxlYXZlLmpzJyksXG4gICAgX19hc3luY0ludGVybGVhdmUgPSBfcmVxdWlyZTIuX19hc3luY0ludGVybGVhdmU7XG5cbnZhciBfcmVxdWlyZTMgPSByZXF1aXJlKCcuL2ludGVybmFsL3ZhbGlkYXRlLWFyZ3MuanMnKSxcbiAgICBtYWtlVmFsaWRhdGVBcmdzID0gX3JlcXVpcmUzLm1ha2VWYWxpZGF0ZUFyZ3M7XG5cbmZ1bmN0aW9uIGFzeW5jQnlQb3NpdGlvbihfeCwgX3gyKSB7XG4gIHJldHVybiBfYXN5bmNCeVBvc2l0aW9uLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5cbmZ1bmN0aW9uIF9hc3luY0J5UG9zaXRpb24oKSB7XG4gIF9hc3luY0J5UG9zaXRpb24gPSBfd3JhcEFzeW5jR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yUnVudGltZS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUoX3JlZiwgYWxsKSB7XG4gICAgdmFyIHN0YXJ0LFxuICAgICAgICBzdGVwLFxuICAgICAgICBfbGVuLFxuICAgICAgICBwZWVrcnMsXG4gICAgICAgIF9rZXksXG4gICAgICAgIGksXG4gICAgICAgIHBlZWtyLFxuICAgICAgICBfYXJncyA9IGFyZ3VtZW50cztcblxuICAgIHJldHVybiBfcmVnZW5lcmF0b3JSdW50aW1lLndyYXAoZnVuY3Rpb24gX2NhbGxlZSQoX2NvbnRleHQpIHtcbiAgICAgIHdoaWxlICgxKSB7XG4gICAgICAgIHN3aXRjaCAoX2NvbnRleHQucHJldiA9IF9jb250ZXh0Lm5leHQpIHtcbiAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICBzdGFydCA9IF9yZWYuc3RhcnQsIHN0ZXAgPSBfcmVmLnN0ZXA7XG5cbiAgICAgICAgICAgIGZvciAoX2xlbiA9IF9hcmdzLmxlbmd0aCwgcGVla3JzID0gbmV3IEFycmF5KF9sZW4gPiAyID8gX2xlbiAtIDIgOiAwKSwgX2tleSA9IDI7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgICAgICAgICAgcGVla3JzW19rZXkgLSAyXSA9IF9hcmdzW19rZXldO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzdGFydCA9IHN0YXJ0ICUgcGVla3JzLmxlbmd0aDtcbiAgICAgICAgICAgIGkgPSBzdGFydDtcblxuICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgIGlmIChhbGwuZG9uZSkge1xuICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMTQ7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBwZWVrciA9IHBlZWtyc1tpXTtcblxuICAgICAgICAgICAgaWYgKHBlZWtyLmRvbmUpIHtcbiAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDExO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDk7XG4gICAgICAgICAgICByZXR1cm4gcGVla3IudmFsdWU7XG5cbiAgICAgICAgICBjYXNlIDk6XG4gICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMTE7XG4gICAgICAgICAgICByZXR1cm4gX2F3YWl0QXN5bmNHZW5lcmF0b3IocGVla3IuYWR2YW5jZSgpKTtcblxuICAgICAgICAgIGNhc2UgMTE6XG4gICAgICAgICAgICBpID0gKGkgKyBzdGVwKSAlIHBlZWtycy5sZW5ndGg7XG4gICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gNDtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSAxNDpcbiAgICAgICAgICBjYXNlIFwiZW5kXCI6XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuc3RvcCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwgX2NhbGxlZSk7XG4gIH0pKTtcbiAgcmV0dXJuIF9hc3luY0J5UG9zaXRpb24uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cblxuZnVuY3Rpb24gX19hc3luY1JvdW5kUm9iaW4oc291cmNlcykge1xuICB2YXIgc3RlcCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogMTtcbiAgdmFyIHN0YXJ0ID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiAwO1xuICByZXR1cm4gX19hc3luY0ludGVybGVhdmUoc291cmNlcywgYXN5bmNCeVBvc2l0aW9uLCB7XG4gICAgc3RhcnQ6IHN0YXJ0LFxuICAgIHN0ZXA6IHN0ZXBcbiAgfSk7XG59XG5cbmV4cG9ydHMuX19hc3luY1JvdW5kUm9iaW4gPSBfX2FzeW5jUm91bmRSb2JpbjtcbnZhciBhc3luY1JvdW5kUm9iaW4gPSAvKiNfX1BVUkVfXyovYXN5bmNJdGVyYWJsZUN1cnJ5KF9fYXN5bmNSb3VuZFJvYmluLCB7XG4gIHZhcmlhZGljOiB0cnVlLFxuICBtaW5BcmdzOiAwLFxuICBtYXhBcmdzOiAyLFxuICB2YWxpZGF0ZUFyZ3M6IC8qI19fUFVSRV9fKi9tYWtlVmFsaWRhdGVBcmdzKCdhc3luY1JvdW5kUm9iaW4nKVxufSk7XG5leHBvcnRzLmFzeW5jUm91bmRSb2JpbiA9IGFzeW5jUm91bmRSb2JpbjsiLCJ2YXIgX3JlcXVpcmUgPSByZXF1aXJlKCcuLi8uLi8uLi9pbnRlcm5hbC9udW1iZXIuanMnKSxcbiAgICBpc0ludGVnZXIgPSBfcmVxdWlyZS5pc0ludGVnZXI7XG5cbnZhciBfcmVxdWlyZTIgPSByZXF1aXJlKCcuLi8uLi9pcy1vYmplY3QvaXMtb2JqZWN0LmpzJyksXG4gICAgaXNPYmplY3QgPSBfcmVxdWlyZTIuaXNPYmplY3Q7XG5cbnZhciBfcmVxdWlyZTMgPSByZXF1aXJlKCcuLi8uLi9ub3QtdW5kZWZpbmVkL25vdC11bmRlZmluZWQuanMnKSxcbiAgICBub3RVbmRlZmluZWQgPSBfcmVxdWlyZTMubm90VW5kZWZpbmVkO1xuXG52YXIgbWFrZVZhbGlkYXRlQXJncyA9IGZ1bmN0aW9uIG1ha2VWYWxpZGF0ZUFyZ3MobWV0aG9kTmFtZSkge1xuICByZXR1cm4gZnVuY3Rpb24gdmFsaWRhdGVBcmdzKGFyZ3MpIHtcbiAgICBpZiAoaXNPYmplY3QoYXJnc1sxXSkpIHtcbiAgICAgIHZhciBfYXJncyQgPSBhcmdzWzFdLFxuICAgICAgICAgIHN0YXJ0ID0gX2FyZ3MkLnN0YXJ0LFxuICAgICAgICAgIHN0ZXAgPSBfYXJncyQuc3RlcDtcbiAgICAgIGFyZ3NbMV0gPSBzdGFydDtcbiAgICAgIGFyZ3NbMl0gPSBzdGVwO1xuICAgIH1cblxuICAgIGlmIChub3RVbmRlZmluZWQoYXJnc1syXSkpIHtcbiAgICAgIGFyZ3NbMl0gPSBOdW1iZXIoYXJnc1syXSk7XG5cbiAgICAgIGlmICghaXNJbnRlZ2VyKGFyZ3NbMl0sIHRydWUpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcInN0ZXAgYXJndW1lbnQgdG8gXCIuY29uY2F0KG1ldGhvZE5hbWUsIFwiIG11c3QgYmUgYSBub24temVybyBpbnRlZ2VyXCIpKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG59O1xuXG5leHBvcnRzLm1ha2VWYWxpZGF0ZUFyZ3MgPSBtYWtlVmFsaWRhdGVBcmdzOyIsInZhciBfcmVnZW5lcmF0b3JSdW50aW1lID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL3JlZ2VuZXJhdG9yXCIpO1xuXG52YXIgX21hcmtlZCA9IC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3JSdW50aW1lLm1hcmsoYnlQb3NpdGlvbik7XG5cbnZhciBfcmVxdWlyZSA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFsL2l0ZXJhYmxlLmpzJyksXG4gICAgaXRlcmFibGVDdXJyeSA9IF9yZXF1aXJlLml0ZXJhYmxlQ3Vycnk7XG5cbnZhciBfcmVxdWlyZTIgPSByZXF1aXJlKCcuLi8kaW50ZXJsZWF2ZS9pbnRlcmxlYXZlLmpzJyksXG4gICAgX19pbnRlcmxlYXZlID0gX3JlcXVpcmUyLl9faW50ZXJsZWF2ZTtcblxudmFyIF9yZXF1aXJlMyA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvdmFsaWRhdGUtYXJncy5qcycpLFxuICAgIG1ha2VWYWxpZGF0ZUFyZ3MgPSBfcmVxdWlyZTMubWFrZVZhbGlkYXRlQXJncztcblxuZnVuY3Rpb24gYnlQb3NpdGlvbihfcmVmLCBhbGwpIHtcbiAgdmFyIHN0YXJ0LFxuICAgICAgc3RlcCxcbiAgICAgIF9sZW4sXG4gICAgICBwZWVrcnMsXG4gICAgICBfa2V5LFxuICAgICAgaSxcbiAgICAgIHBlZWtyLFxuICAgICAgX2FyZ3MgPSBhcmd1bWVudHM7XG5cbiAgcmV0dXJuIF9yZWdlbmVyYXRvclJ1bnRpbWUud3JhcChmdW5jdGlvbiBieVBvc2l0aW9uJChfY29udGV4dCkge1xuICAgIHdoaWxlICgxKSB7XG4gICAgICBzd2l0Y2ggKF9jb250ZXh0LnByZXYgPSBfY29udGV4dC5uZXh0KSB7XG4gICAgICAgIGNhc2UgMDpcbiAgICAgICAgICBzdGFydCA9IF9yZWYuc3RhcnQsIHN0ZXAgPSBfcmVmLnN0ZXA7XG5cbiAgICAgICAgICBmb3IgKF9sZW4gPSBfYXJncy5sZW5ndGgsIHBlZWtycyA9IG5ldyBBcnJheShfbGVuID4gMiA/IF9sZW4gLSAyIDogMCksIF9rZXkgPSAyOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICAgICAgICBwZWVrcnNbX2tleSAtIDJdID0gX2FyZ3NbX2tleV07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgc3RhcnQgPSBzdGFydCAlIHBlZWtycy5sZW5ndGg7XG4gICAgICAgICAgaSA9IHN0YXJ0O1xuXG4gICAgICAgIGNhc2UgNDpcbiAgICAgICAgICBpZiAoYWxsLmRvbmUpIHtcbiAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAxMztcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHBlZWtyID0gcGVla3JzW2ldO1xuXG4gICAgICAgICAgaWYgKHBlZWtyLmRvbmUpIHtcbiAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAxMDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSA5O1xuICAgICAgICAgIHJldHVybiBwZWVrci52YWx1ZTtcblxuICAgICAgICBjYXNlIDk6XG4gICAgICAgICAgcGVla3IuYWR2YW5jZSgpO1xuXG4gICAgICAgIGNhc2UgMTA6XG4gICAgICAgICAgaSA9IChpICsgc3RlcCkgJSBwZWVrcnMubGVuZ3RoO1xuICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSA0O1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgMTM6XG4gICAgICAgIGNhc2UgXCJlbmRcIjpcbiAgICAgICAgICByZXR1cm4gX2NvbnRleHQuc3RvcCgpO1xuICAgICAgfVxuICAgIH1cbiAgfSwgX21hcmtlZCk7XG59XG5cbmZ1bmN0aW9uIF9fcm91bmRSb2Jpbihzb3VyY2VzKSB7XG4gIHZhciBzdGVwID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiAxO1xuICB2YXIgc3RhcnQgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IDA7XG4gIHJldHVybiBfX2ludGVybGVhdmUoc291cmNlcywgYnlQb3NpdGlvbiwge1xuICAgIHN0YXJ0OiBzdGFydCxcbiAgICBzdGVwOiBzdGVwXG4gIH0pO1xufVxuXG5leHBvcnRzLl9fcm91bmRSb2JpbiA9IF9fcm91bmRSb2JpbjtcbnZhciByb3VuZFJvYmluID0gLyojX19QVVJFX18qL2l0ZXJhYmxlQ3VycnkoX19yb3VuZFJvYmluLCB7XG4gIHZhcmlhZGljOiB0cnVlLFxuICBtaW5BcmdzOiAwLFxuICBtYXhBcmdzOiAyLFxuICB2YWxpZGF0ZUFyZ3M6IC8qI19fUFVSRV9fKi9tYWtlVmFsaWRhdGVBcmdzKCdyb3VuZFJvYmluJylcbn0pO1xuZXhwb3J0cy5yb3VuZFJvYmluID0gcm91bmRSb2JpbjsiLCJ2YXIgX3JlZ2VuZXJhdG9yUnVudGltZSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9yZWdlbmVyYXRvclwiKTtcblxudmFyIF9hc3luY1RvR2VuZXJhdG9yID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvYXN5bmNUb0dlbmVyYXRvclwiKTtcblxudmFyIF9hc3luY0l0ZXJhdG9yID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvYXN5bmNJdGVyYXRvclwiKTtcblxudmFyIF9yZXF1aXJlID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWwvYXN5bmMtaXRlcmFibGUuanMnKSxcbiAgICBhc3luY0Vuc3VyZUl0ZXJhYmxlID0gX3JlcXVpcmUuYXN5bmNFbnN1cmVJdGVyYWJsZTtcblxuZnVuY3Rpb24gX19hc3luY1NpemUoX3gpIHtcbiAgcmV0dXJuIF9hc3luY1NpemUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cblxuZnVuY3Rpb24gX2FzeW5jU2l6ZSgpIHtcbiAgX2FzeW5jU2l6ZSA9IF9hc3luY1RvR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yUnVudGltZS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUoaXRlcmFibGUpIHtcbiAgICB2YXIgaXRlciwgc2l6ZSwgX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbiwgX2RpZEl0ZXJhdG9yRXJyb3IsIF9pdGVyYXRvckVycm9yLCBfaXRlcmF0b3IsIF9zdGVwLCBfdmFsdWUsIF87XG5cbiAgICByZXR1cm4gX3JlZ2VuZXJhdG9yUnVudGltZS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUkKF9jb250ZXh0KSB7XG4gICAgICB3aGlsZSAoMSkge1xuICAgICAgICBzd2l0Y2ggKF9jb250ZXh0LnByZXYgPSBfY29udGV4dC5uZXh0KSB7XG4gICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgaXRlciA9IGFzeW5jRW5zdXJlSXRlcmFibGUoaXRlcmFibGUpO1xuICAgICAgICAgICAgc2l6ZSA9IDA7XG4gICAgICAgICAgICBfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uID0gdHJ1ZTtcbiAgICAgICAgICAgIF9kaWRJdGVyYXRvckVycm9yID0gZmFsc2U7XG4gICAgICAgICAgICBfY29udGV4dC5wcmV2ID0gNDtcbiAgICAgICAgICAgIF9pdGVyYXRvciA9IF9hc3luY0l0ZXJhdG9yKGl0ZXIpO1xuXG4gICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDg7XG4gICAgICAgICAgICByZXR1cm4gX2l0ZXJhdG9yLm5leHQoKTtcblxuICAgICAgICAgIGNhc2UgODpcbiAgICAgICAgICAgIF9zdGVwID0gX2NvbnRleHQuc2VudDtcbiAgICAgICAgICAgIF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24gPSBfc3RlcC5kb25lO1xuICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDEyO1xuICAgICAgICAgICAgcmV0dXJuIF9zdGVwLnZhbHVlO1xuXG4gICAgICAgICAgY2FzZSAxMjpcbiAgICAgICAgICAgIF92YWx1ZSA9IF9jb250ZXh0LnNlbnQ7XG5cbiAgICAgICAgICAgIGlmIChfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uKSB7XG4gICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAxOTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIF8gPSBfdmFsdWU7XG4gICAgICAgICAgICBzaXplKys7XG5cbiAgICAgICAgICBjYXNlIDE2OlxuICAgICAgICAgICAgX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbiA9IHRydWU7XG4gICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gNjtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSAxOTpcbiAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAyNTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSAyMTpcbiAgICAgICAgICAgIF9jb250ZXh0LnByZXYgPSAyMTtcbiAgICAgICAgICAgIF9jb250ZXh0LnQwID0gX2NvbnRleHRbXCJjYXRjaFwiXSg0KTtcbiAgICAgICAgICAgIF9kaWRJdGVyYXRvckVycm9yID0gdHJ1ZTtcbiAgICAgICAgICAgIF9pdGVyYXRvckVycm9yID0gX2NvbnRleHQudDA7XG5cbiAgICAgICAgICBjYXNlIDI1OlxuICAgICAgICAgICAgX2NvbnRleHQucHJldiA9IDI1O1xuICAgICAgICAgICAgX2NvbnRleHQucHJldiA9IDI2O1xuXG4gICAgICAgICAgICBpZiAoISghX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbiAmJiBfaXRlcmF0b3JbXCJyZXR1cm5cIl0gIT0gbnVsbCkpIHtcbiAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDMwO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDMwO1xuICAgICAgICAgICAgcmV0dXJuIF9pdGVyYXRvcltcInJldHVyblwiXSgpO1xuXG4gICAgICAgICAgY2FzZSAzMDpcbiAgICAgICAgICAgIF9jb250ZXh0LnByZXYgPSAzMDtcblxuICAgICAgICAgICAgaWYgKCFfZGlkSXRlcmF0b3JFcnJvcikge1xuICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMzM7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aHJvdyBfaXRlcmF0b3JFcnJvcjtcblxuICAgICAgICAgIGNhc2UgMzM6XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuZmluaXNoKDMwKTtcblxuICAgICAgICAgIGNhc2UgMzQ6XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuZmluaXNoKDI1KTtcblxuICAgICAgICAgIGNhc2UgMzU6XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuYWJydXB0KFwicmV0dXJuXCIsIHNpemUpO1xuXG4gICAgICAgICAgY2FzZSAzNjpcbiAgICAgICAgICBjYXNlIFwiZW5kXCI6XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuc3RvcCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwgX2NhbGxlZSwgbnVsbCwgW1s0LCAyMSwgMjUsIDM1XSwgWzI2LCwgMzAsIDM0XV0pO1xuICB9KSk7XG4gIHJldHVybiBfYXN5bmNTaXplLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5cbmV4cG9ydHMuX19hc3luY1NpemUgPSBfX2FzeW5jU2l6ZTtcbnZhciBhc3luY1NpemUgPSBfX2FzeW5jU2l6ZTtcbmV4cG9ydHMuYXN5bmNTaXplID0gYXN5bmNTaXplOyIsImZ1bmN0aW9uIF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKG8sIGFsbG93QXJyYXlMaWtlKSB7IHZhciBpdDsgaWYgKHR5cGVvZiBTeW1ib2wgPT09IFwidW5kZWZpbmVkXCIgfHwgb1tTeW1ib2wuaXRlcmF0b3JdID09IG51bGwpIHsgaWYgKEFycmF5LmlzQXJyYXkobykgfHwgKGl0ID0gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8pKSB8fCBhbGxvd0FycmF5TGlrZSAmJiBvICYmIHR5cGVvZiBvLmxlbmd0aCA9PT0gXCJudW1iZXJcIikgeyBpZiAoaXQpIG8gPSBpdDsgdmFyIGkgPSAwOyB2YXIgRiA9IGZ1bmN0aW9uIEYoKSB7fTsgcmV0dXJuIHsgczogRiwgbjogZnVuY3Rpb24gbigpIHsgaWYgKGkgPj0gby5sZW5ndGgpIHJldHVybiB7IGRvbmU6IHRydWUgfTsgcmV0dXJuIHsgZG9uZTogZmFsc2UsIHZhbHVlOiBvW2krK10gfTsgfSwgZTogZnVuY3Rpb24gZShfZSkgeyB0aHJvdyBfZTsgfSwgZjogRiB9OyB9IHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gaXRlcmF0ZSBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTsgfSB2YXIgbm9ybWFsQ29tcGxldGlvbiA9IHRydWUsIGRpZEVyciA9IGZhbHNlLCBlcnI7IHJldHVybiB7IHM6IGZ1bmN0aW9uIHMoKSB7IGl0ID0gb1tTeW1ib2wuaXRlcmF0b3JdKCk7IH0sIG46IGZ1bmN0aW9uIG4oKSB7IHZhciBzdGVwID0gaXQubmV4dCgpOyBub3JtYWxDb21wbGV0aW9uID0gc3RlcC5kb25lOyByZXR1cm4gc3RlcDsgfSwgZTogZnVuY3Rpb24gZShfZTIpIHsgZGlkRXJyID0gdHJ1ZTsgZXJyID0gX2UyOyB9LCBmOiBmdW5jdGlvbiBmKCkgeyB0cnkgeyBpZiAoIW5vcm1hbENvbXBsZXRpb24gJiYgaXRbXCJyZXR1cm5cIl0gIT0gbnVsbCkgaXRbXCJyZXR1cm5cIl0oKTsgfSBmaW5hbGx5IHsgaWYgKGRpZEVycikgdGhyb3cgZXJyOyB9IH0gfTsgfVxuXG5mdW5jdGlvbiBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkobywgbWluTGVuKSB7IGlmICghbykgcmV0dXJuOyBpZiAodHlwZW9mIG8gPT09IFwic3RyaW5nXCIpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pOyB2YXIgbiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKS5zbGljZSg4LCAtMSk7IGlmIChuID09PSBcIk9iamVjdFwiICYmIG8uY29uc3RydWN0b3IpIG4gPSBvLmNvbnN0cnVjdG9yLm5hbWU7IGlmIChuID09PSBcIk1hcFwiIHx8IG4gPT09IFwiU2V0XCIpIHJldHVybiBBcnJheS5mcm9tKG8pOyBpZiAobiA9PT0gXCJBcmd1bWVudHNcIiB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSkgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IH1cblxuZnVuY3Rpb24gX2FycmF5TGlrZVRvQXJyYXkoYXJyLCBsZW4pIHsgaWYgKGxlbiA9PSBudWxsIHx8IGxlbiA+IGFyci5sZW5ndGgpIGxlbiA9IGFyci5sZW5ndGg7IGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGxlbik7IGkgPCBsZW47IGkrKykgeyBhcnIyW2ldID0gYXJyW2ldOyB9IHJldHVybiBhcnIyOyB9XG5cbnZhciBfcmVxdWlyZSA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFsL2l0ZXJhYmxlLmpzJyksXG4gICAgZW5zdXJlSXRlcmFibGUgPSBfcmVxdWlyZS5lbnN1cmVJdGVyYWJsZTtcblxuZnVuY3Rpb24gX19zaXplKGl0ZXJhYmxlKSB7XG4gIHZhciBpdGVyID0gZW5zdXJlSXRlcmFibGUoaXRlcmFibGUpO1xuICB2YXIgc2l6ZSA9IDA7XG5cbiAgdmFyIF9pdGVyYXRvciA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKGl0ZXIpLFxuICAgICAgX3N0ZXA7XG5cbiAgdHJ5IHtcbiAgICBmb3IgKF9pdGVyYXRvci5zKCk7ICEoX3N0ZXAgPSBfaXRlcmF0b3IubigpKS5kb25lOykge1xuICAgICAgdmFyIF8gPSBfc3RlcC52YWx1ZTtcbiAgICAgIHNpemUrKztcbiAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIF9pdGVyYXRvci5lKGVycik7XG4gIH0gZmluYWxseSB7XG4gICAgX2l0ZXJhdG9yLmYoKTtcbiAgfVxuXG4gIHJldHVybiBzaXplO1xufVxuXG5leHBvcnRzLl9fc2l6ZSA9IF9fc2l6ZTtcbnZhciBzaXplID0gX19zaXplO1xuZXhwb3J0cy5zaXplID0gc2l6ZTsiLCJ2YXIgX2FzeW5jVG9HZW5lcmF0b3IgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9hc3luY1RvR2VuZXJhdG9yXCIpO1xuXG52YXIgX3JlZ2VuZXJhdG9yUnVudGltZSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9yZWdlbmVyYXRvclwiKTtcblxudmFyIF9hc3luY0dlbmVyYXRvckRlbGVnYXRlID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvYXN5bmNHZW5lcmF0b3JEZWxlZ2F0ZVwiKTtcblxudmFyIF9hd2FpdEFzeW5jR2VuZXJhdG9yID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvYXdhaXRBc3luY0dlbmVyYXRvclwiKTtcblxudmFyIF93cmFwQXN5bmNHZW5lcmF0b3IgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy93cmFwQXN5bmNHZW5lcmF0b3JcIik7XG5cbnZhciBfYXN5bmNJdGVyYXRvciA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2FzeW5jSXRlcmF0b3JcIik7XG5cbnZhciBfcmVxdWlyZSA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFsL2NpcmN1bGFyLWJ1ZmZlci5qcycpLFxuICAgIENpcmN1bGFyQnVmZmVyID0gX3JlcXVpcmUuQ2lyY3VsYXJCdWZmZXI7XG5cbnZhciBfcmVxdWlyZTIgPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbC9hc3luYy1pdGVyYWJsZS5qcycpLFxuICAgIGFzeW5jSXRlcmFibGVDdXJyeSA9IF9yZXF1aXJlMi5hc3luY0l0ZXJhYmxlQ3Vycnk7XG5cbnZhciBfcmVxdWlyZTMgPSByZXF1aXJlKCcuL2ludGVybmFsL3ZhbGlkYXRlLWFyZ3MuanMnKSxcbiAgICBtYWtlVmFsaWRhdGVBcmdzID0gX3JlcXVpcmUzLm1ha2VWYWxpZGF0ZUFyZ3M7XG5cbmZ1bmN0aW9uIF9fYXN5bmNTbGljZUZyb21TdGFydChfeCkge1xuICByZXR1cm4gX2FzeW5jU2xpY2VGcm9tU3RhcnQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cblxuZXhwb3J0cy5fX2FzeW5jU2xpY2VGcm9tU3RhcnQgPSBfX2FzeW5jU2xpY2VGcm9tU3RhcnQ7XG5cbmZ1bmN0aW9uIF9hc3luY1NsaWNlRnJvbVN0YXJ0KCkge1xuICBfYXN5bmNTbGljZUZyb21TdGFydCA9IF93cmFwQXN5bmNHZW5lcmF0b3IoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3JSdW50aW1lLm1hcmsoZnVuY3Rpb24gX2NhbGxlZShzb3VyY2UpIHtcbiAgICB2YXIgc3RhcnQsXG4gICAgICAgIGVuZCxcbiAgICAgICAgc3RlcCxcbiAgICAgICAgY3VycmVudFBvcyxcbiAgICAgICAgbmV4dFZhbGlkUG9zLFxuICAgICAgICBidWZmZXJTaXplLFxuICAgICAgICBidWZmZXIsXG4gICAgICAgIGNvdW50ZXIsXG4gICAgICAgIF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24sXG4gICAgICAgIF9kaWRJdGVyYXRvckVycm9yLFxuICAgICAgICBfaXRlcmF0b3JFcnJvcixcbiAgICAgICAgX2l0ZXJhdG9yLFxuICAgICAgICBfc3RlcCxcbiAgICAgICAgX3ZhbHVlLFxuICAgICAgICB2YWx1ZSxcbiAgICAgICAgX2FyZ3MgPSBhcmd1bWVudHM7XG5cbiAgICByZXR1cm4gX3JlZ2VuZXJhdG9yUnVudGltZS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUkKF9jb250ZXh0KSB7XG4gICAgICB3aGlsZSAoMSkge1xuICAgICAgICBzd2l0Y2ggKF9jb250ZXh0LnByZXYgPSBfY29udGV4dC5uZXh0KSB7XG4gICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgc3RhcnQgPSBfYXJncy5sZW5ndGggPiAxICYmIF9hcmdzWzFdICE9PSB1bmRlZmluZWQgPyBfYXJnc1sxXSA6IDA7XG4gICAgICAgICAgICBlbmQgPSBfYXJncy5sZW5ndGggPiAyICYmIF9hcmdzWzJdICE9PSB1bmRlZmluZWQgPyBfYXJnc1syXSA6IEluZmluaXR5O1xuICAgICAgICAgICAgc3RlcCA9IF9hcmdzLmxlbmd0aCA+IDMgJiYgX2FyZ3NbM10gIT09IHVuZGVmaW5lZCA/IF9hcmdzWzNdIDogMTtcbiAgICAgICAgICAgIGN1cnJlbnRQb3MgPSAwO1xuICAgICAgICAgICAgbmV4dFZhbGlkUG9zID0gc3RhcnQ7XG4gICAgICAgICAgICBidWZmZXJTaXplID0gTWF0aC5hYnMoZW5kKTtcbiAgICAgICAgICAgIGNvdW50ZXIgPSAwO1xuXG4gICAgICAgICAgICBpZiAoZW5kIDwgMCkge1xuICAgICAgICAgICAgICBidWZmZXIgPSBuZXcgQ2lyY3VsYXJCdWZmZXIoYnVmZmVyU2l6ZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24gPSB0cnVlO1xuICAgICAgICAgICAgX2RpZEl0ZXJhdG9yRXJyb3IgPSBmYWxzZTtcbiAgICAgICAgICAgIF9jb250ZXh0LnByZXYgPSAxMDtcbiAgICAgICAgICAgIF9pdGVyYXRvciA9IF9hc3luY0l0ZXJhdG9yKHNvdXJjZSk7XG5cbiAgICAgICAgICBjYXNlIDEyOlxuICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDE0O1xuICAgICAgICAgICAgcmV0dXJuIF9hd2FpdEFzeW5jR2VuZXJhdG9yKF9pdGVyYXRvci5uZXh0KCkpO1xuXG4gICAgICAgICAgY2FzZSAxNDpcbiAgICAgICAgICAgIF9zdGVwID0gX2NvbnRleHQuc2VudDtcbiAgICAgICAgICAgIF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24gPSBfc3RlcC5kb25lO1xuICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDE4O1xuICAgICAgICAgICAgcmV0dXJuIF9hd2FpdEFzeW5jR2VuZXJhdG9yKF9zdGVwLnZhbHVlKTtcblxuICAgICAgICAgIGNhc2UgMTg6XG4gICAgICAgICAgICBfdmFsdWUgPSBfY29udGV4dC5zZW50O1xuXG4gICAgICAgICAgICBpZiAoX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbikge1xuICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMzY7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YWx1ZSA9IF92YWx1ZTtcblxuICAgICAgICAgICAgaWYgKCFidWZmZXIpIHtcbiAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDI2O1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFsdWUgPSBidWZmZXIucHVzaCh2YWx1ZSk7XG4gICAgICAgICAgICBjb3VudGVyKys7XG5cbiAgICAgICAgICAgIGlmICghKGNvdW50ZXIgPD0gYnVmZmVyU2l6ZSkpIHtcbiAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDI2O1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LmFicnVwdChcImNvbnRpbnVlXCIsIDMzKTtcblxuICAgICAgICAgIGNhc2UgMjY6XG4gICAgICAgICAgICBpZiAoIShjdXJyZW50UG9zID49IGVuZCAmJiBlbmQgPj0gMCkpIHtcbiAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDI4O1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LmFicnVwdChcImJyZWFrXCIsIDM2KTtcblxuICAgICAgICAgIGNhc2UgMjg6XG4gICAgICAgICAgICBpZiAoIShuZXh0VmFsaWRQb3MgPT09IGN1cnJlbnRQb3MpKSB7XG4gICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAzMjtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAzMTtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcblxuICAgICAgICAgIGNhc2UgMzE6XG4gICAgICAgICAgICBuZXh0VmFsaWRQb3MgKz0gc3RlcDtcblxuICAgICAgICAgIGNhc2UgMzI6XG4gICAgICAgICAgICBjdXJyZW50UG9zKys7XG5cbiAgICAgICAgICBjYXNlIDMzOlxuICAgICAgICAgICAgX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbiA9IHRydWU7XG4gICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMTI7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgMzY6XG4gICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gNDI7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgMzg6XG4gICAgICAgICAgICBfY29udGV4dC5wcmV2ID0gMzg7XG4gICAgICAgICAgICBfY29udGV4dC50MCA9IF9jb250ZXh0W1wiY2F0Y2hcIl0oMTApO1xuICAgICAgICAgICAgX2RpZEl0ZXJhdG9yRXJyb3IgPSB0cnVlO1xuICAgICAgICAgICAgX2l0ZXJhdG9yRXJyb3IgPSBfY29udGV4dC50MDtcblxuICAgICAgICAgIGNhc2UgNDI6XG4gICAgICAgICAgICBfY29udGV4dC5wcmV2ID0gNDI7XG4gICAgICAgICAgICBfY29udGV4dC5wcmV2ID0gNDM7XG5cbiAgICAgICAgICAgIGlmICghKCFfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uICYmIF9pdGVyYXRvcltcInJldHVyblwiXSAhPSBudWxsKSkge1xuICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gNDc7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gNDc7XG4gICAgICAgICAgICByZXR1cm4gX2F3YWl0QXN5bmNHZW5lcmF0b3IoX2l0ZXJhdG9yW1wicmV0dXJuXCJdKCkpO1xuXG4gICAgICAgICAgY2FzZSA0NzpcbiAgICAgICAgICAgIF9jb250ZXh0LnByZXYgPSA0NztcblxuICAgICAgICAgICAgaWYgKCFfZGlkSXRlcmF0b3JFcnJvcikge1xuICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gNTA7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aHJvdyBfaXRlcmF0b3JFcnJvcjtcblxuICAgICAgICAgIGNhc2UgNTA6XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuZmluaXNoKDQ3KTtcblxuICAgICAgICAgIGNhc2UgNTE6XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuZmluaXNoKDQyKTtcblxuICAgICAgICAgIGNhc2UgNTI6XG4gICAgICAgICAgY2FzZSBcImVuZFwiOlxuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LnN0b3AoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sIF9jYWxsZWUsIG51bGwsIFtbMTAsIDM4LCA0MiwgNTJdLCBbNDMsLCA0NywgNTFdXSk7XG4gIH0pKTtcbiAgcmV0dXJuIF9hc3luY1NsaWNlRnJvbVN0YXJ0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5cbmZ1bmN0aW9uIGFzeW5jQnVmZmVyZWRTbGljZShfeDMsIF94NCwgX3g1LCBfeDYpIHtcbiAgcmV0dXJuIF9hc3luY0J1ZmZlcmVkU2xpY2UuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cblxuZnVuY3Rpb24gX2FzeW5jQnVmZmVyZWRTbGljZSgpIHtcbiAgX2FzeW5jQnVmZmVyZWRTbGljZSA9IF9hc3luY1RvR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yUnVudGltZS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUzKHNvdXJjZSwgc3RhcnQsIGVuZCwgc3RlcCkge1xuICAgIHZhciBidWZmZXJTaXplLCBidWZmZXIsIGNvdW50ZXIsIF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24yLCBfZGlkSXRlcmF0b3JFcnJvcjIsIF9pdGVyYXRvckVycm9yMiwgX2l0ZXJhdG9yMiwgX3N0ZXAyLCBfdmFsdWUyLCB2YWx1ZSwgbmV3RW5kO1xuXG4gICAgcmV0dXJuIF9yZWdlbmVyYXRvclJ1bnRpbWUud3JhcChmdW5jdGlvbiBfY2FsbGVlMyQoX2NvbnRleHQzKSB7XG4gICAgICB3aGlsZSAoMSkge1xuICAgICAgICBzd2l0Y2ggKF9jb250ZXh0My5wcmV2ID0gX2NvbnRleHQzLm5leHQpIHtcbiAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICBidWZmZXJTaXplID0gTWF0aC5hYnMoc3RhcnQpO1xuICAgICAgICAgICAgYnVmZmVyID0gbmV3IENpcmN1bGFyQnVmZmVyKGJ1ZmZlclNpemUpO1xuICAgICAgICAgICAgY291bnRlciA9IDA7XG4gICAgICAgICAgICBfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uMiA9IHRydWU7XG4gICAgICAgICAgICBfZGlkSXRlcmF0b3JFcnJvcjIgPSBmYWxzZTtcbiAgICAgICAgICAgIF9jb250ZXh0My5wcmV2ID0gNTtcbiAgICAgICAgICAgIF9pdGVyYXRvcjIgPSBfYXN5bmNJdGVyYXRvcihzb3VyY2UpO1xuXG4gICAgICAgICAgY2FzZSA3OlxuICAgICAgICAgICAgX2NvbnRleHQzLm5leHQgPSA5O1xuICAgICAgICAgICAgcmV0dXJuIF9pdGVyYXRvcjIubmV4dCgpO1xuXG4gICAgICAgICAgY2FzZSA5OlxuICAgICAgICAgICAgX3N0ZXAyID0gX2NvbnRleHQzLnNlbnQ7XG4gICAgICAgICAgICBfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uMiA9IF9zdGVwMi5kb25lO1xuICAgICAgICAgICAgX2NvbnRleHQzLm5leHQgPSAxMztcbiAgICAgICAgICAgIHJldHVybiBfc3RlcDIudmFsdWU7XG5cbiAgICAgICAgICBjYXNlIDEzOlxuICAgICAgICAgICAgX3ZhbHVlMiA9IF9jb250ZXh0My5zZW50O1xuXG4gICAgICAgICAgICBpZiAoX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbjIpIHtcbiAgICAgICAgICAgICAgX2NvbnRleHQzLm5leHQgPSAyMTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhbHVlID0gX3ZhbHVlMjtcbiAgICAgICAgICAgIGJ1ZmZlci5wdXNoKHZhbHVlKTtcbiAgICAgICAgICAgIGNvdW50ZXIrKztcblxuICAgICAgICAgIGNhc2UgMTg6XG4gICAgICAgICAgICBfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uMiA9IHRydWU7XG4gICAgICAgICAgICBfY29udGV4dDMubmV4dCA9IDc7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgMjE6XG4gICAgICAgICAgICBfY29udGV4dDMubmV4dCA9IDI3O1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlIDIzOlxuICAgICAgICAgICAgX2NvbnRleHQzLnByZXYgPSAyMztcbiAgICAgICAgICAgIF9jb250ZXh0My50MCA9IF9jb250ZXh0M1tcImNhdGNoXCJdKDUpO1xuICAgICAgICAgICAgX2RpZEl0ZXJhdG9yRXJyb3IyID0gdHJ1ZTtcbiAgICAgICAgICAgIF9pdGVyYXRvckVycm9yMiA9IF9jb250ZXh0My50MDtcblxuICAgICAgICAgIGNhc2UgMjc6XG4gICAgICAgICAgICBfY29udGV4dDMucHJldiA9IDI3O1xuICAgICAgICAgICAgX2NvbnRleHQzLnByZXYgPSAyODtcblxuICAgICAgICAgICAgaWYgKCEoIV9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24yICYmIF9pdGVyYXRvcjJbXCJyZXR1cm5cIl0gIT0gbnVsbCkpIHtcbiAgICAgICAgICAgICAgX2NvbnRleHQzLm5leHQgPSAzMjtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIF9jb250ZXh0My5uZXh0ID0gMzI7XG4gICAgICAgICAgICByZXR1cm4gX2l0ZXJhdG9yMltcInJldHVyblwiXSgpO1xuXG4gICAgICAgICAgY2FzZSAzMjpcbiAgICAgICAgICAgIF9jb250ZXh0My5wcmV2ID0gMzI7XG5cbiAgICAgICAgICAgIGlmICghX2RpZEl0ZXJhdG9yRXJyb3IyKSB7XG4gICAgICAgICAgICAgIF9jb250ZXh0My5uZXh0ID0gMzU7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aHJvdyBfaXRlcmF0b3JFcnJvcjI7XG5cbiAgICAgICAgICBjYXNlIDM1OlxuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0My5maW5pc2goMzIpO1xuXG4gICAgICAgICAgY2FzZSAzNjpcbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dDMuZmluaXNoKDI3KTtcblxuICAgICAgICAgIGNhc2UgMzc6XG4gICAgICAgICAgICBpZiAoIShpc0Zpbml0ZShlbmQpICYmIGVuZCA+IDApKSB7XG4gICAgICAgICAgICAgIF9jb250ZXh0My5uZXh0ID0gNDM7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBuZXdFbmQgPSBlbmQgLSAoY291bnRlciAtIGJ1ZmZlci5zaXplKTtcblxuICAgICAgICAgICAgaWYgKCEobmV3RW5kIDwgMCkpIHtcbiAgICAgICAgICAgICAgX2NvbnRleHQzLm5leHQgPSA0MTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dDMuYWJydXB0KFwicmV0dXJuXCIsIFtdKTtcblxuICAgICAgICAgIGNhc2UgNDE6XG4gICAgICAgICAgICBfY29udGV4dDMubmV4dCA9IDQ0O1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlIDQzOlxuICAgICAgICAgICAgbmV3RW5kID0gZW5kO1xuXG4gICAgICAgICAgY2FzZSA0NDpcbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dDMuYWJydXB0KFwicmV0dXJuXCIsIF9fYXN5bmNTbGljZUZyb21TdGFydChidWZmZXIsIDAsIG5ld0VuZCwgc3RlcCkpO1xuXG4gICAgICAgICAgY2FzZSA0NTpcbiAgICAgICAgICBjYXNlIFwiZW5kXCI6XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQzLnN0b3AoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sIF9jYWxsZWUzLCBudWxsLCBbWzUsIDIzLCAyNywgMzddLCBbMjgsLCAzMiwgMzZdXSk7XG4gIH0pKTtcbiAgcmV0dXJuIF9hc3luY0J1ZmZlcmVkU2xpY2UuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cblxuZnVuY3Rpb24gX19hc3luY1NsaWNlKF94Mikge1xuICByZXR1cm4gX2FzeW5jU2xpY2UuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cblxuZXhwb3J0cy5fX2FzeW5jU2xpY2UgPSBfX2FzeW5jU2xpY2U7XG5cbmZ1bmN0aW9uIF9hc3luY1NsaWNlKCkge1xuICBfYXN5bmNTbGljZSA9IF93cmFwQXN5bmNHZW5lcmF0b3IoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3JSdW50aW1lLm1hcmsoZnVuY3Rpb24gX2NhbGxlZTIoc291cmNlKSB7XG4gICAgdmFyIHN0YXJ0LFxuICAgICAgICBlbmQsXG4gICAgICAgIHN0ZXAsXG4gICAgICAgIF9hcmdzMiA9IGFyZ3VtZW50cztcbiAgICByZXR1cm4gX3JlZ2VuZXJhdG9yUnVudGltZS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUyJChfY29udGV4dDIpIHtcbiAgICAgIHdoaWxlICgxKSB7XG4gICAgICAgIHN3aXRjaCAoX2NvbnRleHQyLnByZXYgPSBfY29udGV4dDIubmV4dCkge1xuICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgIHN0YXJ0ID0gX2FyZ3MyLmxlbmd0aCA+IDEgJiYgX2FyZ3MyWzFdICE9PSB1bmRlZmluZWQgPyBfYXJnczJbMV0gOiAwO1xuICAgICAgICAgICAgZW5kID0gX2FyZ3MyLmxlbmd0aCA+IDIgJiYgX2FyZ3MyWzJdICE9PSB1bmRlZmluZWQgPyBfYXJnczJbMl0gOiBJbmZpbml0eTtcbiAgICAgICAgICAgIHN0ZXAgPSBfYXJnczIubGVuZ3RoID4gMyAmJiBfYXJnczJbM10gIT09IHVuZGVmaW5lZCA/IF9hcmdzMlszXSA6IDE7XG5cbiAgICAgICAgICAgIGlmICghKHN0YXJ0ID49IDApKSB7XG4gICAgICAgICAgICAgIF9jb250ZXh0Mi5uZXh0ID0gNztcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dDIuZGVsZWdhdGVZaWVsZChfYXN5bmNHZW5lcmF0b3JEZWxlZ2F0ZShfYXN5bmNJdGVyYXRvcihfX2FzeW5jU2xpY2VGcm9tU3RhcnQoc291cmNlLCBzdGFydCwgZW5kLCBzdGVwKSksIF9hd2FpdEFzeW5jR2VuZXJhdG9yKSwgXCJ0MFwiLCA1KTtcblxuICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgIF9jb250ZXh0Mi5uZXh0ID0gMTU7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgNzpcbiAgICAgICAgICAgIF9jb250ZXh0Mi50MSA9IF9hc3luY0dlbmVyYXRvckRlbGVnYXRlO1xuICAgICAgICAgICAgX2NvbnRleHQyLnQyID0gX2FzeW5jSXRlcmF0b3I7XG4gICAgICAgICAgICBfY29udGV4dDIubmV4dCA9IDExO1xuICAgICAgICAgICAgcmV0dXJuIF9hd2FpdEFzeW5jR2VuZXJhdG9yKGFzeW5jQnVmZmVyZWRTbGljZShzb3VyY2UsIHN0YXJ0LCBlbmQsIHN0ZXApKTtcblxuICAgICAgICAgIGNhc2UgMTE6XG4gICAgICAgICAgICBfY29udGV4dDIudDMgPSBfY29udGV4dDIuc2VudDtcbiAgICAgICAgICAgIF9jb250ZXh0Mi50NCA9ICgwLCBfY29udGV4dDIudDIpKF9jb250ZXh0Mi50Myk7XG4gICAgICAgICAgICBfY29udGV4dDIudDUgPSBfYXdhaXRBc3luY0dlbmVyYXRvcjtcbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dDIuZGVsZWdhdGVZaWVsZCgoMCwgX2NvbnRleHQyLnQxKShfY29udGV4dDIudDQsIF9jb250ZXh0Mi50NSksIFwidDZcIiwgMTUpO1xuXG4gICAgICAgICAgY2FzZSAxNTpcbiAgICAgICAgICBjYXNlIFwiZW5kXCI6XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQyLnN0b3AoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sIF9jYWxsZWUyKTtcbiAgfSkpO1xuICByZXR1cm4gX2FzeW5jU2xpY2UuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cblxudmFyIGFzeW5jU2xpY2UgPSAvKiNfX1BVUkVfXyovYXN5bmNJdGVyYWJsZUN1cnJ5KF9fYXN5bmNTbGljZSwge1xuICB2YWxpZGF0ZUFyZ3M6IC8qI19fUFVSRV9fKi9tYWtlVmFsaWRhdGVBcmdzKCdhc3luY1NsaWNlJyksXG4gIGdyb3dSaWdodDogdHJ1ZSxcbiAgbWluQXJnczogMCxcbiAgbWF4QXJnczogM1xufSk7XG5leHBvcnRzLmFzeW5jU2xpY2UgPSBhc3luY1NsaWNlOyIsInZhciBfc2xpY2VkVG9BcnJheSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3NsaWNlZFRvQXJyYXlcIik7XG5cbnZhciBfcmVxdWlyZSA9IHJlcXVpcmUoJy4uLy4uLy4uL2ludGVybmFsL251bWJlci5qcycpLFxuICAgIGlzSW50ZWdlciA9IF9yZXF1aXJlLmlzSW50ZWdlcixcbiAgICBpc1Bvc2l0aXZlSW50ZWdlciA9IF9yZXF1aXJlLmlzUG9zaXRpdmVJbnRlZ2VyLFxuICAgIGlzSW50ZWdlck9ySW5maW5pdGUgPSBfcmVxdWlyZS5pc0ludGVnZXJPckluZmluaXRlO1xuXG52YXIgX3JlcXVpcmUyID0gcmVxdWlyZSgnLi4vLi4vaXMtb2JqZWN0L2lzLW9iamVjdC5qcycpLFxuICAgIGlzT2JqZWN0ID0gX3JlcXVpcmUyLmlzT2JqZWN0O1xuXG52YXIgbWFrZVZhbGlkYXRlQXJncyA9IGZ1bmN0aW9uIG1ha2VWYWxpZGF0ZUFyZ3MobWV0aG9kTmFtZSkge1xuICByZXR1cm4gZnVuY3Rpb24gdmFsaWRhdGVBcmdzKGFyZ3MpIHtcbiAgICB2YXIgX2FyZ3MgPSBfc2xpY2VkVG9BcnJheShhcmdzLCA0KSxcbiAgICAgICAgX2FyZ3MkID0gX2FyZ3NbMV0sXG4gICAgICAgIG9wdHNPclN0YXJ0ID0gX2FyZ3MkID09PSB2b2lkIDAgPyAwIDogX2FyZ3MkLFxuICAgICAgICBfYXJncyQyID0gX2FyZ3NbMl0sXG4gICAgICAgIGVuZCA9IF9hcmdzJDIgPT09IHZvaWQgMCA/IEluZmluaXR5IDogX2FyZ3MkMixcbiAgICAgICAgX2FyZ3MkMyA9IF9hcmdzWzNdLFxuICAgICAgICBzdGVwID0gX2FyZ3MkMyA9PT0gdm9pZCAwID8gMSA6IF9hcmdzJDM7XG5cbiAgICB2YXIgc3RhcnQgPSB0eXBlb2Ygb3B0c09yU3RhcnQgPT09ICdudW1iZXInID8gb3B0c09yU3RhcnQgOiB1bmRlZmluZWQ7XG5cbiAgICBpZiAoaXNPYmplY3Qob3B0c09yU3RhcnQpKSB7XG4gICAgICB2YXIgX29wdHNPclN0YXJ0JHN0YXJ0ID0gb3B0c09yU3RhcnQuc3RhcnQ7XG4gICAgICBzdGFydCA9IF9vcHRzT3JTdGFydCRzdGFydCA9PT0gdm9pZCAwID8gMCA6IF9vcHRzT3JTdGFydCRzdGFydDtcbiAgICAgIHZhciBfb3B0c09yU3RhcnQkZW5kID0gb3B0c09yU3RhcnQuZW5kO1xuICAgICAgZW5kID0gX29wdHNPclN0YXJ0JGVuZCA9PT0gdm9pZCAwID8gSW5maW5pdHkgOiBfb3B0c09yU3RhcnQkZW5kO1xuICAgICAgdmFyIF9vcHRzT3JTdGFydCRzdGVwID0gb3B0c09yU3RhcnQuc3RlcDtcbiAgICAgIHN0ZXAgPSBfb3B0c09yU3RhcnQkc3RlcCA9PT0gdm9pZCAwID8gMSA6IF9vcHRzT3JTdGFydCRzdGVwO1xuICAgIH1cblxuICAgIGlmICghaXNJbnRlZ2VyKHN0YXJ0KSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcInN0YXJ0IGFyZ3VtZW50IHRvIFwiLmNvbmNhdChtZXRob2ROYW1lLCBcIiBtdXN0IGJlIGEgbnVtYmVyXCIpKTtcbiAgICB9XG5cbiAgICBpZiAoIWlzSW50ZWdlck9ySW5maW5pdGUoZW5kKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcImVuZCBhcmd1bWVudCB0byBcIi5jb25jYXQobWV0aG9kTmFtZSwgXCIgbXVzdCBiZSBhbiBpbnRlZ2VyIG9yIGluZmludGVcIikpO1xuICAgIH1cblxuICAgIGlmICghaXNQb3NpdGl2ZUludGVnZXIoc3RlcCkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJzdGVwIGFyZ3VtZW50IHRvIFwiLmNvbmNhdChtZXRob2ROYW1lLCBcIiBtdXN0IGJlIGEgaW50ZWdlciA+IDBcIikpO1xuICAgIH1cblxuICAgIGFyZ3NbMV0gPSBzdGFydDtcbiAgICBhcmdzWzJdID0gZW5kO1xuICAgIGFyZ3NbM10gPSBzdGVwO1xuICB9O1xufTtcblxuZXhwb3J0cy5tYWtlVmFsaWRhdGVBcmdzID0gbWFrZVZhbGlkYXRlQXJnczsiLCJ2YXIgX3JlZ2VuZXJhdG9yUnVudGltZSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9yZWdlbmVyYXRvclwiKTtcblxudmFyIF9tYXJrZWQgPSAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yUnVudGltZS5tYXJrKF9fc2xpY2VGcm9tU3RhcnQpLFxuICAgIF9tYXJrZWQyID0gLyojX19QVVJFX18qL19yZWdlbmVyYXRvclJ1bnRpbWUubWFyayhfX3NsaWNlKTtcblxuZnVuY3Rpb24gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIobywgYWxsb3dBcnJheUxpa2UpIHsgdmFyIGl0OyBpZiAodHlwZW9mIFN5bWJvbCA9PT0gXCJ1bmRlZmluZWRcIiB8fCBvW1N5bWJvbC5pdGVyYXRvcl0gPT0gbnVsbCkgeyBpZiAoQXJyYXkuaXNBcnJheShvKSB8fCAoaXQgPSBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkobykpIHx8IGFsbG93QXJyYXlMaWtlICYmIG8gJiYgdHlwZW9mIG8ubGVuZ3RoID09PSBcIm51bWJlclwiKSB7IGlmIChpdCkgbyA9IGl0OyB2YXIgaSA9IDA7IHZhciBGID0gZnVuY3Rpb24gRigpIHt9OyByZXR1cm4geyBzOiBGLCBuOiBmdW5jdGlvbiBuKCkgeyBpZiAoaSA+PSBvLmxlbmd0aCkgcmV0dXJuIHsgZG9uZTogdHJ1ZSB9OyByZXR1cm4geyBkb25lOiBmYWxzZSwgdmFsdWU6IG9baSsrXSB9OyB9LCBlOiBmdW5jdGlvbiBlKF9lKSB7IHRocm93IF9lOyB9LCBmOiBGIH07IH0gdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBpdGVyYXRlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpOyB9IHZhciBub3JtYWxDb21wbGV0aW9uID0gdHJ1ZSwgZGlkRXJyID0gZmFsc2UsIGVycjsgcmV0dXJuIHsgczogZnVuY3Rpb24gcygpIHsgaXQgPSBvW1N5bWJvbC5pdGVyYXRvcl0oKTsgfSwgbjogZnVuY3Rpb24gbigpIHsgdmFyIHN0ZXAgPSBpdC5uZXh0KCk7IG5vcm1hbENvbXBsZXRpb24gPSBzdGVwLmRvbmU7IHJldHVybiBzdGVwOyB9LCBlOiBmdW5jdGlvbiBlKF9lMikgeyBkaWRFcnIgPSB0cnVlOyBlcnIgPSBfZTI7IH0sIGY6IGZ1bmN0aW9uIGYoKSB7IHRyeSB7IGlmICghbm9ybWFsQ29tcGxldGlvbiAmJiBpdFtcInJldHVyblwiXSAhPSBudWxsKSBpdFtcInJldHVyblwiXSgpOyB9IGZpbmFsbHkgeyBpZiAoZGlkRXJyKSB0aHJvdyBlcnI7IH0gfSB9OyB9XG5cbmZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvLCBtaW5MZW4pIHsgaWYgKCFvKSByZXR1cm47IGlmICh0eXBlb2YgbyA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IHZhciBuID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pLnNsaWNlKDgsIC0xKTsgaWYgKG4gPT09IFwiT2JqZWN0XCIgJiYgby5jb25zdHJ1Y3RvcikgbiA9IG8uY29uc3RydWN0b3IubmFtZTsgaWYgKG4gPT09IFwiTWFwXCIgfHwgbiA9PT0gXCJTZXRcIikgcmV0dXJuIEFycmF5LmZyb20obyk7IGlmIChuID09PSBcIkFyZ3VtZW50c1wiIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTsgfVxuXG5mdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheShhcnIsIGxlbikgeyBpZiAobGVuID09IG51bGwgfHwgbGVuID4gYXJyLmxlbmd0aCkgbGVuID0gYXJyLmxlbmd0aDsgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkobGVuKTsgaSA8IGxlbjsgaSsrKSB7IGFycjJbaV0gPSBhcnJbaV07IH0gcmV0dXJuIGFycjI7IH1cblxudmFyIF9yZXF1aXJlID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWwvY2lyY3VsYXItYnVmZmVyLmpzJyksXG4gICAgQ2lyY3VsYXJCdWZmZXIgPSBfcmVxdWlyZS5DaXJjdWxhckJ1ZmZlcjtcblxudmFyIF9yZXF1aXJlMiA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFsL2l0ZXJhYmxlLmpzJyksXG4gICAgaXRlcmFibGVDdXJyeSA9IF9yZXF1aXJlMi5pdGVyYWJsZUN1cnJ5O1xuXG52YXIgX3JlcXVpcmUzID0gcmVxdWlyZSgnLi9pbnRlcm5hbC92YWxpZGF0ZS1hcmdzLmpzJyksXG4gICAgbWFrZVZhbGlkYXRlQXJncyA9IF9yZXF1aXJlMy5tYWtlVmFsaWRhdGVBcmdzO1xuXG5mdW5jdGlvbiBfX3NsaWNlRnJvbVN0YXJ0KHNvdXJjZSkge1xuICB2YXIgc3RhcnQsXG4gICAgICBlbmQsXG4gICAgICBzdGVwLFxuICAgICAgY3VycmVudFBvcyxcbiAgICAgIG5leHRWYWxpZFBvcyxcbiAgICAgIGJ1ZmZlclNpemUsXG4gICAgICBidWZmZXIsXG4gICAgICBjb3VudGVyLFxuICAgICAgX2l0ZXJhdG9yMixcbiAgICAgIF9zdGVwMixcbiAgICAgIHZhbHVlLFxuICAgICAgX2FyZ3MgPSBhcmd1bWVudHM7XG5cbiAgcmV0dXJuIF9yZWdlbmVyYXRvclJ1bnRpbWUud3JhcChmdW5jdGlvbiBfX3NsaWNlRnJvbVN0YXJ0JChfY29udGV4dCkge1xuICAgIHdoaWxlICgxKSB7XG4gICAgICBzd2l0Y2ggKF9jb250ZXh0LnByZXYgPSBfY29udGV4dC5uZXh0KSB7XG4gICAgICAgIGNhc2UgMDpcbiAgICAgICAgICBzdGFydCA9IF9hcmdzLmxlbmd0aCA+IDEgJiYgX2FyZ3NbMV0gIT09IHVuZGVmaW5lZCA/IF9hcmdzWzFdIDogMDtcbiAgICAgICAgICBlbmQgPSBfYXJncy5sZW5ndGggPiAyICYmIF9hcmdzWzJdICE9PSB1bmRlZmluZWQgPyBfYXJnc1syXSA6IEluZmluaXR5O1xuICAgICAgICAgIHN0ZXAgPSBfYXJncy5sZW5ndGggPiAzICYmIF9hcmdzWzNdICE9PSB1bmRlZmluZWQgPyBfYXJnc1szXSA6IDE7XG4gICAgICAgICAgY3VycmVudFBvcyA9IDA7XG4gICAgICAgICAgbmV4dFZhbGlkUG9zID0gc3RhcnQ7XG4gICAgICAgICAgYnVmZmVyU2l6ZSA9IE1hdGguYWJzKGVuZCk7XG4gICAgICAgICAgY291bnRlciA9IDA7XG5cbiAgICAgICAgICBpZiAoZW5kIDwgMCkge1xuICAgICAgICAgICAgYnVmZmVyID0gbmV3IENpcmN1bGFyQnVmZmVyKGJ1ZmZlclNpemUpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIF9pdGVyYXRvcjIgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihzb3VyY2UpO1xuICAgICAgICAgIF9jb250ZXh0LnByZXYgPSA5O1xuXG4gICAgICAgICAgX2l0ZXJhdG9yMi5zKCk7XG5cbiAgICAgICAgY2FzZSAxMTpcbiAgICAgICAgICBpZiAoKF9zdGVwMiA9IF9pdGVyYXRvcjIubigpKS5kb25lKSB7XG4gICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMjc7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YWx1ZSA9IF9zdGVwMi52YWx1ZTtcblxuICAgICAgICAgIGlmICghYnVmZmVyKSB7XG4gICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMTg7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YWx1ZSA9IGJ1ZmZlci5wdXNoKHZhbHVlKTtcbiAgICAgICAgICBjb3VudGVyKys7XG5cbiAgICAgICAgICBpZiAoIShjb3VudGVyIDw9IGJ1ZmZlclNpemUpKSB7XG4gICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMTg7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gX2NvbnRleHQuYWJydXB0KFwiY29udGludWVcIiwgMjUpO1xuXG4gICAgICAgIGNhc2UgMTg6XG4gICAgICAgICAgaWYgKCEoY3VycmVudFBvcyA+PSBlbmQgJiYgZW5kID49IDApKSB7XG4gICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMjA7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gX2NvbnRleHQuYWJydXB0KFwiYnJlYWtcIiwgMjcpO1xuXG4gICAgICAgIGNhc2UgMjA6XG4gICAgICAgICAgaWYgKCEobmV4dFZhbGlkUG9zID09PSBjdXJyZW50UG9zKSkge1xuICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDI0O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgX2NvbnRleHQubmV4dCA9IDIzO1xuICAgICAgICAgIHJldHVybiB2YWx1ZTtcblxuICAgICAgICBjYXNlIDIzOlxuICAgICAgICAgIG5leHRWYWxpZFBvcyArPSBzdGVwO1xuXG4gICAgICAgIGNhc2UgMjQ6XG4gICAgICAgICAgY3VycmVudFBvcysrO1xuXG4gICAgICAgIGNhc2UgMjU6XG4gICAgICAgICAgX2NvbnRleHQubmV4dCA9IDExO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgMjc6XG4gICAgICAgICAgX2NvbnRleHQubmV4dCA9IDMyO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgMjk6XG4gICAgICAgICAgX2NvbnRleHQucHJldiA9IDI5O1xuICAgICAgICAgIF9jb250ZXh0LnQwID0gX2NvbnRleHRbXCJjYXRjaFwiXSg5KTtcblxuICAgICAgICAgIF9pdGVyYXRvcjIuZShfY29udGV4dC50MCk7XG5cbiAgICAgICAgY2FzZSAzMjpcbiAgICAgICAgICBfY29udGV4dC5wcmV2ID0gMzI7XG5cbiAgICAgICAgICBfaXRlcmF0b3IyLmYoKTtcblxuICAgICAgICAgIHJldHVybiBfY29udGV4dC5maW5pc2goMzIpO1xuXG4gICAgICAgIGNhc2UgMzU6XG4gICAgICAgIGNhc2UgXCJlbmRcIjpcbiAgICAgICAgICByZXR1cm4gX2NvbnRleHQuc3RvcCgpO1xuICAgICAgfVxuICAgIH1cbiAgfSwgX21hcmtlZCwgbnVsbCwgW1s5LCAyOSwgMzIsIDM1XV0pO1xufVxuXG5leHBvcnRzLl9fc2xpY2VGcm9tU3RhcnQgPSBfX3NsaWNlRnJvbVN0YXJ0O1xuXG5mdW5jdGlvbiBidWZmZXJlZFNsaWNlKHNvdXJjZSwgc3RhcnQsIGVuZCwgc3RlcCkge1xuICB2YXIgYnVmZmVyU2l6ZSA9IE1hdGguYWJzKHN0YXJ0KTtcbiAgdmFyIGJ1ZmZlciA9IG5ldyBDaXJjdWxhckJ1ZmZlcihidWZmZXJTaXplKTtcbiAgdmFyIGNvdW50ZXIgPSAwO1xuXG4gIHZhciBfaXRlcmF0b3IgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihzb3VyY2UpLFxuICAgICAgX3N0ZXA7XG5cbiAgdHJ5IHtcbiAgICBmb3IgKF9pdGVyYXRvci5zKCk7ICEoX3N0ZXAgPSBfaXRlcmF0b3IubigpKS5kb25lOykge1xuICAgICAgdmFyIHZhbHVlID0gX3N0ZXAudmFsdWU7XG4gICAgICBidWZmZXIucHVzaCh2YWx1ZSk7XG4gICAgICBjb3VudGVyKys7XG4gICAgfVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBfaXRlcmF0b3IuZShlcnIpO1xuICB9IGZpbmFsbHkge1xuICAgIF9pdGVyYXRvci5mKCk7XG4gIH1cblxuICB2YXIgbmV3RW5kO1xuXG4gIGlmIChpc0Zpbml0ZShlbmQpICYmIGVuZCA+IDApIHtcbiAgICBuZXdFbmQgPSBlbmQgLSAoY291bnRlciAtIGJ1ZmZlci5zaXplKTtcbiAgICBpZiAobmV3RW5kIDwgMCkgcmV0dXJuIFtdO1xuICB9IGVsc2Uge1xuICAgIG5ld0VuZCA9IGVuZDtcbiAgfVxuXG4gIHJldHVybiBfX3NsaWNlRnJvbVN0YXJ0KGJ1ZmZlciwgMCwgbmV3RW5kLCBzdGVwKTtcbn1cblxuZnVuY3Rpb24gX19zbGljZShzb3VyY2UpIHtcbiAgdmFyIHN0YXJ0LFxuICAgICAgZW5kLFxuICAgICAgc3RlcCxcbiAgICAgIF9hcmdzMiA9IGFyZ3VtZW50cztcbiAgcmV0dXJuIF9yZWdlbmVyYXRvclJ1bnRpbWUud3JhcChmdW5jdGlvbiBfX3NsaWNlJChfY29udGV4dDIpIHtcbiAgICB3aGlsZSAoMSkge1xuICAgICAgc3dpdGNoIChfY29udGV4dDIucHJldiA9IF9jb250ZXh0Mi5uZXh0KSB7XG4gICAgICAgIGNhc2UgMDpcbiAgICAgICAgICBzdGFydCA9IF9hcmdzMi5sZW5ndGggPiAxICYmIF9hcmdzMlsxXSAhPT0gdW5kZWZpbmVkID8gX2FyZ3MyWzFdIDogMDtcbiAgICAgICAgICBlbmQgPSBfYXJnczIubGVuZ3RoID4gMiAmJiBfYXJnczJbMl0gIT09IHVuZGVmaW5lZCA/IF9hcmdzMlsyXSA6IEluZmluaXR5O1xuICAgICAgICAgIHN0ZXAgPSBfYXJnczIubGVuZ3RoID4gMyAmJiBfYXJnczJbM10gIT09IHVuZGVmaW5lZCA/IF9hcmdzMlszXSA6IDE7XG5cbiAgICAgICAgICBpZiAoIShzdGFydCA+PSAwKSkge1xuICAgICAgICAgICAgX2NvbnRleHQyLm5leHQgPSA3O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIF9jb250ZXh0Mi5kZWxlZ2F0ZVlpZWxkKF9fc2xpY2VGcm9tU3RhcnQoc291cmNlLCBzdGFydCwgZW5kLCBzdGVwKSwgXCJ0MFwiLCA1KTtcblxuICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgX2NvbnRleHQyLm5leHQgPSA4O1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgNzpcbiAgICAgICAgICByZXR1cm4gX2NvbnRleHQyLmRlbGVnYXRlWWllbGQoYnVmZmVyZWRTbGljZShzb3VyY2UsIHN0YXJ0LCBlbmQsIHN0ZXApLCBcInQxXCIsIDgpO1xuXG4gICAgICAgIGNhc2UgODpcbiAgICAgICAgY2FzZSBcImVuZFwiOlxuICAgICAgICAgIHJldHVybiBfY29udGV4dDIuc3RvcCgpO1xuICAgICAgfVxuICAgIH1cbiAgfSwgX21hcmtlZDIpO1xufVxuXG5leHBvcnRzLl9fc2xpY2UgPSBfX3NsaWNlO1xudmFyIHNsaWNlID0gLyojX19QVVJFX18qL2l0ZXJhYmxlQ3VycnkoX19zbGljZSwge1xuICB2YWxpZGF0ZUFyZ3M6IC8qI19fUFVSRV9fKi9tYWtlVmFsaWRhdGVBcmdzKCdzbGljZScpLFxuICBncm93UmlnaHQ6IHRydWUsXG4gIG1pbkFyZ3M6IDAsXG4gIG1heEFyZ3M6IDNcbn0pO1xuZXhwb3J0cy5zbGljZSA9IHNsaWNlOyIsInZhciBfcmVnZW5lcmF0b3JSdW50aW1lID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL3JlZ2VuZXJhdG9yXCIpO1xuXG52YXIgX2FzeW5jVG9HZW5lcmF0b3IgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9hc3luY1RvR2VuZXJhdG9yXCIpO1xuXG52YXIgX2FzeW5jSXRlcmF0b3IgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9hc3luY0l0ZXJhdG9yXCIpO1xuXG52YXIgX3JlcXVpcmUgPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbC9hc3luYy1pdGVyYWJsZS5qcycpLFxuICAgIGFzeW5jSXRlcmFibGVDdXJyeSA9IF9yZXF1aXJlLmFzeW5jSXRlcmFibGVDdXJyeTtcblxuZnVuY3Rpb24gX19hc3luY1NvbWUoX3gsIF94Mikge1xuICByZXR1cm4gX2FzeW5jU29tZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuXG5mdW5jdGlvbiBfYXN5bmNTb21lKCkge1xuICBfYXN5bmNTb21lID0gX2FzeW5jVG9HZW5lcmF0b3IoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3JSdW50aW1lLm1hcmsoZnVuY3Rpb24gX2NhbGxlZShpdGVyYWJsZSwgZnVuYykge1xuICAgIHZhciBjLCBfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uLCBfZGlkSXRlcmF0b3JFcnJvciwgX2l0ZXJhdG9yRXJyb3IsIF9pdGVyYXRvciwgX3N0ZXAsIF92YWx1ZSwgdmFsdWU7XG5cbiAgICByZXR1cm4gX3JlZ2VuZXJhdG9yUnVudGltZS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUkKF9jb250ZXh0KSB7XG4gICAgICB3aGlsZSAoMSkge1xuICAgICAgICBzd2l0Y2ggKF9jb250ZXh0LnByZXYgPSBfY29udGV4dC5uZXh0KSB7XG4gICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgYyA9IDA7XG4gICAgICAgICAgICBfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uID0gdHJ1ZTtcbiAgICAgICAgICAgIF9kaWRJdGVyYXRvckVycm9yID0gZmFsc2U7XG4gICAgICAgICAgICBfY29udGV4dC5wcmV2ID0gMztcbiAgICAgICAgICAgIF9pdGVyYXRvciA9IF9hc3luY0l0ZXJhdG9yKGl0ZXJhYmxlKTtcblxuICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSA3O1xuICAgICAgICAgICAgcmV0dXJuIF9pdGVyYXRvci5uZXh0KCk7XG5cbiAgICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgICBfc3RlcCA9IF9jb250ZXh0LnNlbnQ7XG4gICAgICAgICAgICBfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uID0gX3N0ZXAuZG9uZTtcbiAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAxMTtcbiAgICAgICAgICAgIHJldHVybiBfc3RlcC52YWx1ZTtcblxuICAgICAgICAgIGNhc2UgMTE6XG4gICAgICAgICAgICBfdmFsdWUgPSBfY29udGV4dC5zZW50O1xuXG4gICAgICAgICAgICBpZiAoX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbikge1xuICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMjE7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YWx1ZSA9IF92YWx1ZTtcbiAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAxNjtcbiAgICAgICAgICAgIHJldHVybiBmdW5jKHZhbHVlLCBjKyspO1xuXG4gICAgICAgICAgY2FzZSAxNjpcbiAgICAgICAgICAgIGlmICghX2NvbnRleHQuc2VudCkge1xuICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMTg7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuYWJydXB0KFwicmV0dXJuXCIsIHRydWUpO1xuXG4gICAgICAgICAgY2FzZSAxODpcbiAgICAgICAgICAgIF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24gPSB0cnVlO1xuICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDU7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgMjE6XG4gICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMjc7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgMjM6XG4gICAgICAgICAgICBfY29udGV4dC5wcmV2ID0gMjM7XG4gICAgICAgICAgICBfY29udGV4dC50MCA9IF9jb250ZXh0W1wiY2F0Y2hcIl0oMyk7XG4gICAgICAgICAgICBfZGlkSXRlcmF0b3JFcnJvciA9IHRydWU7XG4gICAgICAgICAgICBfaXRlcmF0b3JFcnJvciA9IF9jb250ZXh0LnQwO1xuXG4gICAgICAgICAgY2FzZSAyNzpcbiAgICAgICAgICAgIF9jb250ZXh0LnByZXYgPSAyNztcbiAgICAgICAgICAgIF9jb250ZXh0LnByZXYgPSAyODtcblxuICAgICAgICAgICAgaWYgKCEoIV9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24gJiYgX2l0ZXJhdG9yW1wicmV0dXJuXCJdICE9IG51bGwpKSB7XG4gICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAzMjtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAzMjtcbiAgICAgICAgICAgIHJldHVybiBfaXRlcmF0b3JbXCJyZXR1cm5cIl0oKTtcblxuICAgICAgICAgIGNhc2UgMzI6XG4gICAgICAgICAgICBfY29udGV4dC5wcmV2ID0gMzI7XG5cbiAgICAgICAgICAgIGlmICghX2RpZEl0ZXJhdG9yRXJyb3IpIHtcbiAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDM1O1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhyb3cgX2l0ZXJhdG9yRXJyb3I7XG5cbiAgICAgICAgICBjYXNlIDM1OlxuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LmZpbmlzaCgzMik7XG5cbiAgICAgICAgICBjYXNlIDM2OlxuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LmZpbmlzaCgyNyk7XG5cbiAgICAgICAgICBjYXNlIDM3OlxuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LmFicnVwdChcInJldHVyblwiLCBmYWxzZSk7XG5cbiAgICAgICAgICBjYXNlIDM4OlxuICAgICAgICAgIGNhc2UgXCJlbmRcIjpcbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5zdG9wKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCBfY2FsbGVlLCBudWxsLCBbWzMsIDIzLCAyNywgMzddLCBbMjgsLCAzMiwgMzZdXSk7XG4gIH0pKTtcbiAgcmV0dXJuIF9hc3luY1NvbWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cblxuZXhwb3J0cy5fX2FzeW5jU29tZSA9IF9fYXN5bmNTb21lO1xudmFyIGFzeW5jU29tZSA9IC8qI19fUFVSRV9fKi9hc3luY0l0ZXJhYmxlQ3VycnkoX19hc3luY1NvbWUsIHtcbiAgcmVkdWNlczogdHJ1ZVxufSk7XG5leHBvcnRzLmFzeW5jU29tZSA9IGFzeW5jU29tZTsiLCJmdW5jdGlvbiBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihvLCBhbGxvd0FycmF5TGlrZSkgeyB2YXIgaXQ7IGlmICh0eXBlb2YgU3ltYm9sID09PSBcInVuZGVmaW5lZFwiIHx8IG9bU3ltYm9sLml0ZXJhdG9yXSA9PSBudWxsKSB7IGlmIChBcnJheS5pc0FycmF5KG8pIHx8IChpdCA9IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvKSkgfHwgYWxsb3dBcnJheUxpa2UgJiYgbyAmJiB0eXBlb2Ygby5sZW5ndGggPT09IFwibnVtYmVyXCIpIHsgaWYgKGl0KSBvID0gaXQ7IHZhciBpID0gMDsgdmFyIEYgPSBmdW5jdGlvbiBGKCkge307IHJldHVybiB7IHM6IEYsIG46IGZ1bmN0aW9uIG4oKSB7IGlmIChpID49IG8ubGVuZ3RoKSByZXR1cm4geyBkb25lOiB0cnVlIH07IHJldHVybiB7IGRvbmU6IGZhbHNlLCB2YWx1ZTogb1tpKytdIH07IH0sIGU6IGZ1bmN0aW9uIGUoX2UpIHsgdGhyb3cgX2U7IH0sIGY6IEYgfTsgfSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIGl0ZXJhdGUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIik7IH0gdmFyIG5vcm1hbENvbXBsZXRpb24gPSB0cnVlLCBkaWRFcnIgPSBmYWxzZSwgZXJyOyByZXR1cm4geyBzOiBmdW5jdGlvbiBzKCkgeyBpdCA9IG9bU3ltYm9sLml0ZXJhdG9yXSgpOyB9LCBuOiBmdW5jdGlvbiBuKCkgeyB2YXIgc3RlcCA9IGl0Lm5leHQoKTsgbm9ybWFsQ29tcGxldGlvbiA9IHN0ZXAuZG9uZTsgcmV0dXJuIHN0ZXA7IH0sIGU6IGZ1bmN0aW9uIGUoX2UyKSB7IGRpZEVyciA9IHRydWU7IGVyciA9IF9lMjsgfSwgZjogZnVuY3Rpb24gZigpIHsgdHJ5IHsgaWYgKCFub3JtYWxDb21wbGV0aW9uICYmIGl0W1wicmV0dXJuXCJdICE9IG51bGwpIGl0W1wicmV0dXJuXCJdKCk7IH0gZmluYWxseSB7IGlmIChkaWRFcnIpIHRocm93IGVycjsgfSB9IH07IH1cblxuZnVuY3Rpb24gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8sIG1pbkxlbikgeyBpZiAoIW8pIHJldHVybjsgaWYgKHR5cGVvZiBvID09PSBcInN0cmluZ1wiKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTsgdmFyIG4gPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykuc2xpY2UoOCwgLTEpOyBpZiAobiA9PT0gXCJPYmplY3RcIiAmJiBvLmNvbnN0cnVjdG9yKSBuID0gby5jb25zdHJ1Y3Rvci5uYW1lOyBpZiAobiA9PT0gXCJNYXBcIiB8fCBuID09PSBcIlNldFwiKSByZXR1cm4gQXJyYXkuZnJvbShvKTsgaWYgKG4gPT09IFwiQXJndW1lbnRzXCIgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QobikpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pOyB9XG5cbmZ1bmN0aW9uIF9hcnJheUxpa2VUb0FycmF5KGFyciwgbGVuKSB7IGlmIChsZW4gPT0gbnVsbCB8fCBsZW4gPiBhcnIubGVuZ3RoKSBsZW4gPSBhcnIubGVuZ3RoOyBmb3IgKHZhciBpID0gMCwgYXJyMiA9IG5ldyBBcnJheShsZW4pOyBpIDwgbGVuOyBpKyspIHsgYXJyMltpXSA9IGFycltpXTsgfSByZXR1cm4gYXJyMjsgfVxuXG52YXIgX3JlcXVpcmUgPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbC9pdGVyYWJsZS5qcycpLFxuICAgIGl0ZXJhYmxlQ3VycnkgPSBfcmVxdWlyZS5pdGVyYWJsZUN1cnJ5O1xuXG5mdW5jdGlvbiBfX3NvbWUoaXRlcmFibGUsIGZ1bmMpIHtcbiAgdmFyIGMgPSAwO1xuXG4gIHZhciBfaXRlcmF0b3IgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihpdGVyYWJsZSksXG4gICAgICBfc3RlcDtcblxuICB0cnkge1xuICAgIGZvciAoX2l0ZXJhdG9yLnMoKTsgIShfc3RlcCA9IF9pdGVyYXRvci5uKCkpLmRvbmU7KSB7XG4gICAgICB2YXIgdmFsdWUgPSBfc3RlcC52YWx1ZTtcblxuICAgICAgaWYgKGZ1bmModmFsdWUsIGMrKykpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBfaXRlcmF0b3IuZShlcnIpO1xuICB9IGZpbmFsbHkge1xuICAgIF9pdGVyYXRvci5mKCk7XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbmV4cG9ydHMuX19zb21lID0gX19zb21lO1xudmFyIHNvbWUgPSAvKiNfX1BVUkVfXyovaXRlcmFibGVDdXJyeShfX3NvbWUsIHtcbiAgcmVkdWNlczogdHJ1ZVxufSk7XG5leHBvcnRzLnNvbWUgPSBzb21lOyIsInZhciBfcmVnZW5lcmF0b3JSdW50aW1lID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL3JlZ2VuZXJhdG9yXCIpO1xuXG52YXIgX2F3YWl0QXN5bmNHZW5lcmF0b3IgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9hd2FpdEFzeW5jR2VuZXJhdG9yXCIpO1xuXG52YXIgX3dyYXBBc3luY0dlbmVyYXRvciA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3dyYXBBc3luY0dlbmVyYXRvclwiKTtcblxudmFyIF9yZXF1aXJlID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWwvYXN5bmMtaXRlcmFibGUuanMnKSxcbiAgICBhc3luY0l0ZXJhYmxlQ3VycnkgPSBfcmVxdWlyZS5hc3luY0l0ZXJhYmxlQ3Vycnk7XG5cbnZhciBfcmVxdWlyZTIgPSByZXF1aXJlKCcuLi8kc3BsaXRlcmF0ZS1ncm91cGVkL2FzeW5jLXNwbGl0ZXJhdGUtZ3JvdXBlZC5qcycpLFxuICAgIF9fYXN5bmNTcGxpdGVyYXRlR3JvdXBlZCA9IF9yZXF1aXJlMi5fX2FzeW5jU3BsaXRlcmF0ZUdyb3VwZWQ7XG5cbnZhciBfcmVxdWlyZTMgPSByZXF1aXJlKCcuLi8kcGVla2VyYXRlL2FzeW5jLXBlZWtlcmF0ZS5qcycpLFxuICAgIF9fYXN5bmNQZWVrZXJhdGUgPSBfcmVxdWlyZTMuX19hc3luY1BlZWtlcmF0ZTtcblxudmFyIGluaXRpYWxLZXkgPSBTeW1ib2woJ2luaXRpYWwgZ3JvdXAga2V5Jyk7XG5cbmZ1bmN0aW9uIGFzeW5jR3JvdXBpbmdTcGxpdGVyYXRvcihfeCwgX3gyLCBfeDMpIHtcbiAgcmV0dXJuIF9hc3luY0dyb3VwaW5nU3BsaXRlcmF0b3IuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cblxuZnVuY3Rpb24gX2FzeW5jR3JvdXBpbmdTcGxpdGVyYXRvcigpIHtcbiAgX2FzeW5jR3JvdXBpbmdTcGxpdGVyYXRvciA9IF93cmFwQXN5bmNHZW5lcmF0b3IoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3JSdW50aW1lLm1hcmsoZnVuY3Rpb24gX2NhbGxlZShzcGxpdCwgX3JlZiwgc291cmNlKSB7XG4gICAgdmFyIGdldEtleSwgcGVla3IsIGtleSwgaWR4LCBsYXN0S2V5O1xuICAgIHJldHVybiBfcmVnZW5lcmF0b3JSdW50aW1lLndyYXAoZnVuY3Rpb24gX2NhbGxlZSQoX2NvbnRleHQpIHtcbiAgICAgIHdoaWxlICgxKSB7XG4gICAgICAgIHN3aXRjaCAoX2NvbnRleHQucHJldiA9IF9jb250ZXh0Lm5leHQpIHtcbiAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICBnZXRLZXkgPSBfcmVmLmdldEtleTtcbiAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAzO1xuICAgICAgICAgICAgcmV0dXJuIF9hd2FpdEFzeW5jR2VuZXJhdG9yKF9fYXN5bmNQZWVrZXJhdGUoc291cmNlKSk7XG5cbiAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICBwZWVrciA9IF9jb250ZXh0LnNlbnQ7XG4gICAgICAgICAgICBrZXkgPSBpbml0aWFsS2V5O1xuICAgICAgICAgICAgaWR4ID0gMDtcblxuICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgIGlmIChwZWVrci5kb25lKSB7XG4gICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAyMjtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxhc3RLZXkgPSBrZXk7XG4gICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMTA7XG4gICAgICAgICAgICByZXR1cm4gX2F3YWl0QXN5bmNHZW5lcmF0b3IoZ2V0S2V5KHBlZWtyLnZhbHVlLCBpZHgrKykpO1xuXG4gICAgICAgICAgY2FzZSAxMDpcbiAgICAgICAgICAgIGtleSA9IF9jb250ZXh0LnNlbnQ7XG5cbiAgICAgICAgICAgIGlmICghKGxhc3RLZXkgIT09IGtleSkpIHtcbiAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDE2O1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDE0O1xuICAgICAgICAgICAgcmV0dXJuIHNwbGl0O1xuXG4gICAgICAgICAgY2FzZSAxNDpcbiAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAxNjtcbiAgICAgICAgICAgIHJldHVybiBrZXk7XG5cbiAgICAgICAgICBjYXNlIDE2OlxuICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDE4O1xuICAgICAgICAgICAgcmV0dXJuIHBlZWtyLnZhbHVlO1xuXG4gICAgICAgICAgY2FzZSAxODpcbiAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAyMDtcbiAgICAgICAgICAgIHJldHVybiBfYXdhaXRBc3luY0dlbmVyYXRvcihwZWVrci5hZHZhbmNlKCkpO1xuXG4gICAgICAgICAgY2FzZSAyMDpcbiAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSA2O1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlIDIyOlxuICAgICAgICAgIGNhc2UgXCJlbmRcIjpcbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5zdG9wKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCBfY2FsbGVlKTtcbiAgfSkpO1xuICByZXR1cm4gX2FzeW5jR3JvdXBpbmdTcGxpdGVyYXRvci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuXG5mdW5jdGlvbiBfX2FzeW5jU3BsaXRHcm91cHMoc291cmNlKSB7XG4gIHZhciBnZXRLZXkgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfTtcbiAgcmV0dXJuIF9fYXN5bmNTcGxpdGVyYXRlR3JvdXBlZChzb3VyY2UsIGFzeW5jR3JvdXBpbmdTcGxpdGVyYXRvciwge1xuICAgIGdldEtleTogZ2V0S2V5XG4gIH0pO1xufVxuXG5leHBvcnRzLl9fYXN5bmNTcGxpdEdyb3VwcyA9IF9fYXN5bmNTcGxpdEdyb3VwcztcbnZhciBhc3luY1NwbGl0R3JvdXBzID0gLyojX19QVVJFX18qL2FzeW5jSXRlcmFibGVDdXJyeShfX2FzeW5jU3BsaXRHcm91cHMsIHtcbiAgbWluQXJnczogMCxcbiAgbWF4QXJnczogMVxufSk7XG5leHBvcnRzLmFzeW5jU3BsaXRHcm91cHMgPSBhc3luY1NwbGl0R3JvdXBzOyIsInZhciBfcmVnZW5lcmF0b3JSdW50aW1lID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL3JlZ2VuZXJhdG9yXCIpO1xuXG52YXIgX21hcmtlZCA9IC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3JSdW50aW1lLm1hcmsoZ3JvdXBpbmdTcGxpdGVyYXRvcik7XG5cbnZhciBfcmVxdWlyZSA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFsL2l0ZXJhYmxlLmpzJyksXG4gICAgaXRlcmFibGVDdXJyeSA9IF9yZXF1aXJlLml0ZXJhYmxlQ3Vycnk7XG5cbnZhciBfcmVxdWlyZTIgPSByZXF1aXJlKCcuLi8kc3BsaXRlcmF0ZS1ncm91cGVkL3NwbGl0ZXJhdGUtZ3JvdXBlZC5qcycpLFxuICAgIF9fc3BsaXRlcmF0ZUdyb3VwZWQgPSBfcmVxdWlyZTIuX19zcGxpdGVyYXRlR3JvdXBlZDtcblxudmFyIF9yZXF1aXJlMyA9IHJlcXVpcmUoJy4uLyRwZWVrZXJhdGUvcGVla2VyYXRlLmpzJyksXG4gICAgX19wZWVrZXJhdGUgPSBfcmVxdWlyZTMuX19wZWVrZXJhdGU7XG5cbnZhciBpbml0aWFsS2V5ID0gU3ltYm9sKCdpbml0aWFsIGdyb3VwIGtleScpO1xuXG5mdW5jdGlvbiBncm91cGluZ1NwbGl0ZXJhdG9yKHNwbGl0LCBfcmVmLCBzb3VyY2UpIHtcbiAgdmFyIGdldEtleSwgcGVla3IsIGtleSwgaWR4LCBsYXN0S2V5O1xuICByZXR1cm4gX3JlZ2VuZXJhdG9yUnVudGltZS53cmFwKGZ1bmN0aW9uIGdyb3VwaW5nU3BsaXRlcmF0b3IkKF9jb250ZXh0KSB7XG4gICAgd2hpbGUgKDEpIHtcbiAgICAgIHN3aXRjaCAoX2NvbnRleHQucHJldiA9IF9jb250ZXh0Lm5leHQpIHtcbiAgICAgICAgY2FzZSAwOlxuICAgICAgICAgIGdldEtleSA9IF9yZWYuZ2V0S2V5O1xuICAgICAgICAgIHBlZWtyID0gX19wZWVrZXJhdGUoc291cmNlKTtcbiAgICAgICAgICBrZXkgPSBpbml0aWFsS2V5O1xuICAgICAgICAgIGlkeCA9IDA7XG5cbiAgICAgICAgY2FzZSA0OlxuICAgICAgICAgIGlmIChwZWVrci5kb25lKSB7XG4gICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMTc7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBsYXN0S2V5ID0ga2V5O1xuICAgICAgICAgIGtleSA9IGdldEtleShwZWVrci52YWx1ZSwgaWR4KyspO1xuXG4gICAgICAgICAgaWYgKCEobGFzdEtleSAhPT0ga2V5KSkge1xuICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDEyO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgX2NvbnRleHQubmV4dCA9IDEwO1xuICAgICAgICAgIHJldHVybiBzcGxpdDtcblxuICAgICAgICBjYXNlIDEwOlxuICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAxMjtcbiAgICAgICAgICByZXR1cm4ga2V5O1xuXG4gICAgICAgIGNhc2UgMTI6XG4gICAgICAgICAgX2NvbnRleHQubmV4dCA9IDE0O1xuICAgICAgICAgIHJldHVybiBwZWVrci52YWx1ZTtcblxuICAgICAgICBjYXNlIDE0OlxuICAgICAgICAgIHBlZWtyLmFkdmFuY2UoKTtcbiAgICAgICAgICBfY29udGV4dC5uZXh0ID0gNDtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIDE3OlxuICAgICAgICBjYXNlIFwiZW5kXCI6XG4gICAgICAgICAgcmV0dXJuIF9jb250ZXh0LnN0b3AoKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIF9tYXJrZWQpO1xufVxuXG5mdW5jdGlvbiBfX3NwbGl0R3JvdXBzKHNvdXJjZSkge1xuICB2YXIgZ2V0S2V5ID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH07XG4gIHJldHVybiBfX3NwbGl0ZXJhdGVHcm91cGVkKHNvdXJjZSwgZ3JvdXBpbmdTcGxpdGVyYXRvciwge1xuICAgIGdldEtleTogZ2V0S2V5XG4gIH0pO1xufVxuXG5leHBvcnRzLl9fc3BsaXRHcm91cHMgPSBfX3NwbGl0R3JvdXBzO1xudmFyIHNwbGl0R3JvdXBzID0gLyojX19QVVJFX18qL2l0ZXJhYmxlQ3VycnkoX19zcGxpdEdyb3Vwcywge1xuICBtaW5BcmdzOiAwLFxuICBtYXhBcmdzOiAxXG59KTtcbmV4cG9ydHMuc3BsaXRHcm91cHMgPSBzcGxpdEdyb3VwczsiLCJ2YXIgX3JlZ2VuZXJhdG9yUnVudGltZSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9yZWdlbmVyYXRvclwiKTtcblxuZnVuY3Rpb24gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIobywgYWxsb3dBcnJheUxpa2UpIHsgdmFyIGl0OyBpZiAodHlwZW9mIFN5bWJvbCA9PT0gXCJ1bmRlZmluZWRcIiB8fCBvW1N5bWJvbC5pdGVyYXRvcl0gPT0gbnVsbCkgeyBpZiAoQXJyYXkuaXNBcnJheShvKSB8fCAoaXQgPSBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkobykpIHx8IGFsbG93QXJyYXlMaWtlICYmIG8gJiYgdHlwZW9mIG8ubGVuZ3RoID09PSBcIm51bWJlclwiKSB7IGlmIChpdCkgbyA9IGl0OyB2YXIgaSA9IDA7IHZhciBGID0gZnVuY3Rpb24gRigpIHt9OyByZXR1cm4geyBzOiBGLCBuOiBmdW5jdGlvbiBuKCkgeyBpZiAoaSA+PSBvLmxlbmd0aCkgcmV0dXJuIHsgZG9uZTogdHJ1ZSB9OyByZXR1cm4geyBkb25lOiBmYWxzZSwgdmFsdWU6IG9baSsrXSB9OyB9LCBlOiBmdW5jdGlvbiBlKF9lKSB7IHRocm93IF9lOyB9LCBmOiBGIH07IH0gdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBpdGVyYXRlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpOyB9IHZhciBub3JtYWxDb21wbGV0aW9uID0gdHJ1ZSwgZGlkRXJyID0gZmFsc2UsIGVycjsgcmV0dXJuIHsgczogZnVuY3Rpb24gcygpIHsgaXQgPSBvW1N5bWJvbC5pdGVyYXRvcl0oKTsgfSwgbjogZnVuY3Rpb24gbigpIHsgdmFyIHN0ZXAgPSBpdC5uZXh0KCk7IG5vcm1hbENvbXBsZXRpb24gPSBzdGVwLmRvbmU7IHJldHVybiBzdGVwOyB9LCBlOiBmdW5jdGlvbiBlKF9lMikgeyBkaWRFcnIgPSB0cnVlOyBlcnIgPSBfZTI7IH0sIGY6IGZ1bmN0aW9uIGYoKSB7IHRyeSB7IGlmICghbm9ybWFsQ29tcGxldGlvbiAmJiBpdFtcInJldHVyblwiXSAhPSBudWxsKSBpdFtcInJldHVyblwiXSgpOyB9IGZpbmFsbHkgeyBpZiAoZGlkRXJyKSB0aHJvdyBlcnI7IH0gfSB9OyB9XG5cbmZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvLCBtaW5MZW4pIHsgaWYgKCFvKSByZXR1cm47IGlmICh0eXBlb2YgbyA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IHZhciBuID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pLnNsaWNlKDgsIC0xKTsgaWYgKG4gPT09IFwiT2JqZWN0XCIgJiYgby5jb25zdHJ1Y3RvcikgbiA9IG8uY29uc3RydWN0b3IubmFtZTsgaWYgKG4gPT09IFwiTWFwXCIgfHwgbiA9PT0gXCJTZXRcIikgcmV0dXJuIEFycmF5LmZyb20obyk7IGlmIChuID09PSBcIkFyZ3VtZW50c1wiIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTsgfVxuXG5mdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheShhcnIsIGxlbikgeyBpZiAobGVuID09IG51bGwgfHwgbGVuID4gYXJyLmxlbmd0aCkgbGVuID0gYXJyLmxlbmd0aDsgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkobGVuKTsgaSA8IGxlbjsgaSsrKSB7IGFycjJbaV0gPSBhcnJbaV07IH0gcmV0dXJuIGFycjI7IH1cblxudmFyIF9hc3luY0dlbmVyYXRvckRlbGVnYXRlID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvYXN5bmNHZW5lcmF0b3JEZWxlZ2F0ZVwiKTtcblxudmFyIF9hd2FpdEFzeW5jR2VuZXJhdG9yID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvYXdhaXRBc3luY0dlbmVyYXRvclwiKTtcblxudmFyIF93cmFwQXN5bmNHZW5lcmF0b3IgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy93cmFwQXN5bmNHZW5lcmF0b3JcIik7XG5cbnZhciBfYXN5bmNJdGVyYXRvciA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2FzeW5jSXRlcmF0b3JcIik7XG5cbnZhciBfcmVxdWlyZSA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFsL2FzeW5jLWl0ZXJhYmxlLmpzJyksXG4gICAgYXN5bmNJdGVyYWJsZUN1cnJ5ID0gX3JlcXVpcmUuYXN5bmNJdGVyYWJsZUN1cnJ5O1xuXG52YXIgX3JlcXVpcmUyID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWwvYXN5bmMtYW55LXNlcS5qcycpLFxuICAgIGFzeW5jU2Vxc1RvQXJyYXkgPSBfcmVxdWlyZTIuYXN5bmNTZXFzVG9BcnJheTtcblxudmFyIF9yZXF1aXJlMyA9IHJlcXVpcmUoJy4uLyRzdGFydHMtd2l0aC1zZXEvc3RhcnRzLXdpdGgtc2VxLmpzJyksXG4gICAgX19zdGFydHNXaXRoU2VxID0gX3JlcXVpcmUzLl9fc3RhcnRzV2l0aFNlcTtcblxudmFyIF9yZXF1aXJlNCA9IHJlcXVpcmUoJy4uLyR3aW5kb3ctYWhlYWQvYXN5bmMtd2luZG93LWFoZWFkLmpzJyksXG4gICAgX19hc3luY1dpbmRvd0FoZWFkID0gX3JlcXVpcmU0Ll9fYXN5bmNXaW5kb3dBaGVhZDtcblxudmFyIF9yZXF1aXJlNSA9IHJlcXVpcmUoJy4uLyRzcGxpdGVyYXRlL2FzeW5jLXNwbGl0ZXJhdGUuanMnKSxcbiAgICBfX2FzeW5jU3BsaXRlcmF0ZSA9IF9yZXF1aXJlNS5fX2FzeW5jU3BsaXRlcmF0ZTtcblxuZnVuY3Rpb24gZ2V0TWF0Y2hpbmdMZW5ndGgoYnVmZmVyLCBzZXBhcmF0b3JTZXFzLCBzYW1lKSB7XG4gIHZhciBfaXRlcmF0b3IyID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIoc2VwYXJhdG9yU2VxcyksXG4gICAgICBfc3RlcDI7XG5cbiAgdHJ5IHtcbiAgICBmb3IgKF9pdGVyYXRvcjIucygpOyAhKF9zdGVwMiA9IF9pdGVyYXRvcjIubigpKS5kb25lOykge1xuICAgICAgdmFyIHN1YnNlcXVlbmNlID0gX3N0ZXAyLnZhbHVlO1xuXG4gICAgICBpZiAoX19zdGFydHNXaXRoU2VxKGJ1ZmZlciwgc3Vic2VxdWVuY2UsIHNhbWUpKSB7XG4gICAgICAgIHJldHVybiBzdWJzZXF1ZW5jZS5sZW5ndGg7XG4gICAgICB9XG4gICAgfVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBfaXRlcmF0b3IyLmUoZXJyKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBfaXRlcmF0b3IyLmYoKTtcbiAgfVxuXG4gIHJldHVybiAwO1xufVxuXG5mdW5jdGlvbiBhc3luY0FueVNlcXNwbGl0ZXJhdG9yKF94LCBfeDIsIF94Mykge1xuICByZXR1cm4gX2FzeW5jQW55U2Vxc3BsaXRlcmF0b3IuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cblxuZnVuY3Rpb24gX2FzeW5jQW55U2Vxc3BsaXRlcmF0b3IoKSB7XG4gIF9hc3luY0FueVNlcXNwbGl0ZXJhdG9yID0gX3dyYXBBc3luY0dlbmVyYXRvciggLyojX19QVVJFX18qL19yZWdlbmVyYXRvclJ1bnRpbWUubWFyayhmdW5jdGlvbiBfY2FsbGVlKHNwbGl0LCBfcmVmLCBzb3VyY2UpIHtcbiAgICB2YXIgc2VwYXJhdG9yU2Vxcywgc2FtZSwgbWF4TWF0Y2hMZW5ndGgsIHNraXAsIF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24sIF9kaWRJdGVyYXRvckVycm9yLCBfaXRlcmF0b3JFcnJvciwgX2l0ZXJhdG9yLCBfc3RlcCwgX3ZhbHVlLCBidWZmZXIsIG1hdGNoaW5nTGVuZ3RoO1xuXG4gICAgcmV0dXJuIF9yZWdlbmVyYXRvclJ1bnRpbWUud3JhcChmdW5jdGlvbiBfY2FsbGVlJChfY29udGV4dCkge1xuICAgICAgd2hpbGUgKDEpIHtcbiAgICAgICAgc3dpdGNoIChfY29udGV4dC5wcmV2ID0gX2NvbnRleHQubmV4dCkge1xuICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgIHNlcGFyYXRvclNlcXMgPSBfcmVmLnNlcGFyYXRvclNlcXMsIHNhbWUgPSBfcmVmLnNhbWU7XG4gICAgICAgICAgICBtYXhNYXRjaExlbmd0aCA9IHNlcGFyYXRvclNlcXMucmVkdWNlKGZ1bmN0aW9uIChtYXgsIF9yZWYyKSB7XG4gICAgICAgICAgICAgIHZhciBsZW5ndGggPSBfcmVmMi5sZW5ndGg7XG4gICAgICAgICAgICAgIHJldHVybiBNYXRoLm1heChtYXgsIGxlbmd0aCk7XG4gICAgICAgICAgICB9LCAxKTtcbiAgICAgICAgICAgIHNraXAgPSAwO1xuICAgICAgICAgICAgX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbiA9IHRydWU7XG4gICAgICAgICAgICBfZGlkSXRlcmF0b3JFcnJvciA9IGZhbHNlO1xuICAgICAgICAgICAgX2NvbnRleHQucHJldiA9IDU7XG4gICAgICAgICAgICBfaXRlcmF0b3IgPSBfYXN5bmNJdGVyYXRvcihfX2FzeW5jV2luZG93QWhlYWQoc291cmNlLCBtYXhNYXRjaExlbmd0aCwge1xuICAgICAgICAgICAgICB1c2VGaWxsZXI6IGZhbHNlXG4gICAgICAgICAgICB9KSk7XG5cbiAgICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gOTtcbiAgICAgICAgICAgIHJldHVybiBfYXdhaXRBc3luY0dlbmVyYXRvcihfaXRlcmF0b3IubmV4dCgpKTtcblxuICAgICAgICAgIGNhc2UgOTpcbiAgICAgICAgICAgIF9zdGVwID0gX2NvbnRleHQuc2VudDtcbiAgICAgICAgICAgIF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24gPSBfc3RlcC5kb25lO1xuICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDEzO1xuICAgICAgICAgICAgcmV0dXJuIF9hd2FpdEFzeW5jR2VuZXJhdG9yKF9zdGVwLnZhbHVlKTtcblxuICAgICAgICAgIGNhc2UgMTM6XG4gICAgICAgICAgICBfdmFsdWUgPSBfY29udGV4dC5zZW50O1xuXG4gICAgICAgICAgICBpZiAoX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbikge1xuICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMzE7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBidWZmZXIgPSBfdmFsdWU7XG5cbiAgICAgICAgICAgIGlmICghKHNraXAgPiAwKSkge1xuICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMTk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBza2lwLS07XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuYWJydXB0KFwiY29udGludWVcIiwgMjgpO1xuXG4gICAgICAgICAgY2FzZSAxOTpcbiAgICAgICAgICAgIG1hdGNoaW5nTGVuZ3RoID0gZ2V0TWF0Y2hpbmdMZW5ndGgoYnVmZmVyLCBzZXBhcmF0b3JTZXFzLCBzYW1lKTtcblxuICAgICAgICAgICAgaWYgKCEobWF0Y2hpbmdMZW5ndGggPiAwKSkge1xuICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMjY7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMjM7XG4gICAgICAgICAgICByZXR1cm4gc3BsaXQ7XG5cbiAgICAgICAgICBjYXNlIDIzOlxuICAgICAgICAgICAgc2tpcCA9IG1hdGNoaW5nTGVuZ3RoIC0gMTtcbiAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAyODtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSAyNjpcbiAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAyODtcbiAgICAgICAgICAgIHJldHVybiBidWZmZXIuZ2V0KDApO1xuXG4gICAgICAgICAgY2FzZSAyODpcbiAgICAgICAgICAgIF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24gPSB0cnVlO1xuICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDc7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgMzE6XG4gICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMzc7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgMzM6XG4gICAgICAgICAgICBfY29udGV4dC5wcmV2ID0gMzM7XG4gICAgICAgICAgICBfY29udGV4dC50MCA9IF9jb250ZXh0W1wiY2F0Y2hcIl0oNSk7XG4gICAgICAgICAgICBfZGlkSXRlcmF0b3JFcnJvciA9IHRydWU7XG4gICAgICAgICAgICBfaXRlcmF0b3JFcnJvciA9IF9jb250ZXh0LnQwO1xuXG4gICAgICAgICAgY2FzZSAzNzpcbiAgICAgICAgICAgIF9jb250ZXh0LnByZXYgPSAzNztcbiAgICAgICAgICAgIF9jb250ZXh0LnByZXYgPSAzODtcblxuICAgICAgICAgICAgaWYgKCEoIV9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24gJiYgX2l0ZXJhdG9yW1wicmV0dXJuXCJdICE9IG51bGwpKSB7XG4gICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSA0MjtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSA0MjtcbiAgICAgICAgICAgIHJldHVybiBfYXdhaXRBc3luY0dlbmVyYXRvcihfaXRlcmF0b3JbXCJyZXR1cm5cIl0oKSk7XG5cbiAgICAgICAgICBjYXNlIDQyOlxuICAgICAgICAgICAgX2NvbnRleHQucHJldiA9IDQyO1xuXG4gICAgICAgICAgICBpZiAoIV9kaWRJdGVyYXRvckVycm9yKSB7XG4gICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSA0NTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRocm93IF9pdGVyYXRvckVycm9yO1xuXG4gICAgICAgICAgY2FzZSA0NTpcbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5maW5pc2goNDIpO1xuXG4gICAgICAgICAgY2FzZSA0NjpcbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5maW5pc2goMzcpO1xuXG4gICAgICAgICAgY2FzZSA0NzpcbiAgICAgICAgICBjYXNlIFwiZW5kXCI6XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuc3RvcCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwgX2NhbGxlZSwgbnVsbCwgW1s1LCAzMywgMzcsIDQ3XSwgWzM4LCwgNDIsIDQ2XV0pO1xuICB9KSk7XG4gIHJldHVybiBfYXN5bmNBbnlTZXFzcGxpdGVyYXRvci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuXG5mdW5jdGlvbiBfX2FzeW5jU3BsaXRPbkFueVNlcShfeDQsIF94NSkge1xuICByZXR1cm4gX2FzeW5jU3BsaXRPbkFueVNlcS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuXG5leHBvcnRzLl9fYXN5bmNTcGxpdE9uQW55U2VxID0gX19hc3luY1NwbGl0T25BbnlTZXE7XG5cbmZ1bmN0aW9uIF9hc3luY1NwbGl0T25BbnlTZXEoKSB7XG4gIF9hc3luY1NwbGl0T25BbnlTZXEgPSBfd3JhcEFzeW5jR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yUnVudGltZS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUyKHNvdXJjZSwgc2VwYXJhdG9yU2Vxcykge1xuICAgIHZhciBzYW1lLFxuICAgICAgICBzZXBhcmF0b3JTZXFzQXJyLFxuICAgICAgICBfYXJnczIgPSBhcmd1bWVudHM7XG4gICAgcmV0dXJuIF9yZWdlbmVyYXRvclJ1bnRpbWUud3JhcChmdW5jdGlvbiBfY2FsbGVlMiQoX2NvbnRleHQyKSB7XG4gICAgICB3aGlsZSAoMSkge1xuICAgICAgICBzd2l0Y2ggKF9jb250ZXh0Mi5wcmV2ID0gX2NvbnRleHQyLm5leHQpIHtcbiAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICBzYW1lID0gX2FyZ3MyLmxlbmd0aCA+IDIgJiYgX2FyZ3MyWzJdICE9PSB1bmRlZmluZWQgPyBfYXJnczJbMl0gOiBPYmplY3QuaXM7XG4gICAgICAgICAgICBfY29udGV4dDIubmV4dCA9IDM7XG4gICAgICAgICAgICByZXR1cm4gX2F3YWl0QXN5bmNHZW5lcmF0b3IoYXN5bmNTZXFzVG9BcnJheShzZXBhcmF0b3JTZXFzKSk7XG5cbiAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICBzZXBhcmF0b3JTZXFzQXJyID0gX2NvbnRleHQyLnNlbnQuZmlsdGVyKGZ1bmN0aW9uIChzKSB7XG4gICAgICAgICAgICAgIHJldHVybiBzLmxlbmd0aCA+IDA7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dDIuZGVsZWdhdGVZaWVsZChfYXN5bmNHZW5lcmF0b3JEZWxlZ2F0ZShfYXN5bmNJdGVyYXRvcihfX2FzeW5jU3BsaXRlcmF0ZShzb3VyY2UsIGFzeW5jQW55U2Vxc3BsaXRlcmF0b3IsIHtcbiAgICAgICAgICAgICAgc2VwYXJhdG9yU2Vxczogc2VwYXJhdG9yU2Vxc0Fyci5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGIubGVuZ3RoIC0gYS5sZW5ndGg7XG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICBzYW1lOiBzYW1lXG4gICAgICAgICAgICB9KSksIF9hd2FpdEFzeW5jR2VuZXJhdG9yKSwgXCJ0MFwiLCA1KTtcblxuICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICBjYXNlIFwiZW5kXCI6XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQyLnN0b3AoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sIF9jYWxsZWUyKTtcbiAgfSkpO1xuICByZXR1cm4gX2FzeW5jU3BsaXRPbkFueVNlcS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuXG52YXIgYXN5bmNTcGxpdE9uQW55U2VxID0gLyojX19QVVJFX18qL2FzeW5jSXRlcmFibGVDdXJyeShfX2FzeW5jU3BsaXRPbkFueVNlcSwge1xuICBtaW5BcmdzOiAxLFxuICBtYXhBcmdzOiAyXG59KTtcbmV4cG9ydHMuYXN5bmNTcGxpdE9uQW55U2VxID0gYXN5bmNTcGxpdE9uQW55U2VxOyIsInZhciBfcmVnZW5lcmF0b3JSdW50aW1lID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL3JlZ2VuZXJhdG9yXCIpO1xuXG52YXIgX21hcmtlZCA9IC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3JSdW50aW1lLm1hcmsoYW55U2Vxc3BsaXRlcmF0b3IpLFxuICAgIF9tYXJrZWQyID0gLyojX19QVVJFX18qL19yZWdlbmVyYXRvclJ1bnRpbWUubWFyayhfX3NwbGl0T25BbnlTZXEpO1xuXG5mdW5jdGlvbiBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihvLCBhbGxvd0FycmF5TGlrZSkgeyB2YXIgaXQ7IGlmICh0eXBlb2YgU3ltYm9sID09PSBcInVuZGVmaW5lZFwiIHx8IG9bU3ltYm9sLml0ZXJhdG9yXSA9PSBudWxsKSB7IGlmIChBcnJheS5pc0FycmF5KG8pIHx8IChpdCA9IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvKSkgfHwgYWxsb3dBcnJheUxpa2UgJiYgbyAmJiB0eXBlb2Ygby5sZW5ndGggPT09IFwibnVtYmVyXCIpIHsgaWYgKGl0KSBvID0gaXQ7IHZhciBpID0gMDsgdmFyIEYgPSBmdW5jdGlvbiBGKCkge307IHJldHVybiB7IHM6IEYsIG46IGZ1bmN0aW9uIG4oKSB7IGlmIChpID49IG8ubGVuZ3RoKSByZXR1cm4geyBkb25lOiB0cnVlIH07IHJldHVybiB7IGRvbmU6IGZhbHNlLCB2YWx1ZTogb1tpKytdIH07IH0sIGU6IGZ1bmN0aW9uIGUoX2UpIHsgdGhyb3cgX2U7IH0sIGY6IEYgfTsgfSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIGl0ZXJhdGUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIik7IH0gdmFyIG5vcm1hbENvbXBsZXRpb24gPSB0cnVlLCBkaWRFcnIgPSBmYWxzZSwgZXJyOyByZXR1cm4geyBzOiBmdW5jdGlvbiBzKCkgeyBpdCA9IG9bU3ltYm9sLml0ZXJhdG9yXSgpOyB9LCBuOiBmdW5jdGlvbiBuKCkgeyB2YXIgc3RlcCA9IGl0Lm5leHQoKTsgbm9ybWFsQ29tcGxldGlvbiA9IHN0ZXAuZG9uZTsgcmV0dXJuIHN0ZXA7IH0sIGU6IGZ1bmN0aW9uIGUoX2UyKSB7IGRpZEVyciA9IHRydWU7IGVyciA9IF9lMjsgfSwgZjogZnVuY3Rpb24gZigpIHsgdHJ5IHsgaWYgKCFub3JtYWxDb21wbGV0aW9uICYmIGl0W1wicmV0dXJuXCJdICE9IG51bGwpIGl0W1wicmV0dXJuXCJdKCk7IH0gZmluYWxseSB7IGlmIChkaWRFcnIpIHRocm93IGVycjsgfSB9IH07IH1cblxuZnVuY3Rpb24gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8sIG1pbkxlbikgeyBpZiAoIW8pIHJldHVybjsgaWYgKHR5cGVvZiBvID09PSBcInN0cmluZ1wiKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTsgdmFyIG4gPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykuc2xpY2UoOCwgLTEpOyBpZiAobiA9PT0gXCJPYmplY3RcIiAmJiBvLmNvbnN0cnVjdG9yKSBuID0gby5jb25zdHJ1Y3Rvci5uYW1lOyBpZiAobiA9PT0gXCJNYXBcIiB8fCBuID09PSBcIlNldFwiKSByZXR1cm4gQXJyYXkuZnJvbShvKTsgaWYgKG4gPT09IFwiQXJndW1lbnRzXCIgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QobikpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pOyB9XG5cbmZ1bmN0aW9uIF9hcnJheUxpa2VUb0FycmF5KGFyciwgbGVuKSB7IGlmIChsZW4gPT0gbnVsbCB8fCBsZW4gPiBhcnIubGVuZ3RoKSBsZW4gPSBhcnIubGVuZ3RoOyBmb3IgKHZhciBpID0gMCwgYXJyMiA9IG5ldyBBcnJheShsZW4pOyBpIDwgbGVuOyBpKyspIHsgYXJyMltpXSA9IGFycltpXTsgfSByZXR1cm4gYXJyMjsgfVxuXG52YXIgX3JlcXVpcmUgPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbC9pdGVyYWJsZS5qcycpLFxuICAgIGl0ZXJhYmxlQ3VycnkgPSBfcmVxdWlyZS5pdGVyYWJsZUN1cnJ5O1xuXG52YXIgX3JlcXVpcmUyID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWwvYW55LXNlcS5qcycpLFxuICAgIHNlcXNUb0FycmF5ID0gX3JlcXVpcmUyLnNlcXNUb0FycmF5O1xuXG52YXIgX3JlcXVpcmUzID0gcmVxdWlyZSgnLi4vJHN0YXJ0cy13aXRoLXNlcS9zdGFydHMtd2l0aC1zZXEuanMnKSxcbiAgICBfX3N0YXJ0c1dpdGhTZXEgPSBfcmVxdWlyZTMuX19zdGFydHNXaXRoU2VxO1xuXG52YXIgX3JlcXVpcmU0ID0gcmVxdWlyZSgnLi4vJHdpbmRvdy1haGVhZC93aW5kb3ctYWhlYWQuanMnKSxcbiAgICBfX3dpbmRvd0FoZWFkID0gX3JlcXVpcmU0Ll9fd2luZG93QWhlYWQ7XG5cbnZhciBfcmVxdWlyZTUgPSByZXF1aXJlKCcuLi8kc3BsaXRlcmF0ZS9zcGxpdGVyYXRlLmpzJyksXG4gICAgX19zcGxpdGVyYXRlID0gX3JlcXVpcmU1Ll9fc3BsaXRlcmF0ZTtcblxuZnVuY3Rpb24gZ2V0TWF0Y2hpbmdMZW5ndGgoYnVmZmVyLCBzZXBhcmF0b3JTZXFzLCBzYW1lKSB7XG4gIHZhciBfaXRlcmF0b3IgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihzZXBhcmF0b3JTZXFzKSxcbiAgICAgIF9zdGVwO1xuXG4gIHRyeSB7XG4gICAgZm9yIChfaXRlcmF0b3IucygpOyAhKF9zdGVwID0gX2l0ZXJhdG9yLm4oKSkuZG9uZTspIHtcbiAgICAgIHZhciBzdWJzZXF1ZW5jZSA9IF9zdGVwLnZhbHVlO1xuXG4gICAgICBpZiAoX19zdGFydHNXaXRoU2VxKGJ1ZmZlciwgc3Vic2VxdWVuY2UsIHNhbWUpKSB7XG4gICAgICAgIHJldHVybiBzdWJzZXF1ZW5jZS5sZW5ndGg7XG4gICAgICB9XG4gICAgfVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBfaXRlcmF0b3IuZShlcnIpO1xuICB9IGZpbmFsbHkge1xuICAgIF9pdGVyYXRvci5mKCk7XG4gIH1cblxuICByZXR1cm4gMDtcbn1cblxuZnVuY3Rpb24gYW55U2Vxc3BsaXRlcmF0b3Ioc3BsaXQsIF9yZWYsIHNvdXJjZSkge1xuICB2YXIgc2VwYXJhdG9yU2Vxcywgc2FtZSwgbWF4TWF0Y2hMZW5ndGgsIHNraXAsIF9pdGVyYXRvcjIsIF9zdGVwMiwgYnVmZmVyLCBtYXRjaGluZ0xlbmd0aDtcblxuICByZXR1cm4gX3JlZ2VuZXJhdG9yUnVudGltZS53cmFwKGZ1bmN0aW9uIGFueVNlcXNwbGl0ZXJhdG9yJChfY29udGV4dCkge1xuICAgIHdoaWxlICgxKSB7XG4gICAgICBzd2l0Y2ggKF9jb250ZXh0LnByZXYgPSBfY29udGV4dC5uZXh0KSB7XG4gICAgICAgIGNhc2UgMDpcbiAgICAgICAgICBzZXBhcmF0b3JTZXFzID0gX3JlZi5zZXBhcmF0b3JTZXFzLCBzYW1lID0gX3JlZi5zYW1lO1xuICAgICAgICAgIG1heE1hdGNoTGVuZ3RoID0gc2VwYXJhdG9yU2Vxcy5yZWR1Y2UoZnVuY3Rpb24gKG1heCwgX3JlZjIpIHtcbiAgICAgICAgICAgIHZhciBsZW5ndGggPSBfcmVmMi5sZW5ndGg7XG4gICAgICAgICAgICByZXR1cm4gTWF0aC5tYXgobWF4LCBsZW5ndGgpO1xuICAgICAgICAgIH0sIDEpO1xuICAgICAgICAgIHNraXAgPSAwO1xuICAgICAgICAgIF9pdGVyYXRvcjIgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihfX3dpbmRvd0FoZWFkKHNvdXJjZSwgbWF4TWF0Y2hMZW5ndGgsIHtcbiAgICAgICAgICAgIHVzZUZpbGxlcjogZmFsc2VcbiAgICAgICAgICB9KSk7XG4gICAgICAgICAgX2NvbnRleHQucHJldiA9IDQ7XG5cbiAgICAgICAgICBfaXRlcmF0b3IyLnMoKTtcblxuICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgaWYgKChfc3RlcDIgPSBfaXRlcmF0b3IyLm4oKSkuZG9uZSkge1xuICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDIyO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnVmZmVyID0gX3N0ZXAyLnZhbHVlO1xuXG4gICAgICAgICAgaWYgKCEoc2tpcCA+IDApKSB7XG4gICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMTE7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBza2lwLS07XG4gICAgICAgICAgcmV0dXJuIF9jb250ZXh0LmFicnVwdChcImNvbnRpbnVlXCIsIDIwKTtcblxuICAgICAgICBjYXNlIDExOlxuICAgICAgICAgIG1hdGNoaW5nTGVuZ3RoID0gZ2V0TWF0Y2hpbmdMZW5ndGgoYnVmZmVyLCBzZXBhcmF0b3JTZXFzLCBzYW1lKTtcblxuICAgICAgICAgIGlmICghKG1hdGNoaW5nTGVuZ3RoID4gMCkpIHtcbiAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAxODtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAxNTtcbiAgICAgICAgICByZXR1cm4gc3BsaXQ7XG5cbiAgICAgICAgY2FzZSAxNTpcbiAgICAgICAgICBza2lwID0gbWF0Y2hpbmdMZW5ndGggLSAxO1xuICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAyMDtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIDE4OlxuICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAyMDtcbiAgICAgICAgICByZXR1cm4gYnVmZmVyLmdldCgwKTtcblxuICAgICAgICBjYXNlIDIwOlxuICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSA2O1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgMjI6XG4gICAgICAgICAgX2NvbnRleHQubmV4dCA9IDI3O1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgMjQ6XG4gICAgICAgICAgX2NvbnRleHQucHJldiA9IDI0O1xuICAgICAgICAgIF9jb250ZXh0LnQwID0gX2NvbnRleHRbXCJjYXRjaFwiXSg0KTtcblxuICAgICAgICAgIF9pdGVyYXRvcjIuZShfY29udGV4dC50MCk7XG5cbiAgICAgICAgY2FzZSAyNzpcbiAgICAgICAgICBfY29udGV4dC5wcmV2ID0gMjc7XG5cbiAgICAgICAgICBfaXRlcmF0b3IyLmYoKTtcblxuICAgICAgICAgIHJldHVybiBfY29udGV4dC5maW5pc2goMjcpO1xuXG4gICAgICAgIGNhc2UgMzA6XG4gICAgICAgIGNhc2UgXCJlbmRcIjpcbiAgICAgICAgICByZXR1cm4gX2NvbnRleHQuc3RvcCgpO1xuICAgICAgfVxuICAgIH1cbiAgfSwgX21hcmtlZCwgbnVsbCwgW1s0LCAyNCwgMjcsIDMwXV0pO1xufVxuXG5mdW5jdGlvbiBfX3NwbGl0T25BbnlTZXEoc291cmNlLCBzZXBhcmF0b3JTZXFzKSB7XG4gIHZhciBzYW1lLFxuICAgICAgc2VwYXJhdG9yU2Vxc0FycixcbiAgICAgIF9hcmdzMiA9IGFyZ3VtZW50cztcbiAgcmV0dXJuIF9yZWdlbmVyYXRvclJ1bnRpbWUud3JhcChmdW5jdGlvbiBfX3NwbGl0T25BbnlTZXEkKF9jb250ZXh0Mikge1xuICAgIHdoaWxlICgxKSB7XG4gICAgICBzd2l0Y2ggKF9jb250ZXh0Mi5wcmV2ID0gX2NvbnRleHQyLm5leHQpIHtcbiAgICAgICAgY2FzZSAwOlxuICAgICAgICAgIHNhbWUgPSBfYXJnczIubGVuZ3RoID4gMiAmJiBfYXJnczJbMl0gIT09IHVuZGVmaW5lZCA/IF9hcmdzMlsyXSA6IE9iamVjdC5pcztcbiAgICAgICAgICBzZXBhcmF0b3JTZXFzQXJyID0gc2Vxc1RvQXJyYXkoc2VwYXJhdG9yU2VxcykuZmlsdGVyKGZ1bmN0aW9uIChzKSB7XG4gICAgICAgICAgICByZXR1cm4gcy5sZW5ndGggPiAwO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiBfY29udGV4dDIuZGVsZWdhdGVZaWVsZChfX3NwbGl0ZXJhdGUoc291cmNlLCBhbnlTZXFzcGxpdGVyYXRvciwge1xuICAgICAgICAgICAgc2VwYXJhdG9yU2Vxczogc2VwYXJhdG9yU2Vxc0Fyci5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICAgICAgICAgIHJldHVybiBiLmxlbmd0aCAtIGEubGVuZ3RoO1xuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBzYW1lOiBzYW1lXG4gICAgICAgICAgfSksIFwidDBcIiwgMyk7XG5cbiAgICAgICAgY2FzZSAzOlxuICAgICAgICBjYXNlIFwiZW5kXCI6XG4gICAgICAgICAgcmV0dXJuIF9jb250ZXh0Mi5zdG9wKCk7XG4gICAgICB9XG4gICAgfVxuICB9LCBfbWFya2VkMik7XG59XG5cbmV4cG9ydHMuX19zcGxpdE9uQW55U2VxID0gX19zcGxpdE9uQW55U2VxO1xudmFyIHNwbGl0T25BbnlTZXEgPSAvKiNfX1BVUkVfXyovaXRlcmFibGVDdXJyeShfX3NwbGl0T25BbnlTZXEsIHtcbiAgbWluQXJnczogMSxcbiAgbWF4QXJnczogMlxufSk7XG5leHBvcnRzLnNwbGl0T25BbnlTZXEgPSBzcGxpdE9uQW55U2VxOyIsInZhciBfcmVxdWlyZSA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFsL2FzeW5jLWl0ZXJhYmxlLmpzJyksXG4gICAgYXN5bmNJdGVyYWJsZUN1cnJ5ID0gX3JlcXVpcmUuYXN5bmNJdGVyYWJsZUN1cnJ5O1xuXG52YXIgX3JlcXVpcmUyID0gcmVxdWlyZSgnLi4vJHNwbGl0LXdoZW4vYXN5bmMtc3BsaXQtd2hlbi5qcycpLFxuICAgIF9fYXN5bmNTcGxpdFdoZW4gPSBfcmVxdWlyZTIuX19hc3luY1NwbGl0V2hlbjtcblxudmFyIF9yZXF1aXJlMyA9IHJlcXVpcmUoJy4uLyRpbmNsdWRlcy9pbmNsdWRlcy5qcycpLFxuICAgIF9faW5jbHVkZXMgPSBfcmVxdWlyZTMuX19pbmNsdWRlcztcblxuZnVuY3Rpb24gX19hc3luY1NwbGl0T25Bbnkoc291cmNlLCBzZXBhcmF0b3JzKSB7XG4gIHZhciBzYW1lID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiBPYmplY3QuaXM7XG4gIHJldHVybiBfX2FzeW5jU3BsaXRXaGVuKHNvdXJjZSwgZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgcmV0dXJuIF9faW5jbHVkZXMoc2VwYXJhdG9ycywgdmFsdWUsIGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICByZXR1cm4gc2FtZShiLCBhKTtcbiAgICB9KTtcbiAgfSk7XG59XG5cbmV4cG9ydHMuX19hc3luY1NwbGl0T25BbnkgPSBfX2FzeW5jU3BsaXRPbkFueTtcbnZhciBhc3luY1NwbGl0T25BbnkgPSAvKiNfX1BVUkVfXyovYXN5bmNJdGVyYWJsZUN1cnJ5KF9fYXN5bmNTcGxpdE9uQW55LCB7XG4gIG1pbkFyZ3M6IDEsXG4gIG1heEFyZ3M6IDIsXG4gIHZhbGlkYXRlQXJnczogZnVuY3Rpb24gdmFsaWRhdGVBcmdzKGFyZ3MpIHt9XG59KTtcbmV4cG9ydHMuYXN5bmNTcGxpdE9uQW55ID0gYXN5bmNTcGxpdE9uQW55OyIsInZhciBfcmVxdWlyZSA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFsL2l0ZXJhYmxlLmpzJyksXG4gICAgaXRlcmFibGVDdXJyeSA9IF9yZXF1aXJlLml0ZXJhYmxlQ3Vycnk7XG5cbnZhciBfcmVxdWlyZTIgPSByZXF1aXJlKCcuLi8kc3BsaXQtd2hlbi9zcGxpdC13aGVuLmpzJyksXG4gICAgX19zcGxpdFdoZW4gPSBfcmVxdWlyZTIuX19zcGxpdFdoZW47XG5cbnZhciBfcmVxdWlyZTMgPSByZXF1aXJlKCcuLi8kaW5jbHVkZXMvaW5jbHVkZXMuanMnKSxcbiAgICBfX2luY2x1ZGVzID0gX3JlcXVpcmUzLl9faW5jbHVkZXM7XG5cbmZ1bmN0aW9uIF9fc3BsaXRPbkFueShzb3VyY2UsIHNlcGFyYXRvcnMpIHtcbiAgdmFyIHNhbWUgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IE9iamVjdC5pcztcbiAgcmV0dXJuIF9fc3BsaXRXaGVuKHNvdXJjZSwgZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgcmV0dXJuIF9faW5jbHVkZXMoc2VwYXJhdG9ycywgdmFsdWUsIGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICByZXR1cm4gc2FtZShiLCBhKTtcbiAgICB9KTtcbiAgfSk7XG59XG5cbmV4cG9ydHMuX19zcGxpdE9uQW55ID0gX19zcGxpdE9uQW55O1xudmFyIHNwbGl0T25BbnkgPSAvKiNfX1BVUkVfXyovaXRlcmFibGVDdXJyeShfX3NwbGl0T25BbnksIHtcbiAgbWluQXJnczogMSxcbiAgbWF4QXJnczogMixcbiAgdmFsaWRhdGVBcmdzOiBmdW5jdGlvbiB2YWxpZGF0ZUFyZ3MoYXJncykge1xuICAgIGlmICh0cnVlICYmIHR5cGVvZiBhcmdzWzBdID09PSAnc3RyaW5nJykge1xuICAgICAgY29uc29sZS53YXJuKFwiRm9yIHN0cmluZyBpbnB1dHMgdXNlIHNwbGl0T25BbnlTZXEgaW5zdGVhZCBvZiBzcGxpdE9uQW55XCIpO1xuICAgIH1cbiAgfVxufSk7XG5leHBvcnRzLnNwbGl0T25BbnkgPSBzcGxpdE9uQW55OyIsInZhciBfcmVxdWlyZSA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFsL2FzeW5jLWl0ZXJhYmxlLmpzJyksXG4gICAgYXN5bmNJdGVyYWJsZUN1cnJ5ID0gX3JlcXVpcmUuYXN5bmNJdGVyYWJsZUN1cnJ5LFxuICAgIGFzeW5jRW5zdXJlSXRlcmFibGUgPSBfcmVxdWlyZS5hc3luY0Vuc3VyZUl0ZXJhYmxlO1xuXG52YXIgX3JlcXVpcmUyID0gcmVxdWlyZSgnLi4vJHNwbGl0LW9uLWFueS1zZXEvYXN5bmMtc3BsaXQtb24tYW55LXNlcS5qcycpLFxuICAgIF9fYXN5bmNTcGxpdE9uQW55U2VxID0gX3JlcXVpcmUyLl9fYXN5bmNTcGxpdE9uQW55U2VxO1xuXG5mdW5jdGlvbiBfX2FzeW5jU3BsaXRPblNlcShzb3VyY2UsIHNlcGFyYXRvclNlcSkge1xuICB2YXIgc2FtZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogT2JqZWN0LmlzO1xuICByZXR1cm4gX19hc3luY1NwbGl0T25BbnlTZXEoc291cmNlLCBbc2VwYXJhdG9yU2VxXSwgc2FtZSk7XG59XG5cbmV4cG9ydHMuX19hc3luY1NwbGl0T25TZXEgPSBfX2FzeW5jU3BsaXRPblNlcTtcbnZhciBhc3luY1NwbGl0T25TZXEgPSAvKiNfX1BVUkVfXyovYXN5bmNJdGVyYWJsZUN1cnJ5KF9fYXN5bmNTcGxpdE9uU2VxLCB7XG4gIG1pbkFyZ3M6IDEsXG4gIG1heEFyZ3M6IDIsXG4gIHZhbGlkYXRlQXJnczogZnVuY3Rpb24gdmFsaWRhdGVBcmdzKGFyZ3MpIHtcbiAgICBhcmdzWzFdID0gYXN5bmNFbnN1cmVJdGVyYWJsZShhcmdzWzFdKTtcbiAgfVxufSk7XG5leHBvcnRzLmFzeW5jU3BsaXRPblNlcSA9IGFzeW5jU3BsaXRPblNlcTsiLCJ2YXIgX3JlcXVpcmUgPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbC9pdGVyYWJsZS5qcycpLFxuICAgIGl0ZXJhYmxlQ3VycnkgPSBfcmVxdWlyZS5pdGVyYWJsZUN1cnJ5LFxuICAgIGVuc3VyZUl0ZXJhYmxlID0gX3JlcXVpcmUuZW5zdXJlSXRlcmFibGU7XG5cbnZhciBfcmVxdWlyZTIgPSByZXF1aXJlKCcuLi8kc3BsaXQtb24tYW55LXNlcS9zcGxpdC1vbi1hbnktc2VxLmpzJyksXG4gICAgX19zcGxpdE9uQW55U2VxID0gX3JlcXVpcmUyLl9fc3BsaXRPbkFueVNlcTtcblxuZnVuY3Rpb24gX19zcGxpdE9uU2VxKHNvdXJjZSwgc2VwYXJhdG9yU2VxKSB7XG4gIHZhciBzYW1lID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiBPYmplY3QuaXM7XG4gIHJldHVybiBfX3NwbGl0T25BbnlTZXEoc291cmNlLCBbc2VwYXJhdG9yU2VxXSwgc2FtZSk7XG59XG5cbmV4cG9ydHMuX19zcGxpdE9uU2VxID0gX19zcGxpdE9uU2VxO1xudmFyIHNwbGl0T25TZXEgPSAvKiNfX1BVUkVfXyovaXRlcmFibGVDdXJyeShfX3NwbGl0T25TZXEsIHtcbiAgbWluQXJnczogMSxcbiAgbWF4QXJnczogMixcbiAgdmFsaWRhdGVBcmdzOiBmdW5jdGlvbiB2YWxpZGF0ZUFyZ3MoYXJncykge1xuICAgIGFyZ3NbMV0gPSBlbnN1cmVJdGVyYWJsZShhcmdzWzFdKTtcbiAgfVxufSk7XG5leHBvcnRzLnNwbGl0T25TZXEgPSBzcGxpdE9uU2VxOyIsInZhciBfcmVxdWlyZSA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFsL2FzeW5jLWl0ZXJhYmxlLmpzJyksXG4gICAgYXN5bmNJdGVyYWJsZUN1cnJ5ID0gX3JlcXVpcmUuYXN5bmNJdGVyYWJsZUN1cnJ5O1xuXG52YXIgX3JlcXVpcmUyID0gcmVxdWlyZSgnLi4vJHNwbGl0LXdoZW4vYXN5bmMtc3BsaXQtd2hlbi5qcycpLFxuICAgIF9fYXN5bmNTcGxpdFdoZW4gPSBfcmVxdWlyZTIuX19hc3luY1NwbGl0V2hlbjtcblxuZnVuY3Rpb24gX19hc3luY1NwbGl0T24oc291cmNlLCBzZXBhcmF0b3IpIHtcbiAgdmFyIHNhbWUgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IE9iamVjdC5pcztcbiAgcmV0dXJuIF9fYXN5bmNTcGxpdFdoZW4oc291cmNlLCBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICByZXR1cm4gc2FtZShzZXBhcmF0b3IsIHZhbHVlKTtcbiAgfSk7XG59XG5cbmV4cG9ydHMuX19hc3luY1NwbGl0T24gPSBfX2FzeW5jU3BsaXRPbjtcbnZhciBhc3luY1NwbGl0T24gPSAvKiNfX1BVUkVfXyovYXN5bmNJdGVyYWJsZUN1cnJ5KF9fYXN5bmNTcGxpdE9uLCB7XG4gIG1pbkFyZ3M6IDEsXG4gIG1heEFyZ3M6IDIsXG4gIHZhbGlkYXRlQXJnczogZnVuY3Rpb24gdmFsaWRhdGVBcmdzKGFyZ3MpIHt9XG59KTtcbmV4cG9ydHMuYXN5bmNTcGxpdE9uID0gYXN5bmNTcGxpdE9uOyIsInZhciBfcmVxdWlyZSA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFsL2l0ZXJhYmxlLmpzJyksXG4gICAgaXRlcmFibGVDdXJyeSA9IF9yZXF1aXJlLml0ZXJhYmxlQ3Vycnk7XG5cbnZhciBfcmVxdWlyZTIgPSByZXF1aXJlKCcuLi8kc3BsaXQtd2hlbi9zcGxpdC13aGVuLmpzJyksXG4gICAgX19zcGxpdFdoZW4gPSBfcmVxdWlyZTIuX19zcGxpdFdoZW47XG5cbmZ1bmN0aW9uIF9fc3BsaXRPbihzb3VyY2UsIHNlcGFyYXRvcikge1xuICB2YXIgc2FtZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogT2JqZWN0LmlzO1xuICByZXR1cm4gX19zcGxpdFdoZW4oc291cmNlLCBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICByZXR1cm4gc2FtZShzZXBhcmF0b3IsIHZhbHVlKTtcbiAgfSk7XG59XG5cbmV4cG9ydHMuX19zcGxpdE9uID0gX19zcGxpdE9uO1xudmFyIHNwbGl0T24gPSAvKiNfX1BVUkVfXyovaXRlcmFibGVDdXJyeShfX3NwbGl0T24sIHtcbiAgbWluQXJnczogMSxcbiAgbWF4QXJnczogMixcbiAgdmFsaWRhdGVBcmdzOiBmdW5jdGlvbiB2YWxpZGF0ZUFyZ3MoYXJncykge1xuICAgIGlmICh0cnVlICYmIHR5cGVvZiBhcmdzWzBdID09PSAnc3RyaW5nJykge1xuICAgICAgY29uc29sZS53YXJuKFwiRm9yIHN0cmluZyBpbnB1dHMgdXNlIHNwbGl0T25TZXEgaW5zdGVhZCBvZiBzcGxpdE9uXCIpO1xuICAgIH1cbiAgfVxufSk7XG5leHBvcnRzLnNwbGl0T24gPSBzcGxpdE9uOyIsInZhciBfcmVnZW5lcmF0b3JSdW50aW1lID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL3JlZ2VuZXJhdG9yXCIpO1xuXG52YXIgX2F3YWl0QXN5bmNHZW5lcmF0b3IgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9hd2FpdEFzeW5jR2VuZXJhdG9yXCIpO1xuXG52YXIgX3dyYXBBc3luY0dlbmVyYXRvciA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3dyYXBBc3luY0dlbmVyYXRvclwiKTtcblxudmFyIF9hc3luY0l0ZXJhdG9yID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvYXN5bmNJdGVyYXRvclwiKTtcblxudmFyIF9yZXF1aXJlID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWwvYXN5bmMtaXRlcmFibGUuanMnKSxcbiAgICBhc3luY0l0ZXJhYmxlQ3VycnkgPSBfcmVxdWlyZS5hc3luY0l0ZXJhYmxlQ3Vycnk7XG5cbnZhciBfcmVxdWlyZTIgPSByZXF1aXJlKCcuLi8kc3BsaXRlcmF0ZS9hc3luYy1zcGxpdGVyYXRlLmpzJyksXG4gICAgX19hc3luY1NwbGl0ZXJhdGUgPSBfcmVxdWlyZTIuX19hc3luY1NwbGl0ZXJhdGU7XG5cbmZ1bmN0aW9uIGFzeW5jUHJlZGljYXRlU3BsaXRlcmF0b3IoX3gsIF94MiwgX3gzKSB7XG4gIHJldHVybiBfYXN5bmNQcmVkaWNhdGVTcGxpdGVyYXRvci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuXG5mdW5jdGlvbiBfYXN5bmNQcmVkaWNhdGVTcGxpdGVyYXRvcigpIHtcbiAgX2FzeW5jUHJlZGljYXRlU3BsaXRlcmF0b3IgPSBfd3JhcEFzeW5jR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yUnVudGltZS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUoc3BsaXQsIF9yZWYsIHNvdXJjZSkge1xuICAgIHZhciBwcmVkaWNhdGUsIGksIF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24sIF9kaWRJdGVyYXRvckVycm9yLCBfaXRlcmF0b3JFcnJvciwgX2l0ZXJhdG9yLCBfc3RlcCwgX3ZhbHVlLCB2YWx1ZTtcblxuICAgIHJldHVybiBfcmVnZW5lcmF0b3JSdW50aW1lLndyYXAoZnVuY3Rpb24gX2NhbGxlZSQoX2NvbnRleHQpIHtcbiAgICAgIHdoaWxlICgxKSB7XG4gICAgICAgIHN3aXRjaCAoX2NvbnRleHQucHJldiA9IF9jb250ZXh0Lm5leHQpIHtcbiAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICBwcmVkaWNhdGUgPSBfcmVmLnByZWRpY2F0ZTtcbiAgICAgICAgICAgIGkgPSAwO1xuICAgICAgICAgICAgX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbiA9IHRydWU7XG4gICAgICAgICAgICBfZGlkSXRlcmF0b3JFcnJvciA9IGZhbHNlO1xuICAgICAgICAgICAgX2NvbnRleHQucHJldiA9IDQ7XG4gICAgICAgICAgICBfaXRlcmF0b3IgPSBfYXN5bmNJdGVyYXRvcihzb3VyY2UpO1xuXG4gICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDg7XG4gICAgICAgICAgICByZXR1cm4gX2F3YWl0QXN5bmNHZW5lcmF0b3IoX2l0ZXJhdG9yLm5leHQoKSk7XG5cbiAgICAgICAgICBjYXNlIDg6XG4gICAgICAgICAgICBfc3RlcCA9IF9jb250ZXh0LnNlbnQ7XG4gICAgICAgICAgICBfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uID0gX3N0ZXAuZG9uZTtcbiAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAxMjtcbiAgICAgICAgICAgIHJldHVybiBfYXdhaXRBc3luY0dlbmVyYXRvcihfc3RlcC52YWx1ZSk7XG5cbiAgICAgICAgICBjYXNlIDEyOlxuICAgICAgICAgICAgX3ZhbHVlID0gX2NvbnRleHQuc2VudDtcblxuICAgICAgICAgICAgaWYgKF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24pIHtcbiAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDI3O1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFsdWUgPSBfdmFsdWU7XG4gICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMTc7XG4gICAgICAgICAgICByZXR1cm4gX2F3YWl0QXN5bmNHZW5lcmF0b3IocHJlZGljYXRlKHZhbHVlLCBpKyspKTtcblxuICAgICAgICAgIGNhc2UgMTc6XG4gICAgICAgICAgICBpZiAoIV9jb250ZXh0LnNlbnQpIHtcbiAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDIxO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgX2NvbnRleHQudDAgPSBzcGxpdDtcbiAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAyMjtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSAyMTpcbiAgICAgICAgICAgIF9jb250ZXh0LnQwID0gdmFsdWU7XG5cbiAgICAgICAgICBjYXNlIDIyOlxuICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDI0O1xuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LnQwO1xuXG4gICAgICAgICAgY2FzZSAyNDpcbiAgICAgICAgICAgIF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24gPSB0cnVlO1xuICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDY7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgMjc6XG4gICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMzM7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgMjk6XG4gICAgICAgICAgICBfY29udGV4dC5wcmV2ID0gMjk7XG4gICAgICAgICAgICBfY29udGV4dC50MSA9IF9jb250ZXh0W1wiY2F0Y2hcIl0oNCk7XG4gICAgICAgICAgICBfZGlkSXRlcmF0b3JFcnJvciA9IHRydWU7XG4gICAgICAgICAgICBfaXRlcmF0b3JFcnJvciA9IF9jb250ZXh0LnQxO1xuXG4gICAgICAgICAgY2FzZSAzMzpcbiAgICAgICAgICAgIF9jb250ZXh0LnByZXYgPSAzMztcbiAgICAgICAgICAgIF9jb250ZXh0LnByZXYgPSAzNDtcblxuICAgICAgICAgICAgaWYgKCEoIV9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24gJiYgX2l0ZXJhdG9yW1wicmV0dXJuXCJdICE9IG51bGwpKSB7XG4gICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAzODtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAzODtcbiAgICAgICAgICAgIHJldHVybiBfYXdhaXRBc3luY0dlbmVyYXRvcihfaXRlcmF0b3JbXCJyZXR1cm5cIl0oKSk7XG5cbiAgICAgICAgICBjYXNlIDM4OlxuICAgICAgICAgICAgX2NvbnRleHQucHJldiA9IDM4O1xuXG4gICAgICAgICAgICBpZiAoIV9kaWRJdGVyYXRvckVycm9yKSB7XG4gICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSA0MTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRocm93IF9pdGVyYXRvckVycm9yO1xuXG4gICAgICAgICAgY2FzZSA0MTpcbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5maW5pc2goMzgpO1xuXG4gICAgICAgICAgY2FzZSA0MjpcbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5maW5pc2goMzMpO1xuXG4gICAgICAgICAgY2FzZSA0MzpcbiAgICAgICAgICBjYXNlIFwiZW5kXCI6XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuc3RvcCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwgX2NhbGxlZSwgbnVsbCwgW1s0LCAyOSwgMzMsIDQzXSwgWzM0LCwgMzgsIDQyXV0pO1xuICB9KSk7XG4gIHJldHVybiBfYXN5bmNQcmVkaWNhdGVTcGxpdGVyYXRvci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuXG5mdW5jdGlvbiBfX2FzeW5jU3BsaXRXaGVuKHNvdXJjZSwgcHJlZGljYXRlKSB7XG4gIHJldHVybiBfX2FzeW5jU3BsaXRlcmF0ZShzb3VyY2UsIGFzeW5jUHJlZGljYXRlU3BsaXRlcmF0b3IsIHtcbiAgICBwcmVkaWNhdGU6IHByZWRpY2F0ZVxuICB9KTtcbn1cblxuZXhwb3J0cy5fX2FzeW5jU3BsaXRXaGVuID0gX19hc3luY1NwbGl0V2hlbjtcbnZhciBhc3luY1NwbGl0V2hlbiA9IC8qI19fUFVSRV9fKi9hc3luY0l0ZXJhYmxlQ3VycnkoX19hc3luY1NwbGl0V2hlbik7XG5leHBvcnRzLmFzeW5jU3BsaXRXaGVuID0gYXN5bmNTcGxpdFdoZW47IiwidmFyIF9yZWdlbmVyYXRvclJ1bnRpbWUgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvcmVnZW5lcmF0b3JcIik7XG5cbnZhciBfbWFya2VkID0gLyojX19QVVJFX18qL19yZWdlbmVyYXRvclJ1bnRpbWUubWFyayhwcmVkaWNhdGVTcGxpdGVyYXRvcik7XG5cbmZ1bmN0aW9uIF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKG8sIGFsbG93QXJyYXlMaWtlKSB7IHZhciBpdDsgaWYgKHR5cGVvZiBTeW1ib2wgPT09IFwidW5kZWZpbmVkXCIgfHwgb1tTeW1ib2wuaXRlcmF0b3JdID09IG51bGwpIHsgaWYgKEFycmF5LmlzQXJyYXkobykgfHwgKGl0ID0gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8pKSB8fCBhbGxvd0FycmF5TGlrZSAmJiBvICYmIHR5cGVvZiBvLmxlbmd0aCA9PT0gXCJudW1iZXJcIikgeyBpZiAoaXQpIG8gPSBpdDsgdmFyIGkgPSAwOyB2YXIgRiA9IGZ1bmN0aW9uIEYoKSB7fTsgcmV0dXJuIHsgczogRiwgbjogZnVuY3Rpb24gbigpIHsgaWYgKGkgPj0gby5sZW5ndGgpIHJldHVybiB7IGRvbmU6IHRydWUgfTsgcmV0dXJuIHsgZG9uZTogZmFsc2UsIHZhbHVlOiBvW2krK10gfTsgfSwgZTogZnVuY3Rpb24gZShfZSkgeyB0aHJvdyBfZTsgfSwgZjogRiB9OyB9IHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gaXRlcmF0ZSBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTsgfSB2YXIgbm9ybWFsQ29tcGxldGlvbiA9IHRydWUsIGRpZEVyciA9IGZhbHNlLCBlcnI7IHJldHVybiB7IHM6IGZ1bmN0aW9uIHMoKSB7IGl0ID0gb1tTeW1ib2wuaXRlcmF0b3JdKCk7IH0sIG46IGZ1bmN0aW9uIG4oKSB7IHZhciBzdGVwID0gaXQubmV4dCgpOyBub3JtYWxDb21wbGV0aW9uID0gc3RlcC5kb25lOyByZXR1cm4gc3RlcDsgfSwgZTogZnVuY3Rpb24gZShfZTIpIHsgZGlkRXJyID0gdHJ1ZTsgZXJyID0gX2UyOyB9LCBmOiBmdW5jdGlvbiBmKCkgeyB0cnkgeyBpZiAoIW5vcm1hbENvbXBsZXRpb24gJiYgaXRbXCJyZXR1cm5cIl0gIT0gbnVsbCkgaXRbXCJyZXR1cm5cIl0oKTsgfSBmaW5hbGx5IHsgaWYgKGRpZEVycikgdGhyb3cgZXJyOyB9IH0gfTsgfVxuXG5mdW5jdGlvbiBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkobywgbWluTGVuKSB7IGlmICghbykgcmV0dXJuOyBpZiAodHlwZW9mIG8gPT09IFwic3RyaW5nXCIpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pOyB2YXIgbiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKS5zbGljZSg4LCAtMSk7IGlmIChuID09PSBcIk9iamVjdFwiICYmIG8uY29uc3RydWN0b3IpIG4gPSBvLmNvbnN0cnVjdG9yLm5hbWU7IGlmIChuID09PSBcIk1hcFwiIHx8IG4gPT09IFwiU2V0XCIpIHJldHVybiBBcnJheS5mcm9tKG8pOyBpZiAobiA9PT0gXCJBcmd1bWVudHNcIiB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSkgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IH1cblxuZnVuY3Rpb24gX2FycmF5TGlrZVRvQXJyYXkoYXJyLCBsZW4pIHsgaWYgKGxlbiA9PSBudWxsIHx8IGxlbiA+IGFyci5sZW5ndGgpIGxlbiA9IGFyci5sZW5ndGg7IGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGxlbik7IGkgPCBsZW47IGkrKykgeyBhcnIyW2ldID0gYXJyW2ldOyB9IHJldHVybiBhcnIyOyB9XG5cbnZhciBfcmVxdWlyZSA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFsL2l0ZXJhYmxlLmpzJyksXG4gICAgaXRlcmFibGVDdXJyeSA9IF9yZXF1aXJlLml0ZXJhYmxlQ3Vycnk7XG5cbnZhciBfcmVxdWlyZTIgPSByZXF1aXJlKCcuLi8kc3BsaXRlcmF0ZS9zcGxpdGVyYXRlLmpzJyksXG4gICAgX19zcGxpdGVyYXRlID0gX3JlcXVpcmUyLl9fc3BsaXRlcmF0ZTtcblxuZnVuY3Rpb24gcHJlZGljYXRlU3BsaXRlcmF0b3Ioc3BsaXQsIF9yZWYsIHNvdXJjZSkge1xuICB2YXIgcHJlZGljYXRlLCBpLCBfaXRlcmF0b3IsIF9zdGVwLCB2YWx1ZTtcblxuICByZXR1cm4gX3JlZ2VuZXJhdG9yUnVudGltZS53cmFwKGZ1bmN0aW9uIHByZWRpY2F0ZVNwbGl0ZXJhdG9yJChfY29udGV4dCkge1xuICAgIHdoaWxlICgxKSB7XG4gICAgICBzd2l0Y2ggKF9jb250ZXh0LnByZXYgPSBfY29udGV4dC5uZXh0KSB7XG4gICAgICAgIGNhc2UgMDpcbiAgICAgICAgICBwcmVkaWNhdGUgPSBfcmVmLnByZWRpY2F0ZTtcbiAgICAgICAgICBpID0gMDtcbiAgICAgICAgICBfaXRlcmF0b3IgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihzb3VyY2UpO1xuICAgICAgICAgIF9jb250ZXh0LnByZXYgPSAzO1xuXG4gICAgICAgICAgX2l0ZXJhdG9yLnMoKTtcblxuICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgaWYgKChfc3RlcCA9IF9pdGVyYXRvci5uKCkpLmRvbmUpIHtcbiAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAxMTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhbHVlID0gX3N0ZXAudmFsdWU7XG4gICAgICAgICAgX2NvbnRleHQubmV4dCA9IDk7XG4gICAgICAgICAgcmV0dXJuIHByZWRpY2F0ZSh2YWx1ZSwgaSsrKSA/IHNwbGl0IDogdmFsdWU7XG5cbiAgICAgICAgY2FzZSA5OlxuICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSA1O1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgMTE6XG4gICAgICAgICAgX2NvbnRleHQubmV4dCA9IDE2O1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgMTM6XG4gICAgICAgICAgX2NvbnRleHQucHJldiA9IDEzO1xuICAgICAgICAgIF9jb250ZXh0LnQwID0gX2NvbnRleHRbXCJjYXRjaFwiXSgzKTtcblxuICAgICAgICAgIF9pdGVyYXRvci5lKF9jb250ZXh0LnQwKTtcblxuICAgICAgICBjYXNlIDE2OlxuICAgICAgICAgIF9jb250ZXh0LnByZXYgPSAxNjtcblxuICAgICAgICAgIF9pdGVyYXRvci5mKCk7XG5cbiAgICAgICAgICByZXR1cm4gX2NvbnRleHQuZmluaXNoKDE2KTtcblxuICAgICAgICBjYXNlIDE5OlxuICAgICAgICBjYXNlIFwiZW5kXCI6XG4gICAgICAgICAgcmV0dXJuIF9jb250ZXh0LnN0b3AoKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIF9tYXJrZWQsIG51bGwsIFtbMywgMTMsIDE2LCAxOV1dKTtcbn1cblxuZnVuY3Rpb24gX19zcGxpdFdoZW4oc291cmNlLCBwcmVkaWNhdGUpIHtcbiAgcmV0dXJuIF9fc3BsaXRlcmF0ZShzb3VyY2UsIHByZWRpY2F0ZVNwbGl0ZXJhdG9yLCB7XG4gICAgcHJlZGljYXRlOiBwcmVkaWNhdGVcbiAgfSk7XG59XG5cbmV4cG9ydHMuX19zcGxpdFdoZW4gPSBfX3NwbGl0V2hlbjtcbnZhciBzcGxpdFdoZW4gPSAvKiNfX1BVUkVfXyovaXRlcmFibGVDdXJyeShfX3NwbGl0V2hlbik7XG5leHBvcnRzLnNwbGl0V2hlbiA9IHNwbGl0V2hlbjsiLCJ2YXIgX3JlZ2VuZXJhdG9yUnVudGltZSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9yZWdlbmVyYXRvclwiKTtcblxudmFyIF9tYXJrZWQgPSAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yUnVudGltZS5tYXJrKGl0ZXJhYmxlT2YpO1xuXG52YXIgX3JlcXVpcmUgPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbC9hc3luYy1pdGVyYWJsZS5qcycpLFxuICAgIGFzeW5jSXRlcmFibGVDdXJyeSA9IF9yZXF1aXJlLmFzeW5jSXRlcmFibGVDdXJyeTtcblxudmFyIF9yZXF1aXJlMiA9IHJlcXVpcmUoJy4uLyRtYXAvYXN5bmMtbWFwLmpzJyksXG4gICAgX19hc3luY01hcCA9IF9yZXF1aXJlMi5fX2FzeW5jTWFwO1xuXG5mdW5jdGlvbiBpdGVyYWJsZU9mKHZhbHVlKSB7XG4gIHJldHVybiBfcmVnZW5lcmF0b3JSdW50aW1lLndyYXAoZnVuY3Rpb24gaXRlcmFibGVPZiQoX2NvbnRleHQpIHtcbiAgICB3aGlsZSAoMSkge1xuICAgICAgc3dpdGNoIChfY29udGV4dC5wcmV2ID0gX2NvbnRleHQubmV4dCkge1xuICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgX2NvbnRleHQubmV4dCA9IDI7XG4gICAgICAgICAgcmV0dXJuIHZhbHVlO1xuXG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgY2FzZSBcImVuZFwiOlxuICAgICAgICAgIHJldHVybiBfY29udGV4dC5zdG9wKCk7XG4gICAgICB9XG4gICAgfVxuICB9LCBfbWFya2VkKTtcbn1cblxuZnVuY3Rpb24gX19hc3luY1NwbGl0KHNvdXJjZSkge1xuICByZXR1cm4gX19hc3luY01hcChzb3VyY2UsIGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgIHJldHVybiBpdGVyYWJsZU9mKHZhbHVlKTtcbiAgfSk7XG59XG5cbmV4cG9ydHMuX19hc3luY1NwbGl0ID0gX19hc3luY1NwbGl0O1xudmFyIGFzeW5jU3BsaXQgPSAvKiNfX1BVUkVfXyovYXN5bmNJdGVyYWJsZUN1cnJ5KF9fYXN5bmNTcGxpdCk7XG5leHBvcnRzLmFzeW5jU3BsaXQgPSBhc3luY1NwbGl0OyIsInZhciBfcmVnZW5lcmF0b3JSdW50aW1lID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL3JlZ2VuZXJhdG9yXCIpO1xuXG52YXIgX21hcmtlZCA9IC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3JSdW50aW1lLm1hcmsoaXRlcmFibGVPZik7XG5cbnZhciBfcmVxdWlyZSA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFsL2l0ZXJhYmxlLmpzJyksXG4gICAgaXRlcmFibGVDdXJyeSA9IF9yZXF1aXJlLml0ZXJhYmxlQ3Vycnk7XG5cbnZhciBfcmVxdWlyZTIgPSByZXF1aXJlKCcuLi8kbWFwL21hcC5qcycpLFxuICAgIF9fbWFwID0gX3JlcXVpcmUyLl9fbWFwO1xuXG5mdW5jdGlvbiBpdGVyYWJsZU9mKHZhbHVlKSB7XG4gIHJldHVybiBfcmVnZW5lcmF0b3JSdW50aW1lLndyYXAoZnVuY3Rpb24gaXRlcmFibGVPZiQoX2NvbnRleHQpIHtcbiAgICB3aGlsZSAoMSkge1xuICAgICAgc3dpdGNoIChfY29udGV4dC5wcmV2ID0gX2NvbnRleHQubmV4dCkge1xuICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgX2NvbnRleHQubmV4dCA9IDI7XG4gICAgICAgICAgcmV0dXJuIHZhbHVlO1xuXG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgY2FzZSBcImVuZFwiOlxuICAgICAgICAgIHJldHVybiBfY29udGV4dC5zdG9wKCk7XG4gICAgICB9XG4gICAgfVxuICB9LCBfbWFya2VkKTtcbn1cblxuZnVuY3Rpb24gX19zcGxpdChzb3VyY2UpIHtcbiAgcmV0dXJuIF9fbWFwKHNvdXJjZSwgZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgcmV0dXJuIGl0ZXJhYmxlT2YodmFsdWUpO1xuICB9KTtcbn1cblxuZXhwb3J0cy5fX3NwbGl0ID0gX19zcGxpdDtcbnZhciBzcGxpdCA9IC8qI19fUFVSRV9fKi9pdGVyYWJsZUN1cnJ5KF9fc3BsaXQpO1xuZXhwb3J0cy5zcGxpdCA9IHNwbGl0OyIsInZhciBfcmVxdWlyZSA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFsL2FzeW5jLWl0ZXJhYmxlLmpzJyksXG4gICAgYXN5bmNJdGVyYWJsZUN1cnJ5ID0gX3JlcXVpcmUuYXN5bmNJdGVyYWJsZUN1cnJ5O1xuXG52YXIgX3JlcXVpcmUyID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWwvYXN5bmMtZ3JvdXBzLWl0ZXJhdG9yLmpzJyksXG4gICAgQXN5bmNHcm91cHNJdGVyYXRvciA9IF9yZXF1aXJlMi5Bc3luY0dyb3Vwc0l0ZXJhdG9yO1xuXG52YXIgX3JlcXVpcmUzID0gcmVxdWlyZSgnLi4vJG1hcC9hc3luYy1tYXAuanMnKSxcbiAgICBfX2FzeW5jTWFwID0gX3JlcXVpcmUzLl9fYXN5bmNNYXA7XG5cbnZhciBfcmVxdWlyZTQgPSByZXF1aXJlKCcuLi8kd3JhcC9hc3luYy13cmFwLmpzJyksXG4gICAgX19hc3luY1dyYXAgPSBfcmVxdWlyZTQuX19hc3luY1dyYXA7XG5cbmZ1bmN0aW9uIF9fYXN5bmNTcGxpdGVyYXRlR3JvdXBlZChzb3VyY2UsIHN0cmF0ZWd5KSB7XG4gIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiB7fTtcbiAgcmV0dXJuIG5ldyBBc3luY0dyb3Vwc0l0ZXJhdG9yKHNvdXJjZSwgc3RyYXRlZ3ksIG9wdGlvbnMpO1xufVxuXG5leHBvcnRzLl9fYXN5bmNTcGxpdGVyYXRlR3JvdXBlZCA9IF9fYXN5bmNTcGxpdGVyYXRlR3JvdXBlZDtcbnZhciBhc3luY1NwbGl0ZXJhdGVHcm91cGVkID0gLyojX19QVVJFX18qL2FzeW5jSXRlcmFibGVDdXJyeShmdW5jdGlvbiAkc3BsaXRlcmF0ZUdyb3VwZWQoKSB7XG4gIHJldHVybiBfX2FzeW5jTWFwKF9fYXN5bmNTcGxpdGVyYXRlR3JvdXBlZC5hcHBseSh2b2lkIDAsIGFyZ3VtZW50cyksIF9fYXN5bmNXcmFwKTtcbn0sIHtcbiAgbWluQXJnczogMSxcbiAgbWF4QXJnczogMixcbiAgZ3Jvd1JpZ2h0OiB0cnVlXG59KTtcbmV4cG9ydHMuYXN5bmNTcGxpdGVyYXRlR3JvdXBlZCA9IGFzeW5jU3BsaXRlcmF0ZUdyb3VwZWQ7IiwidmFyIF9yZXF1aXJlID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWwvaXRlcmFibGUuanMnKSxcbiAgICBpdGVyYWJsZUN1cnJ5ID0gX3JlcXVpcmUuaXRlcmFibGVDdXJyeTtcblxudmFyIF9yZXF1aXJlMiA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFsL2dyb3Vwcy1pdGVyYXRvci5qcycpLFxuICAgIEdyb3Vwc0l0ZXJhdG9yID0gX3JlcXVpcmUyLkdyb3Vwc0l0ZXJhdG9yO1xuXG52YXIgX3JlcXVpcmUzID0gcmVxdWlyZSgnLi4vJG1hcC9tYXAuanMnKSxcbiAgICBfX21hcCA9IF9yZXF1aXJlMy5fX21hcDtcblxudmFyIF9yZXF1aXJlNCA9IHJlcXVpcmUoJy4uLyR3cmFwL3dyYXAuanMnKSxcbiAgICBfX3dyYXAgPSBfcmVxdWlyZTQuX193cmFwO1xuXG5mdW5jdGlvbiBfX3NwbGl0ZXJhdGVHcm91cGVkKHNvdXJjZSwgc3RyYXRlZ3kpIHtcbiAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IHt9O1xuICByZXR1cm4gbmV3IEdyb3Vwc0l0ZXJhdG9yKHNvdXJjZSwgc3RyYXRlZ3ksIG9wdGlvbnMpO1xufVxuXG5leHBvcnRzLl9fc3BsaXRlcmF0ZUdyb3VwZWQgPSBfX3NwbGl0ZXJhdGVHcm91cGVkO1xudmFyIHNwbGl0ZXJhdGVHcm91cGVkID0gLyojX19QVVJFX18qL2l0ZXJhYmxlQ3VycnkoZnVuY3Rpb24gJHNwbGl0ZXJhdGVHcm91cGVkKCkge1xuICByZXR1cm4gX19tYXAoX19zcGxpdGVyYXRlR3JvdXBlZC5hcHBseSh2b2lkIDAsIGFyZ3VtZW50cyksIF9fd3JhcCk7XG59LCB7XG4gIG1pbkFyZ3M6IDEsXG4gIG1heEFyZ3M6IDIsXG4gIGdyb3dSaWdodDogdHJ1ZVxufSk7XG5leHBvcnRzLnNwbGl0ZXJhdGVHcm91cGVkID0gc3BsaXRlcmF0ZUdyb3VwZWQ7IiwidmFyIF9yZXF1aXJlID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWwvYXN5bmMtaXRlcmFibGUuanMnKSxcbiAgICBhc3luY0l0ZXJhYmxlQ3VycnkgPSBfcmVxdWlyZS5hc3luY0l0ZXJhYmxlQ3Vycnk7XG5cbnZhciBfcmVxdWlyZTIgPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbC9hc3luYy1wYXJ0cy1pdGVyYXRvci5qcycpLFxuICAgIEFzeW5jUGFydHNJdGVyYXRvciA9IF9yZXF1aXJlMi5Bc3luY1BhcnRzSXRlcmF0b3I7XG5cbnZhciBfcmVxdWlyZTMgPSByZXF1aXJlKCcuLi8kbWFwL2FzeW5jLW1hcC5qcycpLFxuICAgIF9fYXN5bmNNYXAgPSBfcmVxdWlyZTMuX19hc3luY01hcDtcblxudmFyIF9yZXF1aXJlNCA9IHJlcXVpcmUoJy4uLyR3cmFwL2FzeW5jLXdyYXAuanMnKSxcbiAgICBfX2FzeW5jV3JhcCA9IF9yZXF1aXJlNC5fX2FzeW5jV3JhcDtcblxuZnVuY3Rpb24gX19hc3luY1NwbGl0ZXJhdGUoc291cmNlLCBzdHJhdGVneSkge1xuICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDoge307XG4gIHJldHVybiBuZXcgQXN5bmNQYXJ0c0l0ZXJhdG9yKHNvdXJjZSwgc3RyYXRlZ3ksIG9wdGlvbnMpO1xufVxuXG5leHBvcnRzLl9fYXN5bmNTcGxpdGVyYXRlID0gX19hc3luY1NwbGl0ZXJhdGU7XG52YXIgYXN5bmNTcGxpdGVyYXRlID0gLyojX19QVVJFX18qL2FzeW5jSXRlcmFibGVDdXJyeShmdW5jdGlvbiAkc3BsaXRlcmF0ZSgpIHtcbiAgcmV0dXJuIF9fYXN5bmNNYXAoX19hc3luY1NwbGl0ZXJhdGUuYXBwbHkodm9pZCAwLCBhcmd1bWVudHMpLCBfX2FzeW5jV3JhcCk7XG59LCB7XG4gIG1pbkFyZ3M6IDEsXG4gIG1heEFyZ3M6IDIsXG4gIGdyb3dSaWdodDogdHJ1ZVxufSk7XG5leHBvcnRzLmFzeW5jU3BsaXRlcmF0ZSA9IGFzeW5jU3BsaXRlcmF0ZTsiLCJ2YXIgX3JlcXVpcmUgPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbC9pdGVyYWJsZS5qcycpLFxuICAgIGl0ZXJhYmxlQ3VycnkgPSBfcmVxdWlyZS5pdGVyYWJsZUN1cnJ5O1xuXG52YXIgX3JlcXVpcmUyID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWwvcGFydHMtaXRlcmF0b3IuanMnKSxcbiAgICBQYXJ0c0l0ZXJhdG9yID0gX3JlcXVpcmUyLlBhcnRzSXRlcmF0b3I7XG5cbnZhciBfcmVxdWlyZTMgPSByZXF1aXJlKCcuLi8kbWFwL21hcC5qcycpLFxuICAgIF9fbWFwID0gX3JlcXVpcmUzLl9fbWFwO1xuXG52YXIgX3JlcXVpcmU0ID0gcmVxdWlyZSgnLi4vJHdyYXAvd3JhcC5qcycpLFxuICAgIF9fd3JhcCA9IF9yZXF1aXJlNC5fX3dyYXA7XG5cbmZ1bmN0aW9uIF9fc3BsaXRlcmF0ZShzb3VyY2UsIHN0cmF0ZWd5KSB7XG4gIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiB7fTtcbiAgcmV0dXJuIG5ldyBQYXJ0c0l0ZXJhdG9yKHNvdXJjZSwgc3RyYXRlZ3ksIG9wdGlvbnMpO1xufVxuXG5leHBvcnRzLl9fc3BsaXRlcmF0ZSA9IF9fc3BsaXRlcmF0ZTtcbnZhciBzcGxpdGVyYXRlID0gLyojX19QVVJFX18qL2l0ZXJhYmxlQ3VycnkoZnVuY3Rpb24gJHNwbGl0ZXJhdGUoKSB7XG4gIHJldHVybiBfX21hcChfX3NwbGl0ZXJhdGUuYXBwbHkodm9pZCAwLCBhcmd1bWVudHMpLCBfX3dyYXApO1xufSwge1xuICBtaW5BcmdzOiAxLFxuICBtYXhBcmdzOiAyLFxuICBncm93UmlnaHQ6IHRydWVcbn0pO1xuZXhwb3J0cy5zcGxpdGVyYXRlID0gc3BsaXRlcmF0ZTsiLCJ2YXIgX3JlZ2VuZXJhdG9yUnVudGltZSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9yZWdlbmVyYXRvclwiKTtcblxudmFyIF9hc3luY1RvR2VuZXJhdG9yID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvYXN5bmNUb0dlbmVyYXRvclwiKTtcblxudmFyIF9yZXF1aXJlID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWwvYXN5bmMtaXRlcmFibGUuanMnKSxcbiAgICBhc3luY0l0ZXJhYmxlQ3VycnkgPSBfcmVxdWlyZS5hc3luY0l0ZXJhYmxlQ3VycnksXG4gICAgYXN5bmNFbnN1cmVJdGVyYWJsZSA9IF9yZXF1aXJlLmFzeW5jRW5zdXJlSXRlcmFibGU7XG5cbnZhciBfcmVxdWlyZTIgPSByZXF1aXJlKCcuLi8kemlwLWFsbC9hc3luYy16aXAtYWxsLmpzJyksXG4gICAgX19hc3luY1ppcEFsbCA9IF9yZXF1aXJlMi5fX2FzeW5jWmlwQWxsO1xuXG52YXIgX3JlcXVpcmUzID0gcmVxdWlyZSgnLi4vJHBlZWtlcmF0ZS9hc3luYy1wZWVrZXJhdGUuanMnKSxcbiAgICBfX2FzeW5jUGVla2VyYXRlID0gX3JlcXVpcmUzLl9fYXN5bmNQZWVrZXJhdGU7XG5cbnZhciBub25lID0gU3ltYm9sKCdub25lJyk7XG5cbmZ1bmN0aW9uIF9hc3luY1N0YXJ0c1dpdGhBbnlTZXEoX3gsIF94MiwgX3gzKSB7XG4gIHJldHVybiBfYXN5bmNTdGFydHNXaXRoQW55U2VxMi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuXG5mdW5jdGlvbiBfYXN5bmNTdGFydHNXaXRoQW55U2VxMigpIHtcbiAgX2FzeW5jU3RhcnRzV2l0aEFueVNlcTIgPSBfYXN5bmNUb0dlbmVyYXRvciggLyojX19QVVJFX18qL19yZWdlbmVyYXRvclJ1bnRpbWUubWFyayhmdW5jdGlvbiBfY2FsbGVlKHBlZWtyLCBzdWJzZXFQZWVrciwgc2FtZSkge1xuICAgIHZhciBtYXRjaGVzLCB2YWx1ZSwgc2VxVmFsdWUsIGk7XG4gICAgcmV0dXJuIF9yZWdlbmVyYXRvclJ1bnRpbWUud3JhcChmdW5jdGlvbiBfY2FsbGVlJChfY29udGV4dCkge1xuICAgICAgd2hpbGUgKDEpIHtcbiAgICAgICAgc3dpdGNoIChfY29udGV4dC5wcmV2ID0gX2NvbnRleHQubmV4dCkge1xuICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgIGlmICghKHN1YnNlcVBlZWtyLmRvbmUgfHwgc3Vic2VxUGVla3IudmFsdWUuaW5jbHVkZXMobm9uZSkpKSB7XG4gICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAyO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LmFicnVwdChcInJldHVyblwiLCB0cnVlKTtcblxuICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgIG1hdGNoZXMgPSBzdWJzZXFQZWVrci52YWx1ZS5tYXAoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgaWYgKCEoIXBlZWtyLmRvbmUgJiYgIXN1YnNlcVBlZWtyLmRvbmUpKSB7XG4gICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAyMjtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhbHVlID0gcGVla3IudmFsdWU7XG4gICAgICAgICAgICBzZXFWYWx1ZSA9IHN1YnNlcVBlZWtyLnZhbHVlO1xuICAgICAgICAgICAgaSA9IDA7XG5cbiAgICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgICBpZiAoIShpIDwgc2VxVmFsdWUubGVuZ3RoKSkge1xuICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMTg7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAobWF0Y2hlc1tpXSkge1xuICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMTA7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuYWJydXB0KFwiY29udGludWVcIiwgMTUpO1xuXG4gICAgICAgICAgY2FzZSAxMDpcbiAgICAgICAgICAgIGlmICghKHNlcVZhbHVlW2ldID09PSBub25lKSkge1xuICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMTQ7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuYWJydXB0KFwicmV0dXJuXCIsIHRydWUpO1xuXG4gICAgICAgICAgY2FzZSAxNDpcbiAgICAgICAgICAgIG1hdGNoZXNbaV0gPSBzYW1lKHNlcVZhbHVlW2ldLCB2YWx1ZSk7XG5cbiAgICAgICAgICBjYXNlIDE1OlxuICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDc7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgMTg6XG4gICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMjA7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwoW3N1YnNlcVBlZWtyLmFkdmFuY2UoKSwgcGVla3IuYWR2YW5jZSgpXSk7XG5cbiAgICAgICAgICBjYXNlIDIwOlxuICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDM7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgMjI6XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuYWJydXB0KFwicmV0dXJuXCIsIHN1YnNlcVBlZWtyLmRvbmUgJiYgbWF0Y2hlcy5pbmNsdWRlcyh0cnVlKSk7XG5cbiAgICAgICAgICBjYXNlIDIzOlxuICAgICAgICAgIGNhc2UgXCJlbmRcIjpcbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5zdG9wKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCBfY2FsbGVlKTtcbiAgfSkpO1xuICByZXR1cm4gX2FzeW5jU3RhcnRzV2l0aEFueVNlcTIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cblxuZXhwb3J0cy5fYXN5bmNTdGFydHNXaXRoQW55U2VxID0gX2FzeW5jU3RhcnRzV2l0aEFueVNlcTtcblxuZnVuY3Rpb24gX19hc3luY1N0YXJ0c1dpdGhBbnlTZXEoX3g0LCBfeDUpIHtcbiAgcmV0dXJuIF9hc3luY1N0YXJ0c1dpdGhBbnlTZXEzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5cbmZ1bmN0aW9uIF9hc3luY1N0YXJ0c1dpdGhBbnlTZXEzKCkge1xuICBfYXN5bmNTdGFydHNXaXRoQW55U2VxMyA9IF9hc3luY1RvR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yUnVudGltZS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUyKGl0ZXJhYmxlLCBzZXFzKSB7XG4gICAgdmFyIHNhbWUsXG4gICAgICAgIHBlZWtyLFxuICAgICAgICBzdWJzZXFQZWVrcixcbiAgICAgICAgc2VxRm91bmQsXG4gICAgICAgIF9hcmdzMiA9IGFyZ3VtZW50cztcbiAgICByZXR1cm4gX3JlZ2VuZXJhdG9yUnVudGltZS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUyJChfY29udGV4dDIpIHtcbiAgICAgIHdoaWxlICgxKSB7XG4gICAgICAgIHN3aXRjaCAoX2NvbnRleHQyLnByZXYgPSBfY29udGV4dDIubmV4dCkge1xuICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgIHNhbWUgPSBfYXJnczIubGVuZ3RoID4gMiAmJiBfYXJnczJbMl0gIT09IHVuZGVmaW5lZCA/IF9hcmdzMlsyXSA6IE9iamVjdC5pcztcblxuICAgICAgICAgICAgaWYgKHNlcXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgIF9jb250ZXh0Mi5uZXh0ID0gMztcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dDIuYWJydXB0KFwicmV0dXJuXCIsIGZhbHNlKTtcblxuICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgIF9jb250ZXh0Mi5uZXh0ID0gNTtcbiAgICAgICAgICAgIHJldHVybiBfX2FzeW5jUGVla2VyYXRlKGl0ZXJhYmxlKTtcblxuICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgIHBlZWtyID0gX2NvbnRleHQyLnNlbnQ7XG4gICAgICAgICAgICBfY29udGV4dDIubmV4dCA9IDg7XG4gICAgICAgICAgICByZXR1cm4gX19hc3luY1BlZWtlcmF0ZShfX2FzeW5jWmlwQWxsKHNlcXMsIHtcbiAgICAgICAgICAgICAgZmlsbGVyOiBub25lXG4gICAgICAgICAgICB9KSk7XG5cbiAgICAgICAgICBjYXNlIDg6XG4gICAgICAgICAgICBzdWJzZXFQZWVrciA9IF9jb250ZXh0Mi5zZW50O1xuICAgICAgICAgICAgX2NvbnRleHQyLm5leHQgPSAxMTtcbiAgICAgICAgICAgIHJldHVybiBfYXN5bmNTdGFydHNXaXRoQW55U2VxKHBlZWtyLCBzdWJzZXFQZWVrciwgc2FtZSk7XG5cbiAgICAgICAgICBjYXNlIDExOlxuICAgICAgICAgICAgc2VxRm91bmQgPSBfY29udGV4dDIuc2VudDtcbiAgICAgICAgICAgIF9jb250ZXh0Mi5uZXh0ID0gMTQ7XG4gICAgICAgICAgICByZXR1cm4gc3Vic2VxUGVla3JbXCJyZXR1cm5cIl0oKTtcblxuICAgICAgICAgIGNhc2UgMTQ6XG4gICAgICAgICAgICBfY29udGV4dDIubmV4dCA9IDE2O1xuICAgICAgICAgICAgcmV0dXJuIHBlZWtyW1wicmV0dXJuXCJdKCk7XG5cbiAgICAgICAgICBjYXNlIDE2OlxuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0Mi5hYnJ1cHQoXCJyZXR1cm5cIiwgc2VxRm91bmQpO1xuXG4gICAgICAgICAgY2FzZSAxNzpcbiAgICAgICAgICBjYXNlIFwiZW5kXCI6XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQyLnN0b3AoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sIF9jYWxsZWUyKTtcbiAgfSkpO1xuICByZXR1cm4gX2FzeW5jU3RhcnRzV2l0aEFueVNlcTMuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cblxuZXhwb3J0cy5fX2FzeW5jU3RhcnRzV2l0aEFueVNlcSA9IF9fYXN5bmNTdGFydHNXaXRoQW55U2VxO1xudmFyIGFzeW5jU3RhcnRzV2l0aEFueVNlcSA9IC8qI19fUFVSRV9fKi9hc3luY0l0ZXJhYmxlQ3VycnkoX19hc3luY1N0YXJ0c1dpdGhBbnlTZXEsIHtcbiAgbWluQXJnczogMSxcbiAgbWF4QXJnczogMixcbiAgcmVkdWNlczogdHJ1ZSxcbiAgdmFsaWRhdGVBcmdzOiBmdW5jdGlvbiB2YWxpZGF0ZUFyZ3MoYXJncykge1xuICAgIGFyZ3NbMV0gPSBhcmdzWzFdLm1hcChmdW5jdGlvbiAoYXJnKSB7XG4gICAgICByZXR1cm4gYXN5bmNFbnN1cmVJdGVyYWJsZShhcmcpO1xuICAgIH0pO1xuICB9XG59KTtcbmV4cG9ydHMuYXN5bmNTdGFydHNXaXRoQW55U2VxID0gYXN5bmNTdGFydHNXaXRoQW55U2VxOyIsInZhciBfcmVxdWlyZSA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFsL2l0ZXJhYmxlLmpzJyksXG4gICAgaXRlcmFibGVDdXJyeSA9IF9yZXF1aXJlLml0ZXJhYmxlQ3VycnksXG4gICAgZW5zdXJlSXRlcmFibGUgPSBfcmVxdWlyZS5lbnN1cmVJdGVyYWJsZTtcblxudmFyIF9yZXF1aXJlMiA9IHJlcXVpcmUoJy4uLyR6aXAtYWxsL3ppcC1hbGwuanMnKSxcbiAgICBfX3ppcEFsbCA9IF9yZXF1aXJlMi5fX3ppcEFsbDtcblxudmFyIF9yZXF1aXJlMyA9IHJlcXVpcmUoJy4uLyRwZWVrZXJhdGUvcGVla2VyYXRlLmpzJyksXG4gICAgX19wZWVrZXJhdGUgPSBfcmVxdWlyZTMuX19wZWVrZXJhdGU7XG5cbnZhciBub25lID0gU3ltYm9sKCdub25lJyk7XG5cbmZ1bmN0aW9uIF9zdGFydHNXaXRoQW55U2VxKHBlZWtyLCBzdWJzZXFQZWVrciwgc2FtZSkge1xuICBpZiAoc3Vic2VxUGVla3IuZG9uZSB8fCBzdWJzZXFQZWVrci52YWx1ZS5pbmNsdWRlcyhub25lKSkgcmV0dXJuIHRydWU7XG4gIHZhciBtYXRjaGVzID0gc3Vic2VxUGVla3IudmFsdWUubWFwKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSk7XG5cbiAgd2hpbGUgKCFwZWVrci5kb25lICYmICFzdWJzZXFQZWVrci5kb25lKSB7XG4gICAgdmFyIHZhbHVlID0gcGVla3IudmFsdWU7XG4gICAgdmFyIHNlcVZhbHVlID0gc3Vic2VxUGVla3IudmFsdWU7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNlcVZhbHVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoIW1hdGNoZXNbaV0pIGNvbnRpbnVlO1xuXG4gICAgICBpZiAoc2VxVmFsdWVbaV0gPT09IG5vbmUpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBtYXRjaGVzW2ldID0gc2FtZShzZXFWYWx1ZVtpXSwgdmFsdWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHN1YnNlcVBlZWtyLmFkdmFuY2UoKTtcbiAgICBwZWVrci5hZHZhbmNlKCk7XG4gIH1cblxuICByZXR1cm4gc3Vic2VxUGVla3IuZG9uZSAmJiBtYXRjaGVzLmluY2x1ZGVzKHRydWUpO1xufVxuXG5leHBvcnRzLl9zdGFydHNXaXRoQW55U2VxID0gX3N0YXJ0c1dpdGhBbnlTZXE7XG5cbmZ1bmN0aW9uIF9fc3RhcnRzV2l0aEFueVNlcShpdGVyYWJsZSwgc2Vxcykge1xuICB2YXIgc2FtZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogT2JqZWN0LmlzO1xuICBpZiAoIXNlcXMubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG5cbiAgdmFyIHBlZWtyID0gX19wZWVrZXJhdGUoaXRlcmFibGUpO1xuXG4gIHZhciBzdWJzZXFQZWVrciA9IF9fcGVla2VyYXRlKF9femlwQWxsKHNlcXMsIHtcbiAgICBmaWxsZXI6IG5vbmVcbiAgfSkpO1xuXG4gIHZhciBzZXFGb3VuZCA9IF9zdGFydHNXaXRoQW55U2VxKHBlZWtyLCBzdWJzZXFQZWVrciwgc2FtZSk7XG5cbiAgc3Vic2VxUGVla3JbXCJyZXR1cm5cIl0oKTtcbiAgcGVla3JbXCJyZXR1cm5cIl0oKTtcbiAgcmV0dXJuIHNlcUZvdW5kO1xufVxuXG5leHBvcnRzLl9fc3RhcnRzV2l0aEFueVNlcSA9IF9fc3RhcnRzV2l0aEFueVNlcTtcbnZhciBzdGFydHNXaXRoQW55U2VxID0gLyojX19QVVJFX18qL2l0ZXJhYmxlQ3VycnkoX19zdGFydHNXaXRoQW55U2VxLCB7XG4gIG1pbkFyZ3M6IDEsXG4gIG1heEFyZ3M6IDIsXG4gIHJlZHVjZXM6IHRydWUsXG4gIHZhbGlkYXRlQXJnczogZnVuY3Rpb24gdmFsaWRhdGVBcmdzKGFyZ3MpIHtcbiAgICBhcmdzWzFdID0gYXJnc1sxXS5tYXAoZnVuY3Rpb24gKGFyZykge1xuICAgICAgcmV0dXJuIGVuc3VyZUl0ZXJhYmxlKGFyZyk7XG4gICAgfSk7XG4gIH1cbn0pO1xuZXhwb3J0cy5zdGFydHNXaXRoQW55U2VxID0gc3RhcnRzV2l0aEFueVNlcTsiLCJ2YXIgX3JlZ2VuZXJhdG9yUnVudGltZSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9yZWdlbmVyYXRvclwiKTtcblxudmFyIF9hc3luY1RvR2VuZXJhdG9yID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvYXN5bmNUb0dlbmVyYXRvclwiKTtcblxudmFyIF9yZXF1aXJlID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWwvYXN5bmMtaXRlcmFibGUuanMnKSxcbiAgICBhc3luY0l0ZXJhYmxlQ3VycnkgPSBfcmVxdWlyZS5hc3luY0l0ZXJhYmxlQ3Vycnk7XG5cbnZhciBfcmVxdWlyZTIgPSByZXF1aXJlKCcuLi8kZmlyc3Qtb3IvYXN5bmMtZmlyc3Qtb3IuanMnKSxcbiAgICBfX2FzeW5jRmlyc3RPciA9IF9yZXF1aXJlMi5fX2FzeW5jRmlyc3RPcjtcblxudmFyIF9yZXF1aXJlMyA9IHJlcXVpcmUoJy4uLyRpbmNsdWRlcy9pbmNsdWRlcy5qcycpLFxuICAgIF9faW5jbHVkZXMgPSBfcmVxdWlyZTMuX19pbmNsdWRlcztcblxudmFyIG5vbmUgPSBTeW1ib2woJ25vbmUnKTtcblxuZnVuY3Rpb24gX19hc3luY1N0YXJ0c1dpdGhBbnkoX3gsIF94Mikge1xuICByZXR1cm4gX2FzeW5jU3RhcnRzV2l0aEFueS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuXG5mdW5jdGlvbiBfYXN5bmNTdGFydHNXaXRoQW55KCkge1xuICBfYXN5bmNTdGFydHNXaXRoQW55ID0gX2FzeW5jVG9HZW5lcmF0b3IoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3JSdW50aW1lLm1hcmsoZnVuY3Rpb24gX2NhbGxlZShpdGVyYWJsZSwgdmFsdWVzKSB7XG4gICAgdmFyIHNhbWUsXG4gICAgICAgIGZpcnN0LFxuICAgICAgICBfYXJncyA9IGFyZ3VtZW50cztcbiAgICByZXR1cm4gX3JlZ2VuZXJhdG9yUnVudGltZS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUkKF9jb250ZXh0KSB7XG4gICAgICB3aGlsZSAoMSkge1xuICAgICAgICBzd2l0Y2ggKF9jb250ZXh0LnByZXYgPSBfY29udGV4dC5uZXh0KSB7XG4gICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgc2FtZSA9IF9hcmdzLmxlbmd0aCA+IDIgJiYgX2FyZ3NbMl0gIT09IHVuZGVmaW5lZCA/IF9hcmdzWzJdIDogT2JqZWN0LmlzO1xuICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDM7XG4gICAgICAgICAgICByZXR1cm4gX19hc3luY0ZpcnN0T3IoaXRlcmFibGUsIG5vbmUpO1xuXG4gICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgZmlyc3QgPSBfY29udGV4dC5zZW50O1xuXG4gICAgICAgICAgICBpZiAoIShmaXJzdCA9PT0gbm9uZSkpIHtcbiAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDY7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuYWJydXB0KFwicmV0dXJuXCIsIGZhbHNlKTtcblxuICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5hYnJ1cHQoXCJyZXR1cm5cIiwgX19pbmNsdWRlcyh2YWx1ZXMsIGZpcnN0LCBmdW5jdGlvbiAoYSwgYikge1xuICAgICAgICAgICAgICByZXR1cm4gc2FtZShiLCBhKTtcbiAgICAgICAgICAgIH0pKTtcblxuICAgICAgICAgIGNhc2UgNzpcbiAgICAgICAgICBjYXNlIFwiZW5kXCI6XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuc3RvcCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwgX2NhbGxlZSk7XG4gIH0pKTtcbiAgcmV0dXJuIF9hc3luY1N0YXJ0c1dpdGhBbnkuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cblxuZXhwb3J0cy5fX2FzeW5jU3RhcnRzV2l0aEFueSA9IF9fYXN5bmNTdGFydHNXaXRoQW55O1xudmFyIGFzeW5jU3RhcnRzV2l0aEFueSA9IC8qI19fUFVSRV9fKi9hc3luY0l0ZXJhYmxlQ3VycnkoX19hc3luY1N0YXJ0c1dpdGhBbnksIHtcbiAgbWluQXJnczogMSxcbiAgbWF4QXJnczogMixcbiAgcmVkdWNlczogdHJ1ZSxcbiAgdmFsaWRhdGVBcmdzOiBmdW5jdGlvbiB2YWxpZGF0ZUFyZ3MoYXJncykge31cbn0pO1xuZXhwb3J0cy5hc3luY1N0YXJ0c1dpdGhBbnkgPSBhc3luY1N0YXJ0c1dpdGhBbnk7IiwidmFyIF9yZXF1aXJlID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWwvaXRlcmFibGUuanMnKSxcbiAgICBpdGVyYWJsZUN1cnJ5ID0gX3JlcXVpcmUuaXRlcmFibGVDdXJyeTtcblxudmFyIF9yZXF1aXJlMiA9IHJlcXVpcmUoJy4uLyRmaXJzdC1vci9maXJzdC1vci5qcycpLFxuICAgIF9fZmlyc3RPciA9IF9yZXF1aXJlMi5fX2ZpcnN0T3I7XG5cbnZhciBfcmVxdWlyZTMgPSByZXF1aXJlKCcuLi8kaW5jbHVkZXMvaW5jbHVkZXMuanMnKSxcbiAgICBfX2luY2x1ZGVzID0gX3JlcXVpcmUzLl9faW5jbHVkZXM7XG5cbnZhciBub25lID0gU3ltYm9sKCdub25lJyk7XG5cbmZ1bmN0aW9uIF9fc3RhcnRzV2l0aEFueShpdGVyYWJsZSwgdmFsdWVzKSB7XG4gIHZhciBzYW1lID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiBPYmplY3QuaXM7XG5cbiAgdmFyIGZpcnN0ID0gX19maXJzdE9yKGl0ZXJhYmxlLCBub25lKTtcblxuICBpZiAoZmlyc3QgPT09IG5vbmUpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIF9faW5jbHVkZXModmFsdWVzLCBmaXJzdCwgZnVuY3Rpb24gKGEsIGIpIHtcbiAgICByZXR1cm4gc2FtZShiLCBhKTtcbiAgfSk7XG59XG5cbmV4cG9ydHMuX19zdGFydHNXaXRoQW55ID0gX19zdGFydHNXaXRoQW55O1xudmFyIHN0YXJ0c1dpdGhBbnkgPSAvKiNfX1BVUkVfXyovaXRlcmFibGVDdXJyeShfX3N0YXJ0c1dpdGhBbnksIHtcbiAgbWluQXJnczogMSxcbiAgbWF4QXJnczogMixcbiAgcmVkdWNlczogdHJ1ZSxcbiAgdmFsaWRhdGVBcmdzOiBmdW5jdGlvbiB2YWxpZGF0ZUFyZ3MoYXJncykge1xuICAgIGlmICh0cnVlICYmIHR5cGVvZiBhcmdzWzBdID09PSAnc3RyaW5nJykge1xuICAgICAgY29uc29sZS53YXJuKCdGb3Igc3RyaW5nIGlucHV0cyB1c2Ugc3RhcnRzV2l0aEFueVNlcSBpbnN0ZWFkIG9mIHN0YXJ0c1dpdGhBbnknKTtcbiAgICB9XG4gIH1cbn0pO1xuZXhwb3J0cy5zdGFydHNXaXRoQW55ID0gc3RhcnRzV2l0aEFueTsiLCJ2YXIgX3JlcXVpcmUgPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbC9hc3luYy1pdGVyYWJsZS5qcycpLFxuICAgIGFzeW5jSXRlcmFibGVDdXJyeSA9IF9yZXF1aXJlLmFzeW5jSXRlcmFibGVDdXJyeSxcbiAgICBhc3luY0Vuc3VyZUl0ZXJhYmxlID0gX3JlcXVpcmUuYXN5bmNFbnN1cmVJdGVyYWJsZTtcblxudmFyIF9yZXF1aXJlMiA9IHJlcXVpcmUoJy4uLyRzdGFydHMtd2l0aC1hbnktc2VxL2FzeW5jLXN0YXJ0cy13aXRoLWFueS1zZXEuanMnKSxcbiAgICBfX2FzeW5jU3RhcnRzV2l0aEFueVNlcSA9IF9yZXF1aXJlMi5fX2FzeW5jU3RhcnRzV2l0aEFueVNlcTtcblxuZnVuY3Rpb24gX19hc3luY1N0YXJ0c1dpdGhTZXEoaXRlcmFibGUsIHNlcSkge1xuICB2YXIgc2FtZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogT2JqZWN0LmlzO1xuICByZXR1cm4gX19hc3luY1N0YXJ0c1dpdGhBbnlTZXEoaXRlcmFibGUsIFtzZXFdLCBzYW1lKTtcbn1cblxuZXhwb3J0cy5fX2FzeW5jU3RhcnRzV2l0aFNlcSA9IF9fYXN5bmNTdGFydHNXaXRoU2VxO1xudmFyIGFzeW5jU3RhcnRzV2l0aFNlcSA9IC8qI19fUFVSRV9fKi9hc3luY0l0ZXJhYmxlQ3VycnkoX19hc3luY1N0YXJ0c1dpdGhTZXEsIHtcbiAgbWluQXJnczogMSxcbiAgbWF4QXJnczogMixcbiAgcmVkdWNlczogdHJ1ZSxcbiAgdmFsaWRhdGVBcmdzOiBmdW5jdGlvbiB2YWxpZGF0ZUFyZ3MoYXJncykge1xuICAgIGFyZ3NbMV0gPSBhc3luY0Vuc3VyZUl0ZXJhYmxlKGFyZ3NbMV0pO1xuICB9XG59KTtcbmV4cG9ydHMuYXN5bmNTdGFydHNXaXRoU2VxID0gYXN5bmNTdGFydHNXaXRoU2VxOyIsInZhciBfcmVxdWlyZSA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFsL2l0ZXJhYmxlLmpzJyksXG4gICAgaXRlcmFibGVDdXJyeSA9IF9yZXF1aXJlLml0ZXJhYmxlQ3VycnksXG4gICAgZW5zdXJlSXRlcmFibGUgPSBfcmVxdWlyZS5lbnN1cmVJdGVyYWJsZTtcblxudmFyIF9yZXF1aXJlMiA9IHJlcXVpcmUoJy4uLyRzdGFydHMtd2l0aC1hbnktc2VxL3N0YXJ0cy13aXRoLWFueS1zZXEuanMnKSxcbiAgICBfX3N0YXJ0c1dpdGhBbnlTZXEgPSBfcmVxdWlyZTIuX19zdGFydHNXaXRoQW55U2VxO1xuXG5mdW5jdGlvbiBfX3N0YXJ0c1dpdGhTZXEoaXRlcmFibGUsIHNlcSkge1xuICB2YXIgc2FtZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogT2JqZWN0LmlzO1xuICByZXR1cm4gX19zdGFydHNXaXRoQW55U2VxKGl0ZXJhYmxlLCBbc2VxXSwgc2FtZSk7XG59XG5cbmV4cG9ydHMuX19zdGFydHNXaXRoU2VxID0gX19zdGFydHNXaXRoU2VxO1xudmFyIHN0YXJ0c1dpdGhTZXEgPSAvKiNfX1BVUkVfXyovaXRlcmFibGVDdXJyeShfX3N0YXJ0c1dpdGhTZXEsIHtcbiAgbWluQXJnczogMSxcbiAgbWF4QXJnczogMixcbiAgcmVkdWNlczogdHJ1ZSxcbiAgdmFsaWRhdGVBcmdzOiBmdW5jdGlvbiB2YWxpZGF0ZUFyZ3MoYXJncykge1xuICAgIGFyZ3NbMV0gPSBlbnN1cmVJdGVyYWJsZShhcmdzWzFdKTtcbiAgfVxufSk7XG5leHBvcnRzLnN0YXJ0c1dpdGhTZXEgPSBzdGFydHNXaXRoU2VxOyIsInZhciBfcmVnZW5lcmF0b3JSdW50aW1lID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL3JlZ2VuZXJhdG9yXCIpO1xuXG52YXIgX2FzeW5jVG9HZW5lcmF0b3IgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9hc3luY1RvR2VuZXJhdG9yXCIpO1xuXG52YXIgX3JlcXVpcmUgPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbC9hc3luYy1pdGVyYWJsZS5qcycpLFxuICAgIGFzeW5jSXRlcmFibGVDdXJyeSA9IF9yZXF1aXJlLmFzeW5jSXRlcmFibGVDdXJyeTtcblxudmFyIF9yZXF1aXJlMiA9IHJlcXVpcmUoJy4uLyRmaXJzdC1vci9hc3luYy1maXJzdC1vci5qcycpLFxuICAgIF9fYXN5bmNGaXJzdE9yID0gX3JlcXVpcmUyLl9fYXN5bmNGaXJzdE9yO1xuXG52YXIgbm9uZSA9IFN5bWJvbCgnbm9uZScpO1xuXG5mdW5jdGlvbiBfX2FzeW5jU3RhcnRzV2l0aChfeCwgX3gyKSB7XG4gIHJldHVybiBfYXN5bmNTdGFydHNXaXRoLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5cbmZ1bmN0aW9uIF9hc3luY1N0YXJ0c1dpdGgoKSB7XG4gIF9hc3luY1N0YXJ0c1dpdGggPSBfYXN5bmNUb0dlbmVyYXRvciggLyojX19QVVJFX18qL19yZWdlbmVyYXRvclJ1bnRpbWUubWFyayhmdW5jdGlvbiBfY2FsbGVlKGl0ZXJhYmxlLCB2YWx1ZSkge1xuICAgIHZhciBzYW1lLFxuICAgICAgICBmaXJzdCxcbiAgICAgICAgX2FyZ3MgPSBhcmd1bWVudHM7XG4gICAgcmV0dXJuIF9yZWdlbmVyYXRvclJ1bnRpbWUud3JhcChmdW5jdGlvbiBfY2FsbGVlJChfY29udGV4dCkge1xuICAgICAgd2hpbGUgKDEpIHtcbiAgICAgICAgc3dpdGNoIChfY29udGV4dC5wcmV2ID0gX2NvbnRleHQubmV4dCkge1xuICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgIHNhbWUgPSBfYXJncy5sZW5ndGggPiAyICYmIF9hcmdzWzJdICE9PSB1bmRlZmluZWQgPyBfYXJnc1syXSA6IE9iamVjdC5pcztcbiAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAzO1xuICAgICAgICAgICAgcmV0dXJuIF9fYXN5bmNGaXJzdE9yKGl0ZXJhYmxlLCBub25lKTtcblxuICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgIGZpcnN0ID0gX2NvbnRleHQuc2VudDtcblxuICAgICAgICAgICAgaWYgKCEoZmlyc3QgPT09IG5vbmUpKSB7XG4gICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSA2O1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LmFicnVwdChcInJldHVyblwiLCBmYWxzZSk7XG5cbiAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuYWJydXB0KFwicmV0dXJuXCIsIHNhbWUodmFsdWUsIGZpcnN0KSk7XG5cbiAgICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgY2FzZSBcImVuZFwiOlxuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LnN0b3AoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sIF9jYWxsZWUpO1xuICB9KSk7XG4gIHJldHVybiBfYXN5bmNTdGFydHNXaXRoLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5cbmV4cG9ydHMuX19hc3luY1N0YXJ0c1dpdGggPSBfX2FzeW5jU3RhcnRzV2l0aDtcbnZhciBhc3luY1N0YXJ0c1dpdGggPSAvKiNfX1BVUkVfXyovYXN5bmNJdGVyYWJsZUN1cnJ5KF9fYXN5bmNTdGFydHNXaXRoLCB7XG4gIG1pbkFyZ3M6IDEsXG4gIG1heEFyZ3M6IDIsXG4gIHJlZHVjZXM6IHRydWUsXG4gIHZhbGlkYXRlQXJnczogZnVuY3Rpb24gdmFsaWRhdGVBcmdzKGFyZ3MpIHt9XG59KTtcbmV4cG9ydHMuYXN5bmNTdGFydHNXaXRoID0gYXN5bmNTdGFydHNXaXRoOyIsInZhciBfcmVxdWlyZSA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFsL2l0ZXJhYmxlLmpzJyksXG4gICAgaXRlcmFibGVDdXJyeSA9IF9yZXF1aXJlLml0ZXJhYmxlQ3Vycnk7XG5cbnZhciBfcmVxdWlyZTIgPSByZXF1aXJlKCcuLi8kZmlyc3Qtb3IvZmlyc3Qtb3IuanMnKSxcbiAgICBfX2ZpcnN0T3IgPSBfcmVxdWlyZTIuX19maXJzdE9yO1xuXG52YXIgbm9uZSA9IFN5bWJvbCgnbm9uZScpO1xuXG5mdW5jdGlvbiBfX3N0YXJ0c1dpdGgoaXRlcmFibGUsIHZhbHVlKSB7XG4gIHZhciBzYW1lID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiBPYmplY3QuaXM7XG5cbiAgdmFyIGZpcnN0ID0gX19maXJzdE9yKGl0ZXJhYmxlLCBub25lKTtcblxuICBpZiAoZmlyc3QgPT09IG5vbmUpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIHNhbWUodmFsdWUsIGZpcnN0KTtcbn1cblxuZXhwb3J0cy5fX3N0YXJ0c1dpdGggPSBfX3N0YXJ0c1dpdGg7XG52YXIgc3RhcnRzV2l0aCA9IC8qI19fUFVSRV9fKi9pdGVyYWJsZUN1cnJ5KF9fc3RhcnRzV2l0aCwge1xuICBtaW5BcmdzOiAxLFxuICBtYXhBcmdzOiAyLFxuICByZWR1Y2VzOiB0cnVlLFxuICB2YWxpZGF0ZUFyZ3M6IGZ1bmN0aW9uIHZhbGlkYXRlQXJncyhhcmdzKSB7XG4gICAgaWYgKHRydWUgJiYgdHlwZW9mIGFyZ3NbMF0gPT09ICdzdHJpbmcnKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ0ZvciBzdHJpbmcgaW5wdXRzIHVzZSBzdGFydHNXaXRoU2VxIGluc3RlYWQgb2Ygc3RhcnRzV2l0aCcpO1xuICAgIH1cbiAgfVxufSk7XG5leHBvcnRzLnN0YXJ0c1dpdGggPSBzdGFydHNXaXRoOyIsInZhciBfcmVnZW5lcmF0b3JSdW50aW1lID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL3JlZ2VuZXJhdG9yXCIpO1xuXG52YXIgX2FzeW5jVG9HZW5lcmF0b3IgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9hc3luY1RvR2VuZXJhdG9yXCIpO1xuXG52YXIgX2FzeW5jSXRlcmF0b3IgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9hc3luY0l0ZXJhdG9yXCIpO1xuXG52YXIgX3JlcXVpcmUgPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbC9hc3luYy1pdGVyYWJsZS5qcycpLFxuICAgIGFzeW5jSXRlcmFibGVDdXJyeSA9IF9yZXF1aXJlLmFzeW5jSXRlcmFibGVDdXJyeTtcblxuZnVuY3Rpb24gX19hc3luY1N0cihfeCkge1xuICByZXR1cm4gX2FzeW5jU3RyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5cbmZ1bmN0aW9uIF9hc3luY1N0cigpIHtcbiAgX2FzeW5jU3RyID0gX2FzeW5jVG9HZW5lcmF0b3IoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3JSdW50aW1lLm1hcmsoZnVuY3Rpb24gX2NhbGxlZShjaGFycykge1xuICAgIHZhciByZXN1bHQsIF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24sIF9kaWRJdGVyYXRvckVycm9yLCBfaXRlcmF0b3JFcnJvciwgX2l0ZXJhdG9yLCBfc3RlcCwgX3ZhbHVlLCBfY2hhcjtcblxuICAgIHJldHVybiBfcmVnZW5lcmF0b3JSdW50aW1lLndyYXAoZnVuY3Rpb24gX2NhbGxlZSQoX2NvbnRleHQpIHtcbiAgICAgIHdoaWxlICgxKSB7XG4gICAgICAgIHN3aXRjaCAoX2NvbnRleHQucHJldiA9IF9jb250ZXh0Lm5leHQpIHtcbiAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICByZXN1bHQgPSAnJztcbiAgICAgICAgICAgIF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24gPSB0cnVlO1xuICAgICAgICAgICAgX2RpZEl0ZXJhdG9yRXJyb3IgPSBmYWxzZTtcbiAgICAgICAgICAgIF9jb250ZXh0LnByZXYgPSAzO1xuICAgICAgICAgICAgX2l0ZXJhdG9yID0gX2FzeW5jSXRlcmF0b3IoY2hhcnMpO1xuXG4gICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDc7XG4gICAgICAgICAgICByZXR1cm4gX2l0ZXJhdG9yLm5leHQoKTtcblxuICAgICAgICAgIGNhc2UgNzpcbiAgICAgICAgICAgIF9zdGVwID0gX2NvbnRleHQuc2VudDtcbiAgICAgICAgICAgIF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24gPSBfc3RlcC5kb25lO1xuICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDExO1xuICAgICAgICAgICAgcmV0dXJuIF9zdGVwLnZhbHVlO1xuXG4gICAgICAgICAgY2FzZSAxMTpcbiAgICAgICAgICAgIF92YWx1ZSA9IF9jb250ZXh0LnNlbnQ7XG5cbiAgICAgICAgICAgIGlmIChfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uKSB7XG4gICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAxODtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIF9jaGFyID0gX3ZhbHVlO1xuICAgICAgICAgICAgcmVzdWx0ICs9IF9jaGFyLnRvU3RyaW5nKCk7XG5cbiAgICAgICAgICBjYXNlIDE1OlxuICAgICAgICAgICAgX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbiA9IHRydWU7XG4gICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gNTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSAxODpcbiAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAyNDtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSAyMDpcbiAgICAgICAgICAgIF9jb250ZXh0LnByZXYgPSAyMDtcbiAgICAgICAgICAgIF9jb250ZXh0LnQwID0gX2NvbnRleHRbXCJjYXRjaFwiXSgzKTtcbiAgICAgICAgICAgIF9kaWRJdGVyYXRvckVycm9yID0gdHJ1ZTtcbiAgICAgICAgICAgIF9pdGVyYXRvckVycm9yID0gX2NvbnRleHQudDA7XG5cbiAgICAgICAgICBjYXNlIDI0OlxuICAgICAgICAgICAgX2NvbnRleHQucHJldiA9IDI0O1xuICAgICAgICAgICAgX2NvbnRleHQucHJldiA9IDI1O1xuXG4gICAgICAgICAgICBpZiAoISghX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbiAmJiBfaXRlcmF0b3JbXCJyZXR1cm5cIl0gIT0gbnVsbCkpIHtcbiAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDI5O1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDI5O1xuICAgICAgICAgICAgcmV0dXJuIF9pdGVyYXRvcltcInJldHVyblwiXSgpO1xuXG4gICAgICAgICAgY2FzZSAyOTpcbiAgICAgICAgICAgIF9jb250ZXh0LnByZXYgPSAyOTtcblxuICAgICAgICAgICAgaWYgKCFfZGlkSXRlcmF0b3JFcnJvcikge1xuICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMzI7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aHJvdyBfaXRlcmF0b3JFcnJvcjtcblxuICAgICAgICAgIGNhc2UgMzI6XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuZmluaXNoKDI5KTtcblxuICAgICAgICAgIGNhc2UgMzM6XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuZmluaXNoKDI0KTtcblxuICAgICAgICAgIGNhc2UgMzQ6XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuYWJydXB0KFwicmV0dXJuXCIsIHJlc3VsdCk7XG5cbiAgICAgICAgICBjYXNlIDM1OlxuICAgICAgICAgIGNhc2UgXCJlbmRcIjpcbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5zdG9wKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCBfY2FsbGVlLCBudWxsLCBbWzMsIDIwLCAyNCwgMzRdLCBbMjUsLCAyOSwgMzNdXSk7XG4gIH0pKTtcbiAgcmV0dXJuIF9hc3luY1N0ci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuXG5leHBvcnRzLl9fYXN5bmNTdHIgPSBfX2FzeW5jU3RyO1xudmFyIGFzeW5jU3RyID0gLyojX19QVVJFX18qL2FzeW5jSXRlcmFibGVDdXJyeShfX2FzeW5jU3RyLCB7XG4gIHJlZHVjZXM6IHRydWVcbn0pO1xuZXhwb3J0cy5hc3luY1N0ciA9IGFzeW5jU3RyOyIsImZ1bmN0aW9uIF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKG8sIGFsbG93QXJyYXlMaWtlKSB7IHZhciBpdDsgaWYgKHR5cGVvZiBTeW1ib2wgPT09IFwidW5kZWZpbmVkXCIgfHwgb1tTeW1ib2wuaXRlcmF0b3JdID09IG51bGwpIHsgaWYgKEFycmF5LmlzQXJyYXkobykgfHwgKGl0ID0gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8pKSB8fCBhbGxvd0FycmF5TGlrZSAmJiBvICYmIHR5cGVvZiBvLmxlbmd0aCA9PT0gXCJudW1iZXJcIikgeyBpZiAoaXQpIG8gPSBpdDsgdmFyIGkgPSAwOyB2YXIgRiA9IGZ1bmN0aW9uIEYoKSB7fTsgcmV0dXJuIHsgczogRiwgbjogZnVuY3Rpb24gbigpIHsgaWYgKGkgPj0gby5sZW5ndGgpIHJldHVybiB7IGRvbmU6IHRydWUgfTsgcmV0dXJuIHsgZG9uZTogZmFsc2UsIHZhbHVlOiBvW2krK10gfTsgfSwgZTogZnVuY3Rpb24gZShfZSkgeyB0aHJvdyBfZTsgfSwgZjogRiB9OyB9IHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gaXRlcmF0ZSBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTsgfSB2YXIgbm9ybWFsQ29tcGxldGlvbiA9IHRydWUsIGRpZEVyciA9IGZhbHNlLCBlcnI7IHJldHVybiB7IHM6IGZ1bmN0aW9uIHMoKSB7IGl0ID0gb1tTeW1ib2wuaXRlcmF0b3JdKCk7IH0sIG46IGZ1bmN0aW9uIG4oKSB7IHZhciBzdGVwID0gaXQubmV4dCgpOyBub3JtYWxDb21wbGV0aW9uID0gc3RlcC5kb25lOyByZXR1cm4gc3RlcDsgfSwgZTogZnVuY3Rpb24gZShfZTIpIHsgZGlkRXJyID0gdHJ1ZTsgZXJyID0gX2UyOyB9LCBmOiBmdW5jdGlvbiBmKCkgeyB0cnkgeyBpZiAoIW5vcm1hbENvbXBsZXRpb24gJiYgaXRbXCJyZXR1cm5cIl0gIT0gbnVsbCkgaXRbXCJyZXR1cm5cIl0oKTsgfSBmaW5hbGx5IHsgaWYgKGRpZEVycikgdGhyb3cgZXJyOyB9IH0gfTsgfVxuXG5mdW5jdGlvbiBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkobywgbWluTGVuKSB7IGlmICghbykgcmV0dXJuOyBpZiAodHlwZW9mIG8gPT09IFwic3RyaW5nXCIpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pOyB2YXIgbiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKS5zbGljZSg4LCAtMSk7IGlmIChuID09PSBcIk9iamVjdFwiICYmIG8uY29uc3RydWN0b3IpIG4gPSBvLmNvbnN0cnVjdG9yLm5hbWU7IGlmIChuID09PSBcIk1hcFwiIHx8IG4gPT09IFwiU2V0XCIpIHJldHVybiBBcnJheS5mcm9tKG8pOyBpZiAobiA9PT0gXCJBcmd1bWVudHNcIiB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSkgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IH1cblxuZnVuY3Rpb24gX2FycmF5TGlrZVRvQXJyYXkoYXJyLCBsZW4pIHsgaWYgKGxlbiA9PSBudWxsIHx8IGxlbiA+IGFyci5sZW5ndGgpIGxlbiA9IGFyci5sZW5ndGg7IGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGxlbik7IGkgPCBsZW47IGkrKykgeyBhcnIyW2ldID0gYXJyW2ldOyB9IHJldHVybiBhcnIyOyB9XG5cbnZhciBfcmVxdWlyZSA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFsL2l0ZXJhYmxlLmpzJyksXG4gICAgaXRlcmFibGVDdXJyeSA9IF9yZXF1aXJlLml0ZXJhYmxlQ3Vycnk7XG5cbmZ1bmN0aW9uIF9fc3RyKGNoYXJzKSB7XG4gIHZhciByZXN1bHQgPSAnJztcblxuICB2YXIgX2l0ZXJhdG9yID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIoY2hhcnMpLFxuICAgICAgX3N0ZXA7XG5cbiAgdHJ5IHtcbiAgICBmb3IgKF9pdGVyYXRvci5zKCk7ICEoX3N0ZXAgPSBfaXRlcmF0b3IubigpKS5kb25lOykge1xuICAgICAgdmFyIF9jaGFyID0gX3N0ZXAudmFsdWU7XG4gICAgICByZXN1bHQgKz0gX2NoYXIudG9TdHJpbmcoKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIF9pdGVyYXRvci5lKGVycik7XG4gIH0gZmluYWxseSB7XG4gICAgX2l0ZXJhdG9yLmYoKTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydHMuX19zdHIgPSBfX3N0cjtcbnZhciBzdHIgPSAvKiNfX1BVUkVfXyovaXRlcmFibGVDdXJyeShfX3N0ciwge1xuICByZWR1Y2VzOiB0cnVlXG59KTtcbmV4cG9ydHMuc3RyID0gc3RyOyIsInZhciBfcmVnZW5lcmF0b3JSdW50aW1lID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL3JlZ2VuZXJhdG9yXCIpO1xuXG52YXIgX2FzeW5jVG9HZW5lcmF0b3IgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9hc3luY1RvR2VuZXJhdG9yXCIpO1xuXG52YXIgX2FzeW5jSXRlcmF0b3IgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9hc3luY0l0ZXJhdG9yXCIpO1xuXG52YXIgX3JlcXVpcmUgPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbC9hc3luYy1pdGVyYWJsZS5qcycpLFxuICAgIGFzeW5jSXRlcmFibGVDdXJyeSA9IF9yZXF1aXJlLmFzeW5jSXRlcmFibGVDdXJyeTtcblxuZnVuY3Rpb24gX19hc3luY1Rha2VMYXN0T3IoX3gsIF94Mikge1xuICByZXR1cm4gX2FzeW5jVGFrZUxhc3RPci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuXG5mdW5jdGlvbiBfYXN5bmNUYWtlTGFzdE9yKCkge1xuICBfYXN5bmNUYWtlTGFzdE9yID0gX2FzeW5jVG9HZW5lcmF0b3IoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3JSdW50aW1lLm1hcmsoZnVuY3Rpb24gX2NhbGxlZShpdGVyYWJsZSwgd2hlbkVtcHR5KSB7XG4gICAgdmFyIF92YWx1ZSwgX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbiwgX2RpZEl0ZXJhdG9yRXJyb3IsIF9pdGVyYXRvckVycm9yLCBfaXRlcmF0b3IsIF9zdGVwLCBfdmFsdWUyLCB2YWx1ZTtcblxuICAgIHJldHVybiBfcmVnZW5lcmF0b3JSdW50aW1lLndyYXAoZnVuY3Rpb24gX2NhbGxlZSQoX2NvbnRleHQpIHtcbiAgICAgIHdoaWxlICgxKSB7XG4gICAgICAgIHN3aXRjaCAoX2NvbnRleHQucHJldiA9IF9jb250ZXh0Lm5leHQpIHtcbiAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICBfdmFsdWUgPSB3aGVuRW1wdHk7XG4gICAgICAgICAgICBfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uID0gdHJ1ZTtcbiAgICAgICAgICAgIF9kaWRJdGVyYXRvckVycm9yID0gZmFsc2U7XG4gICAgICAgICAgICBfY29udGV4dC5wcmV2ID0gMztcbiAgICAgICAgICAgIF9pdGVyYXRvciA9IF9hc3luY0l0ZXJhdG9yKGl0ZXJhYmxlKTtcblxuICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSA3O1xuICAgICAgICAgICAgcmV0dXJuIF9pdGVyYXRvci5uZXh0KCk7XG5cbiAgICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgICBfc3RlcCA9IF9jb250ZXh0LnNlbnQ7XG4gICAgICAgICAgICBfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uID0gX3N0ZXAuZG9uZTtcbiAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAxMTtcbiAgICAgICAgICAgIHJldHVybiBfc3RlcC52YWx1ZTtcblxuICAgICAgICAgIGNhc2UgMTE6XG4gICAgICAgICAgICBfdmFsdWUyID0gX2NvbnRleHQuc2VudDtcblxuICAgICAgICAgICAgaWYgKF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24pIHtcbiAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDE4O1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFsdWUgPSBfdmFsdWUyO1xuICAgICAgICAgICAgX3ZhbHVlID0gdmFsdWU7XG5cbiAgICAgICAgICBjYXNlIDE1OlxuICAgICAgICAgICAgX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbiA9IHRydWU7XG4gICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gNTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSAxODpcbiAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAyNDtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSAyMDpcbiAgICAgICAgICAgIF9jb250ZXh0LnByZXYgPSAyMDtcbiAgICAgICAgICAgIF9jb250ZXh0LnQwID0gX2NvbnRleHRbXCJjYXRjaFwiXSgzKTtcbiAgICAgICAgICAgIF9kaWRJdGVyYXRvckVycm9yID0gdHJ1ZTtcbiAgICAgICAgICAgIF9pdGVyYXRvckVycm9yID0gX2NvbnRleHQudDA7XG5cbiAgICAgICAgICBjYXNlIDI0OlxuICAgICAgICAgICAgX2NvbnRleHQucHJldiA9IDI0O1xuICAgICAgICAgICAgX2NvbnRleHQucHJldiA9IDI1O1xuXG4gICAgICAgICAgICBpZiAoISghX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbiAmJiBfaXRlcmF0b3JbXCJyZXR1cm5cIl0gIT0gbnVsbCkpIHtcbiAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDI5O1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDI5O1xuICAgICAgICAgICAgcmV0dXJuIF9pdGVyYXRvcltcInJldHVyblwiXSgpO1xuXG4gICAgICAgICAgY2FzZSAyOTpcbiAgICAgICAgICAgIF9jb250ZXh0LnByZXYgPSAyOTtcblxuICAgICAgICAgICAgaWYgKCFfZGlkSXRlcmF0b3JFcnJvcikge1xuICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMzI7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aHJvdyBfaXRlcmF0b3JFcnJvcjtcblxuICAgICAgICAgIGNhc2UgMzI6XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuZmluaXNoKDI5KTtcblxuICAgICAgICAgIGNhc2UgMzM6XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuZmluaXNoKDI0KTtcblxuICAgICAgICAgIGNhc2UgMzQ6XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuYWJydXB0KFwicmV0dXJuXCIsIF92YWx1ZSk7XG5cbiAgICAgICAgICBjYXNlIDM1OlxuICAgICAgICAgIGNhc2UgXCJlbmRcIjpcbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5zdG9wKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCBfY2FsbGVlLCBudWxsLCBbWzMsIDIwLCAyNCwgMzRdLCBbMjUsLCAyOSwgMzNdXSk7XG4gIH0pKTtcbiAgcmV0dXJuIF9hc3luY1Rha2VMYXN0T3IuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cblxuZXhwb3J0cy5fX2FzeW5jVGFrZUxhc3RPciA9IF9fYXN5bmNUYWtlTGFzdE9yO1xudmFyIGFzeW5jVGFrZUxhc3RPciA9IC8qI19fUFVSRV9fKi9hc3luY0l0ZXJhYmxlQ3VycnkoX19hc3luY1Rha2VMYXN0T3IsIHtcbiAgcmVkdWNlczogdHJ1ZVxufSk7XG5leHBvcnRzLmFzeW5jVGFrZUxhc3RPciA9IGFzeW5jVGFrZUxhc3RPcjsiLCJmdW5jdGlvbiBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihvLCBhbGxvd0FycmF5TGlrZSkgeyB2YXIgaXQ7IGlmICh0eXBlb2YgU3ltYm9sID09PSBcInVuZGVmaW5lZFwiIHx8IG9bU3ltYm9sLml0ZXJhdG9yXSA9PSBudWxsKSB7IGlmIChBcnJheS5pc0FycmF5KG8pIHx8IChpdCA9IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvKSkgfHwgYWxsb3dBcnJheUxpa2UgJiYgbyAmJiB0eXBlb2Ygby5sZW5ndGggPT09IFwibnVtYmVyXCIpIHsgaWYgKGl0KSBvID0gaXQ7IHZhciBpID0gMDsgdmFyIEYgPSBmdW5jdGlvbiBGKCkge307IHJldHVybiB7IHM6IEYsIG46IGZ1bmN0aW9uIG4oKSB7IGlmIChpID49IG8ubGVuZ3RoKSByZXR1cm4geyBkb25lOiB0cnVlIH07IHJldHVybiB7IGRvbmU6IGZhbHNlLCB2YWx1ZTogb1tpKytdIH07IH0sIGU6IGZ1bmN0aW9uIGUoX2UpIHsgdGhyb3cgX2U7IH0sIGY6IEYgfTsgfSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIGl0ZXJhdGUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIik7IH0gdmFyIG5vcm1hbENvbXBsZXRpb24gPSB0cnVlLCBkaWRFcnIgPSBmYWxzZSwgZXJyOyByZXR1cm4geyBzOiBmdW5jdGlvbiBzKCkgeyBpdCA9IG9bU3ltYm9sLml0ZXJhdG9yXSgpOyB9LCBuOiBmdW5jdGlvbiBuKCkgeyB2YXIgc3RlcCA9IGl0Lm5leHQoKTsgbm9ybWFsQ29tcGxldGlvbiA9IHN0ZXAuZG9uZTsgcmV0dXJuIHN0ZXA7IH0sIGU6IGZ1bmN0aW9uIGUoX2UyKSB7IGRpZEVyciA9IHRydWU7IGVyciA9IF9lMjsgfSwgZjogZnVuY3Rpb24gZigpIHsgdHJ5IHsgaWYgKCFub3JtYWxDb21wbGV0aW9uICYmIGl0W1wicmV0dXJuXCJdICE9IG51bGwpIGl0W1wicmV0dXJuXCJdKCk7IH0gZmluYWxseSB7IGlmIChkaWRFcnIpIHRocm93IGVycjsgfSB9IH07IH1cblxuZnVuY3Rpb24gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8sIG1pbkxlbikgeyBpZiAoIW8pIHJldHVybjsgaWYgKHR5cGVvZiBvID09PSBcInN0cmluZ1wiKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTsgdmFyIG4gPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykuc2xpY2UoOCwgLTEpOyBpZiAobiA9PT0gXCJPYmplY3RcIiAmJiBvLmNvbnN0cnVjdG9yKSBuID0gby5jb25zdHJ1Y3Rvci5uYW1lOyBpZiAobiA9PT0gXCJNYXBcIiB8fCBuID09PSBcIlNldFwiKSByZXR1cm4gQXJyYXkuZnJvbShvKTsgaWYgKG4gPT09IFwiQXJndW1lbnRzXCIgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QobikpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pOyB9XG5cbmZ1bmN0aW9uIF9hcnJheUxpa2VUb0FycmF5KGFyciwgbGVuKSB7IGlmIChsZW4gPT0gbnVsbCB8fCBsZW4gPiBhcnIubGVuZ3RoKSBsZW4gPSBhcnIubGVuZ3RoOyBmb3IgKHZhciBpID0gMCwgYXJyMiA9IG5ldyBBcnJheShsZW4pOyBpIDwgbGVuOyBpKyspIHsgYXJyMltpXSA9IGFycltpXTsgfSByZXR1cm4gYXJyMjsgfVxuXG52YXIgX3JlcXVpcmUgPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbC9pdGVyYWJsZS5qcycpLFxuICAgIGl0ZXJhYmxlQ3VycnkgPSBfcmVxdWlyZS5pdGVyYWJsZUN1cnJ5O1xuXG5mdW5jdGlvbiBfX3Rha2VMYXN0T3IoaXRlcmFibGUsIHdoZW5FbXB0eSkge1xuICB2YXIgX3ZhbHVlID0gd2hlbkVtcHR5O1xuXG4gIHZhciBfaXRlcmF0b3IgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihpdGVyYWJsZSksXG4gICAgICBfc3RlcDtcblxuICB0cnkge1xuICAgIGZvciAoX2l0ZXJhdG9yLnMoKTsgIShfc3RlcCA9IF9pdGVyYXRvci5uKCkpLmRvbmU7KSB7XG4gICAgICB2YXIgdmFsdWUgPSBfc3RlcC52YWx1ZTtcbiAgICAgIF92YWx1ZSA9IHZhbHVlO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgX2l0ZXJhdG9yLmUoZXJyKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBfaXRlcmF0b3IuZigpO1xuICB9XG5cbiAgcmV0dXJuIF92YWx1ZTtcbn1cblxuZXhwb3J0cy5fX3Rha2VMYXN0T3IgPSBfX3Rha2VMYXN0T3I7XG52YXIgdGFrZUxhc3RPciA9IC8qI19fUFVSRV9fKi9pdGVyYWJsZUN1cnJ5KF9fdGFrZUxhc3RPciwge1xuICByZWR1Y2VzOiB0cnVlXG59KTtcbmV4cG9ydHMudGFrZUxhc3RPciA9IHRha2VMYXN0T3I7IiwidmFyIF9yZXF1aXJlID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWwvYXN5bmMtaXRlcmFibGUuanMnKSxcbiAgICBhc3luY0l0ZXJhYmxlQ3VycnkgPSBfcmVxdWlyZS5hc3luY0l0ZXJhYmxlQ3Vycnk7XG5cbnZhciBfcmVxdWlyZTIgPSByZXF1aXJlKCcuLi8kdGFrZS1sYXN0LW9yL2FzeW5jLXRha2UtbGFzdC1vci5qcycpLFxuICAgIF9fYXN5bmNUYWtlTGFzdE9yID0gX3JlcXVpcmUyLl9fYXN5bmNUYWtlTGFzdE9yO1xuXG5mdW5jdGlvbiBfX2FzeW5jVGFrZUxhc3QoaXRlcmFibGUpIHtcbiAgcmV0dXJuIF9fYXN5bmNUYWtlTGFzdE9yKGl0ZXJhYmxlLCB1bmRlZmluZWQpO1xufVxuXG5leHBvcnRzLl9fYXN5bmNUYWtlTGFzdCA9IF9fYXN5bmNUYWtlTGFzdDtcbnZhciBhc3luY1Rha2VMYXN0ID0gLyojX19QVVJFX18qL2FzeW5jSXRlcmFibGVDdXJyeShfX2FzeW5jVGFrZUxhc3QsIHtcbiAgcmVkdWNlczogdHJ1ZVxufSk7XG5leHBvcnRzLmFzeW5jVGFrZUxhc3QgPSBhc3luY1Rha2VMYXN0OyIsInZhciBfcmVxdWlyZSA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFsL2l0ZXJhYmxlLmpzJyksXG4gICAgaXRlcmFibGVDdXJyeSA9IF9yZXF1aXJlLml0ZXJhYmxlQ3Vycnk7XG5cbnZhciBfcmVxdWlyZTIgPSByZXF1aXJlKCcuLi8kdGFrZS1sYXN0LW9yL3Rha2UtbGFzdC1vci5qcycpLFxuICAgIF9fdGFrZUxhc3RPciA9IF9yZXF1aXJlMi5fX3Rha2VMYXN0T3I7XG5cbmZ1bmN0aW9uIF9fdGFrZUxhc3QoaXRlcmFibGUpIHtcbiAgcmV0dXJuIF9fdGFrZUxhc3RPcihpdGVyYWJsZSwgdW5kZWZpbmVkKTtcbn1cblxuZXhwb3J0cy5fX3Rha2VMYXN0ID0gX190YWtlTGFzdDtcbnZhciB0YWtlTGFzdCA9IC8qI19fUFVSRV9fKi9pdGVyYWJsZUN1cnJ5KF9fdGFrZUxhc3QsIHtcbiAgcmVkdWNlczogdHJ1ZVxufSk7XG5leHBvcnRzLnRha2VMYXN0ID0gdGFrZUxhc3Q7IiwidmFyIF9yZWdlbmVyYXRvclJ1bnRpbWUgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvcmVnZW5lcmF0b3JcIik7XG5cbnZhciBfYXdhaXRBc3luY0dlbmVyYXRvciA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2F3YWl0QXN5bmNHZW5lcmF0b3JcIik7XG5cbnZhciBfd3JhcEFzeW5jR2VuZXJhdG9yID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvd3JhcEFzeW5jR2VuZXJhdG9yXCIpO1xuXG52YXIgX2FzeW5jSXRlcmF0b3IgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9hc3luY0l0ZXJhdG9yXCIpO1xuXG52YXIgX3JlcXVpcmUgPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbC9hc3luYy1pdGVyYWJsZS5qcycpLFxuICAgIGFzeW5jSXRlcmFibGVDdXJyeSA9IF9yZXF1aXJlLmFzeW5jSXRlcmFibGVDdXJyeTtcblxudmFyIF9yZXF1aXJlMiA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFsL2NvbXBhcmUuanMnKSxcbiAgICBkZWZhdWx0Q29tcGFyZU9yZGVyID0gX3JlcXVpcmUyLmRlZmF1bHRDb21wYXJlT3JkZXI7XG5cbnZhciBfcmVxdWlyZTMgPSByZXF1aXJlKCcuL2ludGVybmFsL2hlYXAuanMnKSxcbiAgICBIZWFwID0gX3JlcXVpcmUzLkhlYXA7XG5cbmZ1bmN0aW9uIF9fYXN5bmNUYWtlU29ydGVkKF94KSB7XG4gIHJldHVybiBfYXN5bmNUYWtlU29ydGVkLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5cbmV4cG9ydHMuX19hc3luY1Rha2VTb3J0ZWQgPSBfX2FzeW5jVGFrZVNvcnRlZDtcblxuZnVuY3Rpb24gX2FzeW5jVGFrZVNvcnRlZCgpIHtcbiAgX2FzeW5jVGFrZVNvcnRlZCA9IF93cmFwQXN5bmNHZW5lcmF0b3IoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3JSdW50aW1lLm1hcmsoZnVuY3Rpb24gX2NhbGxlZShzb3VyY2UpIHtcbiAgICB2YXIgbixcbiAgICAgICAgY29tcGFyZSxcbiAgICAgICAgaGVhcCxcbiAgICAgICAgX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbixcbiAgICAgICAgX2RpZEl0ZXJhdG9yRXJyb3IsXG4gICAgICAgIF9pdGVyYXRvckVycm9yLFxuICAgICAgICBfaXRlcmF0b3IsXG4gICAgICAgIF9zdGVwLFxuICAgICAgICBfdmFsdWUsXG4gICAgICAgIHZhbHVlLFxuICAgICAgICBfYXJncyA9IGFyZ3VtZW50cztcblxuICAgIHJldHVybiBfcmVnZW5lcmF0b3JSdW50aW1lLndyYXAoZnVuY3Rpb24gX2NhbGxlZSQoX2NvbnRleHQpIHtcbiAgICAgIHdoaWxlICgxKSB7XG4gICAgICAgIHN3aXRjaCAoX2NvbnRleHQucHJldiA9IF9jb250ZXh0Lm5leHQpIHtcbiAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICBuID0gX2FyZ3MubGVuZ3RoID4gMSAmJiBfYXJnc1sxXSAhPT0gdW5kZWZpbmVkID8gX2FyZ3NbMV0gOiBJbmZpbml0eTtcbiAgICAgICAgICAgIGNvbXBhcmUgPSBfYXJncy5sZW5ndGggPiAyICYmIF9hcmdzWzJdICE9PSB1bmRlZmluZWQgPyBfYXJnc1syXSA6IGRlZmF1bHRDb21wYXJlT3JkZXI7XG4gICAgICAgICAgICBoZWFwID0gbmV3IEhlYXAoY29tcGFyZSk7XG4gICAgICAgICAgICBfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uID0gdHJ1ZTtcbiAgICAgICAgICAgIF9kaWRJdGVyYXRvckVycm9yID0gZmFsc2U7XG4gICAgICAgICAgICBfY29udGV4dC5wcmV2ID0gNTtcbiAgICAgICAgICAgIF9pdGVyYXRvciA9IF9hc3luY0l0ZXJhdG9yKHNvdXJjZSk7XG5cbiAgICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gOTtcbiAgICAgICAgICAgIHJldHVybiBfYXdhaXRBc3luY0dlbmVyYXRvcihfaXRlcmF0b3IubmV4dCgpKTtcblxuICAgICAgICAgIGNhc2UgOTpcbiAgICAgICAgICAgIF9zdGVwID0gX2NvbnRleHQuc2VudDtcbiAgICAgICAgICAgIF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24gPSBfc3RlcC5kb25lO1xuICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDEzO1xuICAgICAgICAgICAgcmV0dXJuIF9hd2FpdEFzeW5jR2VuZXJhdG9yKF9zdGVwLnZhbHVlKTtcblxuICAgICAgICAgIGNhc2UgMTM6XG4gICAgICAgICAgICBfdmFsdWUgPSBfY29udGV4dC5zZW50O1xuXG4gICAgICAgICAgICBpZiAoX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbikge1xuICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMjE7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YWx1ZSA9IF92YWx1ZTtcbiAgICAgICAgICAgIGhlYXAucHVzaCh2YWx1ZSk7XG5cbiAgICAgICAgICAgIGlmIChoZWFwLnNpemUgPiBuKSB7XG4gICAgICAgICAgICAgIGhlYXAucG9wKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICBjYXNlIDE4OlxuICAgICAgICAgICAgX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbiA9IHRydWU7XG4gICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gNztcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSAyMTpcbiAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAyNztcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSAyMzpcbiAgICAgICAgICAgIF9jb250ZXh0LnByZXYgPSAyMztcbiAgICAgICAgICAgIF9jb250ZXh0LnQwID0gX2NvbnRleHRbXCJjYXRjaFwiXSg1KTtcbiAgICAgICAgICAgIF9kaWRJdGVyYXRvckVycm9yID0gdHJ1ZTtcbiAgICAgICAgICAgIF9pdGVyYXRvckVycm9yID0gX2NvbnRleHQudDA7XG5cbiAgICAgICAgICBjYXNlIDI3OlxuICAgICAgICAgICAgX2NvbnRleHQucHJldiA9IDI3O1xuICAgICAgICAgICAgX2NvbnRleHQucHJldiA9IDI4O1xuXG4gICAgICAgICAgICBpZiAoISghX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbiAmJiBfaXRlcmF0b3JbXCJyZXR1cm5cIl0gIT0gbnVsbCkpIHtcbiAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDMyO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDMyO1xuICAgICAgICAgICAgcmV0dXJuIF9hd2FpdEFzeW5jR2VuZXJhdG9yKF9pdGVyYXRvcltcInJldHVyblwiXSgpKTtcblxuICAgICAgICAgIGNhc2UgMzI6XG4gICAgICAgICAgICBfY29udGV4dC5wcmV2ID0gMzI7XG5cbiAgICAgICAgICAgIGlmICghX2RpZEl0ZXJhdG9yRXJyb3IpIHtcbiAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDM1O1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhyb3cgX2l0ZXJhdG9yRXJyb3I7XG5cbiAgICAgICAgICBjYXNlIDM1OlxuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LmZpbmlzaCgzMik7XG5cbiAgICAgICAgICBjYXNlIDM2OlxuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LmZpbmlzaCgyNyk7XG5cbiAgICAgICAgICBjYXNlIDM3OlxuICAgICAgICAgICAgaWYgKCFoZWFwLnNpemUpIHtcbiAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDQyO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDQwO1xuICAgICAgICAgICAgcmV0dXJuIGhlYXAucG9wKCk7XG5cbiAgICAgICAgICBjYXNlIDQwOlxuICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDM3O1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlIDQyOlxuICAgICAgICAgIGNhc2UgXCJlbmRcIjpcbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5zdG9wKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCBfY2FsbGVlLCBudWxsLCBbWzUsIDIzLCAyNywgMzddLCBbMjgsLCAzMiwgMzZdXSk7XG4gIH0pKTtcbiAgcmV0dXJuIF9hc3luY1Rha2VTb3J0ZWQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cblxudmFyIGFzeW5jVGFrZVNvcnRlZCA9IC8qI19fUFVSRV9fKi9hc3luY0l0ZXJhYmxlQ3VycnkoX19hc3luY1Rha2VTb3J0ZWQsIHtcbiAgbWluQXJnczogMCxcbiAgbWF4QXJnczogMixcbiAgdmFsaWRhdGVBcmdzOiBmdW5jdGlvbiB2YWxpZGF0ZUFyZ3MoYXJncykge1xuICAgIGlmICh0eXBlb2YgYXJnc1sxXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdmFyIHRlbXAgPSBhcmdzWzJdO1xuICAgICAgYXJnc1syXSA9IGFyZ3NbMV07XG4gICAgICBhcmdzWzFdID0gdGVtcDtcbiAgICB9XG4gIH1cbn0pO1xuZXhwb3J0cy5hc3luY1Rha2VTb3J0ZWQgPSBhc3luY1Rha2VTb3J0ZWQ7IiwidmFyIF9jbGFzc0NhbGxDaGVjayA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrXCIpO1xuXG52YXIgX2NyZWF0ZUNsYXNzID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY3JlYXRlQ2xhc3NcIik7XG5cbmZ1bmN0aW9uIHN3YXAoYXJyLCB4LCB5KSB7XG4gIHZhciB0bXAgPSBhcnJbeF07XG4gIGFyclt4XSA9IGFyclt5XTtcbiAgYXJyW3ldID0gdG1wO1xufVxuXG52YXIgSGVhcCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIEhlYXAoY29tcGFyZSkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBIZWFwKTtcblxuICAgIHRoaXMuY29tcGFyZSA9IGNvbXBhcmU7XG4gICAgdGhpcy5kYXRhID0gW107XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoSGVhcCwgW3tcbiAgICBrZXk6IFwiX2J1YmJsZVVwXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9idWJibGVVcChpKSB7XG4gICAgICB2YXIgZGF0YSA9IHRoaXMuZGF0YSxcbiAgICAgICAgICBjb21wYXJlID0gdGhpcy5jb21wYXJlO1xuICAgICAgdmFyIHBhcmVudEluZGV4O1xuXG4gICAgICB3aGlsZSAoaSA+IDApIHtcbiAgICAgICAgcGFyZW50SW5kZXggPSBIZWFwLmdldFBhcmVudEluZGV4KGkpO1xuXG4gICAgICAgIGlmIChjb21wYXJlKGRhdGFbaV0sIGRhdGFbcGFyZW50SW5kZXhdKSA8IDApIHtcbiAgICAgICAgICBzd2FwKHRoaXMuZGF0YSwgaSwgcGFyZW50SW5kZXgpO1xuICAgICAgICAgIGkgPSBwYXJlbnRJbmRleDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJfaGVhcGlmeVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfaGVhcGlmeShpKSB7XG4gICAgICB2YXIgZGF0YSA9IHRoaXMuZGF0YSxcbiAgICAgICAgICBjb21wYXJlID0gdGhpcy5jb21wYXJlO1xuICAgICAgdmFyIGxJZHggPSBIZWFwLmdldExlZnRJbmRleChpKTtcbiAgICAgIHZhciBySWR4ID0gSGVhcC5nZXRSaWdodEluZGV4KGkpO1xuICAgICAgdmFyIGxlZnRJc1NtYWxsZXIgPSB0aGlzLmhhcyhsSWR4KSA/IGNvbXBhcmUoZGF0YVtsSWR4XSwgZGF0YVtpXSkgPCAwIDogZmFsc2U7XG4gICAgICB2YXIgcmlnaHRJc1NtYWxsZXIgPSB0aGlzLmhhcyhySWR4KSA/IGNvbXBhcmUoZGF0YVtySWR4XSwgZGF0YVtpXSkgPCAwIDogZmFsc2U7XG5cbiAgICAgIGlmIChsZWZ0SXNTbWFsbGVyICYmIHJpZ2h0SXNTbWFsbGVyKSB7XG4gICAgICAgIGlmIChjb21wYXJlKGRhdGFbbElkeF0sIGRhdGFbcklkeF0pIDwgMCkge1xuICAgICAgICAgIHN3YXAodGhpcy5kYXRhLCBsSWR4LCBpKTtcbiAgICAgICAgICByZXR1cm4gbElkeDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzd2FwKHRoaXMuZGF0YSwgcklkeCwgaSk7XG4gICAgICAgICAgcmV0dXJuIHJJZHg7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAobGVmdElzU21hbGxlcikge1xuICAgICAgICBzd2FwKHRoaXMuZGF0YSwgbElkeCwgaSk7XG4gICAgICAgIHJldHVybiBsSWR4O1xuICAgICAgfSBlbHNlIGlmIChyaWdodElzU21hbGxlcikge1xuICAgICAgICBzd2FwKHRoaXMuZGF0YSwgcklkeCwgaSk7XG4gICAgICAgIHJldHVybiBySWR4O1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJfYnViYmxlRG93blwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfYnViYmxlRG93bihpKSB7XG4gICAgICB2YXIgc2l6ZSA9IHRoaXMuc2l6ZTtcblxuICAgICAgd2hpbGUgKGkgIT09IG51bGwgJiYgaSA8IHNpemUpIHtcbiAgICAgICAgaSA9IHRoaXMuX2hlYXBpZnkoaSk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInB1c2hcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcHVzaCh2YWx1ZSkge1xuICAgICAgdGhpcy5kYXRhLnB1c2godmFsdWUpO1xuXG4gICAgICB0aGlzLl9idWJibGVVcCh0aGlzLnNpemUgLSAxKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicG9wXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHBvcCgpIHtcbiAgICAgIGlmICghdGhpcy5zaXplKSByZXR1cm47XG4gICAgICB2YXIgcm9vdCA9IHRoaXMuZGF0YVswXTtcbiAgICAgIHZhciBsYXN0ID0gdGhpcy5kYXRhLnBvcCgpO1xuXG4gICAgICBpZiAodGhpcy5zaXplID4gMCkge1xuICAgICAgICB0aGlzLmRhdGFbMF0gPSBsYXN0O1xuXG4gICAgICAgIHRoaXMuX2J1YmJsZURvd24oMCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByb290O1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJoYXNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gaGFzKGlkeCkge1xuICAgICAgcmV0dXJuIGlkeCA+IDAgJiYgaWR4IDwgdGhpcy5zaXplO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJzaXplXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5kYXRhLmxlbmd0aDtcbiAgICB9XG4gIH1dLCBbe1xuICAgIGtleTogXCJnZXRQYXJlbnRJbmRleFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRQYXJlbnRJbmRleChpKSB7XG4gICAgICByZXR1cm4gaSAlIDIgPyAoaSAtIDEpIC8gMiA6IE1hdGguZmxvb3IoKGkgLSAxKSAvIDIpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRMZWZ0SW5kZXhcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0TGVmdEluZGV4KGkpIHtcbiAgICAgIHJldHVybiAyICogaSArIDE7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldFJpZ2h0SW5kZXhcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0UmlnaHRJbmRleChpKSB7XG4gICAgICByZXR1cm4gMiAqIGkgKyAyO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBIZWFwO1xufSgpO1xuXG5leHBvcnRzLkhlYXAgPSBIZWFwOyIsInZhciBfcmVnZW5lcmF0b3JSdW50aW1lID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL3JlZ2VuZXJhdG9yXCIpO1xuXG52YXIgX21hcmtlZCA9IC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3JSdW50aW1lLm1hcmsoX190YWtlU29ydGVkKTtcblxuZnVuY3Rpb24gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIobywgYWxsb3dBcnJheUxpa2UpIHsgdmFyIGl0OyBpZiAodHlwZW9mIFN5bWJvbCA9PT0gXCJ1bmRlZmluZWRcIiB8fCBvW1N5bWJvbC5pdGVyYXRvcl0gPT0gbnVsbCkgeyBpZiAoQXJyYXkuaXNBcnJheShvKSB8fCAoaXQgPSBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkobykpIHx8IGFsbG93QXJyYXlMaWtlICYmIG8gJiYgdHlwZW9mIG8ubGVuZ3RoID09PSBcIm51bWJlclwiKSB7IGlmIChpdCkgbyA9IGl0OyB2YXIgaSA9IDA7IHZhciBGID0gZnVuY3Rpb24gRigpIHt9OyByZXR1cm4geyBzOiBGLCBuOiBmdW5jdGlvbiBuKCkgeyBpZiAoaSA+PSBvLmxlbmd0aCkgcmV0dXJuIHsgZG9uZTogdHJ1ZSB9OyByZXR1cm4geyBkb25lOiBmYWxzZSwgdmFsdWU6IG9baSsrXSB9OyB9LCBlOiBmdW5jdGlvbiBlKF9lKSB7IHRocm93IF9lOyB9LCBmOiBGIH07IH0gdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBpdGVyYXRlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpOyB9IHZhciBub3JtYWxDb21wbGV0aW9uID0gdHJ1ZSwgZGlkRXJyID0gZmFsc2UsIGVycjsgcmV0dXJuIHsgczogZnVuY3Rpb24gcygpIHsgaXQgPSBvW1N5bWJvbC5pdGVyYXRvcl0oKTsgfSwgbjogZnVuY3Rpb24gbigpIHsgdmFyIHN0ZXAgPSBpdC5uZXh0KCk7IG5vcm1hbENvbXBsZXRpb24gPSBzdGVwLmRvbmU7IHJldHVybiBzdGVwOyB9LCBlOiBmdW5jdGlvbiBlKF9lMikgeyBkaWRFcnIgPSB0cnVlOyBlcnIgPSBfZTI7IH0sIGY6IGZ1bmN0aW9uIGYoKSB7IHRyeSB7IGlmICghbm9ybWFsQ29tcGxldGlvbiAmJiBpdFtcInJldHVyblwiXSAhPSBudWxsKSBpdFtcInJldHVyblwiXSgpOyB9IGZpbmFsbHkgeyBpZiAoZGlkRXJyKSB0aHJvdyBlcnI7IH0gfSB9OyB9XG5cbmZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvLCBtaW5MZW4pIHsgaWYgKCFvKSByZXR1cm47IGlmICh0eXBlb2YgbyA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IHZhciBuID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pLnNsaWNlKDgsIC0xKTsgaWYgKG4gPT09IFwiT2JqZWN0XCIgJiYgby5jb25zdHJ1Y3RvcikgbiA9IG8uY29uc3RydWN0b3IubmFtZTsgaWYgKG4gPT09IFwiTWFwXCIgfHwgbiA9PT0gXCJTZXRcIikgcmV0dXJuIEFycmF5LmZyb20obyk7IGlmIChuID09PSBcIkFyZ3VtZW50c1wiIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTsgfVxuXG5mdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheShhcnIsIGxlbikgeyBpZiAobGVuID09IG51bGwgfHwgbGVuID4gYXJyLmxlbmd0aCkgbGVuID0gYXJyLmxlbmd0aDsgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkobGVuKTsgaSA8IGxlbjsgaSsrKSB7IGFycjJbaV0gPSBhcnJbaV07IH0gcmV0dXJuIGFycjI7IH1cblxudmFyIF9yZXF1aXJlID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWwvaXRlcmFibGUuanMnKSxcbiAgICBpdGVyYWJsZUN1cnJ5ID0gX3JlcXVpcmUuaXRlcmFibGVDdXJyeTtcblxudmFyIF9yZXF1aXJlMiA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFsL2NvbXBhcmUuanMnKSxcbiAgICBkZWZhdWx0Q29tcGFyZU9yZGVyID0gX3JlcXVpcmUyLmRlZmF1bHRDb21wYXJlT3JkZXI7XG5cbnZhciBfcmVxdWlyZTMgPSByZXF1aXJlKCcuL2ludGVybmFsL2hlYXAuanMnKSxcbiAgICBIZWFwID0gX3JlcXVpcmUzLkhlYXA7XG5cbmZ1bmN0aW9uIF9fdGFrZVNvcnRlZChzb3VyY2UpIHtcbiAgdmFyIG4sXG4gICAgICBjb21wYXJlLFxuICAgICAgaGVhcCxcbiAgICAgIF9pdGVyYXRvcixcbiAgICAgIF9zdGVwLFxuICAgICAgdmFsdWUsXG4gICAgICBfYXJncyA9IGFyZ3VtZW50cztcblxuICByZXR1cm4gX3JlZ2VuZXJhdG9yUnVudGltZS53cmFwKGZ1bmN0aW9uIF9fdGFrZVNvcnRlZCQoX2NvbnRleHQpIHtcbiAgICB3aGlsZSAoMSkge1xuICAgICAgc3dpdGNoIChfY29udGV4dC5wcmV2ID0gX2NvbnRleHQubmV4dCkge1xuICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgbiA9IF9hcmdzLmxlbmd0aCA+IDEgJiYgX2FyZ3NbMV0gIT09IHVuZGVmaW5lZCA/IF9hcmdzWzFdIDogSW5maW5pdHk7XG4gICAgICAgICAgY29tcGFyZSA9IF9hcmdzLmxlbmd0aCA+IDIgJiYgX2FyZ3NbMl0gIT09IHVuZGVmaW5lZCA/IF9hcmdzWzJdIDogZGVmYXVsdENvbXBhcmVPcmRlcjtcbiAgICAgICAgICBoZWFwID0gbmV3IEhlYXAoY29tcGFyZSk7XG4gICAgICAgICAgX2l0ZXJhdG9yID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIoc291cmNlKTtcblxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBmb3IgKF9pdGVyYXRvci5zKCk7ICEoX3N0ZXAgPSBfaXRlcmF0b3IubigpKS5kb25lOykge1xuICAgICAgICAgICAgICB2YWx1ZSA9IF9zdGVwLnZhbHVlO1xuICAgICAgICAgICAgICBoZWFwLnB1c2godmFsdWUpO1xuXG4gICAgICAgICAgICAgIGlmIChoZWFwLnNpemUgPiBuKSB7XG4gICAgICAgICAgICAgICAgaGVhcC5wb3AoKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgX2l0ZXJhdG9yLmUoZXJyKTtcbiAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgX2l0ZXJhdG9yLmYoKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgY2FzZSA1OlxuICAgICAgICAgIGlmICghaGVhcC5zaXplKSB7XG4gICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMTA7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBfY29udGV4dC5uZXh0ID0gODtcbiAgICAgICAgICByZXR1cm4gaGVhcC5wb3AoKTtcblxuICAgICAgICBjYXNlIDg6XG4gICAgICAgICAgX2NvbnRleHQubmV4dCA9IDU7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAxMDpcbiAgICAgICAgY2FzZSBcImVuZFwiOlxuICAgICAgICAgIHJldHVybiBfY29udGV4dC5zdG9wKCk7XG4gICAgICB9XG4gICAgfVxuICB9LCBfbWFya2VkKTtcbn1cblxuZXhwb3J0cy5fX3Rha2VTb3J0ZWQgPSBfX3Rha2VTb3J0ZWQ7XG52YXIgdGFrZVNvcnRlZCA9IC8qI19fUFVSRV9fKi9pdGVyYWJsZUN1cnJ5KF9fdGFrZVNvcnRlZCwge1xuICBtaW5BcmdzOiAwLFxuICBtYXhBcmdzOiAyLFxuICB2YWxpZGF0ZUFyZ3M6IGZ1bmN0aW9uIHZhbGlkYXRlQXJncyhhcmdzKSB7XG4gICAgaWYgKHR5cGVvZiBhcmdzWzFdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB2YXIgdGVtcCA9IGFyZ3NbMl07XG4gICAgICBhcmdzWzJdID0gYXJnc1sxXTtcbiAgICAgIGFyZ3NbMV0gPSB0ZW1wO1xuICAgIH1cbiAgfVxufSk7XG5leHBvcnRzLnRha2VTb3J0ZWQgPSB0YWtlU29ydGVkOyIsInZhciBfcmVnZW5lcmF0b3JSdW50aW1lID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL3JlZ2VuZXJhdG9yXCIpO1xuXG52YXIgX2F3YWl0QXN5bmNHZW5lcmF0b3IgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9hd2FpdEFzeW5jR2VuZXJhdG9yXCIpO1xuXG52YXIgX3dyYXBBc3luY0dlbmVyYXRvciA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3dyYXBBc3luY0dlbmVyYXRvclwiKTtcblxudmFyIF9hc3luY0l0ZXJhdG9yID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvYXN5bmNJdGVyYXRvclwiKTtcblxudmFyIF9yZXF1aXJlID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWwvYXN5bmMtaXRlcmFibGUuanMnKSxcbiAgICBhc3luY0l0ZXJhYmxlQ3VycnkgPSBfcmVxdWlyZS5hc3luY0l0ZXJhYmxlQ3Vycnk7XG5cbmZ1bmN0aW9uIF9fYXN5bmNUYWtlV2hpbGUoX3gsIF94Mikge1xuICByZXR1cm4gX2FzeW5jVGFrZVdoaWxlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5cbmV4cG9ydHMuX19hc3luY1Rha2VXaGlsZSA9IF9fYXN5bmNUYWtlV2hpbGU7XG5cbmZ1bmN0aW9uIF9hc3luY1Rha2VXaGlsZSgpIHtcbiAgX2FzeW5jVGFrZVdoaWxlID0gX3dyYXBBc3luY0dlbmVyYXRvciggLyojX19QVVJFX18qL19yZWdlbmVyYXRvclJ1bnRpbWUubWFyayhmdW5jdGlvbiBfY2FsbGVlKHNvdXJjZSwgcHJlZGljYXRlKSB7XG4gICAgdmFyIHRha2UsIGMsIF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24sIF9kaWRJdGVyYXRvckVycm9yLCBfaXRlcmF0b3JFcnJvciwgX2l0ZXJhdG9yLCBfc3RlcCwgX3ZhbHVlLCB2YWx1ZTtcblxuICAgIHJldHVybiBfcmVnZW5lcmF0b3JSdW50aW1lLndyYXAoZnVuY3Rpb24gX2NhbGxlZSQoX2NvbnRleHQpIHtcbiAgICAgIHdoaWxlICgxKSB7XG4gICAgICAgIHN3aXRjaCAoX2NvbnRleHQucHJldiA9IF9jb250ZXh0Lm5leHQpIHtcbiAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICB0YWtlID0gdHJ1ZTtcbiAgICAgICAgICAgIGMgPSAwO1xuICAgICAgICAgICAgX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbiA9IHRydWU7XG4gICAgICAgICAgICBfZGlkSXRlcmF0b3JFcnJvciA9IGZhbHNlO1xuICAgICAgICAgICAgX2NvbnRleHQucHJldiA9IDQ7XG4gICAgICAgICAgICBfaXRlcmF0b3IgPSBfYXN5bmNJdGVyYXRvcihzb3VyY2UpO1xuXG4gICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDg7XG4gICAgICAgICAgICByZXR1cm4gX2F3YWl0QXN5bmNHZW5lcmF0b3IoX2l0ZXJhdG9yLm5leHQoKSk7XG5cbiAgICAgICAgICBjYXNlIDg6XG4gICAgICAgICAgICBfc3RlcCA9IF9jb250ZXh0LnNlbnQ7XG4gICAgICAgICAgICBfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uID0gX3N0ZXAuZG9uZTtcbiAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAxMjtcbiAgICAgICAgICAgIHJldHVybiBfYXdhaXRBc3luY0dlbmVyYXRvcihfc3RlcC52YWx1ZSk7XG5cbiAgICAgICAgICBjYXNlIDEyOlxuICAgICAgICAgICAgX3ZhbHVlID0gX2NvbnRleHQuc2VudDtcblxuICAgICAgICAgICAgaWYgKF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24pIHtcbiAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDI3O1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFsdWUgPSBfdmFsdWU7XG4gICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMTc7XG4gICAgICAgICAgICByZXR1cm4gX2F3YWl0QXN5bmNHZW5lcmF0b3IocHJlZGljYXRlKHZhbHVlLCBjKyspKTtcblxuICAgICAgICAgIGNhc2UgMTc6XG4gICAgICAgICAgICB0YWtlID0gX2NvbnRleHQuc2VudDtcblxuICAgICAgICAgICAgaWYgKCF0YWtlKSB7XG4gICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAyMztcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAyMTtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcblxuICAgICAgICAgIGNhc2UgMjE6XG4gICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMjQ7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgMjM6XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuYWJydXB0KFwiYnJlYWtcIiwgMjcpO1xuXG4gICAgICAgICAgY2FzZSAyNDpcbiAgICAgICAgICAgIF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24gPSB0cnVlO1xuICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDY7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgMjc6XG4gICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMzM7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgMjk6XG4gICAgICAgICAgICBfY29udGV4dC5wcmV2ID0gMjk7XG4gICAgICAgICAgICBfY29udGV4dC50MCA9IF9jb250ZXh0W1wiY2F0Y2hcIl0oNCk7XG4gICAgICAgICAgICBfZGlkSXRlcmF0b3JFcnJvciA9IHRydWU7XG4gICAgICAgICAgICBfaXRlcmF0b3JFcnJvciA9IF9jb250ZXh0LnQwO1xuXG4gICAgICAgICAgY2FzZSAzMzpcbiAgICAgICAgICAgIF9jb250ZXh0LnByZXYgPSAzMztcbiAgICAgICAgICAgIF9jb250ZXh0LnByZXYgPSAzNDtcblxuICAgICAgICAgICAgaWYgKCEoIV9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24gJiYgX2l0ZXJhdG9yW1wicmV0dXJuXCJdICE9IG51bGwpKSB7XG4gICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAzODtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAzODtcbiAgICAgICAgICAgIHJldHVybiBfYXdhaXRBc3luY0dlbmVyYXRvcihfaXRlcmF0b3JbXCJyZXR1cm5cIl0oKSk7XG5cbiAgICAgICAgICBjYXNlIDM4OlxuICAgICAgICAgICAgX2NvbnRleHQucHJldiA9IDM4O1xuXG4gICAgICAgICAgICBpZiAoIV9kaWRJdGVyYXRvckVycm9yKSB7XG4gICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSA0MTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRocm93IF9pdGVyYXRvckVycm9yO1xuXG4gICAgICAgICAgY2FzZSA0MTpcbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5maW5pc2goMzgpO1xuXG4gICAgICAgICAgY2FzZSA0MjpcbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5maW5pc2goMzMpO1xuXG4gICAgICAgICAgY2FzZSA0MzpcbiAgICAgICAgICBjYXNlIFwiZW5kXCI6XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuc3RvcCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwgX2NhbGxlZSwgbnVsbCwgW1s0LCAyOSwgMzMsIDQzXSwgWzM0LCwgMzgsIDQyXV0pO1xuICB9KSk7XG4gIHJldHVybiBfYXN5bmNUYWtlV2hpbGUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cblxudmFyIGFzeW5jVGFrZVdoaWxlID0gLyojX19QVVJFX18qL2FzeW5jSXRlcmFibGVDdXJyeShfX2FzeW5jVGFrZVdoaWxlKTtcbmV4cG9ydHMuYXN5bmNUYWtlV2hpbGUgPSBhc3luY1Rha2VXaGlsZTsiLCJ2YXIgX3JlZ2VuZXJhdG9yUnVudGltZSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9yZWdlbmVyYXRvclwiKTtcblxudmFyIF9tYXJrZWQgPSAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yUnVudGltZS5tYXJrKF9fdGFrZVdoaWxlKTtcblxuZnVuY3Rpb24gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIobywgYWxsb3dBcnJheUxpa2UpIHsgdmFyIGl0OyBpZiAodHlwZW9mIFN5bWJvbCA9PT0gXCJ1bmRlZmluZWRcIiB8fCBvW1N5bWJvbC5pdGVyYXRvcl0gPT0gbnVsbCkgeyBpZiAoQXJyYXkuaXNBcnJheShvKSB8fCAoaXQgPSBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkobykpIHx8IGFsbG93QXJyYXlMaWtlICYmIG8gJiYgdHlwZW9mIG8ubGVuZ3RoID09PSBcIm51bWJlclwiKSB7IGlmIChpdCkgbyA9IGl0OyB2YXIgaSA9IDA7IHZhciBGID0gZnVuY3Rpb24gRigpIHt9OyByZXR1cm4geyBzOiBGLCBuOiBmdW5jdGlvbiBuKCkgeyBpZiAoaSA+PSBvLmxlbmd0aCkgcmV0dXJuIHsgZG9uZTogdHJ1ZSB9OyByZXR1cm4geyBkb25lOiBmYWxzZSwgdmFsdWU6IG9baSsrXSB9OyB9LCBlOiBmdW5jdGlvbiBlKF9lKSB7IHRocm93IF9lOyB9LCBmOiBGIH07IH0gdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBpdGVyYXRlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpOyB9IHZhciBub3JtYWxDb21wbGV0aW9uID0gdHJ1ZSwgZGlkRXJyID0gZmFsc2UsIGVycjsgcmV0dXJuIHsgczogZnVuY3Rpb24gcygpIHsgaXQgPSBvW1N5bWJvbC5pdGVyYXRvcl0oKTsgfSwgbjogZnVuY3Rpb24gbigpIHsgdmFyIHN0ZXAgPSBpdC5uZXh0KCk7IG5vcm1hbENvbXBsZXRpb24gPSBzdGVwLmRvbmU7IHJldHVybiBzdGVwOyB9LCBlOiBmdW5jdGlvbiBlKF9lMikgeyBkaWRFcnIgPSB0cnVlOyBlcnIgPSBfZTI7IH0sIGY6IGZ1bmN0aW9uIGYoKSB7IHRyeSB7IGlmICghbm9ybWFsQ29tcGxldGlvbiAmJiBpdFtcInJldHVyblwiXSAhPSBudWxsKSBpdFtcInJldHVyblwiXSgpOyB9IGZpbmFsbHkgeyBpZiAoZGlkRXJyKSB0aHJvdyBlcnI7IH0gfSB9OyB9XG5cbmZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvLCBtaW5MZW4pIHsgaWYgKCFvKSByZXR1cm47IGlmICh0eXBlb2YgbyA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IHZhciBuID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pLnNsaWNlKDgsIC0xKTsgaWYgKG4gPT09IFwiT2JqZWN0XCIgJiYgby5jb25zdHJ1Y3RvcikgbiA9IG8uY29uc3RydWN0b3IubmFtZTsgaWYgKG4gPT09IFwiTWFwXCIgfHwgbiA9PT0gXCJTZXRcIikgcmV0dXJuIEFycmF5LmZyb20obyk7IGlmIChuID09PSBcIkFyZ3VtZW50c1wiIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTsgfVxuXG5mdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheShhcnIsIGxlbikgeyBpZiAobGVuID09IG51bGwgfHwgbGVuID4gYXJyLmxlbmd0aCkgbGVuID0gYXJyLmxlbmd0aDsgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkobGVuKTsgaSA8IGxlbjsgaSsrKSB7IGFycjJbaV0gPSBhcnJbaV07IH0gcmV0dXJuIGFycjI7IH1cblxudmFyIF9yZXF1aXJlID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWwvaXRlcmFibGUuanMnKSxcbiAgICBpdGVyYWJsZUN1cnJ5ID0gX3JlcXVpcmUuaXRlcmFibGVDdXJyeTtcblxuZnVuY3Rpb24gX190YWtlV2hpbGUoc291cmNlLCBwcmVkaWNhdGUpIHtcbiAgdmFyIHRha2UsIGMsIF9pdGVyYXRvciwgX3N0ZXAsIHZhbHVlO1xuXG4gIHJldHVybiBfcmVnZW5lcmF0b3JSdW50aW1lLndyYXAoZnVuY3Rpb24gX190YWtlV2hpbGUkKF9jb250ZXh0KSB7XG4gICAgd2hpbGUgKDEpIHtcbiAgICAgIHN3aXRjaCAoX2NvbnRleHQucHJldiA9IF9jb250ZXh0Lm5leHQpIHtcbiAgICAgICAgY2FzZSAwOlxuICAgICAgICAgIHRha2UgPSB0cnVlO1xuICAgICAgICAgIGMgPSAwO1xuICAgICAgICAgIF9pdGVyYXRvciA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKHNvdXJjZSk7XG4gICAgICAgICAgX2NvbnRleHQucHJldiA9IDM7XG5cbiAgICAgICAgICBfaXRlcmF0b3IucygpO1xuXG4gICAgICAgIGNhc2UgNTpcbiAgICAgICAgICBpZiAoKF9zdGVwID0gX2l0ZXJhdG9yLm4oKSkuZG9uZSkge1xuICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDE2O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFsdWUgPSBfc3RlcC52YWx1ZTtcbiAgICAgICAgICB0YWtlID0gcHJlZGljYXRlKHZhbHVlLCBjKyspO1xuXG4gICAgICAgICAgaWYgKCF0YWtlKSB7XG4gICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMTM7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMTE7XG4gICAgICAgICAgcmV0dXJuIHZhbHVlO1xuXG4gICAgICAgIGNhc2UgMTE6XG4gICAgICAgICAgX2NvbnRleHQubmV4dCA9IDE0O1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgMTM6XG4gICAgICAgICAgcmV0dXJuIF9jb250ZXh0LmFicnVwdChcImJyZWFrXCIsIDE2KTtcblxuICAgICAgICBjYXNlIDE0OlxuICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSA1O1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgMTY6XG4gICAgICAgICAgX2NvbnRleHQubmV4dCA9IDIxO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgMTg6XG4gICAgICAgICAgX2NvbnRleHQucHJldiA9IDE4O1xuICAgICAgICAgIF9jb250ZXh0LnQwID0gX2NvbnRleHRbXCJjYXRjaFwiXSgzKTtcblxuICAgICAgICAgIF9pdGVyYXRvci5lKF9jb250ZXh0LnQwKTtcblxuICAgICAgICBjYXNlIDIxOlxuICAgICAgICAgIF9jb250ZXh0LnByZXYgPSAyMTtcblxuICAgICAgICAgIF9pdGVyYXRvci5mKCk7XG5cbiAgICAgICAgICByZXR1cm4gX2NvbnRleHQuZmluaXNoKDIxKTtcblxuICAgICAgICBjYXNlIDI0OlxuICAgICAgICBjYXNlIFwiZW5kXCI6XG4gICAgICAgICAgcmV0dXJuIF9jb250ZXh0LnN0b3AoKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIF9tYXJrZWQsIG51bGwsIFtbMywgMTgsIDIxLCAyNF1dKTtcbn1cblxuZXhwb3J0cy5fX3Rha2VXaGlsZSA9IF9fdGFrZVdoaWxlO1xudmFyIHRha2VXaGlsZSA9IC8qI19fUFVSRV9fKi9pdGVyYWJsZUN1cnJ5KF9fdGFrZVdoaWxlKTtcbmV4cG9ydHMudGFrZVdoaWxlID0gdGFrZVdoaWxlOyIsInZhciBfcmVnZW5lcmF0b3JSdW50aW1lID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL3JlZ2VuZXJhdG9yXCIpO1xuXG52YXIgX2F3YWl0QXN5bmNHZW5lcmF0b3IgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9hd2FpdEFzeW5jR2VuZXJhdG9yXCIpO1xuXG52YXIgX3dyYXBBc3luY0dlbmVyYXRvciA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3dyYXBBc3luY0dlbmVyYXRvclwiKTtcblxudmFyIF9hc3luY0l0ZXJhdG9yID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvYXN5bmNJdGVyYXRvclwiKTtcblxudmFyIF9yZXF1aXJlID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWwvYXN5bmMtaXRlcmFibGUuanMnKSxcbiAgICBhc3luY0l0ZXJhYmxlQ3VycnkgPSBfcmVxdWlyZS5hc3luY0l0ZXJhYmxlQ3Vycnk7XG5cbmZ1bmN0aW9uIF9fYXN5bmNUYWtlKF94LCBfeDIpIHtcbiAgcmV0dXJuIF9hc3luY1Rha2UuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cblxuZXhwb3J0cy5fX2FzeW5jVGFrZSA9IF9fYXN5bmNUYWtlO1xuXG5mdW5jdGlvbiBfYXN5bmNUYWtlKCkge1xuICBfYXN5bmNUYWtlID0gX3dyYXBBc3luY0dlbmVyYXRvciggLyojX19QVVJFX18qL19yZWdlbmVyYXRvclJ1bnRpbWUubWFyayhmdW5jdGlvbiBfY2FsbGVlKGl0ZXJhYmxlLCBuKSB7XG4gICAgdmFyIGksIF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24sIF9kaWRJdGVyYXRvckVycm9yLCBfaXRlcmF0b3JFcnJvciwgX2l0ZXJhdG9yLCBfc3RlcCwgX3ZhbHVlLCB2YWx1ZTtcblxuICAgIHJldHVybiBfcmVnZW5lcmF0b3JSdW50aW1lLndyYXAoZnVuY3Rpb24gX2NhbGxlZSQoX2NvbnRleHQpIHtcbiAgICAgIHdoaWxlICgxKSB7XG4gICAgICAgIHN3aXRjaCAoX2NvbnRleHQucHJldiA9IF9jb250ZXh0Lm5leHQpIHtcbiAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICBpZiAoIShuID09PSAwKSkge1xuICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMjtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5hYnJ1cHQoXCJyZXR1cm5cIik7XG5cbiAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICBpID0gMDtcbiAgICAgICAgICAgIF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24gPSB0cnVlO1xuICAgICAgICAgICAgX2RpZEl0ZXJhdG9yRXJyb3IgPSBmYWxzZTtcbiAgICAgICAgICAgIF9jb250ZXh0LnByZXYgPSA1O1xuICAgICAgICAgICAgX2l0ZXJhdG9yID0gX2FzeW5jSXRlcmF0b3IoaXRlcmFibGUpO1xuXG4gICAgICAgICAgY2FzZSA3OlxuICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDk7XG4gICAgICAgICAgICByZXR1cm4gX2F3YWl0QXN5bmNHZW5lcmF0b3IoX2l0ZXJhdG9yLm5leHQoKSk7XG5cbiAgICAgICAgICBjYXNlIDk6XG4gICAgICAgICAgICBfc3RlcCA9IF9jb250ZXh0LnNlbnQ7XG4gICAgICAgICAgICBfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uID0gX3N0ZXAuZG9uZTtcbiAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAxMztcbiAgICAgICAgICAgIHJldHVybiBfYXdhaXRBc3luY0dlbmVyYXRvcihfc3RlcC52YWx1ZSk7XG5cbiAgICAgICAgICBjYXNlIDEzOlxuICAgICAgICAgICAgX3ZhbHVlID0gX2NvbnRleHQuc2VudDtcblxuICAgICAgICAgICAgaWYgKF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24pIHtcbiAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDIzO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFsdWUgPSBfdmFsdWU7XG4gICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMTg7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG5cbiAgICAgICAgICBjYXNlIDE4OlxuICAgICAgICAgICAgaWYgKCEoKytpID09PSBuKSkge1xuICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMjA7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuYWJydXB0KFwiYnJlYWtcIiwgMjMpO1xuXG4gICAgICAgICAgY2FzZSAyMDpcbiAgICAgICAgICAgIF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24gPSB0cnVlO1xuICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDc7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgMjM6XG4gICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMjk7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgMjU6XG4gICAgICAgICAgICBfY29udGV4dC5wcmV2ID0gMjU7XG4gICAgICAgICAgICBfY29udGV4dC50MCA9IF9jb250ZXh0W1wiY2F0Y2hcIl0oNSk7XG4gICAgICAgICAgICBfZGlkSXRlcmF0b3JFcnJvciA9IHRydWU7XG4gICAgICAgICAgICBfaXRlcmF0b3JFcnJvciA9IF9jb250ZXh0LnQwO1xuXG4gICAgICAgICAgY2FzZSAyOTpcbiAgICAgICAgICAgIF9jb250ZXh0LnByZXYgPSAyOTtcbiAgICAgICAgICAgIF9jb250ZXh0LnByZXYgPSAzMDtcblxuICAgICAgICAgICAgaWYgKCEoIV9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24gJiYgX2l0ZXJhdG9yW1wicmV0dXJuXCJdICE9IG51bGwpKSB7XG4gICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAzNDtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAzNDtcbiAgICAgICAgICAgIHJldHVybiBfYXdhaXRBc3luY0dlbmVyYXRvcihfaXRlcmF0b3JbXCJyZXR1cm5cIl0oKSk7XG5cbiAgICAgICAgICBjYXNlIDM0OlxuICAgICAgICAgICAgX2NvbnRleHQucHJldiA9IDM0O1xuXG4gICAgICAgICAgICBpZiAoIV9kaWRJdGVyYXRvckVycm9yKSB7XG4gICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAzNztcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRocm93IF9pdGVyYXRvckVycm9yO1xuXG4gICAgICAgICAgY2FzZSAzNzpcbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5maW5pc2goMzQpO1xuXG4gICAgICAgICAgY2FzZSAzODpcbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5maW5pc2goMjkpO1xuXG4gICAgICAgICAgY2FzZSAzOTpcbiAgICAgICAgICBjYXNlIFwiZW5kXCI6XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuc3RvcCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwgX2NhbGxlZSwgbnVsbCwgW1s1LCAyNSwgMjksIDM5XSwgWzMwLCwgMzQsIDM4XV0pO1xuICB9KSk7XG4gIHJldHVybiBfYXN5bmNUYWtlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5cbnZhciBhc3luY1Rha2UgPSAvKiNfX1BVUkVfXyovYXN5bmNJdGVyYWJsZUN1cnJ5KF9fYXN5bmNUYWtlKTtcbmV4cG9ydHMuYXN5bmNUYWtlID0gYXN5bmNUYWtlOyIsInZhciBfcmVnZW5lcmF0b3JSdW50aW1lID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL3JlZ2VuZXJhdG9yXCIpO1xuXG52YXIgX21hcmtlZCA9IC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3JSdW50aW1lLm1hcmsoX190YWtlKTtcblxuZnVuY3Rpb24gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIobywgYWxsb3dBcnJheUxpa2UpIHsgdmFyIGl0OyBpZiAodHlwZW9mIFN5bWJvbCA9PT0gXCJ1bmRlZmluZWRcIiB8fCBvW1N5bWJvbC5pdGVyYXRvcl0gPT0gbnVsbCkgeyBpZiAoQXJyYXkuaXNBcnJheShvKSB8fCAoaXQgPSBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkobykpIHx8IGFsbG93QXJyYXlMaWtlICYmIG8gJiYgdHlwZW9mIG8ubGVuZ3RoID09PSBcIm51bWJlclwiKSB7IGlmIChpdCkgbyA9IGl0OyB2YXIgaSA9IDA7IHZhciBGID0gZnVuY3Rpb24gRigpIHt9OyByZXR1cm4geyBzOiBGLCBuOiBmdW5jdGlvbiBuKCkgeyBpZiAoaSA+PSBvLmxlbmd0aCkgcmV0dXJuIHsgZG9uZTogdHJ1ZSB9OyByZXR1cm4geyBkb25lOiBmYWxzZSwgdmFsdWU6IG9baSsrXSB9OyB9LCBlOiBmdW5jdGlvbiBlKF9lKSB7IHRocm93IF9lOyB9LCBmOiBGIH07IH0gdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBpdGVyYXRlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpOyB9IHZhciBub3JtYWxDb21wbGV0aW9uID0gdHJ1ZSwgZGlkRXJyID0gZmFsc2UsIGVycjsgcmV0dXJuIHsgczogZnVuY3Rpb24gcygpIHsgaXQgPSBvW1N5bWJvbC5pdGVyYXRvcl0oKTsgfSwgbjogZnVuY3Rpb24gbigpIHsgdmFyIHN0ZXAgPSBpdC5uZXh0KCk7IG5vcm1hbENvbXBsZXRpb24gPSBzdGVwLmRvbmU7IHJldHVybiBzdGVwOyB9LCBlOiBmdW5jdGlvbiBlKF9lMikgeyBkaWRFcnIgPSB0cnVlOyBlcnIgPSBfZTI7IH0sIGY6IGZ1bmN0aW9uIGYoKSB7IHRyeSB7IGlmICghbm9ybWFsQ29tcGxldGlvbiAmJiBpdFtcInJldHVyblwiXSAhPSBudWxsKSBpdFtcInJldHVyblwiXSgpOyB9IGZpbmFsbHkgeyBpZiAoZGlkRXJyKSB0aHJvdyBlcnI7IH0gfSB9OyB9XG5cbmZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvLCBtaW5MZW4pIHsgaWYgKCFvKSByZXR1cm47IGlmICh0eXBlb2YgbyA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IHZhciBuID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pLnNsaWNlKDgsIC0xKTsgaWYgKG4gPT09IFwiT2JqZWN0XCIgJiYgby5jb25zdHJ1Y3RvcikgbiA9IG8uY29uc3RydWN0b3IubmFtZTsgaWYgKG4gPT09IFwiTWFwXCIgfHwgbiA9PT0gXCJTZXRcIikgcmV0dXJuIEFycmF5LmZyb20obyk7IGlmIChuID09PSBcIkFyZ3VtZW50c1wiIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTsgfVxuXG5mdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheShhcnIsIGxlbikgeyBpZiAobGVuID09IG51bGwgfHwgbGVuID4gYXJyLmxlbmd0aCkgbGVuID0gYXJyLmxlbmd0aDsgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkobGVuKTsgaSA8IGxlbjsgaSsrKSB7IGFycjJbaV0gPSBhcnJbaV07IH0gcmV0dXJuIGFycjI7IH1cblxudmFyIF9yZXF1aXJlID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWwvaXRlcmFibGUuanMnKSxcbiAgICBpdGVyYWJsZUN1cnJ5ID0gX3JlcXVpcmUuaXRlcmFibGVDdXJyeTtcblxuZnVuY3Rpb24gX190YWtlKGl0ZXJhYmxlLCBuKSB7XG4gIHZhciBpLCBfaXRlcmF0b3IsIF9zdGVwLCB2YWx1ZTtcblxuICByZXR1cm4gX3JlZ2VuZXJhdG9yUnVudGltZS53cmFwKGZ1bmN0aW9uIF9fdGFrZSQoX2NvbnRleHQpIHtcbiAgICB3aGlsZSAoMSkge1xuICAgICAgc3dpdGNoIChfY29udGV4dC5wcmV2ID0gX2NvbnRleHQubmV4dCkge1xuICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgaWYgKCEobiA9PT0gMCkpIHtcbiAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAyO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIF9jb250ZXh0LmFicnVwdChcInJldHVyblwiKTtcblxuICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgaSA9IDA7XG4gICAgICAgICAgX2l0ZXJhdG9yID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIoaXRlcmFibGUpO1xuICAgICAgICAgIF9jb250ZXh0LnByZXYgPSA0O1xuXG4gICAgICAgICAgX2l0ZXJhdG9yLnMoKTtcblxuICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgaWYgKChfc3RlcCA9IF9pdGVyYXRvci5uKCkpLmRvbmUpIHtcbiAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAxNDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhbHVlID0gX3N0ZXAudmFsdWU7XG4gICAgICAgICAgX2NvbnRleHQubmV4dCA9IDEwO1xuICAgICAgICAgIHJldHVybiB2YWx1ZTtcblxuICAgICAgICBjYXNlIDEwOlxuICAgICAgICAgIGlmICghKCsraSA9PT0gbikpIHtcbiAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAxMjtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBfY29udGV4dC5hYnJ1cHQoXCJicmVha1wiLCAxNCk7XG5cbiAgICAgICAgY2FzZSAxMjpcbiAgICAgICAgICBfY29udGV4dC5uZXh0ID0gNjtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIDE0OlxuICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAxOTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIDE2OlxuICAgICAgICAgIF9jb250ZXh0LnByZXYgPSAxNjtcbiAgICAgICAgICBfY29udGV4dC50MCA9IF9jb250ZXh0W1wiY2F0Y2hcIl0oNCk7XG5cbiAgICAgICAgICBfaXRlcmF0b3IuZShfY29udGV4dC50MCk7XG5cbiAgICAgICAgY2FzZSAxOTpcbiAgICAgICAgICBfY29udGV4dC5wcmV2ID0gMTk7XG5cbiAgICAgICAgICBfaXRlcmF0b3IuZigpO1xuXG4gICAgICAgICAgcmV0dXJuIF9jb250ZXh0LmZpbmlzaCgxOSk7XG5cbiAgICAgICAgY2FzZSAyMjpcbiAgICAgICAgY2FzZSBcImVuZFwiOlxuICAgICAgICAgIHJldHVybiBfY29udGV4dC5zdG9wKCk7XG4gICAgICB9XG4gICAgfVxuICB9LCBfbWFya2VkLCBudWxsLCBbWzQsIDE2LCAxOSwgMjJdXSk7XG59XG5cbmV4cG9ydHMuX190YWtlID0gX190YWtlO1xudmFyIHRha2UgPSAvKiNfX1BVUkVfXyovaXRlcmFibGVDdXJyeShfX3Rha2UpO1xuZXhwb3J0cy50YWtlID0gdGFrZTsiLCJ2YXIgX3JlZ2VuZXJhdG9yUnVudGltZSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9yZWdlbmVyYXRvclwiKTtcblxudmFyIF9hd2FpdEFzeW5jR2VuZXJhdG9yID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvYXdhaXRBc3luY0dlbmVyYXRvclwiKTtcblxudmFyIF93cmFwQXN5bmNHZW5lcmF0b3IgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy93cmFwQXN5bmNHZW5lcmF0b3JcIik7XG5cbnZhciBfYXN5bmNJdGVyYXRvciA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2FzeW5jSXRlcmF0b3JcIik7XG5cbnZhciBfcmVxdWlyZSA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFsL2FzeW5jLWl0ZXJhYmxlLmpzJyksXG4gICAgYXN5bmNJdGVyYWJsZUN1cnJ5ID0gX3JlcXVpcmUuYXN5bmNJdGVyYWJsZUN1cnJ5O1xuXG5mdW5jdGlvbiBfX2FzeW5jVGFwKF94LCBfeDIpIHtcbiAgcmV0dXJuIF9hc3luY1RhcC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuXG5leHBvcnRzLl9fYXN5bmNUYXAgPSBfX2FzeW5jVGFwO1xuXG5mdW5jdGlvbiBfYXN5bmNUYXAoKSB7XG4gIF9hc3luY1RhcCA9IF93cmFwQXN5bmNHZW5lcmF0b3IoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3JSdW50aW1lLm1hcmsoZnVuY3Rpb24gX2NhbGxlZShzb3VyY2UsIGNhbGxiYWNrKSB7XG4gICAgdmFyIGMsIF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24sIF9kaWRJdGVyYXRvckVycm9yLCBfaXRlcmF0b3JFcnJvciwgX2l0ZXJhdG9yLCBfc3RlcCwgX3ZhbHVlLCB2YWx1ZTtcblxuICAgIHJldHVybiBfcmVnZW5lcmF0b3JSdW50aW1lLndyYXAoZnVuY3Rpb24gX2NhbGxlZSQoX2NvbnRleHQpIHtcbiAgICAgIHdoaWxlICgxKSB7XG4gICAgICAgIHN3aXRjaCAoX2NvbnRleHQucHJldiA9IF9jb250ZXh0Lm5leHQpIHtcbiAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICBjID0gMDtcbiAgICAgICAgICAgIF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24gPSB0cnVlO1xuICAgICAgICAgICAgX2RpZEl0ZXJhdG9yRXJyb3IgPSBmYWxzZTtcbiAgICAgICAgICAgIF9jb250ZXh0LnByZXYgPSAzO1xuICAgICAgICAgICAgX2l0ZXJhdG9yID0gX2FzeW5jSXRlcmF0b3Ioc291cmNlKTtcblxuICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSA3O1xuICAgICAgICAgICAgcmV0dXJuIF9hd2FpdEFzeW5jR2VuZXJhdG9yKF9pdGVyYXRvci5uZXh0KCkpO1xuXG4gICAgICAgICAgY2FzZSA3OlxuICAgICAgICAgICAgX3N0ZXAgPSBfY29udGV4dC5zZW50O1xuICAgICAgICAgICAgX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbiA9IF9zdGVwLmRvbmU7XG4gICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMTE7XG4gICAgICAgICAgICByZXR1cm4gX2F3YWl0QXN5bmNHZW5lcmF0b3IoX3N0ZXAudmFsdWUpO1xuXG4gICAgICAgICAgY2FzZSAxMTpcbiAgICAgICAgICAgIF92YWx1ZSA9IF9jb250ZXh0LnNlbnQ7XG5cbiAgICAgICAgICAgIGlmIChfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uKSB7XG4gICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAyMDtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhbHVlID0gX3ZhbHVlO1xuICAgICAgICAgICAgY2FsbGJhY2sodmFsdWUsIGMrKyk7XG4gICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMTc7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG5cbiAgICAgICAgICBjYXNlIDE3OlxuICAgICAgICAgICAgX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbiA9IHRydWU7XG4gICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gNTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSAyMDpcbiAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAyNjtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSAyMjpcbiAgICAgICAgICAgIF9jb250ZXh0LnByZXYgPSAyMjtcbiAgICAgICAgICAgIF9jb250ZXh0LnQwID0gX2NvbnRleHRbXCJjYXRjaFwiXSgzKTtcbiAgICAgICAgICAgIF9kaWRJdGVyYXRvckVycm9yID0gdHJ1ZTtcbiAgICAgICAgICAgIF9pdGVyYXRvckVycm9yID0gX2NvbnRleHQudDA7XG5cbiAgICAgICAgICBjYXNlIDI2OlxuICAgICAgICAgICAgX2NvbnRleHQucHJldiA9IDI2O1xuICAgICAgICAgICAgX2NvbnRleHQucHJldiA9IDI3O1xuXG4gICAgICAgICAgICBpZiAoISghX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbiAmJiBfaXRlcmF0b3JbXCJyZXR1cm5cIl0gIT0gbnVsbCkpIHtcbiAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDMxO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDMxO1xuICAgICAgICAgICAgcmV0dXJuIF9hd2FpdEFzeW5jR2VuZXJhdG9yKF9pdGVyYXRvcltcInJldHVyblwiXSgpKTtcblxuICAgICAgICAgIGNhc2UgMzE6XG4gICAgICAgICAgICBfY29udGV4dC5wcmV2ID0gMzE7XG5cbiAgICAgICAgICAgIGlmICghX2RpZEl0ZXJhdG9yRXJyb3IpIHtcbiAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDM0O1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhyb3cgX2l0ZXJhdG9yRXJyb3I7XG5cbiAgICAgICAgICBjYXNlIDM0OlxuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LmZpbmlzaCgzMSk7XG5cbiAgICAgICAgICBjYXNlIDM1OlxuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LmZpbmlzaCgyNik7XG5cbiAgICAgICAgICBjYXNlIDM2OlxuICAgICAgICAgIGNhc2UgXCJlbmRcIjpcbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5zdG9wKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCBfY2FsbGVlLCBudWxsLCBbWzMsIDIyLCAyNiwgMzZdLCBbMjcsLCAzMSwgMzVdXSk7XG4gIH0pKTtcbiAgcmV0dXJuIF9hc3luY1RhcC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuXG52YXIgYXN5bmNUYXAgPSAvKiNfX1BVUkVfXyovYXN5bmNJdGVyYWJsZUN1cnJ5KF9fYXN5bmNUYXApO1xuZXhwb3J0cy5hc3luY1RhcCA9IGFzeW5jVGFwOyIsInZhciBfcmVnZW5lcmF0b3JSdW50aW1lID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL3JlZ2VuZXJhdG9yXCIpO1xuXG52YXIgX21hcmtlZCA9IC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3JSdW50aW1lLm1hcmsoX190YXApO1xuXG5mdW5jdGlvbiBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihvLCBhbGxvd0FycmF5TGlrZSkgeyB2YXIgaXQ7IGlmICh0eXBlb2YgU3ltYm9sID09PSBcInVuZGVmaW5lZFwiIHx8IG9bU3ltYm9sLml0ZXJhdG9yXSA9PSBudWxsKSB7IGlmIChBcnJheS5pc0FycmF5KG8pIHx8IChpdCA9IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvKSkgfHwgYWxsb3dBcnJheUxpa2UgJiYgbyAmJiB0eXBlb2Ygby5sZW5ndGggPT09IFwibnVtYmVyXCIpIHsgaWYgKGl0KSBvID0gaXQ7IHZhciBpID0gMDsgdmFyIEYgPSBmdW5jdGlvbiBGKCkge307IHJldHVybiB7IHM6IEYsIG46IGZ1bmN0aW9uIG4oKSB7IGlmIChpID49IG8ubGVuZ3RoKSByZXR1cm4geyBkb25lOiB0cnVlIH07IHJldHVybiB7IGRvbmU6IGZhbHNlLCB2YWx1ZTogb1tpKytdIH07IH0sIGU6IGZ1bmN0aW9uIGUoX2UpIHsgdGhyb3cgX2U7IH0sIGY6IEYgfTsgfSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIGl0ZXJhdGUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIik7IH0gdmFyIG5vcm1hbENvbXBsZXRpb24gPSB0cnVlLCBkaWRFcnIgPSBmYWxzZSwgZXJyOyByZXR1cm4geyBzOiBmdW5jdGlvbiBzKCkgeyBpdCA9IG9bU3ltYm9sLml0ZXJhdG9yXSgpOyB9LCBuOiBmdW5jdGlvbiBuKCkgeyB2YXIgc3RlcCA9IGl0Lm5leHQoKTsgbm9ybWFsQ29tcGxldGlvbiA9IHN0ZXAuZG9uZTsgcmV0dXJuIHN0ZXA7IH0sIGU6IGZ1bmN0aW9uIGUoX2UyKSB7IGRpZEVyciA9IHRydWU7IGVyciA9IF9lMjsgfSwgZjogZnVuY3Rpb24gZigpIHsgdHJ5IHsgaWYgKCFub3JtYWxDb21wbGV0aW9uICYmIGl0W1wicmV0dXJuXCJdICE9IG51bGwpIGl0W1wicmV0dXJuXCJdKCk7IH0gZmluYWxseSB7IGlmIChkaWRFcnIpIHRocm93IGVycjsgfSB9IH07IH1cblxuZnVuY3Rpb24gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8sIG1pbkxlbikgeyBpZiAoIW8pIHJldHVybjsgaWYgKHR5cGVvZiBvID09PSBcInN0cmluZ1wiKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTsgdmFyIG4gPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykuc2xpY2UoOCwgLTEpOyBpZiAobiA9PT0gXCJPYmplY3RcIiAmJiBvLmNvbnN0cnVjdG9yKSBuID0gby5jb25zdHJ1Y3Rvci5uYW1lOyBpZiAobiA9PT0gXCJNYXBcIiB8fCBuID09PSBcIlNldFwiKSByZXR1cm4gQXJyYXkuZnJvbShvKTsgaWYgKG4gPT09IFwiQXJndW1lbnRzXCIgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QobikpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pOyB9XG5cbmZ1bmN0aW9uIF9hcnJheUxpa2VUb0FycmF5KGFyciwgbGVuKSB7IGlmIChsZW4gPT0gbnVsbCB8fCBsZW4gPiBhcnIubGVuZ3RoKSBsZW4gPSBhcnIubGVuZ3RoOyBmb3IgKHZhciBpID0gMCwgYXJyMiA9IG5ldyBBcnJheShsZW4pOyBpIDwgbGVuOyBpKyspIHsgYXJyMltpXSA9IGFycltpXTsgfSByZXR1cm4gYXJyMjsgfVxuXG52YXIgX3JlcXVpcmUgPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbC9pdGVyYWJsZS5qcycpLFxuICAgIGl0ZXJhYmxlQ3VycnkgPSBfcmVxdWlyZS5pdGVyYWJsZUN1cnJ5O1xuXG5mdW5jdGlvbiBfX3RhcChzb3VyY2UsIGNhbGxiYWNrKSB7XG4gIHZhciBjLCBfaXRlcmF0b3IsIF9zdGVwLCB2YWx1ZTtcblxuICByZXR1cm4gX3JlZ2VuZXJhdG9yUnVudGltZS53cmFwKGZ1bmN0aW9uIF9fdGFwJChfY29udGV4dCkge1xuICAgIHdoaWxlICgxKSB7XG4gICAgICBzd2l0Y2ggKF9jb250ZXh0LnByZXYgPSBfY29udGV4dC5uZXh0KSB7XG4gICAgICAgIGNhc2UgMDpcbiAgICAgICAgICBjID0gMDtcbiAgICAgICAgICBfaXRlcmF0b3IgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihzb3VyY2UpO1xuICAgICAgICAgIF9jb250ZXh0LnByZXYgPSAyO1xuXG4gICAgICAgICAgX2l0ZXJhdG9yLnMoKTtcblxuICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgaWYgKChfc3RlcCA9IF9pdGVyYXRvci5uKCkpLmRvbmUpIHtcbiAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAxMTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhbHVlID0gX3N0ZXAudmFsdWU7XG4gICAgICAgICAgY2FsbGJhY2sodmFsdWUsIGMrKyk7XG4gICAgICAgICAgX2NvbnRleHQubmV4dCA9IDk7XG4gICAgICAgICAgcmV0dXJuIHZhbHVlO1xuXG4gICAgICAgIGNhc2UgOTpcbiAgICAgICAgICBfY29udGV4dC5uZXh0ID0gNDtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIDExOlxuICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAxNjtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIDEzOlxuICAgICAgICAgIF9jb250ZXh0LnByZXYgPSAxMztcbiAgICAgICAgICBfY29udGV4dC50MCA9IF9jb250ZXh0W1wiY2F0Y2hcIl0oMik7XG5cbiAgICAgICAgICBfaXRlcmF0b3IuZShfY29udGV4dC50MCk7XG5cbiAgICAgICAgY2FzZSAxNjpcbiAgICAgICAgICBfY29udGV4dC5wcmV2ID0gMTY7XG5cbiAgICAgICAgICBfaXRlcmF0b3IuZigpO1xuXG4gICAgICAgICAgcmV0dXJuIF9jb250ZXh0LmZpbmlzaCgxNik7XG5cbiAgICAgICAgY2FzZSAxOTpcbiAgICAgICAgY2FzZSBcImVuZFwiOlxuICAgICAgICAgIHJldHVybiBfY29udGV4dC5zdG9wKCk7XG4gICAgICB9XG4gICAgfVxuICB9LCBfbWFya2VkLCBudWxsLCBbWzIsIDEzLCAxNiwgMTldXSk7XG59XG5cbmV4cG9ydHMuX190YXAgPSBfX3RhcDtcbnZhciB0YXAgPSAvKiNfX1BVUkVfXyovaXRlcmFibGVDdXJyeShfX3RhcCk7XG5leHBvcnRzLnRhcCA9IHRhcDsiLCJ2YXIgX3JlZ2VuZXJhdG9yUnVudGltZSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9yZWdlbmVyYXRvclwiKTtcblxudmFyIF9hc3luY1RvR2VuZXJhdG9yID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvYXN5bmNUb0dlbmVyYXRvclwiKTtcblxudmFyIF9hc3luY0l0ZXJhdG9yID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvYXN5bmNJdGVyYXRvclwiKTtcblxudmFyIF9yZXF1aXJlID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWwvYXN5bmMtaXRlcmFibGUuanMnKSxcbiAgICBhc3luY0Vuc3VyZUl0ZXJhYmxlID0gX3JlcXVpcmUuYXN5bmNFbnN1cmVJdGVyYWJsZTtcblxuZnVuY3Rpb24gX19hc3luY1RvQXJyYXkoX3gpIHtcbiAgcmV0dXJuIF9hc3luY1RvQXJyYXkuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cblxuZnVuY3Rpb24gX2FzeW5jVG9BcnJheSgpIHtcbiAgX2FzeW5jVG9BcnJheSA9IF9hc3luY1RvR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yUnVudGltZS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUoc291cmNlKSB7XG4gICAgdmFyIG91dCwgX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbiwgX2RpZEl0ZXJhdG9yRXJyb3IsIF9pdGVyYXRvckVycm9yLCBfaXRlcmF0b3IsIF9zdGVwLCBfdmFsdWUsIHZhbHVlO1xuXG4gICAgcmV0dXJuIF9yZWdlbmVyYXRvclJ1bnRpbWUud3JhcChmdW5jdGlvbiBfY2FsbGVlJChfY29udGV4dCkge1xuICAgICAgd2hpbGUgKDEpIHtcbiAgICAgICAgc3dpdGNoIChfY29udGV4dC5wcmV2ID0gX2NvbnRleHQubmV4dCkge1xuICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgIG91dCA9IFtdO1xuICAgICAgICAgICAgX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbiA9IHRydWU7XG4gICAgICAgICAgICBfZGlkSXRlcmF0b3JFcnJvciA9IGZhbHNlO1xuICAgICAgICAgICAgX2NvbnRleHQucHJldiA9IDM7XG4gICAgICAgICAgICBfaXRlcmF0b3IgPSBfYXN5bmNJdGVyYXRvcihzb3VyY2UpO1xuXG4gICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDc7XG4gICAgICAgICAgICByZXR1cm4gX2l0ZXJhdG9yLm5leHQoKTtcblxuICAgICAgICAgIGNhc2UgNzpcbiAgICAgICAgICAgIF9zdGVwID0gX2NvbnRleHQuc2VudDtcbiAgICAgICAgICAgIF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24gPSBfc3RlcC5kb25lO1xuICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDExO1xuICAgICAgICAgICAgcmV0dXJuIF9zdGVwLnZhbHVlO1xuXG4gICAgICAgICAgY2FzZSAxMTpcbiAgICAgICAgICAgIF92YWx1ZSA9IF9jb250ZXh0LnNlbnQ7XG5cbiAgICAgICAgICAgIGlmIChfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uKSB7XG4gICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAxODtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhbHVlID0gX3ZhbHVlO1xuICAgICAgICAgICAgb3V0LnB1c2godmFsdWUpO1xuXG4gICAgICAgICAgY2FzZSAxNTpcbiAgICAgICAgICAgIF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24gPSB0cnVlO1xuICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDU7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgMTg6XG4gICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMjQ7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgMjA6XG4gICAgICAgICAgICBfY29udGV4dC5wcmV2ID0gMjA7XG4gICAgICAgICAgICBfY29udGV4dC50MCA9IF9jb250ZXh0W1wiY2F0Y2hcIl0oMyk7XG4gICAgICAgICAgICBfZGlkSXRlcmF0b3JFcnJvciA9IHRydWU7XG4gICAgICAgICAgICBfaXRlcmF0b3JFcnJvciA9IF9jb250ZXh0LnQwO1xuXG4gICAgICAgICAgY2FzZSAyNDpcbiAgICAgICAgICAgIF9jb250ZXh0LnByZXYgPSAyNDtcbiAgICAgICAgICAgIF9jb250ZXh0LnByZXYgPSAyNTtcblxuICAgICAgICAgICAgaWYgKCEoIV9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24gJiYgX2l0ZXJhdG9yW1wicmV0dXJuXCJdICE9IG51bGwpKSB7XG4gICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAyOTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAyOTtcbiAgICAgICAgICAgIHJldHVybiBfaXRlcmF0b3JbXCJyZXR1cm5cIl0oKTtcblxuICAgICAgICAgIGNhc2UgMjk6XG4gICAgICAgICAgICBfY29udGV4dC5wcmV2ID0gMjk7XG5cbiAgICAgICAgICAgIGlmICghX2RpZEl0ZXJhdG9yRXJyb3IpIHtcbiAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDMyO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhyb3cgX2l0ZXJhdG9yRXJyb3I7XG5cbiAgICAgICAgICBjYXNlIDMyOlxuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LmZpbmlzaCgyOSk7XG5cbiAgICAgICAgICBjYXNlIDMzOlxuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LmZpbmlzaCgyNCk7XG5cbiAgICAgICAgICBjYXNlIDM0OlxuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LmFicnVwdChcInJldHVyblwiLCBvdXQpO1xuXG4gICAgICAgICAgY2FzZSAzNTpcbiAgICAgICAgICBjYXNlIFwiZW5kXCI6XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuc3RvcCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwgX2NhbGxlZSwgbnVsbCwgW1szLCAyMCwgMjQsIDM0XSwgWzI1LCwgMjksIDMzXV0pO1xuICB9KSk7XG4gIHJldHVybiBfYXN5bmNUb0FycmF5LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5cbmV4cG9ydHMuX19hc3luY1RvQXJyYXkgPSBfX2FzeW5jVG9BcnJheTtcblxuZnVuY3Rpb24gYXN5bmNUb0FycmF5KHNvdXJjZSkge1xuICByZXR1cm4gX19hc3luY1RvQXJyYXkoYXN5bmNFbnN1cmVJdGVyYWJsZShzb3VyY2UpKTtcbn1cblxuZXhwb3J0cy5hc3luY1RvQXJyYXkgPSBhc3luY1RvQXJyYXk7IiwiZnVuY3Rpb24gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIobywgYWxsb3dBcnJheUxpa2UpIHsgdmFyIGl0OyBpZiAodHlwZW9mIFN5bWJvbCA9PT0gXCJ1bmRlZmluZWRcIiB8fCBvW1N5bWJvbC5pdGVyYXRvcl0gPT0gbnVsbCkgeyBpZiAoQXJyYXkuaXNBcnJheShvKSB8fCAoaXQgPSBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkobykpIHx8IGFsbG93QXJyYXlMaWtlICYmIG8gJiYgdHlwZW9mIG8ubGVuZ3RoID09PSBcIm51bWJlclwiKSB7IGlmIChpdCkgbyA9IGl0OyB2YXIgaSA9IDA7IHZhciBGID0gZnVuY3Rpb24gRigpIHt9OyByZXR1cm4geyBzOiBGLCBuOiBmdW5jdGlvbiBuKCkgeyBpZiAoaSA+PSBvLmxlbmd0aCkgcmV0dXJuIHsgZG9uZTogdHJ1ZSB9OyByZXR1cm4geyBkb25lOiBmYWxzZSwgdmFsdWU6IG9baSsrXSB9OyB9LCBlOiBmdW5jdGlvbiBlKF9lKSB7IHRocm93IF9lOyB9LCBmOiBGIH07IH0gdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBpdGVyYXRlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpOyB9IHZhciBub3JtYWxDb21wbGV0aW9uID0gdHJ1ZSwgZGlkRXJyID0gZmFsc2UsIGVycjsgcmV0dXJuIHsgczogZnVuY3Rpb24gcygpIHsgaXQgPSBvW1N5bWJvbC5pdGVyYXRvcl0oKTsgfSwgbjogZnVuY3Rpb24gbigpIHsgdmFyIHN0ZXAgPSBpdC5uZXh0KCk7IG5vcm1hbENvbXBsZXRpb24gPSBzdGVwLmRvbmU7IHJldHVybiBzdGVwOyB9LCBlOiBmdW5jdGlvbiBlKF9lMikgeyBkaWRFcnIgPSB0cnVlOyBlcnIgPSBfZTI7IH0sIGY6IGZ1bmN0aW9uIGYoKSB7IHRyeSB7IGlmICghbm9ybWFsQ29tcGxldGlvbiAmJiBpdFtcInJldHVyblwiXSAhPSBudWxsKSBpdFtcInJldHVyblwiXSgpOyB9IGZpbmFsbHkgeyBpZiAoZGlkRXJyKSB0aHJvdyBlcnI7IH0gfSB9OyB9XG5cbmZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvLCBtaW5MZW4pIHsgaWYgKCFvKSByZXR1cm47IGlmICh0eXBlb2YgbyA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IHZhciBuID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pLnNsaWNlKDgsIC0xKTsgaWYgKG4gPT09IFwiT2JqZWN0XCIgJiYgby5jb25zdHJ1Y3RvcikgbiA9IG8uY29uc3RydWN0b3IubmFtZTsgaWYgKG4gPT09IFwiTWFwXCIgfHwgbiA9PT0gXCJTZXRcIikgcmV0dXJuIEFycmF5LmZyb20obyk7IGlmIChuID09PSBcIkFyZ3VtZW50c1wiIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTsgfVxuXG5mdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheShhcnIsIGxlbikgeyBpZiAobGVuID09IG51bGwgfHwgbGVuID4gYXJyLmxlbmd0aCkgbGVuID0gYXJyLmxlbmd0aDsgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkobGVuKTsgaSA8IGxlbjsgaSsrKSB7IGFycjJbaV0gPSBhcnJbaV07IH0gcmV0dXJuIGFycjI7IH1cblxudmFyIF9yZXF1aXJlID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWwvaXRlcmFibGUuanMnKSxcbiAgICBlbnN1cmVJdGVyYWJsZSA9IF9yZXF1aXJlLmVuc3VyZUl0ZXJhYmxlO1xuXG5mdW5jdGlvbiBfX3RvQXJyYXkoc291cmNlKSB7XG4gIHZhciBvdXQgPSBbXTtcblxuICB2YXIgX2l0ZXJhdG9yID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIoc291cmNlKSxcbiAgICAgIF9zdGVwO1xuXG4gIHRyeSB7XG4gICAgZm9yIChfaXRlcmF0b3IucygpOyAhKF9zdGVwID0gX2l0ZXJhdG9yLm4oKSkuZG9uZTspIHtcbiAgICAgIHZhciB2YWx1ZSA9IF9zdGVwLnZhbHVlO1xuICAgICAgb3V0LnB1c2godmFsdWUpO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgX2l0ZXJhdG9yLmUoZXJyKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBfaXRlcmF0b3IuZigpO1xuICB9XG5cbiAgcmV0dXJuIG91dDtcbn1cblxuZXhwb3J0cy5fX3RvQXJyYXkgPSBfX3RvQXJyYXk7XG5cbmZ1bmN0aW9uIHRvQXJyYXkoc291cmNlKSB7XG4gIHJldHVybiBfX3RvQXJyYXkoZW5zdXJlSXRlcmFibGUoc291cmNlKSk7XG59XG5cbmV4cG9ydHMudG9BcnJheSA9IHRvQXJyYXk7IiwidmFyIF9yZWdlbmVyYXRvclJ1bnRpbWUgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvcmVnZW5lcmF0b3JcIik7XG5cbnZhciBfc2xpY2VkVG9BcnJheSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3NsaWNlZFRvQXJyYXlcIik7XG5cbnZhciBfYXN5bmNUb0dlbmVyYXRvciA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2FzeW5jVG9HZW5lcmF0b3JcIik7XG5cbnZhciBfYXN5bmNJdGVyYXRvciA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2FzeW5jSXRlcmF0b3JcIik7XG5cbnZhciBfcmVxdWlyZSA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFsL2FzeW5jLWl0ZXJhYmxlLmpzJyksXG4gICAgYXN5bmNFbnN1cmVJdGVyYWJsZSA9IF9yZXF1aXJlLmFzeW5jRW5zdXJlSXRlcmFibGU7XG5cbmZ1bmN0aW9uIF9fYXN5bmNUb09iamVjdChfeCkge1xuICByZXR1cm4gX2FzeW5jVG9PYmplY3QuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cblxuZnVuY3Rpb24gX2FzeW5jVG9PYmplY3QoKSB7XG4gIF9hc3luY1RvT2JqZWN0ID0gX2FzeW5jVG9HZW5lcmF0b3IoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3JSdW50aW1lLm1hcmsoZnVuY3Rpb24gX2NhbGxlZShpdGVyYWJsZSkge1xuICAgIHZhciBwcm90byxcbiAgICAgICAgb2JqLFxuICAgICAgICBfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uLFxuICAgICAgICBfZGlkSXRlcmF0b3JFcnJvcixcbiAgICAgICAgX2l0ZXJhdG9yRXJyb3IsXG4gICAgICAgIF9pdGVyYXRvcixcbiAgICAgICAgX3N0ZXAsXG4gICAgICAgIF92YWx1ZSxcbiAgICAgICAgX3ZhbHVlMixcbiAgICAgICAgX3ZhbHVlMyxcbiAgICAgICAga2V5LFxuICAgICAgICB2YWx1ZSxcbiAgICAgICAgX2FyZ3MgPSBhcmd1bWVudHM7XG5cbiAgICByZXR1cm4gX3JlZ2VuZXJhdG9yUnVudGltZS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUkKF9jb250ZXh0KSB7XG4gICAgICB3aGlsZSAoMSkge1xuICAgICAgICBzd2l0Y2ggKF9jb250ZXh0LnByZXYgPSBfY29udGV4dC5uZXh0KSB7XG4gICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgcHJvdG8gPSBfYXJncy5sZW5ndGggPiAxICYmIF9hcmdzWzFdICE9PSB1bmRlZmluZWQgPyBfYXJnc1sxXSA6IE9iamVjdC5wcm90b3R5cGU7XG4gICAgICAgICAgICBvYmogPSBPYmplY3QuY3JlYXRlKHByb3RvKTtcbiAgICAgICAgICAgIF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24gPSB0cnVlO1xuICAgICAgICAgICAgX2RpZEl0ZXJhdG9yRXJyb3IgPSBmYWxzZTtcbiAgICAgICAgICAgIF9jb250ZXh0LnByZXYgPSA0O1xuICAgICAgICAgICAgX2l0ZXJhdG9yID0gX2FzeW5jSXRlcmF0b3IoaXRlcmFibGUpO1xuXG4gICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDg7XG4gICAgICAgICAgICByZXR1cm4gX2l0ZXJhdG9yLm5leHQoKTtcblxuICAgICAgICAgIGNhc2UgODpcbiAgICAgICAgICAgIF9zdGVwID0gX2NvbnRleHQuc2VudDtcbiAgICAgICAgICAgIF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24gPSBfc3RlcC5kb25lO1xuICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDEyO1xuICAgICAgICAgICAgcmV0dXJuIF9zdGVwLnZhbHVlO1xuXG4gICAgICAgICAgY2FzZSAxMjpcbiAgICAgICAgICAgIF92YWx1ZSA9IF9jb250ZXh0LnNlbnQ7XG5cbiAgICAgICAgICAgIGlmIChfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uKSB7XG4gICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAxOTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIF92YWx1ZTIgPSBfdmFsdWUsIF92YWx1ZTMgPSBfc2xpY2VkVG9BcnJheShfdmFsdWUyLCAyKSwga2V5ID0gX3ZhbHVlM1swXSwgdmFsdWUgPSBfdmFsdWUzWzFdO1xuICAgICAgICAgICAgb2JqW2tleV0gPSB2YWx1ZTtcblxuICAgICAgICAgIGNhc2UgMTY6XG4gICAgICAgICAgICBfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uID0gdHJ1ZTtcbiAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSA2O1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlIDE5OlxuICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDI1O1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlIDIxOlxuICAgICAgICAgICAgX2NvbnRleHQucHJldiA9IDIxO1xuICAgICAgICAgICAgX2NvbnRleHQudDAgPSBfY29udGV4dFtcImNhdGNoXCJdKDQpO1xuICAgICAgICAgICAgX2RpZEl0ZXJhdG9yRXJyb3IgPSB0cnVlO1xuICAgICAgICAgICAgX2l0ZXJhdG9yRXJyb3IgPSBfY29udGV4dC50MDtcblxuICAgICAgICAgIGNhc2UgMjU6XG4gICAgICAgICAgICBfY29udGV4dC5wcmV2ID0gMjU7XG4gICAgICAgICAgICBfY29udGV4dC5wcmV2ID0gMjY7XG5cbiAgICAgICAgICAgIGlmICghKCFfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uICYmIF9pdGVyYXRvcltcInJldHVyblwiXSAhPSBudWxsKSkge1xuICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMzA7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMzA7XG4gICAgICAgICAgICByZXR1cm4gX2l0ZXJhdG9yW1wicmV0dXJuXCJdKCk7XG5cbiAgICAgICAgICBjYXNlIDMwOlxuICAgICAgICAgICAgX2NvbnRleHQucHJldiA9IDMwO1xuXG4gICAgICAgICAgICBpZiAoIV9kaWRJdGVyYXRvckVycm9yKSB7XG4gICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAzMztcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRocm93IF9pdGVyYXRvckVycm9yO1xuXG4gICAgICAgICAgY2FzZSAzMzpcbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5maW5pc2goMzApO1xuXG4gICAgICAgICAgY2FzZSAzNDpcbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5maW5pc2goMjUpO1xuXG4gICAgICAgICAgY2FzZSAzNTpcbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5hYnJ1cHQoXCJyZXR1cm5cIiwgb2JqKTtcblxuICAgICAgICAgIGNhc2UgMzY6XG4gICAgICAgICAgY2FzZSBcImVuZFwiOlxuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LnN0b3AoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sIF9jYWxsZWUsIG51bGwsIFtbNCwgMjEsIDI1LCAzNV0sIFsyNiwsIDMwLCAzNF1dKTtcbiAgfSkpO1xuICByZXR1cm4gX2FzeW5jVG9PYmplY3QuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cblxuZXhwb3J0cy5fX2FzeW5jVG9PYmplY3QgPSBfX2FzeW5jVG9PYmplY3Q7XG5cbmZ1bmN0aW9uIGFzeW5jVG9PYmplY3QoaXRlcmFibGUsIHByb3RvKSB7XG4gIHJldHVybiBfX2FzeW5jVG9PYmplY3QoYXN5bmNFbnN1cmVJdGVyYWJsZShpdGVyYWJsZSksIHByb3RvKTtcbn1cblxuZXhwb3J0cy5hc3luY1RvT2JqZWN0ID0gYXN5bmNUb09iamVjdDsiLCJ2YXIgX3NsaWNlZFRvQXJyYXkgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9zbGljZWRUb0FycmF5XCIpO1xuXG5mdW5jdGlvbiBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihvLCBhbGxvd0FycmF5TGlrZSkgeyB2YXIgaXQ7IGlmICh0eXBlb2YgU3ltYm9sID09PSBcInVuZGVmaW5lZFwiIHx8IG9bU3ltYm9sLml0ZXJhdG9yXSA9PSBudWxsKSB7IGlmIChBcnJheS5pc0FycmF5KG8pIHx8IChpdCA9IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvKSkgfHwgYWxsb3dBcnJheUxpa2UgJiYgbyAmJiB0eXBlb2Ygby5sZW5ndGggPT09IFwibnVtYmVyXCIpIHsgaWYgKGl0KSBvID0gaXQ7IHZhciBpID0gMDsgdmFyIEYgPSBmdW5jdGlvbiBGKCkge307IHJldHVybiB7IHM6IEYsIG46IGZ1bmN0aW9uIG4oKSB7IGlmIChpID49IG8ubGVuZ3RoKSByZXR1cm4geyBkb25lOiB0cnVlIH07IHJldHVybiB7IGRvbmU6IGZhbHNlLCB2YWx1ZTogb1tpKytdIH07IH0sIGU6IGZ1bmN0aW9uIGUoX2UpIHsgdGhyb3cgX2U7IH0sIGY6IEYgfTsgfSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIGl0ZXJhdGUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIik7IH0gdmFyIG5vcm1hbENvbXBsZXRpb24gPSB0cnVlLCBkaWRFcnIgPSBmYWxzZSwgZXJyOyByZXR1cm4geyBzOiBmdW5jdGlvbiBzKCkgeyBpdCA9IG9bU3ltYm9sLml0ZXJhdG9yXSgpOyB9LCBuOiBmdW5jdGlvbiBuKCkgeyB2YXIgc3RlcCA9IGl0Lm5leHQoKTsgbm9ybWFsQ29tcGxldGlvbiA9IHN0ZXAuZG9uZTsgcmV0dXJuIHN0ZXA7IH0sIGU6IGZ1bmN0aW9uIGUoX2UyKSB7IGRpZEVyciA9IHRydWU7IGVyciA9IF9lMjsgfSwgZjogZnVuY3Rpb24gZigpIHsgdHJ5IHsgaWYgKCFub3JtYWxDb21wbGV0aW9uICYmIGl0W1wicmV0dXJuXCJdICE9IG51bGwpIGl0W1wicmV0dXJuXCJdKCk7IH0gZmluYWxseSB7IGlmIChkaWRFcnIpIHRocm93IGVycjsgfSB9IH07IH1cblxuZnVuY3Rpb24gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8sIG1pbkxlbikgeyBpZiAoIW8pIHJldHVybjsgaWYgKHR5cGVvZiBvID09PSBcInN0cmluZ1wiKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTsgdmFyIG4gPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykuc2xpY2UoOCwgLTEpOyBpZiAobiA9PT0gXCJPYmplY3RcIiAmJiBvLmNvbnN0cnVjdG9yKSBuID0gby5jb25zdHJ1Y3Rvci5uYW1lOyBpZiAobiA9PT0gXCJNYXBcIiB8fCBuID09PSBcIlNldFwiKSByZXR1cm4gQXJyYXkuZnJvbShvKTsgaWYgKG4gPT09IFwiQXJndW1lbnRzXCIgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QobikpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pOyB9XG5cbmZ1bmN0aW9uIF9hcnJheUxpa2VUb0FycmF5KGFyciwgbGVuKSB7IGlmIChsZW4gPT0gbnVsbCB8fCBsZW4gPiBhcnIubGVuZ3RoKSBsZW4gPSBhcnIubGVuZ3RoOyBmb3IgKHZhciBpID0gMCwgYXJyMiA9IG5ldyBBcnJheShsZW4pOyBpIDwgbGVuOyBpKyspIHsgYXJyMltpXSA9IGFycltpXTsgfSByZXR1cm4gYXJyMjsgfVxuXG52YXIgX3JlcXVpcmUgPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbC9pdGVyYWJsZS5qcycpLFxuICAgIGVuc3VyZUl0ZXJhYmxlID0gX3JlcXVpcmUuZW5zdXJlSXRlcmFibGU7XG5cbmZ1bmN0aW9uIF9fdG9PYmplY3QoaXRlcmFibGUpIHtcbiAgdmFyIHByb3RvID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBPYmplY3QucHJvdG90eXBlO1xuICB2YXIgb2JqID0gT2JqZWN0LmNyZWF0ZShwcm90byk7XG5cbiAgdmFyIF9pdGVyYXRvciA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKGl0ZXJhYmxlKSxcbiAgICAgIF9zdGVwO1xuXG4gIHRyeSB7XG4gICAgZm9yIChfaXRlcmF0b3IucygpOyAhKF9zdGVwID0gX2l0ZXJhdG9yLm4oKSkuZG9uZTspIHtcbiAgICAgIHZhciBfc3RlcCR2YWx1ZSA9IF9zbGljZWRUb0FycmF5KF9zdGVwLnZhbHVlLCAyKSxcbiAgICAgICAgICBrZXkgPSBfc3RlcCR2YWx1ZVswXSxcbiAgICAgICAgICB2YWx1ZSA9IF9zdGVwJHZhbHVlWzFdO1xuXG4gICAgICBvYmpba2V5XSA9IHZhbHVlO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgX2l0ZXJhdG9yLmUoZXJyKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBfaXRlcmF0b3IuZigpO1xuICB9XG5cbiAgcmV0dXJuIG9iajtcbn1cblxuZXhwb3J0cy5fX3RvT2JqZWN0ID0gX190b09iamVjdDtcblxuZnVuY3Rpb24gdG9PYmplY3QoaXRlcmFibGUsIHByb3RvKSB7XG4gIHJldHVybiBfX3RvT2JqZWN0KGVuc3VyZUl0ZXJhYmxlKGl0ZXJhYmxlKSwgcHJvdG8pO1xufVxuXG5leHBvcnRzLnRvT2JqZWN0ID0gdG9PYmplY3Q7IiwidmFyIF9yZWdlbmVyYXRvclJ1bnRpbWUgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvcmVnZW5lcmF0b3JcIik7XG5cbnZhciBfYXdhaXRBc3luY0dlbmVyYXRvciA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2F3YWl0QXN5bmNHZW5lcmF0b3JcIik7XG5cbnZhciBfd3JhcEFzeW5jR2VuZXJhdG9yID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvd3JhcEFzeW5jR2VuZXJhdG9yXCIpO1xuXG52YXIgX2FzeW5jSXRlcmF0b3IgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9hc3luY0l0ZXJhdG9yXCIpO1xuXG52YXIgX3JlcXVpcmUgPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbC9hc3luYy1pdGVyYWJsZS5qcycpLFxuICAgIGFzeW5jSXRlcmFibGVDdXJyeSA9IF9yZXF1aXJlLmFzeW5jSXRlcmFibGVDdXJyeTtcblxudmFyIF9yZXF1aXJlMiA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFsL2NpcmN1bGFyLWJ1ZmZlci5qcycpLFxuICAgIENpcmN1bGFyQnVmZmVyID0gX3JlcXVpcmUyLkNpcmN1bGFyQnVmZmVyLFxuICAgIFJlYWRPbmx5Q2lyY3VsYXJCdWZmZXIgPSBfcmVxdWlyZTIuUmVhZE9ubHlDaXJjdWxhckJ1ZmZlcjtcblxuZnVuY3Rpb24gX19hc3luY1dpbmRvd0FoZWFkKF94LCBfeDIpIHtcbiAgcmV0dXJuIF9hc3luY1dpbmRvd0FoZWFkLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5cbmV4cG9ydHMuX19hc3luY1dpbmRvd0FoZWFkID0gX19hc3luY1dpbmRvd0FoZWFkO1xuXG5mdW5jdGlvbiBfYXN5bmNXaW5kb3dBaGVhZCgpIHtcbiAgX2FzeW5jV2luZG93QWhlYWQgPSBfd3JhcEFzeW5jR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yUnVudGltZS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUoc291cmNlLCBzaXplKSB7XG4gICAgdmFyIF9yZWYsXG4gICAgICAgIF9yZWYkZmlsbGVyLFxuICAgICAgICBmaWxsZXIsXG4gICAgICAgIF9yZWYkdXNlRmlsbGVyLFxuICAgICAgICB1c2VGaWxsZXIsXG4gICAgICAgIGJ1ZmZlcixcbiAgICAgICAgYnVmZmVyUmVhZFByb3h5LFxuICAgICAgICBsZW4sXG4gICAgICAgIF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24sXG4gICAgICAgIF9kaWRJdGVyYXRvckVycm9yLFxuICAgICAgICBfaXRlcmF0b3JFcnJvcixcbiAgICAgICAgX2l0ZXJhdG9yLFxuICAgICAgICBfc3RlcCxcbiAgICAgICAgX3ZhbHVlLFxuICAgICAgICB2YWx1ZSxcbiAgICAgICAgaSxcbiAgICAgICAgX2ksXG4gICAgICAgIF9hcmdzID0gYXJndW1lbnRzO1xuXG4gICAgcmV0dXJuIF9yZWdlbmVyYXRvclJ1bnRpbWUud3JhcChmdW5jdGlvbiBfY2FsbGVlJChfY29udGV4dCkge1xuICAgICAgd2hpbGUgKDEpIHtcbiAgICAgICAgc3dpdGNoIChfY29udGV4dC5wcmV2ID0gX2NvbnRleHQubmV4dCkge1xuICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgIF9yZWYgPSBfYXJncy5sZW5ndGggPiAyICYmIF9hcmdzWzJdICE9PSB1bmRlZmluZWQgPyBfYXJnc1syXSA6IHt9LCBfcmVmJGZpbGxlciA9IF9yZWYuZmlsbGVyLCBmaWxsZXIgPSBfcmVmJGZpbGxlciA9PT0gdm9pZCAwID8gdW5kZWZpbmVkIDogX3JlZiRmaWxsZXIsIF9yZWYkdXNlRmlsbGVyID0gX3JlZi51c2VGaWxsZXIsIHVzZUZpbGxlciA9IF9yZWYkdXNlRmlsbGVyID09PSB2b2lkIDAgPyB0cnVlIDogX3JlZiR1c2VGaWxsZXI7XG4gICAgICAgICAgICBidWZmZXIgPSBuZXcgQ2lyY3VsYXJCdWZmZXIoc2l6ZSk7XG4gICAgICAgICAgICBidWZmZXJSZWFkUHJveHkgPSBuZXcgUmVhZE9ubHlDaXJjdWxhckJ1ZmZlcihidWZmZXIpO1xuICAgICAgICAgICAgbGVuID0gMDtcbiAgICAgICAgICAgIF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24gPSB0cnVlO1xuICAgICAgICAgICAgX2RpZEl0ZXJhdG9yRXJyb3IgPSBmYWxzZTtcbiAgICAgICAgICAgIF9jb250ZXh0LnByZXYgPSA2O1xuICAgICAgICAgICAgX2l0ZXJhdG9yID0gX2FzeW5jSXRlcmF0b3Ioc291cmNlKTtcblxuICAgICAgICAgIGNhc2UgODpcbiAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAxMDtcbiAgICAgICAgICAgIHJldHVybiBfYXdhaXRBc3luY0dlbmVyYXRvcihfaXRlcmF0b3IubmV4dCgpKTtcblxuICAgICAgICAgIGNhc2UgMTA6XG4gICAgICAgICAgICBfc3RlcCA9IF9jb250ZXh0LnNlbnQ7XG4gICAgICAgICAgICBfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uID0gX3N0ZXAuZG9uZTtcbiAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAxNDtcbiAgICAgICAgICAgIHJldHVybiBfYXdhaXRBc3luY0dlbmVyYXRvcihfc3RlcC52YWx1ZSk7XG5cbiAgICAgICAgICBjYXNlIDE0OlxuICAgICAgICAgICAgX3ZhbHVlID0gX2NvbnRleHQuc2VudDtcblxuICAgICAgICAgICAgaWYgKF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24pIHtcbiAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDI1O1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFsdWUgPSBfdmFsdWU7XG4gICAgICAgICAgICBidWZmZXIucHVzaCh2YWx1ZSk7XG5cbiAgICAgICAgICAgIGlmICghYnVmZmVyLmlzRnVsbCgpKSB7XG4gICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAyMTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAyMTtcbiAgICAgICAgICAgIHJldHVybiBidWZmZXJSZWFkUHJveHk7XG5cbiAgICAgICAgICBjYXNlIDIxOlxuICAgICAgICAgICAgbGVuKys7XG5cbiAgICAgICAgICBjYXNlIDIyOlxuICAgICAgICAgICAgX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbiA9IHRydWU7XG4gICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gODtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSAyNTpcbiAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAzMTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSAyNzpcbiAgICAgICAgICAgIF9jb250ZXh0LnByZXYgPSAyNztcbiAgICAgICAgICAgIF9jb250ZXh0LnQwID0gX2NvbnRleHRbXCJjYXRjaFwiXSg2KTtcbiAgICAgICAgICAgIF9kaWRJdGVyYXRvckVycm9yID0gdHJ1ZTtcbiAgICAgICAgICAgIF9pdGVyYXRvckVycm9yID0gX2NvbnRleHQudDA7XG5cbiAgICAgICAgICBjYXNlIDMxOlxuICAgICAgICAgICAgX2NvbnRleHQucHJldiA9IDMxO1xuICAgICAgICAgICAgX2NvbnRleHQucHJldiA9IDMyO1xuXG4gICAgICAgICAgICBpZiAoISghX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbiAmJiBfaXRlcmF0b3JbXCJyZXR1cm5cIl0gIT0gbnVsbCkpIHtcbiAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDM2O1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDM2O1xuICAgICAgICAgICAgcmV0dXJuIF9hd2FpdEFzeW5jR2VuZXJhdG9yKF9pdGVyYXRvcltcInJldHVyblwiXSgpKTtcblxuICAgICAgICAgIGNhc2UgMzY6XG4gICAgICAgICAgICBfY29udGV4dC5wcmV2ID0gMzY7XG5cbiAgICAgICAgICAgIGlmICghX2RpZEl0ZXJhdG9yRXJyb3IpIHtcbiAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDM5O1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhyb3cgX2l0ZXJhdG9yRXJyb3I7XG5cbiAgICAgICAgICBjYXNlIDM5OlxuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LmZpbmlzaCgzNik7XG5cbiAgICAgICAgICBjYXNlIDQwOlxuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LmZpbmlzaCgzMSk7XG5cbiAgICAgICAgICBjYXNlIDQxOlxuICAgICAgICAgICAgaWYgKHVzZUZpbGxlcikge1xuICAgICAgICAgICAgICBmb3IgKGkgPSBsZW47IGkgPCBzaXplOyBpKyspIHtcbiAgICAgICAgICAgICAgICBidWZmZXIucHVzaChmaWxsZXIpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghKGxlbiA+IDAgJiYgbGVuIDwgc2l6ZSkpIHtcbiAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDQ1O1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDQ1O1xuICAgICAgICAgICAgcmV0dXJuIGJ1ZmZlclJlYWRQcm94eTtcblxuICAgICAgICAgIGNhc2UgNDU6XG4gICAgICAgICAgICBfaSA9IDA7XG5cbiAgICAgICAgICBjYXNlIDQ2OlxuICAgICAgICAgICAgaWYgKCEoX2kgPCBNYXRoLm1pbihzaXplLCBsZW4pIC0gMSkpIHtcbiAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDU0O1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYnVmZmVyLnNoaWZ0KCk7XG5cbiAgICAgICAgICAgIGlmICh1c2VGaWxsZXIpIHtcbiAgICAgICAgICAgICAgYnVmZmVyLnB1c2goZmlsbGVyKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDUxO1xuICAgICAgICAgICAgcmV0dXJuIGJ1ZmZlclJlYWRQcm94eTtcblxuICAgICAgICAgIGNhc2UgNTE6XG4gICAgICAgICAgICBfaSsrO1xuICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDQ2O1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlIDU0OlxuICAgICAgICAgIGNhc2UgXCJlbmRcIjpcbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5zdG9wKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCBfY2FsbGVlLCBudWxsLCBbWzYsIDI3LCAzMSwgNDFdLCBbMzIsLCAzNiwgNDBdXSk7XG4gIH0pKTtcbiAgcmV0dXJuIF9hc3luY1dpbmRvd0FoZWFkLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5cbnZhciBhc3luY1dpbmRvd0FoZWFkID0gLyojX19QVVJFX18qL2FzeW5jSXRlcmFibGVDdXJyeShfX2FzeW5jV2luZG93QWhlYWQsIHtcbiAgbWluQXJnczogMSxcbiAgbWF4QXJnczogMixcbiAgdmFsaWRhdGVBcmdzOiBmdW5jdGlvbiB2YWxpZGF0ZUFyZ3MoYXJncykge1xuICAgIGlmICh0eXBlb2YgYXJnc1sxXSAhPT0gJ251bWJlcicpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignYXN5bmNXaW5kb3dBaGVhZCcuY29uY2F0KFwiIG11c3QgYmUgcGFzc2VkIGEgbnVtZXJpYyBzaXplXCIpKTtcbiAgICB9XG4gIH1cbn0pO1xuZXhwb3J0cy5hc3luY1dpbmRvd0FoZWFkID0gYXN5bmNXaW5kb3dBaGVhZDsiLCJ2YXIgX3JlZ2VuZXJhdG9yUnVudGltZSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9yZWdlbmVyYXRvclwiKTtcblxudmFyIF9tYXJrZWQgPSAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yUnVudGltZS5tYXJrKF9fd2luZG93QWhlYWQpO1xuXG5mdW5jdGlvbiBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihvLCBhbGxvd0FycmF5TGlrZSkgeyB2YXIgaXQ7IGlmICh0eXBlb2YgU3ltYm9sID09PSBcInVuZGVmaW5lZFwiIHx8IG9bU3ltYm9sLml0ZXJhdG9yXSA9PSBudWxsKSB7IGlmIChBcnJheS5pc0FycmF5KG8pIHx8IChpdCA9IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvKSkgfHwgYWxsb3dBcnJheUxpa2UgJiYgbyAmJiB0eXBlb2Ygby5sZW5ndGggPT09IFwibnVtYmVyXCIpIHsgaWYgKGl0KSBvID0gaXQ7IHZhciBpID0gMDsgdmFyIEYgPSBmdW5jdGlvbiBGKCkge307IHJldHVybiB7IHM6IEYsIG46IGZ1bmN0aW9uIG4oKSB7IGlmIChpID49IG8ubGVuZ3RoKSByZXR1cm4geyBkb25lOiB0cnVlIH07IHJldHVybiB7IGRvbmU6IGZhbHNlLCB2YWx1ZTogb1tpKytdIH07IH0sIGU6IGZ1bmN0aW9uIGUoX2UpIHsgdGhyb3cgX2U7IH0sIGY6IEYgfTsgfSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIGl0ZXJhdGUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIik7IH0gdmFyIG5vcm1hbENvbXBsZXRpb24gPSB0cnVlLCBkaWRFcnIgPSBmYWxzZSwgZXJyOyByZXR1cm4geyBzOiBmdW5jdGlvbiBzKCkgeyBpdCA9IG9bU3ltYm9sLml0ZXJhdG9yXSgpOyB9LCBuOiBmdW5jdGlvbiBuKCkgeyB2YXIgc3RlcCA9IGl0Lm5leHQoKTsgbm9ybWFsQ29tcGxldGlvbiA9IHN0ZXAuZG9uZTsgcmV0dXJuIHN0ZXA7IH0sIGU6IGZ1bmN0aW9uIGUoX2UyKSB7IGRpZEVyciA9IHRydWU7IGVyciA9IF9lMjsgfSwgZjogZnVuY3Rpb24gZigpIHsgdHJ5IHsgaWYgKCFub3JtYWxDb21wbGV0aW9uICYmIGl0W1wicmV0dXJuXCJdICE9IG51bGwpIGl0W1wicmV0dXJuXCJdKCk7IH0gZmluYWxseSB7IGlmIChkaWRFcnIpIHRocm93IGVycjsgfSB9IH07IH1cblxuZnVuY3Rpb24gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8sIG1pbkxlbikgeyBpZiAoIW8pIHJldHVybjsgaWYgKHR5cGVvZiBvID09PSBcInN0cmluZ1wiKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTsgdmFyIG4gPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykuc2xpY2UoOCwgLTEpOyBpZiAobiA9PT0gXCJPYmplY3RcIiAmJiBvLmNvbnN0cnVjdG9yKSBuID0gby5jb25zdHJ1Y3Rvci5uYW1lOyBpZiAobiA9PT0gXCJNYXBcIiB8fCBuID09PSBcIlNldFwiKSByZXR1cm4gQXJyYXkuZnJvbShvKTsgaWYgKG4gPT09IFwiQXJndW1lbnRzXCIgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QobikpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pOyB9XG5cbmZ1bmN0aW9uIF9hcnJheUxpa2VUb0FycmF5KGFyciwgbGVuKSB7IGlmIChsZW4gPT0gbnVsbCB8fCBsZW4gPiBhcnIubGVuZ3RoKSBsZW4gPSBhcnIubGVuZ3RoOyBmb3IgKHZhciBpID0gMCwgYXJyMiA9IG5ldyBBcnJheShsZW4pOyBpIDwgbGVuOyBpKyspIHsgYXJyMltpXSA9IGFycltpXTsgfSByZXR1cm4gYXJyMjsgfVxuXG52YXIgX3JlcXVpcmUgPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbC9pdGVyYWJsZS5qcycpLFxuICAgIGl0ZXJhYmxlQ3VycnkgPSBfcmVxdWlyZS5pdGVyYWJsZUN1cnJ5O1xuXG52YXIgX3JlcXVpcmUyID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWwvY2lyY3VsYXItYnVmZmVyLmpzJyksXG4gICAgQ2lyY3VsYXJCdWZmZXIgPSBfcmVxdWlyZTIuQ2lyY3VsYXJCdWZmZXIsXG4gICAgUmVhZE9ubHlDaXJjdWxhckJ1ZmZlciA9IF9yZXF1aXJlMi5SZWFkT25seUNpcmN1bGFyQnVmZmVyO1xuXG5mdW5jdGlvbiBfX3dpbmRvd0FoZWFkKHNvdXJjZSwgc2l6ZSkge1xuICB2YXIgX3JlZixcbiAgICAgIF9yZWYkZmlsbGVyLFxuICAgICAgZmlsbGVyLFxuICAgICAgX3JlZiR1c2VGaWxsZXIsXG4gICAgICB1c2VGaWxsZXIsXG4gICAgICBidWZmZXIsXG4gICAgICBidWZmZXJSZWFkUHJveHksXG4gICAgICBsZW4sXG4gICAgICBfaXRlcmF0b3IsXG4gICAgICBfc3RlcCxcbiAgICAgIHZhbHVlLFxuICAgICAgaSxcbiAgICAgIF9pLFxuICAgICAgX2FyZ3MgPSBhcmd1bWVudHM7XG5cbiAgcmV0dXJuIF9yZWdlbmVyYXRvclJ1bnRpbWUud3JhcChmdW5jdGlvbiBfX3dpbmRvd0FoZWFkJChfY29udGV4dCkge1xuICAgIHdoaWxlICgxKSB7XG4gICAgICBzd2l0Y2ggKF9jb250ZXh0LnByZXYgPSBfY29udGV4dC5uZXh0KSB7XG4gICAgICAgIGNhc2UgMDpcbiAgICAgICAgICBfcmVmID0gX2FyZ3MubGVuZ3RoID4gMiAmJiBfYXJnc1syXSAhPT0gdW5kZWZpbmVkID8gX2FyZ3NbMl0gOiB7fSwgX3JlZiRmaWxsZXIgPSBfcmVmLmZpbGxlciwgZmlsbGVyID0gX3JlZiRmaWxsZXIgPT09IHZvaWQgMCA/IHVuZGVmaW5lZCA6IF9yZWYkZmlsbGVyLCBfcmVmJHVzZUZpbGxlciA9IF9yZWYudXNlRmlsbGVyLCB1c2VGaWxsZXIgPSBfcmVmJHVzZUZpbGxlciA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9yZWYkdXNlRmlsbGVyO1xuICAgICAgICAgIGJ1ZmZlciA9IG5ldyBDaXJjdWxhckJ1ZmZlcihzaXplKTtcbiAgICAgICAgICBidWZmZXJSZWFkUHJveHkgPSBuZXcgUmVhZE9ubHlDaXJjdWxhckJ1ZmZlcihidWZmZXIpO1xuICAgICAgICAgIGxlbiA9IDA7XG4gICAgICAgICAgX2l0ZXJhdG9yID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIoc291cmNlKTtcbiAgICAgICAgICBfY29udGV4dC5wcmV2ID0gNTtcblxuICAgICAgICAgIF9pdGVyYXRvci5zKCk7XG5cbiAgICAgICAgY2FzZSA3OlxuICAgICAgICAgIGlmICgoX3N0ZXAgPSBfaXRlcmF0b3IubigpKS5kb25lKSB7XG4gICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMTY7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YWx1ZSA9IF9zdGVwLnZhbHVlO1xuICAgICAgICAgIGJ1ZmZlci5wdXNoKHZhbHVlKTtcblxuICAgICAgICAgIGlmICghYnVmZmVyLmlzRnVsbCgpKSB7XG4gICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMTM7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMTM7XG4gICAgICAgICAgcmV0dXJuIGJ1ZmZlclJlYWRQcm94eTtcblxuICAgICAgICBjYXNlIDEzOlxuICAgICAgICAgIGxlbisrO1xuXG4gICAgICAgIGNhc2UgMTQ6XG4gICAgICAgICAgX2NvbnRleHQubmV4dCA9IDc7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAxNjpcbiAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMjE7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAxODpcbiAgICAgICAgICBfY29udGV4dC5wcmV2ID0gMTg7XG4gICAgICAgICAgX2NvbnRleHQudDAgPSBfY29udGV4dFtcImNhdGNoXCJdKDUpO1xuXG4gICAgICAgICAgX2l0ZXJhdG9yLmUoX2NvbnRleHQudDApO1xuXG4gICAgICAgIGNhc2UgMjE6XG4gICAgICAgICAgX2NvbnRleHQucHJldiA9IDIxO1xuXG4gICAgICAgICAgX2l0ZXJhdG9yLmYoKTtcblxuICAgICAgICAgIHJldHVybiBfY29udGV4dC5maW5pc2goMjEpO1xuXG4gICAgICAgIGNhc2UgMjQ6XG4gICAgICAgICAgaWYgKHVzZUZpbGxlcikge1xuICAgICAgICAgICAgZm9yIChpID0gbGVuOyBpIDwgc2l6ZTsgaSsrKSB7XG4gICAgICAgICAgICAgIGJ1ZmZlci5wdXNoKGZpbGxlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKCEobGVuID4gMCAmJiBsZW4gPCBzaXplKSkge1xuICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDI4O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgX2NvbnRleHQubmV4dCA9IDI4O1xuICAgICAgICAgIHJldHVybiBidWZmZXJSZWFkUHJveHk7XG5cbiAgICAgICAgY2FzZSAyODpcbiAgICAgICAgICBfaSA9IDA7XG5cbiAgICAgICAgY2FzZSAyOTpcbiAgICAgICAgICBpZiAoIShfaSA8IE1hdGgubWluKHNpemUsIGxlbikgLSAxKSkge1xuICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDM3O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnVmZmVyLnNoaWZ0KCk7XG5cbiAgICAgICAgICBpZiAodXNlRmlsbGVyKSB7XG4gICAgICAgICAgICBidWZmZXIucHVzaChmaWxsZXIpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAzNDtcbiAgICAgICAgICByZXR1cm4gYnVmZmVyUmVhZFByb3h5O1xuXG4gICAgICAgIGNhc2UgMzQ6XG4gICAgICAgICAgX2krKztcbiAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMjk7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAzNzpcbiAgICAgICAgY2FzZSBcImVuZFwiOlxuICAgICAgICAgIHJldHVybiBfY29udGV4dC5zdG9wKCk7XG4gICAgICB9XG4gICAgfVxuICB9LCBfbWFya2VkLCBudWxsLCBbWzUsIDE4LCAyMSwgMjRdXSk7XG59XG5cbmV4cG9ydHMuX193aW5kb3dBaGVhZCA9IF9fd2luZG93QWhlYWQ7XG52YXIgd2luZG93QWhlYWQgPSAvKiNfX1BVUkVfXyovaXRlcmFibGVDdXJyeShfX3dpbmRvd0FoZWFkLCB7XG4gIG1pbkFyZ3M6IDEsXG4gIG1heEFyZ3M6IDIsXG4gIHZhbGlkYXRlQXJnczogZnVuY3Rpb24gdmFsaWRhdGVBcmdzKGFyZ3MpIHtcbiAgICBpZiAodHlwZW9mIGFyZ3NbMV0gIT09ICdudW1iZXInKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3dpbmRvd0FoZWFkJy5jb25jYXQoXCIgbXVzdCBiZSBwYXNzZWQgYSBudW1lcmljIHNpemVcIikpO1xuICAgIH1cbiAgfVxufSk7XG5leHBvcnRzLndpbmRvd0FoZWFkID0gd2luZG93QWhlYWQ7IiwidmFyIF9yZWdlbmVyYXRvclJ1bnRpbWUgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvcmVnZW5lcmF0b3JcIik7XG5cbnZhciBfYXdhaXRBc3luY0dlbmVyYXRvciA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2F3YWl0QXN5bmNHZW5lcmF0b3JcIik7XG5cbnZhciBfd3JhcEFzeW5jR2VuZXJhdG9yID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvd3JhcEFzeW5jR2VuZXJhdG9yXCIpO1xuXG52YXIgX2FzeW5jSXRlcmF0b3IgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9hc3luY0l0ZXJhdG9yXCIpO1xuXG52YXIgX3JlcXVpcmUgPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbC9hc3luYy1pdGVyYWJsZS5qcycpLFxuICAgIGFzeW5jSXRlcmFibGVDdXJyeSA9IF9yZXF1aXJlLmFzeW5jSXRlcmFibGVDdXJyeTtcblxudmFyIF9yZXF1aXJlMiA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFsL2NpcmN1bGFyLWJ1ZmZlci5qcycpLFxuICAgIENpcmN1bGFyQnVmZmVyID0gX3JlcXVpcmUyLkNpcmN1bGFyQnVmZmVyLFxuICAgIFJlYWRPbmx5Q2lyY3VsYXJCdWZmZXIgPSBfcmVxdWlyZTIuUmVhZE9ubHlDaXJjdWxhckJ1ZmZlcjtcblxuZnVuY3Rpb24gX19hc3luY1dpbmRvd0JlaGluZChfeCwgX3gyKSB7XG4gIHJldHVybiBfYXN5bmNXaW5kb3dCZWhpbmQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cblxuZXhwb3J0cy5fX2FzeW5jV2luZG93QmVoaW5kID0gX19hc3luY1dpbmRvd0JlaGluZDtcblxuZnVuY3Rpb24gX2FzeW5jV2luZG93QmVoaW5kKCkge1xuICBfYXN5bmNXaW5kb3dCZWhpbmQgPSBfd3JhcEFzeW5jR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yUnVudGltZS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUoc291cmNlLCBzaXplKSB7XG4gICAgdmFyIF9yZWYsXG4gICAgICAgIGZpbGxlcixcbiAgICAgICAgYnVmZmVyLFxuICAgICAgICBidWZmZXJSZWFkUHJveHksXG4gICAgICAgIF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24sXG4gICAgICAgIF9kaWRJdGVyYXRvckVycm9yLFxuICAgICAgICBfaXRlcmF0b3JFcnJvcixcbiAgICAgICAgX2l0ZXJhdG9yLFxuICAgICAgICBfc3RlcCxcbiAgICAgICAgX3ZhbHVlLFxuICAgICAgICB2YWx1ZSxcbiAgICAgICAgX2FyZ3MgPSBhcmd1bWVudHM7XG5cbiAgICByZXR1cm4gX3JlZ2VuZXJhdG9yUnVudGltZS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUkKF9jb250ZXh0KSB7XG4gICAgICB3aGlsZSAoMSkge1xuICAgICAgICBzd2l0Y2ggKF9jb250ZXh0LnByZXYgPSBfY29udGV4dC5uZXh0KSB7XG4gICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgX3JlZiA9IF9hcmdzLmxlbmd0aCA+IDIgJiYgX2FyZ3NbMl0gIT09IHVuZGVmaW5lZCA/IF9hcmdzWzJdIDoge30sIGZpbGxlciA9IF9yZWYuZmlsbGVyO1xuICAgICAgICAgICAgYnVmZmVyID0gbmV3IENpcmN1bGFyQnVmZmVyKHNpemUpO1xuICAgICAgICAgICAgYnVmZmVyUmVhZFByb3h5ID0gbmV3IFJlYWRPbmx5Q2lyY3VsYXJCdWZmZXIoYnVmZmVyKTtcbiAgICAgICAgICAgIGJ1ZmZlci5maWxsKGZpbGxlcik7XG4gICAgICAgICAgICBfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uID0gdHJ1ZTtcbiAgICAgICAgICAgIF9kaWRJdGVyYXRvckVycm9yID0gZmFsc2U7XG4gICAgICAgICAgICBfY29udGV4dC5wcmV2ID0gNjtcbiAgICAgICAgICAgIF9pdGVyYXRvciA9IF9hc3luY0l0ZXJhdG9yKHNvdXJjZSk7XG5cbiAgICAgICAgICBjYXNlIDg6XG4gICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMTA7XG4gICAgICAgICAgICByZXR1cm4gX2F3YWl0QXN5bmNHZW5lcmF0b3IoX2l0ZXJhdG9yLm5leHQoKSk7XG5cbiAgICAgICAgICBjYXNlIDEwOlxuICAgICAgICAgICAgX3N0ZXAgPSBfY29udGV4dC5zZW50O1xuICAgICAgICAgICAgX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbiA9IF9zdGVwLmRvbmU7XG4gICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMTQ7XG4gICAgICAgICAgICByZXR1cm4gX2F3YWl0QXN5bmNHZW5lcmF0b3IoX3N0ZXAudmFsdWUpO1xuXG4gICAgICAgICAgY2FzZSAxNDpcbiAgICAgICAgICAgIF92YWx1ZSA9IF9jb250ZXh0LnNlbnQ7XG5cbiAgICAgICAgICAgIGlmIChfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uKSB7XG4gICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAyMztcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhbHVlID0gX3ZhbHVlO1xuICAgICAgICAgICAgYnVmZmVyLnB1c2godmFsdWUpO1xuICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDIwO1xuICAgICAgICAgICAgcmV0dXJuIGJ1ZmZlclJlYWRQcm94eTtcblxuICAgICAgICAgIGNhc2UgMjA6XG4gICAgICAgICAgICBfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uID0gdHJ1ZTtcbiAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSA4O1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlIDIzOlxuICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDI5O1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlIDI1OlxuICAgICAgICAgICAgX2NvbnRleHQucHJldiA9IDI1O1xuICAgICAgICAgICAgX2NvbnRleHQudDAgPSBfY29udGV4dFtcImNhdGNoXCJdKDYpO1xuICAgICAgICAgICAgX2RpZEl0ZXJhdG9yRXJyb3IgPSB0cnVlO1xuICAgICAgICAgICAgX2l0ZXJhdG9yRXJyb3IgPSBfY29udGV4dC50MDtcblxuICAgICAgICAgIGNhc2UgMjk6XG4gICAgICAgICAgICBfY29udGV4dC5wcmV2ID0gMjk7XG4gICAgICAgICAgICBfY29udGV4dC5wcmV2ID0gMzA7XG5cbiAgICAgICAgICAgIGlmICghKCFfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uICYmIF9pdGVyYXRvcltcInJldHVyblwiXSAhPSBudWxsKSkge1xuICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMzQ7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMzQ7XG4gICAgICAgICAgICByZXR1cm4gX2F3YWl0QXN5bmNHZW5lcmF0b3IoX2l0ZXJhdG9yW1wicmV0dXJuXCJdKCkpO1xuXG4gICAgICAgICAgY2FzZSAzNDpcbiAgICAgICAgICAgIF9jb250ZXh0LnByZXYgPSAzNDtcblxuICAgICAgICAgICAgaWYgKCFfZGlkSXRlcmF0b3JFcnJvcikge1xuICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMzc7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aHJvdyBfaXRlcmF0b3JFcnJvcjtcblxuICAgICAgICAgIGNhc2UgMzc6XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuZmluaXNoKDM0KTtcblxuICAgICAgICAgIGNhc2UgMzg6XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuZmluaXNoKDI5KTtcblxuICAgICAgICAgIGNhc2UgMzk6XG4gICAgICAgICAgY2FzZSBcImVuZFwiOlxuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LnN0b3AoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sIF9jYWxsZWUsIG51bGwsIFtbNiwgMjUsIDI5LCAzOV0sIFszMCwsIDM0LCAzOF1dKTtcbiAgfSkpO1xuICByZXR1cm4gX2FzeW5jV2luZG93QmVoaW5kLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5cbnZhciBhc3luY1dpbmRvd0JlaGluZCA9IC8qI19fUFVSRV9fKi9hc3luY0l0ZXJhYmxlQ3VycnkoX19hc3luY1dpbmRvd0JlaGluZCwge1xuICBtaW5BcmdzOiAxLFxuICBtYXhBcmdzOiAyLFxuICB2YWxpZGF0ZUFyZ3M6IGZ1bmN0aW9uIHZhbGlkYXRlQXJncyhhcmdzKSB7XG4gICAgaWYgKHR5cGVvZiBhcmdzWzFdICE9PSAnbnVtYmVyJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdhc3luY1dpbmRvd0JlaGluZCcuY29uY2F0KFwiIG11c3QgYmUgcGFzc2VkIGEgbnVtZXJpYyBzaXplXCIpKTtcbiAgICB9XG4gIH1cbn0pO1xuZXhwb3J0cy5hc3luY1dpbmRvd0JlaGluZCA9IGFzeW5jV2luZG93QmVoaW5kOyIsInZhciBfcmVnZW5lcmF0b3JSdW50aW1lID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL3JlZ2VuZXJhdG9yXCIpO1xuXG52YXIgX21hcmtlZCA9IC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3JSdW50aW1lLm1hcmsoX193aW5kb3dCZWhpbmQpO1xuXG5mdW5jdGlvbiBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihvLCBhbGxvd0FycmF5TGlrZSkgeyB2YXIgaXQ7IGlmICh0eXBlb2YgU3ltYm9sID09PSBcInVuZGVmaW5lZFwiIHx8IG9bU3ltYm9sLml0ZXJhdG9yXSA9PSBudWxsKSB7IGlmIChBcnJheS5pc0FycmF5KG8pIHx8IChpdCA9IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvKSkgfHwgYWxsb3dBcnJheUxpa2UgJiYgbyAmJiB0eXBlb2Ygby5sZW5ndGggPT09IFwibnVtYmVyXCIpIHsgaWYgKGl0KSBvID0gaXQ7IHZhciBpID0gMDsgdmFyIEYgPSBmdW5jdGlvbiBGKCkge307IHJldHVybiB7IHM6IEYsIG46IGZ1bmN0aW9uIG4oKSB7IGlmIChpID49IG8ubGVuZ3RoKSByZXR1cm4geyBkb25lOiB0cnVlIH07IHJldHVybiB7IGRvbmU6IGZhbHNlLCB2YWx1ZTogb1tpKytdIH07IH0sIGU6IGZ1bmN0aW9uIGUoX2UpIHsgdGhyb3cgX2U7IH0sIGY6IEYgfTsgfSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIGl0ZXJhdGUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIik7IH0gdmFyIG5vcm1hbENvbXBsZXRpb24gPSB0cnVlLCBkaWRFcnIgPSBmYWxzZSwgZXJyOyByZXR1cm4geyBzOiBmdW5jdGlvbiBzKCkgeyBpdCA9IG9bU3ltYm9sLml0ZXJhdG9yXSgpOyB9LCBuOiBmdW5jdGlvbiBuKCkgeyB2YXIgc3RlcCA9IGl0Lm5leHQoKTsgbm9ybWFsQ29tcGxldGlvbiA9IHN0ZXAuZG9uZTsgcmV0dXJuIHN0ZXA7IH0sIGU6IGZ1bmN0aW9uIGUoX2UyKSB7IGRpZEVyciA9IHRydWU7IGVyciA9IF9lMjsgfSwgZjogZnVuY3Rpb24gZigpIHsgdHJ5IHsgaWYgKCFub3JtYWxDb21wbGV0aW9uICYmIGl0W1wicmV0dXJuXCJdICE9IG51bGwpIGl0W1wicmV0dXJuXCJdKCk7IH0gZmluYWxseSB7IGlmIChkaWRFcnIpIHRocm93IGVycjsgfSB9IH07IH1cblxuZnVuY3Rpb24gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8sIG1pbkxlbikgeyBpZiAoIW8pIHJldHVybjsgaWYgKHR5cGVvZiBvID09PSBcInN0cmluZ1wiKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTsgdmFyIG4gPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykuc2xpY2UoOCwgLTEpOyBpZiAobiA9PT0gXCJPYmplY3RcIiAmJiBvLmNvbnN0cnVjdG9yKSBuID0gby5jb25zdHJ1Y3Rvci5uYW1lOyBpZiAobiA9PT0gXCJNYXBcIiB8fCBuID09PSBcIlNldFwiKSByZXR1cm4gQXJyYXkuZnJvbShvKTsgaWYgKG4gPT09IFwiQXJndW1lbnRzXCIgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QobikpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pOyB9XG5cbmZ1bmN0aW9uIF9hcnJheUxpa2VUb0FycmF5KGFyciwgbGVuKSB7IGlmIChsZW4gPT0gbnVsbCB8fCBsZW4gPiBhcnIubGVuZ3RoKSBsZW4gPSBhcnIubGVuZ3RoOyBmb3IgKHZhciBpID0gMCwgYXJyMiA9IG5ldyBBcnJheShsZW4pOyBpIDwgbGVuOyBpKyspIHsgYXJyMltpXSA9IGFycltpXTsgfSByZXR1cm4gYXJyMjsgfVxuXG52YXIgX3JlcXVpcmUgPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbC9pdGVyYWJsZS5qcycpLFxuICAgIGl0ZXJhYmxlQ3VycnkgPSBfcmVxdWlyZS5pdGVyYWJsZUN1cnJ5O1xuXG52YXIgX3JlcXVpcmUyID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWwvY2lyY3VsYXItYnVmZmVyLmpzJyksXG4gICAgQ2lyY3VsYXJCdWZmZXIgPSBfcmVxdWlyZTIuQ2lyY3VsYXJCdWZmZXIsXG4gICAgUmVhZE9ubHlDaXJjdWxhckJ1ZmZlciA9IF9yZXF1aXJlMi5SZWFkT25seUNpcmN1bGFyQnVmZmVyO1xuXG5mdW5jdGlvbiBfX3dpbmRvd0JlaGluZChzb3VyY2UsIHNpemUpIHtcbiAgdmFyIF9yZWYsXG4gICAgICBmaWxsZXIsXG4gICAgICBidWZmZXIsXG4gICAgICBidWZmZXJSZWFkUHJveHksXG4gICAgICBfaXRlcmF0b3IsXG4gICAgICBfc3RlcCxcbiAgICAgIHZhbHVlLFxuICAgICAgX2FyZ3MgPSBhcmd1bWVudHM7XG5cbiAgcmV0dXJuIF9yZWdlbmVyYXRvclJ1bnRpbWUud3JhcChmdW5jdGlvbiBfX3dpbmRvd0JlaGluZCQoX2NvbnRleHQpIHtcbiAgICB3aGlsZSAoMSkge1xuICAgICAgc3dpdGNoIChfY29udGV4dC5wcmV2ID0gX2NvbnRleHQubmV4dCkge1xuICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgX3JlZiA9IF9hcmdzLmxlbmd0aCA+IDIgJiYgX2FyZ3NbMl0gIT09IHVuZGVmaW5lZCA/IF9hcmdzWzJdIDoge30sIGZpbGxlciA9IF9yZWYuZmlsbGVyO1xuICAgICAgICAgIGJ1ZmZlciA9IG5ldyBDaXJjdWxhckJ1ZmZlcihzaXplKTtcbiAgICAgICAgICBidWZmZXJSZWFkUHJveHkgPSBuZXcgUmVhZE9ubHlDaXJjdWxhckJ1ZmZlcihidWZmZXIpO1xuICAgICAgICAgIGJ1ZmZlci5maWxsKGZpbGxlcik7XG4gICAgICAgICAgX2l0ZXJhdG9yID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIoc291cmNlKTtcbiAgICAgICAgICBfY29udGV4dC5wcmV2ID0gNTtcblxuICAgICAgICAgIF9pdGVyYXRvci5zKCk7XG5cbiAgICAgICAgY2FzZSA3OlxuICAgICAgICAgIGlmICgoX3N0ZXAgPSBfaXRlcmF0b3IubigpKS5kb25lKSB7XG4gICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMTQ7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YWx1ZSA9IF9zdGVwLnZhbHVlO1xuICAgICAgICAgIGJ1ZmZlci5wdXNoKHZhbHVlKTtcbiAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMTI7XG4gICAgICAgICAgcmV0dXJuIGJ1ZmZlclJlYWRQcm94eTtcblxuICAgICAgICBjYXNlIDEyOlxuICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSA3O1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgMTQ6XG4gICAgICAgICAgX2NvbnRleHQubmV4dCA9IDE5O1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgMTY6XG4gICAgICAgICAgX2NvbnRleHQucHJldiA9IDE2O1xuICAgICAgICAgIF9jb250ZXh0LnQwID0gX2NvbnRleHRbXCJjYXRjaFwiXSg1KTtcblxuICAgICAgICAgIF9pdGVyYXRvci5lKF9jb250ZXh0LnQwKTtcblxuICAgICAgICBjYXNlIDE5OlxuICAgICAgICAgIF9jb250ZXh0LnByZXYgPSAxOTtcblxuICAgICAgICAgIF9pdGVyYXRvci5mKCk7XG5cbiAgICAgICAgICByZXR1cm4gX2NvbnRleHQuZmluaXNoKDE5KTtcblxuICAgICAgICBjYXNlIDIyOlxuICAgICAgICBjYXNlIFwiZW5kXCI6XG4gICAgICAgICAgcmV0dXJuIF9jb250ZXh0LnN0b3AoKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIF9tYXJrZWQsIG51bGwsIFtbNSwgMTYsIDE5LCAyMl1dKTtcbn1cblxuZXhwb3J0cy5fX3dpbmRvd0JlaGluZCA9IF9fd2luZG93QmVoaW5kO1xudmFyIHdpbmRvd0JlaGluZCA9IC8qI19fUFVSRV9fKi9pdGVyYWJsZUN1cnJ5KF9fd2luZG93QmVoaW5kLCB7XG4gIG1pbkFyZ3M6IDEsXG4gIG1heEFyZ3M6IDIsXG4gIHZhbGlkYXRlQXJnczogZnVuY3Rpb24gdmFsaWRhdGVBcmdzKGFyZ3MpIHtcbiAgICBpZiAodHlwZW9mIGFyZ3NbMV0gIT09ICdudW1iZXInKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3dpbmRvd0JlaGluZCcuY29uY2F0KFwiIG11c3QgYmUgcGFzc2VkIGEgbnVtZXJpYyBzaXplXCIpKTtcbiAgICB9XG4gIH1cbn0pO1xuZXhwb3J0cy53aW5kb3dCZWhpbmQgPSB3aW5kb3dCZWhpbmQ7IiwidmFyIF9yZWdlbmVyYXRvclJ1bnRpbWUgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvcmVnZW5lcmF0b3JcIik7XG5cbnZhciBfYXdhaXRBc3luY0dlbmVyYXRvciA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2F3YWl0QXN5bmNHZW5lcmF0b3JcIik7XG5cbnZhciBfd3JhcEFzeW5jR2VuZXJhdG9yID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvd3JhcEFzeW5jR2VuZXJhdG9yXCIpO1xuXG52YXIgX2FzeW5jSXRlcmF0b3IgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9hc3luY0l0ZXJhdG9yXCIpO1xuXG52YXIgX3JlcXVpcmUgPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbC9hc3luYy1pdGVyYWJsZS5qcycpLFxuICAgIGFzeW5jSXRlcmFibGVDdXJyeSA9IF9yZXF1aXJlLmFzeW5jSXRlcmFibGVDdXJyeTtcblxudmFyIF9yZXF1aXJlMiA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFsL2NpcmN1bGFyLWJ1ZmZlci5qcycpLFxuICAgIENpcmN1bGFyQnVmZmVyID0gX3JlcXVpcmUyLkNpcmN1bGFyQnVmZmVyLFxuICAgIFJlYWRPbmx5Q2lyY3VsYXJCdWZmZXIgPSBfcmVxdWlyZTIuUmVhZE9ubHlDaXJjdWxhckJ1ZmZlcjtcblxuZnVuY3Rpb24gX19hc3luY1dpbmRvdyhfeCwgX3gyKSB7XG4gIHJldHVybiBfYXN5bmNXaW5kb3cuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cblxuZXhwb3J0cy5fX2FzeW5jV2luZG93ID0gX19hc3luY1dpbmRvdztcblxuZnVuY3Rpb24gX2FzeW5jV2luZG93KCkge1xuICBfYXN5bmNXaW5kb3cgPSBfd3JhcEFzeW5jR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yUnVudGltZS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUoc291cmNlLCBzaXplKSB7XG4gICAgdmFyIGJ1ZmZlciwgYnVmZmVyUmVhZFByb3h5LCBfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uLCBfZGlkSXRlcmF0b3JFcnJvciwgX2l0ZXJhdG9yRXJyb3IsIF9pdGVyYXRvciwgX3N0ZXAsIF92YWx1ZSwgdmFsdWU7XG5cbiAgICByZXR1cm4gX3JlZ2VuZXJhdG9yUnVudGltZS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUkKF9jb250ZXh0KSB7XG4gICAgICB3aGlsZSAoMSkge1xuICAgICAgICBzd2l0Y2ggKF9jb250ZXh0LnByZXYgPSBfY29udGV4dC5uZXh0KSB7XG4gICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgYnVmZmVyID0gbmV3IENpcmN1bGFyQnVmZmVyKHNpemUpO1xuICAgICAgICAgICAgYnVmZmVyUmVhZFByb3h5ID0gbmV3IFJlYWRPbmx5Q2lyY3VsYXJCdWZmZXIoYnVmZmVyKTtcbiAgICAgICAgICAgIF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24gPSB0cnVlO1xuICAgICAgICAgICAgX2RpZEl0ZXJhdG9yRXJyb3IgPSBmYWxzZTtcbiAgICAgICAgICAgIF9jb250ZXh0LnByZXYgPSA0O1xuICAgICAgICAgICAgX2l0ZXJhdG9yID0gX2FzeW5jSXRlcmF0b3Ioc291cmNlKTtcblxuICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSA4O1xuICAgICAgICAgICAgcmV0dXJuIF9hd2FpdEFzeW5jR2VuZXJhdG9yKF9pdGVyYXRvci5uZXh0KCkpO1xuXG4gICAgICAgICAgY2FzZSA4OlxuICAgICAgICAgICAgX3N0ZXAgPSBfY29udGV4dC5zZW50O1xuICAgICAgICAgICAgX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbiA9IF9zdGVwLmRvbmU7XG4gICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMTI7XG4gICAgICAgICAgICByZXR1cm4gX2F3YWl0QXN5bmNHZW5lcmF0b3IoX3N0ZXAudmFsdWUpO1xuXG4gICAgICAgICAgY2FzZSAxMjpcbiAgICAgICAgICAgIF92YWx1ZSA9IF9jb250ZXh0LnNlbnQ7XG5cbiAgICAgICAgICAgIGlmIChfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uKSB7XG4gICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAyMjtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhbHVlID0gX3ZhbHVlO1xuICAgICAgICAgICAgYnVmZmVyLnB1c2godmFsdWUpO1xuXG4gICAgICAgICAgICBpZiAoIWJ1ZmZlci5pc0Z1bGwoKSkge1xuICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMTk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMTk7XG4gICAgICAgICAgICByZXR1cm4gYnVmZmVyUmVhZFByb3h5O1xuXG4gICAgICAgICAgY2FzZSAxOTpcbiAgICAgICAgICAgIF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24gPSB0cnVlO1xuICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDY7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgMjI6XG4gICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMjg7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgMjQ6XG4gICAgICAgICAgICBfY29udGV4dC5wcmV2ID0gMjQ7XG4gICAgICAgICAgICBfY29udGV4dC50MCA9IF9jb250ZXh0W1wiY2F0Y2hcIl0oNCk7XG4gICAgICAgICAgICBfZGlkSXRlcmF0b3JFcnJvciA9IHRydWU7XG4gICAgICAgICAgICBfaXRlcmF0b3JFcnJvciA9IF9jb250ZXh0LnQwO1xuXG4gICAgICAgICAgY2FzZSAyODpcbiAgICAgICAgICAgIF9jb250ZXh0LnByZXYgPSAyODtcbiAgICAgICAgICAgIF9jb250ZXh0LnByZXYgPSAyOTtcblxuICAgICAgICAgICAgaWYgKCEoIV9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24gJiYgX2l0ZXJhdG9yW1wicmV0dXJuXCJdICE9IG51bGwpKSB7XG4gICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAzMztcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAzMztcbiAgICAgICAgICAgIHJldHVybiBfYXdhaXRBc3luY0dlbmVyYXRvcihfaXRlcmF0b3JbXCJyZXR1cm5cIl0oKSk7XG5cbiAgICAgICAgICBjYXNlIDMzOlxuICAgICAgICAgICAgX2NvbnRleHQucHJldiA9IDMzO1xuXG4gICAgICAgICAgICBpZiAoIV9kaWRJdGVyYXRvckVycm9yKSB7XG4gICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAzNjtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRocm93IF9pdGVyYXRvckVycm9yO1xuXG4gICAgICAgICAgY2FzZSAzNjpcbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5maW5pc2goMzMpO1xuXG4gICAgICAgICAgY2FzZSAzNzpcbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5maW5pc2goMjgpO1xuXG4gICAgICAgICAgY2FzZSAzODpcbiAgICAgICAgICBjYXNlIFwiZW5kXCI6XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuc3RvcCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwgX2NhbGxlZSwgbnVsbCwgW1s0LCAyNCwgMjgsIDM4XSwgWzI5LCwgMzMsIDM3XV0pO1xuICB9KSk7XG4gIHJldHVybiBfYXN5bmNXaW5kb3cuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cblxudmFyIGFzeW5jV2luZG93ID0gLyojX19QVVJFX18qL2FzeW5jSXRlcmFibGVDdXJyeShfX2FzeW5jV2luZG93LCB7XG4gIHZhbGlkYXRlQXJnczogZnVuY3Rpb24gdmFsaWRhdGVBcmdzKGFyZ3MpIHtcbiAgICBpZiAodHlwZW9mIGFyZ3NbMV0gIT09ICdudW1iZXInKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2FzeW5jV2luZG93Jy5jb25jYXQoXCIgbXVzdCBiZSBwYXNzZWQgYSBudW1lcmljIHNpemVcIikpO1xuICAgIH1cbiAgfVxufSk7XG5leHBvcnRzLmFzeW5jV2luZG93ID0gYXN5bmNXaW5kb3c7IiwidmFyIF9yZWdlbmVyYXRvclJ1bnRpbWUgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvcmVnZW5lcmF0b3JcIik7XG5cbnZhciBfbWFya2VkID0gLyojX19QVVJFX18qL19yZWdlbmVyYXRvclJ1bnRpbWUubWFyayhfX3dpbmRvdyk7XG5cbmZ1bmN0aW9uIF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKG8sIGFsbG93QXJyYXlMaWtlKSB7IHZhciBpdDsgaWYgKHR5cGVvZiBTeW1ib2wgPT09IFwidW5kZWZpbmVkXCIgfHwgb1tTeW1ib2wuaXRlcmF0b3JdID09IG51bGwpIHsgaWYgKEFycmF5LmlzQXJyYXkobykgfHwgKGl0ID0gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8pKSB8fCBhbGxvd0FycmF5TGlrZSAmJiBvICYmIHR5cGVvZiBvLmxlbmd0aCA9PT0gXCJudW1iZXJcIikgeyBpZiAoaXQpIG8gPSBpdDsgdmFyIGkgPSAwOyB2YXIgRiA9IGZ1bmN0aW9uIEYoKSB7fTsgcmV0dXJuIHsgczogRiwgbjogZnVuY3Rpb24gbigpIHsgaWYgKGkgPj0gby5sZW5ndGgpIHJldHVybiB7IGRvbmU6IHRydWUgfTsgcmV0dXJuIHsgZG9uZTogZmFsc2UsIHZhbHVlOiBvW2krK10gfTsgfSwgZTogZnVuY3Rpb24gZShfZSkgeyB0aHJvdyBfZTsgfSwgZjogRiB9OyB9IHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gaXRlcmF0ZSBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTsgfSB2YXIgbm9ybWFsQ29tcGxldGlvbiA9IHRydWUsIGRpZEVyciA9IGZhbHNlLCBlcnI7IHJldHVybiB7IHM6IGZ1bmN0aW9uIHMoKSB7IGl0ID0gb1tTeW1ib2wuaXRlcmF0b3JdKCk7IH0sIG46IGZ1bmN0aW9uIG4oKSB7IHZhciBzdGVwID0gaXQubmV4dCgpOyBub3JtYWxDb21wbGV0aW9uID0gc3RlcC5kb25lOyByZXR1cm4gc3RlcDsgfSwgZTogZnVuY3Rpb24gZShfZTIpIHsgZGlkRXJyID0gdHJ1ZTsgZXJyID0gX2UyOyB9LCBmOiBmdW5jdGlvbiBmKCkgeyB0cnkgeyBpZiAoIW5vcm1hbENvbXBsZXRpb24gJiYgaXRbXCJyZXR1cm5cIl0gIT0gbnVsbCkgaXRbXCJyZXR1cm5cIl0oKTsgfSBmaW5hbGx5IHsgaWYgKGRpZEVycikgdGhyb3cgZXJyOyB9IH0gfTsgfVxuXG5mdW5jdGlvbiBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkobywgbWluTGVuKSB7IGlmICghbykgcmV0dXJuOyBpZiAodHlwZW9mIG8gPT09IFwic3RyaW5nXCIpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pOyB2YXIgbiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKS5zbGljZSg4LCAtMSk7IGlmIChuID09PSBcIk9iamVjdFwiICYmIG8uY29uc3RydWN0b3IpIG4gPSBvLmNvbnN0cnVjdG9yLm5hbWU7IGlmIChuID09PSBcIk1hcFwiIHx8IG4gPT09IFwiU2V0XCIpIHJldHVybiBBcnJheS5mcm9tKG8pOyBpZiAobiA9PT0gXCJBcmd1bWVudHNcIiB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSkgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IH1cblxuZnVuY3Rpb24gX2FycmF5TGlrZVRvQXJyYXkoYXJyLCBsZW4pIHsgaWYgKGxlbiA9PSBudWxsIHx8IGxlbiA+IGFyci5sZW5ndGgpIGxlbiA9IGFyci5sZW5ndGg7IGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGxlbik7IGkgPCBsZW47IGkrKykgeyBhcnIyW2ldID0gYXJyW2ldOyB9IHJldHVybiBhcnIyOyB9XG5cbnZhciBfcmVxdWlyZSA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFsL2l0ZXJhYmxlLmpzJyksXG4gICAgaXRlcmFibGVDdXJyeSA9IF9yZXF1aXJlLml0ZXJhYmxlQ3Vycnk7XG5cbnZhciBfcmVxdWlyZTIgPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbC9jaXJjdWxhci1idWZmZXIuanMnKSxcbiAgICBDaXJjdWxhckJ1ZmZlciA9IF9yZXF1aXJlMi5DaXJjdWxhckJ1ZmZlcixcbiAgICBSZWFkT25seUNpcmN1bGFyQnVmZmVyID0gX3JlcXVpcmUyLlJlYWRPbmx5Q2lyY3VsYXJCdWZmZXI7XG5cbmZ1bmN0aW9uIF9fd2luZG93KHNvdXJjZSwgc2l6ZSkge1xuICB2YXIgYnVmZmVyLCBidWZmZXJSZWFkUHJveHksIF9pdGVyYXRvciwgX3N0ZXAsIHZhbHVlO1xuXG4gIHJldHVybiBfcmVnZW5lcmF0b3JSdW50aW1lLndyYXAoZnVuY3Rpb24gX193aW5kb3ckKF9jb250ZXh0KSB7XG4gICAgd2hpbGUgKDEpIHtcbiAgICAgIHN3aXRjaCAoX2NvbnRleHQucHJldiA9IF9jb250ZXh0Lm5leHQpIHtcbiAgICAgICAgY2FzZSAwOlxuICAgICAgICAgIGJ1ZmZlciA9IG5ldyBDaXJjdWxhckJ1ZmZlcihzaXplKTtcbiAgICAgICAgICBidWZmZXJSZWFkUHJveHkgPSBuZXcgUmVhZE9ubHlDaXJjdWxhckJ1ZmZlcihidWZmZXIpO1xuICAgICAgICAgIF9pdGVyYXRvciA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKHNvdXJjZSk7XG4gICAgICAgICAgX2NvbnRleHQucHJldiA9IDM7XG5cbiAgICAgICAgICBfaXRlcmF0b3IucygpO1xuXG4gICAgICAgIGNhc2UgNTpcbiAgICAgICAgICBpZiAoKF9zdGVwID0gX2l0ZXJhdG9yLm4oKSkuZG9uZSkge1xuICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDEzO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFsdWUgPSBfc3RlcC52YWx1ZTtcbiAgICAgICAgICBidWZmZXIucHVzaCh2YWx1ZSk7XG5cbiAgICAgICAgICBpZiAoIWJ1ZmZlci5pc0Z1bGwoKSkge1xuICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDExO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgX2NvbnRleHQubmV4dCA9IDExO1xuICAgICAgICAgIHJldHVybiBidWZmZXJSZWFkUHJveHk7XG5cbiAgICAgICAgY2FzZSAxMTpcbiAgICAgICAgICBfY29udGV4dC5uZXh0ID0gNTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIDEzOlxuICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAxODtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIDE1OlxuICAgICAgICAgIF9jb250ZXh0LnByZXYgPSAxNTtcbiAgICAgICAgICBfY29udGV4dC50MCA9IF9jb250ZXh0W1wiY2F0Y2hcIl0oMyk7XG5cbiAgICAgICAgICBfaXRlcmF0b3IuZShfY29udGV4dC50MCk7XG5cbiAgICAgICAgY2FzZSAxODpcbiAgICAgICAgICBfY29udGV4dC5wcmV2ID0gMTg7XG5cbiAgICAgICAgICBfaXRlcmF0b3IuZigpO1xuXG4gICAgICAgICAgcmV0dXJuIF9jb250ZXh0LmZpbmlzaCgxOCk7XG5cbiAgICAgICAgY2FzZSAyMTpcbiAgICAgICAgY2FzZSBcImVuZFwiOlxuICAgICAgICAgIHJldHVybiBfY29udGV4dC5zdG9wKCk7XG4gICAgICB9XG4gICAgfVxuICB9LCBfbWFya2VkLCBudWxsLCBbWzMsIDE1LCAxOCwgMjFdXSk7XG59XG5cbmV4cG9ydHMuX193aW5kb3cgPSBfX3dpbmRvdztcbnZhciB3aW5kb3cgPSAvKiNfX1BVUkVfXyovaXRlcmFibGVDdXJyeShfX3dpbmRvdywge1xuICB2YWxpZGF0ZUFyZ3M6IGZ1bmN0aW9uIHZhbGlkYXRlQXJncyhhcmdzKSB7XG4gICAgaWYgKHR5cGVvZiBhcmdzWzFdICE9PSAnbnVtYmVyJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd3aW5kb3cnLmNvbmNhdChcIiBtdXN0IGJlIHBhc3NlZCBhIG51bWVyaWMgc2l6ZVwiKSk7XG4gICAgfVxuICB9XG59KTtcbmV4cG9ydHMud2luZG93ID0gd2luZG93OyIsInZhciBfcmVxdWlyZSA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFsL2FzeW5jLWl0ZXJhYmxlLmpzJyksXG4gICAgYXN5bmNXcmFwV2l0aEl0ZXJhYmxlSXRlcmF0b3IgPSBfcmVxdWlyZS5hc3luY1dyYXBXaXRoSXRlcmFibGVJdGVyYXRvcjtcblxudmFyIF9yZXF1aXJlMiA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFsL2FzeW5jLXdyYXAuanMnKSxcbiAgICBfX2FzeW5jV3JhcCA9IF9yZXF1aXJlMi5hc3luY051bGxhYmxlV3JhcDtcblxuZXhwb3J0cy5fX2FzeW5jV3JhcCA9IF9fYXN5bmNXcmFwO1xudmFyIGFzeW5jV3JhcCA9IC8qI19fUFVSRV9fKi9hc3luY1dyYXBXaXRoSXRlcmFibGVJdGVyYXRvcihfX2FzeW5jV3JhcCk7XG5leHBvcnRzLmFzeW5jV3JhcCA9IGFzeW5jV3JhcDsiLCJ2YXIgX3JlcXVpcmUgPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbC9pdGVyYWJsZS5qcycpLFxuICAgIHdyYXBXaXRoSXRlcmFibGVJdGVyYXRvciA9IF9yZXF1aXJlLndyYXBXaXRoSXRlcmFibGVJdGVyYXRvcjtcblxudmFyIF9yZXF1aXJlMiA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFsL3dyYXAuanMnKSxcbiAgICBfX3dyYXAgPSBfcmVxdWlyZTIubnVsbGFibGVXcmFwO1xuXG5leHBvcnRzLl9fd3JhcCA9IF9fd3JhcDtcbnZhciB3cmFwID0gLyojX19QVVJFX18qL3dyYXBXaXRoSXRlcmFibGVJdGVyYXRvcihfX3dyYXApO1xuZXhwb3J0cy53cmFwID0gd3JhcDsiLCJ2YXIgX3JlZ2VuZXJhdG9yUnVudGltZSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9yZWdlbmVyYXRvclwiKTtcblxudmFyIF9hd2FpdEFzeW5jR2VuZXJhdG9yID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvYXdhaXRBc3luY0dlbmVyYXRvclwiKTtcblxudmFyIF93cmFwQXN5bmNHZW5lcmF0b3IgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy93cmFwQXN5bmNHZW5lcmF0b3JcIik7XG5cbnZhciBfcmVxdWlyZSA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFsL2FzeW5jLWl0ZXJhYmxlLmpzJyksXG4gICAgYXN5bmNJdGVyYWJsZUN1cnJ5ID0gX3JlcXVpcmUuYXN5bmNJdGVyYWJsZUN1cnJ5O1xuXG52YXIgX3JlcXVpcmUyID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWwvYXN5bmMtcGFyYWxsZWwtZWFjaC5qcycpLFxuICAgIGFzeW5jUGFyYWxsZWxFYWNoID0gX3JlcXVpcmUyLmFzeW5jUGFyYWxsZWxFYWNoO1xuXG52YXIgX3JlcXVpcmUzID0gcmVxdWlyZSgnLi4vJHBlZWtlcmF0ZS9hc3luYy1wZWVrZXJhdGUuanMnKSxcbiAgICBfX2FzeW5jUGVla2VyYXRlID0gX3JlcXVpcmUzLl9fYXN5bmNQZWVrZXJhdGU7XG5cbnZhciBfcmVxdWlyZTQgPSByZXF1aXJlKCcuLi8kbWFwL2FzeW5jLW1hcC5qcycpLFxuICAgIF9fYXN5bmNNYXAgPSBfcmVxdWlyZTQuX19hc3luY01hcDtcblxudmFyIF9yZXF1aXJlNSA9IHJlcXVpcmUoJy4uLyRldmVyeS9ldmVyeS5qcycpLFxuICAgIF9fZXZlcnkgPSBfcmVxdWlyZTUuX19ldmVyeTtcblxudmFyIF9yZXF1aXJlNiA9IHJlcXVpcmUoJy4uLyR0by1hcnJheS9hc3luYy10by1hcnJheS5qcycpLFxuICAgIF9fYXN5bmNUb0FycmF5ID0gX3JlcXVpcmU2Ll9fYXN5bmNUb0FycmF5O1xuXG52YXIgaXNEb25lID0gZnVuY3Rpb24gaXNEb25lKHBlZWtyKSB7XG4gIHJldHVybiBwZWVrci5kb25lO1xufTtcblxuZnVuY3Rpb24gX19hc3luY1ppcEFsbChfeCkge1xuICByZXR1cm4gX2FzeW5jWmlwQWxsLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5cbmV4cG9ydHMuX19hc3luY1ppcEFsbCA9IF9fYXN5bmNaaXBBbGw7XG5cbmZ1bmN0aW9uIF9hc3luY1ppcEFsbCgpIHtcbiAgX2FzeW5jWmlwQWxsID0gX3dyYXBBc3luY0dlbmVyYXRvciggLyojX19QVVJFX18qL19yZWdlbmVyYXRvclJ1bnRpbWUubWFyayhmdW5jdGlvbiBfY2FsbGVlKHNvdXJjZXMpIHtcbiAgICB2YXIgX3JlZixcbiAgICAgICAgZmlsbGVyLFxuICAgICAgICBwZWVrcnMsXG4gICAgICAgIGRvbmUsXG4gICAgICAgIF9hcmdzID0gYXJndW1lbnRzO1xuXG4gICAgcmV0dXJuIF9yZWdlbmVyYXRvclJ1bnRpbWUud3JhcChmdW5jdGlvbiBfY2FsbGVlJChfY29udGV4dCkge1xuICAgICAgd2hpbGUgKDEpIHtcbiAgICAgICAgc3dpdGNoIChfY29udGV4dC5wcmV2ID0gX2NvbnRleHQubmV4dCkge1xuICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgIF9yZWYgPSBfYXJncy5sZW5ndGggPiAxICYmIF9hcmdzWzFdICE9PSB1bmRlZmluZWQgPyBfYXJnc1sxXSA6IHt9LCBmaWxsZXIgPSBfcmVmLmZpbGxlcjtcbiAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAzO1xuICAgICAgICAgICAgcmV0dXJuIF9hd2FpdEFzeW5jR2VuZXJhdG9yKF9fYXN5bmNUb0FycmF5KF9fYXN5bmNNYXAoc291cmNlcywgX19hc3luY1BlZWtlcmF0ZSkpKTtcblxuICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgIHBlZWtycyA9IF9jb250ZXh0LnNlbnQ7XG4gICAgICAgICAgICBkb25lID0gX19ldmVyeShwZWVrcnMsIGlzRG9uZSk7XG4gICAgICAgICAgICBfY29udGV4dC5wcmV2ID0gNTtcblxuICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgIGlmIChkb25lKSB7XG4gICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAxNDtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSA5O1xuICAgICAgICAgICAgcmV0dXJuIHBlZWtycy5tYXAoZnVuY3Rpb24gKF9yZWYyKSB7XG4gICAgICAgICAgICAgIHZhciB2YWx1ZSA9IF9yZWYyLnZhbHVlLFxuICAgICAgICAgICAgICAgICAgZG9uZSA9IF9yZWYyLmRvbmU7XG4gICAgICAgICAgICAgIHJldHVybiBkb25lID8gZmlsbGVyIDogdmFsdWU7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgIGNhc2UgOTpcbiAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAxMTtcbiAgICAgICAgICAgIHJldHVybiBfYXdhaXRBc3luY0dlbmVyYXRvcihhc3luY1BhcmFsbGVsRWFjaChwZWVrcnMsIGZ1bmN0aW9uIChwZWVrcikge1xuICAgICAgICAgICAgICByZXR1cm4gcGVla3IuYWR2YW5jZSgpO1xuICAgICAgICAgICAgfSkpO1xuXG4gICAgICAgICAgY2FzZSAxMTpcbiAgICAgICAgICAgIGRvbmUgPSBfX2V2ZXJ5KHBlZWtycywgaXNEb25lKTtcbiAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSA2O1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlIDE0OlxuICAgICAgICAgICAgX2NvbnRleHQucHJldiA9IDE0O1xuICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDE3O1xuICAgICAgICAgICAgcmV0dXJuIF9hd2FpdEFzeW5jR2VuZXJhdG9yKGFzeW5jUGFyYWxsZWxFYWNoKHBlZWtycywgZnVuY3Rpb24gKHBlZWtyKSB7XG4gICAgICAgICAgICAgIHJldHVybiBwZWVrcltcInJldHVyblwiXSgpO1xuICAgICAgICAgICAgfSkpO1xuXG4gICAgICAgICAgY2FzZSAxNzpcbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5maW5pc2goMTQpO1xuXG4gICAgICAgICAgY2FzZSAxODpcbiAgICAgICAgICBjYXNlIFwiZW5kXCI6XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuc3RvcCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwgX2NhbGxlZSwgbnVsbCwgW1s1LCwgMTQsIDE4XV0pO1xuICB9KSk7XG4gIHJldHVybiBfYXN5bmNaaXBBbGwuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cblxudmFyIGFzeW5jWmlwQWxsID0gLyojX19QVVJFX18qL2FzeW5jSXRlcmFibGVDdXJyeShfX2FzeW5jWmlwQWxsLCB7XG4gIHZhcmlhZGljOiB0cnVlLFxuICBtaW5BcmdzOiAwLFxuICBtYXhBcmdzOiAxXG59KTtcbmV4cG9ydHMuYXN5bmNaaXBBbGwgPSBhc3luY1ppcEFsbDsiLCJ2YXIgX3JlZ2VuZXJhdG9yUnVudGltZSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9yZWdlbmVyYXRvclwiKTtcblxudmFyIF9tYXJrZWQgPSAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yUnVudGltZS5tYXJrKF9femlwQWxsKTtcblxudmFyIF9yZXF1aXJlID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWwvaXRlcmFibGUuanMnKSxcbiAgICBpdGVyYWJsZUN1cnJ5ID0gX3JlcXVpcmUuaXRlcmFibGVDdXJyeTtcblxudmFyIF9yZXF1aXJlMiA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFsL3BhcmFsbGVsLWVhY2guanMnKSxcbiAgICBwYXJhbGxlbEVhY2ggPSBfcmVxdWlyZTIucGFyYWxsZWxFYWNoO1xuXG52YXIgX3JlcXVpcmUzID0gcmVxdWlyZSgnLi4vJHBlZWtlcmF0ZS9wZWVrZXJhdGUuanMnKSxcbiAgICBfX3BlZWtlcmF0ZSA9IF9yZXF1aXJlMy5fX3BlZWtlcmF0ZTtcblxudmFyIF9yZXF1aXJlNCA9IHJlcXVpcmUoJy4uLyRtYXAvbWFwLmpzJyksXG4gICAgX19tYXAgPSBfcmVxdWlyZTQuX19tYXA7XG5cbnZhciBfcmVxdWlyZTUgPSByZXF1aXJlKCcuLi8kZXZlcnkvZXZlcnkuanMnKSxcbiAgICBfX2V2ZXJ5ID0gX3JlcXVpcmU1Ll9fZXZlcnk7XG5cbnZhciBfcmVxdWlyZTYgPSByZXF1aXJlKCcuLi8kdG8tYXJyYXkvdG8tYXJyYXkuanMnKSxcbiAgICBfX3RvQXJyYXkgPSBfcmVxdWlyZTYuX190b0FycmF5O1xuXG52YXIgaXNEb25lID0gZnVuY3Rpb24gaXNEb25lKHBlZWtyKSB7XG4gIHJldHVybiBwZWVrci5kb25lO1xufTtcblxuZnVuY3Rpb24gX196aXBBbGwoc291cmNlcykge1xuICB2YXIgX3JlZixcbiAgICAgIGZpbGxlcixcbiAgICAgIHBlZWtycyxcbiAgICAgIGRvbmUsXG4gICAgICBfYXJncyA9IGFyZ3VtZW50cztcblxuICByZXR1cm4gX3JlZ2VuZXJhdG9yUnVudGltZS53cmFwKGZ1bmN0aW9uIF9femlwQWxsJChfY29udGV4dCkge1xuICAgIHdoaWxlICgxKSB7XG4gICAgICBzd2l0Y2ggKF9jb250ZXh0LnByZXYgPSBfY29udGV4dC5uZXh0KSB7XG4gICAgICAgIGNhc2UgMDpcbiAgICAgICAgICBfcmVmID0gX2FyZ3MubGVuZ3RoID4gMSAmJiBfYXJnc1sxXSAhPT0gdW5kZWZpbmVkID8gX2FyZ3NbMV0gOiB7fSwgZmlsbGVyID0gX3JlZi5maWxsZXI7XG4gICAgICAgICAgcGVla3JzID0gX190b0FycmF5KF9fbWFwKHNvdXJjZXMsIF9fcGVla2VyYXRlKSk7XG4gICAgICAgICAgZG9uZSA9IF9fZXZlcnkocGVla3JzLCBpc0RvbmUpO1xuICAgICAgICAgIF9jb250ZXh0LnByZXYgPSAzO1xuXG4gICAgICAgIGNhc2UgNDpcbiAgICAgICAgICBpZiAoZG9uZSkge1xuICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDExO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgX2NvbnRleHQubmV4dCA9IDc7XG4gICAgICAgICAgcmV0dXJuIHBlZWtycy5tYXAoZnVuY3Rpb24gKF9yZWYyKSB7XG4gICAgICAgICAgICB2YXIgdmFsdWUgPSBfcmVmMi52YWx1ZSxcbiAgICAgICAgICAgICAgICBkb25lID0gX3JlZjIuZG9uZTtcbiAgICAgICAgICAgIHJldHVybiBkb25lID8gZmlsbGVyIDogdmFsdWU7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgY2FzZSA3OlxuICAgICAgICAgIHBhcmFsbGVsRWFjaChwZWVrcnMsIGZ1bmN0aW9uIChwZWVrcikge1xuICAgICAgICAgICAgcmV0dXJuIHBlZWtyLmFkdmFuY2UoKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBkb25lID0gX19ldmVyeShwZWVrcnMsIGlzRG9uZSk7XG4gICAgICAgICAgX2NvbnRleHQubmV4dCA9IDQ7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAxMTpcbiAgICAgICAgICBfY29udGV4dC5wcmV2ID0gMTE7XG4gICAgICAgICAgcGFyYWxsZWxFYWNoKHBlZWtycywgZnVuY3Rpb24gKHBlZWtyKSB7XG4gICAgICAgICAgICByZXR1cm4gcGVla3JbXCJyZXR1cm5cIl0oKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gX2NvbnRleHQuZmluaXNoKDExKTtcblxuICAgICAgICBjYXNlIDE0OlxuICAgICAgICBjYXNlIFwiZW5kXCI6XG4gICAgICAgICAgcmV0dXJuIF9jb250ZXh0LnN0b3AoKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIF9tYXJrZWQsIG51bGwsIFtbMywsIDExLCAxNF1dKTtcbn1cblxuZXhwb3J0cy5fX3ppcEFsbCA9IF9femlwQWxsO1xudmFyIHppcEFsbCA9IC8qI19fUFVSRV9fKi9pdGVyYWJsZUN1cnJ5KF9femlwQWxsLCB7XG4gIHZhcmlhZGljOiB0cnVlLFxuICBtaW5BcmdzOiAwLFxuICBtYXhBcmdzOiAxXG59KTtcbmV4cG9ydHMuemlwQWxsID0gemlwQWxsOyIsInZhciBfcmVnZW5lcmF0b3JSdW50aW1lID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL3JlZ2VuZXJhdG9yXCIpO1xuXG52YXIgX2F3YWl0QXN5bmNHZW5lcmF0b3IgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9hd2FpdEFzeW5jR2VuZXJhdG9yXCIpO1xuXG52YXIgX3dyYXBBc3luY0dlbmVyYXRvciA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3dyYXBBc3luY0dlbmVyYXRvclwiKTtcblxudmFyIF9yZXF1aXJlID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWwvYXN5bmMtaXRlcmFibGUuanMnKSxcbiAgICBhc3luY0l0ZXJhYmxlQ3VycnkgPSBfcmVxdWlyZS5hc3luY0l0ZXJhYmxlQ3Vycnk7XG5cbnZhciBfcmVxdWlyZTIgPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbC9hc3luYy1wYXJhbGxlbC1lYWNoLmpzJyksXG4gICAgYXN5bmNQYXJhbGxlbEVhY2ggPSBfcmVxdWlyZTIuYXN5bmNQYXJhbGxlbEVhY2g7XG5cbnZhciBfcmVxdWlyZTMgPSByZXF1aXJlKCcuLi8kcGVla2VyYXRlL2FzeW5jLXBlZWtlcmF0ZS5qcycpLFxuICAgIF9fYXN5bmNQZWVrZXJhdGUgPSBfcmVxdWlyZTMuX19hc3luY1BlZWtlcmF0ZTtcblxudmFyIF9yZXF1aXJlNCA9IHJlcXVpcmUoJy4uLyRtYXAvYXN5bmMtbWFwLmpzJyksXG4gICAgX19hc3luY01hcCA9IF9yZXF1aXJlNC5fX2FzeW5jTWFwO1xuXG52YXIgX3JlcXVpcmU1ID0gcmVxdWlyZSgnLi4vJG1hcC9tYXAuanMnKSxcbiAgICBfX21hcCA9IF9yZXF1aXJlNS5fX21hcDtcblxudmFyIF9yZXF1aXJlNiA9IHJlcXVpcmUoJy4uLyRzb21lL3NvbWUuanMnKSxcbiAgICBfX3NvbWUgPSBfcmVxdWlyZTYuX19zb21lO1xuXG52YXIgX3JlcXVpcmU3ID0gcmVxdWlyZSgnLi4vJHRvLWFycmF5L2FzeW5jLXRvLWFycmF5LmpzJyksXG4gICAgX19hc3luY1RvQXJyYXkgPSBfcmVxdWlyZTcuX19hc3luY1RvQXJyYXk7XG5cbnZhciBpc0RvbmUgPSBmdW5jdGlvbiBpc0RvbmUocGVla3IpIHtcbiAgcmV0dXJuIHBlZWtyLmRvbmU7XG59O1xuXG5mdW5jdGlvbiBfX2FzeW5jWmlwKF94KSB7XG4gIHJldHVybiBfYXN5bmNaaXAuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cblxuZXhwb3J0cy5fX2FzeW5jWmlwID0gX19hc3luY1ppcDtcblxuZnVuY3Rpb24gX2FzeW5jWmlwKCkge1xuICBfYXN5bmNaaXAgPSBfd3JhcEFzeW5jR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yUnVudGltZS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUoc291cmNlcykge1xuICAgIHZhciBwZWVrcnMsIGRvbmU7XG4gICAgcmV0dXJuIF9yZWdlbmVyYXRvclJ1bnRpbWUud3JhcChmdW5jdGlvbiBfY2FsbGVlJChfY29udGV4dCkge1xuICAgICAgd2hpbGUgKDEpIHtcbiAgICAgICAgc3dpdGNoIChfY29udGV4dC5wcmV2ID0gX2NvbnRleHQubmV4dCkge1xuICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAyO1xuICAgICAgICAgICAgcmV0dXJuIF9hd2FpdEFzeW5jR2VuZXJhdG9yKF9fYXN5bmNUb0FycmF5KF9fYXN5bmNNYXAoc291cmNlcywgX19hc3luY1BlZWtlcmF0ZSkpKTtcblxuICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgIHBlZWtycyA9IF9jb250ZXh0LnNlbnQ7XG4gICAgICAgICAgICBkb25lID0gX19zb21lKHBlZWtycywgaXNEb25lKTtcbiAgICAgICAgICAgIF9jb250ZXh0LnByZXYgPSA0O1xuXG4gICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgaWYgKGRvbmUpIHtcbiAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDEzO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDg7XG4gICAgICAgICAgICByZXR1cm4gcGVla3JzLm1hcChmdW5jdGlvbiAoX3JlZikge1xuICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBfcmVmLnZhbHVlO1xuICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgIGNhc2UgODpcbiAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAxMDtcbiAgICAgICAgICAgIHJldHVybiBfYXdhaXRBc3luY0dlbmVyYXRvcihQcm9taXNlLmFsbChfX21hcChwZWVrcnMsIGZ1bmN0aW9uIChwZWVrcikge1xuICAgICAgICAgICAgICByZXR1cm4gcGVla3IuYWR2YW5jZSgpO1xuICAgICAgICAgICAgfSkpKTtcblxuICAgICAgICAgIGNhc2UgMTA6XG4gICAgICAgICAgICBkb25lID0gX19zb21lKHBlZWtycywgaXNEb25lKTtcbiAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSA1O1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlIDEzOlxuICAgICAgICAgICAgX2NvbnRleHQucHJldiA9IDEzO1xuICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDE2O1xuICAgICAgICAgICAgcmV0dXJuIF9hd2FpdEFzeW5jR2VuZXJhdG9yKGFzeW5jUGFyYWxsZWxFYWNoKHBlZWtycywgZnVuY3Rpb24gKHBlZWtyKSB7XG4gICAgICAgICAgICAgIHJldHVybiBwZWVrcltcInJldHVyblwiXSgpO1xuICAgICAgICAgICAgfSkpO1xuXG4gICAgICAgICAgY2FzZSAxNjpcbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5maW5pc2goMTMpO1xuXG4gICAgICAgICAgY2FzZSAxNzpcbiAgICAgICAgICBjYXNlIFwiZW5kXCI6XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuc3RvcCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwgX2NhbGxlZSwgbnVsbCwgW1s0LCwgMTMsIDE3XV0pO1xuICB9KSk7XG4gIHJldHVybiBfYXN5bmNaaXAuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cblxudmFyIGFzeW5jWmlwID0gLyojX19QVVJFX18qL2FzeW5jSXRlcmFibGVDdXJyeShfX2FzeW5jWmlwLCB7XG4gIHZhcmlhZGljOiB0cnVlXG59KTtcbmV4cG9ydHMuYXN5bmNaaXAgPSBhc3luY1ppcDsiLCJ2YXIgX3JlZ2VuZXJhdG9yUnVudGltZSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9yZWdlbmVyYXRvclwiKTtcblxudmFyIF9tYXJrZWQgPSAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yUnVudGltZS5tYXJrKF9femlwKTtcblxuZnVuY3Rpb24gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIobywgYWxsb3dBcnJheUxpa2UpIHsgdmFyIGl0OyBpZiAodHlwZW9mIFN5bWJvbCA9PT0gXCJ1bmRlZmluZWRcIiB8fCBvW1N5bWJvbC5pdGVyYXRvcl0gPT0gbnVsbCkgeyBpZiAoQXJyYXkuaXNBcnJheShvKSB8fCAoaXQgPSBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkobykpIHx8IGFsbG93QXJyYXlMaWtlICYmIG8gJiYgdHlwZW9mIG8ubGVuZ3RoID09PSBcIm51bWJlclwiKSB7IGlmIChpdCkgbyA9IGl0OyB2YXIgaSA9IDA7IHZhciBGID0gZnVuY3Rpb24gRigpIHt9OyByZXR1cm4geyBzOiBGLCBuOiBmdW5jdGlvbiBuKCkgeyBpZiAoaSA+PSBvLmxlbmd0aCkgcmV0dXJuIHsgZG9uZTogdHJ1ZSB9OyByZXR1cm4geyBkb25lOiBmYWxzZSwgdmFsdWU6IG9baSsrXSB9OyB9LCBlOiBmdW5jdGlvbiBlKF9lKSB7IHRocm93IF9lOyB9LCBmOiBGIH07IH0gdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBpdGVyYXRlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpOyB9IHZhciBub3JtYWxDb21wbGV0aW9uID0gdHJ1ZSwgZGlkRXJyID0gZmFsc2UsIGVycjsgcmV0dXJuIHsgczogZnVuY3Rpb24gcygpIHsgaXQgPSBvW1N5bWJvbC5pdGVyYXRvcl0oKTsgfSwgbjogZnVuY3Rpb24gbigpIHsgdmFyIHN0ZXAgPSBpdC5uZXh0KCk7IG5vcm1hbENvbXBsZXRpb24gPSBzdGVwLmRvbmU7IHJldHVybiBzdGVwOyB9LCBlOiBmdW5jdGlvbiBlKF9lMikgeyBkaWRFcnIgPSB0cnVlOyBlcnIgPSBfZTI7IH0sIGY6IGZ1bmN0aW9uIGYoKSB7IHRyeSB7IGlmICghbm9ybWFsQ29tcGxldGlvbiAmJiBpdFtcInJldHVyblwiXSAhPSBudWxsKSBpdFtcInJldHVyblwiXSgpOyB9IGZpbmFsbHkgeyBpZiAoZGlkRXJyKSB0aHJvdyBlcnI7IH0gfSB9OyB9XG5cbmZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvLCBtaW5MZW4pIHsgaWYgKCFvKSByZXR1cm47IGlmICh0eXBlb2YgbyA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IHZhciBuID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pLnNsaWNlKDgsIC0xKTsgaWYgKG4gPT09IFwiT2JqZWN0XCIgJiYgby5jb25zdHJ1Y3RvcikgbiA9IG8uY29uc3RydWN0b3IubmFtZTsgaWYgKG4gPT09IFwiTWFwXCIgfHwgbiA9PT0gXCJTZXRcIikgcmV0dXJuIEFycmF5LmZyb20obyk7IGlmIChuID09PSBcIkFyZ3VtZW50c1wiIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTsgfVxuXG5mdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheShhcnIsIGxlbikgeyBpZiAobGVuID09IG51bGwgfHwgbGVuID4gYXJyLmxlbmd0aCkgbGVuID0gYXJyLmxlbmd0aDsgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkobGVuKTsgaSA8IGxlbjsgaSsrKSB7IGFycjJbaV0gPSBhcnJbaV07IH0gcmV0dXJuIGFycjI7IH1cblxudmFyIF9yZXF1aXJlID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWwvaXRlcmFibGUuanMnKSxcbiAgICBpdGVyYWJsZUN1cnJ5ID0gX3JlcXVpcmUuaXRlcmFibGVDdXJyeTtcblxudmFyIF9yZXF1aXJlMiA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFsL3BhcmFsbGVsLWVhY2guanMnKSxcbiAgICBwYXJhbGxlbEVhY2ggPSBfcmVxdWlyZTIucGFyYWxsZWxFYWNoO1xuXG52YXIgX3JlcXVpcmUzID0gcmVxdWlyZSgnLi4vJHBlZWtlcmF0ZS9wZWVrZXJhdGUuanMnKSxcbiAgICBfX3BlZWtlcmF0ZSA9IF9yZXF1aXJlMy5fX3BlZWtlcmF0ZTtcblxudmFyIF9yZXF1aXJlNCA9IHJlcXVpcmUoJy4uLyRtYXAvbWFwLmpzJyksXG4gICAgX19tYXAgPSBfcmVxdWlyZTQuX19tYXA7XG5cbnZhciBfcmVxdWlyZTUgPSByZXF1aXJlKCcuLi8kc29tZS9zb21lLmpzJyksXG4gICAgX19zb21lID0gX3JlcXVpcmU1Ll9fc29tZTtcblxudmFyIF9yZXF1aXJlNiA9IHJlcXVpcmUoJy4uLyR0by1hcnJheS90by1hcnJheS5qcycpLFxuICAgIF9fdG9BcnJheSA9IF9yZXF1aXJlNi5fX3RvQXJyYXk7XG5cbnZhciBpc0RvbmUgPSBmdW5jdGlvbiBpc0RvbmUocGVla3IpIHtcbiAgcmV0dXJuIHBlZWtyLmRvbmU7XG59O1xuXG5mdW5jdGlvbiBfX3ppcChzb3VyY2VzKSB7XG4gIHZhciBwZWVrcnMsIGRvbmUsIF9pdGVyYXRvciwgX3N0ZXAsIHBlZWtyO1xuXG4gIHJldHVybiBfcmVnZW5lcmF0b3JSdW50aW1lLndyYXAoZnVuY3Rpb24gX196aXAkKF9jb250ZXh0KSB7XG4gICAgd2hpbGUgKDEpIHtcbiAgICAgIHN3aXRjaCAoX2NvbnRleHQucHJldiA9IF9jb250ZXh0Lm5leHQpIHtcbiAgICAgICAgY2FzZSAwOlxuICAgICAgICAgIHBlZWtycyA9IF9fdG9BcnJheShfX21hcChzb3VyY2VzLCBfX3BlZWtlcmF0ZSkpO1xuICAgICAgICAgIGRvbmUgPSBfX3NvbWUocGVla3JzLCBpc0RvbmUpO1xuICAgICAgICAgIF9jb250ZXh0LnByZXYgPSAyO1xuXG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgICBpZiAoZG9uZSkge1xuICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDExO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgX2NvbnRleHQubmV4dCA9IDY7XG4gICAgICAgICAgcmV0dXJuIHBlZWtycy5tYXAoZnVuY3Rpb24gKF9yZWYpIHtcbiAgICAgICAgICAgIHZhciB2YWx1ZSA9IF9yZWYudmFsdWU7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgY2FzZSA2OlxuICAgICAgICAgIF9pdGVyYXRvciA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKHBlZWtycyk7XG5cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgZm9yIChfaXRlcmF0b3IucygpOyAhKF9zdGVwID0gX2l0ZXJhdG9yLm4oKSkuZG9uZTspIHtcbiAgICAgICAgICAgICAgcGVla3IgPSBfc3RlcC52YWx1ZTtcbiAgICAgICAgICAgICAgcGVla3IuYWR2YW5jZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgX2l0ZXJhdG9yLmUoZXJyKTtcbiAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgX2l0ZXJhdG9yLmYoKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBkb25lID0gX19zb21lKHBlZWtycywgaXNEb25lKTtcbiAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMztcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIDExOlxuICAgICAgICAgIF9jb250ZXh0LnByZXYgPSAxMTtcbiAgICAgICAgICBwYXJhbGxlbEVhY2gocGVla3JzLCBmdW5jdGlvbiAocGVla3IpIHtcbiAgICAgICAgICAgIHJldHVybiBwZWVrcltcInJldHVyblwiXSgpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiBfY29udGV4dC5maW5pc2goMTEpO1xuXG4gICAgICAgIGNhc2UgMTQ6XG4gICAgICAgIGNhc2UgXCJlbmRcIjpcbiAgICAgICAgICByZXR1cm4gX2NvbnRleHQuc3RvcCgpO1xuICAgICAgfVxuICAgIH1cbiAgfSwgX21hcmtlZCwgbnVsbCwgW1syLCwgMTEsIDE0XV0pO1xufVxuXG5leHBvcnRzLl9femlwID0gX196aXA7XG52YXIgemlwID0gLyojX19QVVJFX18qL2l0ZXJhYmxlQ3VycnkoX196aXAsIHtcbiAgdmFyaWFkaWM6IHRydWVcbn0pO1xuZXhwb3J0cy56aXAgPSB6aXA7IiwidmFyIF90b0NvbnN1bWFibGVBcnJheSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3RvQ29uc3VtYWJsZUFycmF5XCIpO1xuXG52YXIgX3JlcXVpcmUgPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbC9jdXJyeS5qcycpLFxuICAgIGN1cnJ5ID0gX3JlcXVpcmUuY3Vycnk7XG5cbmZ1bmN0aW9uIF9fYXBwbHkoZm4pIHtcbiAgdmFyIGFyZ3MgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IFtdO1xuICByZXR1cm4gZm4uYXBwbHkodm9pZCAwLCBfdG9Db25zdW1hYmxlQXJyYXkoYXJncyA9PT0gbnVsbCA/IFtdIDogYXJncykpO1xufVxuXG5leHBvcnRzLl9fYXBwbHkgPSBfX2FwcGx5O1xudmFyIGFwcGx5ID0gLyojX19QVVJFX18qL2N1cnJ5KF9fYXBwbHksIDIpO1xuZXhwb3J0cy5hcHBseSA9IGFwcGx5OyIsImZ1bmN0aW9uIGFycmF5Rmlyc3RPcih3aGVuRW1wdHksIGFycmF5KSB7XG4gIHJldHVybiBhcnJheSAmJiBhcnJheS5sZW5ndGggPyBhcnJheVswXSA6IHdoZW5FbXB0eTtcbn1cblxuZXhwb3J0cy5hcnJheUZpcnN0T3IgPSBhcnJheUZpcnN0T3I7IiwiZnVuY3Rpb24gYXJyYXlGaXJzdChhcnJheSkge1xuICByZXR1cm4gYXJyYXkgIT0gbnVsbCA/IGFycmF5WzBdIDogdW5kZWZpbmVkO1xufVxuXG5leHBvcnRzLmFycmF5Rmlyc3QgPSBhcnJheUZpcnN0OyIsImV4cG9ydHMuX19hcnJheUZyb21Bc3luYyA9IHJlcXVpcmUoJy4uLyR0by1hcnJheS9hc3luYy10by1hcnJheS5qcycpLl9fYXN5bmNUb0FycmF5O1xuZXhwb3J0cy5hcnJheUZyb21Bc3luYyA9IHJlcXVpcmUoJy4uLyR0by1hcnJheS9hc3luYy10by1hcnJheS5qcycpLmFzeW5jVG9BcnJheTsiLCJleHBvcnRzLl9fYXJyYXlGcm9tID0gcmVxdWlyZSgnLi4vJHRvLWFycmF5L3RvLWFycmF5LmpzJykuX190b0FycmF5O1xuZXhwb3J0cy5hcnJheUZyb20gPSByZXF1aXJlKCcuLi8kdG8tYXJyYXkvdG8tYXJyYXkuanMnKS50b0FycmF5OyIsImZ1bmN0aW9uIGFycmF5TGFzdE9yKHdoZW5FbXB0eSwgYXJyYXkpIHtcbiAgcmV0dXJuIGFycmF5ICYmIGFycmF5Lmxlbmd0aCA/IGFycmF5W2FycmF5Lmxlbmd0aCAtIDFdIDogd2hlbkVtcHR5O1xufVxuXG5leHBvcnRzLmFycmF5TGFzdE9yID0gYXJyYXlMYXN0T3I7IiwiZnVuY3Rpb24gYXJyYXlMYXN0KGFycmF5KSB7XG4gIHJldHVybiBhcnJheSA/IGFycmF5W2FycmF5Lmxlbmd0aCAtIDFdIDogdW5kZWZpbmVkO1xufVxuXG5leHBvcnRzLmFycmF5TGFzdCA9IGFycmF5TGFzdDsiLCJ2YXIgX3JlZ2VuZXJhdG9yUnVudGltZSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9yZWdlbmVyYXRvclwiKTtcblxudmFyIF9tYXJrZWQgPSAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yUnVudGltZS5tYXJrKF9fYXJyYXlSZXZlcnNlKTtcblxudmFyIF9yZXF1aXJlID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWwvaXRlcmFibGUuanMnKSxcbiAgICB3cmFwV2l0aEl0ZXJhYmxlSXRlcmF0b3IgPSBfcmVxdWlyZS53cmFwV2l0aEl0ZXJhYmxlSXRlcmF0b3I7XG5cbmZ1bmN0aW9uIF9fYXJyYXlSZXZlcnNlKHNvdXJjZSkge1xuICB2YXIgaTtcbiAgcmV0dXJuIF9yZWdlbmVyYXRvclJ1bnRpbWUud3JhcChmdW5jdGlvbiBfX2FycmF5UmV2ZXJzZSQoX2NvbnRleHQpIHtcbiAgICB3aGlsZSAoMSkge1xuICAgICAgc3dpdGNoIChfY29udGV4dC5wcmV2ID0gX2NvbnRleHQubmV4dCkge1xuICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgaWYgKCEoc291cmNlID09IG51bGwpKSB7XG4gICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMjtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBfY29udGV4dC5hYnJ1cHQoXCJyZXR1cm5cIik7XG5cbiAgICAgICAgY2FzZSAyOlxuICAgICAgICAgIGkgPSBzb3VyY2UubGVuZ3RoIC0gMTtcblxuICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgaWYgKCEoaSA+PSAwKSkge1xuICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBfY29udGV4dC5uZXh0ID0gNjtcbiAgICAgICAgICByZXR1cm4gc291cmNlW2ldO1xuXG4gICAgICAgIGNhc2UgNjpcbiAgICAgICAgICBpLS07XG4gICAgICAgICAgX2NvbnRleHQubmV4dCA9IDM7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSA5OlxuICAgICAgICBjYXNlIFwiZW5kXCI6XG4gICAgICAgICAgcmV0dXJuIF9jb250ZXh0LnN0b3AoKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIF9tYXJrZWQpO1xufVxuXG5leHBvcnRzLl9fYXJyYXlSZXZlcnNlID0gX19hcnJheVJldmVyc2U7XG52YXIgYXJyYXlSZXZlcnNlID0gLyojX19QVVJFX18qL3dyYXBXaXRoSXRlcmFibGVJdGVyYXRvcihfX2FycmF5UmV2ZXJzZSwge1xuICB2YWxpZGF0ZUFyZ3M6IGZ1bmN0aW9uIHZhbGlkYXRlQXJncyhhcmdzKSB7XG4gICAgaWYgKCEoQXJyYXkuaXNBcnJheShhcmdzWzBdKSB8fCB0eXBlb2YgYXJnc1swXSA9PT0gJ3N0cmluZycgfHwgYXJnc1swXSA9PSBudWxsKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdhcnJheVJldmVyc2Ugb25seSB3b3JrcyBhcnJheXMgYW5kIHN0cmluZ3MnKTtcbiAgICB9XG4gIH1cbn0pO1xuZXhwb3J0cy5hcnJheVJldmVyc2UgPSBhcnJheVJldmVyc2U7IiwidmFyIF9hc3luY1RvR2VuZXJhdG9yID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvYXN5bmNUb0dlbmVyYXRvclwiKTtcblxudmFyIF9jbGFzc0NhbGxDaGVjayA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrXCIpO1xuXG52YXIgX2NyZWF0ZUNsYXNzID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY3JlYXRlQ2xhc3NcIik7XG5cbnZhciBfaW5oZXJpdHMgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbmhlcml0c1wiKTtcblxudmFyIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvcG9zc2libGVDb25zdHJ1Y3RvclJldHVyblwiKTtcblxudmFyIF9nZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2dldFByb3RvdHlwZU9mXCIpO1xuXG52YXIgX3JlZ2VuZXJhdG9yUnVudGltZSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9yZWdlbmVyYXRvclwiKTtcblxuZnVuY3Rpb24gX2NyZWF0ZVN1cGVyKERlcml2ZWQpIHsgdmFyIGhhc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QgPSBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCk7IHJldHVybiBmdW5jdGlvbiBfY3JlYXRlU3VwZXJJbnRlcm5hbCgpIHsgdmFyIFN1cGVyID0gX2dldFByb3RvdHlwZU9mKERlcml2ZWQpLCByZXN1bHQ7IGlmIChoYXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KSB7IHZhciBOZXdUYXJnZXQgPSBfZ2V0UHJvdG90eXBlT2YodGhpcykuY29uc3RydWN0b3I7IHJlc3VsdCA9IFJlZmxlY3QuY29uc3RydWN0KFN1cGVyLCBhcmd1bWVudHMsIE5ld1RhcmdldCk7IH0gZWxzZSB7IHJlc3VsdCA9IFN1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH0gcmV0dXJuIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIHJlc3VsdCk7IH07IH1cblxuZnVuY3Rpb24gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpIHsgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcInVuZGVmaW5lZFwiIHx8ICFSZWZsZWN0LmNvbnN0cnVjdCkgcmV0dXJuIGZhbHNlOyBpZiAoUmVmbGVjdC5jb25zdHJ1Y3Quc2hhbSkgcmV0dXJuIGZhbHNlOyBpZiAodHlwZW9mIFByb3h5ID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiB0cnVlOyB0cnkgeyBEYXRlLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKFJlZmxlY3QuY29uc3RydWN0KERhdGUsIFtdLCBmdW5jdGlvbiAoKSB7fSkpOyByZXR1cm4gdHJ1ZTsgfSBjYXRjaCAoZSkgeyByZXR1cm4gZmFsc2U7IH0gfVxuXG52YXIgX2F3YWl0QXN5bmNHZW5lcmF0b3IgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9hd2FpdEFzeW5jR2VuZXJhdG9yXCIpO1xuXG52YXIgX3dyYXBBc3luY0dlbmVyYXRvciA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3dyYXBBc3luY0dlbmVyYXRvclwiKTtcblxudmFyIF9yZXF1aXJlID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWwvY3VycnkuanMnKSxcbiAgICBjdXJyeSA9IF9yZXF1aXJlLmN1cnJ5O1xuXG52YXIgX3JlcXVpcmUyID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWwvYXN5bmMtaXRlcmFibGUuanMnKSxcbiAgICBhc3luY0NhbGxSZXR1cm4gPSBfcmVxdWlyZTIuYXN5bmNDYWxsUmV0dXJuO1xuXG52YXIgX3JlcXVpcmUzID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWwvYXN5bmMtaXRlcmFibGUtaXRlcmF0b3IuanMnKSxcbiAgICBBc3luY0l0ZXJhYmxlSXRlcmF0b3IgPSBfcmVxdWlyZTMuQXN5bmNJdGVyYWJsZUl0ZXJhdG9yO1xuXG52YXIgX3JlcXVpcmU0ID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWwvY2lyY3VsYXItYnVmZmVyLmpzJyksXG4gICAgQ2lyY3VsYXJCdWZmZXIgPSBfcmVxdWlyZTQuQ2lyY3VsYXJCdWZmZXI7XG5cbnZhciBfcmVxdWlyZTUgPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbC9udW1iZXIuanMnKSxcbiAgICBpc1Bvc2l0aXZlSW50ZWdlciA9IF9yZXF1aXJlNS5pc1Bvc2l0aXZlSW50ZWdlcjtcblxudmFyIF9yZXF1aXJlNiA9IHJlcXVpcmUoJy4uL2lzLWFzeW5jLWl0ZXJhYmxlL2lzLWFzeW5jLWl0ZXJhYmxlLmpzJyksXG4gICAgaXNBc3luY0l0ZXJhYmxlID0gX3JlcXVpcmU2LmlzQXN5bmNJdGVyYWJsZTtcblxudmFyIF9yZXF1aXJlNyA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFsL2l0ZXJhYmxlLmpzJyksXG4gICAgaXNJdGVyYWJsZSA9IF9yZXF1aXJlNy5pc0l0ZXJhYmxlO1xuXG5mdW5jdGlvbiBlbXB0eSgpIHtcbiAgcmV0dXJuIF9lbXB0eS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuXG5mdW5jdGlvbiBfZW1wdHkoKSB7XG4gIF9lbXB0eSA9IF93cmFwQXN5bmNHZW5lcmF0b3IoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3JSdW50aW1lLm1hcmsoZnVuY3Rpb24gX2NhbGxlZSgpIHtcbiAgICByZXR1cm4gX3JlZ2VuZXJhdG9yUnVudGltZS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUkKF9jb250ZXh0KSB7XG4gICAgICB3aGlsZSAoMSkge1xuICAgICAgICBzd2l0Y2ggKF9jb250ZXh0LnByZXYgPSBfY29udGV4dC5uZXh0KSB7XG4gICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgIGNhc2UgXCJlbmRcIjpcbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5zdG9wKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCBfY2FsbGVlKTtcbiAgfSkpO1xuICByZXR1cm4gX2VtcHR5LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5cbmZ1bmN0aW9uIGdldEl0ZXJhdG9yKGl0ZXJhYmxlKSB7XG4gIGlmIChpdGVyYWJsZSA9PSBudWxsKSB7XG4gICAgcmV0dXJuIGVtcHR5KCk7XG4gIH0gZWxzZSBpZiAoaXNBc3luY0l0ZXJhYmxlKGl0ZXJhYmxlKSkge1xuICAgIHJldHVybiBpdGVyYWJsZVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKTtcbiAgfSBlbHNlIGlmIChpc0l0ZXJhYmxlKGl0ZXJhYmxlKSkge1xuICAgIHJldHVybiBpdGVyYWJsZVtTeW1ib2wuaXRlcmF0b3JdKCk7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiYXN5bmNCdWZmZXIgZXhwZWN0ZWQgYW4gaXRlcmFibGUgYnV0IHJlY2VpdmVkIFwiLmNvbmNhdChpdGVyYWJsZSwgXCIuXCIpKTtcbiAgfVxufVxuXG52YXIgQnVmZmVyYXRvciA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX0FzeW5jSXRlcmFibGVJdGVyYXRvKSB7XG4gIF9pbmhlcml0cyhCdWZmZXJhdG9yLCBfQXN5bmNJdGVyYWJsZUl0ZXJhdG8pO1xuXG4gIHZhciBfc3VwZXIgPSBfY3JlYXRlU3VwZXIoQnVmZmVyYXRvcik7XG5cbiAgZnVuY3Rpb24gQnVmZmVyYXRvcihpdGVyYWJsZSwgY29uY3VycmVuY3kpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgQnVmZmVyYXRvcik7XG5cbiAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMpO1xuICAgIF90aGlzLml0ZXJhdG9yID0gZ2V0SXRlcmF0b3IoaXRlcmFibGUpO1xuICAgIF90aGlzLmJ1ZmZlciA9IG5ldyBDaXJjdWxhckJ1ZmZlcihjb25jdXJyZW5jeSk7XG5cbiAgICB3aGlsZSAoIV90aGlzLmJ1ZmZlci5pc0Z1bGwoKSkge1xuICAgICAgX3RoaXMuYnVmZmVyLnB1c2goUHJvbWlzZS5yZXNvbHZlKF90aGlzLml0ZXJhdG9yLm5leHQoKSkpO1xuICAgIH1cblxuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhCdWZmZXJhdG9yLCBbe1xuICAgIGtleTogXCJuZXh0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBfbmV4dCA9IF9hc3luY1RvR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yUnVudGltZS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUyKCkge1xuICAgICAgICB2YXIgYnVmZmVyLCBpdGVyYXRvcjtcbiAgICAgICAgcmV0dXJuIF9yZWdlbmVyYXRvclJ1bnRpbWUud3JhcChmdW5jdGlvbiBfY2FsbGVlMiQoX2NvbnRleHQyKSB7XG4gICAgICAgICAgd2hpbGUgKDEpIHtcbiAgICAgICAgICAgIHN3aXRjaCAoX2NvbnRleHQyLnByZXYgPSBfY29udGV4dDIubmV4dCkge1xuICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgYnVmZmVyID0gdGhpcy5idWZmZXIsIGl0ZXJhdG9yID0gdGhpcy5pdGVyYXRvcjtcbiAgICAgICAgICAgICAgICBfY29udGV4dDIubmV4dCA9IDM7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGJ1ZmZlci5wdXNoKFByb21pc2UucmVzb2x2ZShpdGVyYXRvci5uZXh0KCkpKTtcblxuICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0Mi5hYnJ1cHQoXCJyZXR1cm5cIiwgX2NvbnRleHQyLnNlbnQpO1xuXG4gICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgY2FzZSBcImVuZFwiOlxuICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDIuc3RvcCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSwgX2NhbGxlZTIsIHRoaXMpO1xuICAgICAgfSkpO1xuXG4gICAgICBmdW5jdGlvbiBuZXh0KCkge1xuICAgICAgICByZXR1cm4gX25leHQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG5leHQ7XG4gICAgfSgpXG4gIH0sIHtcbiAgICBrZXk6IFwicmV0dXJuXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBfcmV0dXJuMiA9IF9hc3luY1RvR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yUnVudGltZS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUzKCkge1xuICAgICAgICByZXR1cm4gX3JlZ2VuZXJhdG9yUnVudGltZS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUzJChfY29udGV4dDMpIHtcbiAgICAgICAgICB3aGlsZSAoMSkge1xuICAgICAgICAgICAgc3dpdGNoIChfY29udGV4dDMucHJldiA9IF9jb250ZXh0My5uZXh0KSB7XG4gICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICBfY29udGV4dDMubmV4dCA9IDI7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFzeW5jQ2FsbFJldHVybih0aGlzLml0ZXJhdG9yKTtcblxuICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0My5hYnJ1cHQoXCJyZXR1cm5cIiwgX2NvbnRleHQzLnNlbnQpO1xuXG4gICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgY2FzZSBcImVuZFwiOlxuICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDMuc3RvcCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSwgX2NhbGxlZTMsIHRoaXMpO1xuICAgICAgfSkpO1xuXG4gICAgICBmdW5jdGlvbiBfcmV0dXJuKCkge1xuICAgICAgICByZXR1cm4gX3JldHVybjIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIF9yZXR1cm47XG4gICAgfSgpXG4gIH1dKTtcblxuICByZXR1cm4gQnVmZmVyYXRvcjtcbn0oQXN5bmNJdGVyYWJsZUl0ZXJhdG9yKTtcblxuZXhwb3J0cy5CdWZmZXJhdG9yID0gQnVmZmVyYXRvcjtcblxuZnVuY3Rpb24gX19hc3luY0J1ZmZlcihzb3VyY2UsIG4pIHtcbiAgcmV0dXJuIG5ldyBCdWZmZXJhdG9yKHNvdXJjZSwgbik7XG59XG5cbmV4cG9ydHMuX19hc3luY0J1ZmZlciA9IF9fYXN5bmNCdWZmZXI7XG52YXIgYXN5bmNCdWZmZXIgPSAvKiNfX1BVUkVfXyovY3VycnkoZnVuY3Rpb24gYXN5bmNCdWZmZXIobiwgc291cmNlKSB7XG4gIGlmIChuID09PSB1bmRlZmluZWQpIHJldHVybjtcblxuICBpZiAobiAhPT0gSW5maW5pdHkgJiYgIWlzUG9zaXRpdmVJbnRlZ2VyKG4pKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdDb25jdXJyZW5jeSBtdXN0IGJlIGFuIGludGVnZXIgPiAwJyk7XG4gIH0gZWxzZSBpZiAobiA+IDEwMjQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvbmN1cnJlbmN5IGFyZ3VtZW50IHRvIGFzeW5jQnVmZmVyIG11c3QgYmUgPD0gMTAyNCcpO1xuICB9XG5cbiAgcmV0dXJuIF9fYXN5bmNCdWZmZXIoc291cmNlLCBuKTtcbn0pO1xuZXhwb3J0cy5hc3luY0J1ZmZlciA9IGFzeW5jQnVmZmVyOyIsInZhciBfcmVnZW5lcmF0b3JSdW50aW1lID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL3JlZ2VuZXJhdG9yXCIpO1xuXG52YXIgX2F3YWl0QXN5bmNHZW5lcmF0b3IgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9hd2FpdEFzeW5jR2VuZXJhdG9yXCIpO1xuXG52YXIgX3dyYXBBc3luY0dlbmVyYXRvciA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3dyYXBBc3luY0dlbmVyYXRvclwiKTtcblxudmFyIF9yZXF1aXJlID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWwvYXN5bmMtaXRlcmFibGUuanMnKSxcbiAgICBhc3luY0l0ZXJhYmxlQ3VycnkgPSBfcmVxdWlyZS5hc3luY0l0ZXJhYmxlQ3Vycnk7XG5cbnZhciBfcmVxdWlyZTIgPSByZXF1aXJlKCcuL2ludGVybmFsL3JhY2UtdG8uanMnKSxcbiAgICByYWNlVG8gPSBfcmVxdWlyZTIucmFjZVRvO1xuXG5mdW5jdGlvbiBfX2FzeW5jSW50ZXJsZWF2ZVJlYWR5KF94KSB7XG4gIHJldHVybiBfYXN5bmNJbnRlcmxlYXZlUmVhZHkuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cblxuZXhwb3J0cy5fX2FzeW5jSW50ZXJsZWF2ZVJlYWR5ID0gX19hc3luY0ludGVybGVhdmVSZWFkeTtcblxuZnVuY3Rpb24gX2FzeW5jSW50ZXJsZWF2ZVJlYWR5KCkge1xuICBfYXN5bmNJbnRlcmxlYXZlUmVhZHkgPSBfd3JhcEFzeW5jR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yUnVudGltZS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUoc291cmNlcykge1xuICAgIHZhciBpdGVyYXRvcnMsIHN0ZXBQcm9taXNlcywgcmVhZHksIF9sb29wO1xuXG4gICAgcmV0dXJuIF9yZWdlbmVyYXRvclJ1bnRpbWUud3JhcChmdW5jdGlvbiBfY2FsbGVlJChfY29udGV4dDIpIHtcbiAgICAgIHdoaWxlICgxKSB7XG4gICAgICAgIHN3aXRjaCAoX2NvbnRleHQyLnByZXYgPSBfY29udGV4dDIubmV4dCkge1xuICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgIGl0ZXJhdG9ycyA9IHNvdXJjZXMubWFwKGZ1bmN0aW9uIChpdGVyYWJsZSkge1xuICAgICAgICAgICAgICByZXR1cm4gaXRlcmFibGVbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHN0ZXBQcm9taXNlcyA9IGl0ZXJhdG9ycy5tYXAoZnVuY3Rpb24gKGl0ZXIsIGlkeCkge1xuICAgICAgICAgICAgICByZXR1cm4gaXRlci5uZXh0KCkudGhlbihmdW5jdGlvbiAoc3RlcCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICBpZHg6IGlkeCxcbiAgICAgICAgICAgICAgICAgIHN0ZXA6IHN0ZXBcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgX2xvb3AgPSAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yUnVudGltZS5tYXJrKGZ1bmN0aW9uIF9sb29wKCkge1xuICAgICAgICAgICAgICB2YXIgX3JlYWR5LCBpZHgsIHN0ZXA7XG5cbiAgICAgICAgICAgICAgcmV0dXJuIF9yZWdlbmVyYXRvclJ1bnRpbWUud3JhcChmdW5jdGlvbiBfbG9vcCQoX2NvbnRleHQpIHtcbiAgICAgICAgICAgICAgICB3aGlsZSAoMSkge1xuICAgICAgICAgICAgICAgICAgc3dpdGNoIChfY29udGV4dC5wcmV2ID0gX2NvbnRleHQubmV4dCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgX3JlYWR5ID0gcmVhZHksIGlkeCA9IF9yZWFkeS5pZHgsIHN0ZXAgPSBfcmVhZHkuc3RlcDtcbiAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMztcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RlcC52YWx1ZTtcblxuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgc3RlcFByb21pc2VzW2lkeF0gPSBpdGVyYXRvcnNbaWR4XS5uZXh0KCkudGhlbihmdW5jdGlvbiAoc3RlcCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWR4OiBpZHgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXA6IHN0ZXBcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiZW5kXCI6XG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LnN0b3AoKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0sIF9sb29wKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgX2NvbnRleHQyLm5leHQgPSA1O1xuICAgICAgICAgICAgcmV0dXJuIF9hd2FpdEFzeW5jR2VuZXJhdG9yKHJhY2VUbyhmdW5jdGlvbiAoX3JlZikge1xuICAgICAgICAgICAgICB2YXIgc3RlcCA9IF9yZWYuc3RlcDtcbiAgICAgICAgICAgICAgcmV0dXJuICFzdGVwLmRvbmU7XG4gICAgICAgICAgICB9LCBudWxsLCBzdGVwUHJvbWlzZXMpKTtcblxuICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgIF9jb250ZXh0Mi50MCA9IHJlYWR5ID0gX2NvbnRleHQyLnNlbnQ7XG5cbiAgICAgICAgICAgIGlmICghKF9jb250ZXh0Mi50MCAhPT0gbnVsbCkpIHtcbiAgICAgICAgICAgICAgX2NvbnRleHQyLm5leHQgPSAxMDtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dDIuZGVsZWdhdGVZaWVsZChfbG9vcCgpLCBcInQxXCIsIDgpO1xuXG4gICAgICAgICAgY2FzZSA4OlxuICAgICAgICAgICAgX2NvbnRleHQyLm5leHQgPSAzO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlIDEwOlxuICAgICAgICAgIGNhc2UgXCJlbmRcIjpcbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dDIuc3RvcCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwgX2NhbGxlZSk7XG4gIH0pKTtcbiAgcmV0dXJuIF9hc3luY0ludGVybGVhdmVSZWFkeS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuXG52YXIgYXN5bmNJbnRlcmxlYXZlUmVhZHkgPSAvKiNfX1BVUkVfXyovYXN5bmNJdGVyYWJsZUN1cnJ5KF9fYXN5bmNJbnRlcmxlYXZlUmVhZHksIHtcbiAgdmFyaWFkaWM6IHRydWVcbn0pO1xuZXhwb3J0cy5hc3luY0ludGVybGVhdmVSZWFkeSA9IGFzeW5jSW50ZXJsZWF2ZVJlYWR5OyIsImZ1bmN0aW9uIF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKG8sIGFsbG93QXJyYXlMaWtlKSB7IHZhciBpdDsgaWYgKHR5cGVvZiBTeW1ib2wgPT09IFwidW5kZWZpbmVkXCIgfHwgb1tTeW1ib2wuaXRlcmF0b3JdID09IG51bGwpIHsgaWYgKEFycmF5LmlzQXJyYXkobykgfHwgKGl0ID0gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8pKSB8fCBhbGxvd0FycmF5TGlrZSAmJiBvICYmIHR5cGVvZiBvLmxlbmd0aCA9PT0gXCJudW1iZXJcIikgeyBpZiAoaXQpIG8gPSBpdDsgdmFyIGkgPSAwOyB2YXIgRiA9IGZ1bmN0aW9uIEYoKSB7fTsgcmV0dXJuIHsgczogRiwgbjogZnVuY3Rpb24gbigpIHsgaWYgKGkgPj0gby5sZW5ndGgpIHJldHVybiB7IGRvbmU6IHRydWUgfTsgcmV0dXJuIHsgZG9uZTogZmFsc2UsIHZhbHVlOiBvW2krK10gfTsgfSwgZTogZnVuY3Rpb24gZShfZSkgeyB0aHJvdyBfZTsgfSwgZjogRiB9OyB9IHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gaXRlcmF0ZSBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTsgfSB2YXIgbm9ybWFsQ29tcGxldGlvbiA9IHRydWUsIGRpZEVyciA9IGZhbHNlLCBlcnI7IHJldHVybiB7IHM6IGZ1bmN0aW9uIHMoKSB7IGl0ID0gb1tTeW1ib2wuaXRlcmF0b3JdKCk7IH0sIG46IGZ1bmN0aW9uIG4oKSB7IHZhciBzdGVwID0gaXQubmV4dCgpOyBub3JtYWxDb21wbGV0aW9uID0gc3RlcC5kb25lOyByZXR1cm4gc3RlcDsgfSwgZTogZnVuY3Rpb24gZShfZTIpIHsgZGlkRXJyID0gdHJ1ZTsgZXJyID0gX2UyOyB9LCBmOiBmdW5jdGlvbiBmKCkgeyB0cnkgeyBpZiAoIW5vcm1hbENvbXBsZXRpb24gJiYgaXRbXCJyZXR1cm5cIl0gIT0gbnVsbCkgaXRbXCJyZXR1cm5cIl0oKTsgfSBmaW5hbGx5IHsgaWYgKGRpZEVycikgdGhyb3cgZXJyOyB9IH0gfTsgfVxuXG5mdW5jdGlvbiBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkobywgbWluTGVuKSB7IGlmICghbykgcmV0dXJuOyBpZiAodHlwZW9mIG8gPT09IFwic3RyaW5nXCIpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pOyB2YXIgbiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKS5zbGljZSg4LCAtMSk7IGlmIChuID09PSBcIk9iamVjdFwiICYmIG8uY29uc3RydWN0b3IpIG4gPSBvLmNvbnN0cnVjdG9yLm5hbWU7IGlmIChuID09PSBcIk1hcFwiIHx8IG4gPT09IFwiU2V0XCIpIHJldHVybiBBcnJheS5mcm9tKG8pOyBpZiAobiA9PT0gXCJBcmd1bWVudHNcIiB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSkgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IH1cblxuZnVuY3Rpb24gX2FycmF5TGlrZVRvQXJyYXkoYXJyLCBsZW4pIHsgaWYgKGxlbiA9PSBudWxsIHx8IGxlbiA+IGFyci5sZW5ndGgpIGxlbiA9IGFyci5sZW5ndGg7IGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGxlbik7IGkgPCBsZW47IGkrKykgeyBhcnIyW2ldID0gYXJyW2ldOyB9IHJldHVybiBhcnIyOyB9XG5cbmZ1bmN0aW9uIHJhY2VUbyhwcmVkaWNhdGUsIG5vdEZvdW5kVmFsdWUsIHByb21pc2VzKSB7XG4gIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgdmFyIHByb21pc2VDb3VudCA9IDA7XG4gICAgdmFyIHNldHRsZWRQcm9taXNlQ291bnQgPSAwO1xuICAgIHZhciByZXNvbHZlZCA9IGZhbHNlO1xuICAgIHZhciByZWplY3RlZCA9IGZhbHNlO1xuXG4gICAgdmFyIF9pdGVyYXRvciA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKHByb21pc2VzKSxcbiAgICAgICAgX3N0ZXA7XG5cbiAgICB0cnkge1xuICAgICAgZm9yIChfaXRlcmF0b3IucygpOyAhKF9zdGVwID0gX2l0ZXJhdG9yLm4oKSkuZG9uZTspIHtcbiAgICAgICAgdmFyIHByb21pc2UgPSBfc3RlcC52YWx1ZTtcbiAgICAgICAgcHJvbWlzZVtcImNhdGNoXCJdKGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICAgIGlmICghcmVqZWN0ZWQgJiYgIXJlc29sdmVkKSB7XG4gICAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICAgICAgcmVqZWN0ZWQgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSkudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7XG4gICAgICAgICAgc2V0dGxlZFByb21pc2VDb3VudCsrO1xuXG4gICAgICAgICAgaWYgKCFyZXNvbHZlZCAmJiAhcmVqZWN0ZWQpIHtcbiAgICAgICAgICAgIGlmIChwcmVkaWNhdGUocmVzdWx0KSkge1xuICAgICAgICAgICAgICByZXNvbHZlKHJlc3VsdCk7XG4gICAgICAgICAgICAgIHJlc29sdmVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc2V0dGxlZFByb21pc2VDb3VudCA9PT0gcHJvbWlzZUNvdW50KSB7XG4gICAgICAgICAgICAgIHJlc29sdmUobm90Rm91bmRWYWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcHJvbWlzZUNvdW50Kys7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBfaXRlcmF0b3IuZShlcnIpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBfaXRlcmF0b3IuZigpO1xuICAgIH1cbiAgfSk7XG59XG5cbmV4cG9ydHMucmFjZVRvID0gcmFjZVRvOyIsInZhciBfcmVnZW5lcmF0b3JSdW50aW1lID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL3JlZ2VuZXJhdG9yXCIpO1xuXG52YXIgX2F3YWl0QXN5bmNHZW5lcmF0b3IgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9hd2FpdEFzeW5jR2VuZXJhdG9yXCIpO1xuXG52YXIgX3dyYXBBc3luY0dlbmVyYXRvciA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3dyYXBBc3luY0dlbmVyYXRvclwiKTtcblxudmFyIF9hc3luY0l0ZXJhdG9yID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvYXN5bmNJdGVyYXRvclwiKTtcblxudmFyIF9yZXF1aXJlID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWwvYXN5bmMtaXRlcmFibGUuanMnKSxcbiAgICBhc3luY0l0ZXJhYmxlQ3VycnkgPSBfcmVxdWlyZS5hc3luY0l0ZXJhYmxlQ3Vycnk7XG5cbnZhciBfcmVxdWlyZTIgPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbC9udW1iZXIuanMnKSxcbiAgICBpc1Bvc2l0aXZlSW50ZWdlciA9IF9yZXF1aXJlMi5pc1Bvc2l0aXZlSW50ZWdlcjtcblxudmFyIF9yZXF1aXJlMyA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFsL2RlbGF5LmpzJyksXG4gICAgZGVsYXkgPSBfcmVxdWlyZTMuZGVsYXk7XG5cbmZ1bmN0aW9uIF9fYXN5bmNUaHJvdHRsZShfeCwgX3gyKSB7XG4gIHJldHVybiBfYXN5bmNUaHJvdHRsZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuXG5leHBvcnRzLl9fYXN5bmNUaHJvdHRsZSA9IF9fYXN5bmNUaHJvdHRsZTtcblxuZnVuY3Rpb24gX2FzeW5jVGhyb3R0bGUoKSB7XG4gIF9hc3luY1Rocm90dGxlID0gX3dyYXBBc3luY0dlbmVyYXRvciggLyojX19QVVJFX18qL19yZWdlbmVyYXRvclJ1bnRpbWUubWFyayhmdW5jdGlvbiBfY2FsbGVlKHNvdXJjZSwgaW50ZXJ2YWxNcykge1xuICAgIHZhciB3YWl0U2luY2UsIF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24sIF9kaWRJdGVyYXRvckVycm9yLCBfaXRlcmF0b3JFcnJvciwgX2l0ZXJhdG9yLCBfc3RlcCwgX3ZhbHVlLCB2YWx1ZSwgZHVyYXRpb247XG5cbiAgICByZXR1cm4gX3JlZ2VuZXJhdG9yUnVudGltZS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUkKF9jb250ZXh0KSB7XG4gICAgICB3aGlsZSAoMSkge1xuICAgICAgICBzd2l0Y2ggKF9jb250ZXh0LnByZXYgPSBfY29udGV4dC5uZXh0KSB7XG4gICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgd2FpdFNpbmNlID0gMDtcbiAgICAgICAgICAgIF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24gPSB0cnVlO1xuICAgICAgICAgICAgX2RpZEl0ZXJhdG9yRXJyb3IgPSBmYWxzZTtcbiAgICAgICAgICAgIF9jb250ZXh0LnByZXYgPSAzO1xuICAgICAgICAgICAgX2l0ZXJhdG9yID0gX2FzeW5jSXRlcmF0b3Ioc291cmNlKTtcblxuICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSA3O1xuICAgICAgICAgICAgcmV0dXJuIF9hd2FpdEFzeW5jR2VuZXJhdG9yKF9pdGVyYXRvci5uZXh0KCkpO1xuXG4gICAgICAgICAgY2FzZSA3OlxuICAgICAgICAgICAgX3N0ZXAgPSBfY29udGV4dC5zZW50O1xuICAgICAgICAgICAgX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbiA9IF9zdGVwLmRvbmU7XG4gICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMTE7XG4gICAgICAgICAgICByZXR1cm4gX2F3YWl0QXN5bmNHZW5lcmF0b3IoX3N0ZXAudmFsdWUpO1xuXG4gICAgICAgICAgY2FzZSAxMTpcbiAgICAgICAgICAgIF92YWx1ZSA9IF9jb250ZXh0LnNlbnQ7XG5cbiAgICAgICAgICAgIGlmIChfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uKSB7XG4gICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAyMztcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhbHVlID0gX3ZhbHVlO1xuICAgICAgICAgICAgZHVyYXRpb24gPSBpbnRlcnZhbE1zIC0gKERhdGUubm93KCkgLSB3YWl0U2luY2UpO1xuICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDE3O1xuICAgICAgICAgICAgcmV0dXJuIF9hd2FpdEFzeW5jR2VuZXJhdG9yKGR1cmF0aW9uID4gMCAmJiBkZWxheShkdXJhdGlvbikpO1xuXG4gICAgICAgICAgY2FzZSAxNzpcbiAgICAgICAgICAgIHdhaXRTaW5jZSA9IERhdGUubm93KCk7XG4gICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMjA7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG5cbiAgICAgICAgICBjYXNlIDIwOlxuICAgICAgICAgICAgX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbiA9IHRydWU7XG4gICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gNTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSAyMzpcbiAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAyOTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSAyNTpcbiAgICAgICAgICAgIF9jb250ZXh0LnByZXYgPSAyNTtcbiAgICAgICAgICAgIF9jb250ZXh0LnQwID0gX2NvbnRleHRbXCJjYXRjaFwiXSgzKTtcbiAgICAgICAgICAgIF9kaWRJdGVyYXRvckVycm9yID0gdHJ1ZTtcbiAgICAgICAgICAgIF9pdGVyYXRvckVycm9yID0gX2NvbnRleHQudDA7XG5cbiAgICAgICAgICBjYXNlIDI5OlxuICAgICAgICAgICAgX2NvbnRleHQucHJldiA9IDI5O1xuICAgICAgICAgICAgX2NvbnRleHQucHJldiA9IDMwO1xuXG4gICAgICAgICAgICBpZiAoISghX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbiAmJiBfaXRlcmF0b3JbXCJyZXR1cm5cIl0gIT0gbnVsbCkpIHtcbiAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDM0O1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDM0O1xuICAgICAgICAgICAgcmV0dXJuIF9hd2FpdEFzeW5jR2VuZXJhdG9yKF9pdGVyYXRvcltcInJldHVyblwiXSgpKTtcblxuICAgICAgICAgIGNhc2UgMzQ6XG4gICAgICAgICAgICBfY29udGV4dC5wcmV2ID0gMzQ7XG5cbiAgICAgICAgICAgIGlmICghX2RpZEl0ZXJhdG9yRXJyb3IpIHtcbiAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDM3O1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhyb3cgX2l0ZXJhdG9yRXJyb3I7XG5cbiAgICAgICAgICBjYXNlIDM3OlxuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LmZpbmlzaCgzNCk7XG5cbiAgICAgICAgICBjYXNlIDM4OlxuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LmZpbmlzaCgyOSk7XG5cbiAgICAgICAgICBjYXNlIDM5OlxuICAgICAgICAgIGNhc2UgXCJlbmRcIjpcbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5zdG9wKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCBfY2FsbGVlLCBudWxsLCBbWzMsIDI1LCAyOSwgMzldLCBbMzAsLCAzNCwgMzhdXSk7XG4gIH0pKTtcbiAgcmV0dXJuIF9hc3luY1Rocm90dGxlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5cbnZhciBhc3luY1Rocm90dGxlID0gLyojX19QVVJFX18qL2FzeW5jSXRlcmFibGVDdXJyeShfX2FzeW5jVGhyb3R0bGUsIHtcbiAgdmFsaWRhdGVBcmdzOiBmdW5jdGlvbiB2YWxpZGF0ZUFyZ3MoYXJncykge1xuICAgIGlmICghaXNQb3NpdGl2ZUludGVnZXIoYXJnc1sxXSwgdHJ1ZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW50ZXJ2YWxNcyBhcmd1bWVudCB0byBhc3luY1Rocm90dGxlIG11c3QgYmUgYSBudW1iZXIgPiAwJyk7XG4gICAgfVxuICB9XG59KTtcbmV4cG9ydHMuYXN5bmNUaHJvdHRsZSA9IGFzeW5jVGhyb3R0bGU7IiwiZnVuY3Rpb24gX19jYWxsKGZuKSB7XG4gIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4gPiAxID8gX2xlbiAtIDEgOiAwKSwgX2tleSA9IDE7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICBhcmdzW19rZXkgLSAxXSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgfVxuXG4gIHJldHVybiBmbi5hcHBseSh2b2lkIDAsIGFyZ3MpO1xufVxuXG5leHBvcnRzLl9fY2FsbCA9IF9fY2FsbDtcbnZhciBjYWxsID0gX19jYWxsO1xuZXhwb3J0cy5jYWxsID0gY2FsbDsiLCJ2YXIgaWRlbnRpdHkgPSBmdW5jdGlvbiBpZGVudGl0eSh4KSB7XG4gIHJldHVybiB4O1xufTtcblxuZnVuY3Rpb24gY29tcG9zZSgpIHtcbiAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGZucyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICBmbnNbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gIH1cblxuICBpZiAoIWZucy5sZW5ndGgpIGZucyA9IFtpZGVudGl0eV07XG4gIHJldHVybiBmbnMucmVkdWNlKGZ1bmN0aW9uIChmLCBnKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICh4KSB7XG4gICAgICByZXR1cm4gZihnKHgpKTtcbiAgICB9O1xuICB9KTtcbn1cblxuZXhwb3J0cy5jb21wb3NlID0gY29tcG9zZTsiLCJmdW5jdGlvbiBleGVjUGlwZShpbml0aWFsKSB7XG4gIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBmbnMgPSBuZXcgQXJyYXkoX2xlbiA+IDEgPyBfbGVuIC0gMSA6IDApLCBfa2V5ID0gMTsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgIGZuc1tfa2V5IC0gMV0gPSBhcmd1bWVudHNbX2tleV07XG4gIH1cblxuICByZXR1cm4gZm5zLnJlZHVjZShmdW5jdGlvbiAodmFsdWUsIGZuKSB7XG4gICAgcmV0dXJuIGZuKHZhbHVlKTtcbiAgfSwgaW5pdGlhbCk7XG59XG5cbmV4cG9ydHMuZXhlY1BpcGUgPSBleGVjUGlwZTsiLCJmdW5jdGlvbiBmaXJzdEhpZ2hlc3QoYmVzdCwgdmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlID4gYmVzdDtcbn1cblxuZXhwb3J0cy5maXJzdEhpZ2hlc3QgPSBmaXJzdEhpZ2hlc3Q7IiwiZnVuY3Rpb24gZmlyc3RMb3dlc3QoYmVzdCwgdmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlIDwgYmVzdDtcbn1cblxuZXhwb3J0cy5maXJzdExvd2VzdCA9IGZpcnN0TG93ZXN0OyIsImZ1bmN0aW9uIGdldFNpemUoc2VxdWVuY2UpIHtcbiAgaWYgKHNlcXVlbmNlID09IG51bGwpIHtcbiAgICByZXR1cm4gMDtcbiAgfSBlbHNlIHtcbiAgICB2YXIgc2l6ZSA9IHNlcXVlbmNlLnNpemU7XG5cbiAgICBpZiAodHlwZW9mIHNpemUgPT09ICdudW1iZXInKSB7XG4gICAgICByZXR1cm4gc2VxdWVuY2Uuc2l6ZTtcbiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoc2VxdWVuY2UpKSB7XG4gICAgICByZXR1cm4gc2VxdWVuY2UubGVuZ3RoO1xuICAgIH1cbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcignVGhlIGFyZ3VtZW50IHBhc3NlZCB0byBnZXRTaXplIGRpZCBub3QgaGF2ZSBhIHNpemUnKTtcbn1cblxuZXhwb3J0cy5nZXRTaXplID0gZ2V0U2l6ZTsiLCJ2YXIgaXNBcnJheSA9IEFycmF5LmlzQXJyYXk7XG5leHBvcnRzLmlzQXJyYXkgPSBpc0FycmF5OyIsInZhciBfcmVxdWlyZSA9IHJlcXVpcmUoJy4uL25vdC11bmRlZmluZWQvbm90LXVuZGVmaW5lZC5qcycpLFxuICAgIG5vdFVuZGVmaW5lZCA9IF9yZXF1aXJlLm5vdFVuZGVmaW5lZDtcblxuZnVuY3Rpb24gaXNBc3luY0l0ZXJhYmxlKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSAhPSBudWxsICYmIG5vdFVuZGVmaW5lZCh2YWx1ZVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0pO1xufVxuXG5leHBvcnRzLmlzQXN5bmNJdGVyYWJsZSA9IGlzQXN5bmNJdGVyYWJsZTsiLCJ2YXIgX3JlcXVpcmUgPSByZXF1aXJlKCcuLi9ub3QtdW5kZWZpbmVkL25vdC11bmRlZmluZWQuanMnKSxcbiAgICBub3RVbmRlZmluZWQgPSBfcmVxdWlyZS5ub3RVbmRlZmluZWQ7XG5cbmZ1bmN0aW9uIGlzQXN5bmNMb29wYWJsZSh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgIT0gbnVsbCAmJiAobm90VW5kZWZpbmVkKHZhbHVlW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSkgfHwgbm90VW5kZWZpbmVkKHZhbHVlW1N5bWJvbC5pdGVyYXRvcl0pKTtcbn1cblxuZXhwb3J0cy5pc0FzeW5jTG9vcGFibGUgPSBpc0FzeW5jTG9vcGFibGU7IiwidmFyIF9yZXF1aXJlID0gcmVxdWlyZSgnLi4vbm90LXVuZGVmaW5lZC9ub3QtdW5kZWZpbmVkLmpzJyksXG4gICAgbm90VW5kZWZpbmVkID0gX3JlcXVpcmUubm90VW5kZWZpbmVkO1xuXG5mdW5jdGlvbiBpc0FzeW5jV3JhcHBhYmxlKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSA9PSBudWxsIHx8IG5vdFVuZGVmaW5lZCh2YWx1ZVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0pIHx8IG5vdFVuZGVmaW5lZCh2YWx1ZVtTeW1ib2wuaXRlcmF0b3JdKTtcbn1cblxuZXhwb3J0cy5pc0FzeW5jV3JhcHBhYmxlID0gaXNBc3luY1dyYXBwYWJsZTsiLCJ2YXIgX3JlcXVpcmUgPSByZXF1aXJlKCcuLi9ub3QtdW5kZWZpbmVkL25vdC11bmRlZmluZWQuanMnKSxcbiAgICBub3RVbmRlZmluZWQgPSBfcmVxdWlyZS5ub3RVbmRlZmluZWQ7XG5cbmZ1bmN0aW9uIGlzSXRlcmFibGUodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlICE9IG51bGwgJiYgbm90VW5kZWZpbmVkKHZhbHVlW1N5bWJvbC5pdGVyYXRvcl0pO1xufVxuXG5leHBvcnRzLmlzSXRlcmFibGUgPSBpc0l0ZXJhYmxlOyIsImV4cG9ydHMuaXNMb29wYWJsZSA9IHJlcXVpcmUoJy4uL2lzLWl0ZXJhYmxlL2lzLWl0ZXJhYmxlLmpzJykuaXNJdGVyYWJsZTsiLCJmdW5jdGlvbiBpc05pbCh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgPT0gbnVsbDtcbn1cblxuZXhwb3J0cy5pc05pbCA9IGlzTmlsOyIsImZ1bmN0aW9uIGlzTnVsbCh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgPT09IG51bGw7XG59XG5cbmV4cG9ydHMuaXNOdWxsID0gaXNOdWxsOyIsInZhciBfdHlwZW9mID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvdHlwZW9mXCIpO1xuXG5mdW5jdGlvbiBpc09iamVjdCh2YWx1ZSkge1xuICByZXR1cm4gX3R5cGVvZih2YWx1ZSkgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsO1xufVxuXG5leHBvcnRzLmlzT2JqZWN0ID0gaXNPYmplY3Q7IiwiZnVuY3Rpb24gaXNTdHJpbmcodmFsdWUpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZyc7XG59XG5cbmV4cG9ydHMuaXNTdHJpbmcgPSBpc1N0cmluZzsiLCJmdW5jdGlvbiBpc1VuZGVmaW5lZCh2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAndW5kZWZpbmVkJztcbn1cblxuZXhwb3J0cy5pc1VuZGVmaW5lZCA9IGlzVW5kZWZpbmVkOyIsInZhciBfcmVxdWlyZSA9IHJlcXVpcmUoJy4uL25vdC11bmRlZmluZWQvbm90LXVuZGVmaW5lZC5qcycpLFxuICAgIG5vdFVuZGVmaW5lZCA9IF9yZXF1aXJlLm5vdFVuZGVmaW5lZDtcblxuZnVuY3Rpb24gaXNXcmFwcGFibGUodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlID09IG51bGwgfHwgbm90VW5kZWZpbmVkKHZhbHVlW1N5bWJvbC5pdGVyYXRvcl0pO1xufVxuXG5leHBvcnRzLmlzV3JhcHBhYmxlID0gaXNXcmFwcGFibGU7IiwiZnVuY3Rpb24gbGFzdEhpZ2hlc3QoYmVzdCwgdmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlID49IGJlc3Q7XG59XG5cbmV4cG9ydHMubGFzdEhpZ2hlc3QgPSBsYXN0SGlnaGVzdDsiLCJmdW5jdGlvbiBsYXN0TG93ZXN0KGJlc3QsIHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSA8PSBiZXN0O1xufVxuXG5leHBvcnRzLmxhc3RMb3dlc3QgPSBsYXN0TG93ZXN0OyIsInZhciBpc0FycmF5ID0gQXJyYXkuaXNBcnJheTtcblxuZnVuY3Rpb24gbm90QXJyYXkodmFsdWUpIHtcbiAgcmV0dXJuICFpc0FycmF5KHZhbHVlKTtcbn1cblxuZXhwb3J0cy5ub3RBcnJheSA9IG5vdEFycmF5OyIsInZhciBfcmVxdWlyZSA9IHJlcXVpcmUoJy4uL2lzLXVuZGVmaW5lZC9pcy11bmRlZmluZWQuanMnKSxcbiAgICBpc1VuZGVmaW5lZCA9IF9yZXF1aXJlLmlzVW5kZWZpbmVkO1xuXG5mdW5jdGlvbiBub3RBc3luY0l0ZXJhYmxlKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSA9PSBudWxsIHx8IGlzVW5kZWZpbmVkKHZhbHVlW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSk7XG59XG5cbmV4cG9ydHMubm90QXN5bmNJdGVyYWJsZSA9IG5vdEFzeW5jSXRlcmFibGU7IiwidmFyIF9yZXF1aXJlID0gcmVxdWlyZSgnLi4vaXMtdW5kZWZpbmVkL2lzLXVuZGVmaW5lZC5qcycpLFxuICAgIGlzVW5kZWZpbmVkID0gX3JlcXVpcmUuaXNVbmRlZmluZWQ7XG5cbmZ1bmN0aW9uIG5vdEFzeW5jTG9vcGFibGUodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlID09IG51bGwgfHwgaXNVbmRlZmluZWQodmFsdWVbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKSAmJiBpc1VuZGVmaW5lZCh2YWx1ZVtTeW1ib2wuaXRlcmF0b3JdKTtcbn1cblxuZXhwb3J0cy5ub3RBc3luY0xvb3BhYmxlID0gbm90QXN5bmNMb29wYWJsZTsiLCJ2YXIgX3JlcXVpcmUgPSByZXF1aXJlKCcuLi9pcy11bmRlZmluZWQvaXMtdW5kZWZpbmVkLmpzJyksXG4gICAgaXNVbmRlZmluZWQgPSBfcmVxdWlyZS5pc1VuZGVmaW5lZDtcblxuZnVuY3Rpb24gbm90QXN5bmNXcmFwcGFibGUodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlICE9IG51bGwgJiYgaXNVbmRlZmluZWQodmFsdWVbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKSAmJiBpc1VuZGVmaW5lZCh2YWx1ZVtTeW1ib2wuaXRlcmF0b3JdKTtcbn1cblxuZXhwb3J0cy5ub3RBc3luY1dyYXBwYWJsZSA9IG5vdEFzeW5jV3JhcHBhYmxlOyIsInZhciBfcmVxdWlyZSA9IHJlcXVpcmUoJy4uL2lzLXVuZGVmaW5lZC9pcy11bmRlZmluZWQuanMnKSxcbiAgICBpc1VuZGVmaW5lZCA9IF9yZXF1aXJlLmlzVW5kZWZpbmVkO1xuXG5mdW5jdGlvbiBub3RJdGVyYWJsZSh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgPT0gbnVsbCB8fCBpc1VuZGVmaW5lZCh2YWx1ZVtTeW1ib2wuaXRlcmF0b3JdKTtcbn1cblxuZXhwb3J0cy5ub3RJdGVyYWJsZSA9IG5vdEl0ZXJhYmxlOyIsImV4cG9ydHMubm90TG9vcGFibGUgPSByZXF1aXJlKCcuLi9ub3QtaXRlcmFibGUvbm90LWl0ZXJhYmxlLmpzJykubm90SXRlcmFibGU7IiwiZnVuY3Rpb24gbm90TmlsKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSAhPSBudWxsO1xufVxuXG5leHBvcnRzLm5vdE5pbCA9IG5vdE5pbDsiLCJmdW5jdGlvbiBub3ROdWxsKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSAhPT0gbnVsbDtcbn1cblxuZXhwb3J0cy5ub3ROdWxsID0gbm90TnVsbDsiLCJ2YXIgX3R5cGVvZiA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3R5cGVvZlwiKTtcblxuZnVuY3Rpb24gbm90T2JqZWN0KHZhbHVlKSB7XG4gIHJldHVybiBfdHlwZW9mKHZhbHVlKSAhPT0gJ29iamVjdCcgfHwgdmFsdWUgPT09IG51bGw7XG59XG5cbmV4cG9ydHMubm90T2JqZWN0ID0gbm90T2JqZWN0OyIsImZ1bmN0aW9uIG5vdFN0cmluZyh2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJztcbn1cblxuZXhwb3J0cy5ub3RTdHJpbmcgPSBub3RTdHJpbmc7IiwiZnVuY3Rpb24gbm90VW5kZWZpbmVkKHZhbHVlKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgIT09ICd1bmRlZmluZWQnO1xufVxuXG5leHBvcnRzLm5vdFVuZGVmaW5lZCA9IG5vdFVuZGVmaW5lZDsiLCJ2YXIgX3JlcXVpcmUgPSByZXF1aXJlKCcuLi9pcy11bmRlZmluZWQvaXMtdW5kZWZpbmVkLmpzJyksXG4gICAgaXNVbmRlZmluZWQgPSBfcmVxdWlyZS5pc1VuZGVmaW5lZDtcblxuZnVuY3Rpb24gbm90V3JhcHBhYmxlKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSAhPSBudWxsICYmIGlzVW5kZWZpbmVkKHZhbHVlW1N5bWJvbC5pdGVyYXRvcl0pO1xufVxuXG5leHBvcnRzLm5vdFdyYXBwYWJsZSA9IG5vdFdyYXBwYWJsZTsiLCJ2YXIgX3R5cGVvZiA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3R5cGVvZlwiKTtcblxudmFyIF9yZWdlbmVyYXRvclJ1bnRpbWUgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvcmVnZW5lcmF0b3JcIik7XG5cbnZhciBfbWFya2VkID0gLyojX19QVVJFX18qL19yZWdlbmVyYXRvclJ1bnRpbWUubWFyayhfX29iamVjdEVudHJpZXMpO1xuXG52YXIgX3JlcXVpcmUgPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbC9pdGVyYWJsZS5qcycpLFxuICAgIHdyYXBXaXRoSXRlcmFibGVJdGVyYXRvciA9IF9yZXF1aXJlLndyYXBXaXRoSXRlcmFibGVJdGVyYXRvcjtcblxudmFyIGhhc093blByb3BlcnR5ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcblxuZnVuY3Rpb24gX19vYmplY3RFbnRyaWVzKG9iaikge1xuICB2YXIga2V5O1xuICByZXR1cm4gX3JlZ2VuZXJhdG9yUnVudGltZS53cmFwKGZ1bmN0aW9uIF9fb2JqZWN0RW50cmllcyQoX2NvbnRleHQpIHtcbiAgICB3aGlsZSAoMSkge1xuICAgICAgc3dpdGNoIChfY29udGV4dC5wcmV2ID0gX2NvbnRleHQubmV4dCkge1xuICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgaWYgKCEob2JqID09IG51bGwpKSB7XG4gICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMjtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBfY29udGV4dC5hYnJ1cHQoXCJyZXR1cm5cIik7XG5cbiAgICAgICAgY2FzZSAyOlxuICAgICAgICAgIF9jb250ZXh0LnQwID0gX3JlZ2VuZXJhdG9yUnVudGltZS5rZXlzKG9iaik7XG5cbiAgICAgICAgY2FzZSAzOlxuICAgICAgICAgIGlmICgoX2NvbnRleHQudDEgPSBfY29udGV4dC50MCgpKS5kb25lKSB7XG4gICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMTA7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBrZXkgPSBfY29udGV4dC50MS52YWx1ZTtcblxuICAgICAgICAgIGlmICghaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSkpIHtcbiAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSA4O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgX2NvbnRleHQubmV4dCA9IDg7XG4gICAgICAgICAgcmV0dXJuIFtrZXksIG9ialtrZXldXTtcblxuICAgICAgICBjYXNlIDg6XG4gICAgICAgICAgX2NvbnRleHQubmV4dCA9IDM7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAxMDpcbiAgICAgICAgY2FzZSBcImVuZFwiOlxuICAgICAgICAgIHJldHVybiBfY29udGV4dC5zdG9wKCk7XG4gICAgICB9XG4gICAgfVxuICB9LCBfbWFya2VkKTtcbn1cblxuZXhwb3J0cy5fX29iamVjdEVudHJpZXMgPSBfX29iamVjdEVudHJpZXM7XG52YXIgb2JqZWN0RW50cmllcyA9IC8qI19fUFVSRV9fKi93cmFwV2l0aEl0ZXJhYmxlSXRlcmF0b3IoX19vYmplY3RFbnRyaWVzLCB7XG4gIHZhbGlkYXRlQXJnczogZnVuY3Rpb24gdmFsaWRhdGVBcmdzKGFyZ3MpIHtcbiAgICBpZiAoIShhcmdzWzBdID09IG51bGwgfHwgX3R5cGVvZihhcmdzWzBdKSA9PT0gJ29iamVjdCcpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ29iaiBhcmd1bWVudCB0byBvYmplY3RFbnRyaWVzIG11c3QgYmUgYW4gb2JqZWN0LCBudWxsLCBvciB1bmRlZmluZWQnKTtcbiAgICB9XG4gIH1cbn0pO1xuZXhwb3J0cy5vYmplY3RFbnRyaWVzID0gb2JqZWN0RW50cmllczsiLCJleHBvcnRzLl9fb2JqZWN0RnJvbUFzeW5jID0gcmVxdWlyZSgnLi4vJHRvLW9iamVjdC9hc3luYy10by1vYmplY3QuanMnKS5fX2FzeW5jVG9PYmplY3Q7XG5leHBvcnRzLm9iamVjdEZyb21Bc3luYyA9IHJlcXVpcmUoJy4uLyR0by1vYmplY3QvYXN5bmMtdG8tb2JqZWN0LmpzJykuYXN5bmNUb09iamVjdDsiLCJleHBvcnRzLl9fb2JqZWN0RnJvbSA9IHJlcXVpcmUoJy4uLyR0by1vYmplY3QvdG8tb2JqZWN0LmpzJykuX190b09iamVjdDtcbmV4cG9ydHMub2JqZWN0RnJvbSA9IHJlcXVpcmUoJy4uLyR0by1vYmplY3QvdG8tb2JqZWN0LmpzJykudG9PYmplY3Q7IiwidmFyIF90eXBlb2YgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy90eXBlb2ZcIik7XG5cbnZhciBfcmVnZW5lcmF0b3JSdW50aW1lID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL3JlZ2VuZXJhdG9yXCIpO1xuXG52YXIgX21hcmtlZCA9IC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3JSdW50aW1lLm1hcmsoX19vYmplY3RLZXlzKTtcblxudmFyIF9yZXF1aXJlID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWwvaXRlcmFibGUuanMnKSxcbiAgICB3cmFwV2l0aEl0ZXJhYmxlSXRlcmF0b3IgPSBfcmVxdWlyZS53cmFwV2l0aEl0ZXJhYmxlSXRlcmF0b3I7XG5cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG5cbmZ1bmN0aW9uIF9fb2JqZWN0S2V5cyhvYmopIHtcbiAgdmFyIGtleTtcbiAgcmV0dXJuIF9yZWdlbmVyYXRvclJ1bnRpbWUud3JhcChmdW5jdGlvbiBfX29iamVjdEtleXMkKF9jb250ZXh0KSB7XG4gICAgd2hpbGUgKDEpIHtcbiAgICAgIHN3aXRjaCAoX2NvbnRleHQucHJldiA9IF9jb250ZXh0Lm5leHQpIHtcbiAgICAgICAgY2FzZSAwOlxuICAgICAgICAgIGlmICghKG9iaiA9PSBudWxsKSkge1xuICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDI7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gX2NvbnRleHQuYWJydXB0KFwicmV0dXJuXCIpO1xuXG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgICBfY29udGV4dC50MCA9IF9yZWdlbmVyYXRvclJ1bnRpbWUua2V5cyhvYmopO1xuXG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgICBpZiAoKF9jb250ZXh0LnQxID0gX2NvbnRleHQudDAoKSkuZG9uZSkge1xuICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDEwO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAga2V5ID0gX2NvbnRleHQudDEudmFsdWU7XG5cbiAgICAgICAgICBpZiAoIWhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpKSB7XG4gICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gODtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSA4O1xuICAgICAgICAgIHJldHVybiBrZXk7XG5cbiAgICAgICAgY2FzZSA4OlxuICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAzO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgMTA6XG4gICAgICAgIGNhc2UgXCJlbmRcIjpcbiAgICAgICAgICByZXR1cm4gX2NvbnRleHQuc3RvcCgpO1xuICAgICAgfVxuICAgIH1cbiAgfSwgX21hcmtlZCk7XG59XG5cbmV4cG9ydHMuX19vYmplY3RLZXlzID0gX19vYmplY3RLZXlzO1xudmFyIG9iamVjdEtleXMgPSAvKiNfX1BVUkVfXyovd3JhcFdpdGhJdGVyYWJsZUl0ZXJhdG9yKF9fb2JqZWN0S2V5cywge1xuICB2YWxpZGF0ZUFyZ3M6IGZ1bmN0aW9uIHZhbGlkYXRlQXJncyhhcmdzKSB7XG4gICAgaWYgKCEoYXJnc1swXSA9PSBudWxsIHx8IF90eXBlb2YoYXJnc1swXSkgPT09ICdvYmplY3QnKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdvYmogYXJndW1lbnQgdG8gb2JqZWN0S2V5cyBtdXN0IGJlIGFuIG9iamVjdCwgbnVsbCwgb3IgdW5kZWZpbmVkJyk7XG4gICAgfVxuICB9XG59KTtcbmV4cG9ydHMub2JqZWN0S2V5cyA9IG9iamVjdEtleXM7IiwidmFyIF90eXBlb2YgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy90eXBlb2ZcIik7XG5cbnZhciBfcmVnZW5lcmF0b3JSdW50aW1lID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL3JlZ2VuZXJhdG9yXCIpO1xuXG52YXIgX21hcmtlZCA9IC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3JSdW50aW1lLm1hcmsoX19vYmplY3RWYWx1ZXMpO1xuXG52YXIgX3JlcXVpcmUgPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbC9pdGVyYWJsZS5qcycpLFxuICAgIHdyYXBXaXRoSXRlcmFibGVJdGVyYXRvciA9IF9yZXF1aXJlLndyYXBXaXRoSXRlcmFibGVJdGVyYXRvcjtcblxudmFyIGhhc093blByb3BlcnR5ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcblxuZnVuY3Rpb24gX19vYmplY3RWYWx1ZXMob2JqKSB7XG4gIHZhciBrZXk7XG4gIHJldHVybiBfcmVnZW5lcmF0b3JSdW50aW1lLndyYXAoZnVuY3Rpb24gX19vYmplY3RWYWx1ZXMkKF9jb250ZXh0KSB7XG4gICAgd2hpbGUgKDEpIHtcbiAgICAgIHN3aXRjaCAoX2NvbnRleHQucHJldiA9IF9jb250ZXh0Lm5leHQpIHtcbiAgICAgICAgY2FzZSAwOlxuICAgICAgICAgIGlmICghKG9iaiA9PSBudWxsKSkge1xuICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDI7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gX2NvbnRleHQuYWJydXB0KFwicmV0dXJuXCIpO1xuXG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgICBfY29udGV4dC50MCA9IF9yZWdlbmVyYXRvclJ1bnRpbWUua2V5cyhvYmopO1xuXG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgICBpZiAoKF9jb250ZXh0LnQxID0gX2NvbnRleHQudDAoKSkuZG9uZSkge1xuICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDEwO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAga2V5ID0gX2NvbnRleHQudDEudmFsdWU7XG5cbiAgICAgICAgICBpZiAoIWhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpKSB7XG4gICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gODtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSA4O1xuICAgICAgICAgIHJldHVybiBvYmpba2V5XTtcblxuICAgICAgICBjYXNlIDg6XG4gICAgICAgICAgX2NvbnRleHQubmV4dCA9IDM7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAxMDpcbiAgICAgICAgY2FzZSBcImVuZFwiOlxuICAgICAgICAgIHJldHVybiBfY29udGV4dC5zdG9wKCk7XG4gICAgICB9XG4gICAgfVxuICB9LCBfbWFya2VkKTtcbn1cblxuZXhwb3J0cy5fX29iamVjdFZhbHVlcyA9IF9fb2JqZWN0VmFsdWVzO1xudmFyIG9iamVjdFZhbHVlcyA9IC8qI19fUFVSRV9fKi93cmFwV2l0aEl0ZXJhYmxlSXRlcmF0b3IoX19vYmplY3RWYWx1ZXMsIHtcbiAgdmFsaWRhdGVBcmdzOiBmdW5jdGlvbiB2YWxpZGF0ZUFyZ3MoYXJncykge1xuICAgIGlmICghKGFyZ3NbMF0gPT0gbnVsbCB8fCBfdHlwZW9mKGFyZ3NbMF0pID09PSAnb2JqZWN0JykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignb2JqIGFyZ3VtZW50IHRvIG9iamVjdFZhbHVlcyBtdXN0IGJlIGFuIG9iamVjdCwgbnVsbCwgb3IgdW5kZWZpbmVkJyk7XG4gICAgfVxuICB9XG59KTtcbmV4cG9ydHMub2JqZWN0VmFsdWVzID0gb2JqZWN0VmFsdWVzOyIsInZhciBpZGVudGl0eSA9IGZ1bmN0aW9uIGlkZW50aXR5KHgpIHtcbiAgcmV0dXJuIHg7XG59O1xuXG5mdW5jdGlvbiBwaXBlKCkge1xuICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgZm5zID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgIGZuc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgfVxuXG4gIGlmICghZm5zLmxlbmd0aCkgZm5zID0gW2lkZW50aXR5XTtcbiAgcmV0dXJuIGZucy5yZWR1Y2UoZnVuY3Rpb24gKGYsIGcpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIGcoZi5hcHBseSh2b2lkIDAsIGFyZ3VtZW50cykpO1xuICAgIH07XG4gIH0pO1xufVxuXG5leHBvcnRzLnBpcGUgPSBwaXBlOyIsInZhciBfc2xpY2VkVG9BcnJheSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3NsaWNlZFRvQXJyYXlcIik7XG5cbnZhciBfcmVnZW5lcmF0b3JSdW50aW1lID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL3JlZ2VuZXJhdG9yXCIpO1xuXG52YXIgX21hcmtlZCA9IC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3JSdW50aW1lLm1hcmsoX19yYW5nZSk7XG5cbnZhciBfcmVxdWlyZSA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFsL2l0ZXJhYmxlLmpzJyksXG4gICAgd3JhcFdpdGhJdGVyYWJsZUl0ZXJhdG9yID0gX3JlcXVpcmUud3JhcFdpdGhJdGVyYWJsZUl0ZXJhdG9yO1xuXG52YXIgX3JlcXVpcmUyID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWwvbnVtYmVyLmpzJyksXG4gICAgaXNJbnRlZ2VyID0gX3JlcXVpcmUyLmlzSW50ZWdlcixcbiAgICBpc0ludGVnZXJPckluZmluaXRlID0gX3JlcXVpcmUyLmlzSW50ZWdlck9ySW5maW5pdGU7XG5cbnZhciBfcmVxdWlyZTMgPSByZXF1aXJlKCcuLi9pcy1vYmplY3QvaXMtb2JqZWN0LmpzJyksXG4gICAgaXNPYmplY3QgPSBfcmVxdWlyZTMuaXNPYmplY3Q7XG5cbnZhciBfcmVxdWlyZTQgPSByZXF1aXJlKCcuLi9ub3QtdW5kZWZpbmVkL25vdC11bmRlZmluZWQuanMnKSxcbiAgICBub3RVbmRlZmluZWQgPSBfcmVxdWlyZTQubm90VW5kZWZpbmVkO1xuXG5mdW5jdGlvbiBfX3JhbmdlKCkge1xuICB2YXIgc3RhcnQsXG4gICAgICBlbmQsXG4gICAgICBzdGVwLFxuICAgICAgaSxcbiAgICAgIF9hcmdzID0gYXJndW1lbnRzO1xuICByZXR1cm4gX3JlZ2VuZXJhdG9yUnVudGltZS53cmFwKGZ1bmN0aW9uIF9fcmFuZ2UkKF9jb250ZXh0KSB7XG4gICAgd2hpbGUgKDEpIHtcbiAgICAgIHN3aXRjaCAoX2NvbnRleHQucHJldiA9IF9jb250ZXh0Lm5leHQpIHtcbiAgICAgICAgY2FzZSAwOlxuICAgICAgICAgIHN0YXJ0ID0gX2FyZ3MubGVuZ3RoID4gMCAmJiBfYXJnc1swXSAhPT0gdW5kZWZpbmVkID8gX2FyZ3NbMF0gOiAwO1xuICAgICAgICAgIGVuZCA9IF9hcmdzLmxlbmd0aCA+IDEgJiYgX2FyZ3NbMV0gIT09IHVuZGVmaW5lZCA/IF9hcmdzWzFdIDogSW5maW5pdHk7XG4gICAgICAgICAgc3RlcCA9IF9hcmdzLmxlbmd0aCA+IDIgJiYgX2FyZ3NbMl0gIT09IHVuZGVmaW5lZCA/IF9hcmdzWzJdIDogMTtcbiAgICAgICAgICBpID0gc3RhcnQ7XG5cbiAgICAgICAgY2FzZSA0OlxuICAgICAgICAgIGlmICghKHN0ZXAgPiAwID8gaSA8IGVuZCA6IGkgPiBlbmQpKSB7XG4gICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMTA7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBfY29udGV4dC5uZXh0ID0gNztcbiAgICAgICAgICByZXR1cm4gaTtcblxuICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgaSArPSBzdGVwO1xuICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSA0O1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgMTA6XG4gICAgICAgIGNhc2UgXCJlbmRcIjpcbiAgICAgICAgICByZXR1cm4gX2NvbnRleHQuc3RvcCgpO1xuICAgICAgfVxuICAgIH1cbiAgfSwgX21hcmtlZCk7XG59XG5cbmV4cG9ydHMuX19yYW5nZSA9IF9fcmFuZ2U7XG52YXIgcmFuZ2UgPSAvKiNfX1BVUkVfXyovd3JhcFdpdGhJdGVyYWJsZUl0ZXJhdG9yKF9fcmFuZ2UsIHtcbiAgZ3Jvd1JpZ2h0OiB0cnVlLFxuICB2YWxpZGF0ZUFyZ3M6IGZ1bmN0aW9uIHZhbGlkYXRlQXJncyhhcmdzKSB7XG4gICAgdmFyIF9hcmdzMiA9IF9zbGljZWRUb0FycmF5KGFyZ3MsIDMpLFxuICAgICAgICBvcHRzT3JFbmRPclN0YXJ0ID0gX2FyZ3MyWzBdLFxuICAgICAgICBfYXJnczIkID0gX2FyZ3MyWzFdLFxuICAgICAgICBlbmQgPSBfYXJnczIkID09PSB2b2lkIDAgPyBJbmZpbml0eSA6IF9hcmdzMiQsXG4gICAgICAgIHN0ZXAgPSBfYXJnczJbMl07XG5cbiAgICB2YXIgc3RhcnQ7XG5cbiAgICBpZiAoaXNPYmplY3Qob3B0c09yRW5kT3JTdGFydCkpIHtcbiAgICAgIHN0YXJ0ID0gb3B0c09yRW5kT3JTdGFydC5zdGFydDtcbiAgICAgIGVuZCA9IG9wdHNPckVuZE9yU3RhcnQuZW5kO1xuICAgICAgc3RlcCA9IG9wdHNPckVuZE9yU3RhcnQuc3RlcDtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGFyZ3MubGVuZ3RoID4gMSkge1xuICAgICAgICBzdGFydCA9IG9wdHNPckVuZE9yU3RhcnQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlbmQgPSBvcHRzT3JFbmRPclN0YXJ0O1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChub3RVbmRlZmluZWQoc3RhcnQpICYmICFpc0ludGVnZXIoc3RhcnQpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgc3BlY2lmaWVkIHN0YXJ0IHdhcyBub3QgYW4gaW50ZWdlcicpO1xuICAgIH1cblxuICAgIGlmIChub3RVbmRlZmluZWQoZW5kKSAmJiAhaXNJbnRlZ2VyT3JJbmZpbml0ZShlbmQpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgc3BlY2lmaWVkIGVuZCB3YXMgbm90IGFuIGludGVnZXIgb3IgaW5maW5pdGUnKTtcbiAgICB9XG5cbiAgICBpZiAobm90VW5kZWZpbmVkKHN0ZXApICYmICFpc0ludGVnZXIoc3RlcCwgdHJ1ZSkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBzcGVjaWZpZWQgc3RlcCB3YXMgbm90IGEgbm9uLXplcm8gaW50ZWdlcicpO1xuICAgIH1cblxuICAgIGFyZ3NbMF0gPSBzdGFydDtcbiAgICBhcmdzWzFdID0gZW5kO1xuICAgIGFyZ3NbMl0gPSBzdGVwO1xuICB9XG59KTtcbmV4cG9ydHMucmFuZ2UgPSByYW5nZTsiLCJ2YXIgX3JlZ2VuZXJhdG9yUnVudGltZSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9yZWdlbmVyYXRvclwiKTtcblxudmFyIF9tYXJrZWQgPSAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yUnVudGltZS5tYXJrKF9fcmVwZWF0VGltZXMpO1xuXG52YXIgX3JlcXVpcmUgPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbC9jdXJyeS5qcycpLFxuICAgIGN1cnJ5ID0gX3JlcXVpcmUuY3Vycnk7XG5cbnZhciBfcmVxdWlyZTIgPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbC9pdGVyYWJsZS5qcycpLFxuICAgIHdyYXBXaXRoSXRlcmFibGVJdGVyYXRvciA9IF9yZXF1aXJlMi53cmFwV2l0aEl0ZXJhYmxlSXRlcmF0b3I7XG5cbmZ1bmN0aW9uIF9fcmVwZWF0VGltZXMobiwgdmFsdWUpIHtcbiAgcmV0dXJuIF9yZWdlbmVyYXRvclJ1bnRpbWUud3JhcChmdW5jdGlvbiBfX3JlcGVhdFRpbWVzJChfY29udGV4dCkge1xuICAgIHdoaWxlICgxKSB7XG4gICAgICBzd2l0Y2ggKF9jb250ZXh0LnByZXYgPSBfY29udGV4dC5uZXh0KSB7XG4gICAgICAgIGNhc2UgMDpcbiAgICAgICAgICBpZiAoIW4tLSkge1xuICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDU7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMztcbiAgICAgICAgICByZXR1cm4gdmFsdWU7XG5cbiAgICAgICAgY2FzZSAzOlxuICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAwO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgNTpcbiAgICAgICAgY2FzZSBcImVuZFwiOlxuICAgICAgICAgIHJldHVybiBfY29udGV4dC5zdG9wKCk7XG4gICAgICB9XG4gICAgfVxuICB9LCBfbWFya2VkKTtcbn1cblxuZXhwb3J0cy5fX3JlcGVhdFRpbWVzID0gX19yZXBlYXRUaW1lcztcbnZhciByZXBlYXRUaW1lcyA9IC8qI19fUFVSRV9fKi9jdXJyeSggLyojX19QVVJFX18qL3dyYXBXaXRoSXRlcmFibGVJdGVyYXRvcihfX3JlcGVhdFRpbWVzKSwgX19yZXBlYXRUaW1lcy5sZW5ndGgpO1xuZXhwb3J0cy5yZXBlYXRUaW1lcyA9IHJlcGVhdFRpbWVzOyIsInZhciBfcmVnZW5lcmF0b3JSdW50aW1lID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL3JlZ2VuZXJhdG9yXCIpO1xuXG52YXIgX21hcmtlZCA9IC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3JSdW50aW1lLm1hcmsoX19yZXBlYXQpO1xuXG52YXIgX3JlcXVpcmUgPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbC9pdGVyYWJsZS5qcycpLFxuICAgIHdyYXBXaXRoSXRlcmFibGVJdGVyYXRvciA9IF9yZXF1aXJlLndyYXBXaXRoSXRlcmFibGVJdGVyYXRvcjtcblxuZnVuY3Rpb24gX19yZXBlYXQodmFsdWUpIHtcbiAgcmV0dXJuIF9yZWdlbmVyYXRvclJ1bnRpbWUud3JhcChmdW5jdGlvbiBfX3JlcGVhdCQoX2NvbnRleHQpIHtcbiAgICB3aGlsZSAoMSkge1xuICAgICAgc3dpdGNoIChfY29udGV4dC5wcmV2ID0gX2NvbnRleHQubmV4dCkge1xuICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgaWYgKCF0cnVlKSB7XG4gICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gNTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAzO1xuICAgICAgICAgIHJldHVybiB2YWx1ZTtcblxuICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgX2NvbnRleHQubmV4dCA9IDA7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSA1OlxuICAgICAgICBjYXNlIFwiZW5kXCI6XG4gICAgICAgICAgcmV0dXJuIF9jb250ZXh0LnN0b3AoKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIF9tYXJrZWQpO1xufVxuXG5leHBvcnRzLl9fcmVwZWF0ID0gX19yZXBlYXQ7XG52YXIgcmVwZWF0ID0gLyojX19QVVJFX18qL3dyYXBXaXRoSXRlcmFibGVJdGVyYXRvcihfX3JlcGVhdCk7XG5leHBvcnRzLnJlcGVhdCA9IHJlcGVhdDsiLCJleHBvcnRzLl9fc3RyaW5nRnJvbUFzeW5jID0gcmVxdWlyZSgnLi4vJHN0ci9hc3luYy1zdHIuanMnKS5fX2FzeW5jU3RyO1xuZXhwb3J0cy5zdHJpbmdGcm9tQXN5bmMgPSByZXF1aXJlKCcuLi8kc3RyL2FzeW5jLXN0ci5qcycpLmFzeW5jU3RyOyIsImV4cG9ydHMuX19zdHJpbmdGcm9tID0gcmVxdWlyZSgnLi4vJHN0ci9zdHIuanMnKS5fX3N0cjtcbmV4cG9ydHMuc3RyaW5nRnJvbSA9IHJlcXVpcmUoJy4uLyRzdHIvc3RyLmpzJykuc3RyOyIsInZhciBfdHlwZW9mID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvdHlwZW9mXCIpO1xuXG52YXIgX2RlZmluZVByb3BlcnR5ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZGVmaW5lUHJvcGVydHlcIik7XG5cbnZhciBlbXB0eUl0ZXJhdG9yID0ge1xuICBuZXh0OiBmdW5jdGlvbiBuZXh0KCkge1xuICAgIHJldHVybiB7XG4gICAgICB2YWx1ZTogdW5kZWZpbmVkLFxuICAgICAgZG9uZTogdHJ1ZVxuICAgIH07XG4gIH1cbn07XG52YXIgZW1wdHlTcHJlYWRhYmxlID0gT2JqZWN0LmZyZWV6ZShPYmplY3QuY3JlYXRlKF9kZWZpbmVQcm9wZXJ0eSh7fSwgU3ltYm9sLml0ZXJhdG9yLCBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBlbXB0eUl0ZXJhdG9yO1xufSkpKTtcblxuZnVuY3Rpb24gd2hlbihjb25kaXRpb24sIHZhbHVlKSB7XG4gIHZhciB2YWx1ZVR5cGUgPSBfdHlwZW9mKHZhbHVlKTtcblxuICBpZiAoISh2YWx1ZSA9PSBudWxsIHx8IHZhbHVlW1N5bWJvbC5pdGVyYXRvcl0gfHwgdmFsdWVUeXBlID09PSAnb2JqZWN0JyB8fCB2YWx1ZVR5cGUgPT09ICdmdW5jdGlvbicpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdTZWNvbmQgYXJndW1lbnQgdG8gd2hlbiBtdXN0IGJlIGFuIG9iamVjdCwgaXRlcmFibGUsIG9yIGZ1bmN0aW9uLicpO1xuICB9XG5cbiAgcmV0dXJuIGNvbmRpdGlvbiAmJiB2YWx1ZSAhPSBudWxsID8gdmFsdWVUeXBlID09PSAnZnVuY3Rpb24nID8gdmFsdWUoKSA6IHZhbHVlIDogZW1wdHlTcHJlYWRhYmxlO1xufVxuXG5leHBvcnRzLndoZW4gPSB3aGVuOyIsInZhciBfcmVnZW5lcmF0b3JSdW50aW1lID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL3JlZ2VuZXJhdG9yXCIpO1xuXG52YXIgX21hcmtlZCA9IC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3JSdW50aW1lLm1hcmsoX193cmFwRW50cmllcyk7XG5cbnZhciBfcmVxdWlyZSA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFsL2l0ZXJhYmxlLmpzJyksXG4gICAgd3JhcFdpdGhJdGVyYWJsZUl0ZXJhdG9yID0gX3JlcXVpcmUud3JhcFdpdGhJdGVyYWJsZUl0ZXJhdG9yO1xuXG5mdW5jdGlvbiBfX3dyYXBFbnRyaWVzKGVudHJpZXNhYmxlKSB7XG4gIHJldHVybiBfcmVnZW5lcmF0b3JSdW50aW1lLndyYXAoZnVuY3Rpb24gX193cmFwRW50cmllcyQoX2NvbnRleHQpIHtcbiAgICB3aGlsZSAoMSkge1xuICAgICAgc3dpdGNoIChfY29udGV4dC5wcmV2ID0gX2NvbnRleHQubmV4dCkge1xuICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgaWYgKCEoZW50cmllc2FibGUgIT0gbnVsbCkpIHtcbiAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAyO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIF9jb250ZXh0LmRlbGVnYXRlWWllbGQoZW50cmllc2FibGUuZW50cmllcygpLCBcInQwXCIsIDIpO1xuXG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgY2FzZSBcImVuZFwiOlxuICAgICAgICAgIHJldHVybiBfY29udGV4dC5zdG9wKCk7XG4gICAgICB9XG4gICAgfVxuICB9LCBfbWFya2VkKTtcbn1cblxuZXhwb3J0cy5fX3dyYXBFbnRyaWVzID0gX193cmFwRW50cmllcztcbnZhciB3cmFwRW50cmllcyA9IC8qI19fUFVSRV9fKi93cmFwV2l0aEl0ZXJhYmxlSXRlcmF0b3IoX193cmFwRW50cmllcyk7XG5leHBvcnRzLndyYXBFbnRyaWVzID0gd3JhcEVudHJpZXM7IiwidmFyIF9yZWdlbmVyYXRvclJ1bnRpbWUgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvcmVnZW5lcmF0b3JcIik7XG5cbnZhciBfbWFya2VkID0gLyojX19QVVJFX18qL19yZWdlbmVyYXRvclJ1bnRpbWUubWFyayhfX3dyYXBLZXlzKTtcblxudmFyIF9yZXF1aXJlID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWwvaXRlcmFibGUuanMnKSxcbiAgICB3cmFwV2l0aEl0ZXJhYmxlSXRlcmF0b3IgPSBfcmVxdWlyZS53cmFwV2l0aEl0ZXJhYmxlSXRlcmF0b3I7XG5cbmZ1bmN0aW9uIF9fd3JhcEtleXMoa2V5c2FibGUpIHtcbiAgcmV0dXJuIF9yZWdlbmVyYXRvclJ1bnRpbWUud3JhcChmdW5jdGlvbiBfX3dyYXBLZXlzJChfY29udGV4dCkge1xuICAgIHdoaWxlICgxKSB7XG4gICAgICBzd2l0Y2ggKF9jb250ZXh0LnByZXYgPSBfY29udGV4dC5uZXh0KSB7XG4gICAgICAgIGNhc2UgMDpcbiAgICAgICAgICBpZiAoIShrZXlzYWJsZSAhPSBudWxsKSkge1xuICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDI7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gX2NvbnRleHQuZGVsZWdhdGVZaWVsZChrZXlzYWJsZS5rZXlzKCksIFwidDBcIiwgMik7XG5cbiAgICAgICAgY2FzZSAyOlxuICAgICAgICBjYXNlIFwiZW5kXCI6XG4gICAgICAgICAgcmV0dXJuIF9jb250ZXh0LnN0b3AoKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIF9tYXJrZWQpO1xufVxuXG5leHBvcnRzLl9fd3JhcEtleXMgPSBfX3dyYXBLZXlzO1xudmFyIHdyYXBLZXlzID0gLyojX19QVVJFX18qL3dyYXBXaXRoSXRlcmFibGVJdGVyYXRvcihfX3dyYXBLZXlzKTtcbmV4cG9ydHMud3JhcEtleXMgPSB3cmFwS2V5czsiLCJ2YXIgX3JlZ2VuZXJhdG9yUnVudGltZSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9yZWdlbmVyYXRvclwiKTtcblxudmFyIF9tYXJrZWQgPSAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yUnVudGltZS5tYXJrKF9fd3JhcFZhbHVlcyk7XG5cbnZhciBfcmVxdWlyZSA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFsL2l0ZXJhYmxlLmpzJyksXG4gICAgd3JhcFdpdGhJdGVyYWJsZUl0ZXJhdG9yID0gX3JlcXVpcmUud3JhcFdpdGhJdGVyYWJsZUl0ZXJhdG9yO1xuXG5mdW5jdGlvbiBfX3dyYXBWYWx1ZXModmFsdWVzYWJsZSkge1xuICByZXR1cm4gX3JlZ2VuZXJhdG9yUnVudGltZS53cmFwKGZ1bmN0aW9uIF9fd3JhcFZhbHVlcyQoX2NvbnRleHQpIHtcbiAgICB3aGlsZSAoMSkge1xuICAgICAgc3dpdGNoIChfY29udGV4dC5wcmV2ID0gX2NvbnRleHQubmV4dCkge1xuICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgaWYgKCEodmFsdWVzYWJsZSAhPSBudWxsKSkge1xuICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDI7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gX2NvbnRleHQuZGVsZWdhdGVZaWVsZCh2YWx1ZXNhYmxlLnZhbHVlcygpLCBcInQwXCIsIDIpO1xuXG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgY2FzZSBcImVuZFwiOlxuICAgICAgICAgIHJldHVybiBfY29udGV4dC5zdG9wKCk7XG4gICAgICB9XG4gICAgfVxuICB9LCBfbWFya2VkKTtcbn1cblxuZXhwb3J0cy5fX3dyYXBWYWx1ZXMgPSBfX3dyYXBWYWx1ZXM7XG52YXIgd3JhcFZhbHVlcyA9IC8qI19fUFVSRV9fKi93cmFwV2l0aEl0ZXJhYmxlSXRlcmF0b3IoX193cmFwVmFsdWVzKTtcbmV4cG9ydHMud3JhcFZhbHVlcyA9IHdyYXBWYWx1ZXM7IiwiZXhwb3J0cy5fX2FwcGVuZCA9IHJlcXVpcmUoJy4vX19tZXRob2RzL2FwcGVuZC5qcycpO1xuZXhwb3J0cy5fX2FwcGx5ID0gcmVxdWlyZSgnLi9fX21ldGhvZHMvYXBwbHkuanMnKTtcbmV4cG9ydHMuX19hcnJheVJldmVyc2UgPSByZXF1aXJlKCcuL19fbWV0aG9kcy9hcnJheS1yZXZlcnNlLmpzJyk7XG5leHBvcnRzLl9fYXN5bmNBcHBlbmQgPSByZXF1aXJlKCcuL19fbWV0aG9kcy9hc3luYy1hcHBlbmQuanMnKTtcbmV4cG9ydHMuX19hc3luY0JhdGNoID0gcmVxdWlyZSgnLi9fX21ldGhvZHMvYXN5bmMtYmF0Y2guanMnKTtcbmV4cG9ydHMuX19hc3luY0Jpc2VjdCA9IHJlcXVpcmUoJy4vX19tZXRob2RzL2FzeW5jLWJpc2VjdC5qcycpO1xuZXhwb3J0cy5fX2FzeW5jQnVmZmVyID0gcmVxdWlyZSgnLi9fX21ldGhvZHMvYXN5bmMtYnVmZmVyLmpzJyk7XG5leHBvcnRzLl9fYXN5bmNDb2xsYXRlID0gcmVxdWlyZSgnLi9fX21ldGhvZHMvYXN5bmMtY29sbGF0ZS5qcycpO1xuZXhwb3J0cy5fX2FzeW5jQ29tcHJlc3MgPSByZXF1aXJlKCcuL19fbWV0aG9kcy9hc3luYy1jb21wcmVzcy5qcycpO1xuZXhwb3J0cy5fX2FzeW5jQ29uY2F0ID0gcmVxdWlyZSgnLi9fX21ldGhvZHMvYXN5bmMtY29uY2F0LmpzJyk7XG5leHBvcnRzLl9fYXN5bmNDb25zdW1lID0gcmVxdWlyZSgnLi9fX21ldGhvZHMvYXN5bmMtY29uc3VtZS5qcycpO1xuZXhwb3J0cy5fX2FzeW5jQ3ljbGUgPSByZXF1aXJlKCcuL19fbWV0aG9kcy9hc3luYy1jeWNsZS5qcycpO1xuZXhwb3J0cy5fX2FzeW5jQ3ljbGVUaW1lcyA9IHJlcXVpcmUoJy4vX19tZXRob2RzL2FzeW5jLWN5Y2xlLXRpbWVzLmpzJyk7XG5leHBvcnRzLl9fYXN5bmNEZWVwRXF1YWwgPSByZXF1aXJlKCcuL19fbWV0aG9kcy9hc3luYy1kZWVwLWVxdWFsLmpzJyk7XG5leHBvcnRzLl9fYXN5bmNEaXN0aW5jdCA9IHJlcXVpcmUoJy4vX19tZXRob2RzL2FzeW5jLWRpc3RpbmN0LmpzJyk7XG5leHBvcnRzLl9fYXN5bmNEcm9wID0gcmVxdWlyZSgnLi9fX21ldGhvZHMvYXN5bmMtZHJvcC5qcycpO1xuZXhwb3J0cy5fX2FzeW5jRHJvcFdoaWxlID0gcmVxdWlyZSgnLi9fX21ldGhvZHMvYXN5bmMtZHJvcC13aGlsZS5qcycpO1xuZXhwb3J0cy5fX2FzeW5jRW51bWVyYXRlID0gcmVxdWlyZSgnLi9fX21ldGhvZHMvYXN5bmMtZW51bWVyYXRlLmpzJyk7XG5leHBvcnRzLl9fYXN5bmNFcXVhbCA9IHJlcXVpcmUoJy4vX19tZXRob2RzL2FzeW5jLWVxdWFsLmpzJyk7XG5leHBvcnRzLl9fYXN5bmNFdmVyeSA9IHJlcXVpcmUoJy4vX19tZXRob2RzL2FzeW5jLWV2ZXJ5LmpzJyk7XG5leHBvcnRzLl9fYXN5bmNGaWx0ZXIgPSByZXF1aXJlKCcuL19fbWV0aG9kcy9hc3luYy1maWx0ZXIuanMnKTtcbmV4cG9ydHMuX19hc3luY0ZpbmQgPSByZXF1aXJlKCcuL19fbWV0aG9kcy9hc3luYy1maW5kLmpzJyk7XG5leHBvcnRzLl9fYXN5bmNGaW5kQmVzdCA9IHJlcXVpcmUoJy4vX19tZXRob2RzL2FzeW5jLWZpbmQtYmVzdC5qcycpO1xuZXhwb3J0cy5fX2FzeW5jRmluZEJlc3RPciA9IHJlcXVpcmUoJy4vX19tZXRob2RzL2FzeW5jLWZpbmQtYmVzdC1vci5qcycpO1xuZXhwb3J0cy5fX2FzeW5jRmluZE9yID0gcmVxdWlyZSgnLi9fX21ldGhvZHMvYXN5bmMtZmluZC1vci5qcycpO1xuZXhwb3J0cy5fX2FzeW5jRmlyc3QgPSByZXF1aXJlKCcuL19fbWV0aG9kcy9hc3luYy1maXJzdC5qcycpO1xuZXhwb3J0cy5fX2FzeW5jRmlyc3RPciA9IHJlcXVpcmUoJy4vX19tZXRob2RzL2FzeW5jLWZpcnN0LW9yLmpzJyk7XG5leHBvcnRzLl9fYXN5bmNGbGF0ID0gcmVxdWlyZSgnLi9fX21ldGhvZHMvYXN5bmMtZmxhdC5qcycpO1xuZXhwb3J0cy5fX2FzeW5jRmxhdE1hcCA9IHJlcXVpcmUoJy4vX19tZXRob2RzL2FzeW5jLWZsYXQtbWFwLmpzJyk7XG5leHBvcnRzLl9fYXN5bmNGb3JFYWNoID0gcmVxdWlyZSgnLi9fX21ldGhvZHMvYXN5bmMtZm9yLWVhY2guanMnKTtcbmV4cG9ydHMuX19hc3luY0ZvcmsgPSByZXF1aXJlKCcuL19fbWV0aG9kcy9hc3luYy1mb3JrLmpzJyk7XG5leHBvcnRzLl9fYXN5bmNGb3JrZXJhdGUgPSByZXF1aXJlKCcuL19fbWV0aG9kcy9hc3luYy1mb3JrZXJhdGUuanMnKTtcbmV4cG9ydHMuX19hc3luY0luY2x1ZGVzID0gcmVxdWlyZSgnLi9fX21ldGhvZHMvYXN5bmMtaW5jbHVkZXMuanMnKTtcbmV4cG9ydHMuX19hc3luY0luY2x1ZGVzQW55ID0gcmVxdWlyZSgnLi9fX21ldGhvZHMvYXN5bmMtaW5jbHVkZXMtYW55LmpzJyk7XG5leHBvcnRzLl9fYXN5bmNJbmNsdWRlc0FueVNlcSA9IHJlcXVpcmUoJy4vX19tZXRob2RzL2FzeW5jLWluY2x1ZGVzLWFueS1zZXEuanMnKTtcbmV4cG9ydHMuX19hc3luY0luY2x1ZGVzU2VxID0gcmVxdWlyZSgnLi9fX21ldGhvZHMvYXN5bmMtaW5jbHVkZXMtc2VxLmpzJyk7XG5leHBvcnRzLl9fYXN5bmNJbnRlcmxlYXZlID0gcmVxdWlyZSgnLi9fX21ldGhvZHMvYXN5bmMtaW50ZXJsZWF2ZS5qcycpO1xuZXhwb3J0cy5fX2FzeW5jSW50ZXJsZWF2ZVJlYWR5ID0gcmVxdWlyZSgnLi9fX21ldGhvZHMvYXN5bmMtaW50ZXJsZWF2ZS1yZWFkeS5qcycpO1xuZXhwb3J0cy5fX2FzeW5jSW50ZXJwb3NlID0gcmVxdWlyZSgnLi9fX21ldGhvZHMvYXN5bmMtaW50ZXJwb3NlLmpzJyk7XG5leHBvcnRzLl9fYXN5bmNJbnRlcnBvc2VTZXEgPSByZXF1aXJlKCcuL19fbWV0aG9kcy9hc3luYy1pbnRlcnBvc2Utc2VxLmpzJyk7XG5leHBvcnRzLl9fYXN5bmNJc0VtcHR5ID0gcmVxdWlyZSgnLi9fX21ldGhvZHMvYXN5bmMtaXMtZW1wdHkuanMnKTtcbmV4cG9ydHMuX19hc3luY0lzU29ydGVkID0gcmVxdWlyZSgnLi9fX21ldGhvZHMvYXN5bmMtaXMtc29ydGVkLmpzJyk7XG5leHBvcnRzLl9fYXN5bmNKb2luID0gcmVxdWlyZSgnLi9fX21ldGhvZHMvYXN5bmMtam9pbi5qcycpO1xuZXhwb3J0cy5fX2FzeW5jSm9pbldpdGggPSByZXF1aXJlKCcuL19fbWV0aG9kcy9hc3luYy1qb2luLXdpdGguanMnKTtcbmV4cG9ydHMuX19hc3luY0pvaW5XaXRoU2VxID0gcmVxdWlyZSgnLi9fX21ldGhvZHMvYXN5bmMtam9pbi13aXRoLXNlcS5qcycpO1xuZXhwb3J0cy5fX2FzeW5jTWFwID0gcmVxdWlyZSgnLi9fX21ldGhvZHMvYXN5bmMtbWFwLmpzJyk7XG5leHBvcnRzLl9fYXN5bmNQZWVrZXJhdGUgPSByZXF1aXJlKCcuL19fbWV0aG9kcy9hc3luYy1wZWVrZXJhdGUuanMnKTtcbmV4cG9ydHMuX19hc3luY1ByZXBlbmQgPSByZXF1aXJlKCcuL19fbWV0aG9kcy9hc3luYy1wcmVwZW5kLmpzJyk7XG5leHBvcnRzLl9fYXN5bmNSZWR1Y2UgPSByZXF1aXJlKCcuL19fbWV0aG9kcy9hc3luYy1yZWR1Y2UuanMnKTtcbmV4cG9ydHMuX19hc3luY1JldmVyc2UgPSByZXF1aXJlKCcuL19fbWV0aG9kcy9hc3luYy1yZXZlcnNlLmpzJyk7XG5leHBvcnRzLl9fYXN5bmNSb3VuZFJvYmluID0gcmVxdWlyZSgnLi9fX21ldGhvZHMvYXN5bmMtcm91bmQtcm9iaW4uanMnKTtcbmV4cG9ydHMuX19hc3luY1NpemUgPSByZXF1aXJlKCcuL19fbWV0aG9kcy9hc3luYy1zaXplLmpzJyk7XG5leHBvcnRzLl9fYXN5bmNTbGljZSA9IHJlcXVpcmUoJy4vX19tZXRob2RzL2FzeW5jLXNsaWNlLmpzJyk7XG5leHBvcnRzLl9fYXN5bmNTb21lID0gcmVxdWlyZSgnLi9fX21ldGhvZHMvYXN5bmMtc29tZS5qcycpO1xuZXhwb3J0cy5fX2FzeW5jU3BsaXQgPSByZXF1aXJlKCcuL19fbWV0aG9kcy9hc3luYy1zcGxpdC5qcycpO1xuZXhwb3J0cy5fX2FzeW5jU3BsaXRHcm91cHMgPSByZXF1aXJlKCcuL19fbWV0aG9kcy9hc3luYy1zcGxpdC1ncm91cHMuanMnKTtcbmV4cG9ydHMuX19hc3luY1NwbGl0T24gPSByZXF1aXJlKCcuL19fbWV0aG9kcy9hc3luYy1zcGxpdC1vbi5qcycpO1xuZXhwb3J0cy5fX2FzeW5jU3BsaXRPbkFueSA9IHJlcXVpcmUoJy4vX19tZXRob2RzL2FzeW5jLXNwbGl0LW9uLWFueS5qcycpO1xuZXhwb3J0cy5fX2FzeW5jU3BsaXRPbkFueVNlcSA9IHJlcXVpcmUoJy4vX19tZXRob2RzL2FzeW5jLXNwbGl0LW9uLWFueS1zZXEuanMnKTtcbmV4cG9ydHMuX19hc3luY1NwbGl0T25TZXEgPSByZXF1aXJlKCcuL19fbWV0aG9kcy9hc3luYy1zcGxpdC1vbi1zZXEuanMnKTtcbmV4cG9ydHMuX19hc3luY1NwbGl0V2hlbiA9IHJlcXVpcmUoJy4vX19tZXRob2RzL2FzeW5jLXNwbGl0LXdoZW4uanMnKTtcbmV4cG9ydHMuX19hc3luY1NwbGl0ZXJhdGUgPSByZXF1aXJlKCcuL19fbWV0aG9kcy9hc3luYy1zcGxpdGVyYXRlLmpzJyk7XG5leHBvcnRzLl9fYXN5bmNTcGxpdGVyYXRlR3JvdXBlZCA9IHJlcXVpcmUoJy4vX19tZXRob2RzL2FzeW5jLXNwbGl0ZXJhdGUtZ3JvdXBlZC5qcycpO1xuZXhwb3J0cy5fX2FzeW5jU3RhcnRzV2l0aCA9IHJlcXVpcmUoJy4vX19tZXRob2RzL2FzeW5jLXN0YXJ0cy13aXRoLmpzJyk7XG5leHBvcnRzLl9fYXN5bmNTdGFydHNXaXRoQW55ID0gcmVxdWlyZSgnLi9fX21ldGhvZHMvYXN5bmMtc3RhcnRzLXdpdGgtYW55LmpzJyk7XG5leHBvcnRzLl9fYXN5bmNTdGFydHNXaXRoQW55U2VxID0gcmVxdWlyZSgnLi9fX21ldGhvZHMvYXN5bmMtc3RhcnRzLXdpdGgtYW55LXNlcS5qcycpO1xuZXhwb3J0cy5fX2FzeW5jU3RhcnRzV2l0aFNlcSA9IHJlcXVpcmUoJy4vX19tZXRob2RzL2FzeW5jLXN0YXJ0cy13aXRoLXNlcS5qcycpO1xuZXhwb3J0cy5fX2FzeW5jU3RyID0gcmVxdWlyZSgnLi9fX21ldGhvZHMvYXN5bmMtc3RyLmpzJyk7XG5leHBvcnRzLl9fYXN5bmNUYWtlID0gcmVxdWlyZSgnLi9fX21ldGhvZHMvYXN5bmMtdGFrZS5qcycpO1xuZXhwb3J0cy5fX2FzeW5jVGFrZUxhc3QgPSByZXF1aXJlKCcuL19fbWV0aG9kcy9hc3luYy10YWtlLWxhc3QuanMnKTtcbmV4cG9ydHMuX19hc3luY1Rha2VMYXN0T3IgPSByZXF1aXJlKCcuL19fbWV0aG9kcy9hc3luYy10YWtlLWxhc3Qtb3IuanMnKTtcbmV4cG9ydHMuX19hc3luY1Rha2VTb3J0ZWQgPSByZXF1aXJlKCcuL19fbWV0aG9kcy9hc3luYy10YWtlLXNvcnRlZC5qcycpO1xuZXhwb3J0cy5fX2FzeW5jVGFrZVdoaWxlID0gcmVxdWlyZSgnLi9fX21ldGhvZHMvYXN5bmMtdGFrZS13aGlsZS5qcycpO1xuZXhwb3J0cy5fX2FzeW5jVGFwID0gcmVxdWlyZSgnLi9fX21ldGhvZHMvYXN5bmMtdGFwLmpzJyk7XG5leHBvcnRzLl9fYXN5bmNUaHJvdHRsZSA9IHJlcXVpcmUoJy4vX19tZXRob2RzL2FzeW5jLXRocm90dGxlLmpzJyk7XG5leHBvcnRzLl9fYXN5bmNUb0FycmF5ID0gcmVxdWlyZSgnLi9fX21ldGhvZHMvYXN5bmMtdG8tYXJyYXkuanMnKTtcbmV4cG9ydHMuX19hc3luY1RvT2JqZWN0ID0gcmVxdWlyZSgnLi9fX21ldGhvZHMvYXN5bmMtdG8tb2JqZWN0LmpzJyk7XG5leHBvcnRzLl9fYXN5bmNXaW5kb3cgPSByZXF1aXJlKCcuL19fbWV0aG9kcy9hc3luYy13aW5kb3cuanMnKTtcbmV4cG9ydHMuX19hc3luY1dpbmRvd0FoZWFkID0gcmVxdWlyZSgnLi9fX21ldGhvZHMvYXN5bmMtd2luZG93LWFoZWFkLmpzJyk7XG5leHBvcnRzLl9fYXN5bmNXaW5kb3dCZWhpbmQgPSByZXF1aXJlKCcuL19fbWV0aG9kcy9hc3luYy13aW5kb3ctYmVoaW5kLmpzJyk7XG5leHBvcnRzLl9fYXN5bmNaaXAgPSByZXF1aXJlKCcuL19fbWV0aG9kcy9hc3luYy16aXAuanMnKTtcbmV4cG9ydHMuX19hc3luY1ppcEFsbCA9IHJlcXVpcmUoJy4vX19tZXRob2RzL2FzeW5jLXppcC1hbGwuanMnKTtcbmV4cG9ydHMuX19iYXRjaCA9IHJlcXVpcmUoJy4vX19tZXRob2RzL2JhdGNoLmpzJyk7XG5leHBvcnRzLl9fYmlzZWN0ID0gcmVxdWlyZSgnLi9fX21ldGhvZHMvYmlzZWN0LmpzJyk7XG5leHBvcnRzLl9fY2FsbCA9IHJlcXVpcmUoJy4vX19tZXRob2RzL2NhbGwuanMnKTtcbmV4cG9ydHMuX19jb2xsYXRlID0gcmVxdWlyZSgnLi9fX21ldGhvZHMvY29sbGF0ZS5qcycpO1xuZXhwb3J0cy5fX2NvbXByZXNzID0gcmVxdWlyZSgnLi9fX21ldGhvZHMvY29tcHJlc3MuanMnKTtcbmV4cG9ydHMuX19jb25jYXQgPSByZXF1aXJlKCcuL19fbWV0aG9kcy9jb25jYXQuanMnKTtcbmV4cG9ydHMuX19jb25zdW1lID0gcmVxdWlyZSgnLi9fX21ldGhvZHMvY29uc3VtZS5qcycpO1xuZXhwb3J0cy5fX2N5Y2xlID0gcmVxdWlyZSgnLi9fX21ldGhvZHMvY3ljbGUuanMnKTtcbmV4cG9ydHMuX19jeWNsZVRpbWVzID0gcmVxdWlyZSgnLi9fX21ldGhvZHMvY3ljbGUtdGltZXMuanMnKTtcbmV4cG9ydHMuX19kZWVwRXF1YWwgPSByZXF1aXJlKCcuL19fbWV0aG9kcy9kZWVwLWVxdWFsLmpzJyk7XG5leHBvcnRzLl9fZGlzdGluY3QgPSByZXF1aXJlKCcuL19fbWV0aG9kcy9kaXN0aW5jdC5qcycpO1xuZXhwb3J0cy5fX2Ryb3AgPSByZXF1aXJlKCcuL19fbWV0aG9kcy9kcm9wLmpzJyk7XG5leHBvcnRzLl9fZHJvcFdoaWxlID0gcmVxdWlyZSgnLi9fX21ldGhvZHMvZHJvcC13aGlsZS5qcycpO1xuZXhwb3J0cy5fX2VudW1lcmF0ZSA9IHJlcXVpcmUoJy4vX19tZXRob2RzL2VudW1lcmF0ZS5qcycpO1xuZXhwb3J0cy5fX2VxdWFsID0gcmVxdWlyZSgnLi9fX21ldGhvZHMvZXF1YWwuanMnKTtcbmV4cG9ydHMuX19ldmVyeSA9IHJlcXVpcmUoJy4vX19tZXRob2RzL2V2ZXJ5LmpzJyk7XG5leHBvcnRzLl9fZmlsdGVyID0gcmVxdWlyZSgnLi9fX21ldGhvZHMvZmlsdGVyLmpzJyk7XG5leHBvcnRzLl9fZmluZCA9IHJlcXVpcmUoJy4vX19tZXRob2RzL2ZpbmQuanMnKTtcbmV4cG9ydHMuX19maW5kQmVzdCA9IHJlcXVpcmUoJy4vX19tZXRob2RzL2ZpbmQtYmVzdC5qcycpO1xuZXhwb3J0cy5fX2ZpbmRCZXN0T3IgPSByZXF1aXJlKCcuL19fbWV0aG9kcy9maW5kLWJlc3Qtb3IuanMnKTtcbmV4cG9ydHMuX19maW5kT3IgPSByZXF1aXJlKCcuL19fbWV0aG9kcy9maW5kLW9yLmpzJyk7XG5leHBvcnRzLl9fZmlyc3QgPSByZXF1aXJlKCcuL19fbWV0aG9kcy9maXJzdC5qcycpO1xuZXhwb3J0cy5fX2ZpcnN0T3IgPSByZXF1aXJlKCcuL19fbWV0aG9kcy9maXJzdC1vci5qcycpO1xuZXhwb3J0cy5fX2ZsYXQgPSByZXF1aXJlKCcuL19fbWV0aG9kcy9mbGF0LmpzJyk7XG5leHBvcnRzLl9fZmxhdE1hcCA9IHJlcXVpcmUoJy4vX19tZXRob2RzL2ZsYXQtbWFwLmpzJyk7XG5leHBvcnRzLl9fZm9yRWFjaCA9IHJlcXVpcmUoJy4vX19tZXRob2RzL2Zvci1lYWNoLmpzJyk7XG5leHBvcnRzLl9fZm9yayA9IHJlcXVpcmUoJy4vX19tZXRob2RzL2ZvcmsuanMnKTtcbmV4cG9ydHMuX19mb3JrZXJhdGUgPSByZXF1aXJlKCcuL19fbWV0aG9kcy9mb3JrZXJhdGUuanMnKTtcbmV4cG9ydHMuX19pbmNsdWRlcyA9IHJlcXVpcmUoJy4vX19tZXRob2RzL2luY2x1ZGVzLmpzJyk7XG5leHBvcnRzLl9faW5jbHVkZXNBbnkgPSByZXF1aXJlKCcuL19fbWV0aG9kcy9pbmNsdWRlcy1hbnkuanMnKTtcbmV4cG9ydHMuX19pbmNsdWRlc0FueVNlcSA9IHJlcXVpcmUoJy4vX19tZXRob2RzL2luY2x1ZGVzLWFueS1zZXEuanMnKTtcbmV4cG9ydHMuX19pbmNsdWRlc1NlcSA9IHJlcXVpcmUoJy4vX19tZXRob2RzL2luY2x1ZGVzLXNlcS5qcycpO1xuZXhwb3J0cy5fX2ludGVybGVhdmUgPSByZXF1aXJlKCcuL19fbWV0aG9kcy9pbnRlcmxlYXZlLmpzJyk7XG5leHBvcnRzLl9faW50ZXJwb3NlID0gcmVxdWlyZSgnLi9fX21ldGhvZHMvaW50ZXJwb3NlLmpzJyk7XG5leHBvcnRzLl9faW50ZXJwb3NlU2VxID0gcmVxdWlyZSgnLi9fX21ldGhvZHMvaW50ZXJwb3NlLXNlcS5qcycpO1xuZXhwb3J0cy5fX2lzRW1wdHkgPSByZXF1aXJlKCcuL19fbWV0aG9kcy9pcy1lbXB0eS5qcycpO1xuZXhwb3J0cy5fX2lzU29ydGVkID0gcmVxdWlyZSgnLi9fX21ldGhvZHMvaXMtc29ydGVkLmpzJyk7XG5leHBvcnRzLl9fam9pbiA9IHJlcXVpcmUoJy4vX19tZXRob2RzL2pvaW4uanMnKTtcbmV4cG9ydHMuX19qb2luV2l0aCA9IHJlcXVpcmUoJy4vX19tZXRob2RzL2pvaW4td2l0aC5qcycpO1xuZXhwb3J0cy5fX2pvaW5XaXRoU2VxID0gcmVxdWlyZSgnLi9fX21ldGhvZHMvam9pbi13aXRoLXNlcS5qcycpO1xuZXhwb3J0cy5fX21hcCA9IHJlcXVpcmUoJy4vX19tZXRob2RzL21hcC5qcycpO1xuZXhwb3J0cy5fX29iamVjdEVudHJpZXMgPSByZXF1aXJlKCcuL19fbWV0aG9kcy9vYmplY3QtZW50cmllcy5qcycpO1xuZXhwb3J0cy5fX29iamVjdEtleXMgPSByZXF1aXJlKCcuL19fbWV0aG9kcy9vYmplY3Qta2V5cy5qcycpO1xuZXhwb3J0cy5fX29iamVjdFZhbHVlcyA9IHJlcXVpcmUoJy4vX19tZXRob2RzL29iamVjdC12YWx1ZXMuanMnKTtcbmV4cG9ydHMuX19wZWVrZXJhdGUgPSByZXF1aXJlKCcuL19fbWV0aG9kcy9wZWVrZXJhdGUuanMnKTtcbmV4cG9ydHMuX19wcmVwZW5kID0gcmVxdWlyZSgnLi9fX21ldGhvZHMvcHJlcGVuZC5qcycpO1xuZXhwb3J0cy5fX3JhbmdlID0gcmVxdWlyZSgnLi9fX21ldGhvZHMvcmFuZ2UuanMnKTtcbmV4cG9ydHMuX19yZWR1Y2UgPSByZXF1aXJlKCcuL19fbWV0aG9kcy9yZWR1Y2UuanMnKTtcbmV4cG9ydHMuX19yZXBlYXQgPSByZXF1aXJlKCcuL19fbWV0aG9kcy9yZXBlYXQuanMnKTtcbmV4cG9ydHMuX19yZXBlYXRUaW1lcyA9IHJlcXVpcmUoJy4vX19tZXRob2RzL3JlcGVhdC10aW1lcy5qcycpO1xuZXhwb3J0cy5fX3JldmVyc2UgPSByZXF1aXJlKCcuL19fbWV0aG9kcy9yZXZlcnNlLmpzJyk7XG5leHBvcnRzLl9fcm91bmRSb2JpbiA9IHJlcXVpcmUoJy4vX19tZXRob2RzL3JvdW5kLXJvYmluLmpzJyk7XG5leHBvcnRzLl9fc2l6ZSA9IHJlcXVpcmUoJy4vX19tZXRob2RzL3NpemUuanMnKTtcbmV4cG9ydHMuX19zbGljZSA9IHJlcXVpcmUoJy4vX19tZXRob2RzL3NsaWNlLmpzJyk7XG5leHBvcnRzLl9fc29tZSA9IHJlcXVpcmUoJy4vX19tZXRob2RzL3NvbWUuanMnKTtcbmV4cG9ydHMuX19zcGxpdCA9IHJlcXVpcmUoJy4vX19tZXRob2RzL3NwbGl0LmpzJyk7XG5leHBvcnRzLl9fc3BsaXRHcm91cHMgPSByZXF1aXJlKCcuL19fbWV0aG9kcy9zcGxpdC1ncm91cHMuanMnKTtcbmV4cG9ydHMuX19zcGxpdE9uID0gcmVxdWlyZSgnLi9fX21ldGhvZHMvc3BsaXQtb24uanMnKTtcbmV4cG9ydHMuX19zcGxpdE9uQW55ID0gcmVxdWlyZSgnLi9fX21ldGhvZHMvc3BsaXQtb24tYW55LmpzJyk7XG5leHBvcnRzLl9fc3BsaXRPbkFueVNlcSA9IHJlcXVpcmUoJy4vX19tZXRob2RzL3NwbGl0LW9uLWFueS1zZXEuanMnKTtcbmV4cG9ydHMuX19zcGxpdE9uU2VxID0gcmVxdWlyZSgnLi9fX21ldGhvZHMvc3BsaXQtb24tc2VxLmpzJyk7XG5leHBvcnRzLl9fc3BsaXRXaGVuID0gcmVxdWlyZSgnLi9fX21ldGhvZHMvc3BsaXQtd2hlbi5qcycpO1xuZXhwb3J0cy5fX3NwbGl0ZXJhdGUgPSByZXF1aXJlKCcuL19fbWV0aG9kcy9zcGxpdGVyYXRlLmpzJyk7XG5leHBvcnRzLl9fc3BsaXRlcmF0ZUdyb3VwZWQgPSByZXF1aXJlKCcuL19fbWV0aG9kcy9zcGxpdGVyYXRlLWdyb3VwZWQuanMnKTtcbmV4cG9ydHMuX19zdGFydHNXaXRoID0gcmVxdWlyZSgnLi9fX21ldGhvZHMvc3RhcnRzLXdpdGguanMnKTtcbmV4cG9ydHMuX19zdGFydHNXaXRoQW55ID0gcmVxdWlyZSgnLi9fX21ldGhvZHMvc3RhcnRzLXdpdGgtYW55LmpzJyk7XG5leHBvcnRzLl9fc3RhcnRzV2l0aEFueVNlcSA9IHJlcXVpcmUoJy4vX19tZXRob2RzL3N0YXJ0cy13aXRoLWFueS1zZXEuanMnKTtcbmV4cG9ydHMuX19zdGFydHNXaXRoU2VxID0gcmVxdWlyZSgnLi9fX21ldGhvZHMvc3RhcnRzLXdpdGgtc2VxLmpzJyk7XG5leHBvcnRzLl9fc3RyID0gcmVxdWlyZSgnLi9fX21ldGhvZHMvc3RyLmpzJyk7XG5leHBvcnRzLl9fdGFrZSA9IHJlcXVpcmUoJy4vX19tZXRob2RzL3Rha2UuanMnKTtcbmV4cG9ydHMuX190YWtlTGFzdCA9IHJlcXVpcmUoJy4vX19tZXRob2RzL3Rha2UtbGFzdC5qcycpO1xuZXhwb3J0cy5fX3Rha2VMYXN0T3IgPSByZXF1aXJlKCcuL19fbWV0aG9kcy90YWtlLWxhc3Qtb3IuanMnKTtcbmV4cG9ydHMuX190YWtlU29ydGVkID0gcmVxdWlyZSgnLi9fX21ldGhvZHMvdGFrZS1zb3J0ZWQuanMnKTtcbmV4cG9ydHMuX190YWtlV2hpbGUgPSByZXF1aXJlKCcuL19fbWV0aG9kcy90YWtlLXdoaWxlLmpzJyk7XG5leHBvcnRzLl9fdGFwID0gcmVxdWlyZSgnLi9fX21ldGhvZHMvdGFwLmpzJyk7XG5leHBvcnRzLl9fdG9BcnJheSA9IHJlcXVpcmUoJy4vX19tZXRob2RzL3RvLWFycmF5LmpzJyk7XG5leHBvcnRzLl9fdG9PYmplY3QgPSByZXF1aXJlKCcuL19fbWV0aG9kcy90by1vYmplY3QuanMnKTtcbmV4cG9ydHMuX193aW5kb3cgPSByZXF1aXJlKCcuL19fbWV0aG9kcy93aW5kb3cuanMnKTtcbmV4cG9ydHMuX193aW5kb3dBaGVhZCA9IHJlcXVpcmUoJy4vX19tZXRob2RzL3dpbmRvdy1haGVhZC5qcycpO1xuZXhwb3J0cy5fX3dpbmRvd0JlaGluZCA9IHJlcXVpcmUoJy4vX19tZXRob2RzL3dpbmRvdy1iZWhpbmQuanMnKTtcbmV4cG9ydHMuX193cmFwRW50cmllcyA9IHJlcXVpcmUoJy4vX19tZXRob2RzL3dyYXAtZW50cmllcy5qcycpO1xuZXhwb3J0cy5fX3dyYXBLZXlzID0gcmVxdWlyZSgnLi9fX21ldGhvZHMvd3JhcC1rZXlzLmpzJyk7XG5leHBvcnRzLl9fd3JhcFZhbHVlcyA9IHJlcXVpcmUoJy4vX19tZXRob2RzL3dyYXAtdmFsdWVzLmpzJyk7XG5leHBvcnRzLl9femlwID0gcmVxdWlyZSgnLi9fX21ldGhvZHMvemlwLmpzJyk7XG5leHBvcnRzLl9femlwQWxsID0gcmVxdWlyZSgnLi9fX21ldGhvZHMvemlwLWFsbC5qcycpO1xuZXhwb3J0cy5hcHBlbmQgPSByZXF1aXJlKCcuL21ldGhvZHMvYXBwZW5kLmpzJyk7XG5leHBvcnRzLmFwcGx5ID0gcmVxdWlyZSgnLi9tZXRob2RzL2FwcGx5LmpzJyk7XG5leHBvcnRzLmFycmF5Rmlyc3QgPSByZXF1aXJlKCcuL21ldGhvZHMvYXJyYXktZmlyc3QuanMnKTtcbmV4cG9ydHMuYXJyYXlGaXJzdE9yID0gcmVxdWlyZSgnLi9tZXRob2RzL2FycmF5LWZpcnN0LW9yLmpzJyk7XG5leHBvcnRzLmFycmF5RnJvbSA9IHJlcXVpcmUoJy4vbWV0aG9kcy9hcnJheS1mcm9tLmpzJyk7XG5leHBvcnRzLmFycmF5RnJvbUFzeW5jID0gcmVxdWlyZSgnLi9tZXRob2RzL2FycmF5LWZyb20tYXN5bmMuanMnKTtcbmV4cG9ydHMuYXJyYXlMYXN0ID0gcmVxdWlyZSgnLi9tZXRob2RzL2FycmF5LWxhc3QuanMnKTtcbmV4cG9ydHMuYXJyYXlMYXN0T3IgPSByZXF1aXJlKCcuL21ldGhvZHMvYXJyYXktbGFzdC1vci5qcycpO1xuZXhwb3J0cy5hcnJheVJldmVyc2UgPSByZXF1aXJlKCcuL21ldGhvZHMvYXJyYXktcmV2ZXJzZS5qcycpO1xuZXhwb3J0cy5iYXRjaCA9IHJlcXVpcmUoJy4vbWV0aG9kcy9iYXRjaC5qcycpO1xuZXhwb3J0cy5iaXNlY3QgPSByZXF1aXJlKCcuL21ldGhvZHMvYmlzZWN0LmpzJyk7XG5leHBvcnRzLmNhbGwgPSByZXF1aXJlKCcuL21ldGhvZHMvY2FsbC5qcycpO1xuZXhwb3J0cy5jb2xsYXRlID0gcmVxdWlyZSgnLi9tZXRob2RzL2NvbGxhdGUuanMnKTtcbmV4cG9ydHMuY29tcG9zZSA9IHJlcXVpcmUoJy4vbWV0aG9kcy9jb21wb3NlLmpzJyk7XG5leHBvcnRzLmNvbXByZXNzID0gcmVxdWlyZSgnLi9tZXRob2RzL2NvbXByZXNzLmpzJyk7XG5leHBvcnRzLmNvbmNhdCA9IHJlcXVpcmUoJy4vbWV0aG9kcy9jb25jYXQuanMnKTtcbmV4cG9ydHMuY29uc3VtZSA9IHJlcXVpcmUoJy4vbWV0aG9kcy9jb25zdW1lLmpzJyk7XG5leHBvcnRzLmN5Y2xlID0gcmVxdWlyZSgnLi9tZXRob2RzL2N5Y2xlLmpzJyk7XG5leHBvcnRzLmN5Y2xlVGltZXMgPSByZXF1aXJlKCcuL21ldGhvZHMvY3ljbGUtdGltZXMuanMnKTtcbmV4cG9ydHMuZGVlcEVxdWFsID0gcmVxdWlyZSgnLi9tZXRob2RzL2RlZXAtZXF1YWwuanMnKTtcbmV4cG9ydHMuZGlzdGluY3QgPSByZXF1aXJlKCcuL21ldGhvZHMvZGlzdGluY3QuanMnKTtcbmV4cG9ydHMuZHJvcCA9IHJlcXVpcmUoJy4vbWV0aG9kcy9kcm9wLmpzJyk7XG5leHBvcnRzLmRyb3BXaGlsZSA9IHJlcXVpcmUoJy4vbWV0aG9kcy9kcm9wLXdoaWxlLmpzJyk7XG5leHBvcnRzLmVudW1lcmF0ZSA9IHJlcXVpcmUoJy4vbWV0aG9kcy9lbnVtZXJhdGUuanMnKTtcbmV4cG9ydHMuZXF1YWwgPSByZXF1aXJlKCcuL21ldGhvZHMvZXF1YWwuanMnKTtcbmV4cG9ydHMuZXZlcnkgPSByZXF1aXJlKCcuL21ldGhvZHMvZXZlcnkuanMnKTtcbmV4cG9ydHMuZXhlY1BpcGUgPSByZXF1aXJlKCcuL21ldGhvZHMvZXhlYy1waXBlLmpzJyk7XG5leHBvcnRzLmZpbHRlciA9IHJlcXVpcmUoJy4vbWV0aG9kcy9maWx0ZXIuanMnKTtcbmV4cG9ydHMuZmluZCA9IHJlcXVpcmUoJy4vbWV0aG9kcy9maW5kLmpzJyk7XG5leHBvcnRzLmZpbmRCZXN0ID0gcmVxdWlyZSgnLi9tZXRob2RzL2ZpbmQtYmVzdC5qcycpO1xuZXhwb3J0cy5maW5kQmVzdE9yID0gcmVxdWlyZSgnLi9tZXRob2RzL2ZpbmQtYmVzdC1vci5qcycpO1xuZXhwb3J0cy5maW5kT3IgPSByZXF1aXJlKCcuL21ldGhvZHMvZmluZC1vci5qcycpO1xuZXhwb3J0cy5maXJzdCA9IHJlcXVpcmUoJy4vbWV0aG9kcy9maXJzdC5qcycpO1xuZXhwb3J0cy5maXJzdEhpZ2hlc3QgPSByZXF1aXJlKCcuL21ldGhvZHMvZmlyc3QtaGlnaGVzdC5qcycpO1xuZXhwb3J0cy5maXJzdExvd2VzdCA9IHJlcXVpcmUoJy4vbWV0aG9kcy9maXJzdC1sb3dlc3QuanMnKTtcbmV4cG9ydHMuZmlyc3RPciA9IHJlcXVpcmUoJy4vbWV0aG9kcy9maXJzdC1vci5qcycpO1xuZXhwb3J0cy5mbGF0ID0gcmVxdWlyZSgnLi9tZXRob2RzL2ZsYXQuanMnKTtcbmV4cG9ydHMuZmxhdE1hcCA9IHJlcXVpcmUoJy4vbWV0aG9kcy9mbGF0LW1hcC5qcycpO1xuZXhwb3J0cy5mb3JFYWNoID0gcmVxdWlyZSgnLi9tZXRob2RzL2Zvci1lYWNoLmpzJyk7XG5leHBvcnRzLmZvcmsgPSByZXF1aXJlKCcuL21ldGhvZHMvZm9yay5qcycpO1xuZXhwb3J0cy5mb3JrZXJhdGUgPSByZXF1aXJlKCcuL21ldGhvZHMvZm9ya2VyYXRlLmpzJyk7XG5leHBvcnRzLmdldFNpemUgPSByZXF1aXJlKCcuL21ldGhvZHMvZ2V0LXNpemUuanMnKTtcbmV4cG9ydHMuaW5jbHVkZXMgPSByZXF1aXJlKCcuL21ldGhvZHMvaW5jbHVkZXMuanMnKTtcbmV4cG9ydHMuaW5jbHVkZXNBbnkgPSByZXF1aXJlKCcuL21ldGhvZHMvaW5jbHVkZXMtYW55LmpzJyk7XG5leHBvcnRzLmluY2x1ZGVzQW55U2VxID0gcmVxdWlyZSgnLi9tZXRob2RzL2luY2x1ZGVzLWFueS1zZXEuanMnKTtcbmV4cG9ydHMuaW5jbHVkZXNTZXEgPSByZXF1aXJlKCcuL21ldGhvZHMvaW5jbHVkZXMtc2VxLmpzJyk7XG5leHBvcnRzLmludGVybGVhdmUgPSByZXF1aXJlKCcuL21ldGhvZHMvaW50ZXJsZWF2ZS5qcycpO1xuZXhwb3J0cy5pbnRlcnBvc2UgPSByZXF1aXJlKCcuL21ldGhvZHMvaW50ZXJwb3NlLmpzJyk7XG5leHBvcnRzLmludGVycG9zZVNlcSA9IHJlcXVpcmUoJy4vbWV0aG9kcy9pbnRlcnBvc2Utc2VxLmpzJyk7XG5leHBvcnRzLmlzQXJyYXkgPSByZXF1aXJlKCcuL21ldGhvZHMvaXMtYXJyYXkuanMnKTtcbmV4cG9ydHMuaXNBc3luY0l0ZXJhYmxlID0gcmVxdWlyZSgnLi9tZXRob2RzL2lzLWFzeW5jLWl0ZXJhYmxlLmpzJyk7XG5leHBvcnRzLmlzQXN5bmNMb29wYWJsZSA9IHJlcXVpcmUoJy4vbWV0aG9kcy9pcy1hc3luYy1sb29wYWJsZS5qcycpO1xuZXhwb3J0cy5pc0FzeW5jV3JhcHBhYmxlID0gcmVxdWlyZSgnLi9tZXRob2RzL2lzLWFzeW5jLXdyYXBwYWJsZS5qcycpO1xuZXhwb3J0cy5pc0VtcHR5ID0gcmVxdWlyZSgnLi9tZXRob2RzL2lzLWVtcHR5LmpzJyk7XG5leHBvcnRzLmlzSXRlcmFibGUgPSByZXF1aXJlKCcuL21ldGhvZHMvaXMtaXRlcmFibGUuanMnKTtcbmV4cG9ydHMuaXNMb29wYWJsZSA9IHJlcXVpcmUoJy4vbWV0aG9kcy9pcy1sb29wYWJsZS5qcycpO1xuZXhwb3J0cy5pc05pbCA9IHJlcXVpcmUoJy4vbWV0aG9kcy9pcy1uaWwuanMnKTtcbmV4cG9ydHMuaXNOdWxsID0gcmVxdWlyZSgnLi9tZXRob2RzL2lzLW51bGwuanMnKTtcbmV4cG9ydHMuaXNPYmplY3QgPSByZXF1aXJlKCcuL21ldGhvZHMvaXMtb2JqZWN0LmpzJyk7XG5leHBvcnRzLmlzU29ydGVkID0gcmVxdWlyZSgnLi9tZXRob2RzL2lzLXNvcnRlZC5qcycpO1xuZXhwb3J0cy5pc1N0cmluZyA9IHJlcXVpcmUoJy4vbWV0aG9kcy9pcy1zdHJpbmcuanMnKTtcbmV4cG9ydHMuaXNVbmRlZmluZWQgPSByZXF1aXJlKCcuL21ldGhvZHMvaXMtdW5kZWZpbmVkLmpzJyk7XG5leHBvcnRzLmlzV3JhcHBhYmxlID0gcmVxdWlyZSgnLi9tZXRob2RzL2lzLXdyYXBwYWJsZS5qcycpO1xuZXhwb3J0cy5qb2luID0gcmVxdWlyZSgnLi9tZXRob2RzL2pvaW4uanMnKTtcbmV4cG9ydHMuam9pbldpdGggPSByZXF1aXJlKCcuL21ldGhvZHMvam9pbi13aXRoLmpzJyk7XG5leHBvcnRzLmpvaW5XaXRoU2VxID0gcmVxdWlyZSgnLi9tZXRob2RzL2pvaW4td2l0aC1zZXEuanMnKTtcbmV4cG9ydHMubGFzdEhpZ2hlc3QgPSByZXF1aXJlKCcuL21ldGhvZHMvbGFzdC1oaWdoZXN0LmpzJyk7XG5leHBvcnRzLmxhc3RMb3dlc3QgPSByZXF1aXJlKCcuL21ldGhvZHMvbGFzdC1sb3dlc3QuanMnKTtcbmV4cG9ydHMubWFwID0gcmVxdWlyZSgnLi9tZXRob2RzL21hcC5qcycpO1xuZXhwb3J0cy5ub3RBcnJheSA9IHJlcXVpcmUoJy4vbWV0aG9kcy9ub3QtYXJyYXkuanMnKTtcbmV4cG9ydHMubm90QXN5bmNJdGVyYWJsZSA9IHJlcXVpcmUoJy4vbWV0aG9kcy9ub3QtYXN5bmMtaXRlcmFibGUuanMnKTtcbmV4cG9ydHMubm90QXN5bmNMb29wYWJsZSA9IHJlcXVpcmUoJy4vbWV0aG9kcy9ub3QtYXN5bmMtbG9vcGFibGUuanMnKTtcbmV4cG9ydHMubm90QXN5bmNXcmFwcGFibGUgPSByZXF1aXJlKCcuL21ldGhvZHMvbm90LWFzeW5jLXdyYXBwYWJsZS5qcycpO1xuZXhwb3J0cy5ub3RJdGVyYWJsZSA9IHJlcXVpcmUoJy4vbWV0aG9kcy9ub3QtaXRlcmFibGUuanMnKTtcbmV4cG9ydHMubm90TG9vcGFibGUgPSByZXF1aXJlKCcuL21ldGhvZHMvbm90LWxvb3BhYmxlLmpzJyk7XG5leHBvcnRzLm5vdE5pbCA9IHJlcXVpcmUoJy4vbWV0aG9kcy9ub3QtbmlsLmpzJyk7XG5leHBvcnRzLm5vdE51bGwgPSByZXF1aXJlKCcuL21ldGhvZHMvbm90LW51bGwuanMnKTtcbmV4cG9ydHMubm90T2JqZWN0ID0gcmVxdWlyZSgnLi9tZXRob2RzL25vdC1vYmplY3QuanMnKTtcbmV4cG9ydHMubm90U3RyaW5nID0gcmVxdWlyZSgnLi9tZXRob2RzL25vdC1zdHJpbmcuanMnKTtcbmV4cG9ydHMubm90VW5kZWZpbmVkID0gcmVxdWlyZSgnLi9tZXRob2RzL25vdC11bmRlZmluZWQuanMnKTtcbmV4cG9ydHMubm90V3JhcHBhYmxlID0gcmVxdWlyZSgnLi9tZXRob2RzL25vdC13cmFwcGFibGUuanMnKTtcbmV4cG9ydHMub2JqZWN0RW50cmllcyA9IHJlcXVpcmUoJy4vbWV0aG9kcy9vYmplY3QtZW50cmllcy5qcycpO1xuZXhwb3J0cy5vYmplY3RGcm9tID0gcmVxdWlyZSgnLi9tZXRob2RzL29iamVjdC1mcm9tLmpzJyk7XG5leHBvcnRzLm9iamVjdEZyb21Bc3luYyA9IHJlcXVpcmUoJy4vbWV0aG9kcy9vYmplY3QtZnJvbS1hc3luYy5qcycpO1xuZXhwb3J0cy5vYmplY3RLZXlzID0gcmVxdWlyZSgnLi9tZXRob2RzL29iamVjdC1rZXlzLmpzJyk7XG5leHBvcnRzLm9iamVjdFZhbHVlcyA9IHJlcXVpcmUoJy4vbWV0aG9kcy9vYmplY3QtdmFsdWVzLmpzJyk7XG5leHBvcnRzLnBlZWtlcmF0ZSA9IHJlcXVpcmUoJy4vbWV0aG9kcy9wZWVrZXJhdGUuanMnKTtcbmV4cG9ydHMucGlwZSA9IHJlcXVpcmUoJy4vbWV0aG9kcy9waXBlLmpzJyk7XG5leHBvcnRzLnByZXBlbmQgPSByZXF1aXJlKCcuL21ldGhvZHMvcHJlcGVuZC5qcycpO1xuZXhwb3J0cy5yYW5nZSA9IHJlcXVpcmUoJy4vbWV0aG9kcy9yYW5nZS5qcycpO1xuZXhwb3J0cy5yZWR1Y2UgPSByZXF1aXJlKCcuL21ldGhvZHMvcmVkdWNlLmpzJyk7XG5leHBvcnRzLnJlcGVhdCA9IHJlcXVpcmUoJy4vbWV0aG9kcy9yZXBlYXQuanMnKTtcbmV4cG9ydHMucmVwZWF0VGltZXMgPSByZXF1aXJlKCcuL21ldGhvZHMvcmVwZWF0LXRpbWVzLmpzJyk7XG5leHBvcnRzLnJldmVyc2UgPSByZXF1aXJlKCcuL21ldGhvZHMvcmV2ZXJzZS5qcycpO1xuZXhwb3J0cy5yb3VuZFJvYmluID0gcmVxdWlyZSgnLi9tZXRob2RzL3JvdW5kLXJvYmluLmpzJyk7XG5leHBvcnRzLnNpemUgPSByZXF1aXJlKCcuL21ldGhvZHMvc2l6ZS5qcycpO1xuZXhwb3J0cy5zbGljZSA9IHJlcXVpcmUoJy4vbWV0aG9kcy9zbGljZS5qcycpO1xuZXhwb3J0cy5zb21lID0gcmVxdWlyZSgnLi9tZXRob2RzL3NvbWUuanMnKTtcbmV4cG9ydHMuc3BsaXQgPSByZXF1aXJlKCcuL21ldGhvZHMvc3BsaXQuanMnKTtcbmV4cG9ydHMuc3BsaXRHcm91cHMgPSByZXF1aXJlKCcuL21ldGhvZHMvc3BsaXQtZ3JvdXBzLmpzJyk7XG5leHBvcnRzLnNwbGl0T24gPSByZXF1aXJlKCcuL21ldGhvZHMvc3BsaXQtb24uanMnKTtcbmV4cG9ydHMuc3BsaXRPbkFueSA9IHJlcXVpcmUoJy4vbWV0aG9kcy9zcGxpdC1vbi1hbnkuanMnKTtcbmV4cG9ydHMuc3BsaXRPbkFueVNlcSA9IHJlcXVpcmUoJy4vbWV0aG9kcy9zcGxpdC1vbi1hbnktc2VxLmpzJyk7XG5leHBvcnRzLnNwbGl0T25TZXEgPSByZXF1aXJlKCcuL21ldGhvZHMvc3BsaXQtb24tc2VxLmpzJyk7XG5leHBvcnRzLnNwbGl0V2hlbiA9IHJlcXVpcmUoJy4vbWV0aG9kcy9zcGxpdC13aGVuLmpzJyk7XG5leHBvcnRzLnNwbGl0ZXJhdGUgPSByZXF1aXJlKCcuL21ldGhvZHMvc3BsaXRlcmF0ZS5qcycpO1xuZXhwb3J0cy5zcGxpdGVyYXRlR3JvdXBlZCA9IHJlcXVpcmUoJy4vbWV0aG9kcy9zcGxpdGVyYXRlLWdyb3VwZWQuanMnKTtcbmV4cG9ydHMuc3RhcnRzV2l0aCA9IHJlcXVpcmUoJy4vbWV0aG9kcy9zdGFydHMtd2l0aC5qcycpO1xuZXhwb3J0cy5zdGFydHNXaXRoQW55ID0gcmVxdWlyZSgnLi9tZXRob2RzL3N0YXJ0cy13aXRoLWFueS5qcycpO1xuZXhwb3J0cy5zdGFydHNXaXRoQW55U2VxID0gcmVxdWlyZSgnLi9tZXRob2RzL3N0YXJ0cy13aXRoLWFueS1zZXEuanMnKTtcbmV4cG9ydHMuc3RhcnRzV2l0aFNlcSA9IHJlcXVpcmUoJy4vbWV0aG9kcy9zdGFydHMtd2l0aC1zZXEuanMnKTtcbmV4cG9ydHMuc3RyID0gcmVxdWlyZSgnLi9tZXRob2RzL3N0ci5qcycpO1xuZXhwb3J0cy5zdHJpbmdGcm9tID0gcmVxdWlyZSgnLi9tZXRob2RzL3N0cmluZy1mcm9tLmpzJyk7XG5leHBvcnRzLnN0cmluZ0Zyb21Bc3luYyA9IHJlcXVpcmUoJy4vbWV0aG9kcy9zdHJpbmctZnJvbS1hc3luYy5qcycpO1xuZXhwb3J0cy50YWtlID0gcmVxdWlyZSgnLi9tZXRob2RzL3Rha2UuanMnKTtcbmV4cG9ydHMudGFrZUxhc3QgPSByZXF1aXJlKCcuL21ldGhvZHMvdGFrZS1sYXN0LmpzJyk7XG5leHBvcnRzLnRha2VMYXN0T3IgPSByZXF1aXJlKCcuL21ldGhvZHMvdGFrZS1sYXN0LW9yLmpzJyk7XG5leHBvcnRzLnRha2VTb3J0ZWQgPSByZXF1aXJlKCcuL21ldGhvZHMvdGFrZS1zb3J0ZWQuanMnKTtcbmV4cG9ydHMudGFrZVdoaWxlID0gcmVxdWlyZSgnLi9tZXRob2RzL3Rha2Utd2hpbGUuanMnKTtcbmV4cG9ydHMudGFwID0gcmVxdWlyZSgnLi9tZXRob2RzL3RhcC5qcycpO1xuZXhwb3J0cy50b0FycmF5ID0gcmVxdWlyZSgnLi9tZXRob2RzL3RvLWFycmF5LmpzJyk7XG5leHBvcnRzLnRvT2JqZWN0ID0gcmVxdWlyZSgnLi9tZXRob2RzL3RvLW9iamVjdC5qcycpO1xuZXhwb3J0cy53aGVuID0gcmVxdWlyZSgnLi9tZXRob2RzL3doZW4uanMnKTtcbmV4cG9ydHMud2luZG93ID0gcmVxdWlyZSgnLi9tZXRob2RzL3dpbmRvdy5qcycpO1xuZXhwb3J0cy53aW5kb3dBaGVhZCA9IHJlcXVpcmUoJy4vbWV0aG9kcy93aW5kb3ctYWhlYWQuanMnKTtcbmV4cG9ydHMud2luZG93QmVoaW5kID0gcmVxdWlyZSgnLi9tZXRob2RzL3dpbmRvdy1iZWhpbmQuanMnKTtcbmV4cG9ydHMud3JhcCA9IHJlcXVpcmUoJy4vbWV0aG9kcy93cmFwLmpzJyk7XG5leHBvcnRzLndyYXBFbnRyaWVzID0gcmVxdWlyZSgnLi9tZXRob2RzL3dyYXAtZW50cmllcy5qcycpO1xuZXhwb3J0cy53cmFwS2V5cyA9IHJlcXVpcmUoJy4vbWV0aG9kcy93cmFwLWtleXMuanMnKTtcbmV4cG9ydHMud3JhcFZhbHVlcyA9IHJlcXVpcmUoJy4vbWV0aG9kcy93cmFwLXZhbHVlcy5qcycpO1xuZXhwb3J0cy56aXAgPSByZXF1aXJlKCcuL21ldGhvZHMvemlwLmpzJyk7XG5leHBvcnRzLnppcEFsbCA9IHJlcXVpcmUoJy4vbWV0aG9kcy96aXAtYWxsLmpzJyk7XG5leHBvcnRzLmFzeW5jQXBwZW5kID0gcmVxdWlyZSgnLi9tZXRob2RzL2FzeW5jLWFwcGVuZC5qcycpO1xuZXhwb3J0cy5hc3luY0JhdGNoID0gcmVxdWlyZSgnLi9tZXRob2RzL2FzeW5jLWJhdGNoLmpzJyk7XG5leHBvcnRzLmFzeW5jQmlzZWN0ID0gcmVxdWlyZSgnLi9tZXRob2RzL2FzeW5jLWJpc2VjdC5qcycpO1xuZXhwb3J0cy5hc3luY0J1ZmZlciA9IHJlcXVpcmUoJy4vbWV0aG9kcy9hc3luYy1idWZmZXIuanMnKTtcbmV4cG9ydHMuYXN5bmNDb2xsYXRlID0gcmVxdWlyZSgnLi9tZXRob2RzL2FzeW5jLWNvbGxhdGUuanMnKTtcbmV4cG9ydHMuYXN5bmNDb21wcmVzcyA9IHJlcXVpcmUoJy4vbWV0aG9kcy9hc3luYy1jb21wcmVzcy5qcycpO1xuZXhwb3J0cy5hc3luY0NvbmNhdCA9IHJlcXVpcmUoJy4vbWV0aG9kcy9hc3luYy1jb25jYXQuanMnKTtcbmV4cG9ydHMuYXN5bmNDb25zdW1lID0gcmVxdWlyZSgnLi9tZXRob2RzL2FzeW5jLWNvbnN1bWUuanMnKTtcbmV4cG9ydHMuYXN5bmNDeWNsZSA9IHJlcXVpcmUoJy4vbWV0aG9kcy9hc3luYy1jeWNsZS5qcycpO1xuZXhwb3J0cy5hc3luY0N5Y2xlVGltZXMgPSByZXF1aXJlKCcuL21ldGhvZHMvYXN5bmMtY3ljbGUtdGltZXMuanMnKTtcbmV4cG9ydHMuYXN5bmNEZWVwRXF1YWwgPSByZXF1aXJlKCcuL21ldGhvZHMvYXN5bmMtZGVlcC1lcXVhbC5qcycpO1xuZXhwb3J0cy5hc3luY0Rpc3RpbmN0ID0gcmVxdWlyZSgnLi9tZXRob2RzL2FzeW5jLWRpc3RpbmN0LmpzJyk7XG5leHBvcnRzLmFzeW5jRHJvcCA9IHJlcXVpcmUoJy4vbWV0aG9kcy9hc3luYy1kcm9wLmpzJyk7XG5leHBvcnRzLmFzeW5jRHJvcFdoaWxlID0gcmVxdWlyZSgnLi9tZXRob2RzL2FzeW5jLWRyb3Atd2hpbGUuanMnKTtcbmV4cG9ydHMuYXN5bmNFbnVtZXJhdGUgPSByZXF1aXJlKCcuL21ldGhvZHMvYXN5bmMtZW51bWVyYXRlLmpzJyk7XG5leHBvcnRzLmFzeW5jRXF1YWwgPSByZXF1aXJlKCcuL21ldGhvZHMvYXN5bmMtZXF1YWwuanMnKTtcbmV4cG9ydHMuYXN5bmNFdmVyeSA9IHJlcXVpcmUoJy4vbWV0aG9kcy9hc3luYy1ldmVyeS5qcycpO1xuZXhwb3J0cy5hc3luY0ZpbHRlciA9IHJlcXVpcmUoJy4vbWV0aG9kcy9hc3luYy1maWx0ZXIuanMnKTtcbmV4cG9ydHMuYXN5bmNGaW5kID0gcmVxdWlyZSgnLi9tZXRob2RzL2FzeW5jLWZpbmQuanMnKTtcbmV4cG9ydHMuYXN5bmNGaW5kQmVzdCA9IHJlcXVpcmUoJy4vbWV0aG9kcy9hc3luYy1maW5kLWJlc3QuanMnKTtcbmV4cG9ydHMuYXN5bmNGaW5kQmVzdE9yID0gcmVxdWlyZSgnLi9tZXRob2RzL2FzeW5jLWZpbmQtYmVzdC1vci5qcycpO1xuZXhwb3J0cy5hc3luY0ZpbmRPciA9IHJlcXVpcmUoJy4vbWV0aG9kcy9hc3luYy1maW5kLW9yLmpzJyk7XG5leHBvcnRzLmFzeW5jRmlyc3QgPSByZXF1aXJlKCcuL21ldGhvZHMvYXN5bmMtZmlyc3QuanMnKTtcbmV4cG9ydHMuYXN5bmNGaXJzdE9yID0gcmVxdWlyZSgnLi9tZXRob2RzL2FzeW5jLWZpcnN0LW9yLmpzJyk7XG5leHBvcnRzLmFzeW5jRmxhdCA9IHJlcXVpcmUoJy4vbWV0aG9kcy9hc3luYy1mbGF0LmpzJyk7XG5leHBvcnRzLmFzeW5jRmxhdE1hcCA9IHJlcXVpcmUoJy4vbWV0aG9kcy9hc3luYy1mbGF0LW1hcC5qcycpO1xuZXhwb3J0cy5hc3luY0ZvckVhY2ggPSByZXF1aXJlKCcuL21ldGhvZHMvYXN5bmMtZm9yLWVhY2guanMnKTtcbmV4cG9ydHMuYXN5bmNGb3JrID0gcmVxdWlyZSgnLi9tZXRob2RzL2FzeW5jLWZvcmsuanMnKTtcbmV4cG9ydHMuYXN5bmNGb3JrZXJhdGUgPSByZXF1aXJlKCcuL21ldGhvZHMvYXN5bmMtZm9ya2VyYXRlLmpzJyk7XG5leHBvcnRzLmFzeW5jSW5jbHVkZXMgPSByZXF1aXJlKCcuL21ldGhvZHMvYXN5bmMtaW5jbHVkZXMuanMnKTtcbmV4cG9ydHMuYXN5bmNJbmNsdWRlc0FueSA9IHJlcXVpcmUoJy4vbWV0aG9kcy9hc3luYy1pbmNsdWRlcy1hbnkuanMnKTtcbmV4cG9ydHMuYXN5bmNJbmNsdWRlc0FueVNlcSA9IHJlcXVpcmUoJy4vbWV0aG9kcy9hc3luYy1pbmNsdWRlcy1hbnktc2VxLmpzJyk7XG5leHBvcnRzLmFzeW5jSW5jbHVkZXNTZXEgPSByZXF1aXJlKCcuL21ldGhvZHMvYXN5bmMtaW5jbHVkZXMtc2VxLmpzJyk7XG5leHBvcnRzLmFzeW5jSW50ZXJsZWF2ZSA9IHJlcXVpcmUoJy4vbWV0aG9kcy9hc3luYy1pbnRlcmxlYXZlLmpzJyk7XG5leHBvcnRzLmFzeW5jSW50ZXJsZWF2ZVJlYWR5ID0gcmVxdWlyZSgnLi9tZXRob2RzL2FzeW5jLWludGVybGVhdmUtcmVhZHkuanMnKTtcbmV4cG9ydHMuYXN5bmNJbnRlcnBvc2UgPSByZXF1aXJlKCcuL21ldGhvZHMvYXN5bmMtaW50ZXJwb3NlLmpzJyk7XG5leHBvcnRzLmFzeW5jSW50ZXJwb3NlU2VxID0gcmVxdWlyZSgnLi9tZXRob2RzL2FzeW5jLWludGVycG9zZS1zZXEuanMnKTtcbmV4cG9ydHMuYXN5bmNJc0VtcHR5ID0gcmVxdWlyZSgnLi9tZXRob2RzL2FzeW5jLWlzLWVtcHR5LmpzJyk7XG5leHBvcnRzLmFzeW5jSXNTb3J0ZWQgPSByZXF1aXJlKCcuL21ldGhvZHMvYXN5bmMtaXMtc29ydGVkLmpzJyk7XG5leHBvcnRzLmFzeW5jSm9pbiA9IHJlcXVpcmUoJy4vbWV0aG9kcy9hc3luYy1qb2luLmpzJyk7XG5leHBvcnRzLmFzeW5jSm9pbldpdGggPSByZXF1aXJlKCcuL21ldGhvZHMvYXN5bmMtam9pbi13aXRoLmpzJyk7XG5leHBvcnRzLmFzeW5jSm9pbldpdGhTZXEgPSByZXF1aXJlKCcuL21ldGhvZHMvYXN5bmMtam9pbi13aXRoLXNlcS5qcycpO1xuZXhwb3J0cy5hc3luY01hcCA9IHJlcXVpcmUoJy4vbWV0aG9kcy9hc3luYy1tYXAuanMnKTtcbmV4cG9ydHMuYXN5bmNQZWVrZXJhdGUgPSByZXF1aXJlKCcuL21ldGhvZHMvYXN5bmMtcGVla2VyYXRlLmpzJyk7XG5leHBvcnRzLmFzeW5jUHJlcGVuZCA9IHJlcXVpcmUoJy4vbWV0aG9kcy9hc3luYy1wcmVwZW5kLmpzJyk7XG5leHBvcnRzLmFzeW5jUmVkdWNlID0gcmVxdWlyZSgnLi9tZXRob2RzL2FzeW5jLXJlZHVjZS5qcycpO1xuZXhwb3J0cy5hc3luY1JldmVyc2UgPSByZXF1aXJlKCcuL21ldGhvZHMvYXN5bmMtcmV2ZXJzZS5qcycpO1xuZXhwb3J0cy5hc3luY1JvdW5kUm9iaW4gPSByZXF1aXJlKCcuL21ldGhvZHMvYXN5bmMtcm91bmQtcm9iaW4uanMnKTtcbmV4cG9ydHMuYXN5bmNTaXplID0gcmVxdWlyZSgnLi9tZXRob2RzL2FzeW5jLXNpemUuanMnKTtcbmV4cG9ydHMuYXN5bmNTbGljZSA9IHJlcXVpcmUoJy4vbWV0aG9kcy9hc3luYy1zbGljZS5qcycpO1xuZXhwb3J0cy5hc3luY1NvbWUgPSByZXF1aXJlKCcuL21ldGhvZHMvYXN5bmMtc29tZS5qcycpO1xuZXhwb3J0cy5hc3luY1NwbGl0ID0gcmVxdWlyZSgnLi9tZXRob2RzL2FzeW5jLXNwbGl0LmpzJyk7XG5leHBvcnRzLmFzeW5jU3BsaXRHcm91cHMgPSByZXF1aXJlKCcuL21ldGhvZHMvYXN5bmMtc3BsaXQtZ3JvdXBzLmpzJyk7XG5leHBvcnRzLmFzeW5jU3BsaXRPbiA9IHJlcXVpcmUoJy4vbWV0aG9kcy9hc3luYy1zcGxpdC1vbi5qcycpO1xuZXhwb3J0cy5hc3luY1NwbGl0T25BbnkgPSByZXF1aXJlKCcuL21ldGhvZHMvYXN5bmMtc3BsaXQtb24tYW55LmpzJyk7XG5leHBvcnRzLmFzeW5jU3BsaXRPbkFueVNlcSA9IHJlcXVpcmUoJy4vbWV0aG9kcy9hc3luYy1zcGxpdC1vbi1hbnktc2VxLmpzJyk7XG5leHBvcnRzLmFzeW5jU3BsaXRPblNlcSA9IHJlcXVpcmUoJy4vbWV0aG9kcy9hc3luYy1zcGxpdC1vbi1zZXEuanMnKTtcbmV4cG9ydHMuYXN5bmNTcGxpdFdoZW4gPSByZXF1aXJlKCcuL21ldGhvZHMvYXN5bmMtc3BsaXQtd2hlbi5qcycpO1xuZXhwb3J0cy5hc3luY1NwbGl0ZXJhdGUgPSByZXF1aXJlKCcuL21ldGhvZHMvYXN5bmMtc3BsaXRlcmF0ZS5qcycpO1xuZXhwb3J0cy5hc3luY1NwbGl0ZXJhdGVHcm91cGVkID0gcmVxdWlyZSgnLi9tZXRob2RzL2FzeW5jLXNwbGl0ZXJhdGUtZ3JvdXBlZC5qcycpO1xuZXhwb3J0cy5hc3luY1N0YXJ0c1dpdGggPSByZXF1aXJlKCcuL21ldGhvZHMvYXN5bmMtc3RhcnRzLXdpdGguanMnKTtcbmV4cG9ydHMuYXN5bmNTdGFydHNXaXRoQW55ID0gcmVxdWlyZSgnLi9tZXRob2RzL2FzeW5jLXN0YXJ0cy13aXRoLWFueS5qcycpO1xuZXhwb3J0cy5hc3luY1N0YXJ0c1dpdGhBbnlTZXEgPSByZXF1aXJlKCcuL21ldGhvZHMvYXN5bmMtc3RhcnRzLXdpdGgtYW55LXNlcS5qcycpO1xuZXhwb3J0cy5hc3luY1N0YXJ0c1dpdGhTZXEgPSByZXF1aXJlKCcuL21ldGhvZHMvYXN5bmMtc3RhcnRzLXdpdGgtc2VxLmpzJyk7XG5leHBvcnRzLmFzeW5jU3RyID0gcmVxdWlyZSgnLi9tZXRob2RzL2FzeW5jLXN0ci5qcycpO1xuZXhwb3J0cy5hc3luY1Rha2UgPSByZXF1aXJlKCcuL21ldGhvZHMvYXN5bmMtdGFrZS5qcycpO1xuZXhwb3J0cy5hc3luY1Rha2VMYXN0ID0gcmVxdWlyZSgnLi9tZXRob2RzL2FzeW5jLXRha2UtbGFzdC5qcycpO1xuZXhwb3J0cy5hc3luY1Rha2VMYXN0T3IgPSByZXF1aXJlKCcuL21ldGhvZHMvYXN5bmMtdGFrZS1sYXN0LW9yLmpzJyk7XG5leHBvcnRzLmFzeW5jVGFrZVNvcnRlZCA9IHJlcXVpcmUoJy4vbWV0aG9kcy9hc3luYy10YWtlLXNvcnRlZC5qcycpO1xuZXhwb3J0cy5hc3luY1Rha2VXaGlsZSA9IHJlcXVpcmUoJy4vbWV0aG9kcy9hc3luYy10YWtlLXdoaWxlLmpzJyk7XG5leHBvcnRzLmFzeW5jVGFwID0gcmVxdWlyZSgnLi9tZXRob2RzL2FzeW5jLXRhcC5qcycpO1xuZXhwb3J0cy5hc3luY1Rocm90dGxlID0gcmVxdWlyZSgnLi9tZXRob2RzL2FzeW5jLXRocm90dGxlLmpzJyk7XG5leHBvcnRzLmFzeW5jVG9BcnJheSA9IHJlcXVpcmUoJy4vbWV0aG9kcy9hc3luYy10by1hcnJheS5qcycpO1xuZXhwb3J0cy5hc3luY1RvT2JqZWN0ID0gcmVxdWlyZSgnLi9tZXRob2RzL2FzeW5jLXRvLW9iamVjdC5qcycpO1xuZXhwb3J0cy5hc3luY1dpbmRvdyA9IHJlcXVpcmUoJy4vbWV0aG9kcy9hc3luYy13aW5kb3cuanMnKTtcbmV4cG9ydHMuYXN5bmNXaW5kb3dBaGVhZCA9IHJlcXVpcmUoJy4vbWV0aG9kcy9hc3luYy13aW5kb3ctYWhlYWQuanMnKTtcbmV4cG9ydHMuYXN5bmNXaW5kb3dCZWhpbmQgPSByZXF1aXJlKCcuL21ldGhvZHMvYXN5bmMtd2luZG93LWJlaGluZC5qcycpO1xuZXhwb3J0cy5hc3luY1dyYXAgPSByZXF1aXJlKCcuL21ldGhvZHMvYXN5bmMtd3JhcC5qcycpO1xuZXhwb3J0cy5hc3luY1ppcCA9IHJlcXVpcmUoJy4vbWV0aG9kcy9hc3luYy16aXAuanMnKTtcbmV4cG9ydHMuYXN5bmNaaXBBbGwgPSByZXF1aXJlKCcuL21ldGhvZHMvYXN5bmMtemlwLWFsbC5qcycpOyIsInZhciBfcmVxdWlyZSA9IHJlcXVpcmUoJy4vaXRlcmFibGUuanMnKSxcbiAgICBlbnN1cmVJdGVyYWJsZSA9IF9yZXF1aXJlLmVuc3VyZUl0ZXJhYmxlO1xuXG52YXIgX3JlcXVpcmUyID0gcmVxdWlyZSgnLi4vaW1wbHMvJHRvLWFycmF5L3RvLWFycmF5LmpzJyksXG4gICAgX190b0FycmF5ID0gX3JlcXVpcmUyLl9fdG9BcnJheTtcblxudmFyIF9yZXF1aXJlMyA9IHJlcXVpcmUoJy4uL2ltcGxzLyRtYXAvbWFwLmpzJyksXG4gICAgX19tYXAgPSBfcmVxdWlyZTMuX19tYXA7XG5cbmZ1bmN0aW9uIHNlcXNUb0FycmF5KHZhbHVlcykge1xuICByZXR1cm4gX190b0FycmF5KF9fbWFwKHZhbHVlcywgZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgcmV0dXJuIF9fdG9BcnJheShlbnN1cmVJdGVyYWJsZSh2YWx1ZSkpO1xuICB9KSwgZnVuY3Rpb24gKGFycikge1xuICAgIHJldHVybiBhcnIubGVuZ3RoID4gMDtcbiAgfSk7XG59XG5cbmV4cG9ydHMuc2Vxc1RvQXJyYXkgPSBzZXFzVG9BcnJheTsiLCJ2YXIgX3JlZ2VuZXJhdG9yUnVudGltZSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9yZWdlbmVyYXRvclwiKTtcblxudmFyIF9hc3luY1RvR2VuZXJhdG9yID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvYXN5bmNUb0dlbmVyYXRvclwiKTtcblxudmFyIF9yZXF1aXJlID0gcmVxdWlyZSgnLi9hc3luYy1pdGVyYWJsZS5qcycpLFxuICAgIGFzeW5jRW5zdXJlSXRlcmFibGUgPSBfcmVxdWlyZS5hc3luY0Vuc3VyZUl0ZXJhYmxlO1xuXG52YXIgX3JlcXVpcmUyID0gcmVxdWlyZSgnLi4vaW1wbHMvJHRvLWFycmF5L2FzeW5jLXRvLWFycmF5LmpzJyksXG4gICAgX19hc3luY1RvQXJyYXkgPSBfcmVxdWlyZTIuX19hc3luY1RvQXJyYXk7XG5cbnZhciBfcmVxdWlyZTMgPSByZXF1aXJlKCcuLi9pbXBscy8kbWFwL2FzeW5jLW1hcC5qcycpLFxuICAgIF9fYXN5bmNNYXAgPSBfcmVxdWlyZTMuX19hc3luY01hcDtcblxuZnVuY3Rpb24gYXN5bmNTZXFzVG9BcnJheShfeCkge1xuICByZXR1cm4gX2FzeW5jU2Vxc1RvQXJyYXkuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cblxuZnVuY3Rpb24gX2FzeW5jU2Vxc1RvQXJyYXkoKSB7XG4gIF9hc3luY1NlcXNUb0FycmF5ID0gX2FzeW5jVG9HZW5lcmF0b3IoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3JSdW50aW1lLm1hcmsoZnVuY3Rpb24gX2NhbGxlZSh2YWx1ZXMpIHtcbiAgICByZXR1cm4gX3JlZ2VuZXJhdG9yUnVudGltZS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUkKF9jb250ZXh0KSB7XG4gICAgICB3aGlsZSAoMSkge1xuICAgICAgICBzd2l0Y2ggKF9jb250ZXh0LnByZXYgPSBfY29udGV4dC5uZXh0KSB7XG4gICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDI7XG4gICAgICAgICAgICByZXR1cm4gX19hc3luY1RvQXJyYXkoX19hc3luY01hcCh2YWx1ZXMsIGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICByZXR1cm4gX19hc3luY1RvQXJyYXkoYXN5bmNFbnN1cmVJdGVyYWJsZSh2YWx1ZSkpO1xuICAgICAgICAgICAgfSksIGZ1bmN0aW9uIChhcnIpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGFyci5sZW5ndGggPiAwO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuYWJydXB0KFwicmV0dXJuXCIsIF9jb250ZXh0LnNlbnQpO1xuXG4gICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgIGNhc2UgXCJlbmRcIjpcbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5zdG9wKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCBfY2FsbGVlKTtcbiAgfSkpO1xuICByZXR1cm4gX2FzeW5jU2Vxc1RvQXJyYXkuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cblxuZXhwb3J0cy5hc3luY1NlcXNUb0FycmF5ID0gYXN5bmNTZXFzVG9BcnJheTsiLCJ2YXIgX3JlZ2VuZXJhdG9yUnVudGltZSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9yZWdlbmVyYXRvclwiKTtcblxudmFyIF9hc3luY1RvR2VuZXJhdG9yID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvYXN5bmNUb0dlbmVyYXRvclwiKTtcblxudmFyIF9jbGFzc0NhbGxDaGVjayA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrXCIpO1xuXG52YXIgX2NyZWF0ZUNsYXNzID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY3JlYXRlQ2xhc3NcIik7XG5cbnZhciBfaW5oZXJpdHMgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbmhlcml0c1wiKTtcblxudmFyIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvcG9zc2libGVDb25zdHJ1Y3RvclJldHVyblwiKTtcblxudmFyIF9nZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2dldFByb3RvdHlwZU9mXCIpO1xuXG5mdW5jdGlvbiBfY3JlYXRlU3VwZXIoRGVyaXZlZCkgeyB2YXIgaGFzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCA9IF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKTsgcmV0dXJuIGZ1bmN0aW9uIF9jcmVhdGVTdXBlckludGVybmFsKCkgeyB2YXIgU3VwZXIgPSBfZ2V0UHJvdG90eXBlT2YoRGVyaXZlZCksIHJlc3VsdDsgaWYgKGhhc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QpIHsgdmFyIE5ld1RhcmdldCA9IF9nZXRQcm90b3R5cGVPZih0aGlzKS5jb25zdHJ1Y3RvcjsgcmVzdWx0ID0gUmVmbGVjdC5jb25zdHJ1Y3QoU3VwZXIsIGFyZ3VtZW50cywgTmV3VGFyZ2V0KTsgfSBlbHNlIHsgcmVzdWx0ID0gU3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgfSByZXR1cm4gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgcmVzdWx0KTsgfTsgfVxuXG5mdW5jdGlvbiBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCkgeyBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwidW5kZWZpbmVkXCIgfHwgIVJlZmxlY3QuY29uc3RydWN0KSByZXR1cm4gZmFsc2U7IGlmIChSZWZsZWN0LmNvbnN0cnVjdC5zaGFtKSByZXR1cm4gZmFsc2U7IGlmICh0eXBlb2YgUHJveHkgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIHRydWU7IHRyeSB7IERhdGUucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoUmVmbGVjdC5jb25zdHJ1Y3QoRGF0ZSwgW10sIGZ1bmN0aW9uICgpIHt9KSk7IHJldHVybiB0cnVlOyB9IGNhdGNoIChlKSB7IHJldHVybiBmYWxzZTsgfSB9XG5cbnZhciBfd3JhcEFzeW5jR2VuZXJhdG9yID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvd3JhcEFzeW5jR2VuZXJhdG9yXCIpO1xuXG52YXIgX2F3YWl0QXN5bmNHZW5lcmF0b3IgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9hd2FpdEFzeW5jR2VuZXJhdG9yXCIpO1xuXG52YXIgX2FzeW5jSXRlcmF0b3IgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9hc3luY0l0ZXJhdG9yXCIpO1xuXG52YXIgX2FzeW5jR2VuZXJhdG9yRGVsZWdhdGUgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9hc3luY0dlbmVyYXRvckRlbGVnYXRlXCIpO1xuXG52YXIgX3JlcXVpcmUgPSByZXF1aXJlKCcuL2l0ZXJhYmxlLWl0ZXJhdG9yLmpzJyksXG4gICAgSXRlcmFibGVJdGVyYXRvciA9IF9yZXF1aXJlLkl0ZXJhYmxlSXRlcmF0b3I7XG5cbnZhciBfcmVxdWlyZTIgPSByZXF1aXJlKCcuL2FzeW5jLXBhcnRzLWl0ZXJhdG9yLmpzJyksXG4gICAgQXN5bmNQYXJ0c0l0ZXJhdG9yID0gX3JlcXVpcmUyLkFzeW5jUGFydHNJdGVyYXRvcjtcblxudmFyIEFzeW5jQmlzZWN0b3IgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9JdGVyYWJsZUl0ZXJhdG9yKSB7XG4gIF9pbmhlcml0cyhBc3luY0Jpc2VjdG9yLCBfSXRlcmFibGVJdGVyYXRvcik7XG5cbiAgdmFyIF9zdXBlciA9IF9jcmVhdGVTdXBlcihBc3luY0Jpc2VjdG9yKTtcblxuICBmdW5jdGlvbiBBc3luY0Jpc2VjdG9yKHNvdXJjZSwgc3RyYXRlZ3ksIG9wdGlvbnMpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgQXN5bmNCaXNlY3Rvcik7XG5cbiAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMpO1xuICAgIF90aGlzLnNvdXJjZSA9IHNvdXJjZTtcbiAgICBfdGhpcy5zdHJhdGVneSA9IHN0cmF0ZWd5O1xuICAgIF90aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgIF90aGlzLnBhcnRzSXRlcmF0b3IgPSBudWxsO1xuICAgIF90aGlzLmZpcnN0UGFydCA9IG51bGw7XG4gICAgX3RoaXMuc2Vjb25kUGFydCA9IG51bGw7XG4gICAgX3RoaXMuY3VycmVudElkeCA9IDA7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKEFzeW5jQmlzZWN0b3IsIFt7XG4gICAga2V5OiBcInNldHVwRmlyc3RcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIF9zZXR1cEZpcnN0ID0gX2FzeW5jVG9HZW5lcmF0b3IoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3JSdW50aW1lLm1hcmsoZnVuY3Rpb24gX2NhbGxlZSgpIHtcbiAgICAgICAgdmFyIHNvdXJjZSwgc3RyYXRlZ3ksIG9wdGlvbnMsIHN0ZXA7XG4gICAgICAgIHJldHVybiBfcmVnZW5lcmF0b3JSdW50aW1lLndyYXAoZnVuY3Rpb24gX2NhbGxlZSQoX2NvbnRleHQpIHtcbiAgICAgICAgICB3aGlsZSAoMSkge1xuICAgICAgICAgICAgc3dpdGNoIChfY29udGV4dC5wcmV2ID0gX2NvbnRleHQubmV4dCkge1xuICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgc291cmNlID0gdGhpcy5zb3VyY2UsIHN0cmF0ZWd5ID0gdGhpcy5zdHJhdGVneSwgb3B0aW9ucyA9IHRoaXMub3B0aW9ucztcbiAgICAgICAgICAgICAgICB0aGlzLnBhcnRzSXRlcmF0b3IgPSB0aGlzLnBhcnRzSXRlcmF0b3IgfHwgbmV3IEFzeW5jUGFydHNJdGVyYXRvcihzb3VyY2UsIHN0cmF0ZWd5LCBvcHRpb25zKTtcblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmZpcnN0UGFydCkge1xuICAgICAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDc7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gNTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5wYXJ0c0l0ZXJhdG9yLm5leHQoKTtcblxuICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgc3RlcCA9IF9jb250ZXh0LnNlbnQ7XG4gICAgICAgICAgICAgICAgdGhpcy5maXJzdFBhcnQgPSBzdGVwLmRvbmUgPyBbXSA6IHN0ZXAudmFsdWU7XG5cbiAgICAgICAgICAgICAgY2FzZSA3OlxuICAgICAgICAgICAgICBjYXNlIFwiZW5kXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LnN0b3AoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sIF9jYWxsZWUsIHRoaXMpO1xuICAgICAgfSkpO1xuXG4gICAgICBmdW5jdGlvbiBzZXR1cEZpcnN0KCkge1xuICAgICAgICByZXR1cm4gX3NldHVwRmlyc3QuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHNldHVwRmlyc3Q7XG4gICAgfSgpXG4gIH0sIHtcbiAgICBrZXk6IFwibmV4dFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBuZXh0KCkge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgICBzd2l0Y2ggKHRoaXMuY3VycmVudElkeCsrKSB7XG4gICAgICAgIGNhc2UgMDpcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdmFsdWU6IF93cmFwQXN5bmNHZW5lcmF0b3IoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3JSdW50aW1lLm1hcmsoZnVuY3Rpb24gX2NhbGxlZTIoKSB7XG4gICAgICAgICAgICAgIHJldHVybiBfcmVnZW5lcmF0b3JSdW50aW1lLndyYXAoZnVuY3Rpb24gX2NhbGxlZTIkKF9jb250ZXh0Mikge1xuICAgICAgICAgICAgICAgIHdoaWxlICgxKSB7XG4gICAgICAgICAgICAgICAgICBzd2l0Y2ggKF9jb250ZXh0Mi5wcmV2ID0gX2NvbnRleHQyLm5leHQpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0Mi5uZXh0ID0gMjtcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2F3YWl0QXN5bmNHZW5lcmF0b3Ioc2VsZi5zZXR1cEZpcnN0KCkpO1xuXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQyLmRlbGVnYXRlWWllbGQoX2FzeW5jR2VuZXJhdG9yRGVsZWdhdGUoX2FzeW5jSXRlcmF0b3Ioc2VsZi5maXJzdFBhcnQpLCBfYXdhaXRBc3luY0dlbmVyYXRvciksIFwidDBcIiwgMyk7XG5cbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiZW5kXCI6XG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0Mi5zdG9wKCk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9LCBfY2FsbGVlMik7XG4gICAgICAgICAgICB9KSkoKSxcbiAgICAgICAgICAgIGRvbmU6IGZhbHNlXG4gICAgICAgICAgfTtcblxuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHZhbHVlOiBfd3JhcEFzeW5jR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yUnVudGltZS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUzKCkge1xuICAgICAgICAgICAgICB2YXIgc3RlcDtcbiAgICAgICAgICAgICAgcmV0dXJuIF9yZWdlbmVyYXRvclJ1bnRpbWUud3JhcChmdW5jdGlvbiBfY2FsbGVlMyQoX2NvbnRleHQzKSB7XG4gICAgICAgICAgICAgICAgd2hpbGUgKDEpIHtcbiAgICAgICAgICAgICAgICAgIHN3aXRjaCAoX2NvbnRleHQzLnByZXYgPSBfY29udGV4dDMubmV4dCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQzLm5leHQgPSAyO1xuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfYXdhaXRBc3luY0dlbmVyYXRvcihzZWxmLnNldHVwRmlyc3QoKSk7XG5cbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0My5uZXh0ID0gNDtcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2F3YWl0QXN5bmNHZW5lcmF0b3Ioc2VsZi5wYXJ0c0l0ZXJhdG9yLm5leHQoKSk7XG5cbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICAgIHN0ZXAgPSBfY29udGV4dDMuc2VudDtcbiAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNlY29uZFBhcnQgPSBzdGVwLmRvbmUgPyBbXSA6IHN0ZXAudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0My5kZWxlZ2F0ZVlpZWxkKF9hc3luY0dlbmVyYXRvckRlbGVnYXRlKF9hc3luY0l0ZXJhdG9yKHNlbGYuc2Vjb25kUGFydCksIF9hd2FpdEFzeW5jR2VuZXJhdG9yKSwgXCJ0MFwiLCA3KTtcblxuICAgICAgICAgICAgICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJlbmRcIjpcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQzLnN0b3AoKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0sIF9jYWxsZWUzKTtcbiAgICAgICAgICAgIH0pKSgpLFxuICAgICAgICAgICAgZG9uZTogZmFsc2VcbiAgICAgICAgICB9O1xuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHZhbHVlOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBkb25lOiB0cnVlXG4gICAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmV0dXJuXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9yZXR1cm4oKSB7XG4gICAgICBpZiAodGhpcy5jdXJyZW50SWR4ID09PSAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignWW91IG11c3QgdGFrZSBib3RoIHBhcnRzIG9mIGEgYmlzZWN0b3Igb3IgbmVpdGhlci4nKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdmFsdWU6IHVuZGVmaW5lZCxcbiAgICAgICAgZG9uZTogdHJ1ZVxuICAgICAgfTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gQXN5bmNCaXNlY3Rvcjtcbn0oSXRlcmFibGVJdGVyYXRvcik7XG5cbmV4cG9ydHMuQXN5bmNCaXNlY3RvciA9IEFzeW5jQmlzZWN0b3I7IiwidmFyIF9yZWdlbmVyYXRvclJ1bnRpbWUgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvcmVnZW5lcmF0b3JcIik7XG5cbnZhciBfYXN5bmNUb0dlbmVyYXRvciA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2FzeW5jVG9HZW5lcmF0b3JcIik7XG5cbnZhciBfY3JlYXRlQ2xhc3MgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jcmVhdGVDbGFzc1wiKTtcblxudmFyIF9pbmhlcml0cyA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2luaGVyaXRzXCIpO1xuXG52YXIgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4gPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuXCIpO1xuXG52YXIgX2dldFByb3RvdHlwZU9mID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZ2V0UHJvdG90eXBlT2ZcIik7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2sgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVja1wiKTtcblxuZnVuY3Rpb24gX2NyZWF0ZVN1cGVyKERlcml2ZWQpIHsgdmFyIGhhc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QgPSBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCk7IHJldHVybiBmdW5jdGlvbiBfY3JlYXRlU3VwZXJJbnRlcm5hbCgpIHsgdmFyIFN1cGVyID0gX2dldFByb3RvdHlwZU9mKERlcml2ZWQpLCByZXN1bHQ7IGlmIChoYXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KSB7IHZhciBOZXdUYXJnZXQgPSBfZ2V0UHJvdG90eXBlT2YodGhpcykuY29uc3RydWN0b3I7IHJlc3VsdCA9IFJlZmxlY3QuY29uc3RydWN0KFN1cGVyLCBhcmd1bWVudHMsIE5ld1RhcmdldCk7IH0gZWxzZSB7IHJlc3VsdCA9IFN1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH0gcmV0dXJuIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIHJlc3VsdCk7IH07IH1cblxuZnVuY3Rpb24gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpIHsgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcInVuZGVmaW5lZFwiIHx8ICFSZWZsZWN0LmNvbnN0cnVjdCkgcmV0dXJuIGZhbHNlOyBpZiAoUmVmbGVjdC5jb25zdHJ1Y3Quc2hhbSkgcmV0dXJuIGZhbHNlOyBpZiAodHlwZW9mIFByb3h5ID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiB0cnVlOyB0cnkgeyBEYXRlLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKFJlZmxlY3QuY29uc3RydWN0KERhdGUsIFtdLCBmdW5jdGlvbiAoKSB7fSkpOyByZXR1cm4gdHJ1ZTsgfSBjYXRjaCAoZSkgeyByZXR1cm4gZmFsc2U7IH0gfVxuXG52YXIgX3JlcXVpcmUgPSByZXF1aXJlKCcuL2FzeW5jLWl0ZXJhYmxlLWl0ZXJhdG9yLmpzJyksXG4gICAgQXN5bmNJdGVyYWJsZUl0ZXJhdG9yID0gX3JlcXVpcmUuQXN5bmNJdGVyYWJsZUl0ZXJhdG9yO1xuXG52YXIgX3JlcXVpcmUyID0gcmVxdWlyZSgnLi9hc3luYy1pdGVyYWJsZS5qcycpLFxuICAgIGFzeW5jQ2FsbFJldHVybiA9IF9yZXF1aXJlMi5hc3luY0NhbGxSZXR1cm47XG5cbnZhciBRdWV1ZUl0ZW0gPSBmdW5jdGlvbiBRdWV1ZUl0ZW0oc3RlcCkge1xuICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgUXVldWVJdGVtKTtcblxuICB0aGlzLnN0ZXAgPSBzdGVwO1xuICB0aGlzLm5leHQgPSBudWxsO1xufTtcblxudmFyIEFzeW5jRm9yayA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX0FzeW5jSXRlcmFibGVJdGVyYXRvKSB7XG4gIF9pbmhlcml0cyhBc3luY0ZvcmssIF9Bc3luY0l0ZXJhYmxlSXRlcmF0byk7XG5cbiAgdmFyIF9zdXBlciA9IF9jcmVhdGVTdXBlcihBc3luY0ZvcmspO1xuXG4gIGZ1bmN0aW9uIEFzeW5jRm9yayhoZWFkLCBleGNoYW5nZSkge1xuICAgIHZhciBfdGhpcztcblxuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBBc3luY0ZvcmspO1xuXG4gICAgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzKTtcbiAgICBfdGhpcy5oZWFkID0gaGVhZDtcbiAgICBfdGhpcy5kb25lID0gZmFsc2U7XG4gICAgX3RoaXMuZXhjaGFuZ2UgPSBleGNoYW5nZTtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoQXN5bmNGb3JrLCBbe1xuICAgIGtleTogXCJuZXh0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBfbmV4dCA9IF9hc3luY1RvR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yUnVudGltZS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUoKSB7XG4gICAgICAgIHZhciBkb25lLCBleGNoYW5nZSwgaGVhZCwgX2hlYWQsIHN0ZXA7XG5cbiAgICAgICAgcmV0dXJuIF9yZWdlbmVyYXRvclJ1bnRpbWUud3JhcChmdW5jdGlvbiBfY2FsbGVlJChfY29udGV4dCkge1xuICAgICAgICAgIHdoaWxlICgxKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKF9jb250ZXh0LnByZXYgPSBfY29udGV4dC5uZXh0KSB7XG4gICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICBkb25lID0gdGhpcy5kb25lLCBleGNoYW5nZSA9IHRoaXMuZXhjaGFuZ2U7XG5cbiAgICAgICAgICAgICAgICBpZiAoIWRvbmUpIHtcbiAgICAgICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSA1O1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LmFicnVwdChcInJldHVyblwiLCB7XG4gICAgICAgICAgICAgICAgICB2YWx1ZTogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgZG9uZTogZG9uZVxuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICBoZWFkID0gdGhpcy5oZWFkO1xuXG4gICAgICAgICAgICAgICAgaWYgKGhlYWQubmV4dCkge1xuICAgICAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDk7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gOTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZXhjaGFuZ2UuZmV0Y2goKTtcblxuICAgICAgICAgICAgICBjYXNlIDk6XG4gICAgICAgICAgICAgICAgaGVhZCA9IGhlYWQubmV4dDtcbiAgICAgICAgICAgICAgICBfaGVhZCA9IGhlYWQsIHN0ZXAgPSBfaGVhZC5zdGVwO1xuICAgICAgICAgICAgICAgIHRoaXMuZG9uZSA9IHN0ZXAuZG9uZTtcbiAgICAgICAgICAgICAgICB0aGlzLmhlYWQgPSBoZWFkO1xuICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5hYnJ1cHQoXCJyZXR1cm5cIiwgc3RlcCk7XG5cbiAgICAgICAgICAgICAgY2FzZSAxNDpcbiAgICAgICAgICAgICAgY2FzZSBcImVuZFwiOlxuICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5zdG9wKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9LCBfY2FsbGVlLCB0aGlzKTtcbiAgICAgIH0pKTtcblxuICAgICAgZnVuY3Rpb24gbmV4dCgpIHtcbiAgICAgICAgcmV0dXJuIF9uZXh0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBuZXh0O1xuICAgIH0oKVxuICB9LCB7XG4gICAga2V5OiBcInJldHVyblwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgX3JldHVybjIgPSBfYXN5bmNUb0dlbmVyYXRvciggLyojX19QVVJFX18qL19yZWdlbmVyYXRvclJ1bnRpbWUubWFyayhmdW5jdGlvbiBfY2FsbGVlMigpIHtcbiAgICAgICAgdmFyIGRvbmUsIGV4Y2hhbmdlO1xuICAgICAgICByZXR1cm4gX3JlZ2VuZXJhdG9yUnVudGltZS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUyJChfY29udGV4dDIpIHtcbiAgICAgICAgICB3aGlsZSAoMSkge1xuICAgICAgICAgICAgc3dpdGNoIChfY29udGV4dDIucHJldiA9IF9jb250ZXh0Mi5uZXh0KSB7XG4gICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICBkb25lID0gdGhpcy5kb25lLCBleGNoYW5nZSA9IHRoaXMuZXhjaGFuZ2U7XG5cbiAgICAgICAgICAgICAgICBpZiAoZG9uZSkge1xuICAgICAgICAgICAgICAgICAgX2NvbnRleHQyLm5leHQgPSA0O1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgX2NvbnRleHQyLm5leHQgPSA0O1xuICAgICAgICAgICAgICAgIHJldHVybiBleGNoYW5nZVtcInJldHVyblwiXSgpO1xuXG4gICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQyLmFicnVwdChcInJldHVyblwiLCB7XG4gICAgICAgICAgICAgICAgICB2YWx1ZTogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgZG9uZTogdHJ1ZVxuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgY2FzZSBcImVuZFwiOlxuICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDIuc3RvcCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSwgX2NhbGxlZTIsIHRoaXMpO1xuICAgICAgfSkpO1xuXG4gICAgICBmdW5jdGlvbiBfcmV0dXJuKCkge1xuICAgICAgICByZXR1cm4gX3JldHVybjIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIF9yZXR1cm47XG4gICAgfSgpXG4gIH1dKTtcblxuICByZXR1cm4gQXN5bmNGb3JrO1xufShBc3luY0l0ZXJhYmxlSXRlcmF0b3IpO1xuXG52YXIgQXN5bmNFeGNoYW5nZSA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIEFzeW5jRXhjaGFuZ2UoaXRlcmF0b3IpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgQXN5bmNFeGNoYW5nZSk7XG5cbiAgICB0aGlzLml0ZXJhdG9yID0gaXRlcmF0b3I7XG4gICAgdGhpcy50YWlsID0gbmV3IFF1ZXVlSXRlbShudWxsKTtcbiAgICB0aGlzLmhlYWQgPSB0aGlzLnRhaWw7XG4gICAgdGhpcy5mb3JrcyA9IDA7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoQXN5bmNFeGNoYW5nZSwgW3tcbiAgICBrZXk6IFwiZm9ya1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBmb3JrKCkge1xuICAgICAgKyt0aGlzLmZvcmtzO1xuICAgICAgcmV0dXJuIG5ldyBBc3luY0ZvcmsodGhpcy50YWlsLCB0aGlzKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiYWR2YW5jZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBhZHZhbmNlKCkge1xuICAgICAgdGhpcy50YWlsID0gdGhpcy50YWlsLm5leHQ7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImZldGNoXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBfZmV0Y2ggPSBfYXN5bmNUb0dlbmVyYXRvciggLyojX19QVVJFX18qL19yZWdlbmVyYXRvclJ1bnRpbWUubWFyayhmdW5jdGlvbiBfY2FsbGVlMygpIHtcbiAgICAgICAgdmFyIHN0ZXAsIG5ld0l0ZW07XG4gICAgICAgIHJldHVybiBfcmVnZW5lcmF0b3JSdW50aW1lLndyYXAoZnVuY3Rpb24gX2NhbGxlZTMkKF9jb250ZXh0Mykge1xuICAgICAgICAgIHdoaWxlICgxKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKF9jb250ZXh0My5wcmV2ID0gX2NvbnRleHQzLm5leHQpIHtcbiAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgIF9jb250ZXh0My5uZXh0ID0gMjtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5pdGVyYXRvci5uZXh0KCk7XG5cbiAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgIHN0ZXAgPSBfY29udGV4dDMuc2VudDtcbiAgICAgICAgICAgICAgICBuZXdJdGVtID0gbmV3IFF1ZXVlSXRlbShzdGVwKTtcbiAgICAgICAgICAgICAgICB0aGlzLmhlYWQubmV4dCA9IHRoaXMuaGVhZCA9IG5ld0l0ZW07XG5cbiAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICBjYXNlIFwiZW5kXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0My5zdG9wKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9LCBfY2FsbGVlMywgdGhpcyk7XG4gICAgICB9KSk7XG5cbiAgICAgIGZ1bmN0aW9uIGZldGNoKCkge1xuICAgICAgICByZXR1cm4gX2ZldGNoLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmZXRjaDtcbiAgICB9KClcbiAgfSwge1xuICAgIGtleTogXCJyZXR1cm5cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIF9yZXR1cm4zID0gX2FzeW5jVG9HZW5lcmF0b3IoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3JSdW50aW1lLm1hcmsoZnVuY3Rpb24gX2NhbGxlZTQoKSB7XG4gICAgICAgIHJldHVybiBfcmVnZW5lcmF0b3JSdW50aW1lLndyYXAoZnVuY3Rpb24gX2NhbGxlZTQkKF9jb250ZXh0NCkge1xuICAgICAgICAgIHdoaWxlICgxKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKF9jb250ZXh0NC5wcmV2ID0gX2NvbnRleHQ0Lm5leHQpIHtcbiAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgIC0tdGhpcy5mb3JrcztcblxuICAgICAgICAgICAgICAgIGlmICghKHRoaXMuZm9ya3MgPT09IDApKSB7XG4gICAgICAgICAgICAgICAgICBfY29udGV4dDQubmV4dCA9IDQ7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBfY29udGV4dDQubmV4dCA9IDQ7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFzeW5jQ2FsbFJldHVybih0aGlzLml0ZXJhdG9yKTtcblxuICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0NC5hYnJ1cHQoXCJyZXR1cm5cIiwge1xuICAgICAgICAgICAgICAgICAgdmFsdWU6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgIGRvbmU6IHRydWVcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgIGNhc2UgXCJlbmRcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQ0LnN0b3AoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sIF9jYWxsZWU0LCB0aGlzKTtcbiAgICAgIH0pKTtcblxuICAgICAgZnVuY3Rpb24gX3JldHVybigpIHtcbiAgICAgICAgcmV0dXJuIF9yZXR1cm4zLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBfcmV0dXJuO1xuICAgIH0oKVxuICB9XSk7XG5cbiAgcmV0dXJuIEFzeW5jRXhjaGFuZ2U7XG59KCk7XG5cbmV4cG9ydHMuQXN5bmNFeGNoYW5nZSA9IEFzeW5jRXhjaGFuZ2U7IiwidmFyIF9yZWdlbmVyYXRvclJ1bnRpbWUgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvcmVnZW5lcmF0b3JcIik7XG5cbnZhciBfYXN5bmNUb0dlbmVyYXRvciA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2FzeW5jVG9HZW5lcmF0b3JcIik7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2sgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVja1wiKTtcblxudmFyIF9jcmVhdGVDbGFzcyA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NyZWF0ZUNsYXNzXCIpO1xuXG52YXIgX2luaGVyaXRzID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW5oZXJpdHNcIik7XG5cbnZhciBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybiA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm5cIik7XG5cbnZhciBfZ2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9nZXRQcm90b3R5cGVPZlwiKTtcblxuZnVuY3Rpb24gX2NyZWF0ZVN1cGVyKERlcml2ZWQpIHsgdmFyIGhhc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QgPSBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCk7IHJldHVybiBmdW5jdGlvbiBfY3JlYXRlU3VwZXJJbnRlcm5hbCgpIHsgdmFyIFN1cGVyID0gX2dldFByb3RvdHlwZU9mKERlcml2ZWQpLCByZXN1bHQ7IGlmIChoYXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KSB7IHZhciBOZXdUYXJnZXQgPSBfZ2V0UHJvdG90eXBlT2YodGhpcykuY29uc3RydWN0b3I7IHJlc3VsdCA9IFJlZmxlY3QuY29uc3RydWN0KFN1cGVyLCBhcmd1bWVudHMsIE5ld1RhcmdldCk7IH0gZWxzZSB7IHJlc3VsdCA9IFN1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH0gcmV0dXJuIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIHJlc3VsdCk7IH07IH1cblxuZnVuY3Rpb24gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpIHsgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcInVuZGVmaW5lZFwiIHx8ICFSZWZsZWN0LmNvbnN0cnVjdCkgcmV0dXJuIGZhbHNlOyBpZiAoUmVmbGVjdC5jb25zdHJ1Y3Quc2hhbSkgcmV0dXJuIGZhbHNlOyBpZiAodHlwZW9mIFByb3h5ID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiB0cnVlOyB0cnkgeyBEYXRlLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKFJlZmxlY3QuY29uc3RydWN0KERhdGUsIFtdLCBmdW5jdGlvbiAoKSB7fSkpOyByZXR1cm4gdHJ1ZTsgfSBjYXRjaCAoZSkgeyByZXR1cm4gZmFsc2U7IH0gfVxuXG52YXIgX3JlcXVpcmUgPSByZXF1aXJlKCcuL2FzeW5jLXBhcnRzLWl0ZXJhdG9yLmpzJyksXG4gICAgQXN5bmNQYXJ0c0l0ZXJhdG9yID0gX3JlcXVpcmUuQXN5bmNQYXJ0c0l0ZXJhdG9yLFxuICAgIEFzeW5jUGFydEl0ZXJhdG9yID0gX3JlcXVpcmUuQXN5bmNQYXJ0SXRlcmF0b3I7XG5cbnZhciBfcmVxdWlyZTIgPSByZXF1aXJlKCcuL3N5bWJvbHMuanMnKSxcbiAgICBzcGxpdCA9IF9yZXF1aXJlMi5zcGxpdDtcblxudmFyIEFzeW5jR3JvdXBzSXRlcmF0b3IgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9Bc3luY1BhcnRzSXRlcmF0b3IpIHtcbiAgX2luaGVyaXRzKEFzeW5jR3JvdXBzSXRlcmF0b3IsIF9Bc3luY1BhcnRzSXRlcmF0b3IpO1xuXG4gIHZhciBfc3VwZXIgPSBfY3JlYXRlU3VwZXIoQXN5bmNHcm91cHNJdGVyYXRvcik7XG5cbiAgZnVuY3Rpb24gQXN5bmNHcm91cHNJdGVyYXRvcigpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgQXN5bmNHcm91cHNJdGVyYXRvcik7XG5cbiAgICByZXR1cm4gX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoQXN5bmNHcm91cHNJdGVyYXRvciwgW3tcbiAgICBrZXk6IFwibmV4dFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgX25leHQgPSBfYXN5bmNUb0dlbmVyYXRvciggLyojX19QVVJFX18qL19yZWdlbmVyYXRvclJ1bnRpbWUubWFyayhmdW5jdGlvbiBfY2FsbGVlKCkge1xuICAgICAgICB2YXIgc3BsaXRlcmF0b3IsIGtleTtcbiAgICAgICAgcmV0dXJuIF9yZWdlbmVyYXRvclJ1bnRpbWUud3JhcChmdW5jdGlvbiBfY2FsbGVlJChfY29udGV4dCkge1xuICAgICAgICAgIHdoaWxlICgxKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKF9jb250ZXh0LnByZXYgPSBfY29udGV4dC5uZXh0KSB7XG4gICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pbml0aWFsaXplZCkge1xuICAgICAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDM7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMztcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5pbml0KCk7XG5cbiAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgIHNwbGl0ZXJhdG9yID0gdGhpcy5zcGxpdGVyYXRvcjtcblxuICAgICAgICAgICAgICAgIGlmICghKHRoaXMuY3VycmVudFBhcnQgIT09IG51bGwpKSB7XG4gICAgICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMTI7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoIShzcGxpdGVyYXRvci52YWx1ZSAhPT0gc3BsaXQgfHwgc3BsaXRlcmF0b3IuY3VycmVudCA9PT0gdGhpcy5zcGxpdFN0ZXApKSB7XG4gICAgICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMTI7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRQYXJ0LmluYWN0aXZlID0gdHJ1ZTtcblxuICAgICAgICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgICAgICAgaWYgKCEoIXNwbGl0ZXJhdG9yLmRvbmUgJiYgc3BsaXRlcmF0b3IudmFsdWUgIT09IHNwbGl0KSkge1xuICAgICAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDEyO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDEwO1xuICAgICAgICAgICAgICAgIHJldHVybiBzcGxpdGVyYXRvci5hZHZhbmNlKCk7XG5cbiAgICAgICAgICAgICAgY2FzZSAxMDpcbiAgICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gNztcbiAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICBjYXNlIDEyOlxuICAgICAgICAgICAgICAgIGlmICghc3BsaXRlcmF0b3IuZG9uZSkge1xuICAgICAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDE0O1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LmFicnVwdChcInJldHVyblwiLCB7XG4gICAgICAgICAgICAgICAgICB2YWx1ZTogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgZG9uZTogdHJ1ZVxuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgIGNhc2UgMTQ6XG4gICAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDE2O1xuICAgICAgICAgICAgICAgIHJldHVybiBzcGxpdGVyYXRvci5hZHZhbmNlKCk7XG5cbiAgICAgICAgICAgICAgY2FzZSAxNjpcbiAgICAgICAgICAgICAgICBpZiAoIShzcGxpdGVyYXRvci5kb25lIHx8IHNwbGl0ZXJhdG9yLnZhbHVlID09PSBzcGxpdCkpIHtcbiAgICAgICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAxODtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5leHBlY3RlZCBlbXB0eSBncm91cCcpO1xuXG4gICAgICAgICAgICAgIGNhc2UgMTg6XG4gICAgICAgICAgICAgICAga2V5ID0gc3BsaXRlcmF0b3IudmFsdWU7XG4gICAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDIxO1xuICAgICAgICAgICAgICAgIHJldHVybiBzcGxpdGVyYXRvci5hZHZhbmNlKCk7XG5cbiAgICAgICAgICAgICAgY2FzZSAyMTpcbiAgICAgICAgICAgICAgICB0aGlzLnNwbGl0U3RlcCA9IHNwbGl0ZXJhdG9yLmN1cnJlbnQ7XG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50UGFydCA9IG5ldyBBc3luY1BhcnRJdGVyYXRvcih0aGlzKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuYWJydXB0KFwicmV0dXJuXCIsIHtcbiAgICAgICAgICAgICAgICAgIHZhbHVlOiBba2V5LCB0aGlzLmN1cnJlbnRQYXJ0XSxcbiAgICAgICAgICAgICAgICAgIGRvbmU6IGZhbHNlXG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgY2FzZSAyNDpcbiAgICAgICAgICAgICAgY2FzZSBcImVuZFwiOlxuICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5zdG9wKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9LCBfY2FsbGVlLCB0aGlzKTtcbiAgICAgIH0pKTtcblxuICAgICAgZnVuY3Rpb24gbmV4dCgpIHtcbiAgICAgICAgcmV0dXJuIF9uZXh0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBuZXh0O1xuICAgIH0oKVxuICB9XSk7XG5cbiAgcmV0dXJuIEFzeW5jR3JvdXBzSXRlcmF0b3I7XG59KEFzeW5jUGFydHNJdGVyYXRvcik7XG5cbmV4cG9ydHMuQXN5bmNHcm91cHNJdGVyYXRvciA9IEFzeW5jR3JvdXBzSXRlcmF0b3I7IiwidmFyIF9jbGFzc0NhbGxDaGVjayA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrXCIpO1xuXG52YXIgX2NyZWF0ZUNsYXNzID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY3JlYXRlQ2xhc3NcIik7XG5cbnZhciBBc3luY0l0ZXJhYmxlSXRlcmF0b3IgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBBc3luY0l0ZXJhYmxlSXRlcmF0b3IoKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEFzeW5jSXRlcmFibGVJdGVyYXRvcik7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoQXN5bmNJdGVyYWJsZUl0ZXJhdG9yLCBbe1xuICAgIGtleTogU3ltYm9sLmFzeW5jSXRlcmF0b3IsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHZhbHVlKCkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIEFzeW5jSXRlcmFibGVJdGVyYXRvcjtcbn0oKTtcblxuZXhwb3J0cy5Bc3luY0l0ZXJhYmxlSXRlcmF0b3IgPSBBc3luY0l0ZXJhYmxlSXRlcmF0b3I7IiwidmFyIF9yZWdlbmVyYXRvclJ1bnRpbWUgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvcmVnZW5lcmF0b3JcIik7XG5cbnZhciBfYXN5bmNUb0dlbmVyYXRvciA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2FzeW5jVG9HZW5lcmF0b3JcIik7XG5cbnZhciBfZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9kZWZpbmVQcm9wZXJ0eVwiKTtcblxudmFyIF9hc3luY0l0ZXJhdG9yID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvYXN5bmNJdGVyYXRvclwiKTtcblxudmFyIF9yZXF1aXJlID0gcmVxdWlyZSgnLi4vaW1wbHMvaXMtYXN5bmMtaXRlcmFibGUvaXMtYXN5bmMtaXRlcmFibGUuanMnKSxcbiAgICBpc0FzeW5jSXRlcmFibGUgPSBfcmVxdWlyZS5pc0FzeW5jSXRlcmFibGU7XG5cbnZhciBfcmVxdWlyZTIgPSByZXF1aXJlKCcuLi9pbXBscy9pcy1hc3luYy1sb29wYWJsZS9pcy1hc3luYy1sb29wYWJsZS5qcycpLFxuICAgIGlzQXN5bmNMb29wYWJsZSA9IF9yZXF1aXJlMi5pc0FzeW5jTG9vcGFibGU7XG5cbnZhciBfcmVxdWlyZTMgPSByZXF1aXJlKCcuLi9pbXBscy9pcy1hc3luYy13cmFwcGFibGUvaXMtYXN5bmMtd3JhcHBhYmxlLmpzJyksXG4gICAgaXNBc3luY1dyYXBwYWJsZSA9IF9yZXF1aXJlMy5pc0FzeW5jV3JhcHBhYmxlO1xuXG52YXIgX3JlcXVpcmU0ID0gcmVxdWlyZSgnLi9hc3luYy13cmFwLmpzJyksXG4gICAgYXN5bmNXcmFwID0gX3JlcXVpcmU0LmFzeW5jTnVsbGFibGVXcmFwO1xuXG52YXIgX3JlcXVpcmU1ID0gcmVxdWlyZSgnLi9pdGVyYWJsZS5qcycpLFxuICAgIEJhc2VJdGVyYWJsZUl0ZXJhdG9yID0gX3JlcXVpcmU1LkJhc2VJdGVyYWJsZUl0ZXJhdG9yLFxuICAgIEl0ZXJhYmxlSXRlcmF0b3IgPSBfcmVxdWlyZTUuSXRlcmFibGVJdGVyYXRvcjtcblxudmFyIF9yZXF1aXJlNiA9IHJlcXVpcmUoJy4vY3VycnkuanMnKSxcbiAgICB2YXJpYWRpY0N1cnJ5V2l0aFZhbGlkYXRpb24gPSBfcmVxdWlyZTYudmFyaWFkaWNDdXJyeVdpdGhWYWxpZGF0aW9uO1xuXG52YXIgX3JlcXVpcmU3ID0gcmVxdWlyZSgnLi9zeW1ib2xzLmpzJyksXG4gICAgX19pdGVyYXRlID0gX3JlcXVpcmU3Ll9faXRlcmF0ZTtcblxuZXhwb3J0cy5hc3luY1dyYXAgPSBhc3luY1dyYXA7XG5leHBvcnRzLmFzeW5jSXNJdGVyYWJsZSA9IGlzQXN5bmNJdGVyYWJsZTtcbmV4cG9ydHMuYXN5bmNJc0xvb3BhYmxlID0gaXNBc3luY0xvb3BhYmxlO1xuZXhwb3J0cy5hc3luY0lzV3JhcHBhYmxlID0gaXNBc3luY1dyYXBwYWJsZTtcblxuZnVuY3Rpb24gYXN5bmNDYWxsUmV0dXJuKF94KSB7XG4gIHJldHVybiBfYXN5bmNDYWxsUmV0dXJuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5cbmZ1bmN0aW9uIF9hc3luY0NhbGxSZXR1cm4oKSB7XG4gIF9hc3luY0NhbGxSZXR1cm4gPSBfYXN5bmNUb0dlbmVyYXRvciggLyojX19QVVJFX18qL19yZWdlbmVyYXRvclJ1bnRpbWUubWFyayhmdW5jdGlvbiBfY2FsbGVlKGl0ZXJhdG9yKSB7XG4gICAgcmV0dXJuIF9yZWdlbmVyYXRvclJ1bnRpbWUud3JhcChmdW5jdGlvbiBfY2FsbGVlJChfY29udGV4dCkge1xuICAgICAgd2hpbGUgKDEpIHtcbiAgICAgICAgc3dpdGNoIChfY29udGV4dC5wcmV2ID0gX2NvbnRleHQubmV4dCkge1xuICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgIGlmICghKCdyZXR1cm4nIGluIGl0ZXJhdG9yKSkge1xuICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMztcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAzO1xuICAgICAgICAgICAgcmV0dXJuIGl0ZXJhdG9yW1wicmV0dXJuXCJdKCk7XG5cbiAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgY2FzZSBcImVuZFwiOlxuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LnN0b3AoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sIF9jYWxsZWUpO1xuICB9KSk7XG4gIHJldHVybiBfYXN5bmNDYWxsUmV0dXJuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5cbmV4cG9ydHMuYXN5bmNDYWxsUmV0dXJuID0gYXN5bmNDYWxsUmV0dXJuO1xuXG5mdW5jdGlvbiBhc3luY0Vuc3VyZUl0ZXJhYmxlKHZhbHVlKSB7XG4gIGlmICghaXNBc3luY1dyYXBwYWJsZSh2YWx1ZSkpIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlLm5leHQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2l0ZXItdG9vbHMgcmVjZWl2ZWQgYSB2YWx1ZSB0aGF0IGxvb2tlZCBsaWtlIGFuIGl0ZXJhdG9yIGJ1dCB3YXMgbm90IGFzeW5jIGl0ZXJhYmxlLiBHZXQgaGVscCBmaXhpbmcgdGhpczogaHR0cHM6Ly9naXRodWIuY29tL2l0ZXItdG9vbHMvaXRlci10b29scy93aWtpL01ha2luZy1pdGVyYXRvcnMtaXRlcmFibGUjYXN5bmMtaXRlcmF0b3JzJyk7XG4gICAgfSBlbHNlIHRocm93IG5ldyBUeXBlRXJyb3IoJ0V4cGVjdGVkIGFuIGFzeW5jIGl0ZXJhYmxlLCBzeW5jIGl0ZXJhYmxlLCBudWxsIG9yIHVuZGVmaW5lZCcpO1xuICB9IGVsc2UgaWYgKGlzQXN5bmNJdGVyYWJsZSh2YWx1ZSkpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGFzeW5jV3JhcCh2YWx1ZSk7XG4gIH1cbn1cblxuZXhwb3J0cy5hc3luY0Vuc3VyZUl0ZXJhYmxlID0gYXN5bmNFbnN1cmVJdGVyYWJsZTtcblxuZnVuY3Rpb24gQXN5bmNJdGVyYWJsZUl0ZXJhdG9yKCkge1xuICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICBhcmdzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICB9XG5cbiAgQmFzZUl0ZXJhYmxlSXRlcmF0b3IuYXBwbHkodGhpcywgYXJncyk7XG59XG5cbmV4cG9ydHMuQXN5bmNJdGVyYWJsZUl0ZXJhdG9yID0gQXN5bmNJdGVyYWJsZUl0ZXJhdG9yO1xuQXN5bmNJdGVyYWJsZUl0ZXJhdG9yLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShCYXNlSXRlcmFibGVJdGVyYXRvci5wcm90b3R5cGUpLCBfZGVmaW5lUHJvcGVydHkoe1xuICBjb25zdHJ1Y3RvcjogQXN5bmNJdGVyYWJsZUl0ZXJhdG9yXG59LCBTeW1ib2wuYXN5bmNJdGVyYXRvciwgZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpc1tfX2l0ZXJhdGVdKCk7XG59KSk7XG5cbmZ1bmN0aW9uIG1ha2VGdW5jdGlvbkNvbmZpZyhmbikge1xuICB2YXIgZm5Db25maWcgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuICB2YXIgX2ZuQ29uZmlnJHZhbGlkYXRlQXJnID0gZm5Db25maWcudmFsaWRhdGVBcmdzLFxuICAgICAgdmFsaWRhdGVBcmdzID0gX2ZuQ29uZmlnJHZhbGlkYXRlQXJnID09PSB2b2lkIDAgPyBmdW5jdGlvbiAoXykge30gOiBfZm5Db25maWckdmFsaWRhdGVBcmcsXG4gICAgICBfZm5Db25maWckdmFyaWFkaWMgPSBmbkNvbmZpZy52YXJpYWRpYyxcbiAgICAgIHZhcmlhZGljID0gX2ZuQ29uZmlnJHZhcmlhZGljID09PSB2b2lkIDAgPyBmYWxzZSA6IF9mbkNvbmZpZyR2YXJpYWRpYyxcbiAgICAgIF9mbkNvbmZpZyRyZWR1Y2VzID0gZm5Db25maWcucmVkdWNlcyxcbiAgICAgIHJlZHVjZXMgPSBfZm5Db25maWckcmVkdWNlcyA9PT0gdm9pZCAwID8gZmFsc2UgOiBfZm5Db25maWckcmVkdWNlcyxcbiAgICAgIF9mbkNvbmZpZyRncm93UmlnaHQgPSBmbkNvbmZpZy5ncm93UmlnaHQsXG4gICAgICBncm93UmlnaHQgPSBfZm5Db25maWckZ3Jvd1JpZ2h0ID09PSB2b2lkIDAgPyBmYWxzZSA6IF9mbkNvbmZpZyRncm93UmlnaHQsXG4gICAgICBfZm5Db25maWckbWluQXJncyA9IGZuQ29uZmlnLm1pbkFyZ3MsXG4gICAgICBtaW5BcmdzID0gX2ZuQ29uZmlnJG1pbkFyZ3MgPT09IHZvaWQgMCA/IGZuLmxlbmd0aCAtIDEgOiBfZm5Db25maWckbWluQXJncyxcbiAgICAgIF9mbkNvbmZpZyRtYXhBcmdzID0gZm5Db25maWcubWF4QXJncyxcbiAgICAgIG1heEFyZ3MgPSBfZm5Db25maWckbWF4QXJncyA9PT0gdm9pZCAwID8gZm4ubGVuZ3RoIC0gMSA6IF9mbkNvbmZpZyRtYXhBcmdzLFxuICAgICAgX2ZuQ29uZmlnJGZvcmNlU3luYyA9IGZuQ29uZmlnLmZvcmNlU3luYyxcbiAgICAgIGZvcmNlU3luYyA9IF9mbkNvbmZpZyRmb3JjZVN5bmMgPT09IHZvaWQgMCA/IGZhbHNlIDogX2ZuQ29uZmlnJGZvcmNlU3luYyxcbiAgICAgIF9mbkNvbmZpZyRhcHBseU9uSXRlciA9IGZuQ29uZmlnLmFwcGx5T25JdGVyYWJsZUFyZ3MsXG4gICAgICBhcHBseU9uSXRlcmFibGVBcmdzID0gX2ZuQ29uZmlnJGFwcGx5T25JdGVyID09PSB2b2lkIDAgPyBhc3luY0Vuc3VyZUl0ZXJhYmxlIDogX2ZuQ29uZmlnJGFwcGx5T25JdGVyO1xuICByZXR1cm4ge1xuICAgIGZuOiBmbixcbiAgICB2YWxpZGF0ZUFyZ3M6IHZhbGlkYXRlQXJncyxcbiAgICB2YXJpYWRpYzogdmFyaWFkaWMsXG4gICAgcmVkdWNlczogcmVkdWNlcyxcbiAgICBncm93UmlnaHQ6IGdyb3dSaWdodCxcbiAgICBtaW5BcmdzOiBtaW5BcmdzLFxuICAgIG1heEFyZ3M6IG1heEFyZ3MsXG4gICAgaXNJdGVyYWJsZTogaXNBc3luY1dyYXBwYWJsZSxcbiAgICBpdGVyYWJsZVR5cGU6ICdhc3luY0l0ZXJhYmxlJyxcbiAgICBhcHBseU9uSXRlcmFibGVBcmdzOiBhcHBseU9uSXRlcmFibGVBcmdzLFxuICAgIEl0ZXJhYmxlQ2xhc3M6IGZvcmNlU3luYyA/IEl0ZXJhYmxlSXRlcmF0b3IgOiBBc3luY0l0ZXJhYmxlSXRlcmF0b3JcbiAgfTtcbn1cblxuZnVuY3Rpb24gYXN5bmNDYWNoZShfeDIpIHtcbiAgcmV0dXJuIF9hc3luY0NhY2hlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5cbmZ1bmN0aW9uIF9hc3luY0NhY2hlKCkge1xuICBfYXN5bmNDYWNoZSA9IF9hc3luY1RvR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yUnVudGltZS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUyKGl0KSB7XG4gICAgdmFyIGFyciwgX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbiwgX2RpZEl0ZXJhdG9yRXJyb3IsIF9pdGVyYXRvckVycm9yLCBfaXRlcmF0b3IsIF9zdGVwLCBfdmFsdWUsIHZhbHVlO1xuXG4gICAgcmV0dXJuIF9yZWdlbmVyYXRvclJ1bnRpbWUud3JhcChmdW5jdGlvbiBfY2FsbGVlMiQoX2NvbnRleHQyKSB7XG4gICAgICB3aGlsZSAoMSkge1xuICAgICAgICBzd2l0Y2ggKF9jb250ZXh0Mi5wcmV2ID0gX2NvbnRleHQyLm5leHQpIHtcbiAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICBhcnIgPSBbXTtcbiAgICAgICAgICAgIF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24gPSB0cnVlO1xuICAgICAgICAgICAgX2RpZEl0ZXJhdG9yRXJyb3IgPSBmYWxzZTtcbiAgICAgICAgICAgIF9jb250ZXh0Mi5wcmV2ID0gMztcbiAgICAgICAgICAgIF9pdGVyYXRvciA9IF9hc3luY0l0ZXJhdG9yKGl0KTtcblxuICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgIF9jb250ZXh0Mi5uZXh0ID0gNztcbiAgICAgICAgICAgIHJldHVybiBfaXRlcmF0b3IubmV4dCgpO1xuXG4gICAgICAgICAgY2FzZSA3OlxuICAgICAgICAgICAgX3N0ZXAgPSBfY29udGV4dDIuc2VudDtcbiAgICAgICAgICAgIF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24gPSBfc3RlcC5kb25lO1xuICAgICAgICAgICAgX2NvbnRleHQyLm5leHQgPSAxMTtcbiAgICAgICAgICAgIHJldHVybiBfc3RlcC52YWx1ZTtcblxuICAgICAgICAgIGNhc2UgMTE6XG4gICAgICAgICAgICBfdmFsdWUgPSBfY29udGV4dDIuc2VudDtcblxuICAgICAgICAgICAgaWYgKF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24pIHtcbiAgICAgICAgICAgICAgX2NvbnRleHQyLm5leHQgPSAxODtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhbHVlID0gX3ZhbHVlO1xuICAgICAgICAgICAgYXJyLnB1c2godmFsdWUpO1xuXG4gICAgICAgICAgY2FzZSAxNTpcbiAgICAgICAgICAgIF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24gPSB0cnVlO1xuICAgICAgICAgICAgX2NvbnRleHQyLm5leHQgPSA1O1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlIDE4OlxuICAgICAgICAgICAgX2NvbnRleHQyLm5leHQgPSAyNDtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSAyMDpcbiAgICAgICAgICAgIF9jb250ZXh0Mi5wcmV2ID0gMjA7XG4gICAgICAgICAgICBfY29udGV4dDIudDAgPSBfY29udGV4dDJbXCJjYXRjaFwiXSgzKTtcbiAgICAgICAgICAgIF9kaWRJdGVyYXRvckVycm9yID0gdHJ1ZTtcbiAgICAgICAgICAgIF9pdGVyYXRvckVycm9yID0gX2NvbnRleHQyLnQwO1xuXG4gICAgICAgICAgY2FzZSAyNDpcbiAgICAgICAgICAgIF9jb250ZXh0Mi5wcmV2ID0gMjQ7XG4gICAgICAgICAgICBfY29udGV4dDIucHJldiA9IDI1O1xuXG4gICAgICAgICAgICBpZiAoISghX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbiAmJiBfaXRlcmF0b3JbXCJyZXR1cm5cIl0gIT0gbnVsbCkpIHtcbiAgICAgICAgICAgICAgX2NvbnRleHQyLm5leHQgPSAyOTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIF9jb250ZXh0Mi5uZXh0ID0gMjk7XG4gICAgICAgICAgICByZXR1cm4gX2l0ZXJhdG9yW1wicmV0dXJuXCJdKCk7XG5cbiAgICAgICAgICBjYXNlIDI5OlxuICAgICAgICAgICAgX2NvbnRleHQyLnByZXYgPSAyOTtcblxuICAgICAgICAgICAgaWYgKCFfZGlkSXRlcmF0b3JFcnJvcikge1xuICAgICAgICAgICAgICBfY29udGV4dDIubmV4dCA9IDMyO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhyb3cgX2l0ZXJhdG9yRXJyb3I7XG5cbiAgICAgICAgICBjYXNlIDMyOlxuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0Mi5maW5pc2goMjkpO1xuXG4gICAgICAgICAgY2FzZSAzMzpcbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dDIuZmluaXNoKDI0KTtcblxuICAgICAgICAgIGNhc2UgMzQ6XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQyLmFicnVwdChcInJldHVyblwiLCBhc3luY1dyYXBXaXRoSXRlcmFibGVJdGVyYXRvcihhc3luY1dyYXApKGFycikpO1xuXG4gICAgICAgICAgY2FzZSAzNTpcbiAgICAgICAgICBjYXNlIFwiZW5kXCI6XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQyLnN0b3AoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sIF9jYWxsZWUyLCBudWxsLCBbWzMsIDIwLCAyNCwgMzRdLCBbMjUsLCAyOSwgMzNdXSk7XG4gIH0pKTtcbiAgcmV0dXJuIF9hc3luY0NhY2hlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5cbmV4cG9ydHMuYXN5bmNDYWNoZSA9IGFzeW5jQ2FjaGU7XG5cbmZ1bmN0aW9uIGFzeW5jV3JhcFdpdGhJdGVyYWJsZUl0ZXJhdG9yKGZuKSB7XG4gIHZhciBfcmVmID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fSxcbiAgICAgIF9yZWYkdmFsaWRhdGVBcmdzID0gX3JlZi52YWxpZGF0ZUFyZ3MsXG4gICAgICB2YWxpZGF0ZUFyZ3MgPSBfcmVmJHZhbGlkYXRlQXJncyA9PT0gdm9pZCAwID8gZnVuY3Rpb24gKF8pIHtcbiAgICByZXR1cm4gXztcbiAgfSA6IF9yZWYkdmFsaWRhdGVBcmdzO1xuXG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgZm9yICh2YXIgX2xlbjIgPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4yKSwgX2tleTIgPSAwOyBfa2V5MiA8IF9sZW4yOyBfa2V5MisrKSB7XG4gICAgICBhcmdzW19rZXkyXSA9IGFyZ3VtZW50c1tfa2V5Ml07XG4gICAgfVxuXG4gICAgdmFsaWRhdGVBcmdzKGFyZ3MpO1xuICAgIHJldHVybiBuZXcgQXN5bmNJdGVyYWJsZUl0ZXJhdG9yKGZuLCBhcmdzKTtcbiAgfTtcbn1cblxuZXhwb3J0cy5hc3luY1dyYXBXaXRoSXRlcmFibGVJdGVyYXRvciA9IGFzeW5jV3JhcFdpdGhJdGVyYWJsZUl0ZXJhdG9yO1xuXG52YXIgYXN5bmNJdGVyYWJsZUN1cnJ5ID0gZnVuY3Rpb24gYXN5bmNJdGVyYWJsZUN1cnJ5KGZuLCBjb25maWcpIHtcbiAgcmV0dXJuIHZhcmlhZGljQ3VycnlXaXRoVmFsaWRhdGlvbihtYWtlRnVuY3Rpb25Db25maWcoZm4sIGNvbmZpZykpO1xufTtcblxuZXhwb3J0cy5hc3luY0l0ZXJhYmxlQ3VycnkgPSBhc3luY0l0ZXJhYmxlQ3Vycnk7IiwidmFyIF9yZWdlbmVyYXRvclJ1bnRpbWUgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvcmVnZW5lcmF0b3JcIik7XG5cbnZhciBfbWFya2VkID0gLyojX19QVVJFX18qL19yZWdlbmVyYXRvclJ1bnRpbWUubWFyayhtYXApO1xuXG5mdW5jdGlvbiBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihvLCBhbGxvd0FycmF5TGlrZSkgeyB2YXIgaXQ7IGlmICh0eXBlb2YgU3ltYm9sID09PSBcInVuZGVmaW5lZFwiIHx8IG9bU3ltYm9sLml0ZXJhdG9yXSA9PSBudWxsKSB7IGlmIChBcnJheS5pc0FycmF5KG8pIHx8IChpdCA9IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvKSkgfHwgYWxsb3dBcnJheUxpa2UgJiYgbyAmJiB0eXBlb2Ygby5sZW5ndGggPT09IFwibnVtYmVyXCIpIHsgaWYgKGl0KSBvID0gaXQ7IHZhciBpID0gMDsgdmFyIEYgPSBmdW5jdGlvbiBGKCkge307IHJldHVybiB7IHM6IEYsIG46IGZ1bmN0aW9uIG4oKSB7IGlmIChpID49IG8ubGVuZ3RoKSByZXR1cm4geyBkb25lOiB0cnVlIH07IHJldHVybiB7IGRvbmU6IGZhbHNlLCB2YWx1ZTogb1tpKytdIH07IH0sIGU6IGZ1bmN0aW9uIGUoX2UpIHsgdGhyb3cgX2U7IH0sIGY6IEYgfTsgfSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIGl0ZXJhdGUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIik7IH0gdmFyIG5vcm1hbENvbXBsZXRpb24gPSB0cnVlLCBkaWRFcnIgPSBmYWxzZSwgZXJyOyByZXR1cm4geyBzOiBmdW5jdGlvbiBzKCkgeyBpdCA9IG9bU3ltYm9sLml0ZXJhdG9yXSgpOyB9LCBuOiBmdW5jdGlvbiBuKCkgeyB2YXIgc3RlcCA9IGl0Lm5leHQoKTsgbm9ybWFsQ29tcGxldGlvbiA9IHN0ZXAuZG9uZTsgcmV0dXJuIHN0ZXA7IH0sIGU6IGZ1bmN0aW9uIGUoX2UyKSB7IGRpZEVyciA9IHRydWU7IGVyciA9IF9lMjsgfSwgZjogZnVuY3Rpb24gZigpIHsgdHJ5IHsgaWYgKCFub3JtYWxDb21wbGV0aW9uICYmIGl0W1wicmV0dXJuXCJdICE9IG51bGwpIGl0W1wicmV0dXJuXCJdKCk7IH0gZmluYWxseSB7IGlmIChkaWRFcnIpIHRocm93IGVycjsgfSB9IH07IH1cblxuZnVuY3Rpb24gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8sIG1pbkxlbikgeyBpZiAoIW8pIHJldHVybjsgaWYgKHR5cGVvZiBvID09PSBcInN0cmluZ1wiKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTsgdmFyIG4gPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykuc2xpY2UoOCwgLTEpOyBpZiAobiA9PT0gXCJPYmplY3RcIiAmJiBvLmNvbnN0cnVjdG9yKSBuID0gby5jb25zdHJ1Y3Rvci5uYW1lOyBpZiAobiA9PT0gXCJNYXBcIiB8fCBuID09PSBcIlNldFwiKSByZXR1cm4gQXJyYXkuZnJvbShvKTsgaWYgKG4gPT09IFwiQXJndW1lbnRzXCIgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QobikpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pOyB9XG5cbmZ1bmN0aW9uIF9hcnJheUxpa2VUb0FycmF5KGFyciwgbGVuKSB7IGlmIChsZW4gPT0gbnVsbCB8fCBsZW4gPiBhcnIubGVuZ3RoKSBsZW4gPSBhcnIubGVuZ3RoOyBmb3IgKHZhciBpID0gMCwgYXJyMiA9IG5ldyBBcnJheShsZW4pOyBpIDwgbGVuOyBpKyspIHsgYXJyMltpXSA9IGFycltpXTsgfSByZXR1cm4gYXJyMjsgfVxuXG5mdW5jdGlvbiBtYXAoaXRlcmFibGUsIGNiKSB7XG4gIHZhciBfaXRlcmF0b3IsIF9zdGVwLCB2YWx1ZTtcblxuICByZXR1cm4gX3JlZ2VuZXJhdG9yUnVudGltZS53cmFwKGZ1bmN0aW9uIG1hcCQoX2NvbnRleHQpIHtcbiAgICB3aGlsZSAoMSkge1xuICAgICAgc3dpdGNoIChfY29udGV4dC5wcmV2ID0gX2NvbnRleHQubmV4dCkge1xuICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgX2l0ZXJhdG9yID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIoaXRlcmFibGUpO1xuICAgICAgICAgIF9jb250ZXh0LnByZXYgPSAxO1xuXG4gICAgICAgICAgX2l0ZXJhdG9yLnMoKTtcblxuICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgaWYgKChfc3RlcCA9IF9pdGVyYXRvci5uKCkpLmRvbmUpIHtcbiAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSA5O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFsdWUgPSBfc3RlcC52YWx1ZTtcbiAgICAgICAgICBfY29udGV4dC5uZXh0ID0gNztcbiAgICAgICAgICByZXR1cm4gY2IodmFsdWUpO1xuXG4gICAgICAgIGNhc2UgNzpcbiAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMztcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIDk6XG4gICAgICAgICAgX2NvbnRleHQubmV4dCA9IDE0O1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgMTE6XG4gICAgICAgICAgX2NvbnRleHQucHJldiA9IDExO1xuICAgICAgICAgIF9jb250ZXh0LnQwID0gX2NvbnRleHRbXCJjYXRjaFwiXSgxKTtcblxuICAgICAgICAgIF9pdGVyYXRvci5lKF9jb250ZXh0LnQwKTtcblxuICAgICAgICBjYXNlIDE0OlxuICAgICAgICAgIF9jb250ZXh0LnByZXYgPSAxNDtcblxuICAgICAgICAgIF9pdGVyYXRvci5mKCk7XG5cbiAgICAgICAgICByZXR1cm4gX2NvbnRleHQuZmluaXNoKDE0KTtcblxuICAgICAgICBjYXNlIDE3OlxuICAgICAgICBjYXNlIFwiZW5kXCI6XG4gICAgICAgICAgcmV0dXJuIF9jb250ZXh0LnN0b3AoKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIF9tYXJrZWQsIG51bGwsIFtbMSwgMTEsIDE0LCAxN11dKTtcbn1cblxuZnVuY3Rpb24gYXN5bmNQYXJhbGxlbEVhY2goaXRlcmFibGUsIGNiKSB7XG4gIHJldHVybiBQcm9taXNlLmFsbChtYXAoaXRlcmFibGUsIGNiKSk7XG59XG5cbmV4cG9ydHMuYXN5bmNQYXJhbGxlbEVhY2ggPSBhc3luY1BhcmFsbGVsRWFjaDsiLCJ2YXIgX3JlZ2VuZXJhdG9yUnVudGltZSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9yZWdlbmVyYXRvclwiKTtcblxudmFyIF9hc3luY1RvR2VuZXJhdG9yID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvYXN5bmNUb0dlbmVyYXRvclwiKTtcblxudmFyIF9jbGFzc0NhbGxDaGVjayA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrXCIpO1xuXG52YXIgX2NyZWF0ZUNsYXNzID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY3JlYXRlQ2xhc3NcIik7XG5cbnZhciBfaW5oZXJpdHMgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbmhlcml0c1wiKTtcblxudmFyIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvcG9zc2libGVDb25zdHJ1Y3RvclJldHVyblwiKTtcblxudmFyIF9nZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2dldFByb3RvdHlwZU9mXCIpO1xuXG5mdW5jdGlvbiBfY3JlYXRlU3VwZXIoRGVyaXZlZCkgeyB2YXIgaGFzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCA9IF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKTsgcmV0dXJuIGZ1bmN0aW9uIF9jcmVhdGVTdXBlckludGVybmFsKCkgeyB2YXIgU3VwZXIgPSBfZ2V0UHJvdG90eXBlT2YoRGVyaXZlZCksIHJlc3VsdDsgaWYgKGhhc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QpIHsgdmFyIE5ld1RhcmdldCA9IF9nZXRQcm90b3R5cGVPZih0aGlzKS5jb25zdHJ1Y3RvcjsgcmVzdWx0ID0gUmVmbGVjdC5jb25zdHJ1Y3QoU3VwZXIsIGFyZ3VtZW50cywgTmV3VGFyZ2V0KTsgfSBlbHNlIHsgcmVzdWx0ID0gU3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgfSByZXR1cm4gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgcmVzdWx0KTsgfTsgfVxuXG5mdW5jdGlvbiBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCkgeyBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwidW5kZWZpbmVkXCIgfHwgIVJlZmxlY3QuY29uc3RydWN0KSByZXR1cm4gZmFsc2U7IGlmIChSZWZsZWN0LmNvbnN0cnVjdC5zaGFtKSByZXR1cm4gZmFsc2U7IGlmICh0eXBlb2YgUHJveHkgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIHRydWU7IHRyeSB7IERhdGUucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoUmVmbGVjdC5jb25zdHJ1Y3QoRGF0ZSwgW10sIGZ1bmN0aW9uICgpIHt9KSk7IHJldHVybiB0cnVlOyB9IGNhdGNoIChlKSB7IHJldHVybiBmYWxzZTsgfSB9XG5cbnZhciBfcmVxdWlyZSA9IHJlcXVpcmUoJy4vc3ltYm9scy5qcycpLFxuICAgIHNwbGl0ID0gX3JlcXVpcmUuc3BsaXQ7XG5cbnZhciBfcmVxdWlyZTIgPSByZXF1aXJlKCcuL2FzeW5jLWl0ZXJhYmxlLWl0ZXJhdG9yLmpzJyksXG4gICAgQXN5bmNJdGVyYWJsZUl0ZXJhdG9yID0gX3JlcXVpcmUyLkFzeW5jSXRlcmFibGVJdGVyYXRvcjtcblxudmFyIF9yZXF1aXJlMyA9IHJlcXVpcmUoJy4vYXN5bmMtcGVla2VyYXRvci5qcycpLFxuICAgIEFzeW5jUGVla2VyYXRvciA9IF9yZXF1aXJlMy5Bc3luY1BlZWtlcmF0b3I7XG5cbnZhciBBc3luY1BhcnRJdGVyYXRvciA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX0FzeW5jSXRlcmFibGVJdGVyYXRvKSB7XG4gIF9pbmhlcml0cyhBc3luY1BhcnRJdGVyYXRvciwgX0FzeW5jSXRlcmFibGVJdGVyYXRvKTtcblxuICB2YXIgX3N1cGVyID0gX2NyZWF0ZVN1cGVyKEFzeW5jUGFydEl0ZXJhdG9yKTtcblxuICBmdW5jdGlvbiBBc3luY1BhcnRJdGVyYXRvcihwYXJ0c0l0ZXJhdG9yKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEFzeW5jUGFydEl0ZXJhdG9yKTtcblxuICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcyk7XG4gICAgX3RoaXMucGFydHNJdGVyYXRvciA9IHBhcnRzSXRlcmF0b3I7XG4gICAgX3RoaXMuaW5hY3RpdmUgPSBmYWxzZTtcbiAgICBfdGhpcy5kb25lID0gZmFsc2U7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKEFzeW5jUGFydEl0ZXJhdG9yLCBbe1xuICAgIGtleTogXCJhc3NlcnRBY3RpdmVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYXNzZXJ0QWN0aXZlKCkge1xuICAgICAgaWYgKHRoaXMuaW5hY3RpdmUgJiYgIXRoaXMuZG9uZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCB0YWtlIGZyb20gdGhpcyBzcGxpdCBwYXJ0LiBJdCBpcyBubyBsb25nZXIgdGhlIGFjdGl2ZSBwYXJ0LicpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJuZXh0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBfbmV4dCA9IF9hc3luY1RvR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yUnVudGltZS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUoKSB7XG4gICAgICAgIHZhciBzcGxpdGVyYXRvciwgY3VycmVudDtcbiAgICAgICAgcmV0dXJuIF9yZWdlbmVyYXRvclJ1bnRpbWUud3JhcChmdW5jdGlvbiBfY2FsbGVlJChfY29udGV4dCkge1xuICAgICAgICAgIHdoaWxlICgxKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKF9jb250ZXh0LnByZXYgPSBfY29udGV4dC5uZXh0KSB7XG4gICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICBzcGxpdGVyYXRvciA9IHRoaXMucGFydHNJdGVyYXRvci5zcGxpdGVyYXRvcjtcbiAgICAgICAgICAgICAgICBjdXJyZW50ID0gc3BsaXRlcmF0b3IuY3VycmVudDtcbiAgICAgICAgICAgICAgICB0aGlzLmFzc2VydEFjdGl2ZSgpO1xuXG4gICAgICAgICAgICAgICAgaWYgKCEodGhpcy5kb25lIHx8IGN1cnJlbnQuZG9uZSB8fCBjdXJyZW50LnZhbHVlID09PSBzcGxpdCkpIHtcbiAgICAgICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAxMDtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMuZG9uZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDc7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucGFydHNJdGVyYXRvci5tYXliZVJldHVyblNvdXJjZSgpO1xuXG4gICAgICAgICAgICAgIGNhc2UgNzpcbiAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuYWJydXB0KFwicmV0dXJuXCIsIHtcbiAgICAgICAgICAgICAgICAgIHZhbHVlOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICBkb25lOiB0cnVlXG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgY2FzZSAxMDpcbiAgICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMTI7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHNwbGl0ZXJhdG9yLmFkdmFuY2UoKTtcblxuICAgICAgICAgICAgICBjYXNlIDEyOlxuICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5hYnJ1cHQoXCJyZXR1cm5cIiwgY3VycmVudCk7XG5cbiAgICAgICAgICAgICAgY2FzZSAxMzpcbiAgICAgICAgICAgICAgY2FzZSBcImVuZFwiOlxuICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5zdG9wKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9LCBfY2FsbGVlLCB0aGlzKTtcbiAgICAgIH0pKTtcblxuICAgICAgZnVuY3Rpb24gbmV4dCgpIHtcbiAgICAgICAgcmV0dXJuIF9uZXh0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBuZXh0O1xuICAgIH0oKVxuICB9LCB7XG4gICAga2V5OiBcInJldHVyblwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgX3JldHVybjIgPSBfYXN5bmNUb0dlbmVyYXRvciggLyojX19QVVJFX18qL19yZWdlbmVyYXRvclJ1bnRpbWUubWFyayhmdW5jdGlvbiBfY2FsbGVlMigpIHtcbiAgICAgICAgcmV0dXJuIF9yZWdlbmVyYXRvclJ1bnRpbWUud3JhcChmdW5jdGlvbiBfY2FsbGVlMiQoX2NvbnRleHQyKSB7XG4gICAgICAgICAgd2hpbGUgKDEpIHtcbiAgICAgICAgICAgIHN3aXRjaCAoX2NvbnRleHQyLnByZXYgPSBfY29udGV4dDIubmV4dCkge1xuICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgdGhpcy5kb25lID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBfY29udGV4dDIubmV4dCA9IDM7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucGFydHNJdGVyYXRvci5tYXliZVJldHVyblNvdXJjZSgpO1xuXG4gICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQyLmFicnVwdChcInJldHVyblwiLCB7XG4gICAgICAgICAgICAgICAgICB2YWx1ZTogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgZG9uZTogdHJ1ZVxuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgY2FzZSBcImVuZFwiOlxuICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDIuc3RvcCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSwgX2NhbGxlZTIsIHRoaXMpO1xuICAgICAgfSkpO1xuXG4gICAgICBmdW5jdGlvbiBfcmV0dXJuKCkge1xuICAgICAgICByZXR1cm4gX3JldHVybjIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIF9yZXR1cm47XG4gICAgfSgpXG4gIH0sIHtcbiAgICBrZXk6IFwidGhyb3dcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIF90aHJvdzIgPSBfYXN5bmNUb0dlbmVyYXRvciggLyojX19QVVJFX18qL19yZWdlbmVyYXRvclJ1bnRpbWUubWFyayhmdW5jdGlvbiBfY2FsbGVlMygpIHtcbiAgICAgICAgcmV0dXJuIF9yZWdlbmVyYXRvclJ1bnRpbWUud3JhcChmdW5jdGlvbiBfY2FsbGVlMyQoX2NvbnRleHQzKSB7XG4gICAgICAgICAgd2hpbGUgKDEpIHtcbiAgICAgICAgICAgIHN3aXRjaCAoX2NvbnRleHQzLnByZXYgPSBfY29udGV4dDMubmV4dCkge1xuICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgX2NvbnRleHQzLm5leHQgPSAyO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzW1wicmV0dXJuXCJdKCk7XG5cbiAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDMuYWJydXB0KFwicmV0dXJuXCIsIF9jb250ZXh0My5zZW50KTtcblxuICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgIGNhc2UgXCJlbmRcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQzLnN0b3AoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sIF9jYWxsZWUzLCB0aGlzKTtcbiAgICAgIH0pKTtcblxuICAgICAgZnVuY3Rpb24gX3Rocm93KCkge1xuICAgICAgICByZXR1cm4gX3Rocm93Mi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gX3Rocm93O1xuICAgIH0oKVxuICB9XSk7XG5cbiAgcmV0dXJuIEFzeW5jUGFydEl0ZXJhdG9yO1xufShBc3luY0l0ZXJhYmxlSXRlcmF0b3IpO1xuXG5leHBvcnRzLkFzeW5jUGFydEl0ZXJhdG9yID0gQXN5bmNQYXJ0SXRlcmF0b3I7XG5cbnZhciBBc3luY1BhcnRzSXRlcmF0b3IgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9Bc3luY0l0ZXJhYmxlSXRlcmF0bzIpIHtcbiAgX2luaGVyaXRzKEFzeW5jUGFydHNJdGVyYXRvciwgX0FzeW5jSXRlcmFibGVJdGVyYXRvMik7XG5cbiAgdmFyIF9zdXBlcjIgPSBfY3JlYXRlU3VwZXIoQXN5bmNQYXJ0c0l0ZXJhdG9yKTtcblxuICBmdW5jdGlvbiBBc3luY1BhcnRzSXRlcmF0b3Ioc291cmNlLCBzdHJhdGVneSwgb3B0aW9ucykge1xuICAgIHZhciBfdGhpczI7XG5cbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgQXN5bmNQYXJ0c0l0ZXJhdG9yKTtcblxuICAgIF90aGlzMiA9IF9zdXBlcjIuY2FsbCh0aGlzKTtcbiAgICBfdGhpczIuc291cmNlID0gc291cmNlO1xuICAgIF90aGlzMi5zdHJhdGVneSA9IHN0cmF0ZWd5O1xuICAgIF90aGlzMi5vcHRpb25zID0gb3B0aW9ucztcbiAgICBfdGhpczIuaW5pdGlhbGl6ZWQgPSBmYWxzZTtcbiAgICBfdGhpczIucmV0dXJuZWQgPSBmYWxzZTtcbiAgICBfdGhpczIuc3BsaXRlcmF0b3IgPSBudWxsO1xuICAgIF90aGlzMi5jdXJyZW50UGFydCA9IG51bGw7XG4gICAgX3RoaXMyLnNwbGl0U3RlcCA9IG51bGw7XG4gICAgcmV0dXJuIF90aGlzMjtcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhBc3luY1BhcnRzSXRlcmF0b3IsIFt7XG4gICAga2V5OiBcImluaXRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIF9pbml0ID0gX2FzeW5jVG9HZW5lcmF0b3IoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3JSdW50aW1lLm1hcmsoZnVuY3Rpb24gX2NhbGxlZTQoKSB7XG4gICAgICAgIHZhciBzb3VyY2UsIHN0cmF0ZWd5LCBvcHRpb25zO1xuICAgICAgICByZXR1cm4gX3JlZ2VuZXJhdG9yUnVudGltZS53cmFwKGZ1bmN0aW9uIF9jYWxsZWU0JChfY29udGV4dDQpIHtcbiAgICAgICAgICB3aGlsZSAoMSkge1xuICAgICAgICAgICAgc3dpdGNoIChfY29udGV4dDQucHJldiA9IF9jb250ZXh0NC5uZXh0KSB7XG4gICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICB0aGlzLmluaXRpYWxpemVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBzb3VyY2UgPSB0aGlzLnNvdXJjZSwgc3RyYXRlZ3kgPSB0aGlzLnN0cmF0ZWd5LCBvcHRpb25zID0gdGhpcy5vcHRpb25zO1xuICAgICAgICAgICAgICAgIF9jb250ZXh0NC5uZXh0ID0gNDtcbiAgICAgICAgICAgICAgICByZXR1cm4gQXN5bmNQZWVrZXJhdG9yLmZyb20oc3RyYXRlZ3koc3BsaXQsIG9wdGlvbnMsIHNvdXJjZSkpO1xuXG4gICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICB0aGlzLnNwbGl0ZXJhdG9yID0gX2NvbnRleHQ0LnNlbnQ7XG5cbiAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICBjYXNlIFwiZW5kXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0NC5zdG9wKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9LCBfY2FsbGVlNCwgdGhpcyk7XG4gICAgICB9KSk7XG5cbiAgICAgIGZ1bmN0aW9uIGluaXQoKSB7XG4gICAgICAgIHJldHVybiBfaW5pdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gaW5pdDtcbiAgICB9KClcbiAgfSwge1xuICAgIGtleTogXCJtYXliZVJldHVyblNvdXJjZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgX21heWJlUmV0dXJuU291cmNlID0gX2FzeW5jVG9HZW5lcmF0b3IoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3JSdW50aW1lLm1hcmsoZnVuY3Rpb24gX2NhbGxlZTUoKSB7XG4gICAgICAgIHJldHVybiBfcmVnZW5lcmF0b3JSdW50aW1lLndyYXAoZnVuY3Rpb24gX2NhbGxlZTUkKF9jb250ZXh0NSkge1xuICAgICAgICAgIHdoaWxlICgxKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKF9jb250ZXh0NS5wcmV2ID0gX2NvbnRleHQ1Lm5leHQpIHtcbiAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgIGlmICghKHRoaXMuc3BsaXRlcmF0b3IgJiYgdGhpcy5yZXR1cm5lZCAmJiB0aGlzLmN1cnJlbnRQYXJ0LmRvbmUpKSB7XG4gICAgICAgICAgICAgICAgICBfY29udGV4dDUubmV4dCA9IDM7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBfY29udGV4dDUubmV4dCA9IDM7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3BsaXRlcmF0b3JbXCJyZXR1cm5cIl0oKTtcblxuICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgIGNhc2UgXCJlbmRcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQ1LnN0b3AoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sIF9jYWxsZWU1LCB0aGlzKTtcbiAgICAgIH0pKTtcblxuICAgICAgZnVuY3Rpb24gbWF5YmVSZXR1cm5Tb3VyY2UoKSB7XG4gICAgICAgIHJldHVybiBfbWF5YmVSZXR1cm5Tb3VyY2UuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG1heWJlUmV0dXJuU291cmNlO1xuICAgIH0oKVxuICB9LCB7XG4gICAga2V5OiBcIm5leHRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIF9uZXh0MiA9IF9hc3luY1RvR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yUnVudGltZS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWU2KCkge1xuICAgICAgICB2YXIgc3BsaXRlcmF0b3I7XG4gICAgICAgIHJldHVybiBfcmVnZW5lcmF0b3JSdW50aW1lLndyYXAoZnVuY3Rpb24gX2NhbGxlZTYkKF9jb250ZXh0Nikge1xuICAgICAgICAgIHdoaWxlICgxKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKF9jb250ZXh0Ni5wcmV2ID0gX2NvbnRleHQ2Lm5leHQpIHtcbiAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmluaXRpYWxpemVkKSB7XG4gICAgICAgICAgICAgICAgICBfY29udGV4dDYubmV4dCA9IDM7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBfY29udGV4dDYubmV4dCA9IDM7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW5pdCgpO1xuXG4gICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICBzcGxpdGVyYXRvciA9IHRoaXMuc3BsaXRlcmF0b3I7XG5cbiAgICAgICAgICAgICAgICBpZiAoIXNwbGl0ZXJhdG9yLmRvbmUpIHtcbiAgICAgICAgICAgICAgICAgIF9jb250ZXh0Ni5uZXh0ID0gNjtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDYuYWJydXB0KFwicmV0dXJuXCIsIHtcbiAgICAgICAgICAgICAgICAgIHZhbHVlOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICBkb25lOiB0cnVlXG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgIGlmICghKHRoaXMuY3VycmVudFBhcnQgIT09IG51bGwpKSB7XG4gICAgICAgICAgICAgICAgICBfY29udGV4dDYubmV4dCA9IDE2O1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKCEoc3BsaXRlcmF0b3IudmFsdWUgIT09IHNwbGl0IHx8IHNwbGl0ZXJhdG9yLmN1cnJlbnQgPT09IHRoaXMuc3BsaXRTdGVwKSkge1xuICAgICAgICAgICAgICAgICAgX2NvbnRleHQ2Lm5leHQgPSAxNDtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudFBhcnQuaW5hY3RpdmUgPSB0cnVlO1xuXG4gICAgICAgICAgICAgIGNhc2UgOTpcbiAgICAgICAgICAgICAgICBpZiAoISghc3BsaXRlcmF0b3IuZG9uZSAmJiBzcGxpdGVyYXRvci52YWx1ZSAhPT0gc3BsaXQpKSB7XG4gICAgICAgICAgICAgICAgICBfY29udGV4dDYubmV4dCA9IDE0O1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgX2NvbnRleHQ2Lm5leHQgPSAxMjtcbiAgICAgICAgICAgICAgICByZXR1cm4gc3BsaXRlcmF0b3IuYWR2YW5jZSgpO1xuXG4gICAgICAgICAgICAgIGNhc2UgMTI6XG4gICAgICAgICAgICAgICAgX2NvbnRleHQ2Lm5leHQgPSA5O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgIGNhc2UgMTQ6XG4gICAgICAgICAgICAgICAgX2NvbnRleHQ2Lm5leHQgPSAxNjtcbiAgICAgICAgICAgICAgICByZXR1cm4gc3BsaXRlcmF0b3IuYWR2YW5jZSgpO1xuXG4gICAgICAgICAgICAgIGNhc2UgMTY6XG4gICAgICAgICAgICAgICAgdGhpcy5zcGxpdFN0ZXAgPSBzcGxpdGVyYXRvci5jdXJyZW50O1xuICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudFBhcnQgPSBuZXcgQXN5bmNQYXJ0SXRlcmF0b3IodGhpcyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0Ni5hYnJ1cHQoXCJyZXR1cm5cIiwge1xuICAgICAgICAgICAgICAgICAgdmFsdWU6IHRoaXMuY3VycmVudFBhcnQsXG4gICAgICAgICAgICAgICAgICBkb25lOiBmYWxzZVxuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgIGNhc2UgMTk6XG4gICAgICAgICAgICAgIGNhc2UgXCJlbmRcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQ2LnN0b3AoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sIF9jYWxsZWU2LCB0aGlzKTtcbiAgICAgIH0pKTtcblxuICAgICAgZnVuY3Rpb24gbmV4dCgpIHtcbiAgICAgICAgcmV0dXJuIF9uZXh0Mi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbmV4dDtcbiAgICB9KClcbiAgfSwge1xuICAgIGtleTogXCJyZXR1cm5cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIF9yZXR1cm4zID0gX2FzeW5jVG9HZW5lcmF0b3IoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3JSdW50aW1lLm1hcmsoZnVuY3Rpb24gX2NhbGxlZTcodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIF9yZWdlbmVyYXRvclJ1bnRpbWUud3JhcChmdW5jdGlvbiBfY2FsbGVlNyQoX2NvbnRleHQ3KSB7XG4gICAgICAgICAgd2hpbGUgKDEpIHtcbiAgICAgICAgICAgIHN3aXRjaCAoX2NvbnRleHQ3LnByZXYgPSBfY29udGV4dDcubmV4dCkge1xuICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgdGhpcy5yZXR1cm5lZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgX2NvbnRleHQ3Lm5leHQgPSAzO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm1heWJlUmV0dXJuU291cmNlKCk7XG5cbiAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDcuYWJydXB0KFwicmV0dXJuXCIsIHtcbiAgICAgICAgICAgICAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgICAgICAgICAgICAgIGRvbmU6IHRydWVcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgIGNhc2UgXCJlbmRcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQ3LnN0b3AoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sIF9jYWxsZWU3LCB0aGlzKTtcbiAgICAgIH0pKTtcblxuICAgICAgZnVuY3Rpb24gX3JldHVybihfeCkge1xuICAgICAgICByZXR1cm4gX3JldHVybjMuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIF9yZXR1cm47XG4gICAgfSgpXG4gIH0sIHtcbiAgICBrZXk6IFwidGhyb3dcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIF90aHJvdzMgPSBfYXN5bmNUb0dlbmVyYXRvciggLyojX19QVVJFX18qL19yZWdlbmVyYXRvclJ1bnRpbWUubWFyayhmdW5jdGlvbiBfY2FsbGVlOCgpIHtcbiAgICAgICAgcmV0dXJuIF9yZWdlbmVyYXRvclJ1bnRpbWUud3JhcChmdW5jdGlvbiBfY2FsbGVlOCQoX2NvbnRleHQ4KSB7XG4gICAgICAgICAgd2hpbGUgKDEpIHtcbiAgICAgICAgICAgIHN3aXRjaCAoX2NvbnRleHQ4LnByZXYgPSBfY29udGV4dDgubmV4dCkge1xuICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgX2NvbnRleHQ4Lm5leHQgPSAyO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzW1wicmV0dXJuXCJdKCk7XG5cbiAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDguYWJydXB0KFwicmV0dXJuXCIsIF9jb250ZXh0OC5zZW50KTtcblxuICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgIGNhc2UgXCJlbmRcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQ4LnN0b3AoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sIF9jYWxsZWU4LCB0aGlzKTtcbiAgICAgIH0pKTtcblxuICAgICAgZnVuY3Rpb24gX3Rocm93KCkge1xuICAgICAgICByZXR1cm4gX3Rocm93My5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gX3Rocm93O1xuICAgIH0oKVxuICB9XSk7XG5cbiAgcmV0dXJuIEFzeW5jUGFydHNJdGVyYXRvcjtcbn0oQXN5bmNJdGVyYWJsZUl0ZXJhdG9yKTtcblxuZXhwb3J0cy5Bc3luY1BhcnRzSXRlcmF0b3IgPSBBc3luY1BhcnRzSXRlcmF0b3I7IiwidmFyIF9jb25zdHJ1Y3QgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jb25zdHJ1Y3RcIik7XG5cbnZhciBfcmVnZW5lcmF0b3JSdW50aW1lID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL3JlZ2VuZXJhdG9yXCIpO1xuXG52YXIgX2FzeW5jVG9HZW5lcmF0b3IgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9hc3luY1RvR2VuZXJhdG9yXCIpO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY2xhc3NDYWxsQ2hlY2tcIik7XG5cbnZhciBfY3JlYXRlQ2xhc3MgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jcmVhdGVDbGFzc1wiKTtcblxudmFyIF9yZXF1aXJlID0gcmVxdWlyZSgnLi9hc3luYy1pdGVyYWJsZS5qcycpLFxuICAgIGFzeW5jRW5zdXJlSXRlcmFibGUgPSBfcmVxdWlyZS5hc3luY0Vuc3VyZUl0ZXJhYmxlLFxuICAgIGFzeW5jQ2FsbFJldHVybiA9IF9yZXF1aXJlLmFzeW5jQ2FsbFJldHVybjtcblxudmFyIF8gPSBTeW1ib2xbXCJmb3JcIl0oJ18nKTtcblxudmFyIEFzeW5jUGVla2VyYXRvckl0ZXJhdG9yID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gQXN5bmNQZWVrZXJhdG9ySXRlcmF0b3IocGVla3IpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgQXN5bmNQZWVrZXJhdG9ySXRlcmF0b3IpO1xuXG4gICAgdGhpcy5wZWVrciA9IHBlZWtyO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKEFzeW5jUGVla2VyYXRvckl0ZXJhdG9yLCBbe1xuICAgIGtleTogXCJuZXh0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBfbmV4dCA9IF9hc3luY1RvR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yUnVudGltZS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUoKSB7XG4gICAgICAgIHZhciBwZWVrciwgY3VycmVudDtcbiAgICAgICAgcmV0dXJuIF9yZWdlbmVyYXRvclJ1bnRpbWUud3JhcChmdW5jdGlvbiBfY2FsbGVlJChfY29udGV4dCkge1xuICAgICAgICAgIHdoaWxlICgxKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKF9jb250ZXh0LnByZXYgPSBfY29udGV4dC5uZXh0KSB7XG4gICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICBwZWVrciA9IHRoaXMucGVla3I7XG4gICAgICAgICAgICAgICAgY3VycmVudCA9IHBlZWtyLmN1cnJlbnQ7XG4gICAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDQ7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHBlZWtyLmFkdmFuY2UoKTtcblxuICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LmFicnVwdChcInJldHVyblwiLCBjdXJyZW50KTtcblxuICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgIGNhc2UgXCJlbmRcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuc3RvcCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSwgX2NhbGxlZSwgdGhpcyk7XG4gICAgICB9KSk7XG5cbiAgICAgIGZ1bmN0aW9uIG5leHQoKSB7XG4gICAgICAgIHJldHVybiBfbmV4dC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbmV4dDtcbiAgICB9KClcbiAgfSwge1xuICAgIGtleTogXCJyZXR1cm5cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIF9yZXR1cm4yID0gX2FzeW5jVG9HZW5lcmF0b3IoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3JSdW50aW1lLm1hcmsoZnVuY3Rpb24gX2NhbGxlZTIoKSB7XG4gICAgICAgIHJldHVybiBfcmVnZW5lcmF0b3JSdW50aW1lLndyYXAoZnVuY3Rpb24gX2NhbGxlZTIkKF9jb250ZXh0Mikge1xuICAgICAgICAgIHdoaWxlICgxKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKF9jb250ZXh0Mi5wcmV2ID0gX2NvbnRleHQyLm5leHQpIHtcbiAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgIF9jb250ZXh0Mi5uZXh0ID0gMjtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5wZWVrcltcInJldHVyblwiXSgpO1xuXG4gICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQyLmFicnVwdChcInJldHVyblwiLCB7XG4gICAgICAgICAgICAgICAgICB2YWx1ZTogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgZG9uZTogdHJ1ZVxuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgY2FzZSBcImVuZFwiOlxuICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDIuc3RvcCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSwgX2NhbGxlZTIsIHRoaXMpO1xuICAgICAgfSkpO1xuXG4gICAgICBmdW5jdGlvbiBfcmV0dXJuKCkge1xuICAgICAgICByZXR1cm4gX3JldHVybjIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIF9yZXR1cm47XG4gICAgfSgpXG4gIH0sIHtcbiAgICBrZXk6IFN5bWJvbC5hc3luY0l0ZXJhdG9yLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB2YWx1ZSgpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBBc3luY1BlZWtlcmF0b3JJdGVyYXRvcjtcbn0oKTtcblxudmFyIEFzeW5jUGVla2VyYXRvciA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIF9jcmVhdGVDbGFzcyhBc3luY1BlZWtlcmF0b3IsIG51bGwsIFt7XG4gICAga2V5OiBcImZyb21cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIF9mcm9tID0gX2FzeW5jVG9HZW5lcmF0b3IoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3JSdW50aW1lLm1hcmsoZnVuY3Rpb24gX2NhbGxlZTMoaXRlcmFibGUpIHtcbiAgICAgICAgdmFyIGl0ZXJhdG9yLFxuICAgICAgICAgICAgZmlyc3QsXG4gICAgICAgICAgICBfbGVuLFxuICAgICAgICAgICAgYXJncyxcbiAgICAgICAgICAgIF9rZXksXG4gICAgICAgICAgICBfYXJnczMgPSBhcmd1bWVudHM7XG5cbiAgICAgICAgcmV0dXJuIF9yZWdlbmVyYXRvclJ1bnRpbWUud3JhcChmdW5jdGlvbiBfY2FsbGVlMyQoX2NvbnRleHQzKSB7XG4gICAgICAgICAgd2hpbGUgKDEpIHtcbiAgICAgICAgICAgIHN3aXRjaCAoX2NvbnRleHQzLnByZXYgPSBfY29udGV4dDMubmV4dCkge1xuICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgaXRlcmF0b3IgPSBhc3luY0Vuc3VyZUl0ZXJhYmxlKGl0ZXJhYmxlKVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKTtcbiAgICAgICAgICAgICAgICBfY29udGV4dDMubmV4dCA9IDM7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGl0ZXJhdG9yLm5leHQoKTtcblxuICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgZmlyc3QgPSBfY29udGV4dDMuc2VudDtcblxuICAgICAgICAgICAgICAgIGZvciAoX2xlbiA9IF9hcmdzMy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiA+IDEgPyBfbGVuIC0gMSA6IDApLCBfa2V5ID0gMTsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgICAgICAgICAgICAgYXJnc1tfa2V5IC0gMV0gPSBfYXJnczNbX2tleV07XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0My5hYnJ1cHQoXCJyZXR1cm5cIiwgX2NvbnN0cnVjdCh0aGlzLCBbaXRlcmF0b3IsIGZpcnN0XS5jb25jYXQoYXJncykpKTtcblxuICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgIGNhc2UgXCJlbmRcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQzLnN0b3AoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sIF9jYWxsZWUzLCB0aGlzKTtcbiAgICAgIH0pKTtcblxuICAgICAgZnVuY3Rpb24gZnJvbShfeCkge1xuICAgICAgICByZXR1cm4gX2Zyb20uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZyb207XG4gICAgfSgpXG4gIH1dKTtcblxuICBmdW5jdGlvbiBBc3luY1BlZWtlcmF0b3IoaXRlcmF0b3IsIGZpcnN0KSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEFzeW5jUGVla2VyYXRvcik7XG5cbiAgICB0aGlzW19dID0ge1xuICAgICAgaXRlcmF0b3I6IGl0ZXJhdG9yLFxuICAgICAgY3VycmVudDogZmlyc3QsXG4gICAgICBpbmRleDogMFxuICAgIH07XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoQXN5bmNQZWVrZXJhdG9yLCBbe1xuICAgIGtleTogXCJhZHZhbmNlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBfYWR2YW5jZSA9IF9hc3luY1RvR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yUnVudGltZS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWU0KCkge1xuICAgICAgICB2YXIgdGhpc187XG4gICAgICAgIHJldHVybiBfcmVnZW5lcmF0b3JSdW50aW1lLndyYXAoZnVuY3Rpb24gX2NhbGxlZTQkKF9jb250ZXh0NCkge1xuICAgICAgICAgIHdoaWxlICgxKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKF9jb250ZXh0NC5wcmV2ID0gX2NvbnRleHQ0Lm5leHQpIHtcbiAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgIHRoaXNfID0gdGhpc1tfXTtcblxuICAgICAgICAgICAgICAgIGlmICh0aGlzXy5jdXJyZW50LmRvbmUpIHtcbiAgICAgICAgICAgICAgICAgIF9jb250ZXh0NC5uZXh0ID0gNjtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXNfLmluZGV4Kys7XG4gICAgICAgICAgICAgICAgX2NvbnRleHQ0Lm5leHQgPSA1O1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzXy5pdGVyYXRvci5uZXh0KCk7XG5cbiAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgIHRoaXNfLmN1cnJlbnQgPSBfY29udGV4dDQuc2VudDtcblxuICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0NC5hYnJ1cHQoXCJyZXR1cm5cIiwgdGhpcyk7XG5cbiAgICAgICAgICAgICAgY2FzZSA3OlxuICAgICAgICAgICAgICBjYXNlIFwiZW5kXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0NC5zdG9wKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9LCBfY2FsbGVlNCwgdGhpcyk7XG4gICAgICB9KSk7XG5cbiAgICAgIGZ1bmN0aW9uIGFkdmFuY2UoKSB7XG4gICAgICAgIHJldHVybiBfYWR2YW5jZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gYWR2YW5jZTtcbiAgICB9KClcbiAgfSwge1xuICAgIGtleTogXCJyZXR1cm5cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIF9yZXR1cm4zID0gX2FzeW5jVG9HZW5lcmF0b3IoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3JSdW50aW1lLm1hcmsoZnVuY3Rpb24gX2NhbGxlZTUoKSB7XG4gICAgICAgIHZhciB0aGlzXztcbiAgICAgICAgcmV0dXJuIF9yZWdlbmVyYXRvclJ1bnRpbWUud3JhcChmdW5jdGlvbiBfY2FsbGVlNSQoX2NvbnRleHQ1KSB7XG4gICAgICAgICAgd2hpbGUgKDEpIHtcbiAgICAgICAgICAgIHN3aXRjaCAoX2NvbnRleHQ1LnByZXYgPSBfY29udGV4dDUubmV4dCkge1xuICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgdGhpc18gPSB0aGlzW19dO1xuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZG9uZSkge1xuICAgICAgICAgICAgICAgICAgX2NvbnRleHQ1Lm5leHQgPSA0O1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgX2NvbnRleHQ1Lm5leHQgPSA0O1xuICAgICAgICAgICAgICAgIHJldHVybiBhc3luY0NhbGxSZXR1cm4odGhpc18uaXRlcmF0b3IpO1xuXG4gICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICB0aGlzXy5jdXJyZW50ID0ge1xuICAgICAgICAgICAgICAgICAgdmFsdWU6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgIGRvbmU6IHRydWVcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDUuYWJydXB0KFwicmV0dXJuXCIsIHRoaXMpO1xuXG4gICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgY2FzZSBcImVuZFwiOlxuICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDUuc3RvcCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSwgX2NhbGxlZTUsIHRoaXMpO1xuICAgICAgfSkpO1xuXG4gICAgICBmdW5jdGlvbiBfcmV0dXJuKCkge1xuICAgICAgICByZXR1cm4gX3JldHVybjMuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIF9yZXR1cm47XG4gICAgfSgpXG4gIH0sIHtcbiAgICBrZXk6IFwiYXNJdGVyYXRvclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBhc0l0ZXJhdG9yKCkge1xuICAgICAgcmV0dXJuIG5ldyBBc3luY1BlZWtlcmF0b3JJdGVyYXRvcih0aGlzKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiY3VycmVudFwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXNbX10uY3VycmVudDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwidmFsdWVcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzW19dLmN1cnJlbnQudmFsdWU7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImRvbmVcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzW19dLmN1cnJlbnQuZG9uZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiaW5kZXhcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzW19dLmluZGV4O1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBBc3luY1BlZWtlcmF0b3I7XG59KCk7XG5cbmV4cG9ydHMuQXN5bmNQZWVrZXJhdG9yID0gQXN5bmNQZWVrZXJhdG9yOyIsInZhciBfcmVnZW5lcmF0b3JSdW50aW1lID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL3JlZ2VuZXJhdG9yXCIpO1xuXG52YXIgX3dyYXBBc3luY0dlbmVyYXRvciA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3dyYXBBc3luY0dlbmVyYXRvclwiKTtcblxudmFyIF9hd2FpdEFzeW5jR2VuZXJhdG9yID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvYXdhaXRBc3luY0dlbmVyYXRvclwiKTtcblxudmFyIF9hc3luY0l0ZXJhdG9yID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvYXN5bmNJdGVyYXRvclwiKTtcblxudmFyIF9hc3luY0dlbmVyYXRvckRlbGVnYXRlID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvYXN5bmNHZW5lcmF0b3JEZWxlZ2F0ZVwiKTtcblxuZnVuY3Rpb24gYXN5bmNXcmFwKF94KSB7XG4gIHJldHVybiBfYXN5bmNXcmFwLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5cbmV4cG9ydHMuYXN5bmNXcmFwID0gYXN5bmNXcmFwO1xuXG5mdW5jdGlvbiBfYXN5bmNXcmFwKCkge1xuICBfYXN5bmNXcmFwID0gX3dyYXBBc3luY0dlbmVyYXRvciggLyojX19QVVJFX18qL19yZWdlbmVyYXRvclJ1bnRpbWUubWFyayhmdW5jdGlvbiBfY2FsbGVlKHNvdXJjZSkge1xuICAgIHJldHVybiBfcmVnZW5lcmF0b3JSdW50aW1lLndyYXAoZnVuY3Rpb24gX2NhbGxlZSQoX2NvbnRleHQpIHtcbiAgICAgIHdoaWxlICgxKSB7XG4gICAgICAgIHN3aXRjaCAoX2NvbnRleHQucHJldiA9IF9jb250ZXh0Lm5leHQpIHtcbiAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuZGVsZWdhdGVZaWVsZChfYXN5bmNHZW5lcmF0b3JEZWxlZ2F0ZShfYXN5bmNJdGVyYXRvcihzb3VyY2UpLCBfYXdhaXRBc3luY0dlbmVyYXRvciksIFwidDBcIiwgMSk7XG5cbiAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgY2FzZSBcImVuZFwiOlxuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LnN0b3AoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sIF9jYWxsZWUpO1xuICB9KSk7XG4gIHJldHVybiBfYXN5bmNXcmFwLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5cbmZ1bmN0aW9uIGFzeW5jTnVsbGFibGVXcmFwKF94Mikge1xuICByZXR1cm4gX2FzeW5jTnVsbGFibGVXcmFwLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5cbmV4cG9ydHMuYXN5bmNOdWxsYWJsZVdyYXAgPSBhc3luY051bGxhYmxlV3JhcDtcblxuZnVuY3Rpb24gX2FzeW5jTnVsbGFibGVXcmFwKCkge1xuICBfYXN5bmNOdWxsYWJsZVdyYXAgPSBfd3JhcEFzeW5jR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yUnVudGltZS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUyKHNvdXJjZSkge1xuICAgIHJldHVybiBfcmVnZW5lcmF0b3JSdW50aW1lLndyYXAoZnVuY3Rpb24gX2NhbGxlZTIkKF9jb250ZXh0Mikge1xuICAgICAgd2hpbGUgKDEpIHtcbiAgICAgICAgc3dpdGNoIChfY29udGV4dDIucHJldiA9IF9jb250ZXh0Mi5uZXh0KSB7XG4gICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgaWYgKCEoc291cmNlICE9IG51bGwpKSB7XG4gICAgICAgICAgICAgIF9jb250ZXh0Mi5uZXh0ID0gMjtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dDIuZGVsZWdhdGVZaWVsZChfYXN5bmNHZW5lcmF0b3JEZWxlZ2F0ZShfYXN5bmNJdGVyYXRvcihzb3VyY2UpLCBfYXdhaXRBc3luY0dlbmVyYXRvciksIFwidDBcIiwgMik7XG5cbiAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgY2FzZSBcImVuZFwiOlxuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0Mi5zdG9wKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCBfY2FsbGVlMik7XG4gIH0pKTtcbiAgcmV0dXJuIF9hc3luY051bGxhYmxlV3JhcC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufSIsInZhciBfcmVnZW5lcmF0b3JSdW50aW1lID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL3JlZ2VuZXJhdG9yXCIpO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY2xhc3NDYWxsQ2hlY2tcIik7XG5cbnZhciBfY3JlYXRlQ2xhc3MgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jcmVhdGVDbGFzc1wiKTtcblxudmFyIF9pbmhlcml0cyA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2luaGVyaXRzXCIpO1xuXG52YXIgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4gPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuXCIpO1xuXG52YXIgX2dldFByb3RvdHlwZU9mID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZ2V0UHJvdG90eXBlT2ZcIik7XG5cbmZ1bmN0aW9uIF9jcmVhdGVTdXBlcihEZXJpdmVkKSB7IHZhciBoYXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0ID0gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpOyByZXR1cm4gZnVuY3Rpb24gX2NyZWF0ZVN1cGVySW50ZXJuYWwoKSB7IHZhciBTdXBlciA9IF9nZXRQcm90b3R5cGVPZihEZXJpdmVkKSwgcmVzdWx0OyBpZiAoaGFzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCkgeyB2YXIgTmV3VGFyZ2V0ID0gX2dldFByb3RvdHlwZU9mKHRoaXMpLmNvbnN0cnVjdG9yOyByZXN1bHQgPSBSZWZsZWN0LmNvbnN0cnVjdChTdXBlciwgYXJndW1lbnRzLCBOZXdUYXJnZXQpOyB9IGVsc2UgeyByZXN1bHQgPSBTdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9IHJldHVybiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCByZXN1bHQpOyB9OyB9XG5cbmZ1bmN0aW9uIF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKSB7IGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJ1bmRlZmluZWRcIiB8fCAhUmVmbGVjdC5jb25zdHJ1Y3QpIHJldHVybiBmYWxzZTsgaWYgKFJlZmxlY3QuY29uc3RydWN0LnNoYW0pIHJldHVybiBmYWxzZTsgaWYgKHR5cGVvZiBQcm94eSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gdHJ1ZTsgdHJ5IHsgRGF0ZS5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChEYXRlLCBbXSwgZnVuY3Rpb24gKCkge30pKTsgcmV0dXJuIHRydWU7IH0gY2F0Y2ggKGUpIHsgcmV0dXJuIGZhbHNlOyB9IH1cblxudmFyIF9yZXF1aXJlID0gcmVxdWlyZSgnLi9pdGVyYWJsZS1pdGVyYXRvci5qcycpLFxuICAgIEl0ZXJhYmxlSXRlcmF0b3IgPSBfcmVxdWlyZS5JdGVyYWJsZUl0ZXJhdG9yO1xuXG52YXIgX3JlcXVpcmUyID0gcmVxdWlyZSgnLi9wYXJ0cy1pdGVyYXRvci5qcycpLFxuICAgIFBhcnRzSXRlcmF0b3IgPSBfcmVxdWlyZTIuUGFydHNJdGVyYXRvcjtcblxudmFyIEJpc2VjdG9yID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfSXRlcmFibGVJdGVyYXRvcikge1xuICBfaW5oZXJpdHMoQmlzZWN0b3IsIF9JdGVyYWJsZUl0ZXJhdG9yKTtcblxuICB2YXIgX3N1cGVyID0gX2NyZWF0ZVN1cGVyKEJpc2VjdG9yKTtcblxuICBmdW5jdGlvbiBCaXNlY3Rvcihzb3VyY2UsIHN0cmF0ZWd5LCBvcHRpb25zKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEJpc2VjdG9yKTtcblxuICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcyk7XG4gICAgX3RoaXMuc291cmNlID0gc291cmNlO1xuICAgIF90aGlzLnN0cmF0ZWd5ID0gc3RyYXRlZ3k7XG4gICAgX3RoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgX3RoaXMucGFydHNJdGVyYXRvciA9IG51bGw7XG4gICAgX3RoaXMuZmlyc3RQYXJ0ID0gbnVsbDtcbiAgICBfdGhpcy5zZWNvbmRQYXJ0ID0gbnVsbDtcbiAgICBfdGhpcy5jdXJyZW50SWR4ID0gMDtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoQmlzZWN0b3IsIFt7XG4gICAga2V5OiBcInNldHVwRmlyc3RcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0dXBGaXJzdCgpIHtcbiAgICAgIHZhciBzb3VyY2UgPSB0aGlzLnNvdXJjZSxcbiAgICAgICAgICBzdHJhdGVneSA9IHRoaXMuc3RyYXRlZ3ksXG4gICAgICAgICAgb3B0aW9ucyA9IHRoaXMub3B0aW9ucztcbiAgICAgIHRoaXMucGFydHNJdGVyYXRvciA9IHRoaXMucGFydHNJdGVyYXRvciB8fCBuZXcgUGFydHNJdGVyYXRvcihzb3VyY2UsIHN0cmF0ZWd5LCBvcHRpb25zKTtcblxuICAgICAgaWYgKCF0aGlzLmZpcnN0UGFydCkge1xuICAgICAgICB2YXIgc3RlcCA9IHRoaXMucGFydHNJdGVyYXRvci5uZXh0KCk7XG4gICAgICAgIHRoaXMuZmlyc3RQYXJ0ID0gc3RlcC5kb25lID8gW10gOiBzdGVwLnZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJuZXh0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG5leHQoKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICAgIHN3aXRjaCAodGhpcy5jdXJyZW50SWR4KyspIHtcbiAgICAgICAgY2FzZSAwOlxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB2YWx1ZTogLyojX19QVVJFX18qL19yZWdlbmVyYXRvclJ1bnRpbWUubWFyayhmdW5jdGlvbiBfY2FsbGVlKCkge1xuICAgICAgICAgICAgICByZXR1cm4gX3JlZ2VuZXJhdG9yUnVudGltZS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUkKF9jb250ZXh0KSB7XG4gICAgICAgICAgICAgICAgd2hpbGUgKDEpIHtcbiAgICAgICAgICAgICAgICAgIHN3aXRjaCAoX2NvbnRleHQucHJldiA9IF9jb250ZXh0Lm5leHQpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2V0dXBGaXJzdCgpO1xuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5kZWxlZ2F0ZVlpZWxkKHNlbGYuZmlyc3RQYXJ0LCBcInQwXCIsIDIpO1xuXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcImVuZFwiOlxuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5zdG9wKCk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9LCBfY2FsbGVlKTtcbiAgICAgICAgICAgIH0pKCksXG4gICAgICAgICAgICBkb25lOiBmYWxzZVxuICAgICAgICAgIH07XG5cbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB2YWx1ZTogLyojX19QVVJFX18qL19yZWdlbmVyYXRvclJ1bnRpbWUubWFyayhmdW5jdGlvbiBfY2FsbGVlMigpIHtcbiAgICAgICAgICAgICAgdmFyIHN0ZXA7XG4gICAgICAgICAgICAgIHJldHVybiBfcmVnZW5lcmF0b3JSdW50aW1lLndyYXAoZnVuY3Rpb24gX2NhbGxlZTIkKF9jb250ZXh0Mikge1xuICAgICAgICAgICAgICAgIHdoaWxlICgxKSB7XG4gICAgICAgICAgICAgICAgICBzd2l0Y2ggKF9jb250ZXh0Mi5wcmV2ID0gX2NvbnRleHQyLm5leHQpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2V0dXBGaXJzdCgpO1xuICAgICAgICAgICAgICAgICAgICAgIHN0ZXAgPSBzZWxmLnBhcnRzSXRlcmF0b3IubmV4dCgpO1xuICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2Vjb25kUGFydCA9IHN0ZXAuZG9uZSA/IFtdIDogc3RlcC52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQyLmRlbGVnYXRlWWllbGQoc2VsZi5zZWNvbmRQYXJ0LCBcInQwXCIsIDQpO1xuXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcImVuZFwiOlxuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDIuc3RvcCgpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSwgX2NhbGxlZTIpO1xuICAgICAgICAgICAgfSkoKSxcbiAgICAgICAgICAgIGRvbmU6IGZhbHNlXG4gICAgICAgICAgfTtcblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB2YWx1ZTogdW5kZWZpbmVkLFxuICAgICAgICAgICAgZG9uZTogdHJ1ZVxuICAgICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJldHVyblwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfcmV0dXJuKCkge1xuICAgICAgaWYgKHRoaXMuY3VycmVudElkeCA9PT0gMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1lvdSBtdXN0IHRha2UgYm90aCBwYXJ0cyBvZiBhIGJpc2VjdG9yIG9yIG5laXRoZXIuJyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHZhbHVlOiB1bmRlZmluZWQsXG4gICAgICAgIGRvbmU6IHRydWVcbiAgICAgIH07XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIEJpc2VjdG9yO1xufShJdGVyYWJsZUl0ZXJhdG9yKTtcblxuZXhwb3J0cy5CaXNlY3RvciA9IEJpc2VjdG9yOyIsInZhciBfcmVnZW5lcmF0b3JSdW50aW1lID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL3JlZ2VuZXJhdG9yXCIpO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY2xhc3NDYWxsQ2hlY2tcIik7XG5cbnZhciBfY3JlYXRlQ2xhc3MgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jcmVhdGVDbGFzc1wiKTtcblxudmFyIF9zb3VyY2VCdWZmZXIgPSBTeW1ib2woJ3NvdXJjZUJ1ZmZlcicpO1xuXG52YXIgUmVhZE9ubHlDaXJjdWxhckJ1ZmZlciA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIFJlYWRPbmx5Q2lyY3VsYXJCdWZmZXIoc291cmNlQnVmZmVyKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFJlYWRPbmx5Q2lyY3VsYXJCdWZmZXIpO1xuXG4gICAgdGhpc1tfc291cmNlQnVmZmVyXSA9IHNvdXJjZUJ1ZmZlcjtcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhSZWFkT25seUNpcmN1bGFyQnVmZmVyLCBbe1xuICAgIGtleTogXCJnZXRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0KGlkeCkge1xuICAgICAgcmV0dXJuIHRoaXNbX3NvdXJjZUJ1ZmZlcl0uZ2V0KGlkeCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInBlZWtcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcGVlaygpIHtcbiAgICAgIHJldHVybiB0aGlzW19zb3VyY2VCdWZmZXJdLnBlZWsoKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiaXNGdWxsXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGlzRnVsbCgpIHtcbiAgICAgIHJldHVybiB0aGlzW19zb3VyY2VCdWZmZXJdLmlzRnVsbCgpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogU3ltYm9sLml0ZXJhdG9yLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB2YWx1ZSgpIHtcbiAgICAgIHJldHVybiB0aGlzW19zb3VyY2VCdWZmZXJdW1N5bWJvbC5pdGVyYXRvcl0oKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwic2l6ZVwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXNbX3NvdXJjZUJ1ZmZlcl0uc2l6ZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiY2FwYWNpdHlcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzW19zb3VyY2VCdWZmZXJdLmNhcGFjaXR5O1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBSZWFkT25seUNpcmN1bGFyQnVmZmVyO1xufSgpO1xuXG5leHBvcnRzLlJlYWRPbmx5Q2lyY3VsYXJCdWZmZXIgPSBSZWFkT25seUNpcmN1bGFyQnVmZmVyO1xuXG52YXIgQ2lyY3VsYXJCdWZmZXIgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBDaXJjdWxhckJ1ZmZlcihzaXplKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIENpcmN1bGFyQnVmZmVyKTtcblxuICAgIHRoaXMuX2FycmF5ID0gbmV3IEFycmF5KHNpemUpO1xuICAgIHRoaXMuX2hlYWQgPSBzaXplIC0gMTtcbiAgICB0aGlzLnNpemUgPSAwO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKENpcmN1bGFyQnVmZmVyLCBbe1xuICAgIGtleTogXCJwdXNoXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHB1c2godmFsdWUpIHtcbiAgICAgIHZhciBhcnJheSA9IHRoaXMuX2FycmF5O1xuICAgICAgdmFyIGhlYWQgPSB0aGlzLl9oZWFkID0gKHRoaXMuX2hlYWQgKyAxKSAlIGFycmF5Lmxlbmd0aDtcbiAgICAgIHZhciBkaXNwbGFjZWRWYWx1ZSA9IGFycmF5W2hlYWRdO1xuICAgICAgYXJyYXlbaGVhZF0gPSB2YWx1ZTtcblxuICAgICAgaWYgKHRoaXMuaXNGdWxsKCkpIHtcbiAgICAgICAgcmV0dXJuIGRpc3BsYWNlZFZhbHVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zaXplKys7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInNoaWZ0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNoaWZ0KCkge1xuICAgICAgaWYgKCF0aGlzLnNpemUpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB2YXIgdmFsdWUgPSB0aGlzLmdldCgwKTtcbiAgICAgIHRoaXMuc2l6ZS0tO1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJwZWVrXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHBlZWsoKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXQoMCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImZpbGxcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZmlsbChmaWxsZXIpIHtcbiAgICAgIHRoaXMuX2FycmF5LmZpbGwoZmlsbGVyKTtcblxuICAgICAgdGhpcy5zaXplID0gdGhpcy5fYXJyYXkubGVuZ3RoO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0KGlkeCkge1xuICAgICAgaWYgKGlkeCA+PSB0aGlzLnNpemUpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB2YXIgYXJyYXkgPSB0aGlzLl9hcnJheTtcbiAgICAgIHZhciBoZWFkID0gdGhpcy5faGVhZDtcbiAgICAgIHZhciBpbmRleCA9IChhcnJheS5sZW5ndGggKyBoZWFkIC0gdGhpcy5zaXplICsgMSArIGlkeCkgJSBhcnJheS5sZW5ndGg7XG4gICAgICByZXR1cm4gYXJyYXlbaW5kZXhdO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJpc0Z1bGxcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gaXNGdWxsKCkge1xuICAgICAgcmV0dXJuIHRoaXMuc2l6ZSA9PT0gdGhpcy5fYXJyYXkubGVuZ3RoO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogU3ltYm9sLml0ZXJhdG9yLFxuICAgIHZhbHVlOiAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yUnVudGltZS5tYXJrKGZ1bmN0aW9uIHZhbHVlKCkge1xuICAgICAgdmFyIGk7XG4gICAgICByZXR1cm4gX3JlZ2VuZXJhdG9yUnVudGltZS53cmFwKGZ1bmN0aW9uIHZhbHVlJChfY29udGV4dCkge1xuICAgICAgICB3aGlsZSAoMSkge1xuICAgICAgICAgIHN3aXRjaCAoX2NvbnRleHQucHJldiA9IF9jb250ZXh0Lm5leHQpIHtcbiAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgaSA9IDA7XG5cbiAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgaWYgKCEoaSA8IHRoaXMuc2l6ZSkpIHtcbiAgICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gNztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSA0O1xuICAgICAgICAgICAgICByZXR1cm4gdGhpcy5nZXQoaSk7XG5cbiAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMTtcbiAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgNzpcbiAgICAgICAgICAgIGNhc2UgXCJlbmRcIjpcbiAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LnN0b3AoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sIHZhbHVlLCB0aGlzKTtcbiAgICB9KVxuICB9LCB7XG4gICAga2V5OiBcImNhcGFjaXR5XCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fYXJyYXkubGVuZ3RoO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBDaXJjdWxhckJ1ZmZlcjtcbn0oKTtcblxuZXhwb3J0cy5DaXJjdWxhckJ1ZmZlciA9IENpcmN1bGFyQnVmZmVyOyIsImZ1bmN0aW9uIGRlZmF1bHRDb21wYXJlT3JkZXIoYSwgYikge1xuICBpZiAoYSA+IGIpIHtcbiAgICByZXR1cm4gMTtcbiAgfSBlbHNlIGlmIChhIDwgYikge1xuICAgIHJldHVybiAtMTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gMDtcbiAgfVxufVxuXG5leHBvcnRzLmRlZmF1bHRDb21wYXJlT3JkZXIgPSBkZWZhdWx0Q29tcGFyZU9yZGVyOyIsInZhciBfdG9Db25zdW1hYmxlQXJyYXkgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy90b0NvbnN1bWFibGVBcnJheVwiKTtcblxuZnVuY3Rpb24gY3VycnkoZm4pIHtcbiAgdmFyIGV4cGVjdGVkQXJnc0xlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogZm4ubGVuZ3RoO1xuICB2YXIgYXBwbGllZEFyZ3MgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IFtdO1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgYXJnc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICB9XG5cbiAgICBpZiAoZXhwZWN0ZWRBcmdzTGVuZ3RoIDw9IGFyZ3MubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gZm4uYXBwbHkodm9pZCAwLCBfdG9Db25zdW1hYmxlQXJyYXkoYXBwbGllZEFyZ3MpLmNvbmNhdChhcmdzKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGN1cnJ5KGZuLCBleHBlY3RlZEFyZ3NMZW5ndGggLSBhcmdzLmxlbmd0aCwgW10uY29uY2F0KF90b0NvbnN1bWFibGVBcnJheShhcHBsaWVkQXJncyksIGFyZ3MpKTtcbiAgfTtcbn1cblxuZXhwb3J0cy5jdXJyeSA9IGN1cnJ5O1xuXG5mdW5jdGlvbiB2YXJpYWRpY0N1cnJ5V2l0aFZhbGlkYXRpb25Jbm5lcihjb25maWcsIGFyZ3MpIHtcbiAgdmFyIGZuID0gY29uZmlnLmZuLFxuICAgICAgdmFsaWRhdGVBcmdzID0gY29uZmlnLnZhbGlkYXRlQXJncyxcbiAgICAgIHZhcmlhZGljID0gY29uZmlnLnZhcmlhZGljLFxuICAgICAgcmVkdWNlcyA9IGNvbmZpZy5yZWR1Y2VzLFxuICAgICAgZ3Jvd1JpZ2h0ID0gY29uZmlnLmdyb3dSaWdodCxcbiAgICAgIG1pbkFyZ3MgPSBjb25maWcubWluQXJncyxcbiAgICAgIG1heEFyZ3MgPSBjb25maWcubWF4QXJncyxcbiAgICAgIGlzSXRlcmFibGUgPSBjb25maWcuaXNJdGVyYWJsZSxcbiAgICAgIGl0ZXJhYmxlVHlwZSA9IGNvbmZpZy5pdGVyYWJsZVR5cGUsXG4gICAgICBhcHBseU9uSXRlcmFibGVBcmdzID0gY29uZmlnLmFwcGx5T25JdGVyYWJsZUFyZ3MsXG4gICAgICBJdGVyYWJsZUNsYXNzID0gY29uZmlnLkl0ZXJhYmxlQ2xhc3M7XG5cbiAgaWYgKGFyZ3MubGVuZ3RoID4gbWluQXJncykge1xuICAgIHZhciBhcmdzSXRlcmFibGUgPSB0cnVlO1xuICAgIHZhciBpdGVyYWJsZUFyZ3NTdGFydCA9IHZhcmlhZGljID8gYXJncy5maW5kSW5kZXgoZnVuY3Rpb24gKGFyZywgaSkge1xuICAgICAgcmV0dXJuIGlzSXRlcmFibGUoYXJnKSAmJiBpID49IG1pbkFyZ3M7XG4gICAgfSkgOiBNYXRoLm1pbihtYXhBcmdzLCBhcmdzLmxlbmd0aCAtIDEpO1xuICAgIHZhciBpdGVyYWJsZUFyZ3NFbmQgPSB2YXJpYWRpYyA/IGFyZ3MubGVuZ3RoIDogaXRlcmFibGVBcmdzU3RhcnQgKyAxO1xuXG4gICAgaWYgKHZhcmlhZGljKSB7XG4gICAgICBmb3IgKHZhciBpID0gaXRlcmFibGVBcmdzU3RhcnQ7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGFyZ3NJdGVyYWJsZSA9IGFyZ3NJdGVyYWJsZSAmJiBpc0l0ZXJhYmxlKGFyZ3NbaV0pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBhcmdzSXRlcmFibGUgPSBpc0l0ZXJhYmxlKGFyZ3NbaXRlcmFibGVBcmdzU3RhcnRdKTtcbiAgICB9XG5cbiAgICBpZiAoYXJncy5sZW5ndGggPiBtYXhBcmdzICYmIChpdGVyYWJsZUFyZ3NTdGFydCA9PT0gLTEgfHwgIWFyZ3NJdGVyYWJsZSkpIHtcbiAgICAgIHZhciBpdGVyYWJsZVR5cGVPck5hbWVzID0gdmFyaWFkaWMgPyBcIi4uLlwiLmNvbmNhdChpdGVyYWJsZVR5cGUsIFwic1wiKSA6IGl0ZXJhYmxlVHlwZTtcbiAgICAgIHZhciBiYXNlTWVzc2FnZSA9IFwiXCIuY29uY2F0KGZuLm5hbWUsIFwiIHRha2VzIHVwIHRvIFwiKS5jb25jYXQobWF4QXJncywgXCIgYXJndW1lbnRzLCBmb2xsb3dlZCBieSBcIikuY29uY2F0KGl0ZXJhYmxlVHlwZU9yTmFtZXMsIFwiLiBcIikgKyBcIllvdSBhbHJlYWR5IHBhc3NlZCBcIi5jb25jYXQoYXJncy5sZW5ndGgsIFwiIGFyZ3VtZW50c1wiKTtcblxuICAgICAgaWYgKHZhcmlhZGljKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlwiLmNvbmNhdChiYXNlTWVzc2FnZSwgXCIgYW5kIHRoZSBmb2xsb3dpbmcgYXJndW1lbnRzIHdlcmUgbm90IGFsbCBcIikuY29uY2F0KGl0ZXJhYmxlVHlwZSwgXCJzXCIpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlwiLmNvbmNhdChiYXNlTWVzc2FnZSwgXCIgYW5kIHRoZSBsYXN0IGFyZ3VtZW50IHdhcyBub3QgXCIpLmNvbmNhdChpdGVyYWJsZVR5cGUpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoaXRlcmFibGVBcmdzU3RhcnQgPj0gMCAmJiBhcmdzSXRlcmFibGUpIHtcbiAgICAgIGZvciAodmFyIF9pID0gaXRlcmFibGVBcmdzU3RhcnQ7IF9pIDwgaXRlcmFibGVBcmdzRW5kOyBfaSsrKSB7XG4gICAgICAgIGFyZ3NbX2ldID0gYXBwbHlPbkl0ZXJhYmxlQXJncyhhcmdzW19pXSk7XG4gICAgICB9XG5cbiAgICAgIHZhciBpdGVyYWJsZXNBcmcgPSB2YXJpYWRpYyA/IGFyZ3Muc2xpY2UoaXRlcmFibGVBcmdzU3RhcnQpIDogYXJnc1tpdGVyYWJsZUFyZ3NTdGFydF07XG4gICAgICBhcmdzLnNwbGljZShpdGVyYWJsZUFyZ3NTdGFydCk7XG5cbiAgICAgIGlmICghZ3Jvd1JpZ2h0KSB7XG4gICAgICAgIGFyZ3MucmV2ZXJzZSgpO1xuICAgICAgfVxuXG4gICAgICBhcmdzLnVuc2hpZnQoaXRlcmFibGVzQXJnKTtcbiAgICAgIHZhbGlkYXRlQXJncyhhcmdzKTtcbiAgICAgIHJldHVybiByZWR1Y2VzID8gZm4uYXBwbHkodm9pZCAwLCBfdG9Db25zdW1hYmxlQXJyYXkoYXJncykpIDogbmV3IEl0ZXJhYmxlQ2xhc3MoZm4sIGFyZ3MpO1xuICAgIH0gZWxzZSB7fVxuICB9XG5cbiAgcmV0dXJuIHZhcmlhZGljQ3VycnlXaXRoVmFsaWRhdGlvbihjb25maWcsIGFyZ3MpO1xufVxuXG5mdW5jdGlvbiB2YXJpYWRpY0N1cnJ5V2l0aFZhbGlkYXRpb24oY29uZmlnKSB7XG4gIHZhciBwcmV2aW91c0FyZ3MgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IFtdO1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIGZvciAodmFyIF9sZW4yID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuMiksIF9rZXkyID0gMDsgX2tleTIgPCBfbGVuMjsgX2tleTIrKykge1xuICAgICAgYXJnc1tfa2V5Ml0gPSBhcmd1bWVudHNbX2tleTJdO1xuICAgIH1cblxuICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgbWFrZSBhIHBhcnRpYWwgYXBwbGljYXRpb24gd2l0aCBubyBhcmd1bWVudHMnKTtcbiAgICB9XG5cbiAgICBhcmdzLnVuc2hpZnQuYXBwbHkoYXJncywgX3RvQ29uc3VtYWJsZUFycmF5KHByZXZpb3VzQXJncykpO1xuICAgIHJldHVybiB2YXJpYWRpY0N1cnJ5V2l0aFZhbGlkYXRpb25Jbm5lcihjb25maWcsIGFyZ3MpO1xuICB9O1xufVxuXG5leHBvcnRzLnZhcmlhZGljQ3VycnlXaXRoVmFsaWRhdGlvbiA9IHZhcmlhZGljQ3VycnlXaXRoVmFsaWRhdGlvbjsiLCJmdW5jdGlvbiBkZWxheShtcywgb3V0cHV0KSB7XG4gIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKG91dHB1dCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIHJlamVjdChvdXRwdXQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzb2x2ZShvdXRwdXQpO1xuICAgICAgfVxuICAgIH0sIG1zKTtcbiAgfSk7XG59XG5cbmV4cG9ydHMuZGVsYXkgPSBkZWxheTsiLCJ2YXIgX2NyZWF0ZUNsYXNzID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY3JlYXRlQ2xhc3NcIik7XG5cbnZhciBfaW5oZXJpdHMgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbmhlcml0c1wiKTtcblxudmFyIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvcG9zc2libGVDb25zdHJ1Y3RvclJldHVyblwiKTtcblxudmFyIF9nZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2dldFByb3RvdHlwZU9mXCIpO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY2xhc3NDYWxsQ2hlY2tcIik7XG5cbmZ1bmN0aW9uIF9jcmVhdGVTdXBlcihEZXJpdmVkKSB7IHZhciBoYXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0ID0gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpOyByZXR1cm4gZnVuY3Rpb24gX2NyZWF0ZVN1cGVySW50ZXJuYWwoKSB7IHZhciBTdXBlciA9IF9nZXRQcm90b3R5cGVPZihEZXJpdmVkKSwgcmVzdWx0OyBpZiAoaGFzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCkgeyB2YXIgTmV3VGFyZ2V0ID0gX2dldFByb3RvdHlwZU9mKHRoaXMpLmNvbnN0cnVjdG9yOyByZXN1bHQgPSBSZWZsZWN0LmNvbnN0cnVjdChTdXBlciwgYXJndW1lbnRzLCBOZXdUYXJnZXQpOyB9IGVsc2UgeyByZXN1bHQgPSBTdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9IHJldHVybiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCByZXN1bHQpOyB9OyB9XG5cbmZ1bmN0aW9uIF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKSB7IGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJ1bmRlZmluZWRcIiB8fCAhUmVmbGVjdC5jb25zdHJ1Y3QpIHJldHVybiBmYWxzZTsgaWYgKFJlZmxlY3QuY29uc3RydWN0LnNoYW0pIHJldHVybiBmYWxzZTsgaWYgKHR5cGVvZiBQcm94eSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gdHJ1ZTsgdHJ5IHsgRGF0ZS5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChEYXRlLCBbXSwgZnVuY3Rpb24gKCkge30pKTsgcmV0dXJuIHRydWU7IH0gY2F0Y2ggKGUpIHsgcmV0dXJuIGZhbHNlOyB9IH1cblxudmFyIF9yZXF1aXJlID0gcmVxdWlyZSgnLi9pdGVyYWJsZS1pdGVyYXRvci5qcycpLFxuICAgIEl0ZXJhYmxlSXRlcmF0b3IgPSBfcmVxdWlyZS5JdGVyYWJsZUl0ZXJhdG9yO1xuXG52YXIgX3JlcXVpcmUyID0gcmVxdWlyZSgnLi9pdGVyYWJsZS5qcycpLFxuICAgIGNhbGxSZXR1cm4gPSBfcmVxdWlyZTIuY2FsbFJldHVybjtcblxudmFyIFF1ZXVlSXRlbSA9IGZ1bmN0aW9uIFF1ZXVlSXRlbShzdGVwKSB7XG4gIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBRdWV1ZUl0ZW0pO1xuXG4gIHRoaXMuc3RlcCA9IHN0ZXA7XG4gIHRoaXMubmV4dCA9IG51bGw7XG59O1xuXG52YXIgRm9yayA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX0l0ZXJhYmxlSXRlcmF0b3IpIHtcbiAgX2luaGVyaXRzKEZvcmssIF9JdGVyYWJsZUl0ZXJhdG9yKTtcblxuICB2YXIgX3N1cGVyID0gX2NyZWF0ZVN1cGVyKEZvcmspO1xuXG4gIGZ1bmN0aW9uIEZvcmsoaGVhZCwgZXhjaGFuZ2UpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgRm9yayk7XG5cbiAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMpO1xuICAgIF90aGlzLmhlYWQgPSBoZWFkO1xuICAgIF90aGlzLmRvbmUgPSBmYWxzZTtcbiAgICBfdGhpcy5leGNoYW5nZSA9IGV4Y2hhbmdlO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhGb3JrLCBbe1xuICAgIGtleTogXCJuZXh0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG5leHQoKSB7XG4gICAgICB2YXIgZG9uZSA9IHRoaXMuZG9uZSxcbiAgICAgICAgICBleGNoYW5nZSA9IHRoaXMuZXhjaGFuZ2U7XG5cbiAgICAgIGlmIChkb25lKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdmFsdWU6IHVuZGVmaW5lZCxcbiAgICAgICAgICBkb25lOiBkb25lXG4gICAgICAgIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgaGVhZCA9IHRoaXMuaGVhZDtcbiAgICAgICAgaWYgKCFoZWFkLm5leHQpIGV4Y2hhbmdlLmZldGNoKCk7XG4gICAgICAgIGhlYWQgPSBoZWFkLm5leHQ7XG4gICAgICAgIHZhciBfaGVhZCA9IGhlYWQsXG4gICAgICAgICAgICBzdGVwID0gX2hlYWQuc3RlcDtcbiAgICAgICAgdGhpcy5kb25lID0gc3RlcC5kb25lO1xuICAgICAgICB0aGlzLmhlYWQgPSBoZWFkO1xuICAgICAgICByZXR1cm4gc3RlcDtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmV0dXJuXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9yZXR1cm4oKSB7XG4gICAgICB2YXIgZG9uZSA9IHRoaXMuZG9uZSxcbiAgICAgICAgICBleGNoYW5nZSA9IHRoaXMuZXhjaGFuZ2U7XG4gICAgICBpZiAoIWRvbmUpIGV4Y2hhbmdlW1wicmV0dXJuXCJdKCk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB2YWx1ZTogdW5kZWZpbmVkLFxuICAgICAgICBkb25lOiB0cnVlXG4gICAgICB9O1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBGb3JrO1xufShJdGVyYWJsZUl0ZXJhdG9yKTtcblxudmFyIEV4Y2hhbmdlID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gRXhjaGFuZ2UoaXRlcmF0b3IpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgRXhjaGFuZ2UpO1xuXG4gICAgdGhpcy5pdGVyYXRvciA9IGl0ZXJhdG9yO1xuICAgIHRoaXMudGFpbCA9IG5ldyBRdWV1ZUl0ZW0obnVsbCk7XG4gICAgdGhpcy5oZWFkID0gdGhpcy50YWlsO1xuICAgIHRoaXMuZm9ya3MgPSAwO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKEV4Y2hhbmdlLCBbe1xuICAgIGtleTogXCJmb3JrXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGZvcmsoKSB7XG4gICAgICArK3RoaXMuZm9ya3M7XG4gICAgICByZXR1cm4gbmV3IEZvcmsodGhpcy50YWlsLCB0aGlzKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiYWR2YW5jZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBhZHZhbmNlKCkge1xuICAgICAgdGhpcy50YWlsID0gdGhpcy50YWlsLm5leHQ7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImZldGNoXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGZldGNoKCkge1xuICAgICAgdmFyIHN0ZXAgPSB0aGlzLml0ZXJhdG9yLm5leHQoKTtcbiAgICAgIHZhciBuZXdJdGVtID0gbmV3IFF1ZXVlSXRlbShzdGVwKTtcbiAgICAgIHRoaXMuaGVhZC5uZXh0ID0gdGhpcy5oZWFkID0gbmV3SXRlbTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmV0dXJuXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9yZXR1cm4oKSB7XG4gICAgICAtLXRoaXMuZm9ya3M7XG5cbiAgICAgIGlmICh0aGlzLmZvcmtzID09PSAwKSB7XG4gICAgICAgIGNhbGxSZXR1cm4odGhpcy5pdGVyYXRvcik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHZhbHVlOiB1bmRlZmluZWQsXG4gICAgICAgIGRvbmU6IHRydWVcbiAgICAgIH07XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIEV4Y2hhbmdlO1xufSgpO1xuXG5leHBvcnRzLkV4Y2hhbmdlID0gRXhjaGFuZ2U7IiwidmFyIF9jbGFzc0NhbGxDaGVjayA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrXCIpO1xuXG52YXIgX2NyZWF0ZUNsYXNzID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY3JlYXRlQ2xhc3NcIik7XG5cbnZhciBfaW5oZXJpdHMgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbmhlcml0c1wiKTtcblxudmFyIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvcG9zc2libGVDb25zdHJ1Y3RvclJldHVyblwiKTtcblxudmFyIF9nZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2dldFByb3RvdHlwZU9mXCIpO1xuXG5mdW5jdGlvbiBfY3JlYXRlU3VwZXIoRGVyaXZlZCkgeyB2YXIgaGFzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCA9IF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKTsgcmV0dXJuIGZ1bmN0aW9uIF9jcmVhdGVTdXBlckludGVybmFsKCkgeyB2YXIgU3VwZXIgPSBfZ2V0UHJvdG90eXBlT2YoRGVyaXZlZCksIHJlc3VsdDsgaWYgKGhhc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QpIHsgdmFyIE5ld1RhcmdldCA9IF9nZXRQcm90b3R5cGVPZih0aGlzKS5jb25zdHJ1Y3RvcjsgcmVzdWx0ID0gUmVmbGVjdC5jb25zdHJ1Y3QoU3VwZXIsIGFyZ3VtZW50cywgTmV3VGFyZ2V0KTsgfSBlbHNlIHsgcmVzdWx0ID0gU3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgfSByZXR1cm4gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgcmVzdWx0KTsgfTsgfVxuXG5mdW5jdGlvbiBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCkgeyBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwidW5kZWZpbmVkXCIgfHwgIVJlZmxlY3QuY29uc3RydWN0KSByZXR1cm4gZmFsc2U7IGlmIChSZWZsZWN0LmNvbnN0cnVjdC5zaGFtKSByZXR1cm4gZmFsc2U7IGlmICh0eXBlb2YgUHJveHkgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIHRydWU7IHRyeSB7IERhdGUucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoUmVmbGVjdC5jb25zdHJ1Y3QoRGF0ZSwgW10sIGZ1bmN0aW9uICgpIHt9KSk7IHJldHVybiB0cnVlOyB9IGNhdGNoIChlKSB7IHJldHVybiBmYWxzZTsgfSB9XG5cbnZhciBfcmVxdWlyZSA9IHJlcXVpcmUoJy4vcGFydHMtaXRlcmF0b3IuanMnKSxcbiAgICBQYXJ0c0l0ZXJhdG9yID0gX3JlcXVpcmUuUGFydHNJdGVyYXRvcixcbiAgICBQYXJ0SXRlcmF0b3IgPSBfcmVxdWlyZS5QYXJ0SXRlcmF0b3I7XG5cbnZhciBfcmVxdWlyZTIgPSByZXF1aXJlKCcuL3N5bWJvbHMuanMnKSxcbiAgICBzcGxpdCA9IF9yZXF1aXJlMi5zcGxpdDtcblxudmFyIEdyb3Vwc0l0ZXJhdG9yID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfUGFydHNJdGVyYXRvcikge1xuICBfaW5oZXJpdHMoR3JvdXBzSXRlcmF0b3IsIF9QYXJ0c0l0ZXJhdG9yKTtcblxuICB2YXIgX3N1cGVyID0gX2NyZWF0ZVN1cGVyKEdyb3Vwc0l0ZXJhdG9yKTtcblxuICBmdW5jdGlvbiBHcm91cHNJdGVyYXRvcigpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgR3JvdXBzSXRlcmF0b3IpO1xuXG4gICAgcmV0dXJuIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKEdyb3Vwc0l0ZXJhdG9yLCBbe1xuICAgIGtleTogXCJuZXh0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG5leHQoKSB7XG4gICAgICBpZiAoIXRoaXMuaW5pdGlhbGl6ZWQpIHRoaXMuaW5pdCgpO1xuICAgICAgdmFyIHNwbGl0ZXJhdG9yID0gdGhpcy5zcGxpdGVyYXRvcjtcblxuICAgICAgaWYgKHRoaXMuY3VycmVudFBhcnQgIT09IG51bGwpIHtcbiAgICAgICAgaWYgKHNwbGl0ZXJhdG9yLnZhbHVlICE9PSBzcGxpdCB8fCBzcGxpdGVyYXRvci5jdXJyZW50ID09PSB0aGlzLnNwbGl0U3RlcCkge1xuICAgICAgICAgIHRoaXMuY3VycmVudFBhcnQuaW5hY3RpdmUgPSB0cnVlO1xuXG4gICAgICAgICAgd2hpbGUgKCFzcGxpdGVyYXRvci5kb25lICYmIHNwbGl0ZXJhdG9yLnZhbHVlICE9PSBzcGxpdCkge1xuICAgICAgICAgICAgc3BsaXRlcmF0b3IuYWR2YW5jZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoc3BsaXRlcmF0b3IuZG9uZSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHZhbHVlOiB1bmRlZmluZWQsXG4gICAgICAgICAgZG9uZTogdHJ1ZVxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBzcGxpdGVyYXRvci5hZHZhbmNlKCk7XG5cbiAgICAgIGlmIChzcGxpdGVyYXRvci5kb25lIHx8IHNwbGl0ZXJhdG9yLnZhbHVlID09PSBzcGxpdCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuZXhwZWN0ZWQgZW1wdHkgZ3JvdXAnKTtcbiAgICAgIH1cblxuICAgICAgdmFyIGtleSA9IHNwbGl0ZXJhdG9yLnZhbHVlO1xuICAgICAgc3BsaXRlcmF0b3IuYWR2YW5jZSgpO1xuICAgICAgdGhpcy5zcGxpdFN0ZXAgPSBzcGxpdGVyYXRvci5jdXJyZW50O1xuICAgICAgdGhpcy5jdXJyZW50UGFydCA9IG5ldyBQYXJ0SXRlcmF0b3IodGhpcyk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB2YWx1ZTogW2tleSwgdGhpcy5jdXJyZW50UGFydF0sXG4gICAgICAgIGRvbmU6IGZhbHNlXG4gICAgICB9O1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBHcm91cHNJdGVyYXRvcjtcbn0oUGFydHNJdGVyYXRvcik7XG5cbmV4cG9ydHMuR3JvdXBzSXRlcmF0b3IgPSBHcm91cHNJdGVyYXRvcjsiLCJ2YXIgX2NsYXNzQ2FsbENoZWNrID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY2xhc3NDYWxsQ2hlY2tcIik7XG5cbnZhciBfY3JlYXRlQ2xhc3MgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jcmVhdGVDbGFzc1wiKTtcblxudmFyIEl0ZXJhYmxlSXRlcmF0b3IgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBJdGVyYWJsZUl0ZXJhdG9yKCkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBJdGVyYWJsZUl0ZXJhdG9yKTtcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhJdGVyYWJsZUl0ZXJhdG9yLCBbe1xuICAgIGtleTogU3ltYm9sLml0ZXJhdG9yLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB2YWx1ZSgpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBJdGVyYWJsZUl0ZXJhdG9yO1xufSgpO1xuXG5leHBvcnRzLkl0ZXJhYmxlSXRlcmF0b3IgPSBJdGVyYWJsZUl0ZXJhdG9yOyIsInZhciBfZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9kZWZpbmVQcm9wZXJ0eVwiKTtcblxudmFyIF90b0NvbnN1bWFibGVBcnJheSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3RvQ29uc3VtYWJsZUFycmF5XCIpO1xuXG52YXIgX09iamVjdCRhc3NpZ247XG5cbnZhciBfcmVxdWlyZSA9IHJlcXVpcmUoJy4uL2ltcGxzL2lzLWl0ZXJhYmxlL2lzLWl0ZXJhYmxlLmpzJyksXG4gICAgaXNJdGVyYWJsZSA9IF9yZXF1aXJlLmlzSXRlcmFibGU7XG5cbnZhciBfcmVxdWlyZTIgPSByZXF1aXJlKCcuLi9pbXBscy9pcy1sb29wYWJsZS9pcy1sb29wYWJsZS5qcycpLFxuICAgIGlzTG9vcGFibGUgPSBfcmVxdWlyZTIuaXNMb29wYWJsZTtcblxudmFyIF9yZXF1aXJlMyA9IHJlcXVpcmUoJy4uL2ltcGxzL2lzLXdyYXBwYWJsZS9pcy13cmFwcGFibGUuanMnKSxcbiAgICBpc1dyYXBwYWJsZSA9IF9yZXF1aXJlMy5pc1dyYXBwYWJsZTtcblxudmFyIF9yZXF1aXJlNCA9IHJlcXVpcmUoJy4vd3JhcC5qcycpLFxuICAgIHdyYXAgPSBfcmVxdWlyZTQubnVsbGFibGVXcmFwO1xuXG52YXIgX3JlcXVpcmU1ID0gcmVxdWlyZSgnLi9jdXJyeS5qcycpLFxuICAgIHZhcmlhZGljQ3VycnlXaXRoVmFsaWRhdGlvbiA9IF9yZXF1aXJlNS52YXJpYWRpY0N1cnJ5V2l0aFZhbGlkYXRpb247XG5cbnZhciBfcmVxdWlyZTYgPSByZXF1aXJlKCcuL3N5bWJvbHMuanMnKSxcbiAgICBfID0gX3JlcXVpcmU2Ll8sXG4gICAgX19pdGVyYXRlID0gX3JlcXVpcmU2Ll9faXRlcmF0ZTtcblxuZXhwb3J0cy53cmFwID0gd3JhcDtcbmV4cG9ydHMuaXNJdGVyYWJsZSA9IGlzSXRlcmFibGU7XG5leHBvcnRzLmlzTG9vcGFibGUgPSBpc0xvb3BhYmxlO1xuZXhwb3J0cy5pc1dyYXBwYWJsZSA9IGlzV3JhcHBhYmxlO1xuXG5mdW5jdGlvbiBlbnN1cmVJdGVyYWJsZSh2YWx1ZSkge1xuICBpZiAoIWlzV3JhcHBhYmxlKHZhbHVlKSkge1xuICAgIGlmICh0eXBlb2YgdmFsdWUubmV4dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignaXRlci10b29scyByZWNlaXZlZCBhIHZhbHVlIHRoYXQgbG9va2VkIGxpa2UgYW4gaXRlcmF0b3IgYnV0IHdhcyBub3QgaXRlcmFibGUuIEdldCBoZWxwIGZpeGluZyB0aGlzOiBodHRwczovL2dpdGh1Yi5jb20vaXRlci10b29scy9pdGVyLXRvb2xzL3dpa2kvTWFraW5nLWl0ZXJhdG9ycy1pdGVyYWJsZScpO1xuICAgIH0gZWxzZSB0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBhbiBpdGVyYWJsZSwgbnVsbCwgb3IgdW5kZWZpbmVkJyk7XG4gIH0gZWxzZSBpZiAoaXNJdGVyYWJsZSh2YWx1ZSkpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHdyYXAodmFsdWUpO1xuICB9XG59XG5cbmV4cG9ydHMuZW5zdXJlSXRlcmFibGUgPSBlbnN1cmVJdGVyYWJsZTtcblxuZnVuY3Rpb24gY2FsbFJldHVybihpdGVyYXRvcikge1xuICBpZiAoJ3JldHVybicgaW4gaXRlcmF0b3IpIGl0ZXJhdG9yW1wicmV0dXJuXCJdKCk7XG59XG5cbmV4cG9ydHMuY2FsbFJldHVybiA9IGNhbGxSZXR1cm47XG5cbmZ1bmN0aW9uIEJhc2VJdGVyYWJsZUl0ZXJhdG9yKGZuLCBhcmdzKSB7XG4gIHRoaXNbX10gPSB7XG4gICAgZm46IGZuLFxuICAgIGFyZ3M6IGFyZ3MsXG4gICAgc3RhdGljSXRlcmF0b3I6IG51bGxcbiAgfTtcbn1cblxuZXhwb3J0cy5CYXNlSXRlcmFibGVJdGVyYXRvciA9IEJhc2VJdGVyYWJsZUl0ZXJhdG9yO1xuT2JqZWN0LmFzc2lnbihCYXNlSXRlcmFibGVJdGVyYXRvci5wcm90b3R5cGUsIChfT2JqZWN0JGFzc2lnbiA9IHtcbiAgY29uc3RydWN0b3I6IEJhc2VJdGVyYWJsZUl0ZXJhdG9yXG59LCBfZGVmaW5lUHJvcGVydHkoX09iamVjdCRhc3NpZ24sIF9faXRlcmF0ZSwgZnVuY3Rpb24gKCkge1xuICB2YXIgX3RoaXMkXyA9IHRoaXNbX10sXG4gICAgICBmbiA9IF90aGlzJF8uZm4sXG4gICAgICBhcmdzID0gX3RoaXMkXy5hcmdzO1xuICByZXR1cm4gZm4uYXBwbHkodm9pZCAwLCBfdG9Db25zdW1hYmxlQXJyYXkoYXJncykpO1xufSksIF9kZWZpbmVQcm9wZXJ0eShfT2JqZWN0JGFzc2lnbiwgXCJuZXh0XCIsIGZ1bmN0aW9uIG5leHQoKSB7XG4gIHZhciB0aGlzXyA9IHRoaXNbX107XG4gIHRoaXNfLnN0YXRpY0l0ZXJhdG9yID0gdGhpc18uc3RhdGljSXRlcmF0b3IgfHwgdGhpc1tfX2l0ZXJhdGVdKCk7XG4gIHJldHVybiB0aGlzXy5zdGF0aWNJdGVyYXRvci5uZXh0KCk7XG59KSwgX2RlZmluZVByb3BlcnR5KF9PYmplY3QkYXNzaWduLCBcInJldHVyblwiLCBmdW5jdGlvbiBfcmV0dXJuKHZhbHVlKSB7XG4gIHZhciB0aGlzXyA9IHRoaXNbX107XG4gIHRoaXNfLnN0YXRpY0l0ZXJhdG9yID0gdGhpc18uc3RhdGljSXRlcmF0b3IgfHwgdGhpc1tfX2l0ZXJhdGVdKCk7XG4gIHJldHVybiB0aGlzXy5zdGF0aWNJdGVyYXRvcltcInJldHVyblwiXSh2YWx1ZSk7XG59KSwgX2RlZmluZVByb3BlcnR5KF9PYmplY3QkYXNzaWduLCBcInRocm93XCIsIGZ1bmN0aW9uIF90aHJvdyhlcnJvcikge1xuICB2YXIgdGhpc18gPSB0aGlzW19dO1xuICB0aGlzXy5zdGF0aWNJdGVyYXRvciA9IHRoaXNfLnN0YXRpY0l0ZXJhdG9yIHx8IHRoaXNbX19pdGVyYXRlXSgpO1xuICByZXR1cm4gdGhpc18uc3RhdGljSXRlcmF0b3JbXCJ0aHJvd1wiXShlcnJvcik7XG59KSwgX09iamVjdCRhc3NpZ24pKTtcblxuZnVuY3Rpb24gSXRlcmFibGVJdGVyYXRvcigpIHtcbiAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgYXJnc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgfVxuXG4gIEJhc2VJdGVyYWJsZUl0ZXJhdG9yLmFwcGx5KHRoaXMsIGFyZ3MpO1xufVxuXG5leHBvcnRzLkl0ZXJhYmxlSXRlcmF0b3IgPSBJdGVyYWJsZUl0ZXJhdG9yO1xuSXRlcmFibGVJdGVyYXRvci5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoQmFzZUl0ZXJhYmxlSXRlcmF0b3IucHJvdG90eXBlKSwgX2RlZmluZVByb3BlcnR5KHtcbiAgY29uc3RydWN0b3I6IEl0ZXJhYmxlSXRlcmF0b3Jcbn0sIFN5bWJvbC5pdGVyYXRvciwgZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpc1tfX2l0ZXJhdGVdKCk7XG59KSk7XG5cbmZ1bmN0aW9uIG1ha2VGdW5jdGlvbkNvbmZpZyhmbikge1xuICB2YXIgZm5Db25maWcgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuICB2YXIgX2ZuQ29uZmlnJHZhbGlkYXRlQXJnID0gZm5Db25maWcudmFsaWRhdGVBcmdzLFxuICAgICAgdmFsaWRhdGVBcmdzID0gX2ZuQ29uZmlnJHZhbGlkYXRlQXJnID09PSB2b2lkIDAgPyBmdW5jdGlvbiAoXykge30gOiBfZm5Db25maWckdmFsaWRhdGVBcmcsXG4gICAgICBfZm5Db25maWckdmFyaWFkaWMgPSBmbkNvbmZpZy52YXJpYWRpYyxcbiAgICAgIHZhcmlhZGljID0gX2ZuQ29uZmlnJHZhcmlhZGljID09PSB2b2lkIDAgPyBmYWxzZSA6IF9mbkNvbmZpZyR2YXJpYWRpYyxcbiAgICAgIF9mbkNvbmZpZyRyZWR1Y2VzID0gZm5Db25maWcucmVkdWNlcyxcbiAgICAgIHJlZHVjZXMgPSBfZm5Db25maWckcmVkdWNlcyA9PT0gdm9pZCAwID8gZmFsc2UgOiBfZm5Db25maWckcmVkdWNlcyxcbiAgICAgIF9mbkNvbmZpZyRncm93UmlnaHQgPSBmbkNvbmZpZy5ncm93UmlnaHQsXG4gICAgICBncm93UmlnaHQgPSBfZm5Db25maWckZ3Jvd1JpZ2h0ID09PSB2b2lkIDAgPyBmYWxzZSA6IF9mbkNvbmZpZyRncm93UmlnaHQsXG4gICAgICBfZm5Db25maWckbWluQXJncyA9IGZuQ29uZmlnLm1pbkFyZ3MsXG4gICAgICBtaW5BcmdzID0gX2ZuQ29uZmlnJG1pbkFyZ3MgPT09IHZvaWQgMCA/IGZuLmxlbmd0aCAtIDEgOiBfZm5Db25maWckbWluQXJncyxcbiAgICAgIF9mbkNvbmZpZyRtYXhBcmdzID0gZm5Db25maWcubWF4QXJncyxcbiAgICAgIG1heEFyZ3MgPSBfZm5Db25maWckbWF4QXJncyA9PT0gdm9pZCAwID8gZm4ubGVuZ3RoIC0gMSA6IF9mbkNvbmZpZyRtYXhBcmdzLFxuICAgICAgX2ZuQ29uZmlnJGFwcGx5T25JdGVyID0gZm5Db25maWcuYXBwbHlPbkl0ZXJhYmxlQXJncyxcbiAgICAgIGFwcGx5T25JdGVyYWJsZUFyZ3MgPSBfZm5Db25maWckYXBwbHlPbkl0ZXIgPT09IHZvaWQgMCA/IGVuc3VyZUl0ZXJhYmxlIDogX2ZuQ29uZmlnJGFwcGx5T25JdGVyO1xuICByZXR1cm4ge1xuICAgIGZuOiBmbixcbiAgICB2YWxpZGF0ZUFyZ3M6IHZhbGlkYXRlQXJncyxcbiAgICB2YXJpYWRpYzogdmFyaWFkaWMsXG4gICAgcmVkdWNlczogcmVkdWNlcyxcbiAgICBncm93UmlnaHQ6IGdyb3dSaWdodCxcbiAgICBtaW5BcmdzOiBtaW5BcmdzLFxuICAgIG1heEFyZ3M6IG1heEFyZ3MsXG4gICAgaXNJdGVyYWJsZTogaXNXcmFwcGFibGUsXG4gICAgaXRlcmFibGVUeXBlOiAnaXRlcmFibGUnLFxuICAgIGFwcGx5T25JdGVyYWJsZUFyZ3M6IGFwcGx5T25JdGVyYWJsZUFyZ3MsXG4gICAgSXRlcmFibGVDbGFzczogSXRlcmFibGVJdGVyYXRvclxuICB9O1xufVxuXG5mdW5jdGlvbiBjYWNoZShpdCkge1xuICByZXR1cm4gX3RvQ29uc3VtYWJsZUFycmF5KGl0KTtcbn1cblxuZXhwb3J0cy5jYWNoZSA9IGNhY2hlO1xuXG5mdW5jdGlvbiB3cmFwV2l0aEl0ZXJhYmxlSXRlcmF0b3IoZm4pIHtcbiAgdmFyIF9yZWYgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9LFxuICAgICAgX3JlZiR2YWxpZGF0ZUFyZ3MgPSBfcmVmLnZhbGlkYXRlQXJncyxcbiAgICAgIHZhbGlkYXRlQXJncyA9IF9yZWYkdmFsaWRhdGVBcmdzID09PSB2b2lkIDAgPyBmdW5jdGlvbiAoXykge1xuICAgIHJldHVybiBfO1xuICB9IDogX3JlZiR2YWxpZGF0ZUFyZ3M7XG5cbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICBmb3IgKHZhciBfbGVuMiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbjIpLCBfa2V5MiA9IDA7IF9rZXkyIDwgX2xlbjI7IF9rZXkyKyspIHtcbiAgICAgIGFyZ3NbX2tleTJdID0gYXJndW1lbnRzW19rZXkyXTtcbiAgICB9XG5cbiAgICB2YWxpZGF0ZUFyZ3MoYXJncyk7XG4gICAgcmV0dXJuIG5ldyBJdGVyYWJsZUl0ZXJhdG9yKGZuLCBhcmdzKTtcbiAgfTtcbn1cblxuZXhwb3J0cy53cmFwV2l0aEl0ZXJhYmxlSXRlcmF0b3IgPSB3cmFwV2l0aEl0ZXJhYmxlSXRlcmF0b3I7XG5cbnZhciBpdGVyYWJsZUN1cnJ5ID0gZnVuY3Rpb24gaXRlcmFibGVDdXJyeShmbiwgY29uZmlnKSB7XG4gIHJldHVybiB2YXJpYWRpY0N1cnJ5V2l0aFZhbGlkYXRpb24obWFrZUZ1bmN0aW9uQ29uZmlnKGZuLCBjb25maWcpKTtcbn07XG5cbmV4cG9ydHMuaXRlcmFibGVDdXJyeSA9IGl0ZXJhYmxlQ3Vycnk7IiwiZnVuY3Rpb24gaXNJbnRlZ2VyKHZhbHVlKSB7XG4gIHZhciBub25aZXJvID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBmYWxzZTtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgJiYgIWlzTmFOKHZhbHVlKSAmJiBpc0Zpbml0ZSh2YWx1ZSkgJiYgIShub25aZXJvICYmIHZhbHVlID09PSAwKTtcbn1cblxuZXhwb3J0cy5pc0ludGVnZXIgPSBpc0ludGVnZXI7XG5cbmZ1bmN0aW9uIGlzUG9zaXRpdmVJbnRlZ2VyKHZhbHVlKSB7XG4gIHZhciBub25aZXJvID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBmYWxzZTtcbiAgcmV0dXJuIGlzSW50ZWdlcih2YWx1ZSkgJiYgKG5vblplcm8gPyB2YWx1ZSA+IDAgOiB2YWx1ZSA+PSAwKTtcbn1cblxuZXhwb3J0cy5pc1Bvc2l0aXZlSW50ZWdlciA9IGlzUG9zaXRpdmVJbnRlZ2VyO1xuXG5mdW5jdGlvbiBpc0ludGVnZXJPckluZmluaXRlKHZhbHVlKSB7XG4gIHZhciBub25aZXJvID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBmYWxzZTtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgJiYgIWlzTmFOKHZhbHVlKSAmJiAhKG5vblplcm8gJiYgdmFsdWUgPT09IDApO1xufVxuXG5leHBvcnRzLmlzSW50ZWdlck9ySW5maW5pdGUgPSBpc0ludGVnZXJPckluZmluaXRlOyIsImZ1bmN0aW9uIF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKG8sIGFsbG93QXJyYXlMaWtlKSB7IHZhciBpdDsgaWYgKHR5cGVvZiBTeW1ib2wgPT09IFwidW5kZWZpbmVkXCIgfHwgb1tTeW1ib2wuaXRlcmF0b3JdID09IG51bGwpIHsgaWYgKEFycmF5LmlzQXJyYXkobykgfHwgKGl0ID0gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8pKSB8fCBhbGxvd0FycmF5TGlrZSAmJiBvICYmIHR5cGVvZiBvLmxlbmd0aCA9PT0gXCJudW1iZXJcIikgeyBpZiAoaXQpIG8gPSBpdDsgdmFyIGkgPSAwOyB2YXIgRiA9IGZ1bmN0aW9uIEYoKSB7fTsgcmV0dXJuIHsgczogRiwgbjogZnVuY3Rpb24gbigpIHsgaWYgKGkgPj0gby5sZW5ndGgpIHJldHVybiB7IGRvbmU6IHRydWUgfTsgcmV0dXJuIHsgZG9uZTogZmFsc2UsIHZhbHVlOiBvW2krK10gfTsgfSwgZTogZnVuY3Rpb24gZShfZSkgeyB0aHJvdyBfZTsgfSwgZjogRiB9OyB9IHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gaXRlcmF0ZSBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTsgfSB2YXIgbm9ybWFsQ29tcGxldGlvbiA9IHRydWUsIGRpZEVyciA9IGZhbHNlLCBlcnI7IHJldHVybiB7IHM6IGZ1bmN0aW9uIHMoKSB7IGl0ID0gb1tTeW1ib2wuaXRlcmF0b3JdKCk7IH0sIG46IGZ1bmN0aW9uIG4oKSB7IHZhciBzdGVwID0gaXQubmV4dCgpOyBub3JtYWxDb21wbGV0aW9uID0gc3RlcC5kb25lOyByZXR1cm4gc3RlcDsgfSwgZTogZnVuY3Rpb24gZShfZTIpIHsgZGlkRXJyID0gdHJ1ZTsgZXJyID0gX2UyOyB9LCBmOiBmdW5jdGlvbiBmKCkgeyB0cnkgeyBpZiAoIW5vcm1hbENvbXBsZXRpb24gJiYgaXRbXCJyZXR1cm5cIl0gIT0gbnVsbCkgaXRbXCJyZXR1cm5cIl0oKTsgfSBmaW5hbGx5IHsgaWYgKGRpZEVycikgdGhyb3cgZXJyOyB9IH0gfTsgfVxuXG5mdW5jdGlvbiBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkobywgbWluTGVuKSB7IGlmICghbykgcmV0dXJuOyBpZiAodHlwZW9mIG8gPT09IFwic3RyaW5nXCIpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pOyB2YXIgbiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKS5zbGljZSg4LCAtMSk7IGlmIChuID09PSBcIk9iamVjdFwiICYmIG8uY29uc3RydWN0b3IpIG4gPSBvLmNvbnN0cnVjdG9yLm5hbWU7IGlmIChuID09PSBcIk1hcFwiIHx8IG4gPT09IFwiU2V0XCIpIHJldHVybiBBcnJheS5mcm9tKG8pOyBpZiAobiA9PT0gXCJBcmd1bWVudHNcIiB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSkgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IH1cblxuZnVuY3Rpb24gX2FycmF5TGlrZVRvQXJyYXkoYXJyLCBsZW4pIHsgaWYgKGxlbiA9PSBudWxsIHx8IGxlbiA+IGFyci5sZW5ndGgpIGxlbiA9IGFyci5sZW5ndGg7IGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGxlbik7IGkgPCBsZW47IGkrKykgeyBhcnIyW2ldID0gYXJyW2ldOyB9IHJldHVybiBhcnIyOyB9XG5cbmZ1bmN0aW9uIHBhcmFsbGVsRWFjaChpdGVyYWJsZSwgY2IpIHtcbiAgdmFyIF9pdGVyYXRvciA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKGl0ZXJhYmxlKSxcbiAgICAgIF9zdGVwO1xuXG4gIHRyeSB7XG4gICAgZm9yIChfaXRlcmF0b3IucygpOyAhKF9zdGVwID0gX2l0ZXJhdG9yLm4oKSkuZG9uZTspIHtcbiAgICAgIHZhciB2YWx1ZSA9IF9zdGVwLnZhbHVlO1xuICAgICAgY2IodmFsdWUpO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgX2l0ZXJhdG9yLmUoZXJyKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBfaXRlcmF0b3IuZigpO1xuICB9XG59XG5cbmV4cG9ydHMucGFyYWxsZWxFYWNoID0gcGFyYWxsZWxFYWNoOyIsInZhciBfY2xhc3NDYWxsQ2hlY2sgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVja1wiKTtcblxudmFyIF9jcmVhdGVDbGFzcyA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NyZWF0ZUNsYXNzXCIpO1xuXG52YXIgX2luaGVyaXRzID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW5oZXJpdHNcIik7XG5cbnZhciBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybiA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm5cIik7XG5cbnZhciBfZ2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9nZXRQcm90b3R5cGVPZlwiKTtcblxuZnVuY3Rpb24gX2NyZWF0ZVN1cGVyKERlcml2ZWQpIHsgdmFyIGhhc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QgPSBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCk7IHJldHVybiBmdW5jdGlvbiBfY3JlYXRlU3VwZXJJbnRlcm5hbCgpIHsgdmFyIFN1cGVyID0gX2dldFByb3RvdHlwZU9mKERlcml2ZWQpLCByZXN1bHQ7IGlmIChoYXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KSB7IHZhciBOZXdUYXJnZXQgPSBfZ2V0UHJvdG90eXBlT2YodGhpcykuY29uc3RydWN0b3I7IHJlc3VsdCA9IFJlZmxlY3QuY29uc3RydWN0KFN1cGVyLCBhcmd1bWVudHMsIE5ld1RhcmdldCk7IH0gZWxzZSB7IHJlc3VsdCA9IFN1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH0gcmV0dXJuIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIHJlc3VsdCk7IH07IH1cblxuZnVuY3Rpb24gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpIHsgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcInVuZGVmaW5lZFwiIHx8ICFSZWZsZWN0LmNvbnN0cnVjdCkgcmV0dXJuIGZhbHNlOyBpZiAoUmVmbGVjdC5jb25zdHJ1Y3Quc2hhbSkgcmV0dXJuIGZhbHNlOyBpZiAodHlwZW9mIFByb3h5ID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiB0cnVlOyB0cnkgeyBEYXRlLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKFJlZmxlY3QuY29uc3RydWN0KERhdGUsIFtdLCBmdW5jdGlvbiAoKSB7fSkpOyByZXR1cm4gdHJ1ZTsgfSBjYXRjaCAoZSkgeyByZXR1cm4gZmFsc2U7IH0gfVxuXG52YXIgX3JlcXVpcmUgPSByZXF1aXJlKCcuL3N5bWJvbHMuanMnKSxcbiAgICBzcGxpdCA9IF9yZXF1aXJlLnNwbGl0O1xuXG52YXIgX3JlcXVpcmUyID0gcmVxdWlyZSgnLi9pdGVyYWJsZS1pdGVyYXRvci5qcycpLFxuICAgIEl0ZXJhYmxlSXRlcmF0b3IgPSBfcmVxdWlyZTIuSXRlcmFibGVJdGVyYXRvcjtcblxudmFyIF9yZXF1aXJlMyA9IHJlcXVpcmUoJy4vcGVla2VyYXRvci5qcycpLFxuICAgIFBlZWtlcmF0b3IgPSBfcmVxdWlyZTMuUGVla2VyYXRvcjtcblxudmFyIFBhcnRJdGVyYXRvciA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX0l0ZXJhYmxlSXRlcmF0b3IpIHtcbiAgX2luaGVyaXRzKFBhcnRJdGVyYXRvciwgX0l0ZXJhYmxlSXRlcmF0b3IpO1xuXG4gIHZhciBfc3VwZXIgPSBfY3JlYXRlU3VwZXIoUGFydEl0ZXJhdG9yKTtcblxuICBmdW5jdGlvbiBQYXJ0SXRlcmF0b3IocGFydHNJdGVyYXRvcikge1xuICAgIHZhciBfdGhpcztcblxuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBQYXJ0SXRlcmF0b3IpO1xuXG4gICAgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzKTtcbiAgICBfdGhpcy5wYXJ0c0l0ZXJhdG9yID0gcGFydHNJdGVyYXRvcjtcbiAgICBfdGhpcy5pbmFjdGl2ZSA9IGZhbHNlO1xuICAgIF90aGlzLmRvbmUgPSBmYWxzZTtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoUGFydEl0ZXJhdG9yLCBbe1xuICAgIGtleTogXCJhc3NlcnRBY3RpdmVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYXNzZXJ0QWN0aXZlKCkge1xuICAgICAgaWYgKHRoaXMuaW5hY3RpdmUgJiYgIXRoaXMuZG9uZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCB0YWtlIGZyb20gdGhpcyBzcGxpdCBwYXJ0LiBJdCBpcyBubyBsb25nZXIgdGhlIGFjdGl2ZSBwYXJ0LicpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJuZXh0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG5leHQoKSB7XG4gICAgICB2YXIgc3BsaXRlcmF0b3IgPSB0aGlzLnBhcnRzSXRlcmF0b3Iuc3BsaXRlcmF0b3I7XG4gICAgICB2YXIgY3VycmVudCA9IHNwbGl0ZXJhdG9yLmN1cnJlbnQ7XG4gICAgICB0aGlzLmFzc2VydEFjdGl2ZSgpO1xuXG4gICAgICBpZiAodGhpcy5kb25lIHx8IGN1cnJlbnQuZG9uZSB8fCBjdXJyZW50LnZhbHVlID09PSBzcGxpdCkge1xuICAgICAgICB0aGlzLmRvbmUgPSB0cnVlO1xuICAgICAgICB0aGlzLnBhcnRzSXRlcmF0b3IubWF5YmVSZXR1cm5Tb3VyY2UoKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB2YWx1ZTogdW5kZWZpbmVkLFxuICAgICAgICAgIGRvbmU6IHRydWVcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNwbGl0ZXJhdG9yLmFkdmFuY2UoKTtcbiAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJldHVyblwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfcmV0dXJuKCkge1xuICAgICAgdGhpcy5kb25lID0gdHJ1ZTtcbiAgICAgIHRoaXMucGFydHNJdGVyYXRvci5tYXliZVJldHVyblNvdXJjZSgpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdmFsdWU6IHVuZGVmaW5lZCxcbiAgICAgICAgZG9uZTogdHJ1ZVxuICAgICAgfTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwidGhyb3dcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gX3Rocm93KCkge1xuICAgICAgcmV0dXJuIHRoaXNbXCJyZXR1cm5cIl0oKTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gUGFydEl0ZXJhdG9yO1xufShJdGVyYWJsZUl0ZXJhdG9yKTtcblxuZXhwb3J0cy5QYXJ0SXRlcmF0b3IgPSBQYXJ0SXRlcmF0b3I7XG5cbnZhciBQYXJ0c0l0ZXJhdG9yID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfSXRlcmFibGVJdGVyYXRvcjIpIHtcbiAgX2luaGVyaXRzKFBhcnRzSXRlcmF0b3IsIF9JdGVyYWJsZUl0ZXJhdG9yMik7XG5cbiAgdmFyIF9zdXBlcjIgPSBfY3JlYXRlU3VwZXIoUGFydHNJdGVyYXRvcik7XG5cbiAgZnVuY3Rpb24gUGFydHNJdGVyYXRvcihzb3VyY2UsIHN0cmF0ZWd5LCBvcHRpb25zKSB7XG4gICAgdmFyIF90aGlzMjtcblxuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBQYXJ0c0l0ZXJhdG9yKTtcblxuICAgIF90aGlzMiA9IF9zdXBlcjIuY2FsbCh0aGlzKTtcbiAgICBfdGhpczIuc291cmNlID0gc291cmNlO1xuICAgIF90aGlzMi5zdHJhdGVneSA9IHN0cmF0ZWd5O1xuICAgIF90aGlzMi5vcHRpb25zID0gb3B0aW9ucztcbiAgICBfdGhpczIuaW5pdGlhbGl6ZWQgPSBmYWxzZTtcbiAgICBfdGhpczIucmV0dXJuZWQgPSBmYWxzZTtcbiAgICBfdGhpczIuc3BsaXRlcmF0b3IgPSBudWxsO1xuICAgIF90aGlzMi5jdXJyZW50UGFydCA9IG51bGw7XG4gICAgX3RoaXMyLnNwbGl0U3RlcCA9IG51bGw7XG4gICAgcmV0dXJuIF90aGlzMjtcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhQYXJ0c0l0ZXJhdG9yLCBbe1xuICAgIGtleTogXCJpbml0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGluaXQoKSB7XG4gICAgICB0aGlzLmluaXRpYWxpemVkID0gdHJ1ZTtcbiAgICAgIHZhciBzb3VyY2UgPSB0aGlzLnNvdXJjZSxcbiAgICAgICAgICBzdHJhdGVneSA9IHRoaXMuc3RyYXRlZ3ksXG4gICAgICAgICAgb3B0aW9ucyA9IHRoaXMub3B0aW9ucztcbiAgICAgIHRoaXMuc3BsaXRlcmF0b3IgPSBQZWVrZXJhdG9yLmZyb20oc3RyYXRlZ3koc3BsaXQsIG9wdGlvbnMsIHNvdXJjZSkpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJtYXliZVJldHVyblNvdXJjZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBtYXliZVJldHVyblNvdXJjZSgpIHtcbiAgICAgIGlmICh0aGlzLnNwbGl0ZXJhdG9yICYmIHRoaXMucmV0dXJuZWQgJiYgdGhpcy5jdXJyZW50UGFydC5kb25lKSB7XG4gICAgICAgIHRoaXMuc3BsaXRlcmF0b3JbXCJyZXR1cm5cIl0oKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwibmV4dFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBuZXh0KCkge1xuICAgICAgaWYgKCF0aGlzLmluaXRpYWxpemVkKSB0aGlzLmluaXQoKTtcbiAgICAgIHZhciBzcGxpdGVyYXRvciA9IHRoaXMuc3BsaXRlcmF0b3I7XG5cbiAgICAgIGlmIChzcGxpdGVyYXRvci5kb25lKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdmFsdWU6IHVuZGVmaW5lZCxcbiAgICAgICAgICBkb25lOiB0cnVlXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLmN1cnJlbnRQYXJ0ICE9PSBudWxsKSB7XG4gICAgICAgIGlmIChzcGxpdGVyYXRvci52YWx1ZSAhPT0gc3BsaXQgfHwgc3BsaXRlcmF0b3IuY3VycmVudCA9PT0gdGhpcy5zcGxpdFN0ZXApIHtcbiAgICAgICAgICB0aGlzLmN1cnJlbnRQYXJ0LmluYWN0aXZlID0gdHJ1ZTtcblxuICAgICAgICAgIHdoaWxlICghc3BsaXRlcmF0b3IuZG9uZSAmJiBzcGxpdGVyYXRvci52YWx1ZSAhPT0gc3BsaXQpIHtcbiAgICAgICAgICAgIHNwbGl0ZXJhdG9yLmFkdmFuY2UoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBzcGxpdGVyYXRvci5hZHZhbmNlKCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuc3BsaXRTdGVwID0gc3BsaXRlcmF0b3IuY3VycmVudDtcbiAgICAgIHRoaXMuY3VycmVudFBhcnQgPSBuZXcgUGFydEl0ZXJhdG9yKHRoaXMpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdmFsdWU6IHRoaXMuY3VycmVudFBhcnQsXG4gICAgICAgIGRvbmU6IGZhbHNlXG4gICAgICB9O1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZXR1cm5cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gX3JldHVybih2YWx1ZSkge1xuICAgICAgdGhpcy5yZXR1cm5lZCA9IHRydWU7XG4gICAgICB0aGlzLm1heWJlUmV0dXJuU291cmNlKCk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICAgIGRvbmU6IHRydWVcbiAgICAgIH07XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInRocm93XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF90aHJvdygpIHtcbiAgICAgIHJldHVybiB0aGlzW1wicmV0dXJuXCJdKCk7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIFBhcnRzSXRlcmF0b3I7XG59KEl0ZXJhYmxlSXRlcmF0b3IpO1xuXG5leHBvcnRzLlBhcnRzSXRlcmF0b3IgPSBQYXJ0c0l0ZXJhdG9yOyIsInZhciBfY29uc3RydWN0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY29uc3RydWN0XCIpO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY2xhc3NDYWxsQ2hlY2tcIik7XG5cbnZhciBfY3JlYXRlQ2xhc3MgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jcmVhdGVDbGFzc1wiKTtcblxudmFyIF9yZXF1aXJlID0gcmVxdWlyZSgnLi9pdGVyYWJsZS5qcycpLFxuICAgIGVuc3VyZUl0ZXJhYmxlID0gX3JlcXVpcmUuZW5zdXJlSXRlcmFibGUsXG4gICAgY2FsbFJldHVybiA9IF9yZXF1aXJlLmNhbGxSZXR1cm47XG5cbnZhciBfID0gU3ltYm9sW1wiZm9yXCJdKCdfJyk7XG5cbnZhciBQZWVrZXJhdG9ySXRlcmF0b3IgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBQZWVrZXJhdG9ySXRlcmF0b3IocGVla3IpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgUGVla2VyYXRvckl0ZXJhdG9yKTtcblxuICAgIHRoaXMucGVla3IgPSBwZWVrcjtcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhQZWVrZXJhdG9ySXRlcmF0b3IsIFt7XG4gICAga2V5OiBcIm5leHRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gbmV4dCgpIHtcbiAgICAgIHZhciBwZWVrciA9IHRoaXMucGVla3I7XG4gICAgICB2YXIgY3VycmVudCA9IHBlZWtyLmN1cnJlbnQ7XG4gICAgICBwZWVrci5hZHZhbmNlKCk7XG4gICAgICByZXR1cm4gY3VycmVudDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmV0dXJuXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9yZXR1cm4oKSB7XG4gICAgICB0aGlzLnBlZWtyW1wicmV0dXJuXCJdKCk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB2YWx1ZTogdW5kZWZpbmVkLFxuICAgICAgICBkb25lOiB0cnVlXG4gICAgICB9O1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogU3ltYm9sLml0ZXJhdG9yLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB2YWx1ZSgpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBQZWVrZXJhdG9ySXRlcmF0b3I7XG59KCk7XG5cbnZhciBQZWVrZXJhdG9yID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgX2NyZWF0ZUNsYXNzKFBlZWtlcmF0b3IsIG51bGwsIFt7XG4gICAga2V5OiBcImZyb21cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZnJvbShpdGVyYWJsZSkge1xuICAgICAgdmFyIGl0ZXJhdG9yID0gZW5zdXJlSXRlcmFibGUoaXRlcmFibGUpW1N5bWJvbC5pdGVyYXRvcl0oKTtcbiAgICAgIHZhciBmaXJzdCA9IGl0ZXJhdG9yLm5leHQoKTtcblxuICAgICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiA+IDEgPyBfbGVuIC0gMSA6IDApLCBfa2V5ID0gMTsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgICBhcmdzW19rZXkgLSAxXSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIF9jb25zdHJ1Y3QodGhpcywgW2l0ZXJhdG9yLCBmaXJzdF0uY29uY2F0KGFyZ3MpKTtcbiAgICB9XG4gIH1dKTtcblxuICBmdW5jdGlvbiBQZWVrZXJhdG9yKGl0ZXJhdG9yLCBmaXJzdCkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBQZWVrZXJhdG9yKTtcblxuICAgIHRoaXNbX10gPSB7XG4gICAgICBpdGVyYXRvcjogaXRlcmF0b3IsXG4gICAgICBjdXJyZW50OiBmaXJzdCxcbiAgICAgIGluZGV4OiAwXG4gICAgfTtcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhQZWVrZXJhdG9yLCBbe1xuICAgIGtleTogXCJhZHZhbmNlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGFkdmFuY2UoKSB7XG4gICAgICB2YXIgdGhpc18gPSB0aGlzW19dO1xuXG4gICAgICBpZiAoIXRoaXNfLmN1cnJlbnQuZG9uZSkge1xuICAgICAgICB0aGlzXy5pbmRleCsrO1xuICAgICAgICB0aGlzXy5jdXJyZW50ID0gdGhpc18uaXRlcmF0b3IubmV4dCgpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmV0dXJuXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9yZXR1cm4oKSB7XG4gICAgICB2YXIgdGhpc18gPSB0aGlzW19dO1xuXG4gICAgICBpZiAoIXRoaXMuZG9uZSkge1xuICAgICAgICBjYWxsUmV0dXJuKHRoaXNfLml0ZXJhdG9yKTtcbiAgICAgIH1cblxuICAgICAgdGhpc18uY3VycmVudCA9IHtcbiAgICAgICAgdmFsdWU6IHVuZGVmaW5lZCxcbiAgICAgICAgZG9uZTogdHJ1ZVxuICAgICAgfTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJhc0l0ZXJhdG9yXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGFzSXRlcmF0b3IoKSB7XG4gICAgICByZXR1cm4gbmV3IFBlZWtlcmF0b3JJdGVyYXRvcih0aGlzKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiY3VycmVudFwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXNbX10uY3VycmVudDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwidmFsdWVcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzW19dLmN1cnJlbnQudmFsdWU7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImRvbmVcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzW19dLmN1cnJlbnQuZG9uZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiaW5kZXhcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzW19dLmluZGV4O1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBQZWVrZXJhdG9yO1xufSgpO1xuXG5leHBvcnRzLlBlZWtlcmF0b3IgPSBQZWVrZXJhdG9yOyIsInZhciBfID0gU3ltYm9sW1wiZm9yXCJdKCdfJyk7XG5cbmV4cG9ydHMuXyA9IF87XG5cbnZhciBfX2l0ZXJhdGUgPSBTeW1ib2woJ19faXRlcmF0ZScpO1xuXG5leHBvcnRzLl9faXRlcmF0ZSA9IF9faXRlcmF0ZTtcbnZhciBzcGxpdCA9IFN5bWJvbCgnc3BsaXQnKTtcbmV4cG9ydHMuc3BsaXQgPSBzcGxpdDsiLCJ2YXIgX3JlZ2VuZXJhdG9yUnVudGltZSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9yZWdlbmVyYXRvclwiKTtcblxudmFyIF9tYXJrZWQgPSAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yUnVudGltZS5tYXJrKHdyYXApLFxuICAgIF9tYXJrZWQyID0gLyojX19QVVJFX18qL19yZWdlbmVyYXRvclJ1bnRpbWUubWFyayhudWxsYWJsZVdyYXApO1xuXG5mdW5jdGlvbiB3cmFwKHNvdXJjZSkge1xuICByZXR1cm4gX3JlZ2VuZXJhdG9yUnVudGltZS53cmFwKGZ1bmN0aW9uIHdyYXAkKF9jb250ZXh0KSB7XG4gICAgd2hpbGUgKDEpIHtcbiAgICAgIHN3aXRjaCAoX2NvbnRleHQucHJldiA9IF9jb250ZXh0Lm5leHQpIHtcbiAgICAgICAgY2FzZSAwOlxuICAgICAgICAgIHJldHVybiBfY29udGV4dC5kZWxlZ2F0ZVlpZWxkKHNvdXJjZSwgXCJ0MFwiLCAxKTtcblxuICAgICAgICBjYXNlIDE6XG4gICAgICAgIGNhc2UgXCJlbmRcIjpcbiAgICAgICAgICByZXR1cm4gX2NvbnRleHQuc3RvcCgpO1xuICAgICAgfVxuICAgIH1cbiAgfSwgX21hcmtlZCk7XG59XG5cbmV4cG9ydHMud3JhcCA9IHdyYXA7XG5cbmZ1bmN0aW9uIG51bGxhYmxlV3JhcChzb3VyY2UpIHtcbiAgcmV0dXJuIF9yZWdlbmVyYXRvclJ1bnRpbWUud3JhcChmdW5jdGlvbiBudWxsYWJsZVdyYXAkKF9jb250ZXh0Mikge1xuICAgIHdoaWxlICgxKSB7XG4gICAgICBzd2l0Y2ggKF9jb250ZXh0Mi5wcmV2ID0gX2NvbnRleHQyLm5leHQpIHtcbiAgICAgICAgY2FzZSAwOlxuICAgICAgICAgIGlmICghKHNvdXJjZSAhPSBudWxsKSkge1xuICAgICAgICAgICAgX2NvbnRleHQyLm5leHQgPSAyO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIF9jb250ZXh0Mi5kZWxlZ2F0ZVlpZWxkKHNvdXJjZSwgXCJ0MFwiLCAyKTtcblxuICAgICAgICBjYXNlIDI6XG4gICAgICAgIGNhc2UgXCJlbmRcIjpcbiAgICAgICAgICByZXR1cm4gX2NvbnRleHQyLnN0b3AoKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIF9tYXJrZWQyKTtcbn1cblxuZXhwb3J0cy5udWxsYWJsZVdyYXAgPSBudWxsYWJsZVdyYXA7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9pbXBscy8kYXBwZW5kL2FwcGVuZC5qcycpLmFwcGVuZDsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL2ltcGxzL2FwcGx5L2FwcGx5LmpzJykuYXBwbHk7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9pbXBscy9hcnJheS1maXJzdC1vci9hcnJheS1maXJzdC1vci5qcycpLmFycmF5Rmlyc3RPcjsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL2ltcGxzL2FycmF5LWZpcnN0L2FycmF5LWZpcnN0LmpzJykuYXJyYXlGaXJzdDsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL2ltcGxzL2FycmF5LWZyb20tYXN5bmMvYXJyYXktZnJvbS1hc3luYy5qcycpLmFycmF5RnJvbUFzeW5jOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vaW1wbHMvYXJyYXktZnJvbS9hcnJheS1mcm9tLmpzJykuYXJyYXlGcm9tOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vaW1wbHMvYXJyYXktbGFzdC1vci9hcnJheS1sYXN0LW9yLmpzJykuYXJyYXlMYXN0T3I7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9pbXBscy9hcnJheS1sYXN0L2FycmF5LWxhc3QuanMnKS5hcnJheUxhc3Q7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9pbXBscy9hcnJheS1yZXZlcnNlL2FycmF5LXJldmVyc2UuanMnKS5hcnJheVJldmVyc2U7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9pbXBscy8kYXBwZW5kL2FzeW5jLWFwcGVuZC5qcycpLmFzeW5jQXBwZW5kOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vaW1wbHMvJGJhdGNoL2FzeW5jLWJhdGNoLmpzJykuYXN5bmNCYXRjaDsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL2ltcGxzLyRiaXNlY3QvYXN5bmMtYmlzZWN0LmpzJykuYXN5bmNCaXNlY3Q7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9pbXBscy9hc3luYy1idWZmZXIvYXN5bmMtYnVmZmVyLmpzJykuYXN5bmNCdWZmZXI7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9pbXBscy8kY29sbGF0ZS9hc3luYy1jb2xsYXRlLmpzJykuYXN5bmNDb2xsYXRlOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vaW1wbHMvJGNvbXByZXNzL2FzeW5jLWNvbXByZXNzLmpzJykuYXN5bmNDb21wcmVzczsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL2ltcGxzLyRjb25jYXQvYXN5bmMtY29uY2F0LmpzJykuYXN5bmNDb25jYXQ7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9pbXBscy8kY29uc3VtZS9hc3luYy1jb25zdW1lLmpzJykuYXN5bmNDb25zdW1lOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vaW1wbHMvJGN5Y2xlLXRpbWVzL2FzeW5jLWN5Y2xlLXRpbWVzLmpzJykuYXN5bmNDeWNsZVRpbWVzOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vaW1wbHMvJGN5Y2xlL2FzeW5jLWN5Y2xlLmpzJykuYXN5bmNDeWNsZTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL2ltcGxzLyRkZWVwLWVxdWFsL2FzeW5jLWRlZXAtZXF1YWwuanMnKS5hc3luY0RlZXBFcXVhbDsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL2ltcGxzLyRkaXN0aW5jdC9hc3luYy1kaXN0aW5jdC5qcycpLmFzeW5jRGlzdGluY3Q7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9pbXBscy8kZHJvcC13aGlsZS9hc3luYy1kcm9wLXdoaWxlLmpzJykuYXN5bmNEcm9wV2hpbGU7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9pbXBscy8kZHJvcC9hc3luYy1kcm9wLmpzJykuYXN5bmNEcm9wOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vaW1wbHMvJGVudW1lcmF0ZS9hc3luYy1lbnVtZXJhdGUuanMnKS5hc3luY0VudW1lcmF0ZTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL2ltcGxzLyRlcXVhbC9hc3luYy1lcXVhbC5qcycpLmFzeW5jRXF1YWw7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9pbXBscy8kZXZlcnkvYXN5bmMtZXZlcnkuanMnKS5hc3luY0V2ZXJ5OyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vaW1wbHMvJGZpbHRlci9hc3luYy1maWx0ZXIuanMnKS5hc3luY0ZpbHRlcjsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL2ltcGxzLyRmaW5kLWJlc3Qtb3IvYXN5bmMtZmluZC1iZXN0LW9yLmpzJykuYXN5bmNGaW5kQmVzdE9yOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vaW1wbHMvJGZpbmQtYmVzdC9hc3luYy1maW5kLWJlc3QuanMnKS5hc3luY0ZpbmRCZXN0OyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vaW1wbHMvJGZpbmQtb3IvYXN5bmMtZmluZC1vci5qcycpLmFzeW5jRmluZE9yOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vaW1wbHMvJGZpbmQvYXN5bmMtZmluZC5qcycpLmFzeW5jRmluZDsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL2ltcGxzLyRmaXJzdC1vci9hc3luYy1maXJzdC1vci5qcycpLmFzeW5jRmlyc3RPcjsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL2ltcGxzLyRmaXJzdC9hc3luYy1maXJzdC5qcycpLmFzeW5jRmlyc3Q7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9pbXBscy8kZmxhdC1tYXAvYXN5bmMtZmxhdC1tYXAuanMnKS5hc3luY0ZsYXRNYXA7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9pbXBscy8kZmxhdC9hc3luYy1mbGF0LmpzJykuYXN5bmNGbGF0OyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vaW1wbHMvJGZvci1lYWNoL2FzeW5jLWZvci1lYWNoLmpzJykuYXN5bmNGb3JFYWNoOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vaW1wbHMvJGZvcmsvYXN5bmMtZm9yay5qcycpLmFzeW5jRm9yazsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL2ltcGxzLyRmb3JrZXJhdGUvYXN5bmMtZm9ya2VyYXRlLmpzJykuYXN5bmNGb3JrZXJhdGU7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9pbXBscy8kaW5jbHVkZXMtYW55LXNlcS9hc3luYy1pbmNsdWRlcy1hbnktc2VxLmpzJykuYXN5bmNJbmNsdWRlc0FueVNlcTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL2ltcGxzLyRpbmNsdWRlcy1hbnkvYXN5bmMtaW5jbHVkZXMtYW55LmpzJykuYXN5bmNJbmNsdWRlc0FueTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL2ltcGxzLyRpbmNsdWRlcy1zZXEvYXN5bmMtaW5jbHVkZXMtc2VxLmpzJykuYXN5bmNJbmNsdWRlc1NlcTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL2ltcGxzLyRpbmNsdWRlcy9hc3luYy1pbmNsdWRlcy5qcycpLmFzeW5jSW5jbHVkZXM7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9pbXBscy9hc3luYy1pbnRlcmxlYXZlLXJlYWR5L2FzeW5jLWludGVybGVhdmUtcmVhZHkuanMnKS5hc3luY0ludGVybGVhdmVSZWFkeTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL2ltcGxzLyRpbnRlcmxlYXZlL2FzeW5jLWludGVybGVhdmUuanMnKS5hc3luY0ludGVybGVhdmU7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9pbXBscy8kaW50ZXJwb3NlLXNlcS9hc3luYy1pbnRlcnBvc2Utc2VxLmpzJykuYXN5bmNJbnRlcnBvc2VTZXE7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9pbXBscy8kaW50ZXJwb3NlL2FzeW5jLWludGVycG9zZS5qcycpLmFzeW5jSW50ZXJwb3NlOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vaW1wbHMvJGlzLWVtcHR5L2FzeW5jLWlzLWVtcHR5LmpzJykuYXN5bmNJc0VtcHR5OyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vaW1wbHMvJGlzLXNvcnRlZC9hc3luYy1pcy1zb3J0ZWQuanMnKS5hc3luY0lzU29ydGVkOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vaW1wbHMvJGpvaW4td2l0aC1zZXEvYXN5bmMtam9pbi13aXRoLXNlcS5qcycpLmFzeW5jSm9pbldpdGhTZXE7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9pbXBscy8kam9pbi13aXRoL2FzeW5jLWpvaW4td2l0aC5qcycpLmFzeW5jSm9pbldpdGg7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9pbXBscy8kam9pbi9hc3luYy1qb2luLmpzJykuYXN5bmNKb2luOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vaW1wbHMvJG1hcC9hc3luYy1tYXAuanMnKS5hc3luY01hcDsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL2ltcGxzLyRwZWVrZXJhdGUvYXN5bmMtcGVla2VyYXRlLmpzJykuYXN5bmNQZWVrZXJhdGU7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9pbXBscy8kcHJlcGVuZC9hc3luYy1wcmVwZW5kLmpzJykuYXN5bmNQcmVwZW5kOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vaW1wbHMvJHJlZHVjZS9hc3luYy1yZWR1Y2UuanMnKS5hc3luY1JlZHVjZTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL2ltcGxzLyRyZXZlcnNlL2FzeW5jLXJldmVyc2UuanMnKS5hc3luY1JldmVyc2U7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9pbXBscy8kcm91bmQtcm9iaW4vYXN5bmMtcm91bmQtcm9iaW4uanMnKS5hc3luY1JvdW5kUm9iaW47IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9pbXBscy8kc2l6ZS9hc3luYy1zaXplLmpzJykuYXN5bmNTaXplOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vaW1wbHMvJHNsaWNlL2FzeW5jLXNsaWNlLmpzJykuYXN5bmNTbGljZTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL2ltcGxzLyRzb21lL2FzeW5jLXNvbWUuanMnKS5hc3luY1NvbWU7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9pbXBscy8kc3BsaXQtZ3JvdXBzL2FzeW5jLXNwbGl0LWdyb3Vwcy5qcycpLmFzeW5jU3BsaXRHcm91cHM7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9pbXBscy8kc3BsaXQtb24tYW55LXNlcS9hc3luYy1zcGxpdC1vbi1hbnktc2VxLmpzJykuYXN5bmNTcGxpdE9uQW55U2VxOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vaW1wbHMvJHNwbGl0LW9uLWFueS9hc3luYy1zcGxpdC1vbi1hbnkuanMnKS5hc3luY1NwbGl0T25Bbnk7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9pbXBscy8kc3BsaXQtb24tc2VxL2FzeW5jLXNwbGl0LW9uLXNlcS5qcycpLmFzeW5jU3BsaXRPblNlcTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL2ltcGxzLyRzcGxpdC1vbi9hc3luYy1zcGxpdC1vbi5qcycpLmFzeW5jU3BsaXRPbjsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL2ltcGxzLyRzcGxpdC13aGVuL2FzeW5jLXNwbGl0LXdoZW4uanMnKS5hc3luY1NwbGl0V2hlbjsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL2ltcGxzLyRzcGxpdC9hc3luYy1zcGxpdC5qcycpLmFzeW5jU3BsaXQ7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9pbXBscy8kc3BsaXRlcmF0ZS1ncm91cGVkL2FzeW5jLXNwbGl0ZXJhdGUtZ3JvdXBlZC5qcycpLmFzeW5jU3BsaXRlcmF0ZUdyb3VwZWQ7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9pbXBscy8kc3BsaXRlcmF0ZS9hc3luYy1zcGxpdGVyYXRlLmpzJykuYXN5bmNTcGxpdGVyYXRlOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vaW1wbHMvJHN0YXJ0cy13aXRoLWFueS1zZXEvYXN5bmMtc3RhcnRzLXdpdGgtYW55LXNlcS5qcycpLmFzeW5jU3RhcnRzV2l0aEFueVNlcTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL2ltcGxzLyRzdGFydHMtd2l0aC1hbnkvYXN5bmMtc3RhcnRzLXdpdGgtYW55LmpzJykuYXN5bmNTdGFydHNXaXRoQW55OyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vaW1wbHMvJHN0YXJ0cy13aXRoLXNlcS9hc3luYy1zdGFydHMtd2l0aC1zZXEuanMnKS5hc3luY1N0YXJ0c1dpdGhTZXE7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9pbXBscy8kc3RhcnRzLXdpdGgvYXN5bmMtc3RhcnRzLXdpdGguanMnKS5hc3luY1N0YXJ0c1dpdGg7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9pbXBscy8kc3RyL2FzeW5jLXN0ci5qcycpLmFzeW5jU3RyOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vaW1wbHMvJHRha2UtbGFzdC1vci9hc3luYy10YWtlLWxhc3Qtb3IuanMnKS5hc3luY1Rha2VMYXN0T3I7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9pbXBscy8kdGFrZS1sYXN0L2FzeW5jLXRha2UtbGFzdC5qcycpLmFzeW5jVGFrZUxhc3Q7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9pbXBscy8kdGFrZS1zb3J0ZWQvYXN5bmMtdGFrZS1zb3J0ZWQuanMnKS5hc3luY1Rha2VTb3J0ZWQ7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9pbXBscy8kdGFrZS13aGlsZS9hc3luYy10YWtlLXdoaWxlLmpzJykuYXN5bmNUYWtlV2hpbGU7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9pbXBscy8kdGFrZS9hc3luYy10YWtlLmpzJykuYXN5bmNUYWtlOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vaW1wbHMvJHRhcC9hc3luYy10YXAuanMnKS5hc3luY1RhcDsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL2ltcGxzL2FzeW5jLXRocm90dGxlL2FzeW5jLXRocm90dGxlLmpzJykuYXN5bmNUaHJvdHRsZTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL2ltcGxzLyR0by1hcnJheS9hc3luYy10by1hcnJheS5qcycpLmFzeW5jVG9BcnJheTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL2ltcGxzLyR0by1vYmplY3QvYXN5bmMtdG8tb2JqZWN0LmpzJykuYXN5bmNUb09iamVjdDsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL2ltcGxzLyR3aW5kb3ctYWhlYWQvYXN5bmMtd2luZG93LWFoZWFkLmpzJykuYXN5bmNXaW5kb3dBaGVhZDsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL2ltcGxzLyR3aW5kb3ctYmVoaW5kL2FzeW5jLXdpbmRvdy1iZWhpbmQuanMnKS5hc3luY1dpbmRvd0JlaGluZDsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL2ltcGxzLyR3aW5kb3cvYXN5bmMtd2luZG93LmpzJykuYXN5bmNXaW5kb3c7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9pbXBscy8kd3JhcC9hc3luYy13cmFwLmpzJykuYXN5bmNXcmFwOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vaW1wbHMvJHppcC1hbGwvYXN5bmMtemlwLWFsbC5qcycpLmFzeW5jWmlwQWxsOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vaW1wbHMvJHppcC9hc3luYy16aXAuanMnKS5hc3luY1ppcDsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL2ltcGxzLyRiYXRjaC9iYXRjaC5qcycpLmJhdGNoOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vaW1wbHMvJGJpc2VjdC9iaXNlY3QuanMnKS5iaXNlY3Q7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9pbXBscy9jYWxsL2NhbGwuanMnKS5jYWxsOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vaW1wbHMvJGNvbGxhdGUvY29sbGF0ZS5qcycpLmNvbGxhdGU7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9pbXBscy9jb21wb3NlL2NvbXBvc2UuanMnKS5jb21wb3NlOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vaW1wbHMvJGNvbXByZXNzL2NvbXByZXNzLmpzJykuY29tcHJlc3M7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9pbXBscy8kY29uY2F0L2NvbmNhdC5qcycpLmNvbmNhdDsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL2ltcGxzLyRjb25zdW1lL2NvbnN1bWUuanMnKS5jb25zdW1lOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vaW1wbHMvJGN5Y2xlLXRpbWVzL2N5Y2xlLXRpbWVzLmpzJykuY3ljbGVUaW1lczsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL2ltcGxzLyRjeWNsZS9jeWNsZS5qcycpLmN5Y2xlOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vaW1wbHMvJGRlZXAtZXF1YWwvZGVlcC1lcXVhbC5qcycpLmRlZXBFcXVhbDsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL2ltcGxzLyRkaXN0aW5jdC9kaXN0aW5jdC5qcycpLmRpc3RpbmN0OyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vaW1wbHMvJGRyb3Atd2hpbGUvZHJvcC13aGlsZS5qcycpLmRyb3BXaGlsZTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL2ltcGxzLyRkcm9wL2Ryb3AuanMnKS5kcm9wOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vaW1wbHMvJGVudW1lcmF0ZS9lbnVtZXJhdGUuanMnKS5lbnVtZXJhdGU7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9pbXBscy8kZXF1YWwvZXF1YWwuanMnKS5lcXVhbDsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL2ltcGxzLyRldmVyeS9ldmVyeS5qcycpLmV2ZXJ5OyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vaW1wbHMvZXhlYy1waXBlL2V4ZWMtcGlwZS5qcycpLmV4ZWNQaXBlOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vaW1wbHMvJGZpbHRlci9maWx0ZXIuanMnKS5maWx0ZXI7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9pbXBscy8kZmluZC1iZXN0LW9yL2ZpbmQtYmVzdC1vci5qcycpLmZpbmRCZXN0T3I7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9pbXBscy8kZmluZC1iZXN0L2ZpbmQtYmVzdC5qcycpLmZpbmRCZXN0OyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vaW1wbHMvJGZpbmQtb3IvZmluZC1vci5qcycpLmZpbmRPcjsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL2ltcGxzLyRmaW5kL2ZpbmQuanMnKS5maW5kOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vaW1wbHMvZmlyc3QtaGlnaGVzdC9maXJzdC1oaWdoZXN0LmpzJykuZmlyc3RIaWdoZXN0OyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vaW1wbHMvZmlyc3QtbG93ZXN0L2ZpcnN0LWxvd2VzdC5qcycpLmZpcnN0TG93ZXN0OyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vaW1wbHMvJGZpcnN0LW9yL2ZpcnN0LW9yLmpzJykuZmlyc3RPcjsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL2ltcGxzLyRmaXJzdC9maXJzdC5qcycpLmZpcnN0OyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vaW1wbHMvJGZsYXQtbWFwL2ZsYXQtbWFwLmpzJykuZmxhdE1hcDsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL2ltcGxzLyRmbGF0L2ZsYXQuanMnKS5mbGF0OyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vaW1wbHMvJGZvci1lYWNoL2Zvci1lYWNoLmpzJykuZm9yRWFjaDsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL2ltcGxzLyRmb3JrL2ZvcmsuanMnKS5mb3JrOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vaW1wbHMvJGZvcmtlcmF0ZS9mb3JrZXJhdGUuanMnKS5mb3JrZXJhdGU7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9pbXBscy9nZXQtc2l6ZS9nZXQtc2l6ZS5qcycpLmdldFNpemU7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9pbXBscy8kaW5jbHVkZXMtYW55LXNlcS9pbmNsdWRlcy1hbnktc2VxLmpzJykuaW5jbHVkZXNBbnlTZXE7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9pbXBscy8kaW5jbHVkZXMtYW55L2luY2x1ZGVzLWFueS5qcycpLmluY2x1ZGVzQW55OyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vaW1wbHMvJGluY2x1ZGVzLXNlcS9pbmNsdWRlcy1zZXEuanMnKS5pbmNsdWRlc1NlcTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL2ltcGxzLyRpbmNsdWRlcy9pbmNsdWRlcy5qcycpLmluY2x1ZGVzOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vaW1wbHMvJGludGVybGVhdmUvaW50ZXJsZWF2ZS5qcycpLmludGVybGVhdmU7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9pbXBscy8kaW50ZXJwb3NlLXNlcS9pbnRlcnBvc2Utc2VxLmpzJykuaW50ZXJwb3NlU2VxOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vaW1wbHMvJGludGVycG9zZS9pbnRlcnBvc2UuanMnKS5pbnRlcnBvc2U7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9pbXBscy9pcy1hcnJheS9pcy1hcnJheS5qcycpLmlzQXJyYXk7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9pbXBscy9pcy1hc3luYy1pdGVyYWJsZS9pcy1hc3luYy1pdGVyYWJsZS5qcycpLmlzQXN5bmNJdGVyYWJsZTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL2ltcGxzL2lzLWFzeW5jLWxvb3BhYmxlL2lzLWFzeW5jLWxvb3BhYmxlLmpzJykuaXNBc3luY0xvb3BhYmxlOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vaW1wbHMvaXMtYXN5bmMtd3JhcHBhYmxlL2lzLWFzeW5jLXdyYXBwYWJsZS5qcycpLmlzQXN5bmNXcmFwcGFibGU7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9pbXBscy8kaXMtZW1wdHkvaXMtZW1wdHkuanMnKS5pc0VtcHR5OyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vaW1wbHMvaXMtaXRlcmFibGUvaXMtaXRlcmFibGUuanMnKS5pc0l0ZXJhYmxlOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vaW1wbHMvaXMtbG9vcGFibGUvaXMtbG9vcGFibGUuanMnKS5pc0xvb3BhYmxlOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vaW1wbHMvaXMtbmlsL2lzLW5pbC5qcycpLmlzTmlsOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vaW1wbHMvaXMtbnVsbC9pcy1udWxsLmpzJykuaXNOdWxsOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vaW1wbHMvaXMtb2JqZWN0L2lzLW9iamVjdC5qcycpLmlzT2JqZWN0OyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vaW1wbHMvJGlzLXNvcnRlZC9pcy1zb3J0ZWQuanMnKS5pc1NvcnRlZDsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL2ltcGxzL2lzLXN0cmluZy9pcy1zdHJpbmcuanMnKS5pc1N0cmluZzsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL2ltcGxzL2lzLXVuZGVmaW5lZC9pcy11bmRlZmluZWQuanMnKS5pc1VuZGVmaW5lZDsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL2ltcGxzL2lzLXdyYXBwYWJsZS9pcy13cmFwcGFibGUuanMnKS5pc1dyYXBwYWJsZTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL2ltcGxzLyRqb2luLXdpdGgtc2VxL2pvaW4td2l0aC1zZXEuanMnKS5qb2luV2l0aFNlcTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL2ltcGxzLyRqb2luLXdpdGgvam9pbi13aXRoLmpzJykuam9pbldpdGg7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9pbXBscy8kam9pbi9qb2luLmpzJykuam9pbjsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL2ltcGxzL2xhc3QtaGlnaGVzdC9sYXN0LWhpZ2hlc3QuanMnKS5sYXN0SGlnaGVzdDsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL2ltcGxzL2xhc3QtbG93ZXN0L2xhc3QtbG93ZXN0LmpzJykubGFzdExvd2VzdDsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL2ltcGxzLyRtYXAvbWFwLmpzJykubWFwOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vaW1wbHMvbm90LWFycmF5L25vdC1hcnJheS5qcycpLm5vdEFycmF5OyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vaW1wbHMvbm90LWFzeW5jLWl0ZXJhYmxlL25vdC1hc3luYy1pdGVyYWJsZS5qcycpLm5vdEFzeW5jSXRlcmFibGU7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9pbXBscy9ub3QtYXN5bmMtbG9vcGFibGUvbm90LWFzeW5jLWxvb3BhYmxlLmpzJykubm90QXN5bmNMb29wYWJsZTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL2ltcGxzL25vdC1hc3luYy13cmFwcGFibGUvbm90LWFzeW5jLXdyYXBwYWJsZS5qcycpLm5vdEFzeW5jV3JhcHBhYmxlOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vaW1wbHMvbm90LWl0ZXJhYmxlL25vdC1pdGVyYWJsZS5qcycpLm5vdEl0ZXJhYmxlOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vaW1wbHMvbm90LWxvb3BhYmxlL25vdC1sb29wYWJsZS5qcycpLm5vdExvb3BhYmxlOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vaW1wbHMvbm90LW5pbC9ub3QtbmlsLmpzJykubm90TmlsOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vaW1wbHMvbm90LW51bGwvbm90LW51bGwuanMnKS5ub3ROdWxsOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vaW1wbHMvbm90LW9iamVjdC9ub3Qtb2JqZWN0LmpzJykubm90T2JqZWN0OyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vaW1wbHMvbm90LXN0cmluZy9ub3Qtc3RyaW5nLmpzJykubm90U3RyaW5nOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vaW1wbHMvbm90LXVuZGVmaW5lZC9ub3QtdW5kZWZpbmVkLmpzJykubm90VW5kZWZpbmVkOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vaW1wbHMvbm90LXdyYXBwYWJsZS9ub3Qtd3JhcHBhYmxlLmpzJykubm90V3JhcHBhYmxlOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vaW1wbHMvb2JqZWN0LWVudHJpZXMvb2JqZWN0LWVudHJpZXMuanMnKS5vYmplY3RFbnRyaWVzOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vaW1wbHMvb2JqZWN0LWZyb20tYXN5bmMvb2JqZWN0LWZyb20tYXN5bmMuanMnKS5vYmplY3RGcm9tQXN5bmM7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9pbXBscy9vYmplY3QtZnJvbS9vYmplY3QtZnJvbS5qcycpLm9iamVjdEZyb207IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9pbXBscy9vYmplY3Qta2V5cy9vYmplY3Qta2V5cy5qcycpLm9iamVjdEtleXM7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9pbXBscy9vYmplY3QtdmFsdWVzL29iamVjdC12YWx1ZXMuanMnKS5vYmplY3RWYWx1ZXM7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9pbXBscy8kcGVla2VyYXRlL3BlZWtlcmF0ZS5qcycpLnBlZWtlcmF0ZTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL2ltcGxzL3BpcGUvcGlwZS5qcycpLnBpcGU7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9pbXBscy8kcHJlcGVuZC9wcmVwZW5kLmpzJykucHJlcGVuZDsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL2ltcGxzL3JhbmdlL3JhbmdlLmpzJykucmFuZ2U7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9pbXBscy8kcmVkdWNlL3JlZHVjZS5qcycpLnJlZHVjZTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL2ltcGxzL3JlcGVhdC10aW1lcy9yZXBlYXQtdGltZXMuanMnKS5yZXBlYXRUaW1lczsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL2ltcGxzL3JlcGVhdC9yZXBlYXQuanMnKS5yZXBlYXQ7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9pbXBscy8kcmV2ZXJzZS9yZXZlcnNlLmpzJykucmV2ZXJzZTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL2ltcGxzLyRyb3VuZC1yb2Jpbi9yb3VuZC1yb2Jpbi5qcycpLnJvdW5kUm9iaW47IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9pbXBscy8kc2l6ZS9zaXplLmpzJykuc2l6ZTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL2ltcGxzLyRzbGljZS9zbGljZS5qcycpLnNsaWNlOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vaW1wbHMvJHNvbWUvc29tZS5qcycpLnNvbWU7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9pbXBscy8kc3BsaXQtZ3JvdXBzL3NwbGl0LWdyb3Vwcy5qcycpLnNwbGl0R3JvdXBzOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vaW1wbHMvJHNwbGl0LW9uLWFueS1zZXEvc3BsaXQtb24tYW55LXNlcS5qcycpLnNwbGl0T25BbnlTZXE7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9pbXBscy8kc3BsaXQtb24tYW55L3NwbGl0LW9uLWFueS5qcycpLnNwbGl0T25Bbnk7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9pbXBscy8kc3BsaXQtb24tc2VxL3NwbGl0LW9uLXNlcS5qcycpLnNwbGl0T25TZXE7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9pbXBscy8kc3BsaXQtb24vc3BsaXQtb24uanMnKS5zcGxpdE9uOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vaW1wbHMvJHNwbGl0LXdoZW4vc3BsaXQtd2hlbi5qcycpLnNwbGl0V2hlbjsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL2ltcGxzLyRzcGxpdC9zcGxpdC5qcycpLnNwbGl0OyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vaW1wbHMvJHNwbGl0ZXJhdGUtZ3JvdXBlZC9zcGxpdGVyYXRlLWdyb3VwZWQuanMnKS5zcGxpdGVyYXRlR3JvdXBlZDsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL2ltcGxzLyRzcGxpdGVyYXRlL3NwbGl0ZXJhdGUuanMnKS5zcGxpdGVyYXRlOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vaW1wbHMvJHN0YXJ0cy13aXRoLWFueS1zZXEvc3RhcnRzLXdpdGgtYW55LXNlcS5qcycpLnN0YXJ0c1dpdGhBbnlTZXE7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9pbXBscy8kc3RhcnRzLXdpdGgtYW55L3N0YXJ0cy13aXRoLWFueS5qcycpLnN0YXJ0c1dpdGhBbnk7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9pbXBscy8kc3RhcnRzLXdpdGgtc2VxL3N0YXJ0cy13aXRoLXNlcS5qcycpLnN0YXJ0c1dpdGhTZXE7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9pbXBscy8kc3RhcnRzLXdpdGgvc3RhcnRzLXdpdGguanMnKS5zdGFydHNXaXRoOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vaW1wbHMvJHN0ci9zdHIuanMnKS5zdHI7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9pbXBscy9zdHJpbmctZnJvbS1hc3luYy9zdHJpbmctZnJvbS1hc3luYy5qcycpLnN0cmluZ0Zyb21Bc3luYzsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL2ltcGxzL3N0cmluZy1mcm9tL3N0cmluZy1mcm9tLmpzJykuc3RyaW5nRnJvbTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL2ltcGxzLyR0YWtlLWxhc3Qtb3IvdGFrZS1sYXN0LW9yLmpzJykudGFrZUxhc3RPcjsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL2ltcGxzLyR0YWtlLWxhc3QvdGFrZS1sYXN0LmpzJykudGFrZUxhc3Q7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9pbXBscy8kdGFrZS1zb3J0ZWQvdGFrZS1zb3J0ZWQuanMnKS50YWtlU29ydGVkOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vaW1wbHMvJHRha2Utd2hpbGUvdGFrZS13aGlsZS5qcycpLnRha2VXaGlsZTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL2ltcGxzLyR0YWtlL3Rha2UuanMnKS50YWtlOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vaW1wbHMvJHRhcC90YXAuanMnKS50YXA7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9pbXBscy8kdG8tYXJyYXkvdG8tYXJyYXkuanMnKS50b0FycmF5OyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vaW1wbHMvJHRvLW9iamVjdC90by1vYmplY3QuanMnKS50b09iamVjdDsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL2ltcGxzL3doZW4vd2hlbi5qcycpLndoZW47IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9pbXBscy8kd2luZG93LWFoZWFkL3dpbmRvdy1haGVhZC5qcycpLndpbmRvd0FoZWFkOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vaW1wbHMvJHdpbmRvdy1iZWhpbmQvd2luZG93LWJlaGluZC5qcycpLndpbmRvd0JlaGluZDsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL2ltcGxzLyR3aW5kb3cvd2luZG93LmpzJykud2luZG93OyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vaW1wbHMvd3JhcC1lbnRyaWVzL3dyYXAtZW50cmllcy5qcycpLndyYXBFbnRyaWVzOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vaW1wbHMvd3JhcC1rZXlzL3dyYXAta2V5cy5qcycpLndyYXBLZXlzOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vaW1wbHMvd3JhcC12YWx1ZXMvd3JhcC12YWx1ZXMuanMnKS53cmFwVmFsdWVzOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vaW1wbHMvJHdyYXAvd3JhcC5qcycpLndyYXA7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9pbXBscy8kemlwLWFsbC96aXAtYWxsLmpzJykuemlwQWxsOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vaW1wbHMvJHppcC96aXAuanMnKS56aXA7IiwiLypcclxuIENvcHlyaWdodCAyMDEzIERhbmllbCBXaXJ0eiA8ZGNvZGVAZGNvZGUuaW8+XHJcbiBDb3B5cmlnaHQgMjAwOSBUaGUgQ2xvc3VyZSBMaWJyYXJ5IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXHJcblxyXG4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG5cclxuIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG5cclxuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMtSVNcIiBCQVNJUyxcclxuIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIEBsaWNlbnNlIGxvbmcuanMgKGMpIDIwMTMgRGFuaWVsIFdpcnR6IDxkY29kZUBkY29kZS5pbz5cclxuICogUmVsZWFzZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMFxyXG4gKiBzZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9kY29kZUlPL2xvbmcuanMgZm9yIGRldGFpbHNcclxuICovXHJcbihmdW5jdGlvbihnbG9iYWwsIGZhY3RvcnkpIHtcclxuXHJcbiAgICAvKiBBTUQgKi8gaWYgKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lW1wiYW1kXCJdKVxyXG4gICAgICAgIGRlZmluZShbXSwgZmFjdG9yeSk7XHJcbiAgICAvKiBDb21tb25KUyAqLyBlbHNlIGlmICh0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgbW9kdWxlID09PSBcIm9iamVjdFwiICYmIG1vZHVsZSAmJiBtb2R1bGVbXCJleHBvcnRzXCJdKVxyXG4gICAgICAgIG1vZHVsZVtcImV4cG9ydHNcIl0gPSBmYWN0b3J5KCk7XHJcbiAgICAvKiBHbG9iYWwgKi8gZWxzZVxyXG4gICAgICAgIChnbG9iYWxbXCJkY29kZUlPXCJdID0gZ2xvYmFsW1wiZGNvZGVJT1wiXSB8fCB7fSlbXCJMb25nXCJdID0gZmFjdG9yeSgpO1xyXG5cclxufSkodGhpcywgZnVuY3Rpb24oKSB7XHJcbiAgICBcInVzZSBzdHJpY3RcIjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIENvbnN0cnVjdHMgYSA2NCBiaXQgdHdvJ3MtY29tcGxlbWVudCBpbnRlZ2VyLCBnaXZlbiBpdHMgbG93IGFuZCBoaWdoIDMyIGJpdCB2YWx1ZXMgYXMgKnNpZ25lZCogaW50ZWdlcnMuXHJcbiAgICAgKiAgU2VlIHRoZSBmcm9tKiBmdW5jdGlvbnMgYmVsb3cgZm9yIG1vcmUgY29udmVuaWVudCB3YXlzIG9mIGNvbnN0cnVjdGluZyBMb25ncy5cclxuICAgICAqIEBleHBvcnRzIExvbmdcclxuICAgICAqIEBjbGFzcyBBIExvbmcgY2xhc3MgZm9yIHJlcHJlc2VudGluZyBhIDY0IGJpdCB0d28ncy1jb21wbGVtZW50IGludGVnZXIgdmFsdWUuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbG93IFRoZSBsb3cgKHNpZ25lZCkgMzIgYml0cyBvZiB0aGUgbG9uZ1xyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGhpZ2ggVGhlIGhpZ2ggKHNpZ25lZCkgMzIgYml0cyBvZiB0aGUgbG9uZ1xyXG4gICAgICogQHBhcmFtIHtib29sZWFuPX0gdW5zaWduZWQgV2hldGhlciB1bnNpZ25lZCBvciBub3QsIGRlZmF1bHRzIHRvIGBmYWxzZWAgZm9yIHNpZ25lZFxyXG4gICAgICogQGNvbnN0cnVjdG9yXHJcbiAgICAgKi9cclxuICAgIGZ1bmN0aW9uIExvbmcobG93LCBoaWdoLCB1bnNpZ25lZCkge1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgbG93IDMyIGJpdHMgYXMgYSBzaWduZWQgdmFsdWUuXHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmxvdyA9IGxvdyB8IDA7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBoaWdoIDMyIGJpdHMgYXMgYSBzaWduZWQgdmFsdWUuXHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmhpZ2ggPSBoaWdoIHwgMDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogV2hldGhlciB1bnNpZ25lZCBvciBub3QuXHJcbiAgICAgICAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy51bnNpZ25lZCA9ICEhdW5zaWduZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gVGhlIGludGVybmFsIHJlcHJlc2VudGF0aW9uIG9mIGEgbG9uZyBpcyB0aGUgdHdvIGdpdmVuIHNpZ25lZCwgMzItYml0IHZhbHVlcy5cclxuICAgIC8vIFdlIHVzZSAzMi1iaXQgcGllY2VzIGJlY2F1c2UgdGhlc2UgYXJlIHRoZSBzaXplIG9mIGludGVnZXJzIG9uIHdoaWNoXHJcbiAgICAvLyBKYXZhc2NyaXB0IHBlcmZvcm1zIGJpdC1vcGVyYXRpb25zLiAgRm9yIG9wZXJhdGlvbnMgbGlrZSBhZGRpdGlvbiBhbmRcclxuICAgIC8vIG11bHRpcGxpY2F0aW9uLCB3ZSBzcGxpdCBlYWNoIG51bWJlciBpbnRvIDE2IGJpdCBwaWVjZXMsIHdoaWNoIGNhbiBlYXNpbHkgYmVcclxuICAgIC8vIG11bHRpcGxpZWQgd2l0aGluIEphdmFzY3JpcHQncyBmbG9hdGluZy1wb2ludCByZXByZXNlbnRhdGlvbiB3aXRob3V0IG92ZXJmbG93XHJcbiAgICAvLyBvciBjaGFuZ2UgaW4gc2lnbi5cclxuICAgIC8vXHJcbiAgICAvLyBJbiB0aGUgYWxnb3JpdGhtcyBiZWxvdywgd2UgZnJlcXVlbnRseSByZWR1Y2UgdGhlIG5lZ2F0aXZlIGNhc2UgdG8gdGhlXHJcbiAgICAvLyBwb3NpdGl2ZSBjYXNlIGJ5IG5lZ2F0aW5nIHRoZSBpbnB1dChzKSBhbmQgdGhlbiBwb3N0LXByb2Nlc3NpbmcgdGhlIHJlc3VsdC5cclxuICAgIC8vIE5vdGUgdGhhdCB3ZSBtdXN0IEFMV0FZUyBjaGVjayBzcGVjaWFsbHkgd2hldGhlciB0aG9zZSB2YWx1ZXMgYXJlIE1JTl9WQUxVRVxyXG4gICAgLy8gKC0yXjYzKSBiZWNhdXNlIC1NSU5fVkFMVUUgPT0gTUlOX1ZBTFVFIChzaW5jZSAyXjYzIGNhbm5vdCBiZSByZXByZXNlbnRlZCBhc1xyXG4gICAgLy8gYSBwb3NpdGl2ZSBudW1iZXIsIGl0IG92ZXJmbG93cyBiYWNrIGludG8gYSBuZWdhdGl2ZSkuICBOb3QgaGFuZGxpbmcgdGhpc1xyXG4gICAgLy8gY2FzZSB3b3VsZCBvZnRlbiByZXN1bHQgaW4gaW5maW5pdGUgcmVjdXJzaW9uLlxyXG4gICAgLy9cclxuICAgIC8vIENvbW1vbiBjb25zdGFudCB2YWx1ZXMgWkVSTywgT05FLCBORUdfT05FLCBldGMuIGFyZSBkZWZpbmVkIGJlbG93IHRoZSBmcm9tKlxyXG4gICAgLy8gbWV0aG9kcyBvbiB3aGljaCB0aGV5IGRlcGVuZC5cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFuIGluZGljYXRvciB1c2VkIHRvIHJlbGlhYmx5IGRldGVybWluZSBpZiBhbiBvYmplY3QgaXMgYSBMb25nIG9yIG5vdC5cclxuICAgICAqIEB0eXBlIHtib29sZWFufVxyXG4gICAgICogQGNvbnN0XHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICovXHJcbiAgICBMb25nLnByb3RvdHlwZS5fX2lzTG9uZ19fO1xyXG5cclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShMb25nLnByb3RvdHlwZSwgXCJfX2lzTG9uZ19fXCIsIHtcclxuICAgICAgICB2YWx1ZTogdHJ1ZSxcclxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcclxuICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlXHJcbiAgICB9KTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBmdW5jdGlvblxyXG4gICAgICogQHBhcmFtIHsqfSBvYmogT2JqZWN0XHJcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cclxuICAgICAqIEBpbm5lclxyXG4gICAgICovXHJcbiAgICBmdW5jdGlvbiBpc0xvbmcob2JqKSB7XHJcbiAgICAgICAgcmV0dXJuIChvYmogJiYgb2JqW1wiX19pc0xvbmdfX1wiXSkgPT09IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUZXN0cyBpZiB0aGUgc3BlY2lmaWVkIG9iamVjdCBpcyBhIExvbmcuXHJcbiAgICAgKiBAZnVuY3Rpb25cclxuICAgICAqIEBwYXJhbSB7Kn0gb2JqIE9iamVjdFxyXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XHJcbiAgICAgKi9cclxuICAgIExvbmcuaXNMb25nID0gaXNMb25nO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQSBjYWNoZSBvZiB0aGUgTG9uZyByZXByZXNlbnRhdGlvbnMgb2Ygc21hbGwgaW50ZWdlciB2YWx1ZXMuXHJcbiAgICAgKiBAdHlwZSB7IU9iamVjdH1cclxuICAgICAqIEBpbm5lclxyXG4gICAgICovXHJcbiAgICB2YXIgSU5UX0NBQ0hFID0ge307XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBIGNhY2hlIG9mIHRoZSBMb25nIHJlcHJlc2VudGF0aW9ucyBvZiBzbWFsbCB1bnNpZ25lZCBpbnRlZ2VyIHZhbHVlcy5cclxuICAgICAqIEB0eXBlIHshT2JqZWN0fVxyXG4gICAgICogQGlubmVyXHJcbiAgICAgKi9cclxuICAgIHZhciBVSU5UX0NBQ0hFID0ge307XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gdmFsdWVcclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbj19IHVuc2lnbmVkXHJcbiAgICAgKiBAcmV0dXJucyB7IUxvbmd9XHJcbiAgICAgKiBAaW5uZXJcclxuICAgICAqL1xyXG4gICAgZnVuY3Rpb24gZnJvbUludCh2YWx1ZSwgdW5zaWduZWQpIHtcclxuICAgICAgICB2YXIgb2JqLCBjYWNoZWRPYmosIGNhY2hlO1xyXG4gICAgICAgIGlmICh1bnNpZ25lZCkge1xyXG4gICAgICAgICAgICB2YWx1ZSA+Pj49IDA7XHJcbiAgICAgICAgICAgIGlmIChjYWNoZSA9ICgwIDw9IHZhbHVlICYmIHZhbHVlIDwgMjU2KSkge1xyXG4gICAgICAgICAgICAgICAgY2FjaGVkT2JqID0gVUlOVF9DQUNIRVt2YWx1ZV07XHJcbiAgICAgICAgICAgICAgICBpZiAoY2FjaGVkT2JqKVxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjYWNoZWRPYmo7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgb2JqID0gZnJvbUJpdHModmFsdWUsICh2YWx1ZSB8IDApIDwgMCA/IC0xIDogMCwgdHJ1ZSk7XHJcbiAgICAgICAgICAgIGlmIChjYWNoZSlcclxuICAgICAgICAgICAgICAgIFVJTlRfQ0FDSEVbdmFsdWVdID0gb2JqO1xyXG4gICAgICAgICAgICByZXR1cm4gb2JqO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHZhbHVlIHw9IDA7XHJcbiAgICAgICAgICAgIGlmIChjYWNoZSA9ICgtMTI4IDw9IHZhbHVlICYmIHZhbHVlIDwgMTI4KSkge1xyXG4gICAgICAgICAgICAgICAgY2FjaGVkT2JqID0gSU5UX0NBQ0hFW3ZhbHVlXTtcclxuICAgICAgICAgICAgICAgIGlmIChjYWNoZWRPYmopXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhY2hlZE9iajtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBvYmogPSBmcm9tQml0cyh2YWx1ZSwgdmFsdWUgPCAwID8gLTEgOiAwLCBmYWxzZSk7XHJcbiAgICAgICAgICAgIGlmIChjYWNoZSlcclxuICAgICAgICAgICAgICAgIElOVF9DQUNIRVt2YWx1ZV0gPSBvYmo7XHJcbiAgICAgICAgICAgIHJldHVybiBvYmo7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIExvbmcgcmVwcmVzZW50aW5nIHRoZSBnaXZlbiAzMiBiaXQgaW50ZWdlciB2YWx1ZS5cclxuICAgICAqIEBmdW5jdGlvblxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIFRoZSAzMiBiaXQgaW50ZWdlciBpbiBxdWVzdGlvblxyXG4gICAgICogQHBhcmFtIHtib29sZWFuPX0gdW5zaWduZWQgV2hldGhlciB1bnNpZ25lZCBvciBub3QsIGRlZmF1bHRzIHRvIGBmYWxzZWAgZm9yIHNpZ25lZFxyXG4gICAgICogQHJldHVybnMgeyFMb25nfSBUaGUgY29ycmVzcG9uZGluZyBMb25nIHZhbHVlXHJcbiAgICAgKi9cclxuICAgIExvbmcuZnJvbUludCA9IGZyb21JbnQ7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gdmFsdWVcclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbj19IHVuc2lnbmVkXHJcbiAgICAgKiBAcmV0dXJucyB7IUxvbmd9XHJcbiAgICAgKiBAaW5uZXJcclxuICAgICAqL1xyXG4gICAgZnVuY3Rpb24gZnJvbU51bWJlcih2YWx1ZSwgdW5zaWduZWQpIHtcclxuICAgICAgICBpZiAoaXNOYU4odmFsdWUpIHx8ICFpc0Zpbml0ZSh2YWx1ZSkpXHJcbiAgICAgICAgICAgIHJldHVybiB1bnNpZ25lZCA/IFVaRVJPIDogWkVSTztcclxuICAgICAgICBpZiAodW5zaWduZWQpIHtcclxuICAgICAgICAgICAgaWYgKHZhbHVlIDwgMClcclxuICAgICAgICAgICAgICAgIHJldHVybiBVWkVSTztcclxuICAgICAgICAgICAgaWYgKHZhbHVlID49IFRXT19QV1JfNjRfREJMKVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIE1BWF9VTlNJR05FRF9WQUxVRTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAodmFsdWUgPD0gLVRXT19QV1JfNjNfREJMKVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIE1JTl9WQUxVRTtcclxuICAgICAgICAgICAgaWYgKHZhbHVlICsgMSA+PSBUV09fUFdSXzYzX0RCTClcclxuICAgICAgICAgICAgICAgIHJldHVybiBNQVhfVkFMVUU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh2YWx1ZSA8IDApXHJcbiAgICAgICAgICAgIHJldHVybiBmcm9tTnVtYmVyKC12YWx1ZSwgdW5zaWduZWQpLm5lZygpO1xyXG4gICAgICAgIHJldHVybiBmcm9tQml0cygodmFsdWUgJSBUV09fUFdSXzMyX0RCTCkgfCAwLCAodmFsdWUgLyBUV09fUFdSXzMyX0RCTCkgfCAwLCB1bnNpZ25lZCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGEgTG9uZyByZXByZXNlbnRpbmcgdGhlIGdpdmVuIHZhbHVlLCBwcm92aWRlZCB0aGF0IGl0IGlzIGEgZmluaXRlIG51bWJlci4gT3RoZXJ3aXNlLCB6ZXJvIGlzIHJldHVybmVkLlxyXG4gICAgICogQGZ1bmN0aW9uXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgVGhlIG51bWJlciBpbiBxdWVzdGlvblxyXG4gICAgICogQHBhcmFtIHtib29sZWFuPX0gdW5zaWduZWQgV2hldGhlciB1bnNpZ25lZCBvciBub3QsIGRlZmF1bHRzIHRvIGBmYWxzZWAgZm9yIHNpZ25lZFxyXG4gICAgICogQHJldHVybnMgeyFMb25nfSBUaGUgY29ycmVzcG9uZGluZyBMb25nIHZhbHVlXHJcbiAgICAgKi9cclxuICAgIExvbmcuZnJvbU51bWJlciA9IGZyb21OdW1iZXI7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbG93Qml0c1xyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGhpZ2hCaXRzXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW49fSB1bnNpZ25lZFxyXG4gICAgICogQHJldHVybnMgeyFMb25nfVxyXG4gICAgICogQGlubmVyXHJcbiAgICAgKi9cclxuICAgIGZ1bmN0aW9uIGZyb21CaXRzKGxvd0JpdHMsIGhpZ2hCaXRzLCB1bnNpZ25lZCkge1xyXG4gICAgICAgIHJldHVybiBuZXcgTG9uZyhsb3dCaXRzLCBoaWdoQml0cywgdW5zaWduZWQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIExvbmcgcmVwcmVzZW50aW5nIHRoZSA2NCBiaXQgaW50ZWdlciB0aGF0IGNvbWVzIGJ5IGNvbmNhdGVuYXRpbmcgdGhlIGdpdmVuIGxvdyBhbmQgaGlnaCBiaXRzLiBFYWNoIGlzXHJcbiAgICAgKiAgYXNzdW1lZCB0byB1c2UgMzIgYml0cy5cclxuICAgICAqIEBmdW5jdGlvblxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGxvd0JpdHMgVGhlIGxvdyAzMiBiaXRzXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gaGlnaEJpdHMgVGhlIGhpZ2ggMzIgYml0c1xyXG4gICAgICogQHBhcmFtIHtib29sZWFuPX0gdW5zaWduZWQgV2hldGhlciB1bnNpZ25lZCBvciBub3QsIGRlZmF1bHRzIHRvIGBmYWxzZWAgZm9yIHNpZ25lZFxyXG4gICAgICogQHJldHVybnMgeyFMb25nfSBUaGUgY29ycmVzcG9uZGluZyBMb25nIHZhbHVlXHJcbiAgICAgKi9cclxuICAgIExvbmcuZnJvbUJpdHMgPSBmcm9tQml0cztcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBmdW5jdGlvblxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGJhc2VcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBleHBvbmVudFxyXG4gICAgICogQHJldHVybnMge251bWJlcn1cclxuICAgICAqIEBpbm5lclxyXG4gICAgICovXHJcbiAgICB2YXIgcG93X2RibCA9IE1hdGgucG93OyAvLyBVc2VkIDQgdGltZXMgKDQqOCB0byAxNSs0KVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHN0clxyXG4gICAgICogQHBhcmFtIHsoYm9vbGVhbnxudW1iZXIpPX0gdW5zaWduZWRcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyPX0gcmFkaXhcclxuICAgICAqIEByZXR1cm5zIHshTG9uZ31cclxuICAgICAqIEBpbm5lclxyXG4gICAgICovXHJcbiAgICBmdW5jdGlvbiBmcm9tU3RyaW5nKHN0ciwgdW5zaWduZWQsIHJhZGl4KSB7XHJcbiAgICAgICAgaWYgKHN0ci5sZW5ndGggPT09IDApXHJcbiAgICAgICAgICAgIHRocm93IEVycm9yKCdlbXB0eSBzdHJpbmcnKTtcclxuICAgICAgICBpZiAoc3RyID09PSBcIk5hTlwiIHx8IHN0ciA9PT0gXCJJbmZpbml0eVwiIHx8IHN0ciA9PT0gXCIrSW5maW5pdHlcIiB8fCBzdHIgPT09IFwiLUluZmluaXR5XCIpXHJcbiAgICAgICAgICAgIHJldHVybiBaRVJPO1xyXG4gICAgICAgIGlmICh0eXBlb2YgdW5zaWduZWQgPT09ICdudW1iZXInKSB7XHJcbiAgICAgICAgICAgIC8vIEZvciBnb29nLm1hdGgubG9uZyBjb21wYXRpYmlsaXR5XHJcbiAgICAgICAgICAgIHJhZGl4ID0gdW5zaWduZWQsXHJcbiAgICAgICAgICAgIHVuc2lnbmVkID0gZmFsc2U7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdW5zaWduZWQgPSAhISB1bnNpZ25lZDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmFkaXggPSByYWRpeCB8fCAxMDtcclxuICAgICAgICBpZiAocmFkaXggPCAyIHx8IDM2IDwgcmFkaXgpXHJcbiAgICAgICAgICAgIHRocm93IFJhbmdlRXJyb3IoJ3JhZGl4Jyk7XHJcblxyXG4gICAgICAgIHZhciBwO1xyXG4gICAgICAgIGlmICgocCA9IHN0ci5pbmRleE9mKCctJykpID4gMClcclxuICAgICAgICAgICAgdGhyb3cgRXJyb3IoJ2ludGVyaW9yIGh5cGhlbicpO1xyXG4gICAgICAgIGVsc2UgaWYgKHAgPT09IDApIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZyb21TdHJpbmcoc3RyLnN1YnN0cmluZygxKSwgdW5zaWduZWQsIHJhZGl4KS5uZWcoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIERvIHNldmVyYWwgKDgpIGRpZ2l0cyBlYWNoIHRpbWUgdGhyb3VnaCB0aGUgbG9vcCwgc28gYXMgdG9cclxuICAgICAgICAvLyBtaW5pbWl6ZSB0aGUgY2FsbHMgdG8gdGhlIHZlcnkgZXhwZW5zaXZlIGVtdWxhdGVkIGRpdi5cclxuICAgICAgICB2YXIgcmFkaXhUb1Bvd2VyID0gZnJvbU51bWJlcihwb3dfZGJsKHJhZGl4LCA4KSk7XHJcblxyXG4gICAgICAgIHZhciByZXN1bHQgPSBaRVJPO1xyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgaSArPSA4KSB7XHJcbiAgICAgICAgICAgIHZhciBzaXplID0gTWF0aC5taW4oOCwgc3RyLmxlbmd0aCAtIGkpLFxyXG4gICAgICAgICAgICAgICAgdmFsdWUgPSBwYXJzZUludChzdHIuc3Vic3RyaW5nKGksIGkgKyBzaXplKSwgcmFkaXgpO1xyXG4gICAgICAgICAgICBpZiAoc2l6ZSA8IDgpIHtcclxuICAgICAgICAgICAgICAgIHZhciBwb3dlciA9IGZyb21OdW1iZXIocG93X2RibChyYWRpeCwgc2l6ZSkpO1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0Lm11bChwb3dlcikuYWRkKGZyb21OdW1iZXIodmFsdWUpKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC5tdWwocmFkaXhUb1Bvd2VyKTtcclxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC5hZGQoZnJvbU51bWJlcih2YWx1ZSkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJlc3VsdC51bnNpZ25lZCA9IHVuc2lnbmVkO1xyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGEgTG9uZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgZ2l2ZW4gc3RyaW5nLCB3cml0dGVuIHVzaW5nIHRoZSBzcGVjaWZpZWQgcmFkaXguXHJcbiAgICAgKiBAZnVuY3Rpb25cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzdHIgVGhlIHRleHR1YWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIExvbmdcclxuICAgICAqIEBwYXJhbSB7KGJvb2xlYW58bnVtYmVyKT19IHVuc2lnbmVkIFdoZXRoZXIgdW5zaWduZWQgb3Igbm90LCBkZWZhdWx0cyB0byBgZmFsc2VgIGZvciBzaWduZWRcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyPX0gcmFkaXggVGhlIHJhZGl4IGluIHdoaWNoIHRoZSB0ZXh0IGlzIHdyaXR0ZW4gKDItMzYpLCBkZWZhdWx0cyB0byAxMFxyXG4gICAgICogQHJldHVybnMgeyFMb25nfSBUaGUgY29ycmVzcG9uZGluZyBMb25nIHZhbHVlXHJcbiAgICAgKi9cclxuICAgIExvbmcuZnJvbVN0cmluZyA9IGZyb21TdHJpbmc7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZnVuY3Rpb25cclxuICAgICAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfHN0cmluZ3whe2xvdzogbnVtYmVyLCBoaWdoOiBudW1iZXIsIHVuc2lnbmVkOiBib29sZWFufX0gdmFsXHJcbiAgICAgKiBAcmV0dXJucyB7IUxvbmd9XHJcbiAgICAgKiBAaW5uZXJcclxuICAgICAqL1xyXG4gICAgZnVuY3Rpb24gZnJvbVZhbHVlKHZhbCkge1xyXG4gICAgICAgIGlmICh2YWwgLyogaXMgY29tcGF0aWJsZSAqLyBpbnN0YW5jZW9mIExvbmcpXHJcbiAgICAgICAgICAgIHJldHVybiB2YWw7XHJcbiAgICAgICAgaWYgKHR5cGVvZiB2YWwgPT09ICdudW1iZXInKVxyXG4gICAgICAgICAgICByZXR1cm4gZnJvbU51bWJlcih2YWwpO1xyXG4gICAgICAgIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJylcclxuICAgICAgICAgICAgcmV0dXJuIGZyb21TdHJpbmcodmFsKTtcclxuICAgICAgICAvLyBUaHJvd3MgZm9yIG5vbi1vYmplY3RzLCBjb252ZXJ0cyBub24taW5zdGFuY2VvZiBMb25nOlxyXG4gICAgICAgIHJldHVybiBmcm9tQml0cyh2YWwubG93LCB2YWwuaGlnaCwgdmFsLnVuc2lnbmVkKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENvbnZlcnRzIHRoZSBzcGVjaWZpZWQgdmFsdWUgdG8gYSBMb25nLlxyXG4gICAgICogQGZ1bmN0aW9uXHJcbiAgICAgKiBAcGFyYW0geyFMb25nfG51bWJlcnxzdHJpbmd8IXtsb3c6IG51bWJlciwgaGlnaDogbnVtYmVyLCB1bnNpZ25lZDogYm9vbGVhbn19IHZhbCBWYWx1ZVxyXG4gICAgICogQHJldHVybnMgeyFMb25nfVxyXG4gICAgICovXHJcbiAgICBMb25nLmZyb21WYWx1ZSA9IGZyb21WYWx1ZTtcclxuXHJcbiAgICAvLyBOT1RFOiB0aGUgY29tcGlsZXIgc2hvdWxkIGlubGluZSB0aGVzZSBjb25zdGFudCB2YWx1ZXMgYmVsb3cgYW5kIHRoZW4gcmVtb3ZlIHRoZXNlIHZhcmlhYmxlcywgc28gdGhlcmUgc2hvdWxkIGJlXHJcbiAgICAvLyBubyBydW50aW1lIHBlbmFsdHkgZm9yIHRoZXNlLlxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAqIEBjb25zdFxyXG4gICAgICogQGlubmVyXHJcbiAgICAgKi9cclxuICAgIHZhciBUV09fUFdSXzE2X0RCTCA9IDEgPDwgMTY7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICogQGNvbnN0XHJcbiAgICAgKiBAaW5uZXJcclxuICAgICAqL1xyXG4gICAgdmFyIFRXT19QV1JfMjRfREJMID0gMSA8PCAyNDtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgKiBAY29uc3RcclxuICAgICAqIEBpbm5lclxyXG4gICAgICovXHJcbiAgICB2YXIgVFdPX1BXUl8zMl9EQkwgPSBUV09fUFdSXzE2X0RCTCAqIFRXT19QV1JfMTZfREJMO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAqIEBjb25zdFxyXG4gICAgICogQGlubmVyXHJcbiAgICAgKi9cclxuICAgIHZhciBUV09fUFdSXzY0X0RCTCA9IFRXT19QV1JfMzJfREJMICogVFdPX1BXUl8zMl9EQkw7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICogQGNvbnN0XHJcbiAgICAgKiBAaW5uZXJcclxuICAgICAqL1xyXG4gICAgdmFyIFRXT19QV1JfNjNfREJMID0gVFdPX1BXUl82NF9EQkwgLyAyO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHR5cGUgeyFMb25nfVxyXG4gICAgICogQGNvbnN0XHJcbiAgICAgKiBAaW5uZXJcclxuICAgICAqL1xyXG4gICAgdmFyIFRXT19QV1JfMjQgPSBmcm9tSW50KFRXT19QV1JfMjRfREJMKTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEB0eXBlIHshTG9uZ31cclxuICAgICAqIEBpbm5lclxyXG4gICAgICovXHJcbiAgICB2YXIgWkVSTyA9IGZyb21JbnQoMCk7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTaWduZWQgemVyby5cclxuICAgICAqIEB0eXBlIHshTG9uZ31cclxuICAgICAqL1xyXG4gICAgTG9uZy5aRVJPID0gWkVSTztcclxuXHJcbiAgICAvKipcclxuICAgICAqIEB0eXBlIHshTG9uZ31cclxuICAgICAqIEBpbm5lclxyXG4gICAgICovXHJcbiAgICB2YXIgVVpFUk8gPSBmcm9tSW50KDAsIHRydWUpO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVW5zaWduZWQgemVyby5cclxuICAgICAqIEB0eXBlIHshTG9uZ31cclxuICAgICAqL1xyXG4gICAgTG9uZy5VWkVSTyA9IFVaRVJPO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHR5cGUgeyFMb25nfVxyXG4gICAgICogQGlubmVyXHJcbiAgICAgKi9cclxuICAgIHZhciBPTkUgPSBmcm9tSW50KDEpO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2lnbmVkIG9uZS5cclxuICAgICAqIEB0eXBlIHshTG9uZ31cclxuICAgICAqL1xyXG4gICAgTG9uZy5PTkUgPSBPTkU7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAdHlwZSB7IUxvbmd9XHJcbiAgICAgKiBAaW5uZXJcclxuICAgICAqL1xyXG4gICAgdmFyIFVPTkUgPSBmcm9tSW50KDEsIHRydWUpO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVW5zaWduZWQgb25lLlxyXG4gICAgICogQHR5cGUgeyFMb25nfVxyXG4gICAgICovXHJcbiAgICBMb25nLlVPTkUgPSBVT05FO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHR5cGUgeyFMb25nfVxyXG4gICAgICogQGlubmVyXHJcbiAgICAgKi9cclxuICAgIHZhciBORUdfT05FID0gZnJvbUludCgtMSk7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTaWduZWQgbmVnYXRpdmUgb25lLlxyXG4gICAgICogQHR5cGUgeyFMb25nfVxyXG4gICAgICovXHJcbiAgICBMb25nLk5FR19PTkUgPSBORUdfT05FO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHR5cGUgeyFMb25nfVxyXG4gICAgICogQGlubmVyXHJcbiAgICAgKi9cclxuICAgIHZhciBNQVhfVkFMVUUgPSBmcm9tQml0cygweEZGRkZGRkZGfDAsIDB4N0ZGRkZGRkZ8MCwgZmFsc2UpO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogTWF4aW11bSBzaWduZWQgdmFsdWUuXHJcbiAgICAgKiBAdHlwZSB7IUxvbmd9XHJcbiAgICAgKi9cclxuICAgIExvbmcuTUFYX1ZBTFVFID0gTUFYX1ZBTFVFO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHR5cGUgeyFMb25nfVxyXG4gICAgICogQGlubmVyXHJcbiAgICAgKi9cclxuICAgIHZhciBNQVhfVU5TSUdORURfVkFMVUUgPSBmcm9tQml0cygweEZGRkZGRkZGfDAsIDB4RkZGRkZGRkZ8MCwgdHJ1ZSk7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBNYXhpbXVtIHVuc2lnbmVkIHZhbHVlLlxyXG4gICAgICogQHR5cGUgeyFMb25nfVxyXG4gICAgICovXHJcbiAgICBMb25nLk1BWF9VTlNJR05FRF9WQUxVRSA9IE1BWF9VTlNJR05FRF9WQUxVRTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEB0eXBlIHshTG9uZ31cclxuICAgICAqIEBpbm5lclxyXG4gICAgICovXHJcbiAgICB2YXIgTUlOX1ZBTFVFID0gZnJvbUJpdHMoMCwgMHg4MDAwMDAwMHwwLCBmYWxzZSk7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBNaW5pbXVtIHNpZ25lZCB2YWx1ZS5cclxuICAgICAqIEB0eXBlIHshTG9uZ31cclxuICAgICAqL1xyXG4gICAgTG9uZy5NSU5fVkFMVUUgPSBNSU5fVkFMVUU7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAYWxpYXMgTG9uZy5wcm90b3R5cGVcclxuICAgICAqIEBpbm5lclxyXG4gICAgICovXHJcbiAgICB2YXIgTG9uZ1Byb3RvdHlwZSA9IExvbmcucHJvdG90eXBlO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29udmVydHMgdGhlIExvbmcgdG8gYSAzMiBiaXQgaW50ZWdlciwgYXNzdW1pbmcgaXQgaXMgYSAzMiBiaXQgaW50ZWdlci5cclxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9XHJcbiAgICAgKi9cclxuICAgIExvbmdQcm90b3R5cGUudG9JbnQgPSBmdW5jdGlvbiB0b0ludCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy51bnNpZ25lZCA/IHRoaXMubG93ID4+PiAwIDogdGhpcy5sb3c7XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29udmVydHMgdGhlIExvbmcgdG8gYSB0aGUgbmVhcmVzdCBmbG9hdGluZy1wb2ludCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHZhbHVlIChkb3VibGUsIDUzIGJpdCBtYW50aXNzYSkuXHJcbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfVxyXG4gICAgICovXHJcbiAgICBMb25nUHJvdG90eXBlLnRvTnVtYmVyID0gZnVuY3Rpb24gdG9OdW1iZXIoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMudW5zaWduZWQpXHJcbiAgICAgICAgICAgIHJldHVybiAoKHRoaXMuaGlnaCA+Pj4gMCkgKiBUV09fUFdSXzMyX0RCTCkgKyAodGhpcy5sb3cgPj4+IDApO1xyXG4gICAgICAgIHJldHVybiB0aGlzLmhpZ2ggKiBUV09fUFdSXzMyX0RCTCArICh0aGlzLmxvdyA+Pj4gMCk7XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29udmVydHMgdGhlIExvbmcgdG8gYSBzdHJpbmcgd3JpdHRlbiBpbiB0aGUgc3BlY2lmaWVkIHJhZGl4LlxyXG4gICAgICogQHBhcmFtIHtudW1iZXI9fSByYWRpeCBSYWRpeCAoMi0zNiksIGRlZmF1bHRzIHRvIDEwXHJcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfVxyXG4gICAgICogQG92ZXJyaWRlXHJcbiAgICAgKiBAdGhyb3dzIHtSYW5nZUVycm9yfSBJZiBgcmFkaXhgIGlzIG91dCBvZiByYW5nZVxyXG4gICAgICovXHJcbiAgICBMb25nUHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcocmFkaXgpIHtcclxuICAgICAgICByYWRpeCA9IHJhZGl4IHx8IDEwO1xyXG4gICAgICAgIGlmIChyYWRpeCA8IDIgfHwgMzYgPCByYWRpeClcclxuICAgICAgICAgICAgdGhyb3cgUmFuZ2VFcnJvcigncmFkaXgnKTtcclxuICAgICAgICBpZiAodGhpcy5pc1plcm8oKSlcclxuICAgICAgICAgICAgcmV0dXJuICcwJztcclxuICAgICAgICBpZiAodGhpcy5pc05lZ2F0aXZlKCkpIHsgLy8gVW5zaWduZWQgTG9uZ3MgYXJlIG5ldmVyIG5lZ2F0aXZlXHJcbiAgICAgICAgICAgIGlmICh0aGlzLmVxKE1JTl9WQUxVRSkpIHtcclxuICAgICAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8gY2hhbmdlIHRoZSBMb25nIHZhbHVlIGJlZm9yZSBpdCBjYW4gYmUgbmVnYXRlZCwgc28gd2UgcmVtb3ZlXHJcbiAgICAgICAgICAgICAgICAvLyB0aGUgYm90dG9tLW1vc3QgZGlnaXQgaW4gdGhpcyBiYXNlIGFuZCB0aGVuIHJlY3Vyc2UgdG8gZG8gdGhlIHJlc3QuXHJcbiAgICAgICAgICAgICAgICB2YXIgcmFkaXhMb25nID0gZnJvbU51bWJlcihyYWRpeCksXHJcbiAgICAgICAgICAgICAgICAgICAgZGl2ID0gdGhpcy5kaXYocmFkaXhMb25nKSxcclxuICAgICAgICAgICAgICAgICAgICByZW0xID0gZGl2Lm11bChyYWRpeExvbmcpLnN1Yih0aGlzKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBkaXYudG9TdHJpbmcocmFkaXgpICsgcmVtMS50b0ludCgpLnRvU3RyaW5nKHJhZGl4KTtcclxuICAgICAgICAgICAgfSBlbHNlXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gJy0nICsgdGhpcy5uZWcoKS50b1N0cmluZyhyYWRpeCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBEbyBzZXZlcmFsICg2KSBkaWdpdHMgZWFjaCB0aW1lIHRocm91Z2ggdGhlIGxvb3AsIHNvIGFzIHRvXHJcbiAgICAgICAgLy8gbWluaW1pemUgdGhlIGNhbGxzIHRvIHRoZSB2ZXJ5IGV4cGVuc2l2ZSBlbXVsYXRlZCBkaXYuXHJcbiAgICAgICAgdmFyIHJhZGl4VG9Qb3dlciA9IGZyb21OdW1iZXIocG93X2RibChyYWRpeCwgNiksIHRoaXMudW5zaWduZWQpLFxyXG4gICAgICAgICAgICByZW0gPSB0aGlzO1xyXG4gICAgICAgIHZhciByZXN1bHQgPSAnJztcclxuICAgICAgICB3aGlsZSAodHJ1ZSkge1xyXG4gICAgICAgICAgICB2YXIgcmVtRGl2ID0gcmVtLmRpdihyYWRpeFRvUG93ZXIpLFxyXG4gICAgICAgICAgICAgICAgaW50dmFsID0gcmVtLnN1YihyZW1EaXYubXVsKHJhZGl4VG9Qb3dlcikpLnRvSW50KCkgPj4+IDAsXHJcbiAgICAgICAgICAgICAgICBkaWdpdHMgPSBpbnR2YWwudG9TdHJpbmcocmFkaXgpO1xyXG4gICAgICAgICAgICByZW0gPSByZW1EaXY7XHJcbiAgICAgICAgICAgIGlmIChyZW0uaXNaZXJvKCkpXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZGlnaXRzICsgcmVzdWx0O1xyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHdoaWxlIChkaWdpdHMubGVuZ3RoIDwgNilcclxuICAgICAgICAgICAgICAgICAgICBkaWdpdHMgPSAnMCcgKyBkaWdpdHM7XHJcbiAgICAgICAgICAgICAgICByZXN1bHQgPSAnJyArIGRpZ2l0cyArIHJlc3VsdDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIHRoZSBoaWdoIDMyIGJpdHMgYXMgYSBzaWduZWQgaW50ZWdlci5cclxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFNpZ25lZCBoaWdoIGJpdHNcclxuICAgICAqL1xyXG4gICAgTG9uZ1Byb3RvdHlwZS5nZXRIaWdoQml0cyA9IGZ1bmN0aW9uIGdldEhpZ2hCaXRzKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmhpZ2g7XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyB0aGUgaGlnaCAzMiBiaXRzIGFzIGFuIHVuc2lnbmVkIGludGVnZXIuXHJcbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBVbnNpZ25lZCBoaWdoIGJpdHNcclxuICAgICAqL1xyXG4gICAgTG9uZ1Byb3RvdHlwZS5nZXRIaWdoQml0c1Vuc2lnbmVkID0gZnVuY3Rpb24gZ2V0SGlnaEJpdHNVbnNpZ25lZCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5oaWdoID4+PiAwO1xyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgdGhlIGxvdyAzMiBiaXRzIGFzIGEgc2lnbmVkIGludGVnZXIuXHJcbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBTaWduZWQgbG93IGJpdHNcclxuICAgICAqL1xyXG4gICAgTG9uZ1Byb3RvdHlwZS5nZXRMb3dCaXRzID0gZnVuY3Rpb24gZ2V0TG93Qml0cygpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5sb3c7XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyB0aGUgbG93IDMyIGJpdHMgYXMgYW4gdW5zaWduZWQgaW50ZWdlci5cclxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFVuc2lnbmVkIGxvdyBiaXRzXHJcbiAgICAgKi9cclxuICAgIExvbmdQcm90b3R5cGUuZ2V0TG93Qml0c1Vuc2lnbmVkID0gZnVuY3Rpb24gZ2V0TG93Qml0c1Vuc2lnbmVkKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmxvdyA+Pj4gMDtcclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIHRoZSBudW1iZXIgb2YgYml0cyBuZWVkZWQgdG8gcmVwcmVzZW50IHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiB0aGlzIExvbmcuXHJcbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfVxyXG4gICAgICovXHJcbiAgICBMb25nUHJvdG90eXBlLmdldE51bUJpdHNBYnMgPSBmdW5jdGlvbiBnZXROdW1CaXRzQWJzKCkge1xyXG4gICAgICAgIGlmICh0aGlzLmlzTmVnYXRpdmUoKSkgLy8gVW5zaWduZWQgTG9uZ3MgYXJlIG5ldmVyIG5lZ2F0aXZlXHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmVxKE1JTl9WQUxVRSkgPyA2NCA6IHRoaXMubmVnKCkuZ2V0TnVtQml0c0FicygpO1xyXG4gICAgICAgIHZhciB2YWwgPSB0aGlzLmhpZ2ggIT0gMCA/IHRoaXMuaGlnaCA6IHRoaXMubG93O1xyXG4gICAgICAgIGZvciAodmFyIGJpdCA9IDMxOyBiaXQgPiAwOyBiaXQtLSlcclxuICAgICAgICAgICAgaWYgKCh2YWwgJiAoMSA8PCBiaXQpKSAhPSAwKVxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaGlnaCAhPSAwID8gYml0ICsgMzMgOiBiaXQgKyAxO1xyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRlc3RzIGlmIHRoaXMgTG9uZydzIHZhbHVlIGVxdWFscyB6ZXJvLlxyXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XHJcbiAgICAgKi9cclxuICAgIExvbmdQcm90b3R5cGUuaXNaZXJvID0gZnVuY3Rpb24gaXNaZXJvKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmhpZ2ggPT09IDAgJiYgdGhpcy5sb3cgPT09IDA7XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGVzdHMgaWYgdGhpcyBMb25nJ3MgdmFsdWUgaXMgbmVnYXRpdmUuXHJcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cclxuICAgICAqL1xyXG4gICAgTG9uZ1Byb3RvdHlwZS5pc05lZ2F0aXZlID0gZnVuY3Rpb24gaXNOZWdhdGl2ZSgpIHtcclxuICAgICAgICByZXR1cm4gIXRoaXMudW5zaWduZWQgJiYgdGhpcy5oaWdoIDwgMDtcclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUZXN0cyBpZiB0aGlzIExvbmcncyB2YWx1ZSBpcyBwb3NpdGl2ZS5cclxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxyXG4gICAgICovXHJcbiAgICBMb25nUHJvdG90eXBlLmlzUG9zaXRpdmUgPSBmdW5jdGlvbiBpc1Bvc2l0aXZlKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnVuc2lnbmVkIHx8IHRoaXMuaGlnaCA+PSAwO1xyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRlc3RzIGlmIHRoaXMgTG9uZydzIHZhbHVlIGlzIG9kZC5cclxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxyXG4gICAgICovXHJcbiAgICBMb25nUHJvdG90eXBlLmlzT2RkID0gZnVuY3Rpb24gaXNPZGQoKSB7XHJcbiAgICAgICAgcmV0dXJuICh0aGlzLmxvdyAmIDEpID09PSAxO1xyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRlc3RzIGlmIHRoaXMgTG9uZydzIHZhbHVlIGlzIGV2ZW4uXHJcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cclxuICAgICAqL1xyXG4gICAgTG9uZ1Byb3RvdHlwZS5pc0V2ZW4gPSBmdW5jdGlvbiBpc0V2ZW4oKSB7XHJcbiAgICAgICAgcmV0dXJuICh0aGlzLmxvdyAmIDEpID09PSAwO1xyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRlc3RzIGlmIHRoaXMgTG9uZydzIHZhbHVlIGVxdWFscyB0aGUgc3BlY2lmaWVkJ3MuXHJcbiAgICAgKiBAcGFyYW0geyFMb25nfG51bWJlcnxzdHJpbmd9IG90aGVyIE90aGVyIHZhbHVlXHJcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cclxuICAgICAqL1xyXG4gICAgTG9uZ1Byb3RvdHlwZS5lcXVhbHMgPSBmdW5jdGlvbiBlcXVhbHMob3RoZXIpIHtcclxuICAgICAgICBpZiAoIWlzTG9uZyhvdGhlcikpXHJcbiAgICAgICAgICAgIG90aGVyID0gZnJvbVZhbHVlKG90aGVyKTtcclxuICAgICAgICBpZiAodGhpcy51bnNpZ25lZCAhPT0gb3RoZXIudW5zaWduZWQgJiYgKHRoaXMuaGlnaCA+Pj4gMzEpID09PSAxICYmIChvdGhlci5oaWdoID4+PiAzMSkgPT09IDEpXHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICByZXR1cm4gdGhpcy5oaWdoID09PSBvdGhlci5oaWdoICYmIHRoaXMubG93ID09PSBvdGhlci5sb3c7XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGVzdHMgaWYgdGhpcyBMb25nJ3MgdmFsdWUgZXF1YWxzIHRoZSBzcGVjaWZpZWQncy4gVGhpcyBpcyBhbiBhbGlhcyBvZiB7QGxpbmsgTG9uZyNlcXVhbHN9LlxyXG4gICAgICogQGZ1bmN0aW9uXHJcbiAgICAgKiBAcGFyYW0geyFMb25nfG51bWJlcnxzdHJpbmd9IG90aGVyIE90aGVyIHZhbHVlXHJcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cclxuICAgICAqL1xyXG4gICAgTG9uZ1Byb3RvdHlwZS5lcSA9IExvbmdQcm90b3R5cGUuZXF1YWxzO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGVzdHMgaWYgdGhpcyBMb25nJ3MgdmFsdWUgZGlmZmVycyBmcm9tIHRoZSBzcGVjaWZpZWQncy5cclxuICAgICAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfHN0cmluZ30gb3RoZXIgT3RoZXIgdmFsdWVcclxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxyXG4gICAgICovXHJcbiAgICBMb25nUHJvdG90eXBlLm5vdEVxdWFscyA9IGZ1bmN0aW9uIG5vdEVxdWFscyhvdGhlcikge1xyXG4gICAgICAgIHJldHVybiAhdGhpcy5lcSgvKiB2YWxpZGF0ZXMgKi8gb3RoZXIpO1xyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRlc3RzIGlmIHRoaXMgTG9uZydzIHZhbHVlIGRpZmZlcnMgZnJvbSB0aGUgc3BlY2lmaWVkJ3MuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjbm90RXF1YWxzfS5cclxuICAgICAqIEBmdW5jdGlvblxyXG4gICAgICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8c3RyaW5nfSBvdGhlciBPdGhlciB2YWx1ZVxyXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XHJcbiAgICAgKi9cclxuICAgIExvbmdQcm90b3R5cGUubmVxID0gTG9uZ1Byb3RvdHlwZS5ub3RFcXVhbHM7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUZXN0cyBpZiB0aGlzIExvbmcncyB2YWx1ZSBpcyBsZXNzIHRoYW4gdGhlIHNwZWNpZmllZCdzLlxyXG4gICAgICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8c3RyaW5nfSBvdGhlciBPdGhlciB2YWx1ZVxyXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XHJcbiAgICAgKi9cclxuICAgIExvbmdQcm90b3R5cGUubGVzc1RoYW4gPSBmdW5jdGlvbiBsZXNzVGhhbihvdGhlcikge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmNvbXAoLyogdmFsaWRhdGVzICovIG90aGVyKSA8IDA7XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGVzdHMgaWYgdGhpcyBMb25nJ3MgdmFsdWUgaXMgbGVzcyB0aGFuIHRoZSBzcGVjaWZpZWQncy4gVGhpcyBpcyBhbiBhbGlhcyBvZiB7QGxpbmsgTG9uZyNsZXNzVGhhbn0uXHJcbiAgICAgKiBAZnVuY3Rpb25cclxuICAgICAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfHN0cmluZ30gb3RoZXIgT3RoZXIgdmFsdWVcclxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxyXG4gICAgICovXHJcbiAgICBMb25nUHJvdG90eXBlLmx0ID0gTG9uZ1Byb3RvdHlwZS5sZXNzVGhhbjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRlc3RzIGlmIHRoaXMgTG9uZydzIHZhbHVlIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0aGUgc3BlY2lmaWVkJ3MuXHJcbiAgICAgKiBAcGFyYW0geyFMb25nfG51bWJlcnxzdHJpbmd9IG90aGVyIE90aGVyIHZhbHVlXHJcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cclxuICAgICAqL1xyXG4gICAgTG9uZ1Byb3RvdHlwZS5sZXNzVGhhbk9yRXF1YWwgPSBmdW5jdGlvbiBsZXNzVGhhbk9yRXF1YWwob3RoZXIpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5jb21wKC8qIHZhbGlkYXRlcyAqLyBvdGhlcikgPD0gMDtcclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUZXN0cyBpZiB0aGlzIExvbmcncyB2YWx1ZSBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdGhlIHNwZWNpZmllZCdzLiBUaGlzIGlzIGFuIGFsaWFzIG9mIHtAbGluayBMb25nI2xlc3NUaGFuT3JFcXVhbH0uXHJcbiAgICAgKiBAZnVuY3Rpb25cclxuICAgICAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfHN0cmluZ30gb3RoZXIgT3RoZXIgdmFsdWVcclxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxyXG4gICAgICovXHJcbiAgICBMb25nUHJvdG90eXBlLmx0ZSA9IExvbmdQcm90b3R5cGUubGVzc1RoYW5PckVxdWFsO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGVzdHMgaWYgdGhpcyBMb25nJ3MgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIHRoZSBzcGVjaWZpZWQncy5cclxuICAgICAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfHN0cmluZ30gb3RoZXIgT3RoZXIgdmFsdWVcclxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxyXG4gICAgICovXHJcbiAgICBMb25nUHJvdG90eXBlLmdyZWF0ZXJUaGFuID0gZnVuY3Rpb24gZ3JlYXRlclRoYW4ob3RoZXIpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5jb21wKC8qIHZhbGlkYXRlcyAqLyBvdGhlcikgPiAwO1xyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRlc3RzIGlmIHRoaXMgTG9uZydzIHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkJ3MuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjZ3JlYXRlclRoYW59LlxyXG4gICAgICogQGZ1bmN0aW9uXHJcbiAgICAgKiBAcGFyYW0geyFMb25nfG51bWJlcnxzdHJpbmd9IG90aGVyIE90aGVyIHZhbHVlXHJcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cclxuICAgICAqL1xyXG4gICAgTG9uZ1Byb3RvdHlwZS5ndCA9IExvbmdQcm90b3R5cGUuZ3JlYXRlclRoYW47XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUZXN0cyBpZiB0aGlzIExvbmcncyB2YWx1ZSBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdGhlIHNwZWNpZmllZCdzLlxyXG4gICAgICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8c3RyaW5nfSBvdGhlciBPdGhlciB2YWx1ZVxyXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XHJcbiAgICAgKi9cclxuICAgIExvbmdQcm90b3R5cGUuZ3JlYXRlclRoYW5PckVxdWFsID0gZnVuY3Rpb24gZ3JlYXRlclRoYW5PckVxdWFsKG90aGVyKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY29tcCgvKiB2YWxpZGF0ZXMgKi8gb3RoZXIpID49IDA7XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGVzdHMgaWYgdGhpcyBMb25nJ3MgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRoZSBzcGVjaWZpZWQncy4gVGhpcyBpcyBhbiBhbGlhcyBvZiB7QGxpbmsgTG9uZyNncmVhdGVyVGhhbk9yRXF1YWx9LlxyXG4gICAgICogQGZ1bmN0aW9uXHJcbiAgICAgKiBAcGFyYW0geyFMb25nfG51bWJlcnxzdHJpbmd9IG90aGVyIE90aGVyIHZhbHVlXHJcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cclxuICAgICAqL1xyXG4gICAgTG9uZ1Byb3RvdHlwZS5ndGUgPSBMb25nUHJvdG90eXBlLmdyZWF0ZXJUaGFuT3JFcXVhbDtcclxuXHJcbiAgICAvKipcclxuICAgICAqIENvbXBhcmVzIHRoaXMgTG9uZydzIHZhbHVlIHdpdGggdGhlIHNwZWNpZmllZCdzLlxyXG4gICAgICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8c3RyaW5nfSBvdGhlciBPdGhlciB2YWx1ZVxyXG4gICAgICogQHJldHVybnMge251bWJlcn0gMCBpZiB0aGV5IGFyZSB0aGUgc2FtZSwgMSBpZiB0aGUgdGhpcyBpcyBncmVhdGVyIGFuZCAtMVxyXG4gICAgICogIGlmIHRoZSBnaXZlbiBvbmUgaXMgZ3JlYXRlclxyXG4gICAgICovXHJcbiAgICBMb25nUHJvdG90eXBlLmNvbXBhcmUgPSBmdW5jdGlvbiBjb21wYXJlKG90aGVyKSB7XHJcbiAgICAgICAgaWYgKCFpc0xvbmcob3RoZXIpKVxyXG4gICAgICAgICAgICBvdGhlciA9IGZyb21WYWx1ZShvdGhlcik7XHJcbiAgICAgICAgaWYgKHRoaXMuZXEob3RoZXIpKVxyXG4gICAgICAgICAgICByZXR1cm4gMDtcclxuICAgICAgICB2YXIgdGhpc05lZyA9IHRoaXMuaXNOZWdhdGl2ZSgpLFxyXG4gICAgICAgICAgICBvdGhlck5lZyA9IG90aGVyLmlzTmVnYXRpdmUoKTtcclxuICAgICAgICBpZiAodGhpc05lZyAmJiAhb3RoZXJOZWcpXHJcbiAgICAgICAgICAgIHJldHVybiAtMTtcclxuICAgICAgICBpZiAoIXRoaXNOZWcgJiYgb3RoZXJOZWcpXHJcbiAgICAgICAgICAgIHJldHVybiAxO1xyXG4gICAgICAgIC8vIEF0IHRoaXMgcG9pbnQgdGhlIHNpZ24gYml0cyBhcmUgdGhlIHNhbWVcclxuICAgICAgICBpZiAoIXRoaXMudW5zaWduZWQpXHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnN1YihvdGhlcikuaXNOZWdhdGl2ZSgpID8gLTEgOiAxO1xyXG4gICAgICAgIC8vIEJvdGggYXJlIHBvc2l0aXZlIGlmIGF0IGxlYXN0IG9uZSBpcyB1bnNpZ25lZFxyXG4gICAgICAgIHJldHVybiAob3RoZXIuaGlnaCA+Pj4gMCkgPiAodGhpcy5oaWdoID4+PiAwKSB8fCAob3RoZXIuaGlnaCA9PT0gdGhpcy5oaWdoICYmIChvdGhlci5sb3cgPj4+IDApID4gKHRoaXMubG93ID4+PiAwKSkgPyAtMSA6IDE7XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29tcGFyZXMgdGhpcyBMb25nJ3MgdmFsdWUgd2l0aCB0aGUgc3BlY2lmaWVkJ3MuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjY29tcGFyZX0uXHJcbiAgICAgKiBAZnVuY3Rpb25cclxuICAgICAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfHN0cmluZ30gb3RoZXIgT3RoZXIgdmFsdWVcclxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IDAgaWYgdGhleSBhcmUgdGhlIHNhbWUsIDEgaWYgdGhlIHRoaXMgaXMgZ3JlYXRlciBhbmQgLTFcclxuICAgICAqICBpZiB0aGUgZ2l2ZW4gb25lIGlzIGdyZWF0ZXJcclxuICAgICAqL1xyXG4gICAgTG9uZ1Byb3RvdHlwZS5jb21wID0gTG9uZ1Byb3RvdHlwZS5jb21wYXJlO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogTmVnYXRlcyB0aGlzIExvbmcncyB2YWx1ZS5cclxuICAgICAqIEByZXR1cm5zIHshTG9uZ30gTmVnYXRlZCBMb25nXHJcbiAgICAgKi9cclxuICAgIExvbmdQcm90b3R5cGUubmVnYXRlID0gZnVuY3Rpb24gbmVnYXRlKCkge1xyXG4gICAgICAgIGlmICghdGhpcy51bnNpZ25lZCAmJiB0aGlzLmVxKE1JTl9WQUxVRSkpXHJcbiAgICAgICAgICAgIHJldHVybiBNSU5fVkFMVUU7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubm90KCkuYWRkKE9ORSk7XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogTmVnYXRlcyB0aGlzIExvbmcncyB2YWx1ZS4gVGhpcyBpcyBhbiBhbGlhcyBvZiB7QGxpbmsgTG9uZyNuZWdhdGV9LlxyXG4gICAgICogQGZ1bmN0aW9uXHJcbiAgICAgKiBAcmV0dXJucyB7IUxvbmd9IE5lZ2F0ZWQgTG9uZ1xyXG4gICAgICovXHJcbiAgICBMb25nUHJvdG90eXBlLm5lZyA9IExvbmdQcm90b3R5cGUubmVnYXRlO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgc3VtIG9mIHRoaXMgYW5kIHRoZSBzcGVjaWZpZWQgTG9uZy5cclxuICAgICAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfHN0cmluZ30gYWRkZW5kIEFkZGVuZFxyXG4gICAgICogQHJldHVybnMgeyFMb25nfSBTdW1cclxuICAgICAqL1xyXG4gICAgTG9uZ1Byb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiBhZGQoYWRkZW5kKSB7XHJcbiAgICAgICAgaWYgKCFpc0xvbmcoYWRkZW5kKSlcclxuICAgICAgICAgICAgYWRkZW5kID0gZnJvbVZhbHVlKGFkZGVuZCk7XHJcblxyXG4gICAgICAgIC8vIERpdmlkZSBlYWNoIG51bWJlciBpbnRvIDQgY2h1bmtzIG9mIDE2IGJpdHMsIGFuZCB0aGVuIHN1bSB0aGUgY2h1bmtzLlxyXG5cclxuICAgICAgICB2YXIgYTQ4ID0gdGhpcy5oaWdoID4+PiAxNjtcclxuICAgICAgICB2YXIgYTMyID0gdGhpcy5oaWdoICYgMHhGRkZGO1xyXG4gICAgICAgIHZhciBhMTYgPSB0aGlzLmxvdyA+Pj4gMTY7XHJcbiAgICAgICAgdmFyIGEwMCA9IHRoaXMubG93ICYgMHhGRkZGO1xyXG5cclxuICAgICAgICB2YXIgYjQ4ID0gYWRkZW5kLmhpZ2ggPj4+IDE2O1xyXG4gICAgICAgIHZhciBiMzIgPSBhZGRlbmQuaGlnaCAmIDB4RkZGRjtcclxuICAgICAgICB2YXIgYjE2ID0gYWRkZW5kLmxvdyA+Pj4gMTY7XHJcbiAgICAgICAgdmFyIGIwMCA9IGFkZGVuZC5sb3cgJiAweEZGRkY7XHJcblxyXG4gICAgICAgIHZhciBjNDggPSAwLCBjMzIgPSAwLCBjMTYgPSAwLCBjMDAgPSAwO1xyXG4gICAgICAgIGMwMCArPSBhMDAgKyBiMDA7XHJcbiAgICAgICAgYzE2ICs9IGMwMCA+Pj4gMTY7XHJcbiAgICAgICAgYzAwICY9IDB4RkZGRjtcclxuICAgICAgICBjMTYgKz0gYTE2ICsgYjE2O1xyXG4gICAgICAgIGMzMiArPSBjMTYgPj4+IDE2O1xyXG4gICAgICAgIGMxNiAmPSAweEZGRkY7XHJcbiAgICAgICAgYzMyICs9IGEzMiArIGIzMjtcclxuICAgICAgICBjNDggKz0gYzMyID4+PiAxNjtcclxuICAgICAgICBjMzIgJj0gMHhGRkZGO1xyXG4gICAgICAgIGM0OCArPSBhNDggKyBiNDg7XHJcbiAgICAgICAgYzQ4ICY9IDB4RkZGRjtcclxuICAgICAgICByZXR1cm4gZnJvbUJpdHMoKGMxNiA8PCAxNikgfCBjMDAsIChjNDggPDwgMTYpIHwgYzMyLCB0aGlzLnVuc2lnbmVkKTtcclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBkaWZmZXJlbmNlIG9mIHRoaXMgYW5kIHRoZSBzcGVjaWZpZWQgTG9uZy5cclxuICAgICAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfHN0cmluZ30gc3VidHJhaGVuZCBTdWJ0cmFoZW5kXHJcbiAgICAgKiBAcmV0dXJucyB7IUxvbmd9IERpZmZlcmVuY2VcclxuICAgICAqL1xyXG4gICAgTG9uZ1Byb3RvdHlwZS5zdWJ0cmFjdCA9IGZ1bmN0aW9uIHN1YnRyYWN0KHN1YnRyYWhlbmQpIHtcclxuICAgICAgICBpZiAoIWlzTG9uZyhzdWJ0cmFoZW5kKSlcclxuICAgICAgICAgICAgc3VidHJhaGVuZCA9IGZyb21WYWx1ZShzdWJ0cmFoZW5kKTtcclxuICAgICAgICByZXR1cm4gdGhpcy5hZGQoc3VidHJhaGVuZC5uZWcoKSk7XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgZGlmZmVyZW5jZSBvZiB0aGlzIGFuZCB0aGUgc3BlY2lmaWVkIExvbmcuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjc3VidHJhY3R9LlxyXG4gICAgICogQGZ1bmN0aW9uXHJcbiAgICAgKiBAcGFyYW0geyFMb25nfG51bWJlcnxzdHJpbmd9IHN1YnRyYWhlbmQgU3VidHJhaGVuZFxyXG4gICAgICogQHJldHVybnMgeyFMb25nfSBEaWZmZXJlbmNlXHJcbiAgICAgKi9cclxuICAgIExvbmdQcm90b3R5cGUuc3ViID0gTG9uZ1Byb3RvdHlwZS5zdWJ0cmFjdDtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIHByb2R1Y3Qgb2YgdGhpcyBhbmQgdGhlIHNwZWNpZmllZCBMb25nLlxyXG4gICAgICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8c3RyaW5nfSBtdWx0aXBsaWVyIE11bHRpcGxpZXJcclxuICAgICAqIEByZXR1cm5zIHshTG9uZ30gUHJvZHVjdFxyXG4gICAgICovXHJcbiAgICBMb25nUHJvdG90eXBlLm11bHRpcGx5ID0gZnVuY3Rpb24gbXVsdGlwbHkobXVsdGlwbGllcikge1xyXG4gICAgICAgIGlmICh0aGlzLmlzWmVybygpKVxyXG4gICAgICAgICAgICByZXR1cm4gWkVSTztcclxuICAgICAgICBpZiAoIWlzTG9uZyhtdWx0aXBsaWVyKSlcclxuICAgICAgICAgICAgbXVsdGlwbGllciA9IGZyb21WYWx1ZShtdWx0aXBsaWVyKTtcclxuICAgICAgICBpZiAobXVsdGlwbGllci5pc1plcm8oKSlcclxuICAgICAgICAgICAgcmV0dXJuIFpFUk87XHJcbiAgICAgICAgaWYgKHRoaXMuZXEoTUlOX1ZBTFVFKSlcclxuICAgICAgICAgICAgcmV0dXJuIG11bHRpcGxpZXIuaXNPZGQoKSA/IE1JTl9WQUxVRSA6IFpFUk87XHJcbiAgICAgICAgaWYgKG11bHRpcGxpZXIuZXEoTUlOX1ZBTFVFKSlcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaXNPZGQoKSA/IE1JTl9WQUxVRSA6IFpFUk87XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmlzTmVnYXRpdmUoKSkge1xyXG4gICAgICAgICAgICBpZiAobXVsdGlwbGllci5pc05lZ2F0aXZlKCkpXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5uZWcoKS5tdWwobXVsdGlwbGllci5uZWcoKSk7XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm5lZygpLm11bChtdWx0aXBsaWVyKS5uZWcoKTtcclxuICAgICAgICB9IGVsc2UgaWYgKG11bHRpcGxpZXIuaXNOZWdhdGl2ZSgpKVxyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5tdWwobXVsdGlwbGllci5uZWcoKSkubmVnKCk7XHJcblxyXG4gICAgICAgIC8vIElmIGJvdGggbG9uZ3MgYXJlIHNtYWxsLCB1c2UgZmxvYXQgbXVsdGlwbGljYXRpb25cclxuICAgICAgICBpZiAodGhpcy5sdChUV09fUFdSXzI0KSAmJiBtdWx0aXBsaWVyLmx0KFRXT19QV1JfMjQpKVxyXG4gICAgICAgICAgICByZXR1cm4gZnJvbU51bWJlcih0aGlzLnRvTnVtYmVyKCkgKiBtdWx0aXBsaWVyLnRvTnVtYmVyKCksIHRoaXMudW5zaWduZWQpO1xyXG5cclxuICAgICAgICAvLyBEaXZpZGUgZWFjaCBsb25nIGludG8gNCBjaHVua3Mgb2YgMTYgYml0cywgYW5kIHRoZW4gYWRkIHVwIDR4NCBwcm9kdWN0cy5cclxuICAgICAgICAvLyBXZSBjYW4gc2tpcCBwcm9kdWN0cyB0aGF0IHdvdWxkIG92ZXJmbG93LlxyXG5cclxuICAgICAgICB2YXIgYTQ4ID0gdGhpcy5oaWdoID4+PiAxNjtcclxuICAgICAgICB2YXIgYTMyID0gdGhpcy5oaWdoICYgMHhGRkZGO1xyXG4gICAgICAgIHZhciBhMTYgPSB0aGlzLmxvdyA+Pj4gMTY7XHJcbiAgICAgICAgdmFyIGEwMCA9IHRoaXMubG93ICYgMHhGRkZGO1xyXG5cclxuICAgICAgICB2YXIgYjQ4ID0gbXVsdGlwbGllci5oaWdoID4+PiAxNjtcclxuICAgICAgICB2YXIgYjMyID0gbXVsdGlwbGllci5oaWdoICYgMHhGRkZGO1xyXG4gICAgICAgIHZhciBiMTYgPSBtdWx0aXBsaWVyLmxvdyA+Pj4gMTY7XHJcbiAgICAgICAgdmFyIGIwMCA9IG11bHRpcGxpZXIubG93ICYgMHhGRkZGO1xyXG5cclxuICAgICAgICB2YXIgYzQ4ID0gMCwgYzMyID0gMCwgYzE2ID0gMCwgYzAwID0gMDtcclxuICAgICAgICBjMDAgKz0gYTAwICogYjAwO1xyXG4gICAgICAgIGMxNiArPSBjMDAgPj4+IDE2O1xyXG4gICAgICAgIGMwMCAmPSAweEZGRkY7XHJcbiAgICAgICAgYzE2ICs9IGExNiAqIGIwMDtcclxuICAgICAgICBjMzIgKz0gYzE2ID4+PiAxNjtcclxuICAgICAgICBjMTYgJj0gMHhGRkZGO1xyXG4gICAgICAgIGMxNiArPSBhMDAgKiBiMTY7XHJcbiAgICAgICAgYzMyICs9IGMxNiA+Pj4gMTY7XHJcbiAgICAgICAgYzE2ICY9IDB4RkZGRjtcclxuICAgICAgICBjMzIgKz0gYTMyICogYjAwO1xyXG4gICAgICAgIGM0OCArPSBjMzIgPj4+IDE2O1xyXG4gICAgICAgIGMzMiAmPSAweEZGRkY7XHJcbiAgICAgICAgYzMyICs9IGExNiAqIGIxNjtcclxuICAgICAgICBjNDggKz0gYzMyID4+PiAxNjtcclxuICAgICAgICBjMzIgJj0gMHhGRkZGO1xyXG4gICAgICAgIGMzMiArPSBhMDAgKiBiMzI7XHJcbiAgICAgICAgYzQ4ICs9IGMzMiA+Pj4gMTY7XHJcbiAgICAgICAgYzMyICY9IDB4RkZGRjtcclxuICAgICAgICBjNDggKz0gYTQ4ICogYjAwICsgYTMyICogYjE2ICsgYTE2ICogYjMyICsgYTAwICogYjQ4O1xyXG4gICAgICAgIGM0OCAmPSAweEZGRkY7XHJcbiAgICAgICAgcmV0dXJuIGZyb21CaXRzKChjMTYgPDwgMTYpIHwgYzAwLCAoYzQ4IDw8IDE2KSB8IGMzMiwgdGhpcy51bnNpZ25lZCk7XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgcHJvZHVjdCBvZiB0aGlzIGFuZCB0aGUgc3BlY2lmaWVkIExvbmcuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjbXVsdGlwbHl9LlxyXG4gICAgICogQGZ1bmN0aW9uXHJcbiAgICAgKiBAcGFyYW0geyFMb25nfG51bWJlcnxzdHJpbmd9IG11bHRpcGxpZXIgTXVsdGlwbGllclxyXG4gICAgICogQHJldHVybnMgeyFMb25nfSBQcm9kdWN0XHJcbiAgICAgKi9cclxuICAgIExvbmdQcm90b3R5cGUubXVsID0gTG9uZ1Byb3RvdHlwZS5tdWx0aXBseTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhpcyBMb25nIGRpdmlkZWQgYnkgdGhlIHNwZWNpZmllZC4gVGhlIHJlc3VsdCBpcyBzaWduZWQgaWYgdGhpcyBMb25nIGlzIHNpZ25lZCBvclxyXG4gICAgICogIHVuc2lnbmVkIGlmIHRoaXMgTG9uZyBpcyB1bnNpZ25lZC5cclxuICAgICAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfHN0cmluZ30gZGl2aXNvciBEaXZpc29yXHJcbiAgICAgKiBAcmV0dXJucyB7IUxvbmd9IFF1b3RpZW50XHJcbiAgICAgKi9cclxuICAgIExvbmdQcm90b3R5cGUuZGl2aWRlID0gZnVuY3Rpb24gZGl2aWRlKGRpdmlzb3IpIHtcclxuICAgICAgICBpZiAoIWlzTG9uZyhkaXZpc29yKSlcclxuICAgICAgICAgICAgZGl2aXNvciA9IGZyb21WYWx1ZShkaXZpc29yKTtcclxuICAgICAgICBpZiAoZGl2aXNvci5pc1plcm8oKSlcclxuICAgICAgICAgICAgdGhyb3cgRXJyb3IoJ2RpdmlzaW9uIGJ5IHplcm8nKTtcclxuICAgICAgICBpZiAodGhpcy5pc1plcm8oKSlcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMudW5zaWduZWQgPyBVWkVSTyA6IFpFUk87XHJcbiAgICAgICAgdmFyIGFwcHJveCwgcmVtLCByZXM7XHJcbiAgICAgICAgaWYgKCF0aGlzLnVuc2lnbmVkKSB7XHJcbiAgICAgICAgICAgIC8vIFRoaXMgc2VjdGlvbiBpcyBvbmx5IHJlbGV2YW50IGZvciBzaWduZWQgbG9uZ3MgYW5kIGlzIGRlcml2ZWQgZnJvbSB0aGVcclxuICAgICAgICAgICAgLy8gY2xvc3VyZSBsaWJyYXJ5IGFzIGEgd2hvbGUuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLmVxKE1JTl9WQUxVRSkpIHtcclxuICAgICAgICAgICAgICAgIGlmIChkaXZpc29yLmVxKE9ORSkgfHwgZGl2aXNvci5lcShORUdfT05FKSlcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gTUlOX1ZBTFVFOyAgLy8gcmVjYWxsIHRoYXQgLU1JTl9WQUxVRSA9PSBNSU5fVkFMVUVcclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGRpdmlzb3IuZXEoTUlOX1ZBTFVFKSlcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gT05FO1xyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gQXQgdGhpcyBwb2ludCwgd2UgaGF2ZSB8b3RoZXJ8ID49IDIsIHNvIHx0aGlzL290aGVyfCA8IHxNSU5fVkFMVUV8LlxyXG4gICAgICAgICAgICAgICAgICAgIHZhciBoYWxmVGhpcyA9IHRoaXMuc2hyKDEpO1xyXG4gICAgICAgICAgICAgICAgICAgIGFwcHJveCA9IGhhbGZUaGlzLmRpdihkaXZpc29yKS5zaGwoMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGFwcHJveC5lcShaRVJPKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGl2aXNvci5pc05lZ2F0aXZlKCkgPyBPTkUgOiBORUdfT05FO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlbSA9IHRoaXMuc3ViKGRpdmlzb3IubXVsKGFwcHJveCkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXMgPSBhcHByb3guYWRkKHJlbS5kaXYoZGl2aXNvcikpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIGlmIChkaXZpc29yLmVxKE1JTl9WQUxVRSkpXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy51bnNpZ25lZCA/IFVaRVJPIDogWkVSTztcclxuICAgICAgICAgICAgaWYgKHRoaXMuaXNOZWdhdGl2ZSgpKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZGl2aXNvci5pc05lZ2F0aXZlKCkpXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubmVnKCkuZGl2KGRpdmlzb3IubmVnKCkpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubmVnKCkuZGl2KGRpdmlzb3IpLm5lZygpO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGRpdmlzb3IuaXNOZWdhdGl2ZSgpKVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGl2KGRpdmlzb3IubmVnKCkpLm5lZygpO1xyXG4gICAgICAgICAgICByZXMgPSBaRVJPO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIFRoZSBhbGdvcml0aG0gYmVsb3cgaGFzIG5vdCBiZWVuIG1hZGUgZm9yIHVuc2lnbmVkIGxvbmdzLiBJdCdzIHRoZXJlZm9yZVxyXG4gICAgICAgICAgICAvLyByZXF1aXJlZCB0byB0YWtlIHNwZWNpYWwgY2FyZSBvZiB0aGUgTVNCIHByaW9yIHRvIHJ1bm5pbmcgaXQuXHJcbiAgICAgICAgICAgIGlmICghZGl2aXNvci51bnNpZ25lZClcclxuICAgICAgICAgICAgICAgIGRpdmlzb3IgPSBkaXZpc29yLnRvVW5zaWduZWQoKTtcclxuICAgICAgICAgICAgaWYgKGRpdmlzb3IuZ3QodGhpcykpXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gVVpFUk87XHJcbiAgICAgICAgICAgIGlmIChkaXZpc29yLmd0KHRoaXMuc2hydSgxKSkpIC8vIDE1ID4+PiAxID0gNyA7IHdpdGggZGl2aXNvciA9IDggOyB0cnVlXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gVU9ORTtcclxuICAgICAgICAgICAgcmVzID0gVVpFUk87XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBSZXBlYXQgdGhlIGZvbGxvd2luZyB1bnRpbCB0aGUgcmVtYWluZGVyIGlzIGxlc3MgdGhhbiBvdGhlcjogIGZpbmQgYVxyXG4gICAgICAgIC8vIGZsb2F0aW5nLXBvaW50IHRoYXQgYXBwcm94aW1hdGVzIHJlbWFpbmRlciAvIG90aGVyICpmcm9tIGJlbG93KiwgYWRkIHRoaXNcclxuICAgICAgICAvLyBpbnRvIHRoZSByZXN1bHQsIGFuZCBzdWJ0cmFjdCBpdCBmcm9tIHRoZSByZW1haW5kZXIuICBJdCBpcyBjcml0aWNhbCB0aGF0XHJcbiAgICAgICAgLy8gdGhlIGFwcHJveGltYXRlIHZhbHVlIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgcmVhbCB2YWx1ZSBzbyB0aGF0IHRoZVxyXG4gICAgICAgIC8vIHJlbWFpbmRlciBuZXZlciBiZWNvbWVzIG5lZ2F0aXZlLlxyXG4gICAgICAgIHJlbSA9IHRoaXM7XHJcbiAgICAgICAgd2hpbGUgKHJlbS5ndGUoZGl2aXNvcikpIHtcclxuICAgICAgICAgICAgLy8gQXBwcm94aW1hdGUgdGhlIHJlc3VsdCBvZiBkaXZpc2lvbi4gVGhpcyBtYXkgYmUgYSBsaXR0bGUgZ3JlYXRlciBvclxyXG4gICAgICAgICAgICAvLyBzbWFsbGVyIHRoYW4gdGhlIGFjdHVhbCB2YWx1ZS5cclxuICAgICAgICAgICAgYXBwcm94ID0gTWF0aC5tYXgoMSwgTWF0aC5mbG9vcihyZW0udG9OdW1iZXIoKSAvIGRpdmlzb3IudG9OdW1iZXIoKSkpO1xyXG5cclxuICAgICAgICAgICAgLy8gV2Ugd2lsbCB0d2VhayB0aGUgYXBwcm94aW1hdGUgcmVzdWx0IGJ5IGNoYW5naW5nIGl0IGluIHRoZSA0OC10aCBkaWdpdCBvclxyXG4gICAgICAgICAgICAvLyB0aGUgc21hbGxlc3Qgbm9uLWZyYWN0aW9uYWwgZGlnaXQsIHdoaWNoZXZlciBpcyBsYXJnZXIuXHJcbiAgICAgICAgICAgIHZhciBsb2cyID0gTWF0aC5jZWlsKE1hdGgubG9nKGFwcHJveCkgLyBNYXRoLkxOMiksXHJcbiAgICAgICAgICAgICAgICBkZWx0YSA9IChsb2cyIDw9IDQ4KSA/IDEgOiBwb3dfZGJsKDIsIGxvZzIgLSA0OCksXHJcblxyXG4gICAgICAgICAgICAvLyBEZWNyZWFzZSB0aGUgYXBwcm94aW1hdGlvbiB1bnRpbCBpdCBpcyBzbWFsbGVyIHRoYW4gdGhlIHJlbWFpbmRlci4gIE5vdGVcclxuICAgICAgICAgICAgLy8gdGhhdCBpZiBpdCBpcyB0b28gbGFyZ2UsIHRoZSBwcm9kdWN0IG92ZXJmbG93cyBhbmQgaXMgbmVnYXRpdmUuXHJcbiAgICAgICAgICAgICAgICBhcHByb3hSZXMgPSBmcm9tTnVtYmVyKGFwcHJveCksXHJcbiAgICAgICAgICAgICAgICBhcHByb3hSZW0gPSBhcHByb3hSZXMubXVsKGRpdmlzb3IpO1xyXG4gICAgICAgICAgICB3aGlsZSAoYXBwcm94UmVtLmlzTmVnYXRpdmUoKSB8fCBhcHByb3hSZW0uZ3QocmVtKSkge1xyXG4gICAgICAgICAgICAgICAgYXBwcm94IC09IGRlbHRhO1xyXG4gICAgICAgICAgICAgICAgYXBwcm94UmVzID0gZnJvbU51bWJlcihhcHByb3gsIHRoaXMudW5zaWduZWQpO1xyXG4gICAgICAgICAgICAgICAgYXBwcm94UmVtID0gYXBwcm94UmVzLm11bChkaXZpc29yKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gV2Uga25vdyB0aGUgYW5zd2VyIGNhbid0IGJlIHplcm8uLi4gYW5kIGFjdHVhbGx5LCB6ZXJvIHdvdWxkIGNhdXNlXHJcbiAgICAgICAgICAgIC8vIGluZmluaXRlIHJlY3Vyc2lvbiBzaW5jZSB3ZSB3b3VsZCBtYWtlIG5vIHByb2dyZXNzLlxyXG4gICAgICAgICAgICBpZiAoYXBwcm94UmVzLmlzWmVybygpKVxyXG4gICAgICAgICAgICAgICAgYXBwcm94UmVzID0gT05FO1xyXG5cclxuICAgICAgICAgICAgcmVzID0gcmVzLmFkZChhcHByb3hSZXMpO1xyXG4gICAgICAgICAgICByZW0gPSByZW0uc3ViKGFwcHJveFJlbSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXM7XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGlzIExvbmcgZGl2aWRlZCBieSB0aGUgc3BlY2lmaWVkLiBUaGlzIGlzIGFuIGFsaWFzIG9mIHtAbGluayBMb25nI2RpdmlkZX0uXHJcbiAgICAgKiBAZnVuY3Rpb25cclxuICAgICAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfHN0cmluZ30gZGl2aXNvciBEaXZpc29yXHJcbiAgICAgKiBAcmV0dXJucyB7IUxvbmd9IFF1b3RpZW50XHJcbiAgICAgKi9cclxuICAgIExvbmdQcm90b3R5cGUuZGl2ID0gTG9uZ1Byb3RvdHlwZS5kaXZpZGU7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoaXMgTG9uZyBtb2R1bG8gdGhlIHNwZWNpZmllZC5cclxuICAgICAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfHN0cmluZ30gZGl2aXNvciBEaXZpc29yXHJcbiAgICAgKiBAcmV0dXJucyB7IUxvbmd9IFJlbWFpbmRlclxyXG4gICAgICovXHJcbiAgICBMb25nUHJvdG90eXBlLm1vZHVsbyA9IGZ1bmN0aW9uIG1vZHVsbyhkaXZpc29yKSB7XHJcbiAgICAgICAgaWYgKCFpc0xvbmcoZGl2aXNvcikpXHJcbiAgICAgICAgICAgIGRpdmlzb3IgPSBmcm9tVmFsdWUoZGl2aXNvcik7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc3ViKHRoaXMuZGl2KGRpdmlzb3IpLm11bChkaXZpc29yKSk7XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGlzIExvbmcgbW9kdWxvIHRoZSBzcGVjaWZpZWQuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjbW9kdWxvfS5cclxuICAgICAqIEBmdW5jdGlvblxyXG4gICAgICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8c3RyaW5nfSBkaXZpc29yIERpdmlzb3JcclxuICAgICAqIEByZXR1cm5zIHshTG9uZ30gUmVtYWluZGVyXHJcbiAgICAgKi9cclxuICAgIExvbmdQcm90b3R5cGUubW9kID0gTG9uZ1Byb3RvdHlwZS5tb2R1bG87XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBiaXR3aXNlIE5PVCBvZiB0aGlzIExvbmcuXHJcbiAgICAgKiBAcmV0dXJucyB7IUxvbmd9XHJcbiAgICAgKi9cclxuICAgIExvbmdQcm90b3R5cGUubm90ID0gZnVuY3Rpb24gbm90KCkge1xyXG4gICAgICAgIHJldHVybiBmcm9tQml0cyh+dGhpcy5sb3csIH50aGlzLmhpZ2gsIHRoaXMudW5zaWduZWQpO1xyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIGJpdHdpc2UgQU5EIG9mIHRoaXMgTG9uZyBhbmQgdGhlIHNwZWNpZmllZC5cclxuICAgICAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfHN0cmluZ30gb3RoZXIgT3RoZXIgTG9uZ1xyXG4gICAgICogQHJldHVybnMgeyFMb25nfVxyXG4gICAgICovXHJcbiAgICBMb25nUHJvdG90eXBlLmFuZCA9IGZ1bmN0aW9uIGFuZChvdGhlcikge1xyXG4gICAgICAgIGlmICghaXNMb25nKG90aGVyKSlcclxuICAgICAgICAgICAgb3RoZXIgPSBmcm9tVmFsdWUob3RoZXIpO1xyXG4gICAgICAgIHJldHVybiBmcm9tQml0cyh0aGlzLmxvdyAmIG90aGVyLmxvdywgdGhpcy5oaWdoICYgb3RoZXIuaGlnaCwgdGhpcy51bnNpZ25lZCk7XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgYml0d2lzZSBPUiBvZiB0aGlzIExvbmcgYW5kIHRoZSBzcGVjaWZpZWQuXHJcbiAgICAgKiBAcGFyYW0geyFMb25nfG51bWJlcnxzdHJpbmd9IG90aGVyIE90aGVyIExvbmdcclxuICAgICAqIEByZXR1cm5zIHshTG9uZ31cclxuICAgICAqL1xyXG4gICAgTG9uZ1Byb3RvdHlwZS5vciA9IGZ1bmN0aW9uIG9yKG90aGVyKSB7XHJcbiAgICAgICAgaWYgKCFpc0xvbmcob3RoZXIpKVxyXG4gICAgICAgICAgICBvdGhlciA9IGZyb21WYWx1ZShvdGhlcik7XHJcbiAgICAgICAgcmV0dXJuIGZyb21CaXRzKHRoaXMubG93IHwgb3RoZXIubG93LCB0aGlzLmhpZ2ggfCBvdGhlci5oaWdoLCB0aGlzLnVuc2lnbmVkKTtcclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBiaXR3aXNlIFhPUiBvZiB0aGlzIExvbmcgYW5kIHRoZSBnaXZlbiBvbmUuXHJcbiAgICAgKiBAcGFyYW0geyFMb25nfG51bWJlcnxzdHJpbmd9IG90aGVyIE90aGVyIExvbmdcclxuICAgICAqIEByZXR1cm5zIHshTG9uZ31cclxuICAgICAqL1xyXG4gICAgTG9uZ1Byb3RvdHlwZS54b3IgPSBmdW5jdGlvbiB4b3Iob3RoZXIpIHtcclxuICAgICAgICBpZiAoIWlzTG9uZyhvdGhlcikpXHJcbiAgICAgICAgICAgIG90aGVyID0gZnJvbVZhbHVlKG90aGVyKTtcclxuICAgICAgICByZXR1cm4gZnJvbUJpdHModGhpcy5sb3cgXiBvdGhlci5sb3csIHRoaXMuaGlnaCBeIG90aGVyLmhpZ2gsIHRoaXMudW5zaWduZWQpO1xyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhpcyBMb25nIHdpdGggYml0cyBzaGlmdGVkIHRvIHRoZSBsZWZ0IGJ5IHRoZSBnaXZlbiBhbW91bnQuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcnwhTG9uZ30gbnVtQml0cyBOdW1iZXIgb2YgYml0c1xyXG4gICAgICogQHJldHVybnMgeyFMb25nfSBTaGlmdGVkIExvbmdcclxuICAgICAqL1xyXG4gICAgTG9uZ1Byb3RvdHlwZS5zaGlmdExlZnQgPSBmdW5jdGlvbiBzaGlmdExlZnQobnVtQml0cykge1xyXG4gICAgICAgIGlmIChpc0xvbmcobnVtQml0cykpXHJcbiAgICAgICAgICAgIG51bUJpdHMgPSBudW1CaXRzLnRvSW50KCk7XHJcbiAgICAgICAgaWYgKChudW1CaXRzICY9IDYzKSA9PT0gMClcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICAgICAgZWxzZSBpZiAobnVtQml0cyA8IDMyKVxyXG4gICAgICAgICAgICByZXR1cm4gZnJvbUJpdHModGhpcy5sb3cgPDwgbnVtQml0cywgKHRoaXMuaGlnaCA8PCBudW1CaXRzKSB8ICh0aGlzLmxvdyA+Pj4gKDMyIC0gbnVtQml0cykpLCB0aGlzLnVuc2lnbmVkKTtcclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHJldHVybiBmcm9tQml0cygwLCB0aGlzLmxvdyA8PCAobnVtQml0cyAtIDMyKSwgdGhpcy51bnNpZ25lZCk7XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGlzIExvbmcgd2l0aCBiaXRzIHNoaWZ0ZWQgdG8gdGhlIGxlZnQgYnkgdGhlIGdpdmVuIGFtb3VudC4gVGhpcyBpcyBhbiBhbGlhcyBvZiB7QGxpbmsgTG9uZyNzaGlmdExlZnR9LlxyXG4gICAgICogQGZ1bmN0aW9uXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcnwhTG9uZ30gbnVtQml0cyBOdW1iZXIgb2YgYml0c1xyXG4gICAgICogQHJldHVybnMgeyFMb25nfSBTaGlmdGVkIExvbmdcclxuICAgICAqL1xyXG4gICAgTG9uZ1Byb3RvdHlwZS5zaGwgPSBMb25nUHJvdG90eXBlLnNoaWZ0TGVmdDtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhpcyBMb25nIHdpdGggYml0cyBhcml0aG1ldGljYWxseSBzaGlmdGVkIHRvIHRoZSByaWdodCBieSB0aGUgZ2l2ZW4gYW1vdW50LlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ8IUxvbmd9IG51bUJpdHMgTnVtYmVyIG9mIGJpdHNcclxuICAgICAqIEByZXR1cm5zIHshTG9uZ30gU2hpZnRlZCBMb25nXHJcbiAgICAgKi9cclxuICAgIExvbmdQcm90b3R5cGUuc2hpZnRSaWdodCA9IGZ1bmN0aW9uIHNoaWZ0UmlnaHQobnVtQml0cykge1xyXG4gICAgICAgIGlmIChpc0xvbmcobnVtQml0cykpXHJcbiAgICAgICAgICAgIG51bUJpdHMgPSBudW1CaXRzLnRvSW50KCk7XHJcbiAgICAgICAgaWYgKChudW1CaXRzICY9IDYzKSA9PT0gMClcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICAgICAgZWxzZSBpZiAobnVtQml0cyA8IDMyKVxyXG4gICAgICAgICAgICByZXR1cm4gZnJvbUJpdHMoKHRoaXMubG93ID4+PiBudW1CaXRzKSB8ICh0aGlzLmhpZ2ggPDwgKDMyIC0gbnVtQml0cykpLCB0aGlzLmhpZ2ggPj4gbnVtQml0cywgdGhpcy51bnNpZ25lZCk7XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICByZXR1cm4gZnJvbUJpdHModGhpcy5oaWdoID4+IChudW1CaXRzIC0gMzIpLCB0aGlzLmhpZ2ggPj0gMCA/IDAgOiAtMSwgdGhpcy51bnNpZ25lZCk7XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGlzIExvbmcgd2l0aCBiaXRzIGFyaXRobWV0aWNhbGx5IHNoaWZ0ZWQgdG8gdGhlIHJpZ2h0IGJ5IHRoZSBnaXZlbiBhbW91bnQuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjc2hpZnRSaWdodH0uXHJcbiAgICAgKiBAZnVuY3Rpb25cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfCFMb25nfSBudW1CaXRzIE51bWJlciBvZiBiaXRzXHJcbiAgICAgKiBAcmV0dXJucyB7IUxvbmd9IFNoaWZ0ZWQgTG9uZ1xyXG4gICAgICovXHJcbiAgICBMb25nUHJvdG90eXBlLnNociA9IExvbmdQcm90b3R5cGUuc2hpZnRSaWdodDtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhpcyBMb25nIHdpdGggYml0cyBsb2dpY2FsbHkgc2hpZnRlZCB0byB0aGUgcmlnaHQgYnkgdGhlIGdpdmVuIGFtb3VudC5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfCFMb25nfSBudW1CaXRzIE51bWJlciBvZiBiaXRzXHJcbiAgICAgKiBAcmV0dXJucyB7IUxvbmd9IFNoaWZ0ZWQgTG9uZ1xyXG4gICAgICovXHJcbiAgICBMb25nUHJvdG90eXBlLnNoaWZ0UmlnaHRVbnNpZ25lZCA9IGZ1bmN0aW9uIHNoaWZ0UmlnaHRVbnNpZ25lZChudW1CaXRzKSB7XHJcbiAgICAgICAgaWYgKGlzTG9uZyhudW1CaXRzKSlcclxuICAgICAgICAgICAgbnVtQml0cyA9IG51bUJpdHMudG9JbnQoKTtcclxuICAgICAgICBudW1CaXRzICY9IDYzO1xyXG4gICAgICAgIGlmIChudW1CaXRzID09PSAwKVxyXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdmFyIGhpZ2ggPSB0aGlzLmhpZ2g7XHJcbiAgICAgICAgICAgIGlmIChudW1CaXRzIDwgMzIpIHtcclxuICAgICAgICAgICAgICAgIHZhciBsb3cgPSB0aGlzLmxvdztcclxuICAgICAgICAgICAgICAgIHJldHVybiBmcm9tQml0cygobG93ID4+PiBudW1CaXRzKSB8IChoaWdoIDw8ICgzMiAtIG51bUJpdHMpKSwgaGlnaCA+Pj4gbnVtQml0cywgdGhpcy51bnNpZ25lZCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobnVtQml0cyA9PT0gMzIpXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZnJvbUJpdHMoaGlnaCwgMCwgdGhpcy51bnNpZ25lZCk7XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgIHJldHVybiBmcm9tQml0cyhoaWdoID4+PiAobnVtQml0cyAtIDMyKSwgMCwgdGhpcy51bnNpZ25lZCk7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhpcyBMb25nIHdpdGggYml0cyBsb2dpY2FsbHkgc2hpZnRlZCB0byB0aGUgcmlnaHQgYnkgdGhlIGdpdmVuIGFtb3VudC4gVGhpcyBpcyBhbiBhbGlhcyBvZiB7QGxpbmsgTG9uZyNzaGlmdFJpZ2h0VW5zaWduZWR9LlxyXG4gICAgICogQGZ1bmN0aW9uXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcnwhTG9uZ30gbnVtQml0cyBOdW1iZXIgb2YgYml0c1xyXG4gICAgICogQHJldHVybnMgeyFMb25nfSBTaGlmdGVkIExvbmdcclxuICAgICAqL1xyXG4gICAgTG9uZ1Byb3RvdHlwZS5zaHJ1ID0gTG9uZ1Byb3RvdHlwZS5zaGlmdFJpZ2h0VW5zaWduZWQ7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb252ZXJ0cyB0aGlzIExvbmcgdG8gc2lnbmVkLlxyXG4gICAgICogQHJldHVybnMgeyFMb25nfSBTaWduZWQgbG9uZ1xyXG4gICAgICovXHJcbiAgICBMb25nUHJvdG90eXBlLnRvU2lnbmVkID0gZnVuY3Rpb24gdG9TaWduZWQoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLnVuc2lnbmVkKVxyXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcclxuICAgICAgICByZXR1cm4gZnJvbUJpdHModGhpcy5sb3csIHRoaXMuaGlnaCwgZmFsc2UpO1xyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIENvbnZlcnRzIHRoaXMgTG9uZyB0byB1bnNpZ25lZC5cclxuICAgICAqIEByZXR1cm5zIHshTG9uZ30gVW5zaWduZWQgbG9uZ1xyXG4gICAgICovXHJcbiAgICBMb25nUHJvdG90eXBlLnRvVW5zaWduZWQgPSBmdW5jdGlvbiB0b1Vuc2lnbmVkKCkge1xyXG4gICAgICAgIGlmICh0aGlzLnVuc2lnbmVkKVxyXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcclxuICAgICAgICByZXR1cm4gZnJvbUJpdHModGhpcy5sb3csIHRoaXMuaGlnaCwgdHJ1ZSk7XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29udmVydHMgdGhpcyBMb25nIHRvIGl0cyBieXRlIHJlcHJlc2VudGF0aW9uLlxyXG4gICAgICogQHBhcmFtIHtib29sZWFuPX0gbGUgV2hldGhlciBsaXR0bGUgb3IgYmlnIGVuZGlhbiwgZGVmYXVsdHMgdG8gYmlnIGVuZGlhblxyXG4gICAgICogQHJldHVybnMgeyFBcnJheS48bnVtYmVyPn0gQnl0ZSByZXByZXNlbnRhdGlvblxyXG4gICAgICovXHJcbiAgICBMb25nUHJvdG90eXBlLnRvQnl0ZXMgPSBmdW5jdGlvbihsZSkge1xyXG4gICAgICAgIHJldHVybiBsZSA/IHRoaXMudG9CeXRlc0xFKCkgOiB0aGlzLnRvQnl0ZXNCRSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29udmVydHMgdGhpcyBMb25nIHRvIGl0cyBsaXR0bGUgZW5kaWFuIGJ5dGUgcmVwcmVzZW50YXRpb24uXHJcbiAgICAgKiBAcmV0dXJucyB7IUFycmF5LjxudW1iZXI+fSBMaXR0bGUgZW5kaWFuIGJ5dGUgcmVwcmVzZW50YXRpb25cclxuICAgICAqL1xyXG4gICAgTG9uZ1Byb3RvdHlwZS50b0J5dGVzTEUgPSBmdW5jdGlvbigpIHtcclxuICAgICAgICB2YXIgaGkgPSB0aGlzLmhpZ2gsXHJcbiAgICAgICAgICAgIGxvID0gdGhpcy5sb3c7XHJcbiAgICAgICAgcmV0dXJuIFtcclxuICAgICAgICAgICAgIGxvICAgICAgICAgJiAweGZmLFxyXG4gICAgICAgICAgICAobG8gPj4+ICA4KSAmIDB4ZmYsXHJcbiAgICAgICAgICAgIChsbyA+Pj4gMTYpICYgMHhmZixcclxuICAgICAgICAgICAgKGxvID4+PiAyNCkgJiAweGZmLFxyXG4gICAgICAgICAgICAgaGkgICAgICAgICAmIDB4ZmYsXHJcbiAgICAgICAgICAgIChoaSA+Pj4gIDgpICYgMHhmZixcclxuICAgICAgICAgICAgKGhpID4+PiAxNikgJiAweGZmLFxyXG4gICAgICAgICAgICAoaGkgPj4+IDI0KSAmIDB4ZmZcclxuICAgICAgICBdO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29udmVydHMgdGhpcyBMb25nIHRvIGl0cyBiaWcgZW5kaWFuIGJ5dGUgcmVwcmVzZW50YXRpb24uXHJcbiAgICAgKiBAcmV0dXJucyB7IUFycmF5LjxudW1iZXI+fSBCaWcgZW5kaWFuIGJ5dGUgcmVwcmVzZW50YXRpb25cclxuICAgICAqL1xyXG4gICAgTG9uZ1Byb3RvdHlwZS50b0J5dGVzQkUgPSBmdW5jdGlvbigpIHtcclxuICAgICAgICB2YXIgaGkgPSB0aGlzLmhpZ2gsXHJcbiAgICAgICAgICAgIGxvID0gdGhpcy5sb3c7XHJcbiAgICAgICAgcmV0dXJuIFtcclxuICAgICAgICAgICAgKGhpID4+PiAyNCkgJiAweGZmLFxyXG4gICAgICAgICAgICAoaGkgPj4+IDE2KSAmIDB4ZmYsXHJcbiAgICAgICAgICAgIChoaSA+Pj4gIDgpICYgMHhmZixcclxuICAgICAgICAgICAgIGhpICAgICAgICAgJiAweGZmLFxyXG4gICAgICAgICAgICAobG8gPj4+IDI0KSAmIDB4ZmYsXHJcbiAgICAgICAgICAgIChsbyA+Pj4gMTYpICYgMHhmZixcclxuICAgICAgICAgICAgKGxvID4+PiAgOCkgJiAweGZmLFxyXG4gICAgICAgICAgICAgbG8gICAgICAgICAmIDB4ZmZcclxuICAgICAgICBdO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBMb25nO1xyXG59KTtcclxuIiwiLypcbm9iamVjdC1hc3NpZ25cbihjKSBTaW5kcmUgU29yaHVzXG5AbGljZW5zZSBNSVRcbiovXG5cbid1c2Ugc3RyaWN0Jztcbi8qIGVzbGludC1kaXNhYmxlIG5vLXVudXNlZC12YXJzICovXG52YXIgZ2V0T3duUHJvcGVydHlTeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scztcbnZhciBoYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG52YXIgcHJvcElzRW51bWVyYWJsZSA9IE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGU7XG5cbmZ1bmN0aW9uIHRvT2JqZWN0KHZhbCkge1xuXHRpZiAodmFsID09PSBudWxsIHx8IHZhbCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignT2JqZWN0LmFzc2lnbiBjYW5ub3QgYmUgY2FsbGVkIHdpdGggbnVsbCBvciB1bmRlZmluZWQnKTtcblx0fVxuXG5cdHJldHVybiBPYmplY3QodmFsKTtcbn1cblxuZnVuY3Rpb24gc2hvdWxkVXNlTmF0aXZlKCkge1xuXHR0cnkge1xuXHRcdGlmICghT2JqZWN0LmFzc2lnbikge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdC8vIERldGVjdCBidWdneSBwcm9wZXJ0eSBlbnVtZXJhdGlvbiBvcmRlciBpbiBvbGRlciBWOCB2ZXJzaW9ucy5cblxuXHRcdC8vIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC92OC9pc3N1ZXMvZGV0YWlsP2lkPTQxMThcblx0XHR2YXIgdGVzdDEgPSBuZXcgU3RyaW5nKCdhYmMnKTsgIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tbmV3LXdyYXBwZXJzXG5cdFx0dGVzdDFbNV0gPSAnZGUnO1xuXHRcdGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0ZXN0MSlbMF0gPT09ICc1Jykge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdC8vIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC92OC9pc3N1ZXMvZGV0YWlsP2lkPTMwNTZcblx0XHR2YXIgdGVzdDIgPSB7fTtcblx0XHRmb3IgKHZhciBpID0gMDsgaSA8IDEwOyBpKyspIHtcblx0XHRcdHRlc3QyWydfJyArIFN0cmluZy5mcm9tQ2hhckNvZGUoaSldID0gaTtcblx0XHR9XG5cdFx0dmFyIG9yZGVyMiA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRlc3QyKS5tYXAoZnVuY3Rpb24gKG4pIHtcblx0XHRcdHJldHVybiB0ZXN0MltuXTtcblx0XHR9KTtcblx0XHRpZiAob3JkZXIyLmpvaW4oJycpICE9PSAnMDEyMzQ1Njc4OScpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHQvLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvdjgvaXNzdWVzL2RldGFpbD9pZD0zMDU2XG5cdFx0dmFyIHRlc3QzID0ge307XG5cdFx0J2FiY2RlZmdoaWprbG1ub3BxcnN0Jy5zcGxpdCgnJykuZm9yRWFjaChmdW5jdGlvbiAobGV0dGVyKSB7XG5cdFx0XHR0ZXN0M1tsZXR0ZXJdID0gbGV0dGVyO1xuXHRcdH0pO1xuXHRcdGlmIChPYmplY3Qua2V5cyhPYmplY3QuYXNzaWduKHt9LCB0ZXN0MykpLmpvaW4oJycpICE9PVxuXHRcdFx0XHQnYWJjZGVmZ2hpamtsbW5vcHFyc3QnKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRydWU7XG5cdH0gY2F0Y2ggKGVycikge1xuXHRcdC8vIFdlIGRvbid0IGV4cGVjdCBhbnkgb2YgdGhlIGFib3ZlIHRvIHRocm93LCBidXQgYmV0dGVyIHRvIGJlIHNhZmUuXG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc2hvdWxkVXNlTmF0aXZlKCkgPyBPYmplY3QuYXNzaWduIDogZnVuY3Rpb24gKHRhcmdldCwgc291cmNlKSB7XG5cdHZhciBmcm9tO1xuXHR2YXIgdG8gPSB0b09iamVjdCh0YXJnZXQpO1xuXHR2YXIgc3ltYm9scztcblxuXHRmb3IgKHZhciBzID0gMTsgcyA8IGFyZ3VtZW50cy5sZW5ndGg7IHMrKykge1xuXHRcdGZyb20gPSBPYmplY3QoYXJndW1lbnRzW3NdKTtcblxuXHRcdGZvciAodmFyIGtleSBpbiBmcm9tKSB7XG5cdFx0XHRpZiAoaGFzT3duUHJvcGVydHkuY2FsbChmcm9tLCBrZXkpKSB7XG5cdFx0XHRcdHRvW2tleV0gPSBmcm9tW2tleV07XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKGdldE93blByb3BlcnR5U3ltYm9scykge1xuXHRcdFx0c3ltYm9scyA9IGdldE93blByb3BlcnR5U3ltYm9scyhmcm9tKTtcblx0XHRcdGZvciAodmFyIGkgPSAwOyBpIDwgc3ltYm9scy5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRpZiAocHJvcElzRW51bWVyYWJsZS5jYWxsKGZyb20sIHN5bWJvbHNbaV0pKSB7XG5cdFx0XHRcdFx0dG9bc3ltYm9sc1tpXV0gPSBmcm9tW3N5bWJvbHNbaV1dO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIHRvO1xufTtcbiIsIi8vIHNoaW0gZm9yIHVzaW5nIHByb2Nlc3MgaW4gYnJvd3NlclxudmFyIHByb2Nlc3MgPSBtb2R1bGUuZXhwb3J0cyA9IHt9O1xuXG4vLyBjYWNoZWQgZnJvbSB3aGF0ZXZlciBnbG9iYWwgaXMgcHJlc2VudCBzbyB0aGF0IHRlc3QgcnVubmVycyB0aGF0IHN0dWIgaXRcbi8vIGRvbid0IGJyZWFrIHRoaW5ncy4gIEJ1dCB3ZSBuZWVkIHRvIHdyYXAgaXQgaW4gYSB0cnkgY2F0Y2ggaW4gY2FzZSBpdCBpc1xuLy8gd3JhcHBlZCBpbiBzdHJpY3QgbW9kZSBjb2RlIHdoaWNoIGRvZXNuJ3QgZGVmaW5lIGFueSBnbG9iYWxzLiAgSXQncyBpbnNpZGUgYVxuLy8gZnVuY3Rpb24gYmVjYXVzZSB0cnkvY2F0Y2hlcyBkZW9wdGltaXplIGluIGNlcnRhaW4gZW5naW5lcy5cblxudmFyIGNhY2hlZFNldFRpbWVvdXQ7XG52YXIgY2FjaGVkQ2xlYXJUaW1lb3V0O1xuXG5mdW5jdGlvbiBkZWZhdWx0U2V0VGltb3V0KCkge1xuICAgIHRocm93IG5ldyBFcnJvcignc2V0VGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZCcpO1xufVxuZnVuY3Rpb24gZGVmYXVsdENsZWFyVGltZW91dCAoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdjbGVhclRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQnKTtcbn1cbihmdW5jdGlvbiAoKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKHR5cGVvZiBzZXRUaW1lb3V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gc2V0VGltZW91dDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBkZWZhdWx0U2V0VGltb3V0O1xuICAgICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gZGVmYXVsdFNldFRpbW91dDtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKHR5cGVvZiBjbGVhclRpbWVvdXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGNsZWFyVGltZW91dDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGRlZmF1bHRDbGVhclRpbWVvdXQ7XG4gICAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGRlZmF1bHRDbGVhclRpbWVvdXQ7XG4gICAgfVxufSAoKSlcbmZ1bmN0aW9uIHJ1blRpbWVvdXQoZnVuKSB7XG4gICAgaWYgKGNhY2hlZFNldFRpbWVvdXQgPT09IHNldFRpbWVvdXQpIHtcbiAgICAgICAgLy9ub3JtYWwgZW52aXJvbWVudHMgaW4gc2FuZSBzaXR1YXRpb25zXG4gICAgICAgIHJldHVybiBzZXRUaW1lb3V0KGZ1biwgMCk7XG4gICAgfVxuICAgIC8vIGlmIHNldFRpbWVvdXQgd2Fzbid0IGF2YWlsYWJsZSBidXQgd2FzIGxhdHRlciBkZWZpbmVkXG4gICAgaWYgKChjYWNoZWRTZXRUaW1lb3V0ID09PSBkZWZhdWx0U2V0VGltb3V0IHx8ICFjYWNoZWRTZXRUaW1lb3V0KSAmJiBzZXRUaW1lb3V0KSB7XG4gICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBzZXRUaW1lb3V0O1xuICAgICAgICByZXR1cm4gc2V0VGltZW91dChmdW4sIDApO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICAvLyB3aGVuIHdoZW4gc29tZWJvZHkgaGFzIHNjcmV3ZWQgd2l0aCBzZXRUaW1lb3V0IGJ1dCBubyBJLkUuIG1hZGRuZXNzXG4gICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0KGZ1biwgMCk7XG4gICAgfSBjYXRjaChlKXtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIFdoZW4gd2UgYXJlIGluIEkuRS4gYnV0IHRoZSBzY3JpcHQgaGFzIGJlZW4gZXZhbGVkIHNvIEkuRS4gZG9lc24ndCB0cnVzdCB0aGUgZ2xvYmFsIG9iamVjdCB3aGVuIGNhbGxlZCBub3JtYWxseVxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZFNldFRpbWVvdXQuY2FsbChudWxsLCBmdW4sIDApO1xuICAgICAgICB9IGNhdGNoKGUpe1xuICAgICAgICAgICAgLy8gc2FtZSBhcyBhYm92ZSBidXQgd2hlbiBpdCdzIGEgdmVyc2lvbiBvZiBJLkUuIHRoYXQgbXVzdCBoYXZlIHRoZSBnbG9iYWwgb2JqZWN0IGZvciAndGhpcycsIGhvcGZ1bGx5IG91ciBjb250ZXh0IGNvcnJlY3Qgb3RoZXJ3aXNlIGl0IHdpbGwgdGhyb3cgYSBnbG9iYWwgZXJyb3JcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0LmNhbGwodGhpcywgZnVuLCAwKTtcbiAgICAgICAgfVxuICAgIH1cblxuXG59XG5mdW5jdGlvbiBydW5DbGVhclRpbWVvdXQobWFya2VyKSB7XG4gICAgaWYgKGNhY2hlZENsZWFyVGltZW91dCA9PT0gY2xlYXJUaW1lb3V0KSB7XG4gICAgICAgIC8vbm9ybWFsIGVudmlyb21lbnRzIGluIHNhbmUgc2l0dWF0aW9uc1xuICAgICAgICByZXR1cm4gY2xlYXJUaW1lb3V0KG1hcmtlcik7XG4gICAgfVxuICAgIC8vIGlmIGNsZWFyVGltZW91dCB3YXNuJ3QgYXZhaWxhYmxlIGJ1dCB3YXMgbGF0dGVyIGRlZmluZWRcbiAgICBpZiAoKGNhY2hlZENsZWFyVGltZW91dCA9PT0gZGVmYXVsdENsZWFyVGltZW91dCB8fCAhY2FjaGVkQ2xlYXJUaW1lb3V0KSAmJiBjbGVhclRpbWVvdXQpIHtcbiAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gY2xlYXJUaW1lb3V0O1xuICAgICAgICByZXR1cm4gY2xlYXJUaW1lb3V0KG1hcmtlcik7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIC8vIHdoZW4gd2hlbiBzb21lYm9keSBoYXMgc2NyZXdlZCB3aXRoIHNldFRpbWVvdXQgYnV0IG5vIEkuRS4gbWFkZG5lc3NcbiAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH0gY2F0Y2ggKGUpe1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gV2hlbiB3ZSBhcmUgaW4gSS5FLiBidXQgdGhlIHNjcmlwdCBoYXMgYmVlbiBldmFsZWQgc28gSS5FLiBkb2Vzbid0ICB0cnVzdCB0aGUgZ2xvYmFsIG9iamVjdCB3aGVuIGNhbGxlZCBub3JtYWxseVxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dC5jYWxsKG51bGwsIG1hcmtlcik7XG4gICAgICAgIH0gY2F0Y2ggKGUpe1xuICAgICAgICAgICAgLy8gc2FtZSBhcyBhYm92ZSBidXQgd2hlbiBpdCdzIGEgdmVyc2lvbiBvZiBJLkUuIHRoYXQgbXVzdCBoYXZlIHRoZSBnbG9iYWwgb2JqZWN0IGZvciAndGhpcycsIGhvcGZ1bGx5IG91ciBjb250ZXh0IGNvcnJlY3Qgb3RoZXJ3aXNlIGl0IHdpbGwgdGhyb3cgYSBnbG9iYWwgZXJyb3IuXG4gICAgICAgICAgICAvLyBTb21lIHZlcnNpb25zIG9mIEkuRS4gaGF2ZSBkaWZmZXJlbnQgcnVsZXMgZm9yIGNsZWFyVGltZW91dCB2cyBzZXRUaW1lb3V0XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0LmNhbGwodGhpcywgbWFya2VyKTtcbiAgICAgICAgfVxuICAgIH1cblxuXG5cbn1cbnZhciBxdWV1ZSA9IFtdO1xudmFyIGRyYWluaW5nID0gZmFsc2U7XG52YXIgY3VycmVudFF1ZXVlO1xudmFyIHF1ZXVlSW5kZXggPSAtMTtcblxuZnVuY3Rpb24gY2xlYW5VcE5leHRUaWNrKCkge1xuICAgIGlmICghZHJhaW5pbmcgfHwgIWN1cnJlbnRRdWV1ZSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGRyYWluaW5nID0gZmFsc2U7XG4gICAgaWYgKGN1cnJlbnRRdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgcXVldWUgPSBjdXJyZW50UXVldWUuY29uY2F0KHF1ZXVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBxdWV1ZUluZGV4ID0gLTE7XG4gICAgfVxuICAgIGlmIChxdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgZHJhaW5RdWV1ZSgpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gZHJhaW5RdWV1ZSgpIHtcbiAgICBpZiAoZHJhaW5pbmcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgdGltZW91dCA9IHJ1blRpbWVvdXQoY2xlYW5VcE5leHRUaWNrKTtcbiAgICBkcmFpbmluZyA9IHRydWU7XG5cbiAgICB2YXIgbGVuID0gcXVldWUubGVuZ3RoO1xuICAgIHdoaWxlKGxlbikge1xuICAgICAgICBjdXJyZW50UXVldWUgPSBxdWV1ZTtcbiAgICAgICAgcXVldWUgPSBbXTtcbiAgICAgICAgd2hpbGUgKCsrcXVldWVJbmRleCA8IGxlbikge1xuICAgICAgICAgICAgaWYgKGN1cnJlbnRRdWV1ZSkge1xuICAgICAgICAgICAgICAgIGN1cnJlbnRRdWV1ZVtxdWV1ZUluZGV4XS5ydW4oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBxdWV1ZUluZGV4ID0gLTE7XG4gICAgICAgIGxlbiA9IHF1ZXVlLmxlbmd0aDtcbiAgICB9XG4gICAgY3VycmVudFF1ZXVlID0gbnVsbDtcbiAgICBkcmFpbmluZyA9IGZhbHNlO1xuICAgIHJ1bkNsZWFyVGltZW91dCh0aW1lb3V0KTtcbn1cblxucHJvY2Vzcy5uZXh0VGljayA9IGZ1bmN0aW9uIChmdW4pIHtcbiAgICB2YXIgYXJncyA9IG5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoIC0gMSk7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBhcmdzW2kgLSAxXSA9IGFyZ3VtZW50c1tpXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBxdWV1ZS5wdXNoKG5ldyBJdGVtKGZ1biwgYXJncykpO1xuICAgIGlmIChxdWV1ZS5sZW5ndGggPT09IDEgJiYgIWRyYWluaW5nKSB7XG4gICAgICAgIHJ1blRpbWVvdXQoZHJhaW5RdWV1ZSk7XG4gICAgfVxufTtcblxuLy8gdjggbGlrZXMgcHJlZGljdGlibGUgb2JqZWN0c1xuZnVuY3Rpb24gSXRlbShmdW4sIGFycmF5KSB7XG4gICAgdGhpcy5mdW4gPSBmdW47XG4gICAgdGhpcy5hcnJheSA9IGFycmF5O1xufVxuSXRlbS5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuZnVuLmFwcGx5KG51bGwsIHRoaXMuYXJyYXkpO1xufTtcbnByb2Nlc3MudGl0bGUgPSAnYnJvd3Nlcic7XG5wcm9jZXNzLmJyb3dzZXIgPSB0cnVlO1xucHJvY2Vzcy5lbnYgPSB7fTtcbnByb2Nlc3MuYXJndiA9IFtdO1xucHJvY2Vzcy52ZXJzaW9uID0gJyc7IC8vIGVtcHR5IHN0cmluZyB0byBhdm9pZCByZWdleHAgaXNzdWVzXG5wcm9jZXNzLnZlcnNpb25zID0ge307XG5cbmZ1bmN0aW9uIG5vb3AoKSB7fVxuXG5wcm9jZXNzLm9uID0gbm9vcDtcbnByb2Nlc3MuYWRkTGlzdGVuZXIgPSBub29wO1xucHJvY2Vzcy5vbmNlID0gbm9vcDtcbnByb2Nlc3Mub2ZmID0gbm9vcDtcbnByb2Nlc3MucmVtb3ZlTGlzdGVuZXIgPSBub29wO1xucHJvY2Vzcy5yZW1vdmVBbGxMaXN0ZW5lcnMgPSBub29wO1xucHJvY2Vzcy5lbWl0ID0gbm9vcDtcbnByb2Nlc3MucHJlcGVuZExpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3MucHJlcGVuZE9uY2VMaXN0ZW5lciA9IG5vb3A7XG5cbnByb2Nlc3MubGlzdGVuZXJzID0gZnVuY3Rpb24gKG5hbWUpIHsgcmV0dXJuIFtdIH1cblxucHJvY2Vzcy5iaW5kaW5nID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuYmluZGluZyBpcyBub3Qgc3VwcG9ydGVkJyk7XG59O1xuXG5wcm9jZXNzLmN3ZCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuICcvJyB9O1xucHJvY2Vzcy5jaGRpciA9IGZ1bmN0aW9uIChkaXIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuY2hkaXIgaXMgbm90IHN1cHBvcnRlZCcpO1xufTtcbnByb2Nlc3MudW1hc2sgPSBmdW5jdGlvbigpIHsgcmV0dXJuIDA7IH07XG4iLCIvLyBtaW5pbWFsIGxpYnJhcnkgZW50cnkgcG9pbnQuXG5cblwidXNlIHN0cmljdFwiO1xubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiLi9zcmMvaW5kZXgtbWluaW1hbFwiKTtcbiIsIlwidXNlIHN0cmljdFwiO1xudmFyIHByb3RvYnVmID0gZXhwb3J0cztcblxuLyoqXG4gKiBCdWlsZCB0eXBlLCBvbmUgb2YgYFwiZnVsbFwiYCwgYFwibGlnaHRcImAgb3IgYFwibWluaW1hbFwiYC5cbiAqIEBuYW1lIGJ1aWxkXG4gKiBAdHlwZSB7c3RyaW5nfVxuICogQGNvbnN0XG4gKi9cbnByb3RvYnVmLmJ1aWxkID0gXCJtaW5pbWFsXCI7XG5cbi8vIFNlcmlhbGl6YXRpb25cbnByb3RvYnVmLldyaXRlciAgICAgICA9IHJlcXVpcmUoXCIuL3dyaXRlclwiKTtcbnByb3RvYnVmLkJ1ZmZlcldyaXRlciA9IHJlcXVpcmUoXCIuL3dyaXRlcl9idWZmZXJcIik7XG5wcm90b2J1Zi5SZWFkZXIgICAgICAgPSByZXF1aXJlKFwiLi9yZWFkZXJcIik7XG5wcm90b2J1Zi5CdWZmZXJSZWFkZXIgPSByZXF1aXJlKFwiLi9yZWFkZXJfYnVmZmVyXCIpO1xuXG4vLyBVdGlsaXR5XG5wcm90b2J1Zi51dGlsICAgICAgICAgPSByZXF1aXJlKFwiLi91dGlsL21pbmltYWxcIik7XG5wcm90b2J1Zi5ycGMgICAgICAgICAgPSByZXF1aXJlKFwiLi9ycGNcIik7XG5wcm90b2J1Zi5yb290cyAgICAgICAgPSByZXF1aXJlKFwiLi9yb290c1wiKTtcbnByb3RvYnVmLmNvbmZpZ3VyZSAgICA9IGNvbmZpZ3VyZTtcblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbi8qKlxuICogUmVjb25maWd1cmVzIHRoZSBsaWJyYXJ5IGFjY29yZGluZyB0byB0aGUgZW52aXJvbm1lbnQuXG4gKiBAcmV0dXJucyB7dW5kZWZpbmVkfVxuICovXG5mdW5jdGlvbiBjb25maWd1cmUoKSB7XG4gICAgcHJvdG9idWYudXRpbC5fY29uZmlndXJlKCk7XG4gICAgcHJvdG9idWYuV3JpdGVyLl9jb25maWd1cmUocHJvdG9idWYuQnVmZmVyV3JpdGVyKTtcbiAgICBwcm90b2J1Zi5SZWFkZXIuX2NvbmZpZ3VyZShwcm90b2J1Zi5CdWZmZXJSZWFkZXIpO1xufVxuXG4vLyBTZXQgdXAgYnVmZmVyIHV0aWxpdHkgYWNjb3JkaW5nIHRvIHRoZSBlbnZpcm9ubWVudFxuY29uZmlndXJlKCk7XG4iLCJcInVzZSBzdHJpY3RcIjtcbm1vZHVsZS5leHBvcnRzID0gUmVhZGVyO1xuXG52YXIgdXRpbCAgICAgID0gcmVxdWlyZShcIi4vdXRpbC9taW5pbWFsXCIpO1xuXG52YXIgQnVmZmVyUmVhZGVyOyAvLyBjeWNsaWNcblxudmFyIExvbmdCaXRzICA9IHV0aWwuTG9uZ0JpdHMsXG4gICAgdXRmOCAgICAgID0gdXRpbC51dGY4O1xuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuZnVuY3Rpb24gaW5kZXhPdXRPZlJhbmdlKHJlYWRlciwgd3JpdGVMZW5ndGgpIHtcbiAgICByZXR1cm4gUmFuZ2VFcnJvcihcImluZGV4IG91dCBvZiByYW5nZTogXCIgKyByZWFkZXIucG9zICsgXCIgKyBcIiArICh3cml0ZUxlbmd0aCB8fCAxKSArIFwiID4gXCIgKyByZWFkZXIubGVuKTtcbn1cblxuLyoqXG4gKiBDb25zdHJ1Y3RzIGEgbmV3IHJlYWRlciBpbnN0YW5jZSB1c2luZyB0aGUgc3BlY2lmaWVkIGJ1ZmZlci5cbiAqIEBjbGFzc2Rlc2MgV2lyZSBmb3JtYXQgcmVhZGVyIHVzaW5nIGBVaW50OEFycmF5YCBpZiBhdmFpbGFibGUsIG90aGVyd2lzZSBgQXJyYXlgLlxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IGJ1ZmZlciBCdWZmZXIgdG8gcmVhZCBmcm9tXG4gKi9cbmZ1bmN0aW9uIFJlYWRlcihidWZmZXIpIHtcblxuICAgIC8qKlxuICAgICAqIFJlYWQgYnVmZmVyLlxuICAgICAqIEB0eXBlIHtVaW50OEFycmF5fVxuICAgICAqL1xuICAgIHRoaXMuYnVmID0gYnVmZmVyO1xuXG4gICAgLyoqXG4gICAgICogUmVhZCBidWZmZXIgcG9zaXRpb24uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKi9cbiAgICB0aGlzLnBvcyA9IDA7XG5cbiAgICAvKipcbiAgICAgKiBSZWFkIGJ1ZmZlciBsZW5ndGguXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKi9cbiAgICB0aGlzLmxlbiA9IGJ1ZmZlci5sZW5ndGg7XG59XG5cbnZhciBjcmVhdGVfYXJyYXkgPSB0eXBlb2YgVWludDhBcnJheSAhPT0gXCJ1bmRlZmluZWRcIlxuICAgID8gZnVuY3Rpb24gY3JlYXRlX3R5cGVkX2FycmF5KGJ1ZmZlcikge1xuICAgICAgICBpZiAoYnVmZmVyIGluc3RhbmNlb2YgVWludDhBcnJheSB8fCBBcnJheS5pc0FycmF5KGJ1ZmZlcikpXG4gICAgICAgICAgICByZXR1cm4gbmV3IFJlYWRlcihidWZmZXIpO1xuICAgICAgICB0aHJvdyBFcnJvcihcImlsbGVnYWwgYnVmZmVyXCIpO1xuICAgIH1cbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgIDogZnVuY3Rpb24gY3JlYXRlX2FycmF5KGJ1ZmZlcikge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShidWZmZXIpKVxuICAgICAgICAgICAgcmV0dXJuIG5ldyBSZWFkZXIoYnVmZmVyKTtcbiAgICAgICAgdGhyb3cgRXJyb3IoXCJpbGxlZ2FsIGJ1ZmZlclwiKTtcbiAgICB9O1xuXG52YXIgY3JlYXRlID0gZnVuY3Rpb24gY3JlYXRlKCkge1xuICAgIHJldHVybiB1dGlsLkJ1ZmZlclxuICAgICAgICA/IGZ1bmN0aW9uIGNyZWF0ZV9idWZmZXJfc2V0dXAoYnVmZmVyKSB7XG4gICAgICAgICAgICByZXR1cm4gKFJlYWRlci5jcmVhdGUgPSBmdW5jdGlvbiBjcmVhdGVfYnVmZmVyKGJ1ZmZlcikge1xuICAgICAgICAgICAgICAgIHJldHVybiB1dGlsLkJ1ZmZlci5pc0J1ZmZlcihidWZmZXIpXG4gICAgICAgICAgICAgICAgICAgID8gbmV3IEJ1ZmZlclJlYWRlcihidWZmZXIpXG4gICAgICAgICAgICAgICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgICAgICAgICAgICAgICAgIDogY3JlYXRlX2FycmF5KGJ1ZmZlcik7XG4gICAgICAgICAgICB9KShidWZmZXIpO1xuICAgICAgICB9XG4gICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgICAgIDogY3JlYXRlX2FycmF5O1xufTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IHJlYWRlciB1c2luZyB0aGUgc3BlY2lmaWVkIGJ1ZmZlci5cbiAqIEBmdW5jdGlvblxuICogQHBhcmFtIHtVaW50OEFycmF5fEJ1ZmZlcn0gYnVmZmVyIEJ1ZmZlciB0byByZWFkIGZyb21cbiAqIEByZXR1cm5zIHtSZWFkZXJ8QnVmZmVyUmVhZGVyfSBBIHtAbGluayBCdWZmZXJSZWFkZXJ9IGlmIGBidWZmZXJgIGlzIGEgQnVmZmVyLCBvdGhlcndpc2UgYSB7QGxpbmsgUmVhZGVyfVxuICogQHRocm93cyB7RXJyb3J9IElmIGBidWZmZXJgIGlzIG5vdCBhIHZhbGlkIGJ1ZmZlclxuICovXG5SZWFkZXIuY3JlYXRlID0gY3JlYXRlKCk7XG5cblJlYWRlci5wcm90b3R5cGUuX3NsaWNlID0gdXRpbC5BcnJheS5wcm90b3R5cGUuc3ViYXJyYXkgfHwgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8gdXRpbC5BcnJheS5wcm90b3R5cGUuc2xpY2U7XG5cbi8qKlxuICogUmVhZHMgYSB2YXJpbnQgYXMgYW4gdW5zaWduZWQgMzIgYml0IHZhbHVlLlxuICogQGZ1bmN0aW9uXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBWYWx1ZSByZWFkXG4gKi9cblJlYWRlci5wcm90b3R5cGUudWludDMyID0gKGZ1bmN0aW9uIHJlYWRfdWludDMyX3NldHVwKCkge1xuICAgIHZhciB2YWx1ZSA9IDQyOTQ5NjcyOTU7IC8vIG9wdGltaXplciB0eXBlLWhpbnQsIHRlbmRzIHRvIGRlb3B0IG90aGVyd2lzZSAoPyEpXG4gICAgcmV0dXJuIGZ1bmN0aW9uIHJlYWRfdWludDMyKCkge1xuICAgICAgICB2YWx1ZSA9ICggICAgICAgICB0aGlzLmJ1Zlt0aGlzLnBvc10gJiAxMjcgICAgICAgKSA+Pj4gMDsgaWYgKHRoaXMuYnVmW3RoaXMucG9zKytdIDwgMTI4KSByZXR1cm4gdmFsdWU7XG4gICAgICAgIHZhbHVlID0gKHZhbHVlIHwgKHRoaXMuYnVmW3RoaXMucG9zXSAmIDEyNykgPDwgIDcpID4+PiAwOyBpZiAodGhpcy5idWZbdGhpcy5wb3MrK10gPCAxMjgpIHJldHVybiB2YWx1ZTtcbiAgICAgICAgdmFsdWUgPSAodmFsdWUgfCAodGhpcy5idWZbdGhpcy5wb3NdICYgMTI3KSA8PCAxNCkgPj4+IDA7IGlmICh0aGlzLmJ1Zlt0aGlzLnBvcysrXSA8IDEyOCkgcmV0dXJuIHZhbHVlO1xuICAgICAgICB2YWx1ZSA9ICh2YWx1ZSB8ICh0aGlzLmJ1Zlt0aGlzLnBvc10gJiAxMjcpIDw8IDIxKSA+Pj4gMDsgaWYgKHRoaXMuYnVmW3RoaXMucG9zKytdIDwgMTI4KSByZXR1cm4gdmFsdWU7XG4gICAgICAgIHZhbHVlID0gKHZhbHVlIHwgKHRoaXMuYnVmW3RoaXMucG9zXSAmICAxNSkgPDwgMjgpID4+PiAwOyBpZiAodGhpcy5idWZbdGhpcy5wb3MrK10gPCAxMjgpIHJldHVybiB2YWx1ZTtcblxuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICAgICAgaWYgKCh0aGlzLnBvcyArPSA1KSA+IHRoaXMubGVuKSB7XG4gICAgICAgICAgICB0aGlzLnBvcyA9IHRoaXMubGVuO1xuICAgICAgICAgICAgdGhyb3cgaW5kZXhPdXRPZlJhbmdlKHRoaXMsIDEwKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfTtcbn0pKCk7XG5cbi8qKlxuICogUmVhZHMgYSB2YXJpbnQgYXMgYSBzaWduZWQgMzIgYml0IHZhbHVlLlxuICogQHJldHVybnMge251bWJlcn0gVmFsdWUgcmVhZFxuICovXG5SZWFkZXIucHJvdG90eXBlLmludDMyID0gZnVuY3Rpb24gcmVhZF9pbnQzMigpIHtcbiAgICByZXR1cm4gdGhpcy51aW50MzIoKSB8IDA7XG59O1xuXG4vKipcbiAqIFJlYWRzIGEgemlnLXphZyBlbmNvZGVkIHZhcmludCBhcyBhIHNpZ25lZCAzMiBiaXQgdmFsdWUuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBWYWx1ZSByZWFkXG4gKi9cblJlYWRlci5wcm90b3R5cGUuc2ludDMyID0gZnVuY3Rpb24gcmVhZF9zaW50MzIoKSB7XG4gICAgdmFyIHZhbHVlID0gdGhpcy51aW50MzIoKTtcbiAgICByZXR1cm4gdmFsdWUgPj4+IDEgXiAtKHZhbHVlICYgMSkgfCAwO1xufTtcblxuLyogZXNsaW50LWRpc2FibGUgbm8taW52YWxpZC10aGlzICovXG5cbmZ1bmN0aW9uIHJlYWRMb25nVmFyaW50KCkge1xuICAgIC8vIHRlbmRzIHRvIGRlb3B0IHdpdGggbG9jYWwgdmFycyBmb3Igb2N0ZXQgZXRjLlxuICAgIHZhciBiaXRzID0gbmV3IExvbmdCaXRzKDAsIDApO1xuICAgIHZhciBpID0gMDtcbiAgICBpZiAodGhpcy5sZW4gLSB0aGlzLnBvcyA+IDQpIHsgLy8gZmFzdCByb3V0ZSAobG8pXG4gICAgICAgIGZvciAoOyBpIDwgNDsgKytpKSB7XG4gICAgICAgICAgICAvLyAxc3QuLjR0aFxuICAgICAgICAgICAgYml0cy5sbyA9IChiaXRzLmxvIHwgKHRoaXMuYnVmW3RoaXMucG9zXSAmIDEyNykgPDwgaSAqIDcpID4+PiAwO1xuICAgICAgICAgICAgaWYgKHRoaXMuYnVmW3RoaXMucG9zKytdIDwgMTI4KVxuICAgICAgICAgICAgICAgIHJldHVybiBiaXRzO1xuICAgICAgICB9XG4gICAgICAgIC8vIDV0aFxuICAgICAgICBiaXRzLmxvID0gKGJpdHMubG8gfCAodGhpcy5idWZbdGhpcy5wb3NdICYgMTI3KSA8PCAyOCkgPj4+IDA7XG4gICAgICAgIGJpdHMuaGkgPSAoYml0cy5oaSB8ICh0aGlzLmJ1Zlt0aGlzLnBvc10gJiAxMjcpID4+ICA0KSA+Pj4gMDtcbiAgICAgICAgaWYgKHRoaXMuYnVmW3RoaXMucG9zKytdIDwgMTI4KVxuICAgICAgICAgICAgcmV0dXJuIGJpdHM7XG4gICAgICAgIGkgPSAwO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGZvciAoOyBpIDwgMzsgKytpKSB7XG4gICAgICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICAgICAgICAgIGlmICh0aGlzLnBvcyA+PSB0aGlzLmxlbilcbiAgICAgICAgICAgICAgICB0aHJvdyBpbmRleE91dE9mUmFuZ2UodGhpcyk7XG4gICAgICAgICAgICAvLyAxc3QuLjN0aFxuICAgICAgICAgICAgYml0cy5sbyA9IChiaXRzLmxvIHwgKHRoaXMuYnVmW3RoaXMucG9zXSAmIDEyNykgPDwgaSAqIDcpID4+PiAwO1xuICAgICAgICAgICAgaWYgKHRoaXMuYnVmW3RoaXMucG9zKytdIDwgMTI4KVxuICAgICAgICAgICAgICAgIHJldHVybiBiaXRzO1xuICAgICAgICB9XG4gICAgICAgIC8vIDR0aFxuICAgICAgICBiaXRzLmxvID0gKGJpdHMubG8gfCAodGhpcy5idWZbdGhpcy5wb3MrK10gJiAxMjcpIDw8IGkgKiA3KSA+Pj4gMDtcbiAgICAgICAgcmV0dXJuIGJpdHM7XG4gICAgfVxuICAgIGlmICh0aGlzLmxlbiAtIHRoaXMucG9zID4gNCkgeyAvLyBmYXN0IHJvdXRlIChoaSlcbiAgICAgICAgZm9yICg7IGkgPCA1OyArK2kpIHtcbiAgICAgICAgICAgIC8vIDZ0aC4uMTB0aFxuICAgICAgICAgICAgYml0cy5oaSA9IChiaXRzLmhpIHwgKHRoaXMuYnVmW3RoaXMucG9zXSAmIDEyNykgPDwgaSAqIDcgKyAzKSA+Pj4gMDtcbiAgICAgICAgICAgIGlmICh0aGlzLmJ1Zlt0aGlzLnBvcysrXSA8IDEyOClcbiAgICAgICAgICAgICAgICByZXR1cm4gYml0cztcbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAgIGZvciAoOyBpIDwgNTsgKytpKSB7XG4gICAgICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICAgICAgICAgIGlmICh0aGlzLnBvcyA+PSB0aGlzLmxlbilcbiAgICAgICAgICAgICAgICB0aHJvdyBpbmRleE91dE9mUmFuZ2UodGhpcyk7XG4gICAgICAgICAgICAvLyA2dGguLjEwdGhcbiAgICAgICAgICAgIGJpdHMuaGkgPSAoYml0cy5oaSB8ICh0aGlzLmJ1Zlt0aGlzLnBvc10gJiAxMjcpIDw8IGkgKiA3ICsgMykgPj4+IDA7XG4gICAgICAgICAgICBpZiAodGhpcy5idWZbdGhpcy5wb3MrK10gPCAxMjgpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGJpdHM7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICB0aHJvdyBFcnJvcihcImludmFsaWQgdmFyaW50IGVuY29kaW5nXCIpO1xufVxuXG4vKiBlc2xpbnQtZW5hYmxlIG5vLWludmFsaWQtdGhpcyAqL1xuXG4vKipcbiAqIFJlYWRzIGEgdmFyaW50IGFzIGEgc2lnbmVkIDY0IGJpdCB2YWx1ZS5cbiAqIEBuYW1lIFJlYWRlciNpbnQ2NFxuICogQGZ1bmN0aW9uXG4gKiBAcmV0dXJucyB7TG9uZ30gVmFsdWUgcmVhZFxuICovXG5cbi8qKlxuICogUmVhZHMgYSB2YXJpbnQgYXMgYW4gdW5zaWduZWQgNjQgYml0IHZhbHVlLlxuICogQG5hbWUgUmVhZGVyI3VpbnQ2NFxuICogQGZ1bmN0aW9uXG4gKiBAcmV0dXJucyB7TG9uZ30gVmFsdWUgcmVhZFxuICovXG5cbi8qKlxuICogUmVhZHMgYSB6aWctemFnIGVuY29kZWQgdmFyaW50IGFzIGEgc2lnbmVkIDY0IGJpdCB2YWx1ZS5cbiAqIEBuYW1lIFJlYWRlciNzaW50NjRcbiAqIEBmdW5jdGlvblxuICogQHJldHVybnMge0xvbmd9IFZhbHVlIHJlYWRcbiAqL1xuXG4vKipcbiAqIFJlYWRzIGEgdmFyaW50IGFzIGEgYm9vbGVhbi5cbiAqIEByZXR1cm5zIHtib29sZWFufSBWYWx1ZSByZWFkXG4gKi9cblJlYWRlci5wcm90b3R5cGUuYm9vbCA9IGZ1bmN0aW9uIHJlYWRfYm9vbCgpIHtcbiAgICByZXR1cm4gdGhpcy51aW50MzIoKSAhPT0gMDtcbn07XG5cbmZ1bmN0aW9uIHJlYWRGaXhlZDMyX2VuZChidWYsIGVuZCkgeyAvLyBub3RlIHRoYXQgdGhpcyB1c2VzIGBlbmRgLCBub3QgYHBvc2BcbiAgICByZXR1cm4gKGJ1ZltlbmQgLSA0XVxuICAgICAgICAgIHwgYnVmW2VuZCAtIDNdIDw8IDhcbiAgICAgICAgICB8IGJ1ZltlbmQgLSAyXSA8PCAxNlxuICAgICAgICAgIHwgYnVmW2VuZCAtIDFdIDw8IDI0KSA+Pj4gMDtcbn1cblxuLyoqXG4gKiBSZWFkcyBmaXhlZCAzMiBiaXRzIGFzIGFuIHVuc2lnbmVkIDMyIGJpdCBpbnRlZ2VyLlxuICogQHJldHVybnMge251bWJlcn0gVmFsdWUgcmVhZFxuICovXG5SZWFkZXIucHJvdG90eXBlLmZpeGVkMzIgPSBmdW5jdGlvbiByZWFkX2ZpeGVkMzIoKSB7XG5cbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICBpZiAodGhpcy5wb3MgKyA0ID4gdGhpcy5sZW4pXG4gICAgICAgIHRocm93IGluZGV4T3V0T2ZSYW5nZSh0aGlzLCA0KTtcblxuICAgIHJldHVybiByZWFkRml4ZWQzMl9lbmQodGhpcy5idWYsIHRoaXMucG9zICs9IDQpO1xufTtcblxuLyoqXG4gKiBSZWFkcyBmaXhlZCAzMiBiaXRzIGFzIGEgc2lnbmVkIDMyIGJpdCBpbnRlZ2VyLlxuICogQHJldHVybnMge251bWJlcn0gVmFsdWUgcmVhZFxuICovXG5SZWFkZXIucHJvdG90eXBlLnNmaXhlZDMyID0gZnVuY3Rpb24gcmVhZF9zZml4ZWQzMigpIHtcblxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgIGlmICh0aGlzLnBvcyArIDQgPiB0aGlzLmxlbilcbiAgICAgICAgdGhyb3cgaW5kZXhPdXRPZlJhbmdlKHRoaXMsIDQpO1xuXG4gICAgcmV0dXJuIHJlYWRGaXhlZDMyX2VuZCh0aGlzLmJ1ZiwgdGhpcy5wb3MgKz0gNCkgfCAwO1xufTtcblxuLyogZXNsaW50LWRpc2FibGUgbm8taW52YWxpZC10aGlzICovXG5cbmZ1bmN0aW9uIHJlYWRGaXhlZDY0KC8qIHRoaXM6IFJlYWRlciAqLykge1xuXG4gICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgaWYgKHRoaXMucG9zICsgOCA+IHRoaXMubGVuKVxuICAgICAgICB0aHJvdyBpbmRleE91dE9mUmFuZ2UodGhpcywgOCk7XG5cbiAgICByZXR1cm4gbmV3IExvbmdCaXRzKHJlYWRGaXhlZDMyX2VuZCh0aGlzLmJ1ZiwgdGhpcy5wb3MgKz0gNCksIHJlYWRGaXhlZDMyX2VuZCh0aGlzLmJ1ZiwgdGhpcy5wb3MgKz0gNCkpO1xufVxuXG4vKiBlc2xpbnQtZW5hYmxlIG5vLWludmFsaWQtdGhpcyAqL1xuXG4vKipcbiAqIFJlYWRzIGZpeGVkIDY0IGJpdHMuXG4gKiBAbmFtZSBSZWFkZXIjZml4ZWQ2NFxuICogQGZ1bmN0aW9uXG4gKiBAcmV0dXJucyB7TG9uZ30gVmFsdWUgcmVhZFxuICovXG5cbi8qKlxuICogUmVhZHMgemlnLXphZyBlbmNvZGVkIGZpeGVkIDY0IGJpdHMuXG4gKiBAbmFtZSBSZWFkZXIjc2ZpeGVkNjRcbiAqIEBmdW5jdGlvblxuICogQHJldHVybnMge0xvbmd9IFZhbHVlIHJlYWRcbiAqL1xuXG4vKipcbiAqIFJlYWRzIGEgZmxvYXQgKDMyIGJpdCkgYXMgYSBudW1iZXIuXG4gKiBAZnVuY3Rpb25cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFZhbHVlIHJlYWRcbiAqL1xuUmVhZGVyLnByb3RvdHlwZS5mbG9hdCA9IGZ1bmN0aW9uIHJlYWRfZmxvYXQoKSB7XG5cbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICBpZiAodGhpcy5wb3MgKyA0ID4gdGhpcy5sZW4pXG4gICAgICAgIHRocm93IGluZGV4T3V0T2ZSYW5nZSh0aGlzLCA0KTtcblxuICAgIHZhciB2YWx1ZSA9IHV0aWwuZmxvYXQucmVhZEZsb2F0TEUodGhpcy5idWYsIHRoaXMucG9zKTtcbiAgICB0aGlzLnBvcyArPSA0O1xuICAgIHJldHVybiB2YWx1ZTtcbn07XG5cbi8qKlxuICogUmVhZHMgYSBkb3VibGUgKDY0IGJpdCBmbG9hdCkgYXMgYSBudW1iZXIuXG4gKiBAZnVuY3Rpb25cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFZhbHVlIHJlYWRcbiAqL1xuUmVhZGVyLnByb3RvdHlwZS5kb3VibGUgPSBmdW5jdGlvbiByZWFkX2RvdWJsZSgpIHtcblxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgIGlmICh0aGlzLnBvcyArIDggPiB0aGlzLmxlbilcbiAgICAgICAgdGhyb3cgaW5kZXhPdXRPZlJhbmdlKHRoaXMsIDQpO1xuXG4gICAgdmFyIHZhbHVlID0gdXRpbC5mbG9hdC5yZWFkRG91YmxlTEUodGhpcy5idWYsIHRoaXMucG9zKTtcbiAgICB0aGlzLnBvcyArPSA4O1xuICAgIHJldHVybiB2YWx1ZTtcbn07XG5cbi8qKlxuICogUmVhZHMgYSBzZXF1ZW5jZSBvZiBieXRlcyBwcmVjZWVkZWQgYnkgaXRzIGxlbmd0aCBhcyBhIHZhcmludC5cbiAqIEByZXR1cm5zIHtVaW50OEFycmF5fSBWYWx1ZSByZWFkXG4gKi9cblJlYWRlci5wcm90b3R5cGUuYnl0ZXMgPSBmdW5jdGlvbiByZWFkX2J5dGVzKCkge1xuICAgIHZhciBsZW5ndGggPSB0aGlzLnVpbnQzMigpLFxuICAgICAgICBzdGFydCAgPSB0aGlzLnBvcyxcbiAgICAgICAgZW5kICAgID0gdGhpcy5wb3MgKyBsZW5ndGg7XG5cbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICBpZiAoZW5kID4gdGhpcy5sZW4pXG4gICAgICAgIHRocm93IGluZGV4T3V0T2ZSYW5nZSh0aGlzLCBsZW5ndGgpO1xuXG4gICAgdGhpcy5wb3MgKz0gbGVuZ3RoO1xuICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMuYnVmKSkgLy8gcGxhaW4gYXJyYXlcbiAgICAgICAgcmV0dXJuIHRoaXMuYnVmLnNsaWNlKHN0YXJ0LCBlbmQpO1xuICAgIHJldHVybiBzdGFydCA9PT0gZW5kIC8vIGZpeCBmb3IgSUUgMTAvV2luOCBhbmQgb3RoZXJzJyBzdWJhcnJheSByZXR1cm5pbmcgYXJyYXkgb2Ygc2l6ZSAxXG4gICAgICAgID8gbmV3IHRoaXMuYnVmLmNvbnN0cnVjdG9yKDApXG4gICAgICAgIDogdGhpcy5fc2xpY2UuY2FsbCh0aGlzLmJ1Ziwgc3RhcnQsIGVuZCk7XG59O1xuXG4vKipcbiAqIFJlYWRzIGEgc3RyaW5nIHByZWNlZWRlZCBieSBpdHMgYnl0ZSBsZW5ndGggYXMgYSB2YXJpbnQuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBWYWx1ZSByZWFkXG4gKi9cblJlYWRlci5wcm90b3R5cGUuc3RyaW5nID0gZnVuY3Rpb24gcmVhZF9zdHJpbmcoKSB7XG4gICAgdmFyIGJ5dGVzID0gdGhpcy5ieXRlcygpO1xuICAgIHJldHVybiB1dGY4LnJlYWQoYnl0ZXMsIDAsIGJ5dGVzLmxlbmd0aCk7XG59O1xuXG4vKipcbiAqIFNraXBzIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGJ5dGVzIGlmIHNwZWNpZmllZCwgb3RoZXJ3aXNlIHNraXBzIGEgdmFyaW50LlxuICogQHBhcmFtIHtudW1iZXJ9IFtsZW5ndGhdIExlbmd0aCBpZiBrbm93biwgb3RoZXJ3aXNlIGEgdmFyaW50IGlzIGFzc3VtZWRcbiAqIEByZXR1cm5zIHtSZWFkZXJ9IGB0aGlzYFxuICovXG5SZWFkZXIucHJvdG90eXBlLnNraXAgPSBmdW5jdGlvbiBza2lwKGxlbmd0aCkge1xuICAgIGlmICh0eXBlb2YgbGVuZ3RoID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgICBpZiAodGhpcy5wb3MgKyBsZW5ndGggPiB0aGlzLmxlbilcbiAgICAgICAgICAgIHRocm93IGluZGV4T3V0T2ZSYW5nZSh0aGlzLCBsZW5ndGgpO1xuICAgICAgICB0aGlzLnBvcyArPSBsZW5ndGg7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgZG8ge1xuICAgICAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgICAgICAgICBpZiAodGhpcy5wb3MgPj0gdGhpcy5sZW4pXG4gICAgICAgICAgICAgICAgdGhyb3cgaW5kZXhPdXRPZlJhbmdlKHRoaXMpO1xuICAgICAgICB9IHdoaWxlICh0aGlzLmJ1Zlt0aGlzLnBvcysrXSAmIDEyOCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBTa2lwcyB0aGUgbmV4dCBlbGVtZW50IG9mIHRoZSBzcGVjaWZpZWQgd2lyZSB0eXBlLlxuICogQHBhcmFtIHtudW1iZXJ9IHdpcmVUeXBlIFdpcmUgdHlwZSByZWNlaXZlZFxuICogQHJldHVybnMge1JlYWRlcn0gYHRoaXNgXG4gKi9cblJlYWRlci5wcm90b3R5cGUuc2tpcFR5cGUgPSBmdW5jdGlvbih3aXJlVHlwZSkge1xuICAgIHN3aXRjaCAod2lyZVR5cGUpIHtcbiAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgdGhpcy5za2lwKCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgdGhpcy5za2lwKDgpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgIHRoaXMuc2tpcCh0aGlzLnVpbnQzMigpKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICB3aGlsZSAoKHdpcmVUeXBlID0gdGhpcy51aW50MzIoKSAmIDcpICE9PSA0KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5za2lwVHlwZSh3aXJlVHlwZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgdGhpcy5za2lwKDQpO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHRocm93IEVycm9yKFwiaW52YWxpZCB3aXJlIHR5cGUgXCIgKyB3aXJlVHlwZSArIFwiIGF0IG9mZnNldCBcIiArIHRoaXMucG9zKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG59O1xuXG5SZWFkZXIuX2NvbmZpZ3VyZSA9IGZ1bmN0aW9uKEJ1ZmZlclJlYWRlcl8pIHtcbiAgICBCdWZmZXJSZWFkZXIgPSBCdWZmZXJSZWFkZXJfO1xuICAgIFJlYWRlci5jcmVhdGUgPSBjcmVhdGUoKTtcbiAgICBCdWZmZXJSZWFkZXIuX2NvbmZpZ3VyZSgpO1xuXG4gICAgdmFyIGZuID0gdXRpbC5Mb25nID8gXCJ0b0xvbmdcIiA6IC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovIFwidG9OdW1iZXJcIjtcbiAgICB1dGlsLm1lcmdlKFJlYWRlci5wcm90b3R5cGUsIHtcblxuICAgICAgICBpbnQ2NDogZnVuY3Rpb24gcmVhZF9pbnQ2NCgpIHtcbiAgICAgICAgICAgIHJldHVybiByZWFkTG9uZ1ZhcmludC5jYWxsKHRoaXMpW2ZuXShmYWxzZSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgdWludDY0OiBmdW5jdGlvbiByZWFkX3VpbnQ2NCgpIHtcbiAgICAgICAgICAgIHJldHVybiByZWFkTG9uZ1ZhcmludC5jYWxsKHRoaXMpW2ZuXSh0cnVlKTtcbiAgICAgICAgfSxcblxuICAgICAgICBzaW50NjQ6IGZ1bmN0aW9uIHJlYWRfc2ludDY0KCkge1xuICAgICAgICAgICAgcmV0dXJuIHJlYWRMb25nVmFyaW50LmNhbGwodGhpcykuenpEZWNvZGUoKVtmbl0oZmFsc2UpO1xuICAgICAgICB9LFxuXG4gICAgICAgIGZpeGVkNjQ6IGZ1bmN0aW9uIHJlYWRfZml4ZWQ2NCgpIHtcbiAgICAgICAgICAgIHJldHVybiByZWFkRml4ZWQ2NC5jYWxsKHRoaXMpW2ZuXSh0cnVlKTtcbiAgICAgICAgfSxcblxuICAgICAgICBzZml4ZWQ2NDogZnVuY3Rpb24gcmVhZF9zZml4ZWQ2NCgpIHtcbiAgICAgICAgICAgIHJldHVybiByZWFkRml4ZWQ2NC5jYWxsKHRoaXMpW2ZuXShmYWxzZSk7XG4gICAgICAgIH1cblxuICAgIH0pO1xufTtcbiIsIlwidXNlIHN0cmljdFwiO1xubW9kdWxlLmV4cG9ydHMgPSBCdWZmZXJSZWFkZXI7XG5cbi8vIGV4dGVuZHMgUmVhZGVyXG52YXIgUmVhZGVyID0gcmVxdWlyZShcIi4vcmVhZGVyXCIpO1xuKEJ1ZmZlclJlYWRlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKFJlYWRlci5wcm90b3R5cGUpKS5jb25zdHJ1Y3RvciA9IEJ1ZmZlclJlYWRlcjtcblxudmFyIHV0aWwgPSByZXF1aXJlKFwiLi91dGlsL21pbmltYWxcIik7XG5cbi8qKlxuICogQ29uc3RydWN0cyBhIG5ldyBidWZmZXIgcmVhZGVyIGluc3RhbmNlLlxuICogQGNsYXNzZGVzYyBXaXJlIGZvcm1hdCByZWFkZXIgdXNpbmcgbm9kZSBidWZmZXJzLlxuICogQGV4dGVuZHMgUmVhZGVyXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7QnVmZmVyfSBidWZmZXIgQnVmZmVyIHRvIHJlYWQgZnJvbVxuICovXG5mdW5jdGlvbiBCdWZmZXJSZWFkZXIoYnVmZmVyKSB7XG4gICAgUmVhZGVyLmNhbGwodGhpcywgYnVmZmVyKTtcblxuICAgIC8qKlxuICAgICAqIFJlYWQgYnVmZmVyLlxuICAgICAqIEBuYW1lIEJ1ZmZlclJlYWRlciNidWZcbiAgICAgKiBAdHlwZSB7QnVmZmVyfVxuICAgICAqL1xufVxuXG5CdWZmZXJSZWFkZXIuX2NvbmZpZ3VyZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgIGlmICh1dGlsLkJ1ZmZlcilcbiAgICAgICAgQnVmZmVyUmVhZGVyLnByb3RvdHlwZS5fc2xpY2UgPSB1dGlsLkJ1ZmZlci5wcm90b3R5cGUuc2xpY2U7XG59O1xuXG5cbi8qKlxuICogQG92ZXJyaWRlXG4gKi9cbkJ1ZmZlclJlYWRlci5wcm90b3R5cGUuc3RyaW5nID0gZnVuY3Rpb24gcmVhZF9zdHJpbmdfYnVmZmVyKCkge1xuICAgIHZhciBsZW4gPSB0aGlzLnVpbnQzMigpOyAvLyBtb2RpZmllcyBwb3NcbiAgICByZXR1cm4gdGhpcy5idWYudXRmOFNsaWNlXG4gICAgICAgID8gdGhpcy5idWYudXRmOFNsaWNlKHRoaXMucG9zLCB0aGlzLnBvcyA9IE1hdGgubWluKHRoaXMucG9zICsgbGVuLCB0aGlzLmxlbikpXG4gICAgICAgIDogdGhpcy5idWYudG9TdHJpbmcoXCJ1dGYtOFwiLCB0aGlzLnBvcywgdGhpcy5wb3MgPSBNYXRoLm1pbih0aGlzLnBvcyArIGxlbiwgdGhpcy5sZW4pKTtcbn07XG5cbi8qKlxuICogUmVhZHMgYSBzZXF1ZW5jZSBvZiBieXRlcyBwcmVjZWVkZWQgYnkgaXRzIGxlbmd0aCBhcyBhIHZhcmludC5cbiAqIEBuYW1lIEJ1ZmZlclJlYWRlciNieXRlc1xuICogQGZ1bmN0aW9uXG4gKiBAcmV0dXJucyB7QnVmZmVyfSBWYWx1ZSByZWFkXG4gKi9cblxuQnVmZmVyUmVhZGVyLl9jb25maWd1cmUoKTtcbiIsIlwidXNlIHN0cmljdFwiO1xubW9kdWxlLmV4cG9ydHMgPSB7fTtcblxuLyoqXG4gKiBOYW1lZCByb290cy5cbiAqIFRoaXMgaXMgd2hlcmUgcGJqcyBzdG9yZXMgZ2VuZXJhdGVkIHN0cnVjdHVyZXMgKHRoZSBvcHRpb24gYC1yLCAtLXJvb3RgIHNwZWNpZmllcyBhIG5hbWUpLlxuICogQ2FuIGFsc28gYmUgdXNlZCBtYW51YWxseSB0byBtYWtlIHJvb3RzIGF2YWlsYWJsZSBhY2Nyb3NzIG1vZHVsZXMuXG4gKiBAbmFtZSByb290c1xuICogQHR5cGUge09iamVjdC48c3RyaW5nLFJvb3Q+fVxuICogQGV4YW1wbGVcbiAqIC8vIHBianMgLXIgbXlyb290IC1vIGNvbXBpbGVkLmpzIC4uLlxuICpcbiAqIC8vIGluIGFub3RoZXIgbW9kdWxlOlxuICogcmVxdWlyZShcIi4vY29tcGlsZWQuanNcIik7XG4gKlxuICogLy8gaW4gYW55IHN1YnNlcXVlbnQgbW9kdWxlOlxuICogdmFyIHJvb3QgPSBwcm90b2J1Zi5yb290c1tcIm15cm9vdFwiXTtcbiAqL1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbi8qKlxuICogU3RyZWFtaW5nIFJQQyBoZWxwZXJzLlxuICogQG5hbWVzcGFjZVxuICovXG52YXIgcnBjID0gZXhwb3J0cztcblxuLyoqXG4gKiBSUEMgaW1wbGVtZW50YXRpb24gcGFzc2VkIHRvIHtAbGluayBTZXJ2aWNlI2NyZWF0ZX0gcGVyZm9ybWluZyBhIHNlcnZpY2UgcmVxdWVzdCBvbiBuZXR3b3JrIGxldmVsLCBpLmUuIGJ5IHV0aWxpemluZyBodHRwIHJlcXVlc3RzIG9yIHdlYnNvY2tldHMuXG4gKiBAdHlwZWRlZiBSUENJbXBsXG4gKiBAdHlwZSB7ZnVuY3Rpb259XG4gKiBAcGFyYW0ge01ldGhvZHxycGMuU2VydmljZU1ldGhvZDxNZXNzYWdlPHt9PixNZXNzYWdlPHt9Pj59IG1ldGhvZCBSZWZsZWN0ZWQgb3Igc3RhdGljIG1ldGhvZCBiZWluZyBjYWxsZWRcbiAqIEBwYXJhbSB7VWludDhBcnJheX0gcmVxdWVzdERhdGEgUmVxdWVzdCBkYXRhXG4gKiBAcGFyYW0ge1JQQ0ltcGxDYWxsYmFja30gY2FsbGJhY2sgQ2FsbGJhY2sgZnVuY3Rpb25cbiAqIEByZXR1cm5zIHt1bmRlZmluZWR9XG4gKiBAZXhhbXBsZVxuICogZnVuY3Rpb24gcnBjSW1wbChtZXRob2QsIHJlcXVlc3REYXRhLCBjYWxsYmFjaykge1xuICogICAgIGlmIChwcm90b2J1Zi51dGlsLmxjRmlyc3QobWV0aG9kLm5hbWUpICE9PSBcIm15TWV0aG9kXCIpIC8vIGNvbXBhdGlibGUgd2l0aCBzdGF0aWMgY29kZVxuICogICAgICAgICB0aHJvdyBFcnJvcihcIm5vIHN1Y2ggbWV0aG9kXCIpO1xuICogICAgIGFzeW5jaHJvbm91c2x5T2J0YWluQVJlc3BvbnNlKHJlcXVlc3REYXRhLCBmdW5jdGlvbihlcnIsIHJlc3BvbnNlRGF0YSkge1xuICogICAgICAgICBjYWxsYmFjayhlcnIsIHJlc3BvbnNlRGF0YSk7XG4gKiAgICAgfSk7XG4gKiB9XG4gKi9cblxuLyoqXG4gKiBOb2RlLXN0eWxlIGNhbGxiYWNrIGFzIHVzZWQgYnkge0BsaW5rIFJQQ0ltcGx9LlxuICogQHR5cGVkZWYgUlBDSW1wbENhbGxiYWNrXG4gKiBAdHlwZSB7ZnVuY3Rpb259XG4gKiBAcGFyYW0ge0Vycm9yfG51bGx9IGVycm9yIEVycm9yLCBpZiBhbnksIG90aGVyd2lzZSBgbnVsbGBcbiAqIEBwYXJhbSB7VWludDhBcnJheXxudWxsfSBbcmVzcG9uc2VdIFJlc3BvbnNlIGRhdGEgb3IgYG51bGxgIHRvIHNpZ25hbCBlbmQgb2Ygc3RyZWFtLCBpZiB0aGVyZSBoYXNuJ3QgYmVlbiBhbiBlcnJvclxuICogQHJldHVybnMge3VuZGVmaW5lZH1cbiAqL1xuXG5ycGMuU2VydmljZSA9IHJlcXVpcmUoXCIuL3JwYy9zZXJ2aWNlXCIpO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5tb2R1bGUuZXhwb3J0cyA9IFNlcnZpY2U7XG5cbnZhciB1dGlsID0gcmVxdWlyZShcIi4uL3V0aWwvbWluaW1hbFwiKTtcblxuLy8gRXh0ZW5kcyBFdmVudEVtaXR0ZXJcbihTZXJ2aWNlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUodXRpbC5FdmVudEVtaXR0ZXIucHJvdG90eXBlKSkuY29uc3RydWN0b3IgPSBTZXJ2aWNlO1xuXG4vKipcbiAqIEEgc2VydmljZSBtZXRob2QgY2FsbGJhY2sgYXMgdXNlZCBieSB7QGxpbmsgcnBjLlNlcnZpY2VNZXRob2R8U2VydmljZU1ldGhvZH0uXG4gKlxuICogRGlmZmVycyBmcm9tIHtAbGluayBSUENJbXBsQ2FsbGJhY2t9IGluIHRoYXQgaXQgaXMgYW4gYWN0dWFsIGNhbGxiYWNrIG9mIGEgc2VydmljZSBtZXRob2Qgd2hpY2ggbWF5IG5vdCByZXR1cm4gYHJlc3BvbnNlID0gbnVsbGAuXG4gKiBAdHlwZWRlZiBycGMuU2VydmljZU1ldGhvZENhbGxiYWNrXG4gKiBAdGVtcGxhdGUgVFJlcyBleHRlbmRzIE1lc3NhZ2U8VFJlcz5cbiAqIEB0eXBlIHtmdW5jdGlvbn1cbiAqIEBwYXJhbSB7RXJyb3J8bnVsbH0gZXJyb3IgRXJyb3IsIGlmIGFueVxuICogQHBhcmFtIHtUUmVzfSBbcmVzcG9uc2VdIFJlc3BvbnNlIG1lc3NhZ2VcbiAqIEByZXR1cm5zIHt1bmRlZmluZWR9XG4gKi9cblxuLyoqXG4gKiBBIHNlcnZpY2UgbWV0aG9kIHBhcnQgb2YgYSB7QGxpbmsgcnBjLlNlcnZpY2V9IGFzIGNyZWF0ZWQgYnkge0BsaW5rIFNlcnZpY2UuY3JlYXRlfS5cbiAqIEB0eXBlZGVmIHJwYy5TZXJ2aWNlTWV0aG9kXG4gKiBAdGVtcGxhdGUgVFJlcSBleHRlbmRzIE1lc3NhZ2U8VFJlcT5cbiAqIEB0ZW1wbGF0ZSBUUmVzIGV4dGVuZHMgTWVzc2FnZTxUUmVzPlxuICogQHR5cGUge2Z1bmN0aW9ufVxuICogQHBhcmFtIHtUUmVxfFByb3BlcnRpZXM8VFJlcT59IHJlcXVlc3QgUmVxdWVzdCBtZXNzYWdlIG9yIHBsYWluIG9iamVjdFxuICogQHBhcmFtIHtycGMuU2VydmljZU1ldGhvZENhbGxiYWNrPFRSZXM+fSBbY2FsbGJhY2tdIE5vZGUtc3R5bGUgY2FsbGJhY2sgY2FsbGVkIHdpdGggdGhlIGVycm9yLCBpZiBhbnksIGFuZCB0aGUgcmVzcG9uc2UgbWVzc2FnZVxuICogQHJldHVybnMge1Byb21pc2U8TWVzc2FnZTxUUmVzPj59IFByb21pc2UgaWYgYGNhbGxiYWNrYCBoYXMgYmVlbiBvbWl0dGVkLCBvdGhlcndpc2UgYHVuZGVmaW5lZGBcbiAqL1xuXG4vKipcbiAqIENvbnN0cnVjdHMgYSBuZXcgUlBDIHNlcnZpY2UgaW5zdGFuY2UuXG4gKiBAY2xhc3NkZXNjIEFuIFJQQyBzZXJ2aWNlIGFzIHJldHVybmVkIGJ5IHtAbGluayBTZXJ2aWNlI2NyZWF0ZX0uXG4gKiBAZXhwb3J0cyBycGMuU2VydmljZVxuICogQGV4dGVuZHMgdXRpbC5FdmVudEVtaXR0ZXJcbiAqIEBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHtSUENJbXBsfSBycGNJbXBsIFJQQyBpbXBsZW1lbnRhdGlvblxuICogQHBhcmFtIHtib29sZWFufSBbcmVxdWVzdERlbGltaXRlZD1mYWxzZV0gV2hldGhlciByZXF1ZXN0cyBhcmUgbGVuZ3RoLWRlbGltaXRlZFxuICogQHBhcmFtIHtib29sZWFufSBbcmVzcG9uc2VEZWxpbWl0ZWQ9ZmFsc2VdIFdoZXRoZXIgcmVzcG9uc2VzIGFyZSBsZW5ndGgtZGVsaW1pdGVkXG4gKi9cbmZ1bmN0aW9uIFNlcnZpY2UocnBjSW1wbCwgcmVxdWVzdERlbGltaXRlZCwgcmVzcG9uc2VEZWxpbWl0ZWQpIHtcblxuICAgIGlmICh0eXBlb2YgcnBjSW1wbCAhPT0gXCJmdW5jdGlvblwiKVxuICAgICAgICB0aHJvdyBUeXBlRXJyb3IoXCJycGNJbXBsIG11c3QgYmUgYSBmdW5jdGlvblwiKTtcblxuICAgIHV0aWwuRXZlbnRFbWl0dGVyLmNhbGwodGhpcyk7XG5cbiAgICAvKipcbiAgICAgKiBSUEMgaW1wbGVtZW50YXRpb24uIEJlY29tZXMgYG51bGxgIG9uY2UgdGhlIHNlcnZpY2UgaXMgZW5kZWQuXG4gICAgICogQHR5cGUge1JQQ0ltcGx8bnVsbH1cbiAgICAgKi9cbiAgICB0aGlzLnJwY0ltcGwgPSBycGNJbXBsO1xuXG4gICAgLyoqXG4gICAgICogV2hldGhlciByZXF1ZXN0cyBhcmUgbGVuZ3RoLWRlbGltaXRlZC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICB0aGlzLnJlcXVlc3REZWxpbWl0ZWQgPSBCb29sZWFuKHJlcXVlc3REZWxpbWl0ZWQpO1xuXG4gICAgLyoqXG4gICAgICogV2hldGhlciByZXNwb25zZXMgYXJlIGxlbmd0aC1kZWxpbWl0ZWQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICovXG4gICAgdGhpcy5yZXNwb25zZURlbGltaXRlZCA9IEJvb2xlYW4ocmVzcG9uc2VEZWxpbWl0ZWQpO1xufVxuXG4vKipcbiAqIENhbGxzIGEgc2VydmljZSBtZXRob2QgdGhyb3VnaCB7QGxpbmsgcnBjLlNlcnZpY2UjcnBjSW1wbHxycGNJbXBsfS5cbiAqIEBwYXJhbSB7TWV0aG9kfHJwYy5TZXJ2aWNlTWV0aG9kPFRSZXEsVFJlcz59IG1ldGhvZCBSZWZsZWN0ZWQgb3Igc3RhdGljIG1ldGhvZFxuICogQHBhcmFtIHtDb25zdHJ1Y3RvcjxUUmVxPn0gcmVxdWVzdEN0b3IgUmVxdWVzdCBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHtDb25zdHJ1Y3RvcjxUUmVzPn0gcmVzcG9uc2VDdG9yIFJlc3BvbnNlIGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge1RSZXF8UHJvcGVydGllczxUUmVxPn0gcmVxdWVzdCBSZXF1ZXN0IG1lc3NhZ2Ugb3IgcGxhaW4gb2JqZWN0XG4gKiBAcGFyYW0ge3JwYy5TZXJ2aWNlTWV0aG9kQ2FsbGJhY2s8VFJlcz59IGNhbGxiYWNrIFNlcnZpY2UgY2FsbGJhY2tcbiAqIEByZXR1cm5zIHt1bmRlZmluZWR9XG4gKiBAdGVtcGxhdGUgVFJlcSBleHRlbmRzIE1lc3NhZ2U8VFJlcT5cbiAqIEB0ZW1wbGF0ZSBUUmVzIGV4dGVuZHMgTWVzc2FnZTxUUmVzPlxuICovXG5TZXJ2aWNlLnByb3RvdHlwZS5ycGNDYWxsID0gZnVuY3Rpb24gcnBjQ2FsbChtZXRob2QsIHJlcXVlc3RDdG9yLCByZXNwb25zZUN0b3IsIHJlcXVlc3QsIGNhbGxiYWNrKSB7XG5cbiAgICBpZiAoIXJlcXVlc3QpXG4gICAgICAgIHRocm93IFR5cGVFcnJvcihcInJlcXVlc3QgbXVzdCBiZSBzcGVjaWZpZWRcIik7XG5cbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgaWYgKCFjYWxsYmFjaylcbiAgICAgICAgcmV0dXJuIHV0aWwuYXNQcm9taXNlKHJwY0NhbGwsIHNlbGYsIG1ldGhvZCwgcmVxdWVzdEN0b3IsIHJlc3BvbnNlQ3RvciwgcmVxdWVzdCk7XG5cbiAgICBpZiAoIXNlbGYucnBjSW1wbCkge1xuICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgeyBjYWxsYmFjayhFcnJvcihcImFscmVhZHkgZW5kZWRcIikpOyB9LCAwKTtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgICByZXR1cm4gc2VsZi5ycGNJbXBsKFxuICAgICAgICAgICAgbWV0aG9kLFxuICAgICAgICAgICAgcmVxdWVzdEN0b3Jbc2VsZi5yZXF1ZXN0RGVsaW1pdGVkID8gXCJlbmNvZGVEZWxpbWl0ZWRcIiA6IFwiZW5jb2RlXCJdKHJlcXVlc3QpLmZpbmlzaCgpLFxuICAgICAgICAgICAgZnVuY3Rpb24gcnBjQ2FsbGJhY2soZXJyLCByZXNwb25zZSkge1xuXG4gICAgICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAgICAgICBzZWxmLmVtaXQoXCJlcnJvclwiLCBlcnIsIG1ldGhvZCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhlcnIpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBzZWxmLmVuZCgvKiBlbmRlZEJ5UlBDICovIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICghKHJlc3BvbnNlIGluc3RhbmNlb2YgcmVzcG9uc2VDdG9yKSkge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UgPSByZXNwb25zZUN0b3Jbc2VsZi5yZXNwb25zZURlbGltaXRlZCA/IFwiZGVjb2RlRGVsaW1pdGVkXCIgOiBcImRlY29kZVwiXShyZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5lbWl0KFwiZXJyb3JcIiwgZXJyLCBtZXRob2QpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBzZWxmLmVtaXQoXCJkYXRhXCIsIHJlc3BvbnNlLCBtZXRob2QpO1xuICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhudWxsLCByZXNwb25zZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHNlbGYuZW1pdChcImVycm9yXCIsIGVyciwgbWV0aG9kKTtcbiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHsgY2FsbGJhY2soZXJyKTsgfSwgMCk7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxufTtcblxuLyoqXG4gKiBFbmRzIHRoaXMgc2VydmljZSBhbmQgZW1pdHMgdGhlIGBlbmRgIGV2ZW50LlxuICogQHBhcmFtIHtib29sZWFufSBbZW5kZWRCeVJQQz1mYWxzZV0gV2hldGhlciB0aGUgc2VydmljZSBoYXMgYmVlbiBlbmRlZCBieSB0aGUgUlBDIGltcGxlbWVudGF0aW9uLlxuICogQHJldHVybnMge3JwYy5TZXJ2aWNlfSBgdGhpc2BcbiAqL1xuU2VydmljZS5wcm90b3R5cGUuZW5kID0gZnVuY3Rpb24gZW5kKGVuZGVkQnlSUEMpIHtcbiAgICBpZiAodGhpcy5ycGNJbXBsKSB7XG4gICAgICAgIGlmICghZW5kZWRCeVJQQykgLy8gc2lnbmFsIGVuZCB0byBycGNJbXBsXG4gICAgICAgICAgICB0aGlzLnJwY0ltcGwobnVsbCwgbnVsbCwgbnVsbCk7XG4gICAgICAgIHRoaXMucnBjSW1wbCA9IG51bGw7XG4gICAgICAgIHRoaXMuZW1pdChcImVuZFwiKS5vZmYoKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG59O1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5tb2R1bGUuZXhwb3J0cyA9IExvbmdCaXRzO1xuXG52YXIgdXRpbCA9IHJlcXVpcmUoXCIuLi91dGlsL21pbmltYWxcIik7XG5cbi8qKlxuICogQ29uc3RydWN0cyBuZXcgbG9uZyBiaXRzLlxuICogQGNsYXNzZGVzYyBIZWxwZXIgY2xhc3MgZm9yIHdvcmtpbmcgd2l0aCB0aGUgbG93IGFuZCBoaWdoIGJpdHMgb2YgYSA2NCBiaXQgdmFsdWUuXG4gKiBAbWVtYmVyb2YgdXRpbFxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge251bWJlcn0gbG8gTG93IDMyIGJpdHMsIHVuc2lnbmVkXG4gKiBAcGFyYW0ge251bWJlcn0gaGkgSGlnaCAzMiBiaXRzLCB1bnNpZ25lZFxuICovXG5mdW5jdGlvbiBMb25nQml0cyhsbywgaGkpIHtcblxuICAgIC8vIG5vdGUgdGhhdCB0aGUgY2FzdHMgYmVsb3cgYXJlIHRoZW9yZXRpY2FsbHkgdW5uZWNlc3NhcnkgYXMgb2YgdG9kYXksIGJ1dCBvbGRlciBzdGF0aWNhbGx5XG4gICAgLy8gZ2VuZXJhdGVkIGNvbnZlcnRlciBjb2RlIG1pZ2h0IHN0aWxsIGNhbGwgdGhlIGN0b3Igd2l0aCBzaWduZWQgMzJiaXRzLiBrZXB0IGZvciBjb21wYXQuXG5cbiAgICAvKipcbiAgICAgKiBMb3cgYml0cy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqL1xuICAgIHRoaXMubG8gPSBsbyA+Pj4gMDtcblxuICAgIC8qKlxuICAgICAqIEhpZ2ggYml0cy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqL1xuICAgIHRoaXMuaGkgPSBoaSA+Pj4gMDtcbn1cblxuLyoqXG4gKiBaZXJvIGJpdHMuXG4gKiBAbWVtYmVyb2YgdXRpbC5Mb25nQml0c1xuICogQHR5cGUge3V0aWwuTG9uZ0JpdHN9XG4gKi9cbnZhciB6ZXJvID0gTG9uZ0JpdHMuemVybyA9IG5ldyBMb25nQml0cygwLCAwKTtcblxuemVyby50b051bWJlciA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gMDsgfTtcbnplcm8uenpFbmNvZGUgPSB6ZXJvLnp6RGVjb2RlID0gZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzOyB9O1xuemVyby5sZW5ndGggPSBmdW5jdGlvbigpIHsgcmV0dXJuIDE7IH07XG5cbi8qKlxuICogWmVybyBoYXNoLlxuICogQG1lbWJlcm9mIHV0aWwuTG9uZ0JpdHNcbiAqIEB0eXBlIHtzdHJpbmd9XG4gKi9cbnZhciB6ZXJvSGFzaCA9IExvbmdCaXRzLnplcm9IYXNoID0gXCJcXDBcXDBcXDBcXDBcXDBcXDBcXDBcXDBcIjtcblxuLyoqXG4gKiBDb25zdHJ1Y3RzIG5ldyBsb25nIGJpdHMgZnJvbSB0aGUgc3BlY2lmaWVkIG51bWJlci5cbiAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSBWYWx1ZVxuICogQHJldHVybnMge3V0aWwuTG9uZ0JpdHN9IEluc3RhbmNlXG4gKi9cbkxvbmdCaXRzLmZyb21OdW1iZXIgPSBmdW5jdGlvbiBmcm9tTnVtYmVyKHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlID09PSAwKVxuICAgICAgICByZXR1cm4gemVybztcbiAgICB2YXIgc2lnbiA9IHZhbHVlIDwgMDtcbiAgICBpZiAoc2lnbilcbiAgICAgICAgdmFsdWUgPSAtdmFsdWU7XG4gICAgdmFyIGxvID0gdmFsdWUgPj4+IDAsXG4gICAgICAgIGhpID0gKHZhbHVlIC0gbG8pIC8gNDI5NDk2NzI5NiA+Pj4gMDtcbiAgICBpZiAoc2lnbikge1xuICAgICAgICBoaSA9IH5oaSA+Pj4gMDtcbiAgICAgICAgbG8gPSB+bG8gPj4+IDA7XG4gICAgICAgIGlmICgrK2xvID4gNDI5NDk2NzI5NSkge1xuICAgICAgICAgICAgbG8gPSAwO1xuICAgICAgICAgICAgaWYgKCsraGkgPiA0Mjk0OTY3Mjk1KVxuICAgICAgICAgICAgICAgIGhpID0gMDtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbmV3IExvbmdCaXRzKGxvLCBoaSk7XG59O1xuXG4vKipcbiAqIENvbnN0cnVjdHMgbmV3IGxvbmcgYml0cyBmcm9tIGEgbnVtYmVyLCBsb25nIG9yIHN0cmluZy5cbiAqIEBwYXJhbSB7TG9uZ3xudW1iZXJ8c3RyaW5nfSB2YWx1ZSBWYWx1ZVxuICogQHJldHVybnMge3V0aWwuTG9uZ0JpdHN9IEluc3RhbmNlXG4gKi9cbkxvbmdCaXRzLmZyb20gPSBmdW5jdGlvbiBmcm9tKHZhbHVlKSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIilcbiAgICAgICAgcmV0dXJuIExvbmdCaXRzLmZyb21OdW1iZXIodmFsdWUpO1xuICAgIGlmICh1dGlsLmlzU3RyaW5nKHZhbHVlKSkge1xuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgICAgICBpZiAodXRpbC5Mb25nKVxuICAgICAgICAgICAgdmFsdWUgPSB1dGlsLkxvbmcuZnJvbVN0cmluZyh2YWx1ZSk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHJldHVybiBMb25nQml0cy5mcm9tTnVtYmVyKHBhcnNlSW50KHZhbHVlLCAxMCkpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWUubG93IHx8IHZhbHVlLmhpZ2ggPyBuZXcgTG9uZ0JpdHModmFsdWUubG93ID4+PiAwLCB2YWx1ZS5oaWdoID4+PiAwKSA6IHplcm87XG59O1xuXG4vKipcbiAqIENvbnZlcnRzIHRoaXMgbG9uZyBiaXRzIHRvIGEgcG9zc2libHkgdW5zYWZlIEphdmFTY3JpcHQgbnVtYmVyLlxuICogQHBhcmFtIHtib29sZWFufSBbdW5zaWduZWQ9ZmFsc2VdIFdoZXRoZXIgdW5zaWduZWQgb3Igbm90XG4gKiBAcmV0dXJucyB7bnVtYmVyfSBQb3NzaWJseSB1bnNhZmUgbnVtYmVyXG4gKi9cbkxvbmdCaXRzLnByb3RvdHlwZS50b051bWJlciA9IGZ1bmN0aW9uIHRvTnVtYmVyKHVuc2lnbmVkKSB7XG4gICAgaWYgKCF1bnNpZ25lZCAmJiB0aGlzLmhpID4+PiAzMSkge1xuICAgICAgICB2YXIgbG8gPSB+dGhpcy5sbyArIDEgPj4+IDAsXG4gICAgICAgICAgICBoaSA9IH50aGlzLmhpICAgICA+Pj4gMDtcbiAgICAgICAgaWYgKCFsbylcbiAgICAgICAgICAgIGhpID0gaGkgKyAxID4+PiAwO1xuICAgICAgICByZXR1cm4gLShsbyArIGhpICogNDI5NDk2NzI5Nik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmxvICsgdGhpcy5oaSAqIDQyOTQ5NjcyOTY7XG59O1xuXG4vKipcbiAqIENvbnZlcnRzIHRoaXMgbG9uZyBiaXRzIHRvIGEgbG9uZy5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3Vuc2lnbmVkPWZhbHNlXSBXaGV0aGVyIHVuc2lnbmVkIG9yIG5vdFxuICogQHJldHVybnMge0xvbmd9IExvbmdcbiAqL1xuTG9uZ0JpdHMucHJvdG90eXBlLnRvTG9uZyA9IGZ1bmN0aW9uIHRvTG9uZyh1bnNpZ25lZCkge1xuICAgIHJldHVybiB1dGlsLkxvbmdcbiAgICAgICAgPyBuZXcgdXRpbC5Mb25nKHRoaXMubG8gfCAwLCB0aGlzLmhpIHwgMCwgQm9vbGVhbih1bnNpZ25lZCkpXG4gICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgICAgIDogeyBsb3c6IHRoaXMubG8gfCAwLCBoaWdoOiB0aGlzLmhpIHwgMCwgdW5zaWduZWQ6IEJvb2xlYW4odW5zaWduZWQpIH07XG59O1xuXG52YXIgY2hhckNvZGVBdCA9IFN0cmluZy5wcm90b3R5cGUuY2hhckNvZGVBdDtcblxuLyoqXG4gKiBDb25zdHJ1Y3RzIG5ldyBsb25nIGJpdHMgZnJvbSB0aGUgc3BlY2lmaWVkIDggY2hhcmFjdGVycyBsb25nIGhhc2guXG4gKiBAcGFyYW0ge3N0cmluZ30gaGFzaCBIYXNoXG4gKiBAcmV0dXJucyB7dXRpbC5Mb25nQml0c30gQml0c1xuICovXG5Mb25nQml0cy5mcm9tSGFzaCA9IGZ1bmN0aW9uIGZyb21IYXNoKGhhc2gpIHtcbiAgICBpZiAoaGFzaCA9PT0gemVyb0hhc2gpXG4gICAgICAgIHJldHVybiB6ZXJvO1xuICAgIHJldHVybiBuZXcgTG9uZ0JpdHMoXG4gICAgICAgICggY2hhckNvZGVBdC5jYWxsKGhhc2gsIDApXG4gICAgICAgIHwgY2hhckNvZGVBdC5jYWxsKGhhc2gsIDEpIDw8IDhcbiAgICAgICAgfCBjaGFyQ29kZUF0LmNhbGwoaGFzaCwgMikgPDwgMTZcbiAgICAgICAgfCBjaGFyQ29kZUF0LmNhbGwoaGFzaCwgMykgPDwgMjQpID4+PiAwXG4gICAgLFxuICAgICAgICAoIGNoYXJDb2RlQXQuY2FsbChoYXNoLCA0KVxuICAgICAgICB8IGNoYXJDb2RlQXQuY2FsbChoYXNoLCA1KSA8PCA4XG4gICAgICAgIHwgY2hhckNvZGVBdC5jYWxsKGhhc2gsIDYpIDw8IDE2XG4gICAgICAgIHwgY2hhckNvZGVBdC5jYWxsKGhhc2gsIDcpIDw8IDI0KSA+Pj4gMFxuICAgICk7XG59O1xuXG4vKipcbiAqIENvbnZlcnRzIHRoaXMgbG9uZyBiaXRzIHRvIGEgOCBjaGFyYWN0ZXJzIGxvbmcgaGFzaC5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IEhhc2hcbiAqL1xuTG9uZ0JpdHMucHJvdG90eXBlLnRvSGFzaCA9IGZ1bmN0aW9uIHRvSGFzaCgpIHtcbiAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShcbiAgICAgICAgdGhpcy5sbyAgICAgICAgJiAyNTUsXG4gICAgICAgIHRoaXMubG8gPj4+IDggICYgMjU1LFxuICAgICAgICB0aGlzLmxvID4+PiAxNiAmIDI1NSxcbiAgICAgICAgdGhpcy5sbyA+Pj4gMjQgICAgICAsXG4gICAgICAgIHRoaXMuaGkgICAgICAgICYgMjU1LFxuICAgICAgICB0aGlzLmhpID4+PiA4ICAmIDI1NSxcbiAgICAgICAgdGhpcy5oaSA+Pj4gMTYgJiAyNTUsXG4gICAgICAgIHRoaXMuaGkgPj4+IDI0XG4gICAgKTtcbn07XG5cbi8qKlxuICogWmlnLXphZyBlbmNvZGVzIHRoaXMgbG9uZyBiaXRzLlxuICogQHJldHVybnMge3V0aWwuTG9uZ0JpdHN9IGB0aGlzYFxuICovXG5Mb25nQml0cy5wcm90b3R5cGUuenpFbmNvZGUgPSBmdW5jdGlvbiB6ekVuY29kZSgpIHtcbiAgICB2YXIgbWFzayA9ICAgdGhpcy5oaSA+PiAzMTtcbiAgICB0aGlzLmhpICA9ICgodGhpcy5oaSA8PCAxIHwgdGhpcy5sbyA+Pj4gMzEpIF4gbWFzaykgPj4+IDA7XG4gICAgdGhpcy5sbyAgPSAoIHRoaXMubG8gPDwgMSAgICAgICAgICAgICAgICAgICBeIG1hc2spID4+PiAwO1xuICAgIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBaaWctemFnIGRlY29kZXMgdGhpcyBsb25nIGJpdHMuXG4gKiBAcmV0dXJucyB7dXRpbC5Mb25nQml0c30gYHRoaXNgXG4gKi9cbkxvbmdCaXRzLnByb3RvdHlwZS56ekRlY29kZSA9IGZ1bmN0aW9uIHp6RGVjb2RlKCkge1xuICAgIHZhciBtYXNrID0gLSh0aGlzLmxvICYgMSk7XG4gICAgdGhpcy5sbyAgPSAoKHRoaXMubG8gPj4+IDEgfCB0aGlzLmhpIDw8IDMxKSBeIG1hc2spID4+PiAwO1xuICAgIHRoaXMuaGkgID0gKCB0aGlzLmhpID4+PiAxICAgICAgICAgICAgICAgICAgXiBtYXNrKSA+Pj4gMDtcbiAgICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgbGVuZ3RoIG9mIHRoaXMgbG9uZ2JpdHMgd2hlbiBlbmNvZGVkIGFzIGEgdmFyaW50LlxuICogQHJldHVybnMge251bWJlcn0gTGVuZ3RoXG4gKi9cbkxvbmdCaXRzLnByb3RvdHlwZS5sZW5ndGggPSBmdW5jdGlvbiBsZW5ndGgoKSB7XG4gICAgdmFyIHBhcnQwID0gIHRoaXMubG8sXG4gICAgICAgIHBhcnQxID0gKHRoaXMubG8gPj4+IDI4IHwgdGhpcy5oaSA8PCA0KSA+Pj4gMCxcbiAgICAgICAgcGFydDIgPSAgdGhpcy5oaSA+Pj4gMjQ7XG4gICAgcmV0dXJuIHBhcnQyID09PSAwXG4gICAgICAgICA/IHBhcnQxID09PSAwXG4gICAgICAgICAgID8gcGFydDAgPCAxNjM4NFxuICAgICAgICAgICAgID8gcGFydDAgPCAxMjggPyAxIDogMlxuICAgICAgICAgICAgIDogcGFydDAgPCAyMDk3MTUyID8gMyA6IDRcbiAgICAgICAgICAgOiBwYXJ0MSA8IDE2Mzg0XG4gICAgICAgICAgICAgPyBwYXJ0MSA8IDEyOCA/IDUgOiA2XG4gICAgICAgICAgICAgOiBwYXJ0MSA8IDIwOTcxNTIgPyA3IDogOFxuICAgICAgICAgOiBwYXJ0MiA8IDEyOCA/IDkgOiAxMDtcbn07XG4iLCJcInVzZSBzdHJpY3RcIjtcbnZhciB1dGlsID0gZXhwb3J0cztcblxuLy8gdXNlZCB0byByZXR1cm4gYSBQcm9taXNlIHdoZXJlIGNhbGxiYWNrIGlzIG9taXR0ZWRcbnV0aWwuYXNQcm9taXNlID0gcmVxdWlyZShcIkBwcm90b2J1ZmpzL2FzcHJvbWlzZVwiKTtcblxuLy8gY29udmVydHMgdG8gLyBmcm9tIGJhc2U2NCBlbmNvZGVkIHN0cmluZ3NcbnV0aWwuYmFzZTY0ID0gcmVxdWlyZShcIkBwcm90b2J1ZmpzL2Jhc2U2NFwiKTtcblxuLy8gYmFzZSBjbGFzcyBvZiBycGMuU2VydmljZVxudXRpbC5FdmVudEVtaXR0ZXIgPSByZXF1aXJlKFwiQHByb3RvYnVmanMvZXZlbnRlbWl0dGVyXCIpO1xuXG4vLyBmbG9hdCBoYW5kbGluZyBhY2Nyb3NzIGJyb3dzZXJzXG51dGlsLmZsb2F0ID0gcmVxdWlyZShcIkBwcm90b2J1ZmpzL2Zsb2F0XCIpO1xuXG4vLyByZXF1aXJlcyBtb2R1bGVzIG9wdGlvbmFsbHkgYW5kIGhpZGVzIHRoZSBjYWxsIGZyb20gYnVuZGxlcnNcbnV0aWwuaW5xdWlyZSA9IHJlcXVpcmUoXCJAcHJvdG9idWZqcy9pbnF1aXJlXCIpO1xuXG4vLyBjb252ZXJ0cyB0byAvIGZyb20gdXRmOCBlbmNvZGVkIHN0cmluZ3NcbnV0aWwudXRmOCA9IHJlcXVpcmUoXCJAcHJvdG9idWZqcy91dGY4XCIpO1xuXG4vLyBwcm92aWRlcyBhIG5vZGUtbGlrZSBidWZmZXIgcG9vbCBpbiB0aGUgYnJvd3NlclxudXRpbC5wb29sID0gcmVxdWlyZShcIkBwcm90b2J1ZmpzL3Bvb2xcIik7XG5cbi8vIHV0aWxpdHkgdG8gd29yayB3aXRoIHRoZSBsb3cgYW5kIGhpZ2ggYml0cyBvZiBhIDY0IGJpdCB2YWx1ZVxudXRpbC5Mb25nQml0cyA9IHJlcXVpcmUoXCIuL2xvbmdiaXRzXCIpO1xuXG4vKipcbiAqIFdoZXRoZXIgcnVubmluZyB3aXRoaW4gbm9kZSBvciBub3QuXG4gKiBAbWVtYmVyb2YgdXRpbFxuICogQHR5cGUge2Jvb2xlYW59XG4gKi9cbnV0aWwuaXNOb2RlID0gQm9vbGVhbih0eXBlb2YgZ2xvYmFsICE9PSBcInVuZGVmaW5lZFwiXG4gICAgICAgICAgICAgICAgICAgJiYgZ2xvYmFsXG4gICAgICAgICAgICAgICAgICAgJiYgZ2xvYmFsLnByb2Nlc3NcbiAgICAgICAgICAgICAgICAgICAmJiBnbG9iYWwucHJvY2Vzcy52ZXJzaW9uc1xuICAgICAgICAgICAgICAgICAgICYmIGdsb2JhbC5wcm9jZXNzLnZlcnNpb25zLm5vZGUpO1xuXG4vKipcbiAqIEdsb2JhbCBvYmplY3QgcmVmZXJlbmNlLlxuICogQG1lbWJlcm9mIHV0aWxcbiAqIEB0eXBlIHtPYmplY3R9XG4gKi9cbnV0aWwuZ2xvYmFsID0gdXRpbC5pc05vZGUgJiYgZ2xvYmFsXG4gICAgICAgICAgIHx8IHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgJiYgd2luZG93XG4gICAgICAgICAgIHx8IHR5cGVvZiBzZWxmICAgIT09IFwidW5kZWZpbmVkXCIgJiYgc2VsZlxuICAgICAgICAgICB8fCB0aGlzOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWludmFsaWQtdGhpc1xuXG4vKipcbiAqIEFuIGltbXVhYmxlIGVtcHR5IGFycmF5LlxuICogQG1lbWJlcm9mIHV0aWxcbiAqIEB0eXBlIHtBcnJheS48Kj59XG4gKiBAY29uc3RcbiAqL1xudXRpbC5lbXB0eUFycmF5ID0gT2JqZWN0LmZyZWV6ZSA/IE9iamVjdC5mcmVlemUoW10pIDogLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8gW107IC8vIHVzZWQgb24gcHJvdG90eXBlc1xuXG4vKipcbiAqIEFuIGltbXV0YWJsZSBlbXB0eSBvYmplY3QuXG4gKiBAdHlwZSB7T2JqZWN0fVxuICogQGNvbnN0XG4gKi9cbnV0aWwuZW1wdHlPYmplY3QgPSBPYmplY3QuZnJlZXplID8gT2JqZWN0LmZyZWV6ZSh7fSkgOiAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqLyB7fTsgLy8gdXNlZCBvbiBwcm90b3R5cGVzXG5cbi8qKlxuICogVGVzdHMgaWYgdGhlIHNwZWNpZmllZCB2YWx1ZSBpcyBhbiBpbnRlZ2VyLlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0geyp9IHZhbHVlIFZhbHVlIHRvIHRlc3RcbiAqIEByZXR1cm5zIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhlIHZhbHVlIGlzIGFuIGludGVnZXJcbiAqL1xudXRpbC5pc0ludGVnZXIgPSBOdW1iZXIuaXNJbnRlZ2VyIHx8IC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovIGZ1bmN0aW9uIGlzSW50ZWdlcih2YWx1ZSkge1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIgJiYgaXNGaW5pdGUodmFsdWUpICYmIE1hdGguZmxvb3IodmFsdWUpID09PSB2YWx1ZTtcbn07XG5cbi8qKlxuICogVGVzdHMgaWYgdGhlIHNwZWNpZmllZCB2YWx1ZSBpcyBhIHN0cmluZy5cbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVmFsdWUgdG8gdGVzdFxuICogQHJldHVybnMge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgdmFsdWUgaXMgYSBzdHJpbmdcbiAqL1xudXRpbC5pc1N0cmluZyA9IGZ1bmN0aW9uIGlzU3RyaW5nKHZhbHVlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiB8fCB2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZztcbn07XG5cbi8qKlxuICogVGVzdHMgaWYgdGhlIHNwZWNpZmllZCB2YWx1ZSBpcyBhIG5vbi1udWxsIG9iamVjdC5cbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVmFsdWUgdG8gdGVzdFxuICogQHJldHVybnMge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgdmFsdWUgaXMgYSBub24tbnVsbCBvYmplY3RcbiAqL1xudXRpbC5pc09iamVjdCA9IGZ1bmN0aW9uIGlzT2JqZWN0KHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIjtcbn07XG5cbi8qKlxuICogQ2hlY2tzIGlmIGEgcHJvcGVydHkgb24gYSBtZXNzYWdlIGlzIGNvbnNpZGVyZWQgdG8gYmUgcHJlc2VudC5cbiAqIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIHV0aWwuaXNTZXR9LlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqIFBsYWluIG9iamVjdCBvciBtZXNzYWdlIGluc3RhbmNlXG4gKiBAcGFyYW0ge3N0cmluZ30gcHJvcCBQcm9wZXJ0eSBuYW1lXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gYHRydWVgIGlmIGNvbnNpZGVyZWQgdG8gYmUgcHJlc2VudCwgb3RoZXJ3aXNlIGBmYWxzZWBcbiAqL1xudXRpbC5pc3NldCA9XG5cbi8qKlxuICogQ2hlY2tzIGlmIGEgcHJvcGVydHkgb24gYSBtZXNzYWdlIGlzIGNvbnNpZGVyZWQgdG8gYmUgcHJlc2VudC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmogUGxhaW4gb2JqZWN0IG9yIG1lc3NhZ2UgaW5zdGFuY2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wIFByb3BlcnR5IG5hbWVcbiAqIEByZXR1cm5zIHtib29sZWFufSBgdHJ1ZWAgaWYgY29uc2lkZXJlZCB0byBiZSBwcmVzZW50LCBvdGhlcndpc2UgYGZhbHNlYFxuICovXG51dGlsLmlzU2V0ID0gZnVuY3Rpb24gaXNTZXQob2JqLCBwcm9wKSB7XG4gICAgdmFyIHZhbHVlID0gb2JqW3Byb3BdO1xuICAgIGlmICh2YWx1ZSAhPSBudWxsICYmIG9iai5oYXNPd25Qcm9wZXJ0eShwcm9wKSkgLy8gZXNsaW50LWRpc2FibGUtbGluZSBlcWVxZXEsIG5vLXByb3RvdHlwZS1idWlsdGluc1xuICAgICAgICByZXR1cm4gdHlwZW9mIHZhbHVlICE9PSBcIm9iamVjdFwiIHx8IChBcnJheS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlLmxlbmd0aCA6IE9iamVjdC5rZXlzKHZhbHVlKS5sZW5ndGgpID4gMDtcbiAgICByZXR1cm4gZmFsc2U7XG59O1xuXG4vKipcbiAqIEFueSBjb21wYXRpYmxlIEJ1ZmZlciBpbnN0YW5jZS5cbiAqIFRoaXMgaXMgYSBtaW5pbWFsIHN0YW5kLWFsb25lIGRlZmluaXRpb24gb2YgYSBCdWZmZXIgaW5zdGFuY2UuIFRoZSBhY3R1YWwgdHlwZSBpcyB0aGF0IGV4cG9ydGVkIGJ5IG5vZGUncyB0eXBpbmdzLlxuICogQGludGVyZmFjZSBCdWZmZXJcbiAqIEBleHRlbmRzIFVpbnQ4QXJyYXlcbiAqL1xuXG4vKipcbiAqIE5vZGUncyBCdWZmZXIgY2xhc3MgaWYgYXZhaWxhYmxlLlxuICogQHR5cGUge0NvbnN0cnVjdG9yPEJ1ZmZlcj59XG4gKi9cbnV0aWwuQnVmZmVyID0gKGZ1bmN0aW9uKCkge1xuICAgIHRyeSB7XG4gICAgICAgIHZhciBCdWZmZXIgPSB1dGlsLmlucXVpcmUoXCJidWZmZXJcIikuQnVmZmVyO1xuICAgICAgICAvLyByZWZ1c2UgdG8gdXNlIG5vbi1ub2RlIGJ1ZmZlcnMgaWYgbm90IGV4cGxpY2l0bHkgYXNzaWduZWQgKHBlcmYgcmVhc29ucyk6XG4gICAgICAgIHJldHVybiBCdWZmZXIucHJvdG90eXBlLnV0ZjhXcml0ZSA/IEJ1ZmZlciA6IC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovIG51bGw7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG59KSgpO1xuXG4vLyBJbnRlcm5hbCBhbGlhcyBvZiBvciBwb2x5ZnVsbCBmb3IgQnVmZmVyLmZyb20uXG51dGlsLl9CdWZmZXJfZnJvbSA9IG51bGw7XG5cbi8vIEludGVybmFsIGFsaWFzIG9mIG9yIHBvbHlmaWxsIGZvciBCdWZmZXIuYWxsb2NVbnNhZmUuXG51dGlsLl9CdWZmZXJfYWxsb2NVbnNhZmUgPSBudWxsO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgYnVmZmVyIG9mIHdoYXRldmVyIHR5cGUgc3VwcG9ydGVkIGJ5IHRoZSBlbnZpcm9ubWVudC5cbiAqIEBwYXJhbSB7bnVtYmVyfG51bWJlcltdfSBbc2l6ZU9yQXJyYXk9MF0gQnVmZmVyIHNpemUgb3IgbnVtYmVyIGFycmF5XG4gKiBAcmV0dXJucyB7VWludDhBcnJheXxCdWZmZXJ9IEJ1ZmZlclxuICovXG51dGlsLm5ld0J1ZmZlciA9IGZ1bmN0aW9uIG5ld0J1ZmZlcihzaXplT3JBcnJheSkge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgcmV0dXJuIHR5cGVvZiBzaXplT3JBcnJheSA9PT0gXCJudW1iZXJcIlxuICAgICAgICA/IHV0aWwuQnVmZmVyXG4gICAgICAgICAgICA/IHV0aWwuX0J1ZmZlcl9hbGxvY1Vuc2FmZShzaXplT3JBcnJheSlcbiAgICAgICAgICAgIDogbmV3IHV0aWwuQXJyYXkoc2l6ZU9yQXJyYXkpXG4gICAgICAgIDogdXRpbC5CdWZmZXJcbiAgICAgICAgICAgID8gdXRpbC5fQnVmZmVyX2Zyb20oc2l6ZU9yQXJyYXkpXG4gICAgICAgICAgICA6IHR5cGVvZiBVaW50OEFycmF5ID09PSBcInVuZGVmaW5lZFwiXG4gICAgICAgICAgICAgICAgPyBzaXplT3JBcnJheVxuICAgICAgICAgICAgICAgIDogbmV3IFVpbnQ4QXJyYXkoc2l6ZU9yQXJyYXkpO1xufTtcblxuLyoqXG4gKiBBcnJheSBpbXBsZW1lbnRhdGlvbiB1c2VkIGluIHRoZSBicm93c2VyLiBgVWludDhBcnJheWAgaWYgc3VwcG9ydGVkLCBvdGhlcndpc2UgYEFycmF5YC5cbiAqIEB0eXBlIHtDb25zdHJ1Y3RvcjxVaW50OEFycmF5Pn1cbiAqL1xudXRpbC5BcnJheSA9IHR5cGVvZiBVaW50OEFycmF5ICE9PSBcInVuZGVmaW5lZFwiID8gVWludDhBcnJheSAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqLyA6IEFycmF5O1xuXG4vKipcbiAqIEFueSBjb21wYXRpYmxlIExvbmcgaW5zdGFuY2UuXG4gKiBUaGlzIGlzIGEgbWluaW1hbCBzdGFuZC1hbG9uZSBkZWZpbml0aW9uIG9mIGEgTG9uZyBpbnN0YW5jZS4gVGhlIGFjdHVhbCB0eXBlIGlzIHRoYXQgZXhwb3J0ZWQgYnkgbG9uZy5qcy5cbiAqIEBpbnRlcmZhY2UgTG9uZ1xuICogQHByb3BlcnR5IHtudW1iZXJ9IGxvdyBMb3cgYml0c1xuICogQHByb3BlcnR5IHtudW1iZXJ9IGhpZ2ggSGlnaCBiaXRzXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHVuc2lnbmVkIFdoZXRoZXIgdW5zaWduZWQgb3Igbm90XG4gKi9cblxuLyoqXG4gKiBMb25nLmpzJ3MgTG9uZyBjbGFzcyBpZiBhdmFpbGFibGUuXG4gKiBAdHlwZSB7Q29uc3RydWN0b3I8TG9uZz59XG4gKi9cbnV0aWwuTG9uZyA9IC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovIHV0aWwuZ2xvYmFsLmRjb2RlSU8gJiYgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8gdXRpbC5nbG9iYWwuZGNvZGVJTy5Mb25nXG4gICAgICAgICB8fCAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqLyB1dGlsLmdsb2JhbC5Mb25nXG4gICAgICAgICB8fCB1dGlsLmlucXVpcmUoXCJsb25nXCIpO1xuXG4vKipcbiAqIFJlZ3VsYXIgZXhwcmVzc2lvbiB1c2VkIHRvIHZlcmlmeSAyIGJpdCAoYGJvb2xgKSBtYXAga2V5cy5cbiAqIEB0eXBlIHtSZWdFeHB9XG4gKiBAY29uc3RcbiAqL1xudXRpbC5rZXkyUmUgPSAvXnRydWV8ZmFsc2V8MHwxJC87XG5cbi8qKlxuICogUmVndWxhciBleHByZXNzaW9uIHVzZWQgdG8gdmVyaWZ5IDMyIGJpdCAoYGludDMyYCBldGMuKSBtYXAga2V5cy5cbiAqIEB0eXBlIHtSZWdFeHB9XG4gKiBAY29uc3RcbiAqL1xudXRpbC5rZXkzMlJlID0gL14tPyg/OjB8WzEtOV1bMC05XSopJC87XG5cbi8qKlxuICogUmVndWxhciBleHByZXNzaW9uIHVzZWQgdG8gdmVyaWZ5IDY0IGJpdCAoYGludDY0YCBldGMuKSBtYXAga2V5cy5cbiAqIEB0eXBlIHtSZWdFeHB9XG4gKiBAY29uc3RcbiAqL1xudXRpbC5rZXk2NFJlID0gL14oPzpbXFxcXHgwMC1cXFxceGZmXXs4fXwtPyg/OjB8WzEtOV1bMC05XSopKSQvO1xuXG4vKipcbiAqIENvbnZlcnRzIGEgbnVtYmVyIG9yIGxvbmcgdG8gYW4gOCBjaGFyYWN0ZXJzIGxvbmcgaGFzaCBzdHJpbmcuXG4gKiBAcGFyYW0ge0xvbmd8bnVtYmVyfSB2YWx1ZSBWYWx1ZSB0byBjb252ZXJ0XG4gKiBAcmV0dXJucyB7c3RyaW5nfSBIYXNoXG4gKi9cbnV0aWwubG9uZ1RvSGFzaCA9IGZ1bmN0aW9uIGxvbmdUb0hhc2godmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWVcbiAgICAgICAgPyB1dGlsLkxvbmdCaXRzLmZyb20odmFsdWUpLnRvSGFzaCgpXG4gICAgICAgIDogdXRpbC5Mb25nQml0cy56ZXJvSGFzaDtcbn07XG5cbi8qKlxuICogQ29udmVydHMgYW4gOCBjaGFyYWN0ZXJzIGxvbmcgaGFzaCBzdHJpbmcgdG8gYSBsb25nIG9yIG51bWJlci5cbiAqIEBwYXJhbSB7c3RyaW5nfSBoYXNoIEhhc2hcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3Vuc2lnbmVkPWZhbHNlXSBXaGV0aGVyIHVuc2lnbmVkIG9yIG5vdFxuICogQHJldHVybnMge0xvbmd8bnVtYmVyfSBPcmlnaW5hbCB2YWx1ZVxuICovXG51dGlsLmxvbmdGcm9tSGFzaCA9IGZ1bmN0aW9uIGxvbmdGcm9tSGFzaChoYXNoLCB1bnNpZ25lZCkge1xuICAgIHZhciBiaXRzID0gdXRpbC5Mb25nQml0cy5mcm9tSGFzaChoYXNoKTtcbiAgICBpZiAodXRpbC5Mb25nKVxuICAgICAgICByZXR1cm4gdXRpbC5Mb25nLmZyb21CaXRzKGJpdHMubG8sIGJpdHMuaGksIHVuc2lnbmVkKTtcbiAgICByZXR1cm4gYml0cy50b051bWJlcihCb29sZWFuKHVuc2lnbmVkKSk7XG59O1xuXG4vKipcbiAqIE1lcmdlcyB0aGUgcHJvcGVydGllcyBvZiB0aGUgc291cmNlIG9iamVjdCBpbnRvIHRoZSBkZXN0aW5hdGlvbiBvYmplY3QuXG4gKiBAbWVtYmVyb2YgdXRpbFxuICogQHBhcmFtIHtPYmplY3QuPHN0cmluZywqPn0gZHN0IERlc3RpbmF0aW9uIG9iamVjdFxuICogQHBhcmFtIHtPYmplY3QuPHN0cmluZywqPn0gc3JjIFNvdXJjZSBvYmplY3RcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2lmTm90U2V0PWZhbHNlXSBNZXJnZXMgb25seSBpZiB0aGUga2V5IGlzIG5vdCBhbHJlYWR5IHNldFxuICogQHJldHVybnMge09iamVjdC48c3RyaW5nLCo+fSBEZXN0aW5hdGlvbiBvYmplY3RcbiAqL1xuZnVuY3Rpb24gbWVyZ2UoZHN0LCBzcmMsIGlmTm90U2V0KSB7IC8vIHVzZWQgYnkgY29udmVydGVyc1xuICAgIGZvciAodmFyIGtleXMgPSBPYmplY3Qua2V5cyhzcmMpLCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyArK2kpXG4gICAgICAgIGlmIChkc3Rba2V5c1tpXV0gPT09IHVuZGVmaW5lZCB8fCAhaWZOb3RTZXQpXG4gICAgICAgICAgICBkc3Rba2V5c1tpXV0gPSBzcmNba2V5c1tpXV07XG4gICAgcmV0dXJuIGRzdDtcbn1cblxudXRpbC5tZXJnZSA9IG1lcmdlO1xuXG4vKipcbiAqIENvbnZlcnRzIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgYSBzdHJpbmcgdG8gbG93ZXIgY2FzZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHIgU3RyaW5nIHRvIGNvbnZlcnRcbiAqIEByZXR1cm5zIHtzdHJpbmd9IENvbnZlcnRlZCBzdHJpbmdcbiAqL1xudXRpbC5sY0ZpcnN0ID0gZnVuY3Rpb24gbGNGaXJzdChzdHIpIHtcbiAgICByZXR1cm4gc3RyLmNoYXJBdCgwKS50b0xvd2VyQ2FzZSgpICsgc3RyLnN1YnN0cmluZygxKTtcbn07XG5cbi8qKlxuICogQ3JlYXRlcyBhIGN1c3RvbSBlcnJvciBjb25zdHJ1Y3Rvci5cbiAqIEBtZW1iZXJvZiB1dGlsXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBFcnJvciBuYW1lXG4gKiBAcmV0dXJucyB7Q29uc3RydWN0b3I8RXJyb3I+fSBDdXN0b20gZXJyb3IgY29uc3RydWN0b3JcbiAqL1xuZnVuY3Rpb24gbmV3RXJyb3IobmFtZSkge1xuXG4gICAgZnVuY3Rpb24gQ3VzdG9tRXJyb3IobWVzc2FnZSwgcHJvcGVydGllcykge1xuXG4gICAgICAgIGlmICghKHRoaXMgaW5zdGFuY2VvZiBDdXN0b21FcnJvcikpXG4gICAgICAgICAgICByZXR1cm4gbmV3IEN1c3RvbUVycm9yKG1lc3NhZ2UsIHByb3BlcnRpZXMpO1xuXG4gICAgICAgIC8vIEVycm9yLmNhbGwodGhpcywgbWVzc2FnZSk7XG4gICAgICAgIC8vIF4ganVzdCByZXR1cm5zIGEgbmV3IGVycm9yIGluc3RhbmNlIGJlY2F1c2UgdGhlIGN0b3IgY2FuIGJlIGNhbGxlZCBhcyBhIGZ1bmN0aW9uXG5cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIFwibWVzc2FnZVwiLCB7IGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtZXNzYWdlOyB9IH0pO1xuXG4gICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgICAgIGlmIChFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSkgLy8gbm9kZVxuICAgICAgICAgICAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgQ3VzdG9tRXJyb3IpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgXCJzdGFja1wiLCB7IHZhbHVlOiBuZXcgRXJyb3IoKS5zdGFjayB8fCBcIlwiIH0pO1xuXG4gICAgICAgIGlmIChwcm9wZXJ0aWVzKVxuICAgICAgICAgICAgbWVyZ2UodGhpcywgcHJvcGVydGllcyk7XG4gICAgfVxuXG4gICAgKEN1c3RvbUVycm9yLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoRXJyb3IucHJvdG90eXBlKSkuY29uc3RydWN0b3IgPSBDdXN0b21FcnJvcjtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShDdXN0b21FcnJvci5wcm90b3R5cGUsIFwibmFtZVwiLCB7IGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBuYW1lOyB9IH0pO1xuXG4gICAgQ3VzdG9tRXJyb3IucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm5hbWUgKyBcIjogXCIgKyB0aGlzLm1lc3NhZ2U7XG4gICAgfTtcblxuICAgIHJldHVybiBDdXN0b21FcnJvcjtcbn1cblxudXRpbC5uZXdFcnJvciA9IG5ld0Vycm9yO1xuXG4vKipcbiAqIENvbnN0cnVjdHMgYSBuZXcgcHJvdG9jb2wgZXJyb3IuXG4gKiBAY2xhc3NkZXNjIEVycm9yIHN1YmNsYXNzIGluZGljYXRpbmcgYSBwcm90b2NvbCBzcGVjaWZjIGVycm9yLlxuICogQG1lbWJlcm9mIHV0aWxcbiAqIEBleHRlbmRzIEVycm9yXG4gKiBAdGVtcGxhdGUgVCBleHRlbmRzIE1lc3NhZ2U8VD5cbiAqIEBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2UgRXJyb3IgbWVzc2FnZVxuICogQHBhcmFtIHtPYmplY3QuPHN0cmluZywqPn0gW3Byb3BlcnRpZXNdIEFkZGl0aW9uYWwgcHJvcGVydGllc1xuICogQGV4YW1wbGVcbiAqIHRyeSB7XG4gKiAgICAgTXlNZXNzYWdlLmRlY29kZShzb21lQnVmZmVyKTsgLy8gdGhyb3dzIGlmIHJlcXVpcmVkIGZpZWxkcyBhcmUgbWlzc2luZ1xuICogfSBjYXRjaCAoZSkge1xuICogICAgIGlmIChlIGluc3RhbmNlb2YgUHJvdG9jb2xFcnJvciAmJiBlLmluc3RhbmNlKVxuICogICAgICAgICBjb25zb2xlLmxvZyhcImRlY29kZWQgc28gZmFyOiBcIiArIEpTT04uc3RyaW5naWZ5KGUuaW5zdGFuY2UpKTtcbiAqIH1cbiAqL1xudXRpbC5Qcm90b2NvbEVycm9yID0gbmV3RXJyb3IoXCJQcm90b2NvbEVycm9yXCIpO1xuXG4vKipcbiAqIFNvIGZhciBkZWNvZGVkIG1lc3NhZ2UgaW5zdGFuY2UuXG4gKiBAbmFtZSB1dGlsLlByb3RvY29sRXJyb3IjaW5zdGFuY2VcbiAqIEB0eXBlIHtNZXNzYWdlPFQ+fVxuICovXG5cbi8qKlxuICogQSBPbmVPZiBnZXR0ZXIgYXMgcmV0dXJuZWQgYnkge0BsaW5rIHV0aWwub25lT2ZHZXR0ZXJ9LlxuICogQHR5cGVkZWYgT25lT2ZHZXR0ZXJcbiAqIEB0eXBlIHtmdW5jdGlvbn1cbiAqIEByZXR1cm5zIHtzdHJpbmd8dW5kZWZpbmVkfSBTZXQgZmllbGQgbmFtZSwgaWYgYW55XG4gKi9cblxuLyoqXG4gKiBCdWlsZHMgYSBnZXR0ZXIgZm9yIGEgb25lb2YncyBwcmVzZW50IGZpZWxkIG5hbWUuXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBmaWVsZE5hbWVzIEZpZWxkIG5hbWVzXG4gKiBAcmV0dXJucyB7T25lT2ZHZXR0ZXJ9IFVuYm91bmQgZ2V0dGVyXG4gKi9cbnV0aWwub25lT2ZHZXR0ZXIgPSBmdW5jdGlvbiBnZXRPbmVPZihmaWVsZE5hbWVzKSB7XG4gICAgdmFyIGZpZWxkTWFwID0ge307XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmaWVsZE5hbWVzLmxlbmd0aDsgKytpKVxuICAgICAgICBmaWVsZE1hcFtmaWVsZE5hbWVzW2ldXSA9IDE7XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfHVuZGVmaW5lZH0gU2V0IGZpZWxkIG5hbWUsIGlmIGFueVxuICAgICAqIEB0aGlzIE9iamVjdFxuICAgICAqIEBpZ25vcmVcbiAgICAgKi9cbiAgICByZXR1cm4gZnVuY3Rpb24oKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgY29uc2lzdGVudC1yZXR1cm5cbiAgICAgICAgZm9yICh2YXIga2V5cyA9IE9iamVjdC5rZXlzKHRoaXMpLCBpID0ga2V5cy5sZW5ndGggLSAxOyBpID4gLTE7IC0taSlcbiAgICAgICAgICAgIGlmIChmaWVsZE1hcFtrZXlzW2ldXSA9PT0gMSAmJiB0aGlzW2tleXNbaV1dICE9PSB1bmRlZmluZWQgJiYgdGhpc1trZXlzW2ldXSAhPT0gbnVsbClcbiAgICAgICAgICAgICAgICByZXR1cm4ga2V5c1tpXTtcbiAgICB9O1xufTtcblxuLyoqXG4gKiBBIE9uZU9mIHNldHRlciBhcyByZXR1cm5lZCBieSB7QGxpbmsgdXRpbC5vbmVPZlNldHRlcn0uXG4gKiBAdHlwZWRlZiBPbmVPZlNldHRlclxuICogQHR5cGUge2Z1bmN0aW9ufVxuICogQHBhcmFtIHtzdHJpbmd8dW5kZWZpbmVkfSB2YWx1ZSBGaWVsZCBuYW1lXG4gKiBAcmV0dXJucyB7dW5kZWZpbmVkfVxuICovXG5cbi8qKlxuICogQnVpbGRzIGEgc2V0dGVyIGZvciBhIG9uZW9mJ3MgcHJlc2VudCBmaWVsZCBuYW1lLlxuICogQHBhcmFtIHtzdHJpbmdbXX0gZmllbGROYW1lcyBGaWVsZCBuYW1lc1xuICogQHJldHVybnMge09uZU9mU2V0dGVyfSBVbmJvdW5kIHNldHRlclxuICovXG51dGlsLm9uZU9mU2V0dGVyID0gZnVuY3Rpb24gc2V0T25lT2YoZmllbGROYW1lcykge1xuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgRmllbGQgbmFtZVxuICAgICAqIEByZXR1cm5zIHt1bmRlZmluZWR9XG4gICAgICogQHRoaXMgT2JqZWN0XG4gICAgICogQGlnbm9yZVxuICAgICAqL1xuICAgIHJldHVybiBmdW5jdGlvbihuYW1lKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZmllbGROYW1lcy5sZW5ndGg7ICsraSlcbiAgICAgICAgICAgIGlmIChmaWVsZE5hbWVzW2ldICE9PSBuYW1lKVxuICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzW2ZpZWxkTmFtZXNbaV1dO1xuICAgIH07XG59O1xuXG4vKipcbiAqIERlZmF1bHQgY29udmVyc2lvbiBvcHRpb25zIHVzZWQgZm9yIHtAbGluayBNZXNzYWdlI3RvSlNPTn0gaW1wbGVtZW50YXRpb25zLlxuICpcbiAqIFRoZXNlIG9wdGlvbnMgYXJlIGNsb3NlIHRvIHByb3RvMydzIEpTT04gbWFwcGluZyB3aXRoIHRoZSBleGNlcHRpb24gdGhhdCBpbnRlcm5hbCB0eXBlcyBsaWtlIEFueSBhcmUgaGFuZGxlZCBqdXN0IGxpa2UgbWVzc2FnZXMuIE1vcmUgcHJlY2lzZWx5OlxuICpcbiAqIC0gTG9uZ3MgYmVjb21lIHN0cmluZ3NcbiAqIC0gRW51bXMgYmVjb21lIHN0cmluZyBrZXlzXG4gKiAtIEJ5dGVzIGJlY29tZSBiYXNlNjQgZW5jb2RlZCBzdHJpbmdzXG4gKiAtIChTdWItKU1lc3NhZ2VzIGJlY29tZSBwbGFpbiBvYmplY3RzXG4gKiAtIE1hcHMgYmVjb21lIHBsYWluIG9iamVjdHMgd2l0aCBhbGwgc3RyaW5nIGtleXNcbiAqIC0gUmVwZWF0ZWQgZmllbGRzIGJlY29tZSBhcnJheXNcbiAqIC0gTmFOIGFuZCBJbmZpbml0eSBmb3IgZmxvYXQgYW5kIGRvdWJsZSBmaWVsZHMgYmVjb21lIHN0cmluZ3NcbiAqXG4gKiBAdHlwZSB7SUNvbnZlcnNpb25PcHRpb25zfVxuICogQHNlZSBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzL2RvY3MvcHJvdG8zP2hsPWVuI2pzb25cbiAqL1xudXRpbC50b0pTT05PcHRpb25zID0ge1xuICAgIGxvbmdzOiBTdHJpbmcsXG4gICAgZW51bXM6IFN0cmluZyxcbiAgICBieXRlczogU3RyaW5nLFxuICAgIGpzb246IHRydWVcbn07XG5cbi8vIFNldHMgdXAgYnVmZmVyIHV0aWxpdHkgYWNjb3JkaW5nIHRvIHRoZSBlbnZpcm9ubWVudCAoY2FsbGVkIGluIGluZGV4LW1pbmltYWwpXG51dGlsLl9jb25maWd1cmUgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgQnVmZmVyID0gdXRpbC5CdWZmZXI7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgaWYgKCFCdWZmZXIpIHtcbiAgICAgICAgdXRpbC5fQnVmZmVyX2Zyb20gPSB1dGlsLl9CdWZmZXJfYWxsb2NVbnNhZmUgPSBudWxsO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIGJlY2F1c2Ugbm9kZSA0LnggYnVmZmVycyBhcmUgaW5jb21wYXRpYmxlICYgaW1tdXRhYmxlXG4gICAgLy8gc2VlOiBodHRwczovL2dpdGh1Yi5jb20vZGNvZGVJTy9wcm90b2J1Zi5qcy9wdWxsLzY2NVxuICAgIHV0aWwuX0J1ZmZlcl9mcm9tID0gQnVmZmVyLmZyb20gIT09IFVpbnQ4QXJyYXkuZnJvbSAmJiBCdWZmZXIuZnJvbSB8fFxuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgICBmdW5jdGlvbiBCdWZmZXJfZnJvbSh2YWx1ZSwgZW5jb2RpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgQnVmZmVyKHZhbHVlLCBlbmNvZGluZyk7XG4gICAgICAgIH07XG4gICAgdXRpbC5fQnVmZmVyX2FsbG9jVW5zYWZlID0gQnVmZmVyLmFsbG9jVW5zYWZlIHx8XG4gICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgICAgIGZ1bmN0aW9uIEJ1ZmZlcl9hbGxvY1Vuc2FmZShzaXplKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEJ1ZmZlcihzaXplKTtcbiAgICAgICAgfTtcbn07XG4iLCJcInVzZSBzdHJpY3RcIjtcbm1vZHVsZS5leHBvcnRzID0gV3JpdGVyO1xuXG52YXIgdXRpbCAgICAgID0gcmVxdWlyZShcIi4vdXRpbC9taW5pbWFsXCIpO1xuXG52YXIgQnVmZmVyV3JpdGVyOyAvLyBjeWNsaWNcblxudmFyIExvbmdCaXRzICA9IHV0aWwuTG9uZ0JpdHMsXG4gICAgYmFzZTY0ICAgID0gdXRpbC5iYXNlNjQsXG4gICAgdXRmOCAgICAgID0gdXRpbC51dGY4O1xuXG4vKipcbiAqIENvbnN0cnVjdHMgYSBuZXcgd3JpdGVyIG9wZXJhdGlvbiBpbnN0YW5jZS5cbiAqIEBjbGFzc2Rlc2MgU2NoZWR1bGVkIHdyaXRlciBvcGVyYXRpb24uXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7ZnVuY3Rpb24oKiwgVWludDhBcnJheSwgbnVtYmVyKX0gZm4gRnVuY3Rpb24gdG8gY2FsbFxuICogQHBhcmFtIHtudW1iZXJ9IGxlbiBWYWx1ZSBieXRlIGxlbmd0aFxuICogQHBhcmFtIHsqfSB2YWwgVmFsdWUgdG8gd3JpdGVcbiAqIEBpZ25vcmVcbiAqL1xuZnVuY3Rpb24gT3AoZm4sIGxlbiwgdmFsKSB7XG5cbiAgICAvKipcbiAgICAgKiBGdW5jdGlvbiB0byBjYWxsLlxuICAgICAqIEB0eXBlIHtmdW5jdGlvbihVaW50OEFycmF5LCBudW1iZXIsICopfVxuICAgICAqL1xuICAgIHRoaXMuZm4gPSBmbjtcblxuICAgIC8qKlxuICAgICAqIFZhbHVlIGJ5dGUgbGVuZ3RoLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICovXG4gICAgdGhpcy5sZW4gPSBsZW47XG5cbiAgICAvKipcbiAgICAgKiBOZXh0IG9wZXJhdGlvbi5cbiAgICAgKiBAdHlwZSB7V3JpdGVyLk9wfHVuZGVmaW5lZH1cbiAgICAgKi9cbiAgICB0aGlzLm5leHQgPSB1bmRlZmluZWQ7XG5cbiAgICAvKipcbiAgICAgKiBWYWx1ZSB0byB3cml0ZS5cbiAgICAgKiBAdHlwZSB7Kn1cbiAgICAgKi9cbiAgICB0aGlzLnZhbCA9IHZhbDsgLy8gdHlwZSB2YXJpZXNcbn1cblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbmZ1bmN0aW9uIG5vb3AoKSB7fSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWVtcHR5LWZ1bmN0aW9uXG5cbi8qKlxuICogQ29uc3RydWN0cyBhIG5ldyB3cml0ZXIgc3RhdGUgaW5zdGFuY2UuXG4gKiBAY2xhc3NkZXNjIENvcGllZCB3cml0ZXIgc3RhdGUuXG4gKiBAbWVtYmVyb2YgV3JpdGVyXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7V3JpdGVyfSB3cml0ZXIgV3JpdGVyIHRvIGNvcHkgc3RhdGUgZnJvbVxuICogQGlnbm9yZVxuICovXG5mdW5jdGlvbiBTdGF0ZSh3cml0ZXIpIHtcblxuICAgIC8qKlxuICAgICAqIEN1cnJlbnQgaGVhZC5cbiAgICAgKiBAdHlwZSB7V3JpdGVyLk9wfVxuICAgICAqL1xuICAgIHRoaXMuaGVhZCA9IHdyaXRlci5oZWFkO1xuXG4gICAgLyoqXG4gICAgICogQ3VycmVudCB0YWlsLlxuICAgICAqIEB0eXBlIHtXcml0ZXIuT3B9XG4gICAgICovXG4gICAgdGhpcy50YWlsID0gd3JpdGVyLnRhaWw7XG5cbiAgICAvKipcbiAgICAgKiBDdXJyZW50IGJ1ZmZlciBsZW5ndGguXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKi9cbiAgICB0aGlzLmxlbiA9IHdyaXRlci5sZW47XG5cbiAgICAvKipcbiAgICAgKiBOZXh0IHN0YXRlLlxuICAgICAqIEB0eXBlIHtTdGF0ZXxudWxsfVxuICAgICAqL1xuICAgIHRoaXMubmV4dCA9IHdyaXRlci5zdGF0ZXM7XG59XG5cbi8qKlxuICogQ29uc3RydWN0cyBhIG5ldyB3cml0ZXIgaW5zdGFuY2UuXG4gKiBAY2xhc3NkZXNjIFdpcmUgZm9ybWF0IHdyaXRlciB1c2luZyBgVWludDhBcnJheWAgaWYgYXZhaWxhYmxlLCBvdGhlcndpc2UgYEFycmF5YC5cbiAqIEBjb25zdHJ1Y3RvclxuICovXG5mdW5jdGlvbiBXcml0ZXIoKSB7XG5cbiAgICAvKipcbiAgICAgKiBDdXJyZW50IGxlbmd0aC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqL1xuICAgIHRoaXMubGVuID0gMDtcblxuICAgIC8qKlxuICAgICAqIE9wZXJhdGlvbnMgaGVhZC5cbiAgICAgKiBAdHlwZSB7T2JqZWN0fVxuICAgICAqL1xuICAgIHRoaXMuaGVhZCA9IG5ldyBPcChub29wLCAwLCAwKTtcblxuICAgIC8qKlxuICAgICAqIE9wZXJhdGlvbnMgdGFpbFxuICAgICAqIEB0eXBlIHtPYmplY3R9XG4gICAgICovXG4gICAgdGhpcy50YWlsID0gdGhpcy5oZWFkO1xuXG4gICAgLyoqXG4gICAgICogTGlua2VkIGZvcmtlZCBzdGF0ZXMuXG4gICAgICogQHR5cGUge09iamVjdHxudWxsfVxuICAgICAqL1xuICAgIHRoaXMuc3RhdGVzID0gbnVsbDtcblxuICAgIC8vIFdoZW4gYSB2YWx1ZSBpcyB3cml0dGVuLCB0aGUgd3JpdGVyIGNhbGN1bGF0ZXMgaXRzIGJ5dGUgbGVuZ3RoIGFuZCBwdXRzIGl0IGludG8gYSBsaW5rZWRcbiAgICAvLyBsaXN0IG9mIG9wZXJhdGlvbnMgdG8gcGVyZm9ybSB3aGVuIGZpbmlzaCgpIGlzIGNhbGxlZC4gVGhpcyBib3RoIGFsbG93cyB1cyB0byBhbGxvY2F0ZVxuICAgIC8vIGJ1ZmZlcnMgb2YgdGhlIGV4YWN0IHJlcXVpcmVkIHNpemUgYW5kIHJlZHVjZXMgdGhlIGFtb3VudCBvZiB3b3JrIHdlIGhhdmUgdG8gZG8gY29tcGFyZWRcbiAgICAvLyB0byBmaXJzdCBjYWxjdWxhdGluZyBvdmVyIG9iamVjdHMgYW5kIHRoZW4gZW5jb2Rpbmcgb3ZlciBvYmplY3RzLiBJbiBvdXIgY2FzZSwgdGhlIGVuY29kaW5nXG4gICAgLy8gcGFydCBpcyBqdXN0IGEgbGlua2VkIGxpc3Qgd2FsayBjYWxsaW5nIG9wZXJhdGlvbnMgd2l0aCBhbHJlYWR5IHByZXBhcmVkIHZhbHVlcy5cbn1cblxudmFyIGNyZWF0ZSA9IGZ1bmN0aW9uIGNyZWF0ZSgpIHtcbiAgICByZXR1cm4gdXRpbC5CdWZmZXJcbiAgICAgICAgPyBmdW5jdGlvbiBjcmVhdGVfYnVmZmVyX3NldHVwKCkge1xuICAgICAgICAgICAgcmV0dXJuIChXcml0ZXIuY3JlYXRlID0gZnVuY3Rpb24gY3JlYXRlX2J1ZmZlcigpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEJ1ZmZlcldyaXRlcigpO1xuICAgICAgICAgICAgfSkoKTtcbiAgICAgICAgfVxuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgICA6IGZ1bmN0aW9uIGNyZWF0ZV9hcnJheSgpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgV3JpdGVyKCk7XG4gICAgICAgIH07XG59O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgd3JpdGVyLlxuICogQGZ1bmN0aW9uXG4gKiBAcmV0dXJucyB7QnVmZmVyV3JpdGVyfFdyaXRlcn0gQSB7QGxpbmsgQnVmZmVyV3JpdGVyfSB3aGVuIEJ1ZmZlcnMgYXJlIHN1cHBvcnRlZCwgb3RoZXJ3aXNlIGEge0BsaW5rIFdyaXRlcn1cbiAqL1xuV3JpdGVyLmNyZWF0ZSA9IGNyZWF0ZSgpO1xuXG4vKipcbiAqIEFsbG9jYXRlcyBhIGJ1ZmZlciBvZiB0aGUgc3BlY2lmaWVkIHNpemUuXG4gKiBAcGFyYW0ge251bWJlcn0gc2l6ZSBCdWZmZXIgc2l6ZVxuICogQHJldHVybnMge1VpbnQ4QXJyYXl9IEJ1ZmZlclxuICovXG5Xcml0ZXIuYWxsb2MgPSBmdW5jdGlvbiBhbGxvYyhzaXplKSB7XG4gICAgcmV0dXJuIG5ldyB1dGlsLkFycmF5KHNpemUpO1xufTtcblxuLy8gVXNlIFVpbnQ4QXJyYXkgYnVmZmVyIHBvb2wgaW4gdGhlIGJyb3dzZXIsIGp1c3QgbGlrZSBub2RlIGRvZXMgd2l0aCBidWZmZXJzXG4vKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuaWYgKHV0aWwuQXJyYXkgIT09IEFycmF5KVxuICAgIFdyaXRlci5hbGxvYyA9IHV0aWwucG9vbChXcml0ZXIuYWxsb2MsIHV0aWwuQXJyYXkucHJvdG90eXBlLnN1YmFycmF5KTtcblxuLyoqXG4gKiBQdXNoZXMgYSBuZXcgb3BlcmF0aW9uIHRvIHRoZSBxdWV1ZS5cbiAqIEBwYXJhbSB7ZnVuY3Rpb24oVWludDhBcnJheSwgbnVtYmVyLCAqKX0gZm4gRnVuY3Rpb24gdG8gY2FsbFxuICogQHBhcmFtIHtudW1iZXJ9IGxlbiBWYWx1ZSBieXRlIGxlbmd0aFxuICogQHBhcmFtIHtudW1iZXJ9IHZhbCBWYWx1ZSB0byB3cml0ZVxuICogQHJldHVybnMge1dyaXRlcn0gYHRoaXNgXG4gKiBAcHJpdmF0ZVxuICovXG5Xcml0ZXIucHJvdG90eXBlLl9wdXNoID0gZnVuY3Rpb24gcHVzaChmbiwgbGVuLCB2YWwpIHtcbiAgICB0aGlzLnRhaWwgPSB0aGlzLnRhaWwubmV4dCA9IG5ldyBPcChmbiwgbGVuLCB2YWwpO1xuICAgIHRoaXMubGVuICs9IGxlbjtcbiAgICByZXR1cm4gdGhpcztcbn07XG5cbmZ1bmN0aW9uIHdyaXRlQnl0ZSh2YWwsIGJ1ZiwgcG9zKSB7XG4gICAgYnVmW3Bvc10gPSB2YWwgJiAyNTU7XG59XG5cbmZ1bmN0aW9uIHdyaXRlVmFyaW50MzIodmFsLCBidWYsIHBvcykge1xuICAgIHdoaWxlICh2YWwgPiAxMjcpIHtcbiAgICAgICAgYnVmW3BvcysrXSA9IHZhbCAmIDEyNyB8IDEyODtcbiAgICAgICAgdmFsID4+Pj0gNztcbiAgICB9XG4gICAgYnVmW3Bvc10gPSB2YWw7XG59XG5cbi8qKlxuICogQ29uc3RydWN0cyBhIG5ldyB2YXJpbnQgd3JpdGVyIG9wZXJhdGlvbiBpbnN0YW5jZS5cbiAqIEBjbGFzc2Rlc2MgU2NoZWR1bGVkIHZhcmludCB3cml0ZXIgb3BlcmF0aW9uLlxuICogQGV4dGVuZHMgT3BcbiAqIEBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHtudW1iZXJ9IGxlbiBWYWx1ZSBieXRlIGxlbmd0aFxuICogQHBhcmFtIHtudW1iZXJ9IHZhbCBWYWx1ZSB0byB3cml0ZVxuICogQGlnbm9yZVxuICovXG5mdW5jdGlvbiBWYXJpbnRPcChsZW4sIHZhbCkge1xuICAgIHRoaXMubGVuID0gbGVuO1xuICAgIHRoaXMubmV4dCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLnZhbCA9IHZhbDtcbn1cblxuVmFyaW50T3AucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShPcC5wcm90b3R5cGUpO1xuVmFyaW50T3AucHJvdG90eXBlLmZuID0gd3JpdGVWYXJpbnQzMjtcblxuLyoqXG4gKiBXcml0ZXMgYW4gdW5zaWduZWQgMzIgYml0IHZhbHVlIGFzIGEgdmFyaW50LlxuICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIFZhbHVlIHRvIHdyaXRlXG4gKiBAcmV0dXJucyB7V3JpdGVyfSBgdGhpc2BcbiAqL1xuV3JpdGVyLnByb3RvdHlwZS51aW50MzIgPSBmdW5jdGlvbiB3cml0ZV91aW50MzIodmFsdWUpIHtcbiAgICAvLyBoZXJlLCB0aGUgY2FsbCB0byB0aGlzLnB1c2ggaGFzIGJlZW4gaW5saW5lZCBhbmQgYSB2YXJpbnQgc3BlY2lmaWMgT3Agc3ViY2xhc3MgaXMgdXNlZC5cbiAgICAvLyB1aW50MzIgaXMgYnkgZmFyIHRoZSBtb3N0IGZyZXF1ZW50bHkgdXNlZCBvcGVyYXRpb24gYW5kIGJlbmVmaXRzIHNpZ25pZmljYW50bHkgZnJvbSB0aGlzLlxuICAgIHRoaXMubGVuICs9ICh0aGlzLnRhaWwgPSB0aGlzLnRhaWwubmV4dCA9IG5ldyBWYXJpbnRPcChcbiAgICAgICAgKHZhbHVlID0gdmFsdWUgPj4+IDApXG4gICAgICAgICAgICAgICAgPCAxMjggICAgICAgPyAxXG4gICAgICAgIDogdmFsdWUgPCAxNjM4NCAgICAgPyAyXG4gICAgICAgIDogdmFsdWUgPCAyMDk3MTUyICAgPyAzXG4gICAgICAgIDogdmFsdWUgPCAyNjg0MzU0NTYgPyA0XG4gICAgICAgIDogICAgICAgICAgICAgICAgICAgICA1LFxuICAgIHZhbHVlKSkubGVuO1xuICAgIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBXcml0ZXMgYSBzaWduZWQgMzIgYml0IHZhbHVlIGFzIGEgdmFyaW50LlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgVmFsdWUgdG8gd3JpdGVcbiAqIEByZXR1cm5zIHtXcml0ZXJ9IGB0aGlzYFxuICovXG5Xcml0ZXIucHJvdG90eXBlLmludDMyID0gZnVuY3Rpb24gd3JpdGVfaW50MzIodmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgPCAwXG4gICAgICAgID8gdGhpcy5fcHVzaCh3cml0ZVZhcmludDY0LCAxMCwgTG9uZ0JpdHMuZnJvbU51bWJlcih2YWx1ZSkpIC8vIDEwIGJ5dGVzIHBlciBzcGVjXG4gICAgICAgIDogdGhpcy51aW50MzIodmFsdWUpO1xufTtcblxuLyoqXG4gKiBXcml0ZXMgYSAzMiBiaXQgdmFsdWUgYXMgYSB2YXJpbnQsIHppZy16YWcgZW5jb2RlZC5cbiAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSBWYWx1ZSB0byB3cml0ZVxuICogQHJldHVybnMge1dyaXRlcn0gYHRoaXNgXG4gKi9cbldyaXRlci5wcm90b3R5cGUuc2ludDMyID0gZnVuY3Rpb24gd3JpdGVfc2ludDMyKHZhbHVlKSB7XG4gICAgcmV0dXJuIHRoaXMudWludDMyKCh2YWx1ZSA8PCAxIF4gdmFsdWUgPj4gMzEpID4+PiAwKTtcbn07XG5cbmZ1bmN0aW9uIHdyaXRlVmFyaW50NjQodmFsLCBidWYsIHBvcykge1xuICAgIHdoaWxlICh2YWwuaGkpIHtcbiAgICAgICAgYnVmW3BvcysrXSA9IHZhbC5sbyAmIDEyNyB8IDEyODtcbiAgICAgICAgdmFsLmxvID0gKHZhbC5sbyA+Pj4gNyB8IHZhbC5oaSA8PCAyNSkgPj4+IDA7XG4gICAgICAgIHZhbC5oaSA+Pj49IDc7XG4gICAgfVxuICAgIHdoaWxlICh2YWwubG8gPiAxMjcpIHtcbiAgICAgICAgYnVmW3BvcysrXSA9IHZhbC5sbyAmIDEyNyB8IDEyODtcbiAgICAgICAgdmFsLmxvID0gdmFsLmxvID4+PiA3O1xuICAgIH1cbiAgICBidWZbcG9zKytdID0gdmFsLmxvO1xufVxuXG4vKipcbiAqIFdyaXRlcyBhbiB1bnNpZ25lZCA2NCBiaXQgdmFsdWUgYXMgYSB2YXJpbnQuXG4gKiBAcGFyYW0ge0xvbmd8bnVtYmVyfHN0cmluZ30gdmFsdWUgVmFsdWUgdG8gd3JpdGVcbiAqIEByZXR1cm5zIHtXcml0ZXJ9IGB0aGlzYFxuICogQHRocm93cyB7VHlwZUVycm9yfSBJZiBgdmFsdWVgIGlzIGEgc3RyaW5nIGFuZCBubyBsb25nIGxpYnJhcnkgaXMgcHJlc2VudC5cbiAqL1xuV3JpdGVyLnByb3RvdHlwZS51aW50NjQgPSBmdW5jdGlvbiB3cml0ZV91aW50NjQodmFsdWUpIHtcbiAgICB2YXIgYml0cyA9IExvbmdCaXRzLmZyb20odmFsdWUpO1xuICAgIHJldHVybiB0aGlzLl9wdXNoKHdyaXRlVmFyaW50NjQsIGJpdHMubGVuZ3RoKCksIGJpdHMpO1xufTtcblxuLyoqXG4gKiBXcml0ZXMgYSBzaWduZWQgNjQgYml0IHZhbHVlIGFzIGEgdmFyaW50LlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0ge0xvbmd8bnVtYmVyfHN0cmluZ30gdmFsdWUgVmFsdWUgdG8gd3JpdGVcbiAqIEByZXR1cm5zIHtXcml0ZXJ9IGB0aGlzYFxuICogQHRocm93cyB7VHlwZUVycm9yfSBJZiBgdmFsdWVgIGlzIGEgc3RyaW5nIGFuZCBubyBsb25nIGxpYnJhcnkgaXMgcHJlc2VudC5cbiAqL1xuV3JpdGVyLnByb3RvdHlwZS5pbnQ2NCA9IFdyaXRlci5wcm90b3R5cGUudWludDY0O1xuXG4vKipcbiAqIFdyaXRlcyBhIHNpZ25lZCA2NCBiaXQgdmFsdWUgYXMgYSB2YXJpbnQsIHppZy16YWcgZW5jb2RlZC5cbiAqIEBwYXJhbSB7TG9uZ3xudW1iZXJ8c3RyaW5nfSB2YWx1ZSBWYWx1ZSB0byB3cml0ZVxuICogQHJldHVybnMge1dyaXRlcn0gYHRoaXNgXG4gKiBAdGhyb3dzIHtUeXBlRXJyb3J9IElmIGB2YWx1ZWAgaXMgYSBzdHJpbmcgYW5kIG5vIGxvbmcgbGlicmFyeSBpcyBwcmVzZW50LlxuICovXG5Xcml0ZXIucHJvdG90eXBlLnNpbnQ2NCA9IGZ1bmN0aW9uIHdyaXRlX3NpbnQ2NCh2YWx1ZSkge1xuICAgIHZhciBiaXRzID0gTG9uZ0JpdHMuZnJvbSh2YWx1ZSkuenpFbmNvZGUoKTtcbiAgICByZXR1cm4gdGhpcy5fcHVzaCh3cml0ZVZhcmludDY0LCBiaXRzLmxlbmd0aCgpLCBiaXRzKTtcbn07XG5cbi8qKlxuICogV3JpdGVzIGEgYm9vbGlzaCB2YWx1ZSBhcyBhIHZhcmludC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gdmFsdWUgVmFsdWUgdG8gd3JpdGVcbiAqIEByZXR1cm5zIHtXcml0ZXJ9IGB0aGlzYFxuICovXG5Xcml0ZXIucHJvdG90eXBlLmJvb2wgPSBmdW5jdGlvbiB3cml0ZV9ib29sKHZhbHVlKSB7XG4gICAgcmV0dXJuIHRoaXMuX3B1c2god3JpdGVCeXRlLCAxLCB2YWx1ZSA/IDEgOiAwKTtcbn07XG5cbmZ1bmN0aW9uIHdyaXRlRml4ZWQzMih2YWwsIGJ1ZiwgcG9zKSB7XG4gICAgYnVmW3BvcyAgICBdID0gIHZhbCAgICAgICAgICYgMjU1O1xuICAgIGJ1Zltwb3MgKyAxXSA9ICB2YWwgPj4+IDggICAmIDI1NTtcbiAgICBidWZbcG9zICsgMl0gPSAgdmFsID4+PiAxNiAgJiAyNTU7XG4gICAgYnVmW3BvcyArIDNdID0gIHZhbCA+Pj4gMjQ7XG59XG5cbi8qKlxuICogV3JpdGVzIGFuIHVuc2lnbmVkIDMyIGJpdCB2YWx1ZSBhcyBmaXhlZCAzMiBiaXRzLlxuICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIFZhbHVlIHRvIHdyaXRlXG4gKiBAcmV0dXJucyB7V3JpdGVyfSBgdGhpc2BcbiAqL1xuV3JpdGVyLnByb3RvdHlwZS5maXhlZDMyID0gZnVuY3Rpb24gd3JpdGVfZml4ZWQzMih2YWx1ZSkge1xuICAgIHJldHVybiB0aGlzLl9wdXNoKHdyaXRlRml4ZWQzMiwgNCwgdmFsdWUgPj4+IDApO1xufTtcblxuLyoqXG4gKiBXcml0ZXMgYSBzaWduZWQgMzIgYml0IHZhbHVlIGFzIGZpeGVkIDMyIGJpdHMuXG4gKiBAZnVuY3Rpb25cbiAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSBWYWx1ZSB0byB3cml0ZVxuICogQHJldHVybnMge1dyaXRlcn0gYHRoaXNgXG4gKi9cbldyaXRlci5wcm90b3R5cGUuc2ZpeGVkMzIgPSBXcml0ZXIucHJvdG90eXBlLmZpeGVkMzI7XG5cbi8qKlxuICogV3JpdGVzIGFuIHVuc2lnbmVkIDY0IGJpdCB2YWx1ZSBhcyBmaXhlZCA2NCBiaXRzLlxuICogQHBhcmFtIHtMb25nfG51bWJlcnxzdHJpbmd9IHZhbHVlIFZhbHVlIHRvIHdyaXRlXG4gKiBAcmV0dXJucyB7V3JpdGVyfSBgdGhpc2BcbiAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gSWYgYHZhbHVlYCBpcyBhIHN0cmluZyBhbmQgbm8gbG9uZyBsaWJyYXJ5IGlzIHByZXNlbnQuXG4gKi9cbldyaXRlci5wcm90b3R5cGUuZml4ZWQ2NCA9IGZ1bmN0aW9uIHdyaXRlX2ZpeGVkNjQodmFsdWUpIHtcbiAgICB2YXIgYml0cyA9IExvbmdCaXRzLmZyb20odmFsdWUpO1xuICAgIHJldHVybiB0aGlzLl9wdXNoKHdyaXRlRml4ZWQzMiwgNCwgYml0cy5sbykuX3B1c2god3JpdGVGaXhlZDMyLCA0LCBiaXRzLmhpKTtcbn07XG5cbi8qKlxuICogV3JpdGVzIGEgc2lnbmVkIDY0IGJpdCB2YWx1ZSBhcyBmaXhlZCA2NCBiaXRzLlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0ge0xvbmd8bnVtYmVyfHN0cmluZ30gdmFsdWUgVmFsdWUgdG8gd3JpdGVcbiAqIEByZXR1cm5zIHtXcml0ZXJ9IGB0aGlzYFxuICogQHRocm93cyB7VHlwZUVycm9yfSBJZiBgdmFsdWVgIGlzIGEgc3RyaW5nIGFuZCBubyBsb25nIGxpYnJhcnkgaXMgcHJlc2VudC5cbiAqL1xuV3JpdGVyLnByb3RvdHlwZS5zZml4ZWQ2NCA9IFdyaXRlci5wcm90b3R5cGUuZml4ZWQ2NDtcblxuLyoqXG4gKiBXcml0ZXMgYSBmbG9hdCAoMzIgYml0KS5cbiAqIEBmdW5jdGlvblxuICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIFZhbHVlIHRvIHdyaXRlXG4gKiBAcmV0dXJucyB7V3JpdGVyfSBgdGhpc2BcbiAqL1xuV3JpdGVyLnByb3RvdHlwZS5mbG9hdCA9IGZ1bmN0aW9uIHdyaXRlX2Zsb2F0KHZhbHVlKSB7XG4gICAgcmV0dXJuIHRoaXMuX3B1c2godXRpbC5mbG9hdC53cml0ZUZsb2F0TEUsIDQsIHZhbHVlKTtcbn07XG5cbi8qKlxuICogV3JpdGVzIGEgZG91YmxlICg2NCBiaXQgZmxvYXQpLlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgVmFsdWUgdG8gd3JpdGVcbiAqIEByZXR1cm5zIHtXcml0ZXJ9IGB0aGlzYFxuICovXG5Xcml0ZXIucHJvdG90eXBlLmRvdWJsZSA9IGZ1bmN0aW9uIHdyaXRlX2RvdWJsZSh2YWx1ZSkge1xuICAgIHJldHVybiB0aGlzLl9wdXNoKHV0aWwuZmxvYXQud3JpdGVEb3VibGVMRSwgOCwgdmFsdWUpO1xufTtcblxudmFyIHdyaXRlQnl0ZXMgPSB1dGlsLkFycmF5LnByb3RvdHlwZS5zZXRcbiAgICA/IGZ1bmN0aW9uIHdyaXRlQnl0ZXNfc2V0KHZhbCwgYnVmLCBwb3MpIHtcbiAgICAgICAgYnVmLnNldCh2YWwsIHBvcyk7IC8vIGFsc28gd29ya3MgZm9yIHBsYWluIGFycmF5IHZhbHVlc1xuICAgIH1cbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgIDogZnVuY3Rpb24gd3JpdGVCeXRlc19mb3IodmFsLCBidWYsIHBvcykge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbC5sZW5ndGg7ICsraSlcbiAgICAgICAgICAgIGJ1Zltwb3MgKyBpXSA9IHZhbFtpXTtcbiAgICB9O1xuXG4vKipcbiAqIFdyaXRlcyBhIHNlcXVlbmNlIG9mIGJ5dGVzLlxuICogQHBhcmFtIHtVaW50OEFycmF5fHN0cmluZ30gdmFsdWUgQnVmZmVyIG9yIGJhc2U2NCBlbmNvZGVkIHN0cmluZyB0byB3cml0ZVxuICogQHJldHVybnMge1dyaXRlcn0gYHRoaXNgXG4gKi9cbldyaXRlci5wcm90b3R5cGUuYnl0ZXMgPSBmdW5jdGlvbiB3cml0ZV9ieXRlcyh2YWx1ZSkge1xuICAgIHZhciBsZW4gPSB2YWx1ZS5sZW5ndGggPj4+IDA7XG4gICAgaWYgKCFsZW4pXG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoKHdyaXRlQnl0ZSwgMSwgMCk7XG4gICAgaWYgKHV0aWwuaXNTdHJpbmcodmFsdWUpKSB7XG4gICAgICAgIHZhciBidWYgPSBXcml0ZXIuYWxsb2MobGVuID0gYmFzZTY0Lmxlbmd0aCh2YWx1ZSkpO1xuICAgICAgICBiYXNlNjQuZGVjb2RlKHZhbHVlLCBidWYsIDApO1xuICAgICAgICB2YWx1ZSA9IGJ1ZjtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMudWludDMyKGxlbikuX3B1c2god3JpdGVCeXRlcywgbGVuLCB2YWx1ZSk7XG59O1xuXG4vKipcbiAqIFdyaXRlcyBhIHN0cmluZy5cbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSBWYWx1ZSB0byB3cml0ZVxuICogQHJldHVybnMge1dyaXRlcn0gYHRoaXNgXG4gKi9cbldyaXRlci5wcm90b3R5cGUuc3RyaW5nID0gZnVuY3Rpb24gd3JpdGVfc3RyaW5nKHZhbHVlKSB7XG4gICAgdmFyIGxlbiA9IHV0ZjgubGVuZ3RoKHZhbHVlKTtcbiAgICByZXR1cm4gbGVuXG4gICAgICAgID8gdGhpcy51aW50MzIobGVuKS5fcHVzaCh1dGY4LndyaXRlLCBsZW4sIHZhbHVlKVxuICAgICAgICA6IHRoaXMuX3B1c2god3JpdGVCeXRlLCAxLCAwKTtcbn07XG5cbi8qKlxuICogRm9ya3MgdGhpcyB3cml0ZXIncyBzdGF0ZSBieSBwdXNoaW5nIGl0IHRvIGEgc3RhY2suXG4gKiBDYWxsaW5nIHtAbGluayBXcml0ZXIjcmVzZXR8cmVzZXR9IG9yIHtAbGluayBXcml0ZXIjbGRlbGltfGxkZWxpbX0gcmVzZXRzIHRoZSB3cml0ZXIgdG8gdGhlIHByZXZpb3VzIHN0YXRlLlxuICogQHJldHVybnMge1dyaXRlcn0gYHRoaXNgXG4gKi9cbldyaXRlci5wcm90b3R5cGUuZm9yayA9IGZ1bmN0aW9uIGZvcmsoKSB7XG4gICAgdGhpcy5zdGF0ZXMgPSBuZXcgU3RhdGUodGhpcyk7XG4gICAgdGhpcy5oZWFkID0gdGhpcy50YWlsID0gbmV3IE9wKG5vb3AsIDAsIDApO1xuICAgIHRoaXMubGVuID0gMDtcbiAgICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogUmVzZXRzIHRoaXMgaW5zdGFuY2UgdG8gdGhlIGxhc3Qgc3RhdGUuXG4gKiBAcmV0dXJucyB7V3JpdGVyfSBgdGhpc2BcbiAqL1xuV3JpdGVyLnByb3RvdHlwZS5yZXNldCA9IGZ1bmN0aW9uIHJlc2V0KCkge1xuICAgIGlmICh0aGlzLnN0YXRlcykge1xuICAgICAgICB0aGlzLmhlYWQgICA9IHRoaXMuc3RhdGVzLmhlYWQ7XG4gICAgICAgIHRoaXMudGFpbCAgID0gdGhpcy5zdGF0ZXMudGFpbDtcbiAgICAgICAgdGhpcy5sZW4gICAgPSB0aGlzLnN0YXRlcy5sZW47XG4gICAgICAgIHRoaXMuc3RhdGVzID0gdGhpcy5zdGF0ZXMubmV4dDtcbiAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmhlYWQgPSB0aGlzLnRhaWwgPSBuZXcgT3Aobm9vcCwgMCwgMCk7XG4gICAgICAgIHRoaXMubGVuICA9IDA7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBSZXNldHMgdG8gdGhlIGxhc3Qgc3RhdGUgYW5kIGFwcGVuZHMgdGhlIGZvcmsgc3RhdGUncyBjdXJyZW50IHdyaXRlIGxlbmd0aCBhcyBhIHZhcmludCBmb2xsb3dlZCBieSBpdHMgb3BlcmF0aW9ucy5cbiAqIEByZXR1cm5zIHtXcml0ZXJ9IGB0aGlzYFxuICovXG5Xcml0ZXIucHJvdG90eXBlLmxkZWxpbSA9IGZ1bmN0aW9uIGxkZWxpbSgpIHtcbiAgICB2YXIgaGVhZCA9IHRoaXMuaGVhZCxcbiAgICAgICAgdGFpbCA9IHRoaXMudGFpbCxcbiAgICAgICAgbGVuICA9IHRoaXMubGVuO1xuICAgIHRoaXMucmVzZXQoKS51aW50MzIobGVuKTtcbiAgICBpZiAobGVuKSB7XG4gICAgICAgIHRoaXMudGFpbC5uZXh0ID0gaGVhZC5uZXh0OyAvLyBza2lwIG5vb3BcbiAgICAgICAgdGhpcy50YWlsID0gdGFpbDtcbiAgICAgICAgdGhpcy5sZW4gKz0gbGVuO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogRmluaXNoZXMgdGhlIHdyaXRlIG9wZXJhdGlvbi5cbiAqIEByZXR1cm5zIHtVaW50OEFycmF5fSBGaW5pc2hlZCBidWZmZXJcbiAqL1xuV3JpdGVyLnByb3RvdHlwZS5maW5pc2ggPSBmdW5jdGlvbiBmaW5pc2goKSB7XG4gICAgdmFyIGhlYWQgPSB0aGlzLmhlYWQubmV4dCwgLy8gc2tpcCBub29wXG4gICAgICAgIGJ1ZiAgPSB0aGlzLmNvbnN0cnVjdG9yLmFsbG9jKHRoaXMubGVuKSxcbiAgICAgICAgcG9zICA9IDA7XG4gICAgd2hpbGUgKGhlYWQpIHtcbiAgICAgICAgaGVhZC5mbihoZWFkLnZhbCwgYnVmLCBwb3MpO1xuICAgICAgICBwb3MgKz0gaGVhZC5sZW47XG4gICAgICAgIGhlYWQgPSBoZWFkLm5leHQ7XG4gICAgfVxuICAgIC8vIHRoaXMuaGVhZCA9IHRoaXMudGFpbCA9IG51bGw7XG4gICAgcmV0dXJuIGJ1Zjtcbn07XG5cbldyaXRlci5fY29uZmlndXJlID0gZnVuY3Rpb24oQnVmZmVyV3JpdGVyXykge1xuICAgIEJ1ZmZlcldyaXRlciA9IEJ1ZmZlcldyaXRlcl87XG4gICAgV3JpdGVyLmNyZWF0ZSA9IGNyZWF0ZSgpO1xuICAgIEJ1ZmZlcldyaXRlci5fY29uZmlndXJlKCk7XG59O1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5tb2R1bGUuZXhwb3J0cyA9IEJ1ZmZlcldyaXRlcjtcblxuLy8gZXh0ZW5kcyBXcml0ZXJcbnZhciBXcml0ZXIgPSByZXF1aXJlKFwiLi93cml0ZXJcIik7XG4oQnVmZmVyV3JpdGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoV3JpdGVyLnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yID0gQnVmZmVyV3JpdGVyO1xuXG52YXIgdXRpbCA9IHJlcXVpcmUoXCIuL3V0aWwvbWluaW1hbFwiKTtcblxuLyoqXG4gKiBDb25zdHJ1Y3RzIGEgbmV3IGJ1ZmZlciB3cml0ZXIgaW5zdGFuY2UuXG4gKiBAY2xhc3NkZXNjIFdpcmUgZm9ybWF0IHdyaXRlciB1c2luZyBub2RlIGJ1ZmZlcnMuXG4gKiBAZXh0ZW5kcyBXcml0ZXJcbiAqIEBjb25zdHJ1Y3RvclxuICovXG5mdW5jdGlvbiBCdWZmZXJXcml0ZXIoKSB7XG4gICAgV3JpdGVyLmNhbGwodGhpcyk7XG59XG5cbkJ1ZmZlcldyaXRlci5fY29uZmlndXJlID0gZnVuY3Rpb24gKCkge1xuICAgIC8qKlxuICAgICAqIEFsbG9jYXRlcyBhIGJ1ZmZlciBvZiB0aGUgc3BlY2lmaWVkIHNpemUuXG4gICAgICogQGZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHNpemUgQnVmZmVyIHNpemVcbiAgICAgKiBAcmV0dXJucyB7QnVmZmVyfSBCdWZmZXJcbiAgICAgKi9cbiAgICBCdWZmZXJXcml0ZXIuYWxsb2MgPSB1dGlsLl9CdWZmZXJfYWxsb2NVbnNhZmU7XG5cbiAgICBCdWZmZXJXcml0ZXIud3JpdGVCeXRlc0J1ZmZlciA9IHV0aWwuQnVmZmVyICYmIHV0aWwuQnVmZmVyLnByb3RvdHlwZSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkgJiYgdXRpbC5CdWZmZXIucHJvdG90eXBlLnNldC5uYW1lID09PSBcInNldFwiXG4gICAgICAgID8gZnVuY3Rpb24gd3JpdGVCeXRlc0J1ZmZlcl9zZXQodmFsLCBidWYsIHBvcykge1xuICAgICAgICAgIGJ1Zi5zZXQodmFsLCBwb3MpOyAvLyBmYXN0ZXIgdGhhbiBjb3B5IChyZXF1aXJlcyBub2RlID49IDQgd2hlcmUgQnVmZmVycyBleHRlbmQgVWludDhBcnJheSBhbmQgc2V0IGlzIHByb3Blcmx5IGluaGVyaXRlZClcbiAgICAgICAgICAvLyBhbHNvIHdvcmtzIGZvciBwbGFpbiBhcnJheSB2YWx1ZXNcbiAgICAgICAgfVxuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgICA6IGZ1bmN0aW9uIHdyaXRlQnl0ZXNCdWZmZXJfY29weSh2YWwsIGJ1ZiwgcG9zKSB7XG4gICAgICAgICAgaWYgKHZhbC5jb3B5KSAvLyBCdWZmZXIgdmFsdWVzXG4gICAgICAgICAgICB2YWwuY29weShidWYsIHBvcywgMCwgdmFsLmxlbmd0aCk7XG4gICAgICAgICAgZWxzZSBmb3IgKHZhciBpID0gMDsgaSA8IHZhbC5sZW5ndGg7KSAvLyBwbGFpbiBhcnJheSB2YWx1ZXNcbiAgICAgICAgICAgIGJ1Zltwb3MrK10gPSB2YWxbaSsrXTtcbiAgICAgICAgfTtcbn07XG5cblxuLyoqXG4gKiBAb3ZlcnJpZGVcbiAqL1xuQnVmZmVyV3JpdGVyLnByb3RvdHlwZS5ieXRlcyA9IGZ1bmN0aW9uIHdyaXRlX2J5dGVzX2J1ZmZlcih2YWx1ZSkge1xuICAgIGlmICh1dGlsLmlzU3RyaW5nKHZhbHVlKSlcbiAgICAgICAgdmFsdWUgPSB1dGlsLl9CdWZmZXJfZnJvbSh2YWx1ZSwgXCJiYXNlNjRcIik7XG4gICAgdmFyIGxlbiA9IHZhbHVlLmxlbmd0aCA+Pj4gMDtcbiAgICB0aGlzLnVpbnQzMihsZW4pO1xuICAgIGlmIChsZW4pXG4gICAgICAgIHRoaXMuX3B1c2goQnVmZmVyV3JpdGVyLndyaXRlQnl0ZXNCdWZmZXIsIGxlbiwgdmFsdWUpO1xuICAgIHJldHVybiB0aGlzO1xufTtcblxuZnVuY3Rpb24gd3JpdGVTdHJpbmdCdWZmZXIodmFsLCBidWYsIHBvcykge1xuICAgIGlmICh2YWwubGVuZ3RoIDwgNDApIC8vIHBsYWluIGpzIGlzIGZhc3RlciBmb3Igc2hvcnQgc3RyaW5ncyAocHJvYmFibHkgZHVlIHRvIHJlZHVuZGFudCBhc3NlcnRpb25zKVxuICAgICAgICB1dGlsLnV0Zjgud3JpdGUodmFsLCBidWYsIHBvcyk7XG4gICAgZWxzZSBpZiAoYnVmLnV0ZjhXcml0ZSlcbiAgICAgICAgYnVmLnV0ZjhXcml0ZSh2YWwsIHBvcyk7XG4gICAgZWxzZVxuICAgICAgICBidWYud3JpdGUodmFsLCBwb3MpO1xufVxuXG4vKipcbiAqIEBvdmVycmlkZVxuICovXG5CdWZmZXJXcml0ZXIucHJvdG90eXBlLnN0cmluZyA9IGZ1bmN0aW9uIHdyaXRlX3N0cmluZ19idWZmZXIodmFsdWUpIHtcbiAgICB2YXIgbGVuID0gdXRpbC5CdWZmZXIuYnl0ZUxlbmd0aCh2YWx1ZSk7XG4gICAgdGhpcy51aW50MzIobGVuKTtcbiAgICBpZiAobGVuKVxuICAgICAgICB0aGlzLl9wdXNoKHdyaXRlU3RyaW5nQnVmZmVyLCBsZW4sIHZhbHVlKTtcbiAgICByZXR1cm4gdGhpcztcbn07XG5cblxuLyoqXG4gKiBGaW5pc2hlcyB0aGUgd3JpdGUgb3BlcmF0aW9uLlxuICogQG5hbWUgQnVmZmVyV3JpdGVyI2ZpbmlzaFxuICogQGZ1bmN0aW9uXG4gKiBAcmV0dXJucyB7QnVmZmVyfSBGaW5pc2hlZCBidWZmZXJcbiAqL1xuXG5CdWZmZXJXcml0ZXIuX2NvbmZpZ3VyZSgpO1xuIiwiLyohIGh0dHBzOi8vbXRocy5iZS9wdW55Y29kZSB2MS40LjEgYnkgQG1hdGhpYXMgKi9cbjsoZnVuY3Rpb24ocm9vdCkge1xuXG5cdC8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZXMgKi9cblx0dmFyIGZyZWVFeHBvcnRzID0gdHlwZW9mIGV4cG9ydHMgPT0gJ29iamVjdCcgJiYgZXhwb3J0cyAmJlxuXHRcdCFleHBvcnRzLm5vZGVUeXBlICYmIGV4cG9ydHM7XG5cdHZhciBmcmVlTW9kdWxlID0gdHlwZW9mIG1vZHVsZSA9PSAnb2JqZWN0JyAmJiBtb2R1bGUgJiZcblx0XHQhbW9kdWxlLm5vZGVUeXBlICYmIG1vZHVsZTtcblx0dmFyIGZyZWVHbG9iYWwgPSB0eXBlb2YgZ2xvYmFsID09ICdvYmplY3QnICYmIGdsb2JhbDtcblx0aWYgKFxuXHRcdGZyZWVHbG9iYWwuZ2xvYmFsID09PSBmcmVlR2xvYmFsIHx8XG5cdFx0ZnJlZUdsb2JhbC53aW5kb3cgPT09IGZyZWVHbG9iYWwgfHxcblx0XHRmcmVlR2xvYmFsLnNlbGYgPT09IGZyZWVHbG9iYWxcblx0KSB7XG5cdFx0cm9vdCA9IGZyZWVHbG9iYWw7XG5cdH1cblxuXHQvKipcblx0ICogVGhlIGBwdW55Y29kZWAgb2JqZWN0LlxuXHQgKiBAbmFtZSBwdW55Y29kZVxuXHQgKiBAdHlwZSBPYmplY3Rcblx0ICovXG5cdHZhciBwdW55Y29kZSxcblxuXHQvKiogSGlnaGVzdCBwb3NpdGl2ZSBzaWduZWQgMzItYml0IGZsb2F0IHZhbHVlICovXG5cdG1heEludCA9IDIxNDc0ODM2NDcsIC8vIGFrYS4gMHg3RkZGRkZGRiBvciAyXjMxLTFcblxuXHQvKiogQm9vdHN0cmluZyBwYXJhbWV0ZXJzICovXG5cdGJhc2UgPSAzNixcblx0dE1pbiA9IDEsXG5cdHRNYXggPSAyNixcblx0c2tldyA9IDM4LFxuXHRkYW1wID0gNzAwLFxuXHRpbml0aWFsQmlhcyA9IDcyLFxuXHRpbml0aWFsTiA9IDEyOCwgLy8gMHg4MFxuXHRkZWxpbWl0ZXIgPSAnLScsIC8vICdcXHgyRCdcblxuXHQvKiogUmVndWxhciBleHByZXNzaW9ucyAqL1xuXHRyZWdleFB1bnljb2RlID0gL154bi0tLyxcblx0cmVnZXhOb25BU0NJSSA9IC9bXlxceDIwLVxceDdFXS8sIC8vIHVucHJpbnRhYmxlIEFTQ0lJIGNoYXJzICsgbm9uLUFTQ0lJIGNoYXJzXG5cdHJlZ2V4U2VwYXJhdG9ycyA9IC9bXFx4MkVcXHUzMDAyXFx1RkYwRVxcdUZGNjFdL2csIC8vIFJGQyAzNDkwIHNlcGFyYXRvcnNcblxuXHQvKiogRXJyb3IgbWVzc2FnZXMgKi9cblx0ZXJyb3JzID0ge1xuXHRcdCdvdmVyZmxvdyc6ICdPdmVyZmxvdzogaW5wdXQgbmVlZHMgd2lkZXIgaW50ZWdlcnMgdG8gcHJvY2VzcycsXG5cdFx0J25vdC1iYXNpYyc6ICdJbGxlZ2FsIGlucHV0ID49IDB4ODAgKG5vdCBhIGJhc2ljIGNvZGUgcG9pbnQpJyxcblx0XHQnaW52YWxpZC1pbnB1dCc6ICdJbnZhbGlkIGlucHV0J1xuXHR9LFxuXG5cdC8qKiBDb252ZW5pZW5jZSBzaG9ydGN1dHMgKi9cblx0YmFzZU1pbnVzVE1pbiA9IGJhc2UgLSB0TWluLFxuXHRmbG9vciA9IE1hdGguZmxvb3IsXG5cdHN0cmluZ0Zyb21DaGFyQ29kZSA9IFN0cmluZy5mcm9tQ2hhckNvZGUsXG5cblx0LyoqIFRlbXBvcmFyeSB2YXJpYWJsZSAqL1xuXHRrZXk7XG5cblx0LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cblx0LyoqXG5cdCAqIEEgZ2VuZXJpYyBlcnJvciB1dGlsaXR5IGZ1bmN0aW9uLlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAcGFyYW0ge1N0cmluZ30gdHlwZSBUaGUgZXJyb3IgdHlwZS5cblx0ICogQHJldHVybnMge0Vycm9yfSBUaHJvd3MgYSBgUmFuZ2VFcnJvcmAgd2l0aCB0aGUgYXBwbGljYWJsZSBlcnJvciBtZXNzYWdlLlxuXHQgKi9cblx0ZnVuY3Rpb24gZXJyb3IodHlwZSkge1xuXHRcdHRocm93IG5ldyBSYW5nZUVycm9yKGVycm9yc1t0eXBlXSk7XG5cdH1cblxuXHQvKipcblx0ICogQSBnZW5lcmljIGBBcnJheSNtYXBgIHV0aWxpdHkgZnVuY3Rpb24uXG5cdCAqIEBwcml2YXRlXG5cdCAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG5cdCAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIFRoZSBmdW5jdGlvbiB0aGF0IGdldHMgY2FsbGVkIGZvciBldmVyeSBhcnJheVxuXHQgKiBpdGVtLlxuXHQgKiBAcmV0dXJucyB7QXJyYXl9IEEgbmV3IGFycmF5IG9mIHZhbHVlcyByZXR1cm5lZCBieSB0aGUgY2FsbGJhY2sgZnVuY3Rpb24uXG5cdCAqL1xuXHRmdW5jdGlvbiBtYXAoYXJyYXksIGZuKSB7XG5cdFx0dmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcblx0XHR2YXIgcmVzdWx0ID0gW107XG5cdFx0d2hpbGUgKGxlbmd0aC0tKSB7XG5cdFx0XHRyZXN1bHRbbGVuZ3RoXSA9IGZuKGFycmF5W2xlbmd0aF0pO1xuXHRcdH1cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9XG5cblx0LyoqXG5cdCAqIEEgc2ltcGxlIGBBcnJheSNtYXBgLWxpa2Ugd3JhcHBlciB0byB3b3JrIHdpdGggZG9tYWluIG5hbWUgc3RyaW5ncyBvciBlbWFpbFxuXHQgKiBhZGRyZXNzZXMuXG5cdCAqIEBwcml2YXRlXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSBkb21haW4gVGhlIGRvbWFpbiBuYW1lIG9yIGVtYWlsIGFkZHJlc3MuXG5cdCAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIFRoZSBmdW5jdGlvbiB0aGF0IGdldHMgY2FsbGVkIGZvciBldmVyeVxuXHQgKiBjaGFyYWN0ZXIuXG5cdCAqIEByZXR1cm5zIHtBcnJheX0gQSBuZXcgc3RyaW5nIG9mIGNoYXJhY3RlcnMgcmV0dXJuZWQgYnkgdGhlIGNhbGxiYWNrXG5cdCAqIGZ1bmN0aW9uLlxuXHQgKi9cblx0ZnVuY3Rpb24gbWFwRG9tYWluKHN0cmluZywgZm4pIHtcblx0XHR2YXIgcGFydHMgPSBzdHJpbmcuc3BsaXQoJ0AnKTtcblx0XHR2YXIgcmVzdWx0ID0gJyc7XG5cdFx0aWYgKHBhcnRzLmxlbmd0aCA+IDEpIHtcblx0XHRcdC8vIEluIGVtYWlsIGFkZHJlc3Nlcywgb25seSB0aGUgZG9tYWluIG5hbWUgc2hvdWxkIGJlIHB1bnljb2RlZC4gTGVhdmVcblx0XHRcdC8vIHRoZSBsb2NhbCBwYXJ0IChpLmUuIGV2ZXJ5dGhpbmcgdXAgdG8gYEBgKSBpbnRhY3QuXG5cdFx0XHRyZXN1bHQgPSBwYXJ0c1swXSArICdAJztcblx0XHRcdHN0cmluZyA9IHBhcnRzWzFdO1xuXHRcdH1cblx0XHQvLyBBdm9pZCBgc3BsaXQocmVnZXgpYCBmb3IgSUU4IGNvbXBhdGliaWxpdHkuIFNlZSAjMTcuXG5cdFx0c3RyaW5nID0gc3RyaW5nLnJlcGxhY2UocmVnZXhTZXBhcmF0b3JzLCAnXFx4MkUnKTtcblx0XHR2YXIgbGFiZWxzID0gc3RyaW5nLnNwbGl0KCcuJyk7XG5cdFx0dmFyIGVuY29kZWQgPSBtYXAobGFiZWxzLCBmbikuam9pbignLicpO1xuXHRcdHJldHVybiByZXN1bHQgKyBlbmNvZGVkO1xuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYW4gYXJyYXkgY29udGFpbmluZyB0aGUgbnVtZXJpYyBjb2RlIHBvaW50cyBvZiBlYWNoIFVuaWNvZGVcblx0ICogY2hhcmFjdGVyIGluIHRoZSBzdHJpbmcuIFdoaWxlIEphdmFTY3JpcHQgdXNlcyBVQ1MtMiBpbnRlcm5hbGx5LFxuXHQgKiB0aGlzIGZ1bmN0aW9uIHdpbGwgY29udmVydCBhIHBhaXIgb2Ygc3Vycm9nYXRlIGhhbHZlcyAoZWFjaCBvZiB3aGljaFxuXHQgKiBVQ1MtMiBleHBvc2VzIGFzIHNlcGFyYXRlIGNoYXJhY3RlcnMpIGludG8gYSBzaW5nbGUgY29kZSBwb2ludCxcblx0ICogbWF0Y2hpbmcgVVRGLTE2LlxuXHQgKiBAc2VlIGBwdW55Y29kZS51Y3MyLmVuY29kZWBcblx0ICogQHNlZSA8aHR0cHM6Ly9tYXRoaWFzYnluZW5zLmJlL25vdGVzL2phdmFzY3JpcHQtZW5jb2Rpbmc+XG5cdCAqIEBtZW1iZXJPZiBwdW55Y29kZS51Y3MyXG5cdCAqIEBuYW1lIGRlY29kZVxuXHQgKiBAcGFyYW0ge1N0cmluZ30gc3RyaW5nIFRoZSBVbmljb2RlIGlucHV0IHN0cmluZyAoVUNTLTIpLlxuXHQgKiBAcmV0dXJucyB7QXJyYXl9IFRoZSBuZXcgYXJyYXkgb2YgY29kZSBwb2ludHMuXG5cdCAqL1xuXHRmdW5jdGlvbiB1Y3MyZGVjb2RlKHN0cmluZykge1xuXHRcdHZhciBvdXRwdXQgPSBbXSxcblx0XHQgICAgY291bnRlciA9IDAsXG5cdFx0ICAgIGxlbmd0aCA9IHN0cmluZy5sZW5ndGgsXG5cdFx0ICAgIHZhbHVlLFxuXHRcdCAgICBleHRyYTtcblx0XHR3aGlsZSAoY291bnRlciA8IGxlbmd0aCkge1xuXHRcdFx0dmFsdWUgPSBzdHJpbmcuY2hhckNvZGVBdChjb3VudGVyKyspO1xuXHRcdFx0aWYgKHZhbHVlID49IDB4RDgwMCAmJiB2YWx1ZSA8PSAweERCRkYgJiYgY291bnRlciA8IGxlbmd0aCkge1xuXHRcdFx0XHQvLyBoaWdoIHN1cnJvZ2F0ZSwgYW5kIHRoZXJlIGlzIGEgbmV4dCBjaGFyYWN0ZXJcblx0XHRcdFx0ZXh0cmEgPSBzdHJpbmcuY2hhckNvZGVBdChjb3VudGVyKyspO1xuXHRcdFx0XHRpZiAoKGV4dHJhICYgMHhGQzAwKSA9PSAweERDMDApIHsgLy8gbG93IHN1cnJvZ2F0ZVxuXHRcdFx0XHRcdG91dHB1dC5wdXNoKCgodmFsdWUgJiAweDNGRikgPDwgMTApICsgKGV4dHJhICYgMHgzRkYpICsgMHgxMDAwMCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gdW5tYXRjaGVkIHN1cnJvZ2F0ZTsgb25seSBhcHBlbmQgdGhpcyBjb2RlIHVuaXQsIGluIGNhc2UgdGhlIG5leHRcblx0XHRcdFx0XHQvLyBjb2RlIHVuaXQgaXMgdGhlIGhpZ2ggc3Vycm9nYXRlIG9mIGEgc3Vycm9nYXRlIHBhaXJcblx0XHRcdFx0XHRvdXRwdXQucHVzaCh2YWx1ZSk7XG5cdFx0XHRcdFx0Y291bnRlci0tO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRvdXRwdXQucHVzaCh2YWx1ZSk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBvdXRwdXQ7XG5cdH1cblxuXHQvKipcblx0ICogQ3JlYXRlcyBhIHN0cmluZyBiYXNlZCBvbiBhbiBhcnJheSBvZiBudW1lcmljIGNvZGUgcG9pbnRzLlxuXHQgKiBAc2VlIGBwdW55Y29kZS51Y3MyLmRlY29kZWBcblx0ICogQG1lbWJlck9mIHB1bnljb2RlLnVjczJcblx0ICogQG5hbWUgZW5jb2RlXG5cdCAqIEBwYXJhbSB7QXJyYXl9IGNvZGVQb2ludHMgVGhlIGFycmF5IG9mIG51bWVyaWMgY29kZSBwb2ludHMuXG5cdCAqIEByZXR1cm5zIHtTdHJpbmd9IFRoZSBuZXcgVW5pY29kZSBzdHJpbmcgKFVDUy0yKS5cblx0ICovXG5cdGZ1bmN0aW9uIHVjczJlbmNvZGUoYXJyYXkpIHtcblx0XHRyZXR1cm4gbWFwKGFycmF5LCBmdW5jdGlvbih2YWx1ZSkge1xuXHRcdFx0dmFyIG91dHB1dCA9ICcnO1xuXHRcdFx0aWYgKHZhbHVlID4gMHhGRkZGKSB7XG5cdFx0XHRcdHZhbHVlIC09IDB4MTAwMDA7XG5cdFx0XHRcdG91dHB1dCArPSBzdHJpbmdGcm9tQ2hhckNvZGUodmFsdWUgPj4+IDEwICYgMHgzRkYgfCAweEQ4MDApO1xuXHRcdFx0XHR2YWx1ZSA9IDB4REMwMCB8IHZhbHVlICYgMHgzRkY7XG5cdFx0XHR9XG5cdFx0XHRvdXRwdXQgKz0gc3RyaW5nRnJvbUNoYXJDb2RlKHZhbHVlKTtcblx0XHRcdHJldHVybiBvdXRwdXQ7XG5cdFx0fSkuam9pbignJyk7XG5cdH1cblxuXHQvKipcblx0ICogQ29udmVydHMgYSBiYXNpYyBjb2RlIHBvaW50IGludG8gYSBkaWdpdC9pbnRlZ2VyLlxuXHQgKiBAc2VlIGBkaWdpdFRvQmFzaWMoKWBcblx0ICogQHByaXZhdGVcblx0ICogQHBhcmFtIHtOdW1iZXJ9IGNvZGVQb2ludCBUaGUgYmFzaWMgbnVtZXJpYyBjb2RlIHBvaW50IHZhbHVlLlxuXHQgKiBAcmV0dXJucyB7TnVtYmVyfSBUaGUgbnVtZXJpYyB2YWx1ZSBvZiBhIGJhc2ljIGNvZGUgcG9pbnQgKGZvciB1c2UgaW5cblx0ICogcmVwcmVzZW50aW5nIGludGVnZXJzKSBpbiB0aGUgcmFuZ2UgYDBgIHRvIGBiYXNlIC0gMWAsIG9yIGBiYXNlYCBpZlxuXHQgKiB0aGUgY29kZSBwb2ludCBkb2VzIG5vdCByZXByZXNlbnQgYSB2YWx1ZS5cblx0ICovXG5cdGZ1bmN0aW9uIGJhc2ljVG9EaWdpdChjb2RlUG9pbnQpIHtcblx0XHRpZiAoY29kZVBvaW50IC0gNDggPCAxMCkge1xuXHRcdFx0cmV0dXJuIGNvZGVQb2ludCAtIDIyO1xuXHRcdH1cblx0XHRpZiAoY29kZVBvaW50IC0gNjUgPCAyNikge1xuXHRcdFx0cmV0dXJuIGNvZGVQb2ludCAtIDY1O1xuXHRcdH1cblx0XHRpZiAoY29kZVBvaW50IC0gOTcgPCAyNikge1xuXHRcdFx0cmV0dXJuIGNvZGVQb2ludCAtIDk3O1xuXHRcdH1cblx0XHRyZXR1cm4gYmFzZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDb252ZXJ0cyBhIGRpZ2l0L2ludGVnZXIgaW50byBhIGJhc2ljIGNvZGUgcG9pbnQuXG5cdCAqIEBzZWUgYGJhc2ljVG9EaWdpdCgpYFxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAcGFyYW0ge051bWJlcn0gZGlnaXQgVGhlIG51bWVyaWMgdmFsdWUgb2YgYSBiYXNpYyBjb2RlIHBvaW50LlxuXHQgKiBAcmV0dXJucyB7TnVtYmVyfSBUaGUgYmFzaWMgY29kZSBwb2ludCB3aG9zZSB2YWx1ZSAod2hlbiB1c2VkIGZvclxuXHQgKiByZXByZXNlbnRpbmcgaW50ZWdlcnMpIGlzIGBkaWdpdGAsIHdoaWNoIG5lZWRzIHRvIGJlIGluIHRoZSByYW5nZVxuXHQgKiBgMGAgdG8gYGJhc2UgLSAxYC4gSWYgYGZsYWdgIGlzIG5vbi16ZXJvLCB0aGUgdXBwZXJjYXNlIGZvcm0gaXNcblx0ICogdXNlZDsgZWxzZSwgdGhlIGxvd2VyY2FzZSBmb3JtIGlzIHVzZWQuIFRoZSBiZWhhdmlvciBpcyB1bmRlZmluZWRcblx0ICogaWYgYGZsYWdgIGlzIG5vbi16ZXJvIGFuZCBgZGlnaXRgIGhhcyBubyB1cHBlcmNhc2UgZm9ybS5cblx0ICovXG5cdGZ1bmN0aW9uIGRpZ2l0VG9CYXNpYyhkaWdpdCwgZmxhZykge1xuXHRcdC8vICAwLi4yNSBtYXAgdG8gQVNDSUkgYS4ueiBvciBBLi5aXG5cdFx0Ly8gMjYuLjM1IG1hcCB0byBBU0NJSSAwLi45XG5cdFx0cmV0dXJuIGRpZ2l0ICsgMjIgKyA3NSAqIChkaWdpdCA8IDI2KSAtICgoZmxhZyAhPSAwKSA8PCA1KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBCaWFzIGFkYXB0YXRpb24gZnVuY3Rpb24gYXMgcGVyIHNlY3Rpb24gMy40IG9mIFJGQyAzNDkyLlxuXHQgKiBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMzQ5MiNzZWN0aW9uLTMuNFxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cblx0ZnVuY3Rpb24gYWRhcHQoZGVsdGEsIG51bVBvaW50cywgZmlyc3RUaW1lKSB7XG5cdFx0dmFyIGsgPSAwO1xuXHRcdGRlbHRhID0gZmlyc3RUaW1lID8gZmxvb3IoZGVsdGEgLyBkYW1wKSA6IGRlbHRhID4+IDE7XG5cdFx0ZGVsdGEgKz0gZmxvb3IoZGVsdGEgLyBudW1Qb2ludHMpO1xuXHRcdGZvciAoLyogbm8gaW5pdGlhbGl6YXRpb24gKi87IGRlbHRhID4gYmFzZU1pbnVzVE1pbiAqIHRNYXggPj4gMTsgayArPSBiYXNlKSB7XG5cdFx0XHRkZWx0YSA9IGZsb29yKGRlbHRhIC8gYmFzZU1pbnVzVE1pbik7XG5cdFx0fVxuXHRcdHJldHVybiBmbG9vcihrICsgKGJhc2VNaW51c1RNaW4gKyAxKSAqIGRlbHRhIC8gKGRlbHRhICsgc2tldykpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENvbnZlcnRzIGEgUHVueWNvZGUgc3RyaW5nIG9mIEFTQ0lJLW9ubHkgc3ltYm9scyB0byBhIHN0cmluZyBvZiBVbmljb2RlXG5cdCAqIHN5bWJvbHMuXG5cdCAqIEBtZW1iZXJPZiBwdW55Y29kZVxuXHQgKiBAcGFyYW0ge1N0cmluZ30gaW5wdXQgVGhlIFB1bnljb2RlIHN0cmluZyBvZiBBU0NJSS1vbmx5IHN5bWJvbHMuXG5cdCAqIEByZXR1cm5zIHtTdHJpbmd9IFRoZSByZXN1bHRpbmcgc3RyaW5nIG9mIFVuaWNvZGUgc3ltYm9scy5cblx0ICovXG5cdGZ1bmN0aW9uIGRlY29kZShpbnB1dCkge1xuXHRcdC8vIERvbid0IHVzZSBVQ1MtMlxuXHRcdHZhciBvdXRwdXQgPSBbXSxcblx0XHQgICAgaW5wdXRMZW5ndGggPSBpbnB1dC5sZW5ndGgsXG5cdFx0ICAgIG91dCxcblx0XHQgICAgaSA9IDAsXG5cdFx0ICAgIG4gPSBpbml0aWFsTixcblx0XHQgICAgYmlhcyA9IGluaXRpYWxCaWFzLFxuXHRcdCAgICBiYXNpYyxcblx0XHQgICAgaixcblx0XHQgICAgaW5kZXgsXG5cdFx0ICAgIG9sZGksXG5cdFx0ICAgIHcsXG5cdFx0ICAgIGssXG5cdFx0ICAgIGRpZ2l0LFxuXHRcdCAgICB0LFxuXHRcdCAgICAvKiogQ2FjaGVkIGNhbGN1bGF0aW9uIHJlc3VsdHMgKi9cblx0XHQgICAgYmFzZU1pbnVzVDtcblxuXHRcdC8vIEhhbmRsZSB0aGUgYmFzaWMgY29kZSBwb2ludHM6IGxldCBgYmFzaWNgIGJlIHRoZSBudW1iZXIgb2YgaW5wdXQgY29kZVxuXHRcdC8vIHBvaW50cyBiZWZvcmUgdGhlIGxhc3QgZGVsaW1pdGVyLCBvciBgMGAgaWYgdGhlcmUgaXMgbm9uZSwgdGhlbiBjb3B5XG5cdFx0Ly8gdGhlIGZpcnN0IGJhc2ljIGNvZGUgcG9pbnRzIHRvIHRoZSBvdXRwdXQuXG5cblx0XHRiYXNpYyA9IGlucHV0Lmxhc3RJbmRleE9mKGRlbGltaXRlcik7XG5cdFx0aWYgKGJhc2ljIDwgMCkge1xuXHRcdFx0YmFzaWMgPSAwO1xuXHRcdH1cblxuXHRcdGZvciAoaiA9IDA7IGogPCBiYXNpYzsgKytqKSB7XG5cdFx0XHQvLyBpZiBpdCdzIG5vdCBhIGJhc2ljIGNvZGUgcG9pbnRcblx0XHRcdGlmIChpbnB1dC5jaGFyQ29kZUF0KGopID49IDB4ODApIHtcblx0XHRcdFx0ZXJyb3IoJ25vdC1iYXNpYycpO1xuXHRcdFx0fVxuXHRcdFx0b3V0cHV0LnB1c2goaW5wdXQuY2hhckNvZGVBdChqKSk7XG5cdFx0fVxuXG5cdFx0Ly8gTWFpbiBkZWNvZGluZyBsb29wOiBzdGFydCBqdXN0IGFmdGVyIHRoZSBsYXN0IGRlbGltaXRlciBpZiBhbnkgYmFzaWMgY29kZVxuXHRcdC8vIHBvaW50cyB3ZXJlIGNvcGllZDsgc3RhcnQgYXQgdGhlIGJlZ2lubmluZyBvdGhlcndpc2UuXG5cblx0XHRmb3IgKGluZGV4ID0gYmFzaWMgPiAwID8gYmFzaWMgKyAxIDogMDsgaW5kZXggPCBpbnB1dExlbmd0aDsgLyogbm8gZmluYWwgZXhwcmVzc2lvbiAqLykge1xuXG5cdFx0XHQvLyBgaW5kZXhgIGlzIHRoZSBpbmRleCBvZiB0aGUgbmV4dCBjaGFyYWN0ZXIgdG8gYmUgY29uc3VtZWQuXG5cdFx0XHQvLyBEZWNvZGUgYSBnZW5lcmFsaXplZCB2YXJpYWJsZS1sZW5ndGggaW50ZWdlciBpbnRvIGBkZWx0YWAsXG5cdFx0XHQvLyB3aGljaCBnZXRzIGFkZGVkIHRvIGBpYC4gVGhlIG92ZXJmbG93IGNoZWNraW5nIGlzIGVhc2llclxuXHRcdFx0Ly8gaWYgd2UgaW5jcmVhc2UgYGlgIGFzIHdlIGdvLCB0aGVuIHN1YnRyYWN0IG9mZiBpdHMgc3RhcnRpbmdcblx0XHRcdC8vIHZhbHVlIGF0IHRoZSBlbmQgdG8gb2J0YWluIGBkZWx0YWAuXG5cdFx0XHRmb3IgKG9sZGkgPSBpLCB3ID0gMSwgayA9IGJhc2U7IC8qIG5vIGNvbmRpdGlvbiAqLzsgayArPSBiYXNlKSB7XG5cblx0XHRcdFx0aWYgKGluZGV4ID49IGlucHV0TGVuZ3RoKSB7XG5cdFx0XHRcdFx0ZXJyb3IoJ2ludmFsaWQtaW5wdXQnKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGRpZ2l0ID0gYmFzaWNUb0RpZ2l0KGlucHV0LmNoYXJDb2RlQXQoaW5kZXgrKykpO1xuXG5cdFx0XHRcdGlmIChkaWdpdCA+PSBiYXNlIHx8IGRpZ2l0ID4gZmxvb3IoKG1heEludCAtIGkpIC8gdykpIHtcblx0XHRcdFx0XHRlcnJvcignb3ZlcmZsb3cnKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGkgKz0gZGlnaXQgKiB3O1xuXHRcdFx0XHR0ID0gayA8PSBiaWFzID8gdE1pbiA6IChrID49IGJpYXMgKyB0TWF4ID8gdE1heCA6IGsgLSBiaWFzKTtcblxuXHRcdFx0XHRpZiAoZGlnaXQgPCB0KSB7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRiYXNlTWludXNUID0gYmFzZSAtIHQ7XG5cdFx0XHRcdGlmICh3ID4gZmxvb3IobWF4SW50IC8gYmFzZU1pbnVzVCkpIHtcblx0XHRcdFx0XHRlcnJvcignb3ZlcmZsb3cnKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHcgKj0gYmFzZU1pbnVzVDtcblxuXHRcdFx0fVxuXG5cdFx0XHRvdXQgPSBvdXRwdXQubGVuZ3RoICsgMTtcblx0XHRcdGJpYXMgPSBhZGFwdChpIC0gb2xkaSwgb3V0LCBvbGRpID09IDApO1xuXG5cdFx0XHQvLyBgaWAgd2FzIHN1cHBvc2VkIHRvIHdyYXAgYXJvdW5kIGZyb20gYG91dGAgdG8gYDBgLFxuXHRcdFx0Ly8gaW5jcmVtZW50aW5nIGBuYCBlYWNoIHRpbWUsIHNvIHdlJ2xsIGZpeCB0aGF0IG5vdzpcblx0XHRcdGlmIChmbG9vcihpIC8gb3V0KSA+IG1heEludCAtIG4pIHtcblx0XHRcdFx0ZXJyb3IoJ292ZXJmbG93Jyk7XG5cdFx0XHR9XG5cblx0XHRcdG4gKz0gZmxvb3IoaSAvIG91dCk7XG5cdFx0XHRpICU9IG91dDtcblxuXHRcdFx0Ly8gSW5zZXJ0IGBuYCBhdCBwb3NpdGlvbiBgaWAgb2YgdGhlIG91dHB1dFxuXHRcdFx0b3V0cHV0LnNwbGljZShpKyssIDAsIG4pO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHVjczJlbmNvZGUob3V0cHV0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDb252ZXJ0cyBhIHN0cmluZyBvZiBVbmljb2RlIHN5bWJvbHMgKGUuZy4gYSBkb21haW4gbmFtZSBsYWJlbCkgdG8gYVxuXHQgKiBQdW55Y29kZSBzdHJpbmcgb2YgQVNDSUktb25seSBzeW1ib2xzLlxuXHQgKiBAbWVtYmVyT2YgcHVueWNvZGVcblx0ICogQHBhcmFtIHtTdHJpbmd9IGlucHV0IFRoZSBzdHJpbmcgb2YgVW5pY29kZSBzeW1ib2xzLlxuXHQgKiBAcmV0dXJucyB7U3RyaW5nfSBUaGUgcmVzdWx0aW5nIFB1bnljb2RlIHN0cmluZyBvZiBBU0NJSS1vbmx5IHN5bWJvbHMuXG5cdCAqL1xuXHRmdW5jdGlvbiBlbmNvZGUoaW5wdXQpIHtcblx0XHR2YXIgbixcblx0XHQgICAgZGVsdGEsXG5cdFx0ICAgIGhhbmRsZWRDUENvdW50LFxuXHRcdCAgICBiYXNpY0xlbmd0aCxcblx0XHQgICAgYmlhcyxcblx0XHQgICAgaixcblx0XHQgICAgbSxcblx0XHQgICAgcSxcblx0XHQgICAgayxcblx0XHQgICAgdCxcblx0XHQgICAgY3VycmVudFZhbHVlLFxuXHRcdCAgICBvdXRwdXQgPSBbXSxcblx0XHQgICAgLyoqIGBpbnB1dExlbmd0aGAgd2lsbCBob2xkIHRoZSBudW1iZXIgb2YgY29kZSBwb2ludHMgaW4gYGlucHV0YC4gKi9cblx0XHQgICAgaW5wdXRMZW5ndGgsXG5cdFx0ICAgIC8qKiBDYWNoZWQgY2FsY3VsYXRpb24gcmVzdWx0cyAqL1xuXHRcdCAgICBoYW5kbGVkQ1BDb3VudFBsdXNPbmUsXG5cdFx0ICAgIGJhc2VNaW51c1QsXG5cdFx0ICAgIHFNaW51c1Q7XG5cblx0XHQvLyBDb252ZXJ0IHRoZSBpbnB1dCBpbiBVQ1MtMiB0byBVbmljb2RlXG5cdFx0aW5wdXQgPSB1Y3MyZGVjb2RlKGlucHV0KTtcblxuXHRcdC8vIENhY2hlIHRoZSBsZW5ndGhcblx0XHRpbnB1dExlbmd0aCA9IGlucHV0Lmxlbmd0aDtcblxuXHRcdC8vIEluaXRpYWxpemUgdGhlIHN0YXRlXG5cdFx0biA9IGluaXRpYWxOO1xuXHRcdGRlbHRhID0gMDtcblx0XHRiaWFzID0gaW5pdGlhbEJpYXM7XG5cblx0XHQvLyBIYW5kbGUgdGhlIGJhc2ljIGNvZGUgcG9pbnRzXG5cdFx0Zm9yIChqID0gMDsgaiA8IGlucHV0TGVuZ3RoOyArK2opIHtcblx0XHRcdGN1cnJlbnRWYWx1ZSA9IGlucHV0W2pdO1xuXHRcdFx0aWYgKGN1cnJlbnRWYWx1ZSA8IDB4ODApIHtcblx0XHRcdFx0b3V0cHV0LnB1c2goc3RyaW5nRnJvbUNoYXJDb2RlKGN1cnJlbnRWYWx1ZSkpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGhhbmRsZWRDUENvdW50ID0gYmFzaWNMZW5ndGggPSBvdXRwdXQubGVuZ3RoO1xuXG5cdFx0Ly8gYGhhbmRsZWRDUENvdW50YCBpcyB0aGUgbnVtYmVyIG9mIGNvZGUgcG9pbnRzIHRoYXQgaGF2ZSBiZWVuIGhhbmRsZWQ7XG5cdFx0Ly8gYGJhc2ljTGVuZ3RoYCBpcyB0aGUgbnVtYmVyIG9mIGJhc2ljIGNvZGUgcG9pbnRzLlxuXG5cdFx0Ly8gRmluaXNoIHRoZSBiYXNpYyBzdHJpbmcgLSBpZiBpdCBpcyBub3QgZW1wdHkgLSB3aXRoIGEgZGVsaW1pdGVyXG5cdFx0aWYgKGJhc2ljTGVuZ3RoKSB7XG5cdFx0XHRvdXRwdXQucHVzaChkZWxpbWl0ZXIpO1xuXHRcdH1cblxuXHRcdC8vIE1haW4gZW5jb2RpbmcgbG9vcDpcblx0XHR3aGlsZSAoaGFuZGxlZENQQ291bnQgPCBpbnB1dExlbmd0aCkge1xuXG5cdFx0XHQvLyBBbGwgbm9uLWJhc2ljIGNvZGUgcG9pbnRzIDwgbiBoYXZlIGJlZW4gaGFuZGxlZCBhbHJlYWR5LiBGaW5kIHRoZSBuZXh0XG5cdFx0XHQvLyBsYXJnZXIgb25lOlxuXHRcdFx0Zm9yIChtID0gbWF4SW50LCBqID0gMDsgaiA8IGlucHV0TGVuZ3RoOyArK2opIHtcblx0XHRcdFx0Y3VycmVudFZhbHVlID0gaW5wdXRbal07XG5cdFx0XHRcdGlmIChjdXJyZW50VmFsdWUgPj0gbiAmJiBjdXJyZW50VmFsdWUgPCBtKSB7XG5cdFx0XHRcdFx0bSA9IGN1cnJlbnRWYWx1ZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyBJbmNyZWFzZSBgZGVsdGFgIGVub3VnaCB0byBhZHZhbmNlIHRoZSBkZWNvZGVyJ3MgPG4saT4gc3RhdGUgdG8gPG0sMD4sXG5cdFx0XHQvLyBidXQgZ3VhcmQgYWdhaW5zdCBvdmVyZmxvd1xuXHRcdFx0aGFuZGxlZENQQ291bnRQbHVzT25lID0gaGFuZGxlZENQQ291bnQgKyAxO1xuXHRcdFx0aWYgKG0gLSBuID4gZmxvb3IoKG1heEludCAtIGRlbHRhKSAvIGhhbmRsZWRDUENvdW50UGx1c09uZSkpIHtcblx0XHRcdFx0ZXJyb3IoJ292ZXJmbG93Jyk7XG5cdFx0XHR9XG5cblx0XHRcdGRlbHRhICs9IChtIC0gbikgKiBoYW5kbGVkQ1BDb3VudFBsdXNPbmU7XG5cdFx0XHRuID0gbTtcblxuXHRcdFx0Zm9yIChqID0gMDsgaiA8IGlucHV0TGVuZ3RoOyArK2opIHtcblx0XHRcdFx0Y3VycmVudFZhbHVlID0gaW5wdXRbal07XG5cblx0XHRcdFx0aWYgKGN1cnJlbnRWYWx1ZSA8IG4gJiYgKytkZWx0YSA+IG1heEludCkge1xuXHRcdFx0XHRcdGVycm9yKCdvdmVyZmxvdycpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKGN1cnJlbnRWYWx1ZSA9PSBuKSB7XG5cdFx0XHRcdFx0Ly8gUmVwcmVzZW50IGRlbHRhIGFzIGEgZ2VuZXJhbGl6ZWQgdmFyaWFibGUtbGVuZ3RoIGludGVnZXJcblx0XHRcdFx0XHRmb3IgKHEgPSBkZWx0YSwgayA9IGJhc2U7IC8qIG5vIGNvbmRpdGlvbiAqLzsgayArPSBiYXNlKSB7XG5cdFx0XHRcdFx0XHR0ID0gayA8PSBiaWFzID8gdE1pbiA6IChrID49IGJpYXMgKyB0TWF4ID8gdE1heCA6IGsgLSBiaWFzKTtcblx0XHRcdFx0XHRcdGlmIChxIDwgdCkge1xuXHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdHFNaW51c1QgPSBxIC0gdDtcblx0XHRcdFx0XHRcdGJhc2VNaW51c1QgPSBiYXNlIC0gdDtcblx0XHRcdFx0XHRcdG91dHB1dC5wdXNoKFxuXHRcdFx0XHRcdFx0XHRzdHJpbmdGcm9tQ2hhckNvZGUoZGlnaXRUb0Jhc2ljKHQgKyBxTWludXNUICUgYmFzZU1pbnVzVCwgMCkpXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0cSA9IGZsb29yKHFNaW51c1QgLyBiYXNlTWludXNUKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRvdXRwdXQucHVzaChzdHJpbmdGcm9tQ2hhckNvZGUoZGlnaXRUb0Jhc2ljKHEsIDApKSk7XG5cdFx0XHRcdFx0YmlhcyA9IGFkYXB0KGRlbHRhLCBoYW5kbGVkQ1BDb3VudFBsdXNPbmUsIGhhbmRsZWRDUENvdW50ID09IGJhc2ljTGVuZ3RoKTtcblx0XHRcdFx0XHRkZWx0YSA9IDA7XG5cdFx0XHRcdFx0KytoYW5kbGVkQ1BDb3VudDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQrK2RlbHRhO1xuXHRcdFx0KytuO1xuXG5cdFx0fVxuXHRcdHJldHVybiBvdXRwdXQuam9pbignJyk7XG5cdH1cblxuXHQvKipcblx0ICogQ29udmVydHMgYSBQdW55Y29kZSBzdHJpbmcgcmVwcmVzZW50aW5nIGEgZG9tYWluIG5hbWUgb3IgYW4gZW1haWwgYWRkcmVzc1xuXHQgKiB0byBVbmljb2RlLiBPbmx5IHRoZSBQdW55Y29kZWQgcGFydHMgb2YgdGhlIGlucHV0IHdpbGwgYmUgY29udmVydGVkLCBpLmUuXG5cdCAqIGl0IGRvZXNuJ3QgbWF0dGVyIGlmIHlvdSBjYWxsIGl0IG9uIGEgc3RyaW5nIHRoYXQgaGFzIGFscmVhZHkgYmVlblxuXHQgKiBjb252ZXJ0ZWQgdG8gVW5pY29kZS5cblx0ICogQG1lbWJlck9mIHB1bnljb2RlXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSBpbnB1dCBUaGUgUHVueWNvZGVkIGRvbWFpbiBuYW1lIG9yIGVtYWlsIGFkZHJlc3MgdG9cblx0ICogY29udmVydCB0byBVbmljb2RlLlxuXHQgKiBAcmV0dXJucyB7U3RyaW5nfSBUaGUgVW5pY29kZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgZ2l2ZW4gUHVueWNvZGVcblx0ICogc3RyaW5nLlxuXHQgKi9cblx0ZnVuY3Rpb24gdG9Vbmljb2RlKGlucHV0KSB7XG5cdFx0cmV0dXJuIG1hcERvbWFpbihpbnB1dCwgZnVuY3Rpb24oc3RyaW5nKSB7XG5cdFx0XHRyZXR1cm4gcmVnZXhQdW55Y29kZS50ZXN0KHN0cmluZylcblx0XHRcdFx0PyBkZWNvZGUoc3RyaW5nLnNsaWNlKDQpLnRvTG93ZXJDYXNlKCkpXG5cdFx0XHRcdDogc3RyaW5nO1xuXHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIENvbnZlcnRzIGEgVW5pY29kZSBzdHJpbmcgcmVwcmVzZW50aW5nIGEgZG9tYWluIG5hbWUgb3IgYW4gZW1haWwgYWRkcmVzcyB0b1xuXHQgKiBQdW55Y29kZS4gT25seSB0aGUgbm9uLUFTQ0lJIHBhcnRzIG9mIHRoZSBkb21haW4gbmFtZSB3aWxsIGJlIGNvbnZlcnRlZCxcblx0ICogaS5lLiBpdCBkb2Vzbid0IG1hdHRlciBpZiB5b3UgY2FsbCBpdCB3aXRoIGEgZG9tYWluIHRoYXQncyBhbHJlYWR5IGluXG5cdCAqIEFTQ0lJLlxuXHQgKiBAbWVtYmVyT2YgcHVueWNvZGVcblx0ICogQHBhcmFtIHtTdHJpbmd9IGlucHV0IFRoZSBkb21haW4gbmFtZSBvciBlbWFpbCBhZGRyZXNzIHRvIGNvbnZlcnQsIGFzIGFcblx0ICogVW5pY29kZSBzdHJpbmcuXG5cdCAqIEByZXR1cm5zIHtTdHJpbmd9IFRoZSBQdW55Y29kZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgZ2l2ZW4gZG9tYWluIG5hbWUgb3Jcblx0ICogZW1haWwgYWRkcmVzcy5cblx0ICovXG5cdGZ1bmN0aW9uIHRvQVNDSUkoaW5wdXQpIHtcblx0XHRyZXR1cm4gbWFwRG9tYWluKGlucHV0LCBmdW5jdGlvbihzdHJpbmcpIHtcblx0XHRcdHJldHVybiByZWdleE5vbkFTQ0lJLnRlc3Qoc3RyaW5nKVxuXHRcdFx0XHQ/ICd4bi0tJyArIGVuY29kZShzdHJpbmcpXG5cdFx0XHRcdDogc3RyaW5nO1xuXHRcdH0pO1xuXHR9XG5cblx0LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cblx0LyoqIERlZmluZSB0aGUgcHVibGljIEFQSSAqL1xuXHRwdW55Y29kZSA9IHtcblx0XHQvKipcblx0XHQgKiBBIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGN1cnJlbnQgUHVueWNvZGUuanMgdmVyc2lvbiBudW1iZXIuXG5cdFx0ICogQG1lbWJlck9mIHB1bnljb2RlXG5cdFx0ICogQHR5cGUgU3RyaW5nXG5cdFx0ICovXG5cdFx0J3ZlcnNpb24nOiAnMS40LjEnLFxuXHRcdC8qKlxuXHRcdCAqIEFuIG9iamVjdCBvZiBtZXRob2RzIHRvIGNvbnZlcnQgZnJvbSBKYXZhU2NyaXB0J3MgaW50ZXJuYWwgY2hhcmFjdGVyXG5cdFx0ICogcmVwcmVzZW50YXRpb24gKFVDUy0yKSB0byBVbmljb2RlIGNvZGUgcG9pbnRzLCBhbmQgYmFjay5cblx0XHQgKiBAc2VlIDxodHRwczovL21hdGhpYXNieW5lbnMuYmUvbm90ZXMvamF2YXNjcmlwdC1lbmNvZGluZz5cblx0XHQgKiBAbWVtYmVyT2YgcHVueWNvZGVcblx0XHQgKiBAdHlwZSBPYmplY3Rcblx0XHQgKi9cblx0XHQndWNzMic6IHtcblx0XHRcdCdkZWNvZGUnOiB1Y3MyZGVjb2RlLFxuXHRcdFx0J2VuY29kZSc6IHVjczJlbmNvZGVcblx0XHR9LFxuXHRcdCdkZWNvZGUnOiBkZWNvZGUsXG5cdFx0J2VuY29kZSc6IGVuY29kZSxcblx0XHQndG9BU0NJSSc6IHRvQVNDSUksXG5cdFx0J3RvVW5pY29kZSc6IHRvVW5pY29kZVxuXHR9O1xuXG5cdC8qKiBFeHBvc2UgYHB1bnljb2RlYCAqL1xuXHQvLyBTb21lIEFNRCBidWlsZCBvcHRpbWl6ZXJzLCBsaWtlIHIuanMsIGNoZWNrIGZvciBzcGVjaWZpYyBjb25kaXRpb24gcGF0dGVybnNcblx0Ly8gbGlrZSB0aGUgZm9sbG93aW5nOlxuXHRpZiAoXG5cdFx0dHlwZW9mIGRlZmluZSA9PSAnZnVuY3Rpb24nICYmXG5cdFx0dHlwZW9mIGRlZmluZS5hbWQgPT0gJ29iamVjdCcgJiZcblx0XHRkZWZpbmUuYW1kXG5cdCkge1xuXHRcdGRlZmluZSgncHVueWNvZGUnLCBmdW5jdGlvbigpIHtcblx0XHRcdHJldHVybiBwdW55Y29kZTtcblx0XHR9KTtcblx0fSBlbHNlIGlmIChmcmVlRXhwb3J0cyAmJiBmcmVlTW9kdWxlKSB7XG5cdFx0aWYgKG1vZHVsZS5leHBvcnRzID09IGZyZWVFeHBvcnRzKSB7XG5cdFx0XHQvLyBpbiBOb2RlLmpzLCBpby5qcywgb3IgUmluZ29KUyB2MC44LjArXG5cdFx0XHRmcmVlTW9kdWxlLmV4cG9ydHMgPSBwdW55Y29kZTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gaW4gTmFyd2hhbCBvciBSaW5nb0pTIHYwLjcuMC1cblx0XHRcdGZvciAoa2V5IGluIHB1bnljb2RlKSB7XG5cdFx0XHRcdHB1bnljb2RlLmhhc093blByb3BlcnR5KGtleSkgJiYgKGZyZWVFeHBvcnRzW2tleV0gPSBwdW55Y29kZVtrZXldKTtcblx0XHRcdH1cblx0XHR9XG5cdH0gZWxzZSB7XG5cdFx0Ly8gaW4gUmhpbm8gb3IgYSB3ZWIgYnJvd3NlclxuXHRcdHJvb3QucHVueWNvZGUgPSBwdW55Y29kZTtcblx0fVxuXG59KHRoaXMpKTtcbiIsIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG4ndXNlIHN0cmljdCc7XG5cbi8vIElmIG9iai5oYXNPd25Qcm9wZXJ0eSBoYXMgYmVlbiBvdmVycmlkZGVuLCB0aGVuIGNhbGxpbmdcbi8vIG9iai5oYXNPd25Qcm9wZXJ0eShwcm9wKSB3aWxsIGJyZWFrLlxuLy8gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vam95ZW50L25vZGUvaXNzdWVzLzE3MDdcbmZ1bmN0aW9uIGhhc093blByb3BlcnR5KG9iaiwgcHJvcCkge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcHJvcCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24ocXMsIHNlcCwgZXEsIG9wdGlvbnMpIHtcbiAgc2VwID0gc2VwIHx8ICcmJztcbiAgZXEgPSBlcSB8fCAnPSc7XG4gIHZhciBvYmogPSB7fTtcblxuICBpZiAodHlwZW9mIHFzICE9PSAnc3RyaW5nJyB8fCBxcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gb2JqO1xuICB9XG5cbiAgdmFyIHJlZ2V4cCA9IC9cXCsvZztcbiAgcXMgPSBxcy5zcGxpdChzZXApO1xuXG4gIHZhciBtYXhLZXlzID0gMTAwMDtcbiAgaWYgKG9wdGlvbnMgJiYgdHlwZW9mIG9wdGlvbnMubWF4S2V5cyA9PT0gJ251bWJlcicpIHtcbiAgICBtYXhLZXlzID0gb3B0aW9ucy5tYXhLZXlzO1xuICB9XG5cbiAgdmFyIGxlbiA9IHFzLmxlbmd0aDtcbiAgLy8gbWF4S2V5cyA8PSAwIG1lYW5zIHRoYXQgd2Ugc2hvdWxkIG5vdCBsaW1pdCBrZXlzIGNvdW50XG4gIGlmIChtYXhLZXlzID4gMCAmJiBsZW4gPiBtYXhLZXlzKSB7XG4gICAgbGVuID0gbWF4S2V5cztcbiAgfVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyArK2kpIHtcbiAgICB2YXIgeCA9IHFzW2ldLnJlcGxhY2UocmVnZXhwLCAnJTIwJyksXG4gICAgICAgIGlkeCA9IHguaW5kZXhPZihlcSksXG4gICAgICAgIGtzdHIsIHZzdHIsIGssIHY7XG5cbiAgICBpZiAoaWR4ID49IDApIHtcbiAgICAgIGtzdHIgPSB4LnN1YnN0cigwLCBpZHgpO1xuICAgICAgdnN0ciA9IHguc3Vic3RyKGlkeCArIDEpO1xuICAgIH0gZWxzZSB7XG4gICAgICBrc3RyID0geDtcbiAgICAgIHZzdHIgPSAnJztcbiAgICB9XG5cbiAgICBrID0gZGVjb2RlVVJJQ29tcG9uZW50KGtzdHIpO1xuICAgIHYgPSBkZWNvZGVVUklDb21wb25lbnQodnN0cik7XG5cbiAgICBpZiAoIWhhc093blByb3BlcnR5KG9iaiwgaykpIHtcbiAgICAgIG9ialtrXSA9IHY7XG4gICAgfSBlbHNlIGlmIChpc0FycmF5KG9ialtrXSkpIHtcbiAgICAgIG9ialtrXS5wdXNoKHYpO1xuICAgIH0gZWxzZSB7XG4gICAgICBvYmpba10gPSBbb2JqW2tdLCB2XTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gb2JqO1xufTtcblxudmFyIGlzQXJyYXkgPSBBcnJheS5pc0FycmF5IHx8IGZ1bmN0aW9uICh4cykge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHhzKSA9PT0gJ1tvYmplY3QgQXJyYXldJztcbn07XG4iLCIvLyBDb3B5cmlnaHQgSm95ZW50LCBJbmMuIGFuZCBvdGhlciBOb2RlIGNvbnRyaWJ1dG9ycy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYVxuLy8gY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuLy8gXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG4vLyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG4vLyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0XG4vLyBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGVcbi8vIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkXG4vLyBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTXG4vLyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOXG4vLyBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcbi8vIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUlxuLy8gT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRVxuLy8gVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgc3RyaW5naWZ5UHJpbWl0aXZlID0gZnVuY3Rpb24odikge1xuICBzd2l0Y2ggKHR5cGVvZiB2KSB7XG4gICAgY2FzZSAnc3RyaW5nJzpcbiAgICAgIHJldHVybiB2O1xuXG4gICAgY2FzZSAnYm9vbGVhbic6XG4gICAgICByZXR1cm4gdiA/ICd0cnVlJyA6ICdmYWxzZSc7XG5cbiAgICBjYXNlICdudW1iZXInOlxuICAgICAgcmV0dXJuIGlzRmluaXRlKHYpID8gdiA6ICcnO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiAnJztcbiAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihvYmosIHNlcCwgZXEsIG5hbWUpIHtcbiAgc2VwID0gc2VwIHx8ICcmJztcbiAgZXEgPSBlcSB8fCAnPSc7XG4gIGlmIChvYmogPT09IG51bGwpIHtcbiAgICBvYmogPSB1bmRlZmluZWQ7XG4gIH1cblxuICBpZiAodHlwZW9mIG9iaiA9PT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gbWFwKG9iamVjdEtleXMob2JqKSwgZnVuY3Rpb24oaykge1xuICAgICAgdmFyIGtzID0gZW5jb2RlVVJJQ29tcG9uZW50KHN0cmluZ2lmeVByaW1pdGl2ZShrKSkgKyBlcTtcbiAgICAgIGlmIChpc0FycmF5KG9ialtrXSkpIHtcbiAgICAgICAgcmV0dXJuIG1hcChvYmpba10sIGZ1bmN0aW9uKHYpIHtcbiAgICAgICAgICByZXR1cm4ga3MgKyBlbmNvZGVVUklDb21wb25lbnQoc3RyaW5naWZ5UHJpbWl0aXZlKHYpKTtcbiAgICAgICAgfSkuam9pbihzZXApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGtzICsgZW5jb2RlVVJJQ29tcG9uZW50KHN0cmluZ2lmeVByaW1pdGl2ZShvYmpba10pKTtcbiAgICAgIH1cbiAgICB9KS5qb2luKHNlcCk7XG5cbiAgfVxuXG4gIGlmICghbmFtZSkgcmV0dXJuICcnO1xuICByZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KHN0cmluZ2lmeVByaW1pdGl2ZShuYW1lKSkgKyBlcSArXG4gICAgICAgICBlbmNvZGVVUklDb21wb25lbnQoc3RyaW5naWZ5UHJpbWl0aXZlKG9iaikpO1xufTtcblxudmFyIGlzQXJyYXkgPSBBcnJheS5pc0FycmF5IHx8IGZ1bmN0aW9uICh4cykge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHhzKSA9PT0gJ1tvYmplY3QgQXJyYXldJztcbn07XG5cbmZ1bmN0aW9uIG1hcCAoeHMsIGYpIHtcbiAgaWYgKHhzLm1hcCkgcmV0dXJuIHhzLm1hcChmKTtcbiAgdmFyIHJlcyA9IFtdO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHhzLmxlbmd0aDsgaSsrKSB7XG4gICAgcmVzLnB1c2goZih4c1tpXSwgaSkpO1xuICB9XG4gIHJldHVybiByZXM7XG59XG5cbnZhciBvYmplY3RLZXlzID0gT2JqZWN0LmtleXMgfHwgZnVuY3Rpb24gKG9iaikge1xuICB2YXIgcmVzID0gW107XG4gIGZvciAodmFyIGtleSBpbiBvYmopIHtcbiAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5KSkgcmVzLnB1c2goa2V5KTtcbiAgfVxuICByZXR1cm4gcmVzO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5kZWNvZGUgPSBleHBvcnRzLnBhcnNlID0gcmVxdWlyZSgnLi9kZWNvZGUnKTtcbmV4cG9ydHMuZW5jb2RlID0gZXhwb3J0cy5zdHJpbmdpZnkgPSByZXF1aXJlKCcuL2VuY29kZScpO1xuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTQtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG52YXIgcnVudGltZSA9IChmdW5jdGlvbiAoZXhwb3J0cykge1xuICBcInVzZSBzdHJpY3RcIjtcblxuICB2YXIgT3AgPSBPYmplY3QucHJvdG90eXBlO1xuICB2YXIgaGFzT3duID0gT3AuaGFzT3duUHJvcGVydHk7XG4gIHZhciB1bmRlZmluZWQ7IC8vIE1vcmUgY29tcHJlc3NpYmxlIHRoYW4gdm9pZCAwLlxuICB2YXIgJFN5bWJvbCA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiA/IFN5bWJvbCA6IHt9O1xuICB2YXIgaXRlcmF0b3JTeW1ib2wgPSAkU3ltYm9sLml0ZXJhdG9yIHx8IFwiQEBpdGVyYXRvclwiO1xuICB2YXIgYXN5bmNJdGVyYXRvclN5bWJvbCA9ICRTeW1ib2wuYXN5bmNJdGVyYXRvciB8fCBcIkBAYXN5bmNJdGVyYXRvclwiO1xuICB2YXIgdG9TdHJpbmdUYWdTeW1ib2wgPSAkU3ltYm9sLnRvU3RyaW5nVGFnIHx8IFwiQEB0b1N0cmluZ1RhZ1wiO1xuXG4gIGZ1bmN0aW9uIGRlZmluZShvYmosIGtleSwgdmFsdWUpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHtcbiAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICB3cml0YWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIHJldHVybiBvYmpba2V5XTtcbiAgfVxuICB0cnkge1xuICAgIC8vIElFIDggaGFzIGEgYnJva2VuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSB0aGF0IG9ubHkgd29ya3Mgb24gRE9NIG9iamVjdHMuXG4gICAgZGVmaW5lKHt9LCBcIlwiKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgZGVmaW5lID0gZnVuY3Rpb24ob2JqLCBrZXksIHZhbHVlKSB7XG4gICAgICByZXR1cm4gb2JqW2tleV0gPSB2YWx1ZTtcbiAgICB9O1xuICB9XG5cbiAgZnVuY3Rpb24gd3JhcChpbm5lckZuLCBvdXRlckZuLCBzZWxmLCB0cnlMb2NzTGlzdCkge1xuICAgIC8vIElmIG91dGVyRm4gcHJvdmlkZWQgYW5kIG91dGVyRm4ucHJvdG90eXBlIGlzIGEgR2VuZXJhdG9yLCB0aGVuIG91dGVyRm4ucHJvdG90eXBlIGluc3RhbmNlb2YgR2VuZXJhdG9yLlxuICAgIHZhciBwcm90b0dlbmVyYXRvciA9IG91dGVyRm4gJiYgb3V0ZXJGbi5wcm90b3R5cGUgaW5zdGFuY2VvZiBHZW5lcmF0b3IgPyBvdXRlckZuIDogR2VuZXJhdG9yO1xuICAgIHZhciBnZW5lcmF0b3IgPSBPYmplY3QuY3JlYXRlKHByb3RvR2VuZXJhdG9yLnByb3RvdHlwZSk7XG4gICAgdmFyIGNvbnRleHQgPSBuZXcgQ29udGV4dCh0cnlMb2NzTGlzdCB8fCBbXSk7XG5cbiAgICAvLyBUaGUgLl9pbnZva2UgbWV0aG9kIHVuaWZpZXMgdGhlIGltcGxlbWVudGF0aW9ucyBvZiB0aGUgLm5leHQsXG4gICAgLy8gLnRocm93LCBhbmQgLnJldHVybiBtZXRob2RzLlxuICAgIGdlbmVyYXRvci5faW52b2tlID0gbWFrZUludm9rZU1ldGhvZChpbm5lckZuLCBzZWxmLCBjb250ZXh0KTtcblxuICAgIHJldHVybiBnZW5lcmF0b3I7XG4gIH1cbiAgZXhwb3J0cy53cmFwID0gd3JhcDtcblxuICAvLyBUcnkvY2F0Y2ggaGVscGVyIHRvIG1pbmltaXplIGRlb3B0aW1pemF0aW9ucy4gUmV0dXJucyBhIGNvbXBsZXRpb25cbiAgLy8gcmVjb3JkIGxpa2UgY29udGV4dC50cnlFbnRyaWVzW2ldLmNvbXBsZXRpb24uIFRoaXMgaW50ZXJmYWNlIGNvdWxkXG4gIC8vIGhhdmUgYmVlbiAoYW5kIHdhcyBwcmV2aW91c2x5KSBkZXNpZ25lZCB0byB0YWtlIGEgY2xvc3VyZSB0byBiZVxuICAvLyBpbnZva2VkIHdpdGhvdXQgYXJndW1lbnRzLCBidXQgaW4gYWxsIHRoZSBjYXNlcyB3ZSBjYXJlIGFib3V0IHdlXG4gIC8vIGFscmVhZHkgaGF2ZSBhbiBleGlzdGluZyBtZXRob2Qgd2Ugd2FudCB0byBjYWxsLCBzbyB0aGVyZSdzIG5vIG5lZWRcbiAgLy8gdG8gY3JlYXRlIGEgbmV3IGZ1bmN0aW9uIG9iamVjdC4gV2UgY2FuIGV2ZW4gZ2V0IGF3YXkgd2l0aCBhc3N1bWluZ1xuICAvLyB0aGUgbWV0aG9kIHRha2VzIGV4YWN0bHkgb25lIGFyZ3VtZW50LCBzaW5jZSB0aGF0IGhhcHBlbnMgdG8gYmUgdHJ1ZVxuICAvLyBpbiBldmVyeSBjYXNlLCBzbyB3ZSBkb24ndCBoYXZlIHRvIHRvdWNoIHRoZSBhcmd1bWVudHMgb2JqZWN0LiBUaGVcbiAgLy8gb25seSBhZGRpdGlvbmFsIGFsbG9jYXRpb24gcmVxdWlyZWQgaXMgdGhlIGNvbXBsZXRpb24gcmVjb3JkLCB3aGljaFxuICAvLyBoYXMgYSBzdGFibGUgc2hhcGUgYW5kIHNvIGhvcGVmdWxseSBzaG91bGQgYmUgY2hlYXAgdG8gYWxsb2NhdGUuXG4gIGZ1bmN0aW9uIHRyeUNhdGNoKGZuLCBvYmosIGFyZykge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4geyB0eXBlOiBcIm5vcm1hbFwiLCBhcmc6IGZuLmNhbGwob2JqLCBhcmcpIH07XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICByZXR1cm4geyB0eXBlOiBcInRocm93XCIsIGFyZzogZXJyIH07XG4gICAgfVxuICB9XG5cbiAgdmFyIEdlblN0YXRlU3VzcGVuZGVkU3RhcnQgPSBcInN1c3BlbmRlZFN0YXJ0XCI7XG4gIHZhciBHZW5TdGF0ZVN1c3BlbmRlZFlpZWxkID0gXCJzdXNwZW5kZWRZaWVsZFwiO1xuICB2YXIgR2VuU3RhdGVFeGVjdXRpbmcgPSBcImV4ZWN1dGluZ1wiO1xuICB2YXIgR2VuU3RhdGVDb21wbGV0ZWQgPSBcImNvbXBsZXRlZFwiO1xuXG4gIC8vIFJldHVybmluZyB0aGlzIG9iamVjdCBmcm9tIHRoZSBpbm5lckZuIGhhcyB0aGUgc2FtZSBlZmZlY3QgYXNcbiAgLy8gYnJlYWtpbmcgb3V0IG9mIHRoZSBkaXNwYXRjaCBzd2l0Y2ggc3RhdGVtZW50LlxuICB2YXIgQ29udGludWVTZW50aW5lbCA9IHt9O1xuXG4gIC8vIER1bW15IGNvbnN0cnVjdG9yIGZ1bmN0aW9ucyB0aGF0IHdlIHVzZSBhcyB0aGUgLmNvbnN0cnVjdG9yIGFuZFxuICAvLyAuY29uc3RydWN0b3IucHJvdG90eXBlIHByb3BlcnRpZXMgZm9yIGZ1bmN0aW9ucyB0aGF0IHJldHVybiBHZW5lcmF0b3JcbiAgLy8gb2JqZWN0cy4gRm9yIGZ1bGwgc3BlYyBjb21wbGlhbmNlLCB5b3UgbWF5IHdpc2ggdG8gY29uZmlndXJlIHlvdXJcbiAgLy8gbWluaWZpZXIgbm90IHRvIG1hbmdsZSB0aGUgbmFtZXMgb2YgdGhlc2UgdHdvIGZ1bmN0aW9ucy5cbiAgZnVuY3Rpb24gR2VuZXJhdG9yKCkge31cbiAgZnVuY3Rpb24gR2VuZXJhdG9yRnVuY3Rpb24oKSB7fVxuICBmdW5jdGlvbiBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSgpIHt9XG5cbiAgLy8gVGhpcyBpcyBhIHBvbHlmaWxsIGZvciAlSXRlcmF0b3JQcm90b3R5cGUlIGZvciBlbnZpcm9ubWVudHMgdGhhdFxuICAvLyBkb24ndCBuYXRpdmVseSBzdXBwb3J0IGl0LlxuICB2YXIgSXRlcmF0b3JQcm90b3R5cGUgPSB7fTtcbiAgZGVmaW5lKEl0ZXJhdG9yUHJvdG90eXBlLCBpdGVyYXRvclN5bWJvbCwgZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9KTtcblxuICB2YXIgZ2V0UHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Y7XG4gIHZhciBOYXRpdmVJdGVyYXRvclByb3RvdHlwZSA9IGdldFByb3RvICYmIGdldFByb3RvKGdldFByb3RvKHZhbHVlcyhbXSkpKTtcbiAgaWYgKE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlICYmXG4gICAgICBOYXRpdmVJdGVyYXRvclByb3RvdHlwZSAhPT0gT3AgJiZcbiAgICAgIGhhc093bi5jYWxsKE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlLCBpdGVyYXRvclN5bWJvbCkpIHtcbiAgICAvLyBUaGlzIGVudmlyb25tZW50IGhhcyBhIG5hdGl2ZSAlSXRlcmF0b3JQcm90b3R5cGUlOyB1c2UgaXQgaW5zdGVhZFxuICAgIC8vIG9mIHRoZSBwb2x5ZmlsbC5cbiAgICBJdGVyYXRvclByb3RvdHlwZSA9IE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlO1xuICB9XG5cbiAgdmFyIEdwID0gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUucHJvdG90eXBlID1cbiAgICBHZW5lcmF0b3IucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShJdGVyYXRvclByb3RvdHlwZSk7XG4gIEdlbmVyYXRvckZ1bmN0aW9uLnByb3RvdHlwZSA9IEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlO1xuICBkZWZpbmUoR3AsIFwiY29uc3RydWN0b3JcIiwgR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUpO1xuICBkZWZpbmUoR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUsIFwiY29uc3RydWN0b3JcIiwgR2VuZXJhdG9yRnVuY3Rpb24pO1xuICBHZW5lcmF0b3JGdW5jdGlvbi5kaXNwbGF5TmFtZSA9IGRlZmluZShcbiAgICBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSxcbiAgICB0b1N0cmluZ1RhZ1N5bWJvbCxcbiAgICBcIkdlbmVyYXRvckZ1bmN0aW9uXCJcbiAgKTtcblxuICAvLyBIZWxwZXIgZm9yIGRlZmluaW5nIHRoZSAubmV4dCwgLnRocm93LCBhbmQgLnJldHVybiBtZXRob2RzIG9mIHRoZVxuICAvLyBJdGVyYXRvciBpbnRlcmZhY2UgaW4gdGVybXMgb2YgYSBzaW5nbGUgLl9pbnZva2UgbWV0aG9kLlxuICBmdW5jdGlvbiBkZWZpbmVJdGVyYXRvck1ldGhvZHMocHJvdG90eXBlKSB7XG4gICAgW1wibmV4dFwiLCBcInRocm93XCIsIFwicmV0dXJuXCJdLmZvckVhY2goZnVuY3Rpb24obWV0aG9kKSB7XG4gICAgICBkZWZpbmUocHJvdG90eXBlLCBtZXRob2QsIGZ1bmN0aW9uKGFyZykge1xuICAgICAgICByZXR1cm4gdGhpcy5faW52b2tlKG1ldGhvZCwgYXJnKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgZXhwb3J0cy5pc0dlbmVyYXRvckZ1bmN0aW9uID0gZnVuY3Rpb24oZ2VuRnVuKSB7XG4gICAgdmFyIGN0b3IgPSB0eXBlb2YgZ2VuRnVuID09PSBcImZ1bmN0aW9uXCIgJiYgZ2VuRnVuLmNvbnN0cnVjdG9yO1xuICAgIHJldHVybiBjdG9yXG4gICAgICA/IGN0b3IgPT09IEdlbmVyYXRvckZ1bmN0aW9uIHx8XG4gICAgICAgIC8vIEZvciB0aGUgbmF0aXZlIEdlbmVyYXRvckZ1bmN0aW9uIGNvbnN0cnVjdG9yLCB0aGUgYmVzdCB3ZSBjYW5cbiAgICAgICAgLy8gZG8gaXMgdG8gY2hlY2sgaXRzIC5uYW1lIHByb3BlcnR5LlxuICAgICAgICAoY3Rvci5kaXNwbGF5TmFtZSB8fCBjdG9yLm5hbWUpID09PSBcIkdlbmVyYXRvckZ1bmN0aW9uXCJcbiAgICAgIDogZmFsc2U7XG4gIH07XG5cbiAgZXhwb3J0cy5tYXJrID0gZnVuY3Rpb24oZ2VuRnVuKSB7XG4gICAgaWYgKE9iamVjdC5zZXRQcm90b3R5cGVPZikge1xuICAgICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKGdlbkZ1biwgR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBnZW5GdW4uX19wcm90b19fID0gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGU7XG4gICAgICBkZWZpbmUoZ2VuRnVuLCB0b1N0cmluZ1RhZ1N5bWJvbCwgXCJHZW5lcmF0b3JGdW5jdGlvblwiKTtcbiAgICB9XG4gICAgZ2VuRnVuLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoR3ApO1xuICAgIHJldHVybiBnZW5GdW47XG4gIH07XG5cbiAgLy8gV2l0aGluIHRoZSBib2R5IG9mIGFueSBhc3luYyBmdW5jdGlvbiwgYGF3YWl0IHhgIGlzIHRyYW5zZm9ybWVkIHRvXG4gIC8vIGB5aWVsZCByZWdlbmVyYXRvclJ1bnRpbWUuYXdyYXAoeClgLCBzbyB0aGF0IHRoZSBydW50aW1lIGNhbiB0ZXN0XG4gIC8vIGBoYXNPd24uY2FsbCh2YWx1ZSwgXCJfX2F3YWl0XCIpYCB0byBkZXRlcm1pbmUgaWYgdGhlIHlpZWxkZWQgdmFsdWUgaXNcbiAgLy8gbWVhbnQgdG8gYmUgYXdhaXRlZC5cbiAgZXhwb3J0cy5hd3JhcCA9IGZ1bmN0aW9uKGFyZykge1xuICAgIHJldHVybiB7IF9fYXdhaXQ6IGFyZyB9O1xuICB9O1xuXG4gIGZ1bmN0aW9uIEFzeW5jSXRlcmF0b3IoZ2VuZXJhdG9yLCBQcm9taXNlSW1wbCkge1xuICAgIGZ1bmN0aW9uIGludm9rZShtZXRob2QsIGFyZywgcmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICB2YXIgcmVjb3JkID0gdHJ5Q2F0Y2goZ2VuZXJhdG9yW21ldGhvZF0sIGdlbmVyYXRvciwgYXJnKTtcbiAgICAgIGlmIChyZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgIHJlamVjdChyZWNvcmQuYXJnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciByZXN1bHQgPSByZWNvcmQuYXJnO1xuICAgICAgICB2YXIgdmFsdWUgPSByZXN1bHQudmFsdWU7XG4gICAgICAgIGlmICh2YWx1ZSAmJlxuICAgICAgICAgICAgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmXG4gICAgICAgICAgICBoYXNPd24uY2FsbCh2YWx1ZSwgXCJfX2F3YWl0XCIpKSB7XG4gICAgICAgICAgcmV0dXJuIFByb21pc2VJbXBsLnJlc29sdmUodmFsdWUuX19hd2FpdCkudGhlbihmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICAgICAgaW52b2tlKFwibmV4dFwiLCB2YWx1ZSwgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgICB9LCBmdW5jdGlvbihlcnIpIHtcbiAgICAgICAgICAgIGludm9rZShcInRocm93XCIsIGVyciwgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBQcm9taXNlSW1wbC5yZXNvbHZlKHZhbHVlKS50aGVuKGZ1bmN0aW9uKHVud3JhcHBlZCkge1xuICAgICAgICAgIC8vIFdoZW4gYSB5aWVsZGVkIFByb21pc2UgaXMgcmVzb2x2ZWQsIGl0cyBmaW5hbCB2YWx1ZSBiZWNvbWVzXG4gICAgICAgICAgLy8gdGhlIC52YWx1ZSBvZiB0aGUgUHJvbWlzZTx7dmFsdWUsZG9uZX0+IHJlc3VsdCBmb3IgdGhlXG4gICAgICAgICAgLy8gY3VycmVudCBpdGVyYXRpb24uXG4gICAgICAgICAgcmVzdWx0LnZhbHVlID0gdW53cmFwcGVkO1xuICAgICAgICAgIHJlc29sdmUocmVzdWx0KTtcbiAgICAgICAgfSwgZnVuY3Rpb24oZXJyb3IpIHtcbiAgICAgICAgICAvLyBJZiBhIHJlamVjdGVkIFByb21pc2Ugd2FzIHlpZWxkZWQsIHRocm93IHRoZSByZWplY3Rpb24gYmFja1xuICAgICAgICAgIC8vIGludG8gdGhlIGFzeW5jIGdlbmVyYXRvciBmdW5jdGlvbiBzbyBpdCBjYW4gYmUgaGFuZGxlZCB0aGVyZS5cbiAgICAgICAgICByZXR1cm4gaW52b2tlKFwidGhyb3dcIiwgZXJyb3IsIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBwcmV2aW91c1Byb21pc2U7XG5cbiAgICBmdW5jdGlvbiBlbnF1ZXVlKG1ldGhvZCwgYXJnKSB7XG4gICAgICBmdW5jdGlvbiBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZygpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlSW1wbChmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICBpbnZva2UobWV0aG9kLCBhcmcsIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcHJldmlvdXNQcm9taXNlID1cbiAgICAgICAgLy8gSWYgZW5xdWV1ZSBoYXMgYmVlbiBjYWxsZWQgYmVmb3JlLCB0aGVuIHdlIHdhbnQgdG8gd2FpdCB1bnRpbFxuICAgICAgICAvLyBhbGwgcHJldmlvdXMgUHJvbWlzZXMgaGF2ZSBiZWVuIHJlc29sdmVkIGJlZm9yZSBjYWxsaW5nIGludm9rZSxcbiAgICAgICAgLy8gc28gdGhhdCByZXN1bHRzIGFyZSBhbHdheXMgZGVsaXZlcmVkIGluIHRoZSBjb3JyZWN0IG9yZGVyLiBJZlxuICAgICAgICAvLyBlbnF1ZXVlIGhhcyBub3QgYmVlbiBjYWxsZWQgYmVmb3JlLCB0aGVuIGl0IGlzIGltcG9ydGFudCB0b1xuICAgICAgICAvLyBjYWxsIGludm9rZSBpbW1lZGlhdGVseSwgd2l0aG91dCB3YWl0aW5nIG9uIGEgY2FsbGJhY2sgdG8gZmlyZSxcbiAgICAgICAgLy8gc28gdGhhdCB0aGUgYXN5bmMgZ2VuZXJhdG9yIGZ1bmN0aW9uIGhhcyB0aGUgb3Bwb3J0dW5pdHkgdG8gZG9cbiAgICAgICAgLy8gYW55IG5lY2Vzc2FyeSBzZXR1cCBpbiBhIHByZWRpY3RhYmxlIHdheS4gVGhpcyBwcmVkaWN0YWJpbGl0eVxuICAgICAgICAvLyBpcyB3aHkgdGhlIFByb21pc2UgY29uc3RydWN0b3Igc3luY2hyb25vdXNseSBpbnZva2VzIGl0c1xuICAgICAgICAvLyBleGVjdXRvciBjYWxsYmFjaywgYW5kIHdoeSBhc3luYyBmdW5jdGlvbnMgc3luY2hyb25vdXNseVxuICAgICAgICAvLyBleGVjdXRlIGNvZGUgYmVmb3JlIHRoZSBmaXJzdCBhd2FpdC4gU2luY2Ugd2UgaW1wbGVtZW50IHNpbXBsZVxuICAgICAgICAvLyBhc3luYyBmdW5jdGlvbnMgaW4gdGVybXMgb2YgYXN5bmMgZ2VuZXJhdG9ycywgaXQgaXMgZXNwZWNpYWxseVxuICAgICAgICAvLyBpbXBvcnRhbnQgdG8gZ2V0IHRoaXMgcmlnaHQsIGV2ZW4gdGhvdWdoIGl0IHJlcXVpcmVzIGNhcmUuXG4gICAgICAgIHByZXZpb3VzUHJvbWlzZSA/IHByZXZpb3VzUHJvbWlzZS50aGVuKFxuICAgICAgICAgIGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnLFxuICAgICAgICAgIC8vIEF2b2lkIHByb3BhZ2F0aW5nIGZhaWx1cmVzIHRvIFByb21pc2VzIHJldHVybmVkIGJ5IGxhdGVyXG4gICAgICAgICAgLy8gaW52b2NhdGlvbnMgb2YgdGhlIGl0ZXJhdG9yLlxuICAgICAgICAgIGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnXG4gICAgICAgICkgOiBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZygpO1xuICAgIH1cblxuICAgIC8vIERlZmluZSB0aGUgdW5pZmllZCBoZWxwZXIgbWV0aG9kIHRoYXQgaXMgdXNlZCB0byBpbXBsZW1lbnQgLm5leHQsXG4gICAgLy8gLnRocm93LCBhbmQgLnJldHVybiAoc2VlIGRlZmluZUl0ZXJhdG9yTWV0aG9kcykuXG4gICAgdGhpcy5faW52b2tlID0gZW5xdWV1ZTtcbiAgfVxuXG4gIGRlZmluZUl0ZXJhdG9yTWV0aG9kcyhBc3luY0l0ZXJhdG9yLnByb3RvdHlwZSk7XG4gIGRlZmluZShBc3luY0l0ZXJhdG9yLnByb3RvdHlwZSwgYXN5bmNJdGVyYXRvclN5bWJvbCwgZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9KTtcbiAgZXhwb3J0cy5Bc3luY0l0ZXJhdG9yID0gQXN5bmNJdGVyYXRvcjtcblxuICAvLyBOb3RlIHRoYXQgc2ltcGxlIGFzeW5jIGZ1bmN0aW9ucyBhcmUgaW1wbGVtZW50ZWQgb24gdG9wIG9mXG4gIC8vIEFzeW5jSXRlcmF0b3Igb2JqZWN0czsgdGhleSBqdXN0IHJldHVybiBhIFByb21pc2UgZm9yIHRoZSB2YWx1ZSBvZlxuICAvLyB0aGUgZmluYWwgcmVzdWx0IHByb2R1Y2VkIGJ5IHRoZSBpdGVyYXRvci5cbiAgZXhwb3J0cy5hc3luYyA9IGZ1bmN0aW9uKGlubmVyRm4sIG91dGVyRm4sIHNlbGYsIHRyeUxvY3NMaXN0LCBQcm9taXNlSW1wbCkge1xuICAgIGlmIChQcm9taXNlSW1wbCA9PT0gdm9pZCAwKSBQcm9taXNlSW1wbCA9IFByb21pc2U7XG5cbiAgICB2YXIgaXRlciA9IG5ldyBBc3luY0l0ZXJhdG9yKFxuICAgICAgd3JhcChpbm5lckZuLCBvdXRlckZuLCBzZWxmLCB0cnlMb2NzTGlzdCksXG4gICAgICBQcm9taXNlSW1wbFxuICAgICk7XG5cbiAgICByZXR1cm4gZXhwb3J0cy5pc0dlbmVyYXRvckZ1bmN0aW9uKG91dGVyRm4pXG4gICAgICA/IGl0ZXIgLy8gSWYgb3V0ZXJGbiBpcyBhIGdlbmVyYXRvciwgcmV0dXJuIHRoZSBmdWxsIGl0ZXJhdG9yLlxuICAgICAgOiBpdGVyLm5leHQoKS50aGVuKGZ1bmN0aW9uKHJlc3VsdCkge1xuICAgICAgICAgIHJldHVybiByZXN1bHQuZG9uZSA/IHJlc3VsdC52YWx1ZSA6IGl0ZXIubmV4dCgpO1xuICAgICAgICB9KTtcbiAgfTtcblxuICBmdW5jdGlvbiBtYWtlSW52b2tlTWV0aG9kKGlubmVyRm4sIHNlbGYsIGNvbnRleHQpIHtcbiAgICB2YXIgc3RhdGUgPSBHZW5TdGF0ZVN1c3BlbmRlZFN0YXJ0O1xuXG4gICAgcmV0dXJuIGZ1bmN0aW9uIGludm9rZShtZXRob2QsIGFyZykge1xuICAgICAgaWYgKHN0YXRlID09PSBHZW5TdGF0ZUV4ZWN1dGluZykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBydW5uaW5nXCIpO1xuICAgICAgfVxuXG4gICAgICBpZiAoc3RhdGUgPT09IEdlblN0YXRlQ29tcGxldGVkKSB7XG4gICAgICAgIGlmIChtZXRob2QgPT09IFwidGhyb3dcIikge1xuICAgICAgICAgIHRocm93IGFyZztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEJlIGZvcmdpdmluZywgcGVyIDI1LjMuMy4zLjMgb2YgdGhlIHNwZWM6XG4gICAgICAgIC8vIGh0dHBzOi8vcGVvcGxlLm1vemlsbGEub3JnL35qb3JlbmRvcmZmL2VzNi1kcmFmdC5odG1sI3NlYy1nZW5lcmF0b3JyZXN1bWVcbiAgICAgICAgcmV0dXJuIGRvbmVSZXN1bHQoKTtcbiAgICAgIH1cblxuICAgICAgY29udGV4dC5tZXRob2QgPSBtZXRob2Q7XG4gICAgICBjb250ZXh0LmFyZyA9IGFyZztcblxuICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgdmFyIGRlbGVnYXRlID0gY29udGV4dC5kZWxlZ2F0ZTtcbiAgICAgICAgaWYgKGRlbGVnYXRlKSB7XG4gICAgICAgICAgdmFyIGRlbGVnYXRlUmVzdWx0ID0gbWF5YmVJbnZva2VEZWxlZ2F0ZShkZWxlZ2F0ZSwgY29udGV4dCk7XG4gICAgICAgICAgaWYgKGRlbGVnYXRlUmVzdWx0KSB7XG4gICAgICAgICAgICBpZiAoZGVsZWdhdGVSZXN1bHQgPT09IENvbnRpbnVlU2VudGluZWwpIGNvbnRpbnVlO1xuICAgICAgICAgICAgcmV0dXJuIGRlbGVnYXRlUmVzdWx0O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb250ZXh0Lm1ldGhvZCA9PT0gXCJuZXh0XCIpIHtcbiAgICAgICAgICAvLyBTZXR0aW5nIGNvbnRleHQuX3NlbnQgZm9yIGxlZ2FjeSBzdXBwb3J0IG9mIEJhYmVsJ3NcbiAgICAgICAgICAvLyBmdW5jdGlvbi5zZW50IGltcGxlbWVudGF0aW9uLlxuICAgICAgICAgIGNvbnRleHQuc2VudCA9IGNvbnRleHQuX3NlbnQgPSBjb250ZXh0LmFyZztcblxuICAgICAgICB9IGVsc2UgaWYgKGNvbnRleHQubWV0aG9kID09PSBcInRocm93XCIpIHtcbiAgICAgICAgICBpZiAoc3RhdGUgPT09IEdlblN0YXRlU3VzcGVuZGVkU3RhcnQpIHtcbiAgICAgICAgICAgIHN0YXRlID0gR2VuU3RhdGVDb21wbGV0ZWQ7XG4gICAgICAgICAgICB0aHJvdyBjb250ZXh0LmFyZztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb250ZXh0LmRpc3BhdGNoRXhjZXB0aW9uKGNvbnRleHQuYXJnKTtcblxuICAgICAgICB9IGVsc2UgaWYgKGNvbnRleHQubWV0aG9kID09PSBcInJldHVyblwiKSB7XG4gICAgICAgICAgY29udGV4dC5hYnJ1cHQoXCJyZXR1cm5cIiwgY29udGV4dC5hcmcpO1xuICAgICAgICB9XG5cbiAgICAgICAgc3RhdGUgPSBHZW5TdGF0ZUV4ZWN1dGluZztcblxuICAgICAgICB2YXIgcmVjb3JkID0gdHJ5Q2F0Y2goaW5uZXJGbiwgc2VsZiwgY29udGV4dCk7XG4gICAgICAgIGlmIChyZWNvcmQudHlwZSA9PT0gXCJub3JtYWxcIikge1xuICAgICAgICAgIC8vIElmIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24gZnJvbSBpbm5lckZuLCB3ZSBsZWF2ZSBzdGF0ZSA9PT1cbiAgICAgICAgICAvLyBHZW5TdGF0ZUV4ZWN1dGluZyBhbmQgbG9vcCBiYWNrIGZvciBhbm90aGVyIGludm9jYXRpb24uXG4gICAgICAgICAgc3RhdGUgPSBjb250ZXh0LmRvbmVcbiAgICAgICAgICAgID8gR2VuU3RhdGVDb21wbGV0ZWRcbiAgICAgICAgICAgIDogR2VuU3RhdGVTdXNwZW5kZWRZaWVsZDtcblxuICAgICAgICAgIGlmIChyZWNvcmQuYXJnID09PSBDb250aW51ZVNlbnRpbmVsKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdmFsdWU6IHJlY29yZC5hcmcsXG4gICAgICAgICAgICBkb25lOiBjb250ZXh0LmRvbmVcbiAgICAgICAgICB9O1xuXG4gICAgICAgIH0gZWxzZSBpZiAocmVjb3JkLnR5cGUgPT09IFwidGhyb3dcIikge1xuICAgICAgICAgIHN0YXRlID0gR2VuU3RhdGVDb21wbGV0ZWQ7XG4gICAgICAgICAgLy8gRGlzcGF0Y2ggdGhlIGV4Y2VwdGlvbiBieSBsb29waW5nIGJhY2sgYXJvdW5kIHRvIHRoZVxuICAgICAgICAgIC8vIGNvbnRleHQuZGlzcGF0Y2hFeGNlcHRpb24oY29udGV4dC5hcmcpIGNhbGwgYWJvdmUuXG4gICAgICAgICAgY29udGV4dC5tZXRob2QgPSBcInRocm93XCI7XG4gICAgICAgICAgY29udGV4dC5hcmcgPSByZWNvcmQuYXJnO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIC8vIENhbGwgZGVsZWdhdGUuaXRlcmF0b3JbY29udGV4dC5tZXRob2RdKGNvbnRleHQuYXJnKSBhbmQgaGFuZGxlIHRoZVxuICAvLyByZXN1bHQsIGVpdGhlciBieSByZXR1cm5pbmcgYSB7IHZhbHVlLCBkb25lIH0gcmVzdWx0IGZyb20gdGhlXG4gIC8vIGRlbGVnYXRlIGl0ZXJhdG9yLCBvciBieSBtb2RpZnlpbmcgY29udGV4dC5tZXRob2QgYW5kIGNvbnRleHQuYXJnLFxuICAvLyBzZXR0aW5nIGNvbnRleHQuZGVsZWdhdGUgdG8gbnVsbCwgYW5kIHJldHVybmluZyB0aGUgQ29udGludWVTZW50aW5lbC5cbiAgZnVuY3Rpb24gbWF5YmVJbnZva2VEZWxlZ2F0ZShkZWxlZ2F0ZSwgY29udGV4dCkge1xuICAgIHZhciBtZXRob2QgPSBkZWxlZ2F0ZS5pdGVyYXRvcltjb250ZXh0Lm1ldGhvZF07XG4gICAgaWYgKG1ldGhvZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBBIC50aHJvdyBvciAucmV0dXJuIHdoZW4gdGhlIGRlbGVnYXRlIGl0ZXJhdG9yIGhhcyBubyAudGhyb3dcbiAgICAgIC8vIG1ldGhvZCBhbHdheXMgdGVybWluYXRlcyB0aGUgeWllbGQqIGxvb3AuXG4gICAgICBjb250ZXh0LmRlbGVnYXRlID0gbnVsbDtcblxuICAgICAgaWYgKGNvbnRleHQubWV0aG9kID09PSBcInRocm93XCIpIHtcbiAgICAgICAgLy8gTm90ZTogW1wicmV0dXJuXCJdIG11c3QgYmUgdXNlZCBmb3IgRVMzIHBhcnNpbmcgY29tcGF0aWJpbGl0eS5cbiAgICAgICAgaWYgKGRlbGVnYXRlLml0ZXJhdG9yW1wicmV0dXJuXCJdKSB7XG4gICAgICAgICAgLy8gSWYgdGhlIGRlbGVnYXRlIGl0ZXJhdG9yIGhhcyBhIHJldHVybiBtZXRob2QsIGdpdmUgaXQgYVxuICAgICAgICAgIC8vIGNoYW5jZSB0byBjbGVhbiB1cC5cbiAgICAgICAgICBjb250ZXh0Lm1ldGhvZCA9IFwicmV0dXJuXCI7XG4gICAgICAgICAgY29udGV4dC5hcmcgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgbWF5YmVJbnZva2VEZWxlZ2F0ZShkZWxlZ2F0ZSwgY29udGV4dCk7XG5cbiAgICAgICAgICBpZiAoY29udGV4dC5tZXRob2QgPT09IFwidGhyb3dcIikge1xuICAgICAgICAgICAgLy8gSWYgbWF5YmVJbnZva2VEZWxlZ2F0ZShjb250ZXh0KSBjaGFuZ2VkIGNvbnRleHQubWV0aG9kIGZyb21cbiAgICAgICAgICAgIC8vIFwicmV0dXJuXCIgdG8gXCJ0aHJvd1wiLCBsZXQgdGhhdCBvdmVycmlkZSB0aGUgVHlwZUVycm9yIGJlbG93LlxuICAgICAgICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29udGV4dC5tZXRob2QgPSBcInRocm93XCI7XG4gICAgICAgIGNvbnRleHQuYXJnID0gbmV3IFR5cGVFcnJvcihcbiAgICAgICAgICBcIlRoZSBpdGVyYXRvciBkb2VzIG5vdCBwcm92aWRlIGEgJ3Rocm93JyBtZXRob2RcIik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICAgIH1cblxuICAgIHZhciByZWNvcmQgPSB0cnlDYXRjaChtZXRob2QsIGRlbGVnYXRlLml0ZXJhdG9yLCBjb250ZXh0LmFyZyk7XG5cbiAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwidGhyb3dcIikge1xuICAgICAgY29udGV4dC5tZXRob2QgPSBcInRocm93XCI7XG4gICAgICBjb250ZXh0LmFyZyA9IHJlY29yZC5hcmc7XG4gICAgICBjb250ZXh0LmRlbGVnYXRlID0gbnVsbDtcbiAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICAgIH1cblxuICAgIHZhciBpbmZvID0gcmVjb3JkLmFyZztcblxuICAgIGlmICghIGluZm8pIHtcbiAgICAgIGNvbnRleHQubWV0aG9kID0gXCJ0aHJvd1wiO1xuICAgICAgY29udGV4dC5hcmcgPSBuZXcgVHlwZUVycm9yKFwiaXRlcmF0b3IgcmVzdWx0IGlzIG5vdCBhbiBvYmplY3RcIik7XG4gICAgICBjb250ZXh0LmRlbGVnYXRlID0gbnVsbDtcbiAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICAgIH1cblxuICAgIGlmIChpbmZvLmRvbmUpIHtcbiAgICAgIC8vIEFzc2lnbiB0aGUgcmVzdWx0IG9mIHRoZSBmaW5pc2hlZCBkZWxlZ2F0ZSB0byB0aGUgdGVtcG9yYXJ5XG4gICAgICAvLyB2YXJpYWJsZSBzcGVjaWZpZWQgYnkgZGVsZWdhdGUucmVzdWx0TmFtZSAoc2VlIGRlbGVnYXRlWWllbGQpLlxuICAgICAgY29udGV4dFtkZWxlZ2F0ZS5yZXN1bHROYW1lXSA9IGluZm8udmFsdWU7XG5cbiAgICAgIC8vIFJlc3VtZSBleGVjdXRpb24gYXQgdGhlIGRlc2lyZWQgbG9jYXRpb24gKHNlZSBkZWxlZ2F0ZVlpZWxkKS5cbiAgICAgIGNvbnRleHQubmV4dCA9IGRlbGVnYXRlLm5leHRMb2M7XG5cbiAgICAgIC8vIElmIGNvbnRleHQubWV0aG9kIHdhcyBcInRocm93XCIgYnV0IHRoZSBkZWxlZ2F0ZSBoYW5kbGVkIHRoZVxuICAgICAgLy8gZXhjZXB0aW9uLCBsZXQgdGhlIG91dGVyIGdlbmVyYXRvciBwcm9jZWVkIG5vcm1hbGx5LiBJZlxuICAgICAgLy8gY29udGV4dC5tZXRob2Qgd2FzIFwibmV4dFwiLCBmb3JnZXQgY29udGV4dC5hcmcgc2luY2UgaXQgaGFzIGJlZW5cbiAgICAgIC8vIFwiY29uc3VtZWRcIiBieSB0aGUgZGVsZWdhdGUgaXRlcmF0b3IuIElmIGNvbnRleHQubWV0aG9kIHdhc1xuICAgICAgLy8gXCJyZXR1cm5cIiwgYWxsb3cgdGhlIG9yaWdpbmFsIC5yZXR1cm4gY2FsbCB0byBjb250aW51ZSBpbiB0aGVcbiAgICAgIC8vIG91dGVyIGdlbmVyYXRvci5cbiAgICAgIGlmIChjb250ZXh0Lm1ldGhvZCAhPT0gXCJyZXR1cm5cIikge1xuICAgICAgICBjb250ZXh0Lm1ldGhvZCA9IFwibmV4dFwiO1xuICAgICAgICBjb250ZXh0LmFyZyA9IHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBSZS15aWVsZCB0aGUgcmVzdWx0IHJldHVybmVkIGJ5IHRoZSBkZWxlZ2F0ZSBtZXRob2QuXG4gICAgICByZXR1cm4gaW5mbztcbiAgICB9XG5cbiAgICAvLyBUaGUgZGVsZWdhdGUgaXRlcmF0b3IgaXMgZmluaXNoZWQsIHNvIGZvcmdldCBpdCBhbmQgY29udGludWUgd2l0aFxuICAgIC8vIHRoZSBvdXRlciBnZW5lcmF0b3IuXG4gICAgY29udGV4dC5kZWxlZ2F0ZSA9IG51bGw7XG4gICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gIH1cblxuICAvLyBEZWZpbmUgR2VuZXJhdG9yLnByb3RvdHlwZS57bmV4dCx0aHJvdyxyZXR1cm59IGluIHRlcm1zIG9mIHRoZVxuICAvLyB1bmlmaWVkIC5faW52b2tlIGhlbHBlciBtZXRob2QuXG4gIGRlZmluZUl0ZXJhdG9yTWV0aG9kcyhHcCk7XG5cbiAgZGVmaW5lKEdwLCB0b1N0cmluZ1RhZ1N5bWJvbCwgXCJHZW5lcmF0b3JcIik7XG5cbiAgLy8gQSBHZW5lcmF0b3Igc2hvdWxkIGFsd2F5cyByZXR1cm4gaXRzZWxmIGFzIHRoZSBpdGVyYXRvciBvYmplY3Qgd2hlbiB0aGVcbiAgLy8gQEBpdGVyYXRvciBmdW5jdGlvbiBpcyBjYWxsZWQgb24gaXQuIFNvbWUgYnJvd3NlcnMnIGltcGxlbWVudGF0aW9ucyBvZiB0aGVcbiAgLy8gaXRlcmF0b3IgcHJvdG90eXBlIGNoYWluIGluY29ycmVjdGx5IGltcGxlbWVudCB0aGlzLCBjYXVzaW5nIHRoZSBHZW5lcmF0b3JcbiAgLy8gb2JqZWN0IHRvIG5vdCBiZSByZXR1cm5lZCBmcm9tIHRoaXMgY2FsbC4gVGhpcyBlbnN1cmVzIHRoYXQgZG9lc24ndCBoYXBwZW4uXG4gIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVnZW5lcmF0b3IvaXNzdWVzLzI3NCBmb3IgbW9yZSBkZXRhaWxzLlxuICBkZWZpbmUoR3AsIGl0ZXJhdG9yU3ltYm9sLCBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfSk7XG5cbiAgZGVmaW5lKEdwLCBcInRvU3RyaW5nXCIsIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBcIltvYmplY3QgR2VuZXJhdG9yXVwiO1xuICB9KTtcblxuICBmdW5jdGlvbiBwdXNoVHJ5RW50cnkobG9jcykge1xuICAgIHZhciBlbnRyeSA9IHsgdHJ5TG9jOiBsb2NzWzBdIH07XG5cbiAgICBpZiAoMSBpbiBsb2NzKSB7XG4gICAgICBlbnRyeS5jYXRjaExvYyA9IGxvY3NbMV07XG4gICAgfVxuXG4gICAgaWYgKDIgaW4gbG9jcykge1xuICAgICAgZW50cnkuZmluYWxseUxvYyA9IGxvY3NbMl07XG4gICAgICBlbnRyeS5hZnRlckxvYyA9IGxvY3NbM107XG4gICAgfVxuXG4gICAgdGhpcy50cnlFbnRyaWVzLnB1c2goZW50cnkpO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVzZXRUcnlFbnRyeShlbnRyeSkge1xuICAgIHZhciByZWNvcmQgPSBlbnRyeS5jb21wbGV0aW9uIHx8IHt9O1xuICAgIHJlY29yZC50eXBlID0gXCJub3JtYWxcIjtcbiAgICBkZWxldGUgcmVjb3JkLmFyZztcbiAgICBlbnRyeS5jb21wbGV0aW9uID0gcmVjb3JkO1xuICB9XG5cbiAgZnVuY3Rpb24gQ29udGV4dCh0cnlMb2NzTGlzdCkge1xuICAgIC8vIFRoZSByb290IGVudHJ5IG9iamVjdCAoZWZmZWN0aXZlbHkgYSB0cnkgc3RhdGVtZW50IHdpdGhvdXQgYSBjYXRjaFxuICAgIC8vIG9yIGEgZmluYWxseSBibG9jaykgZ2l2ZXMgdXMgYSBwbGFjZSB0byBzdG9yZSB2YWx1ZXMgdGhyb3duIGZyb21cbiAgICAvLyBsb2NhdGlvbnMgd2hlcmUgdGhlcmUgaXMgbm8gZW5jbG9zaW5nIHRyeSBzdGF0ZW1lbnQuXG4gICAgdGhpcy50cnlFbnRyaWVzID0gW3sgdHJ5TG9jOiBcInJvb3RcIiB9XTtcbiAgICB0cnlMb2NzTGlzdC5mb3JFYWNoKHB1c2hUcnlFbnRyeSwgdGhpcyk7XG4gICAgdGhpcy5yZXNldCh0cnVlKTtcbiAgfVxuXG4gIGV4cG9ydHMua2V5cyA9IGZ1bmN0aW9uKG9iamVjdCkge1xuICAgIHZhciBrZXlzID0gW107XG4gICAgZm9yICh2YXIga2V5IGluIG9iamVjdCkge1xuICAgICAga2V5cy5wdXNoKGtleSk7XG4gICAgfVxuICAgIGtleXMucmV2ZXJzZSgpO1xuXG4gICAgLy8gUmF0aGVyIHRoYW4gcmV0dXJuaW5nIGFuIG9iamVjdCB3aXRoIGEgbmV4dCBtZXRob2QsIHdlIGtlZXBcbiAgICAvLyB0aGluZ3Mgc2ltcGxlIGFuZCByZXR1cm4gdGhlIG5leHQgZnVuY3Rpb24gaXRzZWxmLlxuICAgIHJldHVybiBmdW5jdGlvbiBuZXh0KCkge1xuICAgICAgd2hpbGUgKGtleXMubGVuZ3RoKSB7XG4gICAgICAgIHZhciBrZXkgPSBrZXlzLnBvcCgpO1xuICAgICAgICBpZiAoa2V5IGluIG9iamVjdCkge1xuICAgICAgICAgIG5leHQudmFsdWUgPSBrZXk7XG4gICAgICAgICAgbmV4dC5kb25lID0gZmFsc2U7XG4gICAgICAgICAgcmV0dXJuIG5leHQ7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gVG8gYXZvaWQgY3JlYXRpbmcgYW4gYWRkaXRpb25hbCBvYmplY3QsIHdlIGp1c3QgaGFuZyB0aGUgLnZhbHVlXG4gICAgICAvLyBhbmQgLmRvbmUgcHJvcGVydGllcyBvZmYgdGhlIG5leHQgZnVuY3Rpb24gb2JqZWN0IGl0c2VsZi4gVGhpc1xuICAgICAgLy8gYWxzbyBlbnN1cmVzIHRoYXQgdGhlIG1pbmlmaWVyIHdpbGwgbm90IGFub255bWl6ZSB0aGUgZnVuY3Rpb24uXG4gICAgICBuZXh0LmRvbmUgPSB0cnVlO1xuICAgICAgcmV0dXJuIG5leHQ7XG4gICAgfTtcbiAgfTtcblxuICBmdW5jdGlvbiB2YWx1ZXMoaXRlcmFibGUpIHtcbiAgICBpZiAoaXRlcmFibGUpIHtcbiAgICAgIHZhciBpdGVyYXRvck1ldGhvZCA9IGl0ZXJhYmxlW2l0ZXJhdG9yU3ltYm9sXTtcbiAgICAgIGlmIChpdGVyYXRvck1ldGhvZCkge1xuICAgICAgICByZXR1cm4gaXRlcmF0b3JNZXRob2QuY2FsbChpdGVyYWJsZSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgaXRlcmFibGUubmV4dCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIHJldHVybiBpdGVyYWJsZTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFpc05hTihpdGVyYWJsZS5sZW5ndGgpKSB7XG4gICAgICAgIHZhciBpID0gLTEsIG5leHQgPSBmdW5jdGlvbiBuZXh0KCkge1xuICAgICAgICAgIHdoaWxlICgrK2kgPCBpdGVyYWJsZS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGlmIChoYXNPd24uY2FsbChpdGVyYWJsZSwgaSkpIHtcbiAgICAgICAgICAgICAgbmV4dC52YWx1ZSA9IGl0ZXJhYmxlW2ldO1xuICAgICAgICAgICAgICBuZXh0LmRvbmUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgcmV0dXJuIG5leHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgbmV4dC52YWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICBuZXh0LmRvbmUgPSB0cnVlO1xuXG4gICAgICAgICAgcmV0dXJuIG5leHQ7XG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIG5leHQubmV4dCA9IG5leHQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmV0dXJuIGFuIGl0ZXJhdG9yIHdpdGggbm8gdmFsdWVzLlxuICAgIHJldHVybiB7IG5leHQ6IGRvbmVSZXN1bHQgfTtcbiAgfVxuICBleHBvcnRzLnZhbHVlcyA9IHZhbHVlcztcblxuICBmdW5jdGlvbiBkb25lUmVzdWx0KCkge1xuICAgIHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfTtcbiAgfVxuXG4gIENvbnRleHQucHJvdG90eXBlID0ge1xuICAgIGNvbnN0cnVjdG9yOiBDb250ZXh0LFxuXG4gICAgcmVzZXQ6IGZ1bmN0aW9uKHNraXBUZW1wUmVzZXQpIHtcbiAgICAgIHRoaXMucHJldiA9IDA7XG4gICAgICB0aGlzLm5leHQgPSAwO1xuICAgICAgLy8gUmVzZXR0aW5nIGNvbnRleHQuX3NlbnQgZm9yIGxlZ2FjeSBzdXBwb3J0IG9mIEJhYmVsJ3NcbiAgICAgIC8vIGZ1bmN0aW9uLnNlbnQgaW1wbGVtZW50YXRpb24uXG4gICAgICB0aGlzLnNlbnQgPSB0aGlzLl9zZW50ID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5kb25lID0gZmFsc2U7XG4gICAgICB0aGlzLmRlbGVnYXRlID0gbnVsbDtcblxuICAgICAgdGhpcy5tZXRob2QgPSBcIm5leHRcIjtcbiAgICAgIHRoaXMuYXJnID0gdW5kZWZpbmVkO1xuXG4gICAgICB0aGlzLnRyeUVudHJpZXMuZm9yRWFjaChyZXNldFRyeUVudHJ5KTtcblxuICAgICAgaWYgKCFza2lwVGVtcFJlc2V0KSB7XG4gICAgICAgIGZvciAodmFyIG5hbWUgaW4gdGhpcykge1xuICAgICAgICAgIC8vIE5vdCBzdXJlIGFib3V0IHRoZSBvcHRpbWFsIG9yZGVyIG9mIHRoZXNlIGNvbmRpdGlvbnM6XG4gICAgICAgICAgaWYgKG5hbWUuY2hhckF0KDApID09PSBcInRcIiAmJlxuICAgICAgICAgICAgICBoYXNPd24uY2FsbCh0aGlzLCBuYW1lKSAmJlxuICAgICAgICAgICAgICAhaXNOYU4oK25hbWUuc2xpY2UoMSkpKSB7XG4gICAgICAgICAgICB0aGlzW25hbWVdID0gdW5kZWZpbmVkO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBzdG9wOiBmdW5jdGlvbigpIHtcbiAgICAgIHRoaXMuZG9uZSA9IHRydWU7XG5cbiAgICAgIHZhciByb290RW50cnkgPSB0aGlzLnRyeUVudHJpZXNbMF07XG4gICAgICB2YXIgcm9vdFJlY29yZCA9IHJvb3RFbnRyeS5jb21wbGV0aW9uO1xuICAgICAgaWYgKHJvb3RSZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgIHRocm93IHJvb3RSZWNvcmQuYXJnO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5ydmFsO1xuICAgIH0sXG5cbiAgICBkaXNwYXRjaEV4Y2VwdGlvbjogZnVuY3Rpb24oZXhjZXB0aW9uKSB7XG4gICAgICBpZiAodGhpcy5kb25lKSB7XG4gICAgICAgIHRocm93IGV4Y2VwdGlvbjtcbiAgICAgIH1cblxuICAgICAgdmFyIGNvbnRleHQgPSB0aGlzO1xuICAgICAgZnVuY3Rpb24gaGFuZGxlKGxvYywgY2F1Z2h0KSB7XG4gICAgICAgIHJlY29yZC50eXBlID0gXCJ0aHJvd1wiO1xuICAgICAgICByZWNvcmQuYXJnID0gZXhjZXB0aW9uO1xuICAgICAgICBjb250ZXh0Lm5leHQgPSBsb2M7XG5cbiAgICAgICAgaWYgKGNhdWdodCkge1xuICAgICAgICAgIC8vIElmIHRoZSBkaXNwYXRjaGVkIGV4Y2VwdGlvbiB3YXMgY2F1Z2h0IGJ5IGEgY2F0Y2ggYmxvY2ssXG4gICAgICAgICAgLy8gdGhlbiBsZXQgdGhhdCBjYXRjaCBibG9jayBoYW5kbGUgdGhlIGV4Y2VwdGlvbiBub3JtYWxseS5cbiAgICAgICAgICBjb250ZXh0Lm1ldGhvZCA9IFwibmV4dFwiO1xuICAgICAgICAgIGNvbnRleHQuYXJnID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuICEhIGNhdWdodDtcbiAgICAgIH1cblxuICAgICAgZm9yICh2YXIgaSA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICB2YXIgZW50cnkgPSB0aGlzLnRyeUVudHJpZXNbaV07XG4gICAgICAgIHZhciByZWNvcmQgPSBlbnRyeS5jb21wbGV0aW9uO1xuXG4gICAgICAgIGlmIChlbnRyeS50cnlMb2MgPT09IFwicm9vdFwiKSB7XG4gICAgICAgICAgLy8gRXhjZXB0aW9uIHRocm93biBvdXRzaWRlIG9mIGFueSB0cnkgYmxvY2sgdGhhdCBjb3VsZCBoYW5kbGVcbiAgICAgICAgICAvLyBpdCwgc28gc2V0IHRoZSBjb21wbGV0aW9uIHZhbHVlIG9mIHRoZSBlbnRpcmUgZnVuY3Rpb24gdG9cbiAgICAgICAgICAvLyB0aHJvdyB0aGUgZXhjZXB0aW9uLlxuICAgICAgICAgIHJldHVybiBoYW5kbGUoXCJlbmRcIik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZW50cnkudHJ5TG9jIDw9IHRoaXMucHJldikge1xuICAgICAgICAgIHZhciBoYXNDYXRjaCA9IGhhc093bi5jYWxsKGVudHJ5LCBcImNhdGNoTG9jXCIpO1xuICAgICAgICAgIHZhciBoYXNGaW5hbGx5ID0gaGFzT3duLmNhbGwoZW50cnksIFwiZmluYWxseUxvY1wiKTtcblxuICAgICAgICAgIGlmIChoYXNDYXRjaCAmJiBoYXNGaW5hbGx5KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wcmV2IDwgZW50cnkuY2F0Y2hMb2MpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZShlbnRyeS5jYXRjaExvYywgdHJ1ZSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMucHJldiA8IGVudHJ5LmZpbmFsbHlMb2MpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZShlbnRyeS5maW5hbGx5TG9jKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgIH0gZWxzZSBpZiAoaGFzQ2F0Y2gpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnByZXYgPCBlbnRyeS5jYXRjaExvYykge1xuICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlKGVudHJ5LmNhdGNoTG9jLCB0cnVlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgIH0gZWxzZSBpZiAoaGFzRmluYWxseSkge1xuICAgICAgICAgICAgaWYgKHRoaXMucHJldiA8IGVudHJ5LmZpbmFsbHlMb2MpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZShlbnRyeS5maW5hbGx5TG9jKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJ0cnkgc3RhdGVtZW50IHdpdGhvdXQgY2F0Y2ggb3IgZmluYWxseVwiKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgYWJydXB0OiBmdW5jdGlvbih0eXBlLCBhcmcpIHtcbiAgICAgIGZvciAodmFyIGkgPSB0aGlzLnRyeUVudHJpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgdmFyIGVudHJ5ID0gdGhpcy50cnlFbnRyaWVzW2ldO1xuICAgICAgICBpZiAoZW50cnkudHJ5TG9jIDw9IHRoaXMucHJldiAmJlxuICAgICAgICAgICAgaGFzT3duLmNhbGwoZW50cnksIFwiZmluYWxseUxvY1wiKSAmJlxuICAgICAgICAgICAgdGhpcy5wcmV2IDwgZW50cnkuZmluYWxseUxvYykge1xuICAgICAgICAgIHZhciBmaW5hbGx5RW50cnkgPSBlbnRyeTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoZmluYWxseUVudHJ5ICYmXG4gICAgICAgICAgKHR5cGUgPT09IFwiYnJlYWtcIiB8fFxuICAgICAgICAgICB0eXBlID09PSBcImNvbnRpbnVlXCIpICYmXG4gICAgICAgICAgZmluYWxseUVudHJ5LnRyeUxvYyA8PSBhcmcgJiZcbiAgICAgICAgICBhcmcgPD0gZmluYWxseUVudHJ5LmZpbmFsbHlMb2MpIHtcbiAgICAgICAgLy8gSWdub3JlIHRoZSBmaW5hbGx5IGVudHJ5IGlmIGNvbnRyb2wgaXMgbm90IGp1bXBpbmcgdG8gYVxuICAgICAgICAvLyBsb2NhdGlvbiBvdXRzaWRlIHRoZSB0cnkvY2F0Y2ggYmxvY2suXG4gICAgICAgIGZpbmFsbHlFbnRyeSA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIHZhciByZWNvcmQgPSBmaW5hbGx5RW50cnkgPyBmaW5hbGx5RW50cnkuY29tcGxldGlvbiA6IHt9O1xuICAgICAgcmVjb3JkLnR5cGUgPSB0eXBlO1xuICAgICAgcmVjb3JkLmFyZyA9IGFyZztcblxuICAgICAgaWYgKGZpbmFsbHlFbnRyeSkge1xuICAgICAgICB0aGlzLm1ldGhvZCA9IFwibmV4dFwiO1xuICAgICAgICB0aGlzLm5leHQgPSBmaW5hbGx5RW50cnkuZmluYWxseUxvYztcbiAgICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLmNvbXBsZXRlKHJlY29yZCk7XG4gICAgfSxcblxuICAgIGNvbXBsZXRlOiBmdW5jdGlvbihyZWNvcmQsIGFmdGVyTG9jKSB7XG4gICAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwidGhyb3dcIikge1xuICAgICAgICB0aHJvdyByZWNvcmQuYXJnO1xuICAgICAgfVxuXG4gICAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwiYnJlYWtcIiB8fFxuICAgICAgICAgIHJlY29yZC50eXBlID09PSBcImNvbnRpbnVlXCIpIHtcbiAgICAgICAgdGhpcy5uZXh0ID0gcmVjb3JkLmFyZztcbiAgICAgIH0gZWxzZSBpZiAocmVjb3JkLnR5cGUgPT09IFwicmV0dXJuXCIpIHtcbiAgICAgICAgdGhpcy5ydmFsID0gdGhpcy5hcmcgPSByZWNvcmQuYXJnO1xuICAgICAgICB0aGlzLm1ldGhvZCA9IFwicmV0dXJuXCI7XG4gICAgICAgIHRoaXMubmV4dCA9IFwiZW5kXCI7XG4gICAgICB9IGVsc2UgaWYgKHJlY29yZC50eXBlID09PSBcIm5vcm1hbFwiICYmIGFmdGVyTG9jKSB7XG4gICAgICAgIHRoaXMubmV4dCA9IGFmdGVyTG9jO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICB9LFxuXG4gICAgZmluaXNoOiBmdW5jdGlvbihmaW5hbGx5TG9jKSB7XG4gICAgICBmb3IgKHZhciBpID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgIHZhciBlbnRyeSA9IHRoaXMudHJ5RW50cmllc1tpXTtcbiAgICAgICAgaWYgKGVudHJ5LmZpbmFsbHlMb2MgPT09IGZpbmFsbHlMb2MpIHtcbiAgICAgICAgICB0aGlzLmNvbXBsZXRlKGVudHJ5LmNvbXBsZXRpb24sIGVudHJ5LmFmdGVyTG9jKTtcbiAgICAgICAgICByZXNldFRyeUVudHJ5KGVudHJ5KTtcbiAgICAgICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBcImNhdGNoXCI6IGZ1bmN0aW9uKHRyeUxvYykge1xuICAgICAgZm9yICh2YXIgaSA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICB2YXIgZW50cnkgPSB0aGlzLnRyeUVudHJpZXNbaV07XG4gICAgICAgIGlmIChlbnRyeS50cnlMb2MgPT09IHRyeUxvYykge1xuICAgICAgICAgIHZhciByZWNvcmQgPSBlbnRyeS5jb21wbGV0aW9uO1xuICAgICAgICAgIGlmIChyZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgICAgICB2YXIgdGhyb3duID0gcmVjb3JkLmFyZztcbiAgICAgICAgICAgIHJlc2V0VHJ5RW50cnkoZW50cnkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdGhyb3duO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFRoZSBjb250ZXh0LmNhdGNoIG1ldGhvZCBtdXN0IG9ubHkgYmUgY2FsbGVkIHdpdGggYSBsb2NhdGlvblxuICAgICAgLy8gYXJndW1lbnQgdGhhdCBjb3JyZXNwb25kcyB0byBhIGtub3duIGNhdGNoIGJsb2NrLlxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiaWxsZWdhbCBjYXRjaCBhdHRlbXB0XCIpO1xuICAgIH0sXG5cbiAgICBkZWxlZ2F0ZVlpZWxkOiBmdW5jdGlvbihpdGVyYWJsZSwgcmVzdWx0TmFtZSwgbmV4dExvYykge1xuICAgICAgdGhpcy5kZWxlZ2F0ZSA9IHtcbiAgICAgICAgaXRlcmF0b3I6IHZhbHVlcyhpdGVyYWJsZSksXG4gICAgICAgIHJlc3VsdE5hbWU6IHJlc3VsdE5hbWUsXG4gICAgICAgIG5leHRMb2M6IG5leHRMb2NcbiAgICAgIH07XG5cbiAgICAgIGlmICh0aGlzLm1ldGhvZCA9PT0gXCJuZXh0XCIpIHtcbiAgICAgICAgLy8gRGVsaWJlcmF0ZWx5IGZvcmdldCB0aGUgbGFzdCBzZW50IHZhbHVlIHNvIHRoYXQgd2UgZG9uJ3RcbiAgICAgICAgLy8gYWNjaWRlbnRhbGx5IHBhc3MgaXQgb24gdG8gdGhlIGRlbGVnYXRlLlxuICAgICAgICB0aGlzLmFyZyA9IHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgfVxuICB9O1xuXG4gIC8vIFJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGlzIHNjcmlwdCBpcyBleGVjdXRpbmcgYXMgYSBDb21tb25KUyBtb2R1bGVcbiAgLy8gb3Igbm90LCByZXR1cm4gdGhlIHJ1bnRpbWUgb2JqZWN0IHNvIHRoYXQgd2UgY2FuIGRlY2xhcmUgdGhlIHZhcmlhYmxlXG4gIC8vIHJlZ2VuZXJhdG9yUnVudGltZSBpbiB0aGUgb3V0ZXIgc2NvcGUsIHdoaWNoIGFsbG93cyB0aGlzIG1vZHVsZSB0byBiZVxuICAvLyBpbmplY3RlZCBlYXNpbHkgYnkgYGJpbi9yZWdlbmVyYXRvciAtLWluY2x1ZGUtcnVudGltZSBzY3JpcHQuanNgLlxuICByZXR1cm4gZXhwb3J0cztcblxufShcbiAgLy8gSWYgdGhpcyBzY3JpcHQgaXMgZXhlY3V0aW5nIGFzIGEgQ29tbW9uSlMgbW9kdWxlLCB1c2UgbW9kdWxlLmV4cG9ydHNcbiAgLy8gYXMgdGhlIHJlZ2VuZXJhdG9yUnVudGltZSBuYW1lc3BhY2UuIE90aGVyd2lzZSBjcmVhdGUgYSBuZXcgZW1wdHlcbiAgLy8gb2JqZWN0LiBFaXRoZXIgd2F5LCB0aGUgcmVzdWx0aW5nIG9iamVjdCB3aWxsIGJlIHVzZWQgdG8gaW5pdGlhbGl6ZVxuICAvLyB0aGUgcmVnZW5lcmF0b3JSdW50aW1lIHZhcmlhYmxlIGF0IHRoZSB0b3Agb2YgdGhpcyBmaWxlLlxuICB0eXBlb2YgbW9kdWxlID09PSBcIm9iamVjdFwiID8gbW9kdWxlLmV4cG9ydHMgOiB7fVxuKSk7XG5cbnRyeSB7XG4gIHJlZ2VuZXJhdG9yUnVudGltZSA9IHJ1bnRpbWU7XG59IGNhdGNoIChhY2NpZGVudGFsU3RyaWN0TW9kZSkge1xuICAvLyBUaGlzIG1vZHVsZSBzaG91bGQgbm90IGJlIHJ1bm5pbmcgaW4gc3RyaWN0IG1vZGUsIHNvIHRoZSBhYm92ZVxuICAvLyBhc3NpZ25tZW50IHNob3VsZCBhbHdheXMgd29yayB1bmxlc3Mgc29tZXRoaW5nIGlzIG1pc2NvbmZpZ3VyZWQuIEp1c3RcbiAgLy8gaW4gY2FzZSBydW50aW1lLmpzIGFjY2lkZW50YWxseSBydW5zIGluIHN0cmljdCBtb2RlLCBpbiBtb2Rlcm4gZW5naW5lc1xuICAvLyB3ZSBjYW4gZXhwbGljaXRseSBhY2Nlc3MgZ2xvYmFsVGhpcy4gSW4gb2xkZXIgZW5naW5lcyB3ZSBjYW4gZXNjYXBlXG4gIC8vIHN0cmljdCBtb2RlIHVzaW5nIGEgZ2xvYmFsIEZ1bmN0aW9uIGNhbGwuIFRoaXMgY291bGQgY29uY2VpdmFibHkgZmFpbFxuICAvLyBpZiBhIENvbnRlbnQgU2VjdXJpdHkgUG9saWN5IGZvcmJpZHMgdXNpbmcgRnVuY3Rpb24sIGJ1dCBpbiB0aGF0IGNhc2VcbiAgLy8gdGhlIHByb3BlciBzb2x1dGlvbiBpcyB0byBmaXggdGhlIGFjY2lkZW50YWwgc3RyaWN0IG1vZGUgcHJvYmxlbS4gSWZcbiAgLy8geW91J3ZlIG1pc2NvbmZpZ3VyZWQgeW91ciBidW5kbGVyIHRvIGZvcmNlIHN0cmljdCBtb2RlIGFuZCBhcHBsaWVkIGFcbiAgLy8gQ1NQIHRvIGZvcmJpZCBGdW5jdGlvbiwgYW5kIHlvdSdyZSBub3Qgd2lsbGluZyB0byBmaXggZWl0aGVyIG9mIHRob3NlXG4gIC8vIHByb2JsZW1zLCBwbGVhc2UgZGV0YWlsIHlvdXIgdW5pcXVlIHByZWRpY2FtZW50IGluIGEgR2l0SHViIGlzc3VlLlxuICBpZiAodHlwZW9mIGdsb2JhbFRoaXMgPT09IFwib2JqZWN0XCIpIHtcbiAgICBnbG9iYWxUaGlzLnJlZ2VuZXJhdG9yUnVudGltZSA9IHJ1bnRpbWU7XG4gIH0gZWxzZSB7XG4gICAgRnVuY3Rpb24oXCJyXCIsIFwicmVnZW5lcmF0b3JSdW50aW1lID0gclwiKShydW50aW1lKTtcbiAgfVxufVxuIiwiLyohIHNhZmUtYnVmZmVyLiBNSVQgTGljZW5zZS4gRmVyb3NzIEFib3VraGFkaWplaCA8aHR0cHM6Ly9mZXJvc3Mub3JnL29wZW5zb3VyY2U+ICovXG4vKiBlc2xpbnQtZGlzYWJsZSBub2RlL25vLWRlcHJlY2F0ZWQtYXBpICovXG52YXIgYnVmZmVyID0gcmVxdWlyZSgnYnVmZmVyJylcbnZhciBCdWZmZXIgPSBidWZmZXIuQnVmZmVyXG5cbi8vIGFsdGVybmF0aXZlIHRvIHVzaW5nIE9iamVjdC5rZXlzIGZvciBvbGQgYnJvd3NlcnNcbmZ1bmN0aW9uIGNvcHlQcm9wcyAoc3JjLCBkc3QpIHtcbiAgZm9yICh2YXIga2V5IGluIHNyYykge1xuICAgIGRzdFtrZXldID0gc3JjW2tleV1cbiAgfVxufVxuaWYgKEJ1ZmZlci5mcm9tICYmIEJ1ZmZlci5hbGxvYyAmJiBCdWZmZXIuYWxsb2NVbnNhZmUgJiYgQnVmZmVyLmFsbG9jVW5zYWZlU2xvdykge1xuICBtb2R1bGUuZXhwb3J0cyA9IGJ1ZmZlclxufSBlbHNlIHtcbiAgLy8gQ29weSBwcm9wZXJ0aWVzIGZyb20gcmVxdWlyZSgnYnVmZmVyJylcbiAgY29weVByb3BzKGJ1ZmZlciwgZXhwb3J0cylcbiAgZXhwb3J0cy5CdWZmZXIgPSBTYWZlQnVmZmVyXG59XG5cbmZ1bmN0aW9uIFNhZmVCdWZmZXIgKGFyZywgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBCdWZmZXIoYXJnLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpXG59XG5cblNhZmVCdWZmZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShCdWZmZXIucHJvdG90eXBlKVxuXG4vLyBDb3B5IHN0YXRpYyBtZXRob2RzIGZyb20gQnVmZmVyXG5jb3B5UHJvcHMoQnVmZmVyLCBTYWZlQnVmZmVyKVxuXG5TYWZlQnVmZmVyLmZyb20gPSBmdW5jdGlvbiAoYXJnLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpIHtcbiAgaWYgKHR5cGVvZiBhcmcgPT09ICdudW1iZXInKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnQgbXVzdCBub3QgYmUgYSBudW1iZXInKVxuICB9XG4gIHJldHVybiBCdWZmZXIoYXJnLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpXG59XG5cblNhZmVCdWZmZXIuYWxsb2MgPSBmdW5jdGlvbiAoc2l6ZSwgZmlsbCwgZW5jb2RpbmcpIHtcbiAgaWYgKHR5cGVvZiBzaXplICE9PSAnbnVtYmVyJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50IG11c3QgYmUgYSBudW1iZXInKVxuICB9XG4gIHZhciBidWYgPSBCdWZmZXIoc2l6ZSlcbiAgaWYgKGZpbGwgIT09IHVuZGVmaW5lZCkge1xuICAgIGlmICh0eXBlb2YgZW5jb2RpbmcgPT09ICdzdHJpbmcnKSB7XG4gICAgICBidWYuZmlsbChmaWxsLCBlbmNvZGluZylcbiAgICB9IGVsc2Uge1xuICAgICAgYnVmLmZpbGwoZmlsbClcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgYnVmLmZpbGwoMClcbiAgfVxuICByZXR1cm4gYnVmXG59XG5cblNhZmVCdWZmZXIuYWxsb2NVbnNhZmUgPSBmdW5jdGlvbiAoc2l6ZSkge1xuICBpZiAodHlwZW9mIHNpemUgIT09ICdudW1iZXInKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnQgbXVzdCBiZSBhIG51bWJlcicpXG4gIH1cbiAgcmV0dXJuIEJ1ZmZlcihzaXplKVxufVxuXG5TYWZlQnVmZmVyLmFsbG9jVW5zYWZlU2xvdyA9IGZ1bmN0aW9uIChzaXplKSB7XG4gIGlmICh0eXBlb2Ygc2l6ZSAhPT0gJ251bWJlcicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcmd1bWVudCBtdXN0IGJlIGEgbnVtYmVyJylcbiAgfVxuICByZXR1cm4gYnVmZmVyLlNsb3dCdWZmZXIoc2l6ZSlcbn1cbiIsInZhciBDbGllbnRSZXF1ZXN0ID0gcmVxdWlyZSgnLi9saWIvcmVxdWVzdCcpXG52YXIgcmVzcG9uc2UgPSByZXF1aXJlKCcuL2xpYi9yZXNwb25zZScpXG52YXIgZXh0ZW5kID0gcmVxdWlyZSgneHRlbmQnKVxudmFyIHN0YXR1c0NvZGVzID0gcmVxdWlyZSgnYnVpbHRpbi1zdGF0dXMtY29kZXMnKVxudmFyIHVybCA9IHJlcXVpcmUoJ3VybCcpXG5cbnZhciBodHRwID0gZXhwb3J0c1xuXG5odHRwLnJlcXVlc3QgPSBmdW5jdGlvbiAob3B0cywgY2IpIHtcblx0aWYgKHR5cGVvZiBvcHRzID09PSAnc3RyaW5nJylcblx0XHRvcHRzID0gdXJsLnBhcnNlKG9wdHMpXG5cdGVsc2Vcblx0XHRvcHRzID0gZXh0ZW5kKG9wdHMpXG5cblx0Ly8gTm9ybWFsbHksIHRoZSBwYWdlIGlzIGxvYWRlZCBmcm9tIGh0dHAgb3IgaHR0cHMsIHNvIG5vdCBzcGVjaWZ5aW5nIGEgcHJvdG9jb2xcblx0Ly8gd2lsbCByZXN1bHQgaW4gYSAodmFsaWQpIHByb3RvY29sLXJlbGF0aXZlIHVybC4gSG93ZXZlciwgdGhpcyB3b24ndCB3b3JrIGlmXG5cdC8vIHRoZSBwcm90b2NvbCBpcyBzb21ldGhpbmcgZWxzZSwgbGlrZSAnZmlsZTonXG5cdHZhciBkZWZhdWx0UHJvdG9jb2wgPSBnbG9iYWwubG9jYXRpb24ucHJvdG9jb2wuc2VhcmNoKC9eaHR0cHM/OiQvKSA9PT0gLTEgPyAnaHR0cDonIDogJydcblxuXHR2YXIgcHJvdG9jb2wgPSBvcHRzLnByb3RvY29sIHx8IGRlZmF1bHRQcm90b2NvbFxuXHR2YXIgaG9zdCA9IG9wdHMuaG9zdG5hbWUgfHwgb3B0cy5ob3N0XG5cdHZhciBwb3J0ID0gb3B0cy5wb3J0XG5cdHZhciBwYXRoID0gb3B0cy5wYXRoIHx8ICcvJ1xuXG5cdC8vIE5lY2Vzc2FyeSBmb3IgSVB2NiBhZGRyZXNzZXNcblx0aWYgKGhvc3QgJiYgaG9zdC5pbmRleE9mKCc6JykgIT09IC0xKVxuXHRcdGhvc3QgPSAnWycgKyBob3N0ICsgJ10nXG5cblx0Ly8gVGhpcyBtYXkgYmUgYSByZWxhdGl2ZSB1cmwuIFRoZSBicm93c2VyIHNob3VsZCBhbHdheXMgYmUgYWJsZSB0byBpbnRlcnByZXQgaXQgY29ycmVjdGx5LlxuXHRvcHRzLnVybCA9IChob3N0ID8gKHByb3RvY29sICsgJy8vJyArIGhvc3QpIDogJycpICsgKHBvcnQgPyAnOicgKyBwb3J0IDogJycpICsgcGF0aFxuXHRvcHRzLm1ldGhvZCA9IChvcHRzLm1ldGhvZCB8fCAnR0VUJykudG9VcHBlckNhc2UoKVxuXHRvcHRzLmhlYWRlcnMgPSBvcHRzLmhlYWRlcnMgfHwge31cblxuXHQvLyBBbHNvIHZhbGlkIG9wdHMuYXV0aCwgb3B0cy5tb2RlXG5cblx0dmFyIHJlcSA9IG5ldyBDbGllbnRSZXF1ZXN0KG9wdHMpXG5cdGlmIChjYilcblx0XHRyZXEub24oJ3Jlc3BvbnNlJywgY2IpXG5cdHJldHVybiByZXFcbn1cblxuaHR0cC5nZXQgPSBmdW5jdGlvbiBnZXQgKG9wdHMsIGNiKSB7XG5cdHZhciByZXEgPSBodHRwLnJlcXVlc3Qob3B0cywgY2IpXG5cdHJlcS5lbmQoKVxuXHRyZXR1cm4gcmVxXG59XG5cbmh0dHAuQ2xpZW50UmVxdWVzdCA9IENsaWVudFJlcXVlc3Rcbmh0dHAuSW5jb21pbmdNZXNzYWdlID0gcmVzcG9uc2UuSW5jb21pbmdNZXNzYWdlXG5cbmh0dHAuQWdlbnQgPSBmdW5jdGlvbiAoKSB7fVxuaHR0cC5BZ2VudC5kZWZhdWx0TWF4U29ja2V0cyA9IDRcblxuaHR0cC5nbG9iYWxBZ2VudCA9IG5ldyBodHRwLkFnZW50KClcblxuaHR0cC5TVEFUVVNfQ09ERVMgPSBzdGF0dXNDb2Rlc1xuXG5odHRwLk1FVEhPRFMgPSBbXG5cdCdDSEVDS09VVCcsXG5cdCdDT05ORUNUJyxcblx0J0NPUFknLFxuXHQnREVMRVRFJyxcblx0J0dFVCcsXG5cdCdIRUFEJyxcblx0J0xPQ0snLFxuXHQnTS1TRUFSQ0gnLFxuXHQnTUVSR0UnLFxuXHQnTUtBQ1RJVklUWScsXG5cdCdNS0NPTCcsXG5cdCdNT1ZFJyxcblx0J05PVElGWScsXG5cdCdPUFRJT05TJyxcblx0J1BBVENIJyxcblx0J1BPU1QnLFxuXHQnUFJPUEZJTkQnLFxuXHQnUFJPUFBBVENIJyxcblx0J1BVUkdFJyxcblx0J1BVVCcsXG5cdCdSRVBPUlQnLFxuXHQnU0VBUkNIJyxcblx0J1NVQlNDUklCRScsXG5cdCdUUkFDRScsXG5cdCdVTkxPQ0snLFxuXHQnVU5TVUJTQ1JJQkUnXG5dIiwiZXhwb3J0cy5mZXRjaCA9IGlzRnVuY3Rpb24oZ2xvYmFsLmZldGNoKSAmJiBpc0Z1bmN0aW9uKGdsb2JhbC5SZWFkYWJsZVN0cmVhbSlcblxuZXhwb3J0cy53cml0YWJsZVN0cmVhbSA9IGlzRnVuY3Rpb24oZ2xvYmFsLldyaXRhYmxlU3RyZWFtKVxuXG5leHBvcnRzLmFib3J0Q29udHJvbGxlciA9IGlzRnVuY3Rpb24oZ2xvYmFsLkFib3J0Q29udHJvbGxlcilcblxuLy8gVGhlIHhociByZXF1ZXN0IHRvIGV4YW1wbGUuY29tIG1heSB2aW9sYXRlIHNvbWUgcmVzdHJpY3RpdmUgQ1NQIGNvbmZpZ3VyYXRpb25zLFxuLy8gc28gaWYgd2UncmUgcnVubmluZyBpbiBhIGJyb3dzZXIgdGhhdCBzdXBwb3J0cyBgZmV0Y2hgLCBhdm9pZCBjYWxsaW5nIGdldFhIUigpXG4vLyBhbmQgYXNzdW1lIHN1cHBvcnQgZm9yIGNlcnRhaW4gZmVhdHVyZXMgYmVsb3cuXG52YXIgeGhyXG5mdW5jdGlvbiBnZXRYSFIgKCkge1xuXHQvLyBDYWNoZSB0aGUgeGhyIHZhbHVlXG5cdGlmICh4aHIgIT09IHVuZGVmaW5lZCkgcmV0dXJuIHhoclxuXG5cdGlmIChnbG9iYWwuWE1MSHR0cFJlcXVlc3QpIHtcblx0XHR4aHIgPSBuZXcgZ2xvYmFsLlhNTEh0dHBSZXF1ZXN0KClcblx0XHQvLyBJZiBYRG9tYWluUmVxdWVzdCBpcyBhdmFpbGFibGUgKGllIG9ubHksIHdoZXJlIHhociBtaWdodCBub3Qgd29ya1xuXHRcdC8vIGNyb3NzIGRvbWFpbiksIHVzZSB0aGUgcGFnZSBsb2NhdGlvbi4gT3RoZXJ3aXNlIHVzZSBleGFtcGxlLmNvbVxuXHRcdC8vIE5vdGU6IHRoaXMgZG9lc24ndCBhY3R1YWxseSBtYWtlIGFuIGh0dHAgcmVxdWVzdC5cblx0XHR0cnkge1xuXHRcdFx0eGhyLm9wZW4oJ0dFVCcsIGdsb2JhbC5YRG9tYWluUmVxdWVzdCA/ICcvJyA6ICdodHRwczovL2V4YW1wbGUuY29tJylcblx0XHR9IGNhdGNoKGUpIHtcblx0XHRcdHhociA9IG51bGxcblx0XHR9XG5cdH0gZWxzZSB7XG5cdFx0Ly8gU2VydmljZSB3b3JrZXJzIGRvbid0IGhhdmUgWEhSXG5cdFx0eGhyID0gbnVsbFxuXHR9XG5cdHJldHVybiB4aHJcbn1cblxuZnVuY3Rpb24gY2hlY2tUeXBlU3VwcG9ydCAodHlwZSkge1xuXHR2YXIgeGhyID0gZ2V0WEhSKClcblx0aWYgKCF4aHIpIHJldHVybiBmYWxzZVxuXHR0cnkge1xuXHRcdHhoci5yZXNwb25zZVR5cGUgPSB0eXBlXG5cdFx0cmV0dXJuIHhoci5yZXNwb25zZVR5cGUgPT09IHR5cGVcblx0fSBjYXRjaCAoZSkge31cblx0cmV0dXJuIGZhbHNlXG59XG5cbi8vIElmIGZldGNoIGlzIHN1cHBvcnRlZCwgdGhlbiBhcnJheWJ1ZmZlciB3aWxsIGJlIHN1cHBvcnRlZCB0b28uIFNraXAgY2FsbGluZ1xuLy8gY2hlY2tUeXBlU3VwcG9ydCgpLCBzaW5jZSB0aGF0IGNhbGxzIGdldFhIUigpLlxuZXhwb3J0cy5hcnJheWJ1ZmZlciA9IGV4cG9ydHMuZmV0Y2ggfHwgY2hlY2tUeXBlU3VwcG9ydCgnYXJyYXlidWZmZXInKVxuXG4vLyBUaGVzZSBuZXh0IHR3byB0ZXN0cyB1bmF2b2lkYWJseSBzaG93IHdhcm5pbmdzIGluIENocm9tZS4gU2luY2UgZmV0Y2ggd2lsbCBhbHdheXNcbi8vIGJlIHVzZWQgaWYgaXQncyBhdmFpbGFibGUsIGp1c3QgcmV0dXJuIGZhbHNlIGZvciB0aGVzZSB0byBhdm9pZCB0aGUgd2FybmluZ3MuXG5leHBvcnRzLm1zc3RyZWFtID0gIWV4cG9ydHMuZmV0Y2ggJiYgY2hlY2tUeXBlU3VwcG9ydCgnbXMtc3RyZWFtJylcbmV4cG9ydHMubW96Y2h1bmtlZGFycmF5YnVmZmVyID0gIWV4cG9ydHMuZmV0Y2ggJiYgY2hlY2tUeXBlU3VwcG9ydCgnbW96LWNodW5rZWQtYXJyYXlidWZmZXInKVxuXG4vLyBJZiBmZXRjaCBpcyBzdXBwb3J0ZWQsIHRoZW4gb3ZlcnJpZGVNaW1lVHlwZSB3aWxsIGJlIHN1cHBvcnRlZCB0b28uIFNraXAgY2FsbGluZ1xuLy8gZ2V0WEhSKCkuXG5leHBvcnRzLm92ZXJyaWRlTWltZVR5cGUgPSBleHBvcnRzLmZldGNoIHx8IChnZXRYSFIoKSA/IGlzRnVuY3Rpb24oZ2V0WEhSKCkub3ZlcnJpZGVNaW1lVHlwZSkgOiBmYWxzZSlcblxuZnVuY3Rpb24gaXNGdW5jdGlvbiAodmFsdWUpIHtcblx0cmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJ1xufVxuXG54aHIgPSBudWxsIC8vIEhlbHAgZ2NcbiIsInZhciBjYXBhYmlsaXR5ID0gcmVxdWlyZSgnLi9jYXBhYmlsaXR5JylcbnZhciBpbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJylcbnZhciByZXNwb25zZSA9IHJlcXVpcmUoJy4vcmVzcG9uc2UnKVxudmFyIHN0cmVhbSA9IHJlcXVpcmUoJ3JlYWRhYmxlLXN0cmVhbScpXG5cbnZhciBJbmNvbWluZ01lc3NhZ2UgPSByZXNwb25zZS5JbmNvbWluZ01lc3NhZ2VcbnZhciByU3RhdGVzID0gcmVzcG9uc2UucmVhZHlTdGF0ZXNcblxuZnVuY3Rpb24gZGVjaWRlTW9kZSAocHJlZmVyQmluYXJ5LCB1c2VGZXRjaCkge1xuXHRpZiAoY2FwYWJpbGl0eS5mZXRjaCAmJiB1c2VGZXRjaCkge1xuXHRcdHJldHVybiAnZmV0Y2gnXG5cdH0gZWxzZSBpZiAoY2FwYWJpbGl0eS5tb3pjaHVua2VkYXJyYXlidWZmZXIpIHtcblx0XHRyZXR1cm4gJ21vei1jaHVua2VkLWFycmF5YnVmZmVyJ1xuXHR9IGVsc2UgaWYgKGNhcGFiaWxpdHkubXNzdHJlYW0pIHtcblx0XHRyZXR1cm4gJ21zLXN0cmVhbSdcblx0fSBlbHNlIGlmIChjYXBhYmlsaXR5LmFycmF5YnVmZmVyICYmIHByZWZlckJpbmFyeSkge1xuXHRcdHJldHVybiAnYXJyYXlidWZmZXInXG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuICd0ZXh0J1xuXHR9XG59XG5cbnZhciBDbGllbnRSZXF1ZXN0ID0gbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob3B0cykge1xuXHR2YXIgc2VsZiA9IHRoaXNcblx0c3RyZWFtLldyaXRhYmxlLmNhbGwoc2VsZilcblxuXHRzZWxmLl9vcHRzID0gb3B0c1xuXHRzZWxmLl9ib2R5ID0gW11cblx0c2VsZi5faGVhZGVycyA9IHt9XG5cdGlmIChvcHRzLmF1dGgpXG5cdFx0c2VsZi5zZXRIZWFkZXIoJ0F1dGhvcml6YXRpb24nLCAnQmFzaWMgJyArIEJ1ZmZlci5mcm9tKG9wdHMuYXV0aCkudG9TdHJpbmcoJ2Jhc2U2NCcpKVxuXHRPYmplY3Qua2V5cyhvcHRzLmhlYWRlcnMpLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcblx0XHRzZWxmLnNldEhlYWRlcihuYW1lLCBvcHRzLmhlYWRlcnNbbmFtZV0pXG5cdH0pXG5cblx0dmFyIHByZWZlckJpbmFyeVxuXHR2YXIgdXNlRmV0Y2ggPSB0cnVlXG5cdGlmIChvcHRzLm1vZGUgPT09ICdkaXNhYmxlLWZldGNoJyB8fCAoJ3JlcXVlc3RUaW1lb3V0JyBpbiBvcHRzICYmICFjYXBhYmlsaXR5LmFib3J0Q29udHJvbGxlcikpIHtcblx0XHQvLyBJZiB0aGUgdXNlIG9mIFhIUiBzaG91bGQgYmUgcHJlZmVycmVkLiBOb3QgdHlwaWNhbGx5IG5lZWRlZC5cblx0XHR1c2VGZXRjaCA9IGZhbHNlXG5cdFx0cHJlZmVyQmluYXJ5ID0gdHJ1ZVxuXHR9IGVsc2UgaWYgKG9wdHMubW9kZSA9PT0gJ3ByZWZlci1zdHJlYW1pbmcnKSB7XG5cdFx0Ly8gSWYgc3RyZWFtaW5nIGlzIGEgaGlnaCBwcmlvcml0eSBidXQgYmluYXJ5IGNvbXBhdGliaWxpdHkgYW5kXG5cdFx0Ly8gdGhlIGFjY3VyYWN5IG9mIHRoZSAnY29udGVudC10eXBlJyBoZWFkZXIgYXJlbid0XG5cdFx0cHJlZmVyQmluYXJ5ID0gZmFsc2Vcblx0fSBlbHNlIGlmIChvcHRzLm1vZGUgPT09ICdhbGxvdy13cm9uZy1jb250ZW50LXR5cGUnKSB7XG5cdFx0Ly8gSWYgc3RyZWFtaW5nIGlzIG1vcmUgaW1wb3J0YW50IHRoYW4gcHJlc2VydmluZyB0aGUgJ2NvbnRlbnQtdHlwZScgaGVhZGVyXG5cdFx0cHJlZmVyQmluYXJ5ID0gIWNhcGFiaWxpdHkub3ZlcnJpZGVNaW1lVHlwZVxuXHR9IGVsc2UgaWYgKCFvcHRzLm1vZGUgfHwgb3B0cy5tb2RlID09PSAnZGVmYXVsdCcgfHwgb3B0cy5tb2RlID09PSAncHJlZmVyLWZhc3QnKSB7XG5cdFx0Ly8gVXNlIGJpbmFyeSBpZiB0ZXh0IHN0cmVhbWluZyBtYXkgY29ycnVwdCBkYXRhIG9yIHRoZSBjb250ZW50LXR5cGUgaGVhZGVyLCBvciBmb3Igc3BlZWRcblx0XHRwcmVmZXJCaW5hcnkgPSB0cnVlXG5cdH0gZWxzZSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHZhbHVlIGZvciBvcHRzLm1vZGUnKVxuXHR9XG5cdHNlbGYuX21vZGUgPSBkZWNpZGVNb2RlKHByZWZlckJpbmFyeSwgdXNlRmV0Y2gpXG5cdHNlbGYuX2ZldGNoVGltZXIgPSBudWxsXG5cdHNlbGYuX3NvY2tldFRpbWVvdXQgPSBudWxsXG5cdHNlbGYuX3NvY2tldFRpbWVyID0gbnVsbFxuXG5cdHNlbGYub24oJ2ZpbmlzaCcsIGZ1bmN0aW9uICgpIHtcblx0XHRzZWxmLl9vbkZpbmlzaCgpXG5cdH0pXG59XG5cbmluaGVyaXRzKENsaWVudFJlcXVlc3QsIHN0cmVhbS5Xcml0YWJsZSlcblxuQ2xpZW50UmVxdWVzdC5wcm90b3R5cGUuc2V0SGVhZGVyID0gZnVuY3Rpb24gKG5hbWUsIHZhbHVlKSB7XG5cdHZhciBzZWxmID0gdGhpc1xuXHR2YXIgbG93ZXJOYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpXG5cdC8vIFRoaXMgY2hlY2sgaXMgbm90IG5lY2Vzc2FyeSwgYnV0IGl0IHByZXZlbnRzIHdhcm5pbmdzIGZyb20gYnJvd3NlcnMgYWJvdXQgc2V0dGluZyB1bnNhZmVcblx0Ly8gaGVhZGVycy4gVG8gYmUgaG9uZXN0IEknbSBub3QgZW50aXJlbHkgc3VyZSBoaWRpbmcgdGhlc2Ugd2FybmluZ3MgaXMgYSBnb29kIHRoaW5nLCBidXRcblx0Ly8gaHR0cC1icm93c2VyaWZ5IGRpZCBpdCwgc28gSSB3aWxsIHRvby5cblx0aWYgKHVuc2FmZUhlYWRlcnMuaW5kZXhPZihsb3dlck5hbWUpICE9PSAtMSlcblx0XHRyZXR1cm5cblxuXHRzZWxmLl9oZWFkZXJzW2xvd2VyTmFtZV0gPSB7XG5cdFx0bmFtZTogbmFtZSxcblx0XHR2YWx1ZTogdmFsdWVcblx0fVxufVxuXG5DbGllbnRSZXF1ZXN0LnByb3RvdHlwZS5nZXRIZWFkZXIgPSBmdW5jdGlvbiAobmFtZSkge1xuXHR2YXIgaGVhZGVyID0gdGhpcy5faGVhZGVyc1tuYW1lLnRvTG93ZXJDYXNlKCldXG5cdGlmIChoZWFkZXIpXG5cdFx0cmV0dXJuIGhlYWRlci52YWx1ZVxuXHRyZXR1cm4gbnVsbFxufVxuXG5DbGllbnRSZXF1ZXN0LnByb3RvdHlwZS5yZW1vdmVIZWFkZXIgPSBmdW5jdGlvbiAobmFtZSkge1xuXHR2YXIgc2VsZiA9IHRoaXNcblx0ZGVsZXRlIHNlbGYuX2hlYWRlcnNbbmFtZS50b0xvd2VyQ2FzZSgpXVxufVxuXG5DbGllbnRSZXF1ZXN0LnByb3RvdHlwZS5fb25GaW5pc2ggPSBmdW5jdGlvbiAoKSB7XG5cdHZhciBzZWxmID0gdGhpc1xuXG5cdGlmIChzZWxmLl9kZXN0cm95ZWQpXG5cdFx0cmV0dXJuXG5cdHZhciBvcHRzID0gc2VsZi5fb3B0c1xuXG5cdGlmICgndGltZW91dCcgaW4gb3B0cyAmJiBvcHRzLnRpbWVvdXQgIT09IDApIHtcblx0XHRzZWxmLnNldFRpbWVvdXQob3B0cy50aW1lb3V0KVxuXHR9XG5cblx0dmFyIGhlYWRlcnNPYmogPSBzZWxmLl9oZWFkZXJzXG5cdHZhciBib2R5ID0gbnVsbFxuXHRpZiAob3B0cy5tZXRob2QgIT09ICdHRVQnICYmIG9wdHMubWV0aG9kICE9PSAnSEVBRCcpIHtcbiAgICAgICAgYm9keSA9IG5ldyBCbG9iKHNlbGYuX2JvZHksIHtcbiAgICAgICAgICAgIHR5cGU6IChoZWFkZXJzT2JqWydjb250ZW50LXR5cGUnXSB8fCB7fSkudmFsdWUgfHwgJydcbiAgICAgICAgfSk7XG4gICAgfVxuXG5cdC8vIGNyZWF0ZSBmbGF0dGVuZWQgbGlzdCBvZiBoZWFkZXJzXG5cdHZhciBoZWFkZXJzTGlzdCA9IFtdXG5cdE9iamVjdC5rZXlzKGhlYWRlcnNPYmopLmZvckVhY2goZnVuY3Rpb24gKGtleU5hbWUpIHtcblx0XHR2YXIgbmFtZSA9IGhlYWRlcnNPYmpba2V5TmFtZV0ubmFtZVxuXHRcdHZhciB2YWx1ZSA9IGhlYWRlcnNPYmpba2V5TmFtZV0udmFsdWVcblx0XHRpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcblx0XHRcdHZhbHVlLmZvckVhY2goZnVuY3Rpb24gKHYpIHtcblx0XHRcdFx0aGVhZGVyc0xpc3QucHVzaChbbmFtZSwgdl0pXG5cdFx0XHR9KVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRoZWFkZXJzTGlzdC5wdXNoKFtuYW1lLCB2YWx1ZV0pXG5cdFx0fVxuXHR9KVxuXG5cdGlmIChzZWxmLl9tb2RlID09PSAnZmV0Y2gnKSB7XG5cdFx0dmFyIHNpZ25hbCA9IG51bGxcblx0XHRpZiAoY2FwYWJpbGl0eS5hYm9ydENvbnRyb2xsZXIpIHtcblx0XHRcdHZhciBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpXG5cdFx0XHRzaWduYWwgPSBjb250cm9sbGVyLnNpZ25hbFxuXHRcdFx0c2VsZi5fZmV0Y2hBYm9ydENvbnRyb2xsZXIgPSBjb250cm9sbGVyXG5cblx0XHRcdGlmICgncmVxdWVzdFRpbWVvdXQnIGluIG9wdHMgJiYgb3B0cy5yZXF1ZXN0VGltZW91dCAhPT0gMCkge1xuXHRcdFx0XHRzZWxmLl9mZXRjaFRpbWVyID0gZ2xvYmFsLnNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdHNlbGYuZW1pdCgncmVxdWVzdFRpbWVvdXQnKVxuXHRcdFx0XHRcdGlmIChzZWxmLl9mZXRjaEFib3J0Q29udHJvbGxlcilcblx0XHRcdFx0XHRcdHNlbGYuX2ZldGNoQWJvcnRDb250cm9sbGVyLmFib3J0KClcblx0XHRcdFx0fSwgb3B0cy5yZXF1ZXN0VGltZW91dClcblx0XHRcdH1cblx0XHR9XG5cblx0XHRnbG9iYWwuZmV0Y2goc2VsZi5fb3B0cy51cmwsIHtcblx0XHRcdG1ldGhvZDogc2VsZi5fb3B0cy5tZXRob2QsXG5cdFx0XHRoZWFkZXJzOiBoZWFkZXJzTGlzdCxcblx0XHRcdGJvZHk6IGJvZHkgfHwgdW5kZWZpbmVkLFxuXHRcdFx0bW9kZTogJ2NvcnMnLFxuXHRcdFx0Y3JlZGVudGlhbHM6IG9wdHMud2l0aENyZWRlbnRpYWxzID8gJ2luY2x1ZGUnIDogJ3NhbWUtb3JpZ2luJyxcblx0XHRcdHNpZ25hbDogc2lnbmFsXG5cdFx0fSkudGhlbihmdW5jdGlvbiAocmVzcG9uc2UpIHtcblx0XHRcdHNlbGYuX2ZldGNoUmVzcG9uc2UgPSByZXNwb25zZVxuXHRcdFx0c2VsZi5fcmVzZXRUaW1lcnMoZmFsc2UpXG5cdFx0XHRzZWxmLl9jb25uZWN0KClcblx0XHR9LCBmdW5jdGlvbiAocmVhc29uKSB7XG5cdFx0XHRzZWxmLl9yZXNldFRpbWVycyh0cnVlKVxuXHRcdFx0aWYgKCFzZWxmLl9kZXN0cm95ZWQpXG5cdFx0XHRcdHNlbGYuZW1pdCgnZXJyb3InLCByZWFzb24pXG5cdFx0fSlcblx0fSBlbHNlIHtcblx0XHR2YXIgeGhyID0gc2VsZi5feGhyID0gbmV3IGdsb2JhbC5YTUxIdHRwUmVxdWVzdCgpXG5cdFx0dHJ5IHtcblx0XHRcdHhoci5vcGVuKHNlbGYuX29wdHMubWV0aG9kLCBzZWxmLl9vcHRzLnVybCwgdHJ1ZSlcblx0XHR9IGNhdGNoIChlcnIpIHtcblx0XHRcdHByb2Nlc3MubmV4dFRpY2soZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRzZWxmLmVtaXQoJ2Vycm9yJywgZXJyKVxuXHRcdFx0fSlcblx0XHRcdHJldHVyblxuXHRcdH1cblxuXHRcdC8vIENhbid0IHNldCByZXNwb25zZVR5cGUgb24gcmVhbGx5IG9sZCBicm93c2Vyc1xuXHRcdGlmICgncmVzcG9uc2VUeXBlJyBpbiB4aHIpXG5cdFx0XHR4aHIucmVzcG9uc2VUeXBlID0gc2VsZi5fbW9kZVxuXG5cdFx0aWYgKCd3aXRoQ3JlZGVudGlhbHMnIGluIHhocilcblx0XHRcdHhoci53aXRoQ3JlZGVudGlhbHMgPSAhIW9wdHMud2l0aENyZWRlbnRpYWxzXG5cblx0XHRpZiAoc2VsZi5fbW9kZSA9PT0gJ3RleHQnICYmICdvdmVycmlkZU1pbWVUeXBlJyBpbiB4aHIpXG5cdFx0XHR4aHIub3ZlcnJpZGVNaW1lVHlwZSgndGV4dC9wbGFpbjsgY2hhcnNldD14LXVzZXItZGVmaW5lZCcpXG5cblx0XHRpZiAoJ3JlcXVlc3RUaW1lb3V0JyBpbiBvcHRzKSB7XG5cdFx0XHR4aHIudGltZW91dCA9IG9wdHMucmVxdWVzdFRpbWVvdXRcblx0XHRcdHhoci5vbnRpbWVvdXQgPSBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdHNlbGYuZW1pdCgncmVxdWVzdFRpbWVvdXQnKVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGhlYWRlcnNMaXN0LmZvckVhY2goZnVuY3Rpb24gKGhlYWRlcikge1xuXHRcdFx0eGhyLnNldFJlcXVlc3RIZWFkZXIoaGVhZGVyWzBdLCBoZWFkZXJbMV0pXG5cdFx0fSlcblxuXHRcdHNlbGYuX3Jlc3BvbnNlID0gbnVsbFxuXHRcdHhoci5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbiAoKSB7XG5cdFx0XHRzd2l0Y2ggKHhoci5yZWFkeVN0YXRlKSB7XG5cdFx0XHRcdGNhc2UgclN0YXRlcy5MT0FESU5HOlxuXHRcdFx0XHRjYXNlIHJTdGF0ZXMuRE9ORTpcblx0XHRcdFx0XHRzZWxmLl9vblhIUlByb2dyZXNzKClcblx0XHRcdFx0XHRicmVha1xuXHRcdFx0fVxuXHRcdH1cblx0XHQvLyBOZWNlc3NhcnkgZm9yIHN0cmVhbWluZyBpbiBGaXJlZm94LCBzaW5jZSB4aHIucmVzcG9uc2UgaXMgT05MWSBkZWZpbmVkXG5cdFx0Ly8gaW4gb25wcm9ncmVzcywgbm90IGluIG9ucmVhZHlzdGF0ZWNoYW5nZSB3aXRoIHhoci5yZWFkeVN0YXRlID0gM1xuXHRcdGlmIChzZWxmLl9tb2RlID09PSAnbW96LWNodW5rZWQtYXJyYXlidWZmZXInKSB7XG5cdFx0XHR4aHIub25wcm9ncmVzcyA9IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0c2VsZi5fb25YSFJQcm9ncmVzcygpXG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0eGhyLm9uZXJyb3IgPSBmdW5jdGlvbiAoKSB7XG5cdFx0XHRpZiAoc2VsZi5fZGVzdHJveWVkKVxuXHRcdFx0XHRyZXR1cm5cblx0XHRcdHNlbGYuX3Jlc2V0VGltZXJzKHRydWUpXG5cdFx0XHRzZWxmLmVtaXQoJ2Vycm9yJywgbmV3IEVycm9yKCdYSFIgZXJyb3InKSlcblx0XHR9XG5cblx0XHR0cnkge1xuXHRcdFx0eGhyLnNlbmQoYm9keSlcblx0XHR9IGNhdGNoIChlcnIpIHtcblx0XHRcdHByb2Nlc3MubmV4dFRpY2soZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRzZWxmLmVtaXQoJ2Vycm9yJywgZXJyKVxuXHRcdFx0fSlcblx0XHRcdHJldHVyblxuXHRcdH1cblx0fVxufVxuXG4vKipcbiAqIENoZWNrcyBpZiB4aHIuc3RhdHVzIGlzIHJlYWRhYmxlIGFuZCBub24temVybywgaW5kaWNhdGluZyBubyBlcnJvci5cbiAqIEV2ZW4gdGhvdWdoIHRoZSBzcGVjIHNheXMgaXQgc2hvdWxkIGJlIGF2YWlsYWJsZSBpbiByZWFkeVN0YXRlIDMsXG4gKiBhY2Nlc3NpbmcgaXQgdGhyb3dzIGFuIGV4Y2VwdGlvbiBpbiBJRThcbiAqL1xuZnVuY3Rpb24gc3RhdHVzVmFsaWQgKHhocikge1xuXHR0cnkge1xuXHRcdHZhciBzdGF0dXMgPSB4aHIuc3RhdHVzXG5cdFx0cmV0dXJuIChzdGF0dXMgIT09IG51bGwgJiYgc3RhdHVzICE9PSAwKVxuXHR9IGNhdGNoIChlKSB7XG5cdFx0cmV0dXJuIGZhbHNlXG5cdH1cbn1cblxuQ2xpZW50UmVxdWVzdC5wcm90b3R5cGUuX29uWEhSUHJvZ3Jlc3MgPSBmdW5jdGlvbiAoKSB7XG5cdHZhciBzZWxmID0gdGhpc1xuXG5cdHNlbGYuX3Jlc2V0VGltZXJzKGZhbHNlKVxuXG5cdGlmICghc3RhdHVzVmFsaWQoc2VsZi5feGhyKSB8fCBzZWxmLl9kZXN0cm95ZWQpXG5cdFx0cmV0dXJuXG5cblx0aWYgKCFzZWxmLl9yZXNwb25zZSlcblx0XHRzZWxmLl9jb25uZWN0KClcblxuXHRzZWxmLl9yZXNwb25zZS5fb25YSFJQcm9ncmVzcyhzZWxmLl9yZXNldFRpbWVycy5iaW5kKHNlbGYpKVxufVxuXG5DbGllbnRSZXF1ZXN0LnByb3RvdHlwZS5fY29ubmVjdCA9IGZ1bmN0aW9uICgpIHtcblx0dmFyIHNlbGYgPSB0aGlzXG5cblx0aWYgKHNlbGYuX2Rlc3Ryb3llZClcblx0XHRyZXR1cm5cblxuXHRzZWxmLl9yZXNwb25zZSA9IG5ldyBJbmNvbWluZ01lc3NhZ2Uoc2VsZi5feGhyLCBzZWxmLl9mZXRjaFJlc3BvbnNlLCBzZWxmLl9tb2RlLCBzZWxmLl9yZXNldFRpbWVycy5iaW5kKHNlbGYpKVxuXHRzZWxmLl9yZXNwb25zZS5vbignZXJyb3InLCBmdW5jdGlvbihlcnIpIHtcblx0XHRzZWxmLmVtaXQoJ2Vycm9yJywgZXJyKVxuXHR9KVxuXG5cdHNlbGYuZW1pdCgncmVzcG9uc2UnLCBzZWxmLl9yZXNwb25zZSlcbn1cblxuQ2xpZW50UmVxdWVzdC5wcm90b3R5cGUuX3dyaXRlID0gZnVuY3Rpb24gKGNodW5rLCBlbmNvZGluZywgY2IpIHtcblx0dmFyIHNlbGYgPSB0aGlzXG5cblx0c2VsZi5fYm9keS5wdXNoKGNodW5rKVxuXHRjYigpXG59XG5cbkNsaWVudFJlcXVlc3QucHJvdG90eXBlLl9yZXNldFRpbWVycyA9IGZ1bmN0aW9uIChkb25lKSB7XG5cdHZhciBzZWxmID0gdGhpc1xuXG5cdGdsb2JhbC5jbGVhclRpbWVvdXQoc2VsZi5fc29ja2V0VGltZXIpXG5cdHNlbGYuX3NvY2tldFRpbWVyID0gbnVsbFxuXG5cdGlmIChkb25lKSB7XG5cdFx0Z2xvYmFsLmNsZWFyVGltZW91dChzZWxmLl9mZXRjaFRpbWVyKVxuXHRcdHNlbGYuX2ZldGNoVGltZXIgPSBudWxsXG5cdH0gZWxzZSBpZiAoc2VsZi5fc29ja2V0VGltZW91dCkge1xuXHRcdHNlbGYuX3NvY2tldFRpbWVyID0gZ2xvYmFsLnNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuXHRcdFx0c2VsZi5lbWl0KCd0aW1lb3V0Jylcblx0XHR9LCBzZWxmLl9zb2NrZXRUaW1lb3V0KVxuXHR9XG59XG5cbkNsaWVudFJlcXVlc3QucHJvdG90eXBlLmFib3J0ID0gQ2xpZW50UmVxdWVzdC5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uIChlcnIpIHtcblx0dmFyIHNlbGYgPSB0aGlzXG5cdHNlbGYuX2Rlc3Ryb3llZCA9IHRydWVcblx0c2VsZi5fcmVzZXRUaW1lcnModHJ1ZSlcblx0aWYgKHNlbGYuX3Jlc3BvbnNlKVxuXHRcdHNlbGYuX3Jlc3BvbnNlLl9kZXN0cm95ZWQgPSB0cnVlXG5cdGlmIChzZWxmLl94aHIpXG5cdFx0c2VsZi5feGhyLmFib3J0KClcblx0ZWxzZSBpZiAoc2VsZi5fZmV0Y2hBYm9ydENvbnRyb2xsZXIpXG5cdFx0c2VsZi5fZmV0Y2hBYm9ydENvbnRyb2xsZXIuYWJvcnQoKVxuXG5cdGlmIChlcnIpXG5cdFx0c2VsZi5lbWl0KCdlcnJvcicsIGVycilcbn1cblxuQ2xpZW50UmVxdWVzdC5wcm90b3R5cGUuZW5kID0gZnVuY3Rpb24gKGRhdGEsIGVuY29kaW5nLCBjYikge1xuXHR2YXIgc2VsZiA9IHRoaXNcblx0aWYgKHR5cGVvZiBkYXRhID09PSAnZnVuY3Rpb24nKSB7XG5cdFx0Y2IgPSBkYXRhXG5cdFx0ZGF0YSA9IHVuZGVmaW5lZFxuXHR9XG5cblx0c3RyZWFtLldyaXRhYmxlLnByb3RvdHlwZS5lbmQuY2FsbChzZWxmLCBkYXRhLCBlbmNvZGluZywgY2IpXG59XG5cbkNsaWVudFJlcXVlc3QucHJvdG90eXBlLnNldFRpbWVvdXQgPSBmdW5jdGlvbiAodGltZW91dCwgY2IpIHtcblx0dmFyIHNlbGYgPSB0aGlzXG5cblx0aWYgKGNiKVxuXHRcdHNlbGYub25jZSgndGltZW91dCcsIGNiKVxuXG5cdHNlbGYuX3NvY2tldFRpbWVvdXQgPSB0aW1lb3V0XG5cdHNlbGYuX3Jlc2V0VGltZXJzKGZhbHNlKVxufVxuXG5DbGllbnRSZXF1ZXN0LnByb3RvdHlwZS5mbHVzaEhlYWRlcnMgPSBmdW5jdGlvbiAoKSB7fVxuQ2xpZW50UmVxdWVzdC5wcm90b3R5cGUuc2V0Tm9EZWxheSA9IGZ1bmN0aW9uICgpIHt9XG5DbGllbnRSZXF1ZXN0LnByb3RvdHlwZS5zZXRTb2NrZXRLZWVwQWxpdmUgPSBmdW5jdGlvbiAoKSB7fVxuXG4vLyBUYWtlbiBmcm9tIGh0dHA6Ly93d3cudzMub3JnL1RSL1hNTEh0dHBSZXF1ZXN0LyN0aGUtc2V0cmVxdWVzdGhlYWRlciUyOCUyOS1tZXRob2RcbnZhciB1bnNhZmVIZWFkZXJzID0gW1xuXHQnYWNjZXB0LWNoYXJzZXQnLFxuXHQnYWNjZXB0LWVuY29kaW5nJyxcblx0J2FjY2Vzcy1jb250cm9sLXJlcXVlc3QtaGVhZGVycycsXG5cdCdhY2Nlc3MtY29udHJvbC1yZXF1ZXN0LW1ldGhvZCcsXG5cdCdjb25uZWN0aW9uJyxcblx0J2NvbnRlbnQtbGVuZ3RoJyxcblx0J2Nvb2tpZScsXG5cdCdjb29raWUyJyxcblx0J2RhdGUnLFxuXHQnZG50Jyxcblx0J2V4cGVjdCcsXG5cdCdob3N0Jyxcblx0J2tlZXAtYWxpdmUnLFxuXHQnb3JpZ2luJyxcblx0J3JlZmVyZXInLFxuXHQndGUnLFxuXHQndHJhaWxlcicsXG5cdCd0cmFuc2Zlci1lbmNvZGluZycsXG5cdCd1cGdyYWRlJyxcblx0J3ZpYSdcbl1cbiIsInZhciBjYXBhYmlsaXR5ID0gcmVxdWlyZSgnLi9jYXBhYmlsaXR5JylcbnZhciBpbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJylcbnZhciBzdHJlYW0gPSByZXF1aXJlKCdyZWFkYWJsZS1zdHJlYW0nKVxuXG52YXIgclN0YXRlcyA9IGV4cG9ydHMucmVhZHlTdGF0ZXMgPSB7XG5cdFVOU0VOVDogMCxcblx0T1BFTkVEOiAxLFxuXHRIRUFERVJTX1JFQ0VJVkVEOiAyLFxuXHRMT0FESU5HOiAzLFxuXHRET05FOiA0XG59XG5cbnZhciBJbmNvbWluZ01lc3NhZ2UgPSBleHBvcnRzLkluY29taW5nTWVzc2FnZSA9IGZ1bmN0aW9uICh4aHIsIHJlc3BvbnNlLCBtb2RlLCByZXNldFRpbWVycykge1xuXHR2YXIgc2VsZiA9IHRoaXNcblx0c3RyZWFtLlJlYWRhYmxlLmNhbGwoc2VsZilcblxuXHRzZWxmLl9tb2RlID0gbW9kZVxuXHRzZWxmLmhlYWRlcnMgPSB7fVxuXHRzZWxmLnJhd0hlYWRlcnMgPSBbXVxuXHRzZWxmLnRyYWlsZXJzID0ge31cblx0c2VsZi5yYXdUcmFpbGVycyA9IFtdXG5cblx0Ly8gRmFrZSB0aGUgJ2Nsb3NlJyBldmVudCwgYnV0IG9ubHkgb25jZSAnZW5kJyBmaXJlc1xuXHRzZWxmLm9uKCdlbmQnLCBmdW5jdGlvbiAoKSB7XG5cdFx0Ly8gVGhlIG5leHRUaWNrIGlzIG5lY2Vzc2FyeSB0byBwcmV2ZW50IHRoZSAncmVxdWVzdCcgbW9kdWxlIGZyb20gY2F1c2luZyBhbiBpbmZpbml0ZSBsb29wXG5cdFx0cHJvY2Vzcy5uZXh0VGljayhmdW5jdGlvbiAoKSB7XG5cdFx0XHRzZWxmLmVtaXQoJ2Nsb3NlJylcblx0XHR9KVxuXHR9KVxuXG5cdGlmIChtb2RlID09PSAnZmV0Y2gnKSB7XG5cdFx0c2VsZi5fZmV0Y2hSZXNwb25zZSA9IHJlc3BvbnNlXG5cblx0XHRzZWxmLnVybCA9IHJlc3BvbnNlLnVybFxuXHRcdHNlbGYuc3RhdHVzQ29kZSA9IHJlc3BvbnNlLnN0YXR1c1xuXHRcdHNlbGYuc3RhdHVzTWVzc2FnZSA9IHJlc3BvbnNlLnN0YXR1c1RleHRcblx0XHRcblx0XHRyZXNwb25zZS5oZWFkZXJzLmZvckVhY2goZnVuY3Rpb24gKGhlYWRlciwga2V5KXtcblx0XHRcdHNlbGYuaGVhZGVyc1trZXkudG9Mb3dlckNhc2UoKV0gPSBoZWFkZXJcblx0XHRcdHNlbGYucmF3SGVhZGVycy5wdXNoKGtleSwgaGVhZGVyKVxuXHRcdH0pXG5cblx0XHRpZiAoY2FwYWJpbGl0eS53cml0YWJsZVN0cmVhbSkge1xuXHRcdFx0dmFyIHdyaXRhYmxlID0gbmV3IFdyaXRhYmxlU3RyZWFtKHtcblx0XHRcdFx0d3JpdGU6IGZ1bmN0aW9uIChjaHVuaykge1xuXHRcdFx0XHRcdHJlc2V0VGltZXJzKGZhbHNlKVxuXHRcdFx0XHRcdHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG5cdFx0XHRcdFx0XHRpZiAoc2VsZi5fZGVzdHJveWVkKSB7XG5cdFx0XHRcdFx0XHRcdHJlamVjdCgpXG5cdFx0XHRcdFx0XHR9IGVsc2UgaWYoc2VsZi5wdXNoKEJ1ZmZlci5mcm9tKGNodW5rKSkpIHtcblx0XHRcdFx0XHRcdFx0cmVzb2x2ZSgpXG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRzZWxmLl9yZXN1bWVGZXRjaCA9IHJlc29sdmVcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KVxuXHRcdFx0XHR9LFxuXHRcdFx0XHRjbG9zZTogZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdHJlc2V0VGltZXJzKHRydWUpXG5cdFx0XHRcdFx0aWYgKCFzZWxmLl9kZXN0cm95ZWQpXG5cdFx0XHRcdFx0XHRzZWxmLnB1c2gobnVsbClcblx0XHRcdFx0fSxcblx0XHRcdFx0YWJvcnQ6IGZ1bmN0aW9uIChlcnIpIHtcblx0XHRcdFx0XHRyZXNldFRpbWVycyh0cnVlKVxuXHRcdFx0XHRcdGlmICghc2VsZi5fZGVzdHJveWVkKVxuXHRcdFx0XHRcdFx0c2VsZi5lbWl0KCdlcnJvcicsIGVycilcblx0XHRcdFx0fVxuXHRcdFx0fSlcblxuXHRcdFx0dHJ5IHtcblx0XHRcdFx0cmVzcG9uc2UuYm9keS5waXBlVG8od3JpdGFibGUpLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHtcblx0XHRcdFx0XHRyZXNldFRpbWVycyh0cnVlKVxuXHRcdFx0XHRcdGlmICghc2VsZi5fZGVzdHJveWVkKVxuXHRcdFx0XHRcdFx0c2VsZi5lbWl0KCdlcnJvcicsIGVycilcblx0XHRcdFx0fSlcblx0XHRcdFx0cmV0dXJuXG5cdFx0XHR9IGNhdGNoIChlKSB7fSAvLyBwaXBlVG8gbWV0aG9kIGlzbid0IGRlZmluZWQuIENhbid0IGZpbmQgYSBiZXR0ZXIgd2F5IHRvIGZlYXR1cmUgdGVzdCB0aGlzXG5cdFx0fVxuXHRcdC8vIGZhbGxiYWNrIGZvciB3aGVuIHdyaXRhYmxlU3RyZWFtIG9yIHBpcGVUbyBhcmVuJ3QgYXZhaWxhYmxlXG5cdFx0dmFyIHJlYWRlciA9IHJlc3BvbnNlLmJvZHkuZ2V0UmVhZGVyKClcblx0XHRmdW5jdGlvbiByZWFkICgpIHtcblx0XHRcdHJlYWRlci5yZWFkKCkudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7XG5cdFx0XHRcdGlmIChzZWxmLl9kZXN0cm95ZWQpXG5cdFx0XHRcdFx0cmV0dXJuXG5cdFx0XHRcdHJlc2V0VGltZXJzKHJlc3VsdC5kb25lKVxuXHRcdFx0XHRpZiAocmVzdWx0LmRvbmUpIHtcblx0XHRcdFx0XHRzZWxmLnB1c2gobnVsbClcblx0XHRcdFx0XHRyZXR1cm5cblx0XHRcdFx0fVxuXHRcdFx0XHRzZWxmLnB1c2goQnVmZmVyLmZyb20ocmVzdWx0LnZhbHVlKSlcblx0XHRcdFx0cmVhZCgpXG5cdFx0XHR9KS5jYXRjaChmdW5jdGlvbiAoZXJyKSB7XG5cdFx0XHRcdHJlc2V0VGltZXJzKHRydWUpXG5cdFx0XHRcdGlmICghc2VsZi5fZGVzdHJveWVkKVxuXHRcdFx0XHRcdHNlbGYuZW1pdCgnZXJyb3InLCBlcnIpXG5cdFx0XHR9KVxuXHRcdH1cblx0XHRyZWFkKClcblx0fSBlbHNlIHtcblx0XHRzZWxmLl94aHIgPSB4aHJcblx0XHRzZWxmLl9wb3MgPSAwXG5cblx0XHRzZWxmLnVybCA9IHhoci5yZXNwb25zZVVSTFxuXHRcdHNlbGYuc3RhdHVzQ29kZSA9IHhoci5zdGF0dXNcblx0XHRzZWxmLnN0YXR1c01lc3NhZ2UgPSB4aHIuc3RhdHVzVGV4dFxuXHRcdHZhciBoZWFkZXJzID0geGhyLmdldEFsbFJlc3BvbnNlSGVhZGVycygpLnNwbGl0KC9cXHI/XFxuLylcblx0XHRoZWFkZXJzLmZvckVhY2goZnVuY3Rpb24gKGhlYWRlcikge1xuXHRcdFx0dmFyIG1hdGNoZXMgPSBoZWFkZXIubWF0Y2goL14oW146XSspOlxccyooLiopLylcblx0XHRcdGlmIChtYXRjaGVzKSB7XG5cdFx0XHRcdHZhciBrZXkgPSBtYXRjaGVzWzFdLnRvTG93ZXJDYXNlKClcblx0XHRcdFx0aWYgKGtleSA9PT0gJ3NldC1jb29raWUnKSB7XG5cdFx0XHRcdFx0aWYgKHNlbGYuaGVhZGVyc1trZXldID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRcdHNlbGYuaGVhZGVyc1trZXldID0gW11cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0c2VsZi5oZWFkZXJzW2tleV0ucHVzaChtYXRjaGVzWzJdKVxuXHRcdFx0XHR9IGVsc2UgaWYgKHNlbGYuaGVhZGVyc1trZXldICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRzZWxmLmhlYWRlcnNba2V5XSArPSAnLCAnICsgbWF0Y2hlc1syXVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHNlbGYuaGVhZGVyc1trZXldID0gbWF0Y2hlc1syXVxuXHRcdFx0XHR9XG5cdFx0XHRcdHNlbGYucmF3SGVhZGVycy5wdXNoKG1hdGNoZXNbMV0sIG1hdGNoZXNbMl0pXG5cdFx0XHR9XG5cdFx0fSlcblxuXHRcdHNlbGYuX2NoYXJzZXQgPSAneC11c2VyLWRlZmluZWQnXG5cdFx0aWYgKCFjYXBhYmlsaXR5Lm92ZXJyaWRlTWltZVR5cGUpIHtcblx0XHRcdHZhciBtaW1lVHlwZSA9IHNlbGYucmF3SGVhZGVyc1snbWltZS10eXBlJ11cblx0XHRcdGlmIChtaW1lVHlwZSkge1xuXHRcdFx0XHR2YXIgY2hhcnNldE1hdGNoID0gbWltZVR5cGUubWF0Y2goLztcXHMqY2hhcnNldD0oW147XSkoO3wkKS8pXG5cdFx0XHRcdGlmIChjaGFyc2V0TWF0Y2gpIHtcblx0XHRcdFx0XHRzZWxmLl9jaGFyc2V0ID0gY2hhcnNldE1hdGNoWzFdLnRvTG93ZXJDYXNlKClcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0aWYgKCFzZWxmLl9jaGFyc2V0KVxuXHRcdFx0XHRzZWxmLl9jaGFyc2V0ID0gJ3V0Zi04JyAvLyBiZXN0IGd1ZXNzXG5cdFx0fVxuXHR9XG59XG5cbmluaGVyaXRzKEluY29taW5nTWVzc2FnZSwgc3RyZWFtLlJlYWRhYmxlKVxuXG5JbmNvbWluZ01lc3NhZ2UucHJvdG90eXBlLl9yZWFkID0gZnVuY3Rpb24gKCkge1xuXHR2YXIgc2VsZiA9IHRoaXNcblxuXHR2YXIgcmVzb2x2ZSA9IHNlbGYuX3Jlc3VtZUZldGNoXG5cdGlmIChyZXNvbHZlKSB7XG5cdFx0c2VsZi5fcmVzdW1lRmV0Y2ggPSBudWxsXG5cdFx0cmVzb2x2ZSgpXG5cdH1cbn1cblxuSW5jb21pbmdNZXNzYWdlLnByb3RvdHlwZS5fb25YSFJQcm9ncmVzcyA9IGZ1bmN0aW9uIChyZXNldFRpbWVycykge1xuXHR2YXIgc2VsZiA9IHRoaXNcblxuXHR2YXIgeGhyID0gc2VsZi5feGhyXG5cblx0dmFyIHJlc3BvbnNlID0gbnVsbFxuXHRzd2l0Y2ggKHNlbGYuX21vZGUpIHtcblx0XHRjYXNlICd0ZXh0Jzpcblx0XHRcdHJlc3BvbnNlID0geGhyLnJlc3BvbnNlVGV4dFxuXHRcdFx0aWYgKHJlc3BvbnNlLmxlbmd0aCA+IHNlbGYuX3Bvcykge1xuXHRcdFx0XHR2YXIgbmV3RGF0YSA9IHJlc3BvbnNlLnN1YnN0cihzZWxmLl9wb3MpXG5cdFx0XHRcdGlmIChzZWxmLl9jaGFyc2V0ID09PSAneC11c2VyLWRlZmluZWQnKSB7XG5cdFx0XHRcdFx0dmFyIGJ1ZmZlciA9IEJ1ZmZlci5hbGxvYyhuZXdEYXRhLmxlbmd0aClcblx0XHRcdFx0XHRmb3IgKHZhciBpID0gMDsgaSA8IG5ld0RhdGEubGVuZ3RoOyBpKyspXG5cdFx0XHRcdFx0XHRidWZmZXJbaV0gPSBuZXdEYXRhLmNoYXJDb2RlQXQoaSkgJiAweGZmXG5cblx0XHRcdFx0XHRzZWxmLnB1c2goYnVmZmVyKVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHNlbGYucHVzaChuZXdEYXRhLCBzZWxmLl9jaGFyc2V0KVxuXHRcdFx0XHR9XG5cdFx0XHRcdHNlbGYuX3BvcyA9IHJlc3BvbnNlLmxlbmd0aFxuXHRcdFx0fVxuXHRcdFx0YnJlYWtcblx0XHRjYXNlICdhcnJheWJ1ZmZlcic6XG5cdFx0XHRpZiAoeGhyLnJlYWR5U3RhdGUgIT09IHJTdGF0ZXMuRE9ORSB8fCAheGhyLnJlc3BvbnNlKVxuXHRcdFx0XHRicmVha1xuXHRcdFx0cmVzcG9uc2UgPSB4aHIucmVzcG9uc2Vcblx0XHRcdHNlbGYucHVzaChCdWZmZXIuZnJvbShuZXcgVWludDhBcnJheShyZXNwb25zZSkpKVxuXHRcdFx0YnJlYWtcblx0XHRjYXNlICdtb3otY2h1bmtlZC1hcnJheWJ1ZmZlcic6IC8vIHRha2Ugd2hvbGVcblx0XHRcdHJlc3BvbnNlID0geGhyLnJlc3BvbnNlXG5cdFx0XHRpZiAoeGhyLnJlYWR5U3RhdGUgIT09IHJTdGF0ZXMuTE9BRElORyB8fCAhcmVzcG9uc2UpXG5cdFx0XHRcdGJyZWFrXG5cdFx0XHRzZWxmLnB1c2goQnVmZmVyLmZyb20obmV3IFVpbnQ4QXJyYXkocmVzcG9uc2UpKSlcblx0XHRcdGJyZWFrXG5cdFx0Y2FzZSAnbXMtc3RyZWFtJzpcblx0XHRcdHJlc3BvbnNlID0geGhyLnJlc3BvbnNlXG5cdFx0XHRpZiAoeGhyLnJlYWR5U3RhdGUgIT09IHJTdGF0ZXMuTE9BRElORylcblx0XHRcdFx0YnJlYWtcblx0XHRcdHZhciByZWFkZXIgPSBuZXcgZ2xvYmFsLk1TU3RyZWFtUmVhZGVyKClcblx0XHRcdHJlYWRlci5vbnByb2dyZXNzID0gZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRpZiAocmVhZGVyLnJlc3VsdC5ieXRlTGVuZ3RoID4gc2VsZi5fcG9zKSB7XG5cdFx0XHRcdFx0c2VsZi5wdXNoKEJ1ZmZlci5mcm9tKG5ldyBVaW50OEFycmF5KHJlYWRlci5yZXN1bHQuc2xpY2Uoc2VsZi5fcG9zKSkpKVxuXHRcdFx0XHRcdHNlbGYuX3BvcyA9IHJlYWRlci5yZXN1bHQuYnl0ZUxlbmd0aFxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZWFkZXIub25sb2FkID0gZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRyZXNldFRpbWVycyh0cnVlKVxuXHRcdFx0XHRzZWxmLnB1c2gobnVsbClcblx0XHRcdH1cblx0XHRcdC8vIHJlYWRlci5vbmVycm9yID0gPz8/IC8vIFRPRE86IHRoaXNcblx0XHRcdHJlYWRlci5yZWFkQXNBcnJheUJ1ZmZlcihyZXNwb25zZSlcblx0XHRcdGJyZWFrXG5cdH1cblxuXHQvLyBUaGUgbXMtc3RyZWFtIGNhc2UgaGFuZGxlcyBlbmQgc2VwYXJhdGVseSBpbiByZWFkZXIub25sb2FkKClcblx0aWYgKHNlbGYuX3hoci5yZWFkeVN0YXRlID09PSByU3RhdGVzLkRPTkUgJiYgc2VsZi5fbW9kZSAhPT0gJ21zLXN0cmVhbScpIHtcblx0XHRyZXNldFRpbWVycyh0cnVlKVxuXHRcdHNlbGYucHVzaChudWxsKVxuXHR9XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbmZ1bmN0aW9uIF9pbmhlcml0c0xvb3NlKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcy5wcm90b3R5cGUpOyBzdWJDbGFzcy5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBzdWJDbGFzczsgc3ViQ2xhc3MuX19wcm90b19fID0gc3VwZXJDbGFzczsgfVxuXG52YXIgY29kZXMgPSB7fTtcblxuZnVuY3Rpb24gY3JlYXRlRXJyb3JUeXBlKGNvZGUsIG1lc3NhZ2UsIEJhc2UpIHtcbiAgaWYgKCFCYXNlKSB7XG4gICAgQmFzZSA9IEVycm9yO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0TWVzc2FnZShhcmcxLCBhcmcyLCBhcmczKSB7XG4gICAgaWYgKHR5cGVvZiBtZXNzYWdlID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBtZXNzYWdlKGFyZzEsIGFyZzIsIGFyZzMpO1xuICAgIH1cbiAgfVxuXG4gIHZhciBOb2RlRXJyb3IgPVxuICAvKiNfX1BVUkVfXyovXG4gIGZ1bmN0aW9uIChfQmFzZSkge1xuICAgIF9pbmhlcml0c0xvb3NlKE5vZGVFcnJvciwgX0Jhc2UpO1xuXG4gICAgZnVuY3Rpb24gTm9kZUVycm9yKGFyZzEsIGFyZzIsIGFyZzMpIHtcbiAgICAgIHJldHVybiBfQmFzZS5jYWxsKHRoaXMsIGdldE1lc3NhZ2UoYXJnMSwgYXJnMiwgYXJnMykpIHx8IHRoaXM7XG4gICAgfVxuXG4gICAgcmV0dXJuIE5vZGVFcnJvcjtcbiAgfShCYXNlKTtcblxuICBOb2RlRXJyb3IucHJvdG90eXBlLm5hbWUgPSBCYXNlLm5hbWU7XG4gIE5vZGVFcnJvci5wcm90b3R5cGUuY29kZSA9IGNvZGU7XG4gIGNvZGVzW2NvZGVdID0gTm9kZUVycm9yO1xufSAvLyBodHRwczovL2dpdGh1Yi5jb20vbm9kZWpzL25vZGUvYmxvYi92MTAuOC4wL2xpYi9pbnRlcm5hbC9lcnJvcnMuanNcblxuXG5mdW5jdGlvbiBvbmVPZihleHBlY3RlZCwgdGhpbmcpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoZXhwZWN0ZWQpKSB7XG4gICAgdmFyIGxlbiA9IGV4cGVjdGVkLmxlbmd0aDtcbiAgICBleHBlY3RlZCA9IGV4cGVjdGVkLm1hcChmdW5jdGlvbiAoaSkge1xuICAgICAgcmV0dXJuIFN0cmluZyhpKTtcbiAgICB9KTtcblxuICAgIGlmIChsZW4gPiAyKSB7XG4gICAgICByZXR1cm4gXCJvbmUgb2YgXCIuY29uY2F0KHRoaW5nLCBcIiBcIikuY29uY2F0KGV4cGVjdGVkLnNsaWNlKDAsIGxlbiAtIDEpLmpvaW4oJywgJyksIFwiLCBvciBcIikgKyBleHBlY3RlZFtsZW4gLSAxXTtcbiAgICB9IGVsc2UgaWYgKGxlbiA9PT0gMikge1xuICAgICAgcmV0dXJuIFwib25lIG9mIFwiLmNvbmNhdCh0aGluZywgXCIgXCIpLmNvbmNhdChleHBlY3RlZFswXSwgXCIgb3IgXCIpLmNvbmNhdChleHBlY3RlZFsxXSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBcIm9mIFwiLmNvbmNhdCh0aGluZywgXCIgXCIpLmNvbmNhdChleHBlY3RlZFswXSk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHJldHVybiBcIm9mIFwiLmNvbmNhdCh0aGluZywgXCIgXCIpLmNvbmNhdChTdHJpbmcoZXhwZWN0ZWQpKTtcbiAgfVxufSAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9TdHJpbmcvc3RhcnRzV2l0aFxuXG5cbmZ1bmN0aW9uIHN0YXJ0c1dpdGgoc3RyLCBzZWFyY2gsIHBvcykge1xuICByZXR1cm4gc3RyLnN1YnN0cighcG9zIHx8IHBvcyA8IDAgPyAwIDogK3Bvcywgc2VhcmNoLmxlbmd0aCkgPT09IHNlYXJjaDtcbn0gLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvU3RyaW5nL2VuZHNXaXRoXG5cblxuZnVuY3Rpb24gZW5kc1dpdGgoc3RyLCBzZWFyY2gsIHRoaXNfbGVuKSB7XG4gIGlmICh0aGlzX2xlbiA9PT0gdW5kZWZpbmVkIHx8IHRoaXNfbGVuID4gc3RyLmxlbmd0aCkge1xuICAgIHRoaXNfbGVuID0gc3RyLmxlbmd0aDtcbiAgfVxuXG4gIHJldHVybiBzdHIuc3Vic3RyaW5nKHRoaXNfbGVuIC0gc2VhcmNoLmxlbmd0aCwgdGhpc19sZW4pID09PSBzZWFyY2g7XG59IC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL1N0cmluZy9pbmNsdWRlc1xuXG5cbmZ1bmN0aW9uIGluY2x1ZGVzKHN0ciwgc2VhcmNoLCBzdGFydCkge1xuICBpZiAodHlwZW9mIHN0YXJ0ICE9PSAnbnVtYmVyJykge1xuICAgIHN0YXJ0ID0gMDtcbiAgfVxuXG4gIGlmIChzdGFydCArIHNlYXJjaC5sZW5ndGggPiBzdHIubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBzdHIuaW5kZXhPZihzZWFyY2gsIHN0YXJ0KSAhPT0gLTE7XG4gIH1cbn1cblxuY3JlYXRlRXJyb3JUeXBlKCdFUlJfSU5WQUxJRF9PUFRfVkFMVUUnLCBmdW5jdGlvbiAobmFtZSwgdmFsdWUpIHtcbiAgcmV0dXJuICdUaGUgdmFsdWUgXCInICsgdmFsdWUgKyAnXCIgaXMgaW52YWxpZCBmb3Igb3B0aW9uIFwiJyArIG5hbWUgKyAnXCInO1xufSwgVHlwZUVycm9yKTtcbmNyZWF0ZUVycm9yVHlwZSgnRVJSX0lOVkFMSURfQVJHX1RZUEUnLCBmdW5jdGlvbiAobmFtZSwgZXhwZWN0ZWQsIGFjdHVhbCkge1xuICAvLyBkZXRlcm1pbmVyOiAnbXVzdCBiZScgb3IgJ211c3Qgbm90IGJlJ1xuICB2YXIgZGV0ZXJtaW5lcjtcblxuICBpZiAodHlwZW9mIGV4cGVjdGVkID09PSAnc3RyaW5nJyAmJiBzdGFydHNXaXRoKGV4cGVjdGVkLCAnbm90ICcpKSB7XG4gICAgZGV0ZXJtaW5lciA9ICdtdXN0IG5vdCBiZSc7XG4gICAgZXhwZWN0ZWQgPSBleHBlY3RlZC5yZXBsYWNlKC9ebm90IC8sICcnKTtcbiAgfSBlbHNlIHtcbiAgICBkZXRlcm1pbmVyID0gJ211c3QgYmUnO1xuICB9XG5cbiAgdmFyIG1zZztcblxuICBpZiAoZW5kc1dpdGgobmFtZSwgJyBhcmd1bWVudCcpKSB7XG4gICAgLy8gRm9yIGNhc2VzIGxpa2UgJ2ZpcnN0IGFyZ3VtZW50J1xuICAgIG1zZyA9IFwiVGhlIFwiLmNvbmNhdChuYW1lLCBcIiBcIikuY29uY2F0KGRldGVybWluZXIsIFwiIFwiKS5jb25jYXQob25lT2YoZXhwZWN0ZWQsICd0eXBlJykpO1xuICB9IGVsc2Uge1xuICAgIHZhciB0eXBlID0gaW5jbHVkZXMobmFtZSwgJy4nKSA/ICdwcm9wZXJ0eScgOiAnYXJndW1lbnQnO1xuICAgIG1zZyA9IFwiVGhlIFxcXCJcIi5jb25jYXQobmFtZSwgXCJcXFwiIFwiKS5jb25jYXQodHlwZSwgXCIgXCIpLmNvbmNhdChkZXRlcm1pbmVyLCBcIiBcIikuY29uY2F0KG9uZU9mKGV4cGVjdGVkLCAndHlwZScpKTtcbiAgfVxuXG4gIG1zZyArPSBcIi4gUmVjZWl2ZWQgdHlwZSBcIi5jb25jYXQodHlwZW9mIGFjdHVhbCk7XG4gIHJldHVybiBtc2c7XG59LCBUeXBlRXJyb3IpO1xuY3JlYXRlRXJyb3JUeXBlKCdFUlJfU1RSRUFNX1BVU0hfQUZURVJfRU9GJywgJ3N0cmVhbS5wdXNoKCkgYWZ0ZXIgRU9GJyk7XG5jcmVhdGVFcnJvclR5cGUoJ0VSUl9NRVRIT0RfTk9UX0lNUExFTUVOVEVEJywgZnVuY3Rpb24gKG5hbWUpIHtcbiAgcmV0dXJuICdUaGUgJyArIG5hbWUgKyAnIG1ldGhvZCBpcyBub3QgaW1wbGVtZW50ZWQnO1xufSk7XG5jcmVhdGVFcnJvclR5cGUoJ0VSUl9TVFJFQU1fUFJFTUFUVVJFX0NMT1NFJywgJ1ByZW1hdHVyZSBjbG9zZScpO1xuY3JlYXRlRXJyb3JUeXBlKCdFUlJfU1RSRUFNX0RFU1RST1lFRCcsIGZ1bmN0aW9uIChuYW1lKSB7XG4gIHJldHVybiAnQ2Fubm90IGNhbGwgJyArIG5hbWUgKyAnIGFmdGVyIGEgc3RyZWFtIHdhcyBkZXN0cm95ZWQnO1xufSk7XG5jcmVhdGVFcnJvclR5cGUoJ0VSUl9NVUxUSVBMRV9DQUxMQkFDSycsICdDYWxsYmFjayBjYWxsZWQgbXVsdGlwbGUgdGltZXMnKTtcbmNyZWF0ZUVycm9yVHlwZSgnRVJSX1NUUkVBTV9DQU5OT1RfUElQRScsICdDYW5ub3QgcGlwZSwgbm90IHJlYWRhYmxlJyk7XG5jcmVhdGVFcnJvclR5cGUoJ0VSUl9TVFJFQU1fV1JJVEVfQUZURVJfRU5EJywgJ3dyaXRlIGFmdGVyIGVuZCcpO1xuY3JlYXRlRXJyb3JUeXBlKCdFUlJfU1RSRUFNX05VTExfVkFMVUVTJywgJ01heSBub3Qgd3JpdGUgbnVsbCB2YWx1ZXMgdG8gc3RyZWFtJywgVHlwZUVycm9yKTtcbmNyZWF0ZUVycm9yVHlwZSgnRVJSX1VOS05PV05fRU5DT0RJTkcnLCBmdW5jdGlvbiAoYXJnKSB7XG4gIHJldHVybiAnVW5rbm93biBlbmNvZGluZzogJyArIGFyZztcbn0sIFR5cGVFcnJvcik7XG5jcmVhdGVFcnJvclR5cGUoJ0VSUl9TVFJFQU1fVU5TSElGVF9BRlRFUl9FTkRfRVZFTlQnLCAnc3RyZWFtLnVuc2hpZnQoKSBhZnRlciBlbmQgZXZlbnQnKTtcbm1vZHVsZS5leHBvcnRzLmNvZGVzID0gY29kZXM7XG4iLCIvLyBDb3B5cmlnaHQgSm95ZW50LCBJbmMuIGFuZCBvdGhlciBOb2RlIGNvbnRyaWJ1dG9ycy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYVxuLy8gY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuLy8gXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG4vLyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG4vLyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0XG4vLyBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGVcbi8vIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkXG4vLyBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTXG4vLyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOXG4vLyBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcbi8vIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUlxuLy8gT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRVxuLy8gVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cbi8vIGEgZHVwbGV4IHN0cmVhbSBpcyBqdXN0IGEgc3RyZWFtIHRoYXQgaXMgYm90aCByZWFkYWJsZSBhbmQgd3JpdGFibGUuXG4vLyBTaW5jZSBKUyBkb2Vzbid0IGhhdmUgbXVsdGlwbGUgcHJvdG90eXBhbCBpbmhlcml0YW5jZSwgdGhpcyBjbGFzc1xuLy8gcHJvdG90eXBhbGx5IGluaGVyaXRzIGZyb20gUmVhZGFibGUsIGFuZCB0aGVuIHBhcmFzaXRpY2FsbHkgZnJvbVxuLy8gV3JpdGFibGUuXG4ndXNlIHN0cmljdCc7XG4vKjxyZXBsYWNlbWVudD4qL1xuXG52YXIgb2JqZWN0S2V5cyA9IE9iamVjdC5rZXlzIHx8IGZ1bmN0aW9uIChvYmopIHtcbiAgdmFyIGtleXMgPSBbXTtcblxuICBmb3IgKHZhciBrZXkgaW4gb2JqKSB7XG4gICAga2V5cy5wdXNoKGtleSk7XG4gIH1cblxuICByZXR1cm4ga2V5cztcbn07XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxuXG5tb2R1bGUuZXhwb3J0cyA9IER1cGxleDtcblxudmFyIFJlYWRhYmxlID0gcmVxdWlyZSgnLi9fc3RyZWFtX3JlYWRhYmxlJyk7XG5cbnZhciBXcml0YWJsZSA9IHJlcXVpcmUoJy4vX3N0cmVhbV93cml0YWJsZScpO1xuXG5yZXF1aXJlKCdpbmhlcml0cycpKER1cGxleCwgUmVhZGFibGUpO1xuXG57XG4gIC8vIEFsbG93IHRoZSBrZXlzIGFycmF5IHRvIGJlIEdDJ2VkLlxuICB2YXIga2V5cyA9IG9iamVjdEtleXMoV3JpdGFibGUucHJvdG90eXBlKTtcblxuICBmb3IgKHZhciB2ID0gMDsgdiA8IGtleXMubGVuZ3RoOyB2KyspIHtcbiAgICB2YXIgbWV0aG9kID0ga2V5c1t2XTtcbiAgICBpZiAoIUR1cGxleC5wcm90b3R5cGVbbWV0aG9kXSkgRHVwbGV4LnByb3RvdHlwZVttZXRob2RdID0gV3JpdGFibGUucHJvdG90eXBlW21ldGhvZF07XG4gIH1cbn1cblxuZnVuY3Rpb24gRHVwbGV4KG9wdGlvbnMpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIER1cGxleCkpIHJldHVybiBuZXcgRHVwbGV4KG9wdGlvbnMpO1xuICBSZWFkYWJsZS5jYWxsKHRoaXMsIG9wdGlvbnMpO1xuICBXcml0YWJsZS5jYWxsKHRoaXMsIG9wdGlvbnMpO1xuICB0aGlzLmFsbG93SGFsZk9wZW4gPSB0cnVlO1xuXG4gIGlmIChvcHRpb25zKSB7XG4gICAgaWYgKG9wdGlvbnMucmVhZGFibGUgPT09IGZhbHNlKSB0aGlzLnJlYWRhYmxlID0gZmFsc2U7XG4gICAgaWYgKG9wdGlvbnMud3JpdGFibGUgPT09IGZhbHNlKSB0aGlzLndyaXRhYmxlID0gZmFsc2U7XG5cbiAgICBpZiAob3B0aW9ucy5hbGxvd0hhbGZPcGVuID09PSBmYWxzZSkge1xuICAgICAgdGhpcy5hbGxvd0hhbGZPcGVuID0gZmFsc2U7XG4gICAgICB0aGlzLm9uY2UoJ2VuZCcsIG9uZW5kKTtcbiAgICB9XG4gIH1cbn1cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KER1cGxleC5wcm90b3R5cGUsICd3cml0YWJsZUhpZ2hXYXRlck1hcmsnLCB7XG4gIC8vIG1ha2luZyBpdCBleHBsaWNpdCB0aGlzIHByb3BlcnR5IGlzIG5vdCBlbnVtZXJhYmxlXG4gIC8vIGJlY2F1c2Ugb3RoZXJ3aXNlIHNvbWUgcHJvdG90eXBlIG1hbmlwdWxhdGlvbiBpblxuICAvLyB1c2VybGFuZCB3aWxsIGZhaWxcbiAgZW51bWVyYWJsZTogZmFsc2UsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiB0aGlzLl93cml0YWJsZVN0YXRlLmhpZ2hXYXRlck1hcms7XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KER1cGxleC5wcm90b3R5cGUsICd3cml0YWJsZUJ1ZmZlcicsIHtcbiAgLy8gbWFraW5nIGl0IGV4cGxpY2l0IHRoaXMgcHJvcGVydHkgaXMgbm90IGVudW1lcmFibGVcbiAgLy8gYmVjYXVzZSBvdGhlcndpc2Ugc29tZSBwcm90b3R5cGUgbWFuaXB1bGF0aW9uIGluXG4gIC8vIHVzZXJsYW5kIHdpbGwgZmFpbFxuICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3dyaXRhYmxlU3RhdGUgJiYgdGhpcy5fd3JpdGFibGVTdGF0ZS5nZXRCdWZmZXIoKTtcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoRHVwbGV4LnByb3RvdHlwZSwgJ3dyaXRhYmxlTGVuZ3RoJywge1xuICAvLyBtYWtpbmcgaXQgZXhwbGljaXQgdGhpcyBwcm9wZXJ0eSBpcyBub3QgZW51bWVyYWJsZVxuICAvLyBiZWNhdXNlIG90aGVyd2lzZSBzb21lIHByb3RvdHlwZSBtYW5pcHVsYXRpb24gaW5cbiAgLy8gdXNlcmxhbmQgd2lsbCBmYWlsXG4gIGVudW1lcmFibGU6IGZhbHNlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gdGhpcy5fd3JpdGFibGVTdGF0ZS5sZW5ndGg7XG4gIH1cbn0pOyAvLyB0aGUgbm8taGFsZi1vcGVuIGVuZm9yY2VyXG5cbmZ1bmN0aW9uIG9uZW5kKCkge1xuICAvLyBJZiB0aGUgd3JpdGFibGUgc2lkZSBlbmRlZCwgdGhlbiB3ZSdyZSBvay5cbiAgaWYgKHRoaXMuX3dyaXRhYmxlU3RhdGUuZW5kZWQpIHJldHVybjsgLy8gbm8gbW9yZSBkYXRhIGNhbiBiZSB3cml0dGVuLlxuICAvLyBCdXQgYWxsb3cgbW9yZSB3cml0ZXMgdG8gaGFwcGVuIGluIHRoaXMgdGljay5cblxuICBwcm9jZXNzLm5leHRUaWNrKG9uRW5kTlQsIHRoaXMpO1xufVxuXG5mdW5jdGlvbiBvbkVuZE5UKHNlbGYpIHtcbiAgc2VsZi5lbmQoKTtcbn1cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KER1cGxleC5wcm90b3R5cGUsICdkZXN0cm95ZWQnLCB7XG4gIC8vIG1ha2luZyBpdCBleHBsaWNpdCB0aGlzIHByb3BlcnR5IGlzIG5vdCBlbnVtZXJhYmxlXG4gIC8vIGJlY2F1c2Ugb3RoZXJ3aXNlIHNvbWUgcHJvdG90eXBlIG1hbmlwdWxhdGlvbiBpblxuICAvLyB1c2VybGFuZCB3aWxsIGZhaWxcbiAgZW51bWVyYWJsZTogZmFsc2UsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIGlmICh0aGlzLl9yZWFkYWJsZVN0YXRlID09PSB1bmRlZmluZWQgfHwgdGhpcy5fd3JpdGFibGVTdGF0ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX3JlYWRhYmxlU3RhdGUuZGVzdHJveWVkICYmIHRoaXMuX3dyaXRhYmxlU3RhdGUuZGVzdHJveWVkO1xuICB9LFxuICBzZXQ6IGZ1bmN0aW9uIHNldCh2YWx1ZSkge1xuICAgIC8vIHdlIGlnbm9yZSB0aGUgdmFsdWUgaWYgdGhlIHN0cmVhbVxuICAgIC8vIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZCB5ZXRcbiAgICBpZiAodGhpcy5fcmVhZGFibGVTdGF0ZSA9PT0gdW5kZWZpbmVkIHx8IHRoaXMuX3dyaXRhYmxlU3RhdGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH0gLy8gYmFja3dhcmQgY29tcGF0aWJpbGl0eSwgdGhlIHVzZXIgaXMgZXhwbGljaXRseVxuICAgIC8vIG1hbmFnaW5nIGRlc3Ryb3llZFxuXG5cbiAgICB0aGlzLl9yZWFkYWJsZVN0YXRlLmRlc3Ryb3llZCA9IHZhbHVlO1xuICAgIHRoaXMuX3dyaXRhYmxlU3RhdGUuZGVzdHJveWVkID0gdmFsdWU7XG4gIH1cbn0pOyIsIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuLy8gYSBwYXNzdGhyb3VnaCBzdHJlYW0uXG4vLyBiYXNpY2FsbHkganVzdCB0aGUgbW9zdCBtaW5pbWFsIHNvcnQgb2YgVHJhbnNmb3JtIHN0cmVhbS5cbi8vIEV2ZXJ5IHdyaXR0ZW4gY2h1bmsgZ2V0cyBvdXRwdXQgYXMtaXMuXG4ndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gUGFzc1Rocm91Z2g7XG5cbnZhciBUcmFuc2Zvcm0gPSByZXF1aXJlKCcuL19zdHJlYW1fdHJhbnNmb3JtJyk7XG5cbnJlcXVpcmUoJ2luaGVyaXRzJykoUGFzc1Rocm91Z2gsIFRyYW5zZm9ybSk7XG5cbmZ1bmN0aW9uIFBhc3NUaHJvdWdoKG9wdGlvbnMpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFBhc3NUaHJvdWdoKSkgcmV0dXJuIG5ldyBQYXNzVGhyb3VnaChvcHRpb25zKTtcbiAgVHJhbnNmb3JtLmNhbGwodGhpcywgb3B0aW9ucyk7XG59XG5cblBhc3NUaHJvdWdoLnByb3RvdHlwZS5fdHJhbnNmb3JtID0gZnVuY3Rpb24gKGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgY2IobnVsbCwgY2h1bmspO1xufTsiLCIvLyBDb3B5cmlnaHQgSm95ZW50LCBJbmMuIGFuZCBvdGhlciBOb2RlIGNvbnRyaWJ1dG9ycy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYVxuLy8gY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuLy8gXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG4vLyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG4vLyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0XG4vLyBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGVcbi8vIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkXG4vLyBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTXG4vLyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOXG4vLyBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcbi8vIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUlxuLy8gT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRVxuLy8gVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cbid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBSZWFkYWJsZTtcbi8qPHJlcGxhY2VtZW50PiovXG5cbnZhciBEdXBsZXg7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxuUmVhZGFibGUuUmVhZGFibGVTdGF0ZSA9IFJlYWRhYmxlU3RhdGU7XG4vKjxyZXBsYWNlbWVudD4qL1xuXG52YXIgRUUgPSByZXF1aXJlKCdldmVudHMnKS5FdmVudEVtaXR0ZXI7XG5cbnZhciBFRWxpc3RlbmVyQ291bnQgPSBmdW5jdGlvbiBFRWxpc3RlbmVyQ291bnQoZW1pdHRlciwgdHlwZSkge1xuICByZXR1cm4gZW1pdHRlci5saXN0ZW5lcnModHlwZSkubGVuZ3RoO1xufTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG4vKjxyZXBsYWNlbWVudD4qL1xuXG5cbnZhciBTdHJlYW0gPSByZXF1aXJlKCcuL2ludGVybmFsL3N0cmVhbXMvc3RyZWFtJyk7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxuXG52YXIgQnVmZmVyID0gcmVxdWlyZSgnYnVmZmVyJykuQnVmZmVyO1xuXG52YXIgT3VyVWludDhBcnJheSA9IGdsb2JhbC5VaW50OEFycmF5IHx8IGZ1bmN0aW9uICgpIHt9O1xuXG5mdW5jdGlvbiBfdWludDhBcnJheVRvQnVmZmVyKGNodW5rKSB7XG4gIHJldHVybiBCdWZmZXIuZnJvbShjaHVuayk7XG59XG5cbmZ1bmN0aW9uIF9pc1VpbnQ4QXJyYXkob2JqKSB7XG4gIHJldHVybiBCdWZmZXIuaXNCdWZmZXIob2JqKSB8fCBvYmogaW5zdGFuY2VvZiBPdXJVaW50OEFycmF5O1xufVxuLyo8cmVwbGFjZW1lbnQ+Ki9cblxuXG52YXIgZGVidWdVdGlsID0gcmVxdWlyZSgndXRpbCcpO1xuXG52YXIgZGVidWc7XG5cbmlmIChkZWJ1Z1V0aWwgJiYgZGVidWdVdGlsLmRlYnVnbG9nKSB7XG4gIGRlYnVnID0gZGVidWdVdGlsLmRlYnVnbG9nKCdzdHJlYW0nKTtcbn0gZWxzZSB7XG4gIGRlYnVnID0gZnVuY3Rpb24gZGVidWcoKSB7fTtcbn1cbi8qPC9yZXBsYWNlbWVudD4qL1xuXG5cbnZhciBCdWZmZXJMaXN0ID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9zdHJlYW1zL2J1ZmZlcl9saXN0Jyk7XG5cbnZhciBkZXN0cm95SW1wbCA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvc3RyZWFtcy9kZXN0cm95Jyk7XG5cbnZhciBfcmVxdWlyZSA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvc3RyZWFtcy9zdGF0ZScpLFxuICAgIGdldEhpZ2hXYXRlck1hcmsgPSBfcmVxdWlyZS5nZXRIaWdoV2F0ZXJNYXJrO1xuXG52YXIgX3JlcXVpcmUkY29kZXMgPSByZXF1aXJlKCcuLi9lcnJvcnMnKS5jb2RlcyxcbiAgICBFUlJfSU5WQUxJRF9BUkdfVFlQRSA9IF9yZXF1aXJlJGNvZGVzLkVSUl9JTlZBTElEX0FSR19UWVBFLFxuICAgIEVSUl9TVFJFQU1fUFVTSF9BRlRFUl9FT0YgPSBfcmVxdWlyZSRjb2Rlcy5FUlJfU1RSRUFNX1BVU0hfQUZURVJfRU9GLFxuICAgIEVSUl9NRVRIT0RfTk9UX0lNUExFTUVOVEVEID0gX3JlcXVpcmUkY29kZXMuRVJSX01FVEhPRF9OT1RfSU1QTEVNRU5URUQsXG4gICAgRVJSX1NUUkVBTV9VTlNISUZUX0FGVEVSX0VORF9FVkVOVCA9IF9yZXF1aXJlJGNvZGVzLkVSUl9TVFJFQU1fVU5TSElGVF9BRlRFUl9FTkRfRVZFTlQ7IC8vIExhenkgbG9hZGVkIHRvIGltcHJvdmUgdGhlIHN0YXJ0dXAgcGVyZm9ybWFuY2UuXG5cblxudmFyIFN0cmluZ0RlY29kZXI7XG52YXIgY3JlYXRlUmVhZGFibGVTdHJlYW1Bc3luY0l0ZXJhdG9yO1xudmFyIGZyb207XG5cbnJlcXVpcmUoJ2luaGVyaXRzJykoUmVhZGFibGUsIFN0cmVhbSk7XG5cbnZhciBlcnJvck9yRGVzdHJveSA9IGRlc3Ryb3lJbXBsLmVycm9yT3JEZXN0cm95O1xudmFyIGtQcm94eUV2ZW50cyA9IFsnZXJyb3InLCAnY2xvc2UnLCAnZGVzdHJveScsICdwYXVzZScsICdyZXN1bWUnXTtcblxuZnVuY3Rpb24gcHJlcGVuZExpc3RlbmVyKGVtaXR0ZXIsIGV2ZW50LCBmbikge1xuICAvLyBTYWRseSB0aGlzIGlzIG5vdCBjYWNoZWFibGUgYXMgc29tZSBsaWJyYXJpZXMgYnVuZGxlIHRoZWlyIG93blxuICAvLyBldmVudCBlbWl0dGVyIGltcGxlbWVudGF0aW9uIHdpdGggdGhlbS5cbiAgaWYgKHR5cGVvZiBlbWl0dGVyLnByZXBlbmRMaXN0ZW5lciA9PT0gJ2Z1bmN0aW9uJykgcmV0dXJuIGVtaXR0ZXIucHJlcGVuZExpc3RlbmVyKGV2ZW50LCBmbik7IC8vIFRoaXMgaXMgYSBoYWNrIHRvIG1ha2Ugc3VyZSB0aGF0IG91ciBlcnJvciBoYW5kbGVyIGlzIGF0dGFjaGVkIGJlZm9yZSBhbnlcbiAgLy8gdXNlcmxhbmQgb25lcy4gIE5FVkVSIERPIFRISVMuIFRoaXMgaXMgaGVyZSBvbmx5IGJlY2F1c2UgdGhpcyBjb2RlIG5lZWRzXG4gIC8vIHRvIGNvbnRpbnVlIHRvIHdvcmsgd2l0aCBvbGRlciB2ZXJzaW9ucyBvZiBOb2RlLmpzIHRoYXQgZG8gbm90IGluY2x1ZGVcbiAgLy8gdGhlIHByZXBlbmRMaXN0ZW5lcigpIG1ldGhvZC4gVGhlIGdvYWwgaXMgdG8gZXZlbnR1YWxseSByZW1vdmUgdGhpcyBoYWNrLlxuXG4gIGlmICghZW1pdHRlci5fZXZlbnRzIHx8ICFlbWl0dGVyLl9ldmVudHNbZXZlbnRdKSBlbWl0dGVyLm9uKGV2ZW50LCBmbik7ZWxzZSBpZiAoQXJyYXkuaXNBcnJheShlbWl0dGVyLl9ldmVudHNbZXZlbnRdKSkgZW1pdHRlci5fZXZlbnRzW2V2ZW50XS51bnNoaWZ0KGZuKTtlbHNlIGVtaXR0ZXIuX2V2ZW50c1tldmVudF0gPSBbZm4sIGVtaXR0ZXIuX2V2ZW50c1tldmVudF1dO1xufVxuXG5mdW5jdGlvbiBSZWFkYWJsZVN0YXRlKG9wdGlvbnMsIHN0cmVhbSwgaXNEdXBsZXgpIHtcbiAgRHVwbGV4ID0gRHVwbGV4IHx8IHJlcXVpcmUoJy4vX3N0cmVhbV9kdXBsZXgnKTtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307IC8vIER1cGxleCBzdHJlYW1zIGFyZSBib3RoIHJlYWRhYmxlIGFuZCB3cml0YWJsZSwgYnV0IHNoYXJlXG4gIC8vIHRoZSBzYW1lIG9wdGlvbnMgb2JqZWN0LlxuICAvLyBIb3dldmVyLCBzb21lIGNhc2VzIHJlcXVpcmUgc2V0dGluZyBvcHRpb25zIHRvIGRpZmZlcmVudFxuICAvLyB2YWx1ZXMgZm9yIHRoZSByZWFkYWJsZSBhbmQgdGhlIHdyaXRhYmxlIHNpZGVzIG9mIHRoZSBkdXBsZXggc3RyZWFtLlxuICAvLyBUaGVzZSBvcHRpb25zIGNhbiBiZSBwcm92aWRlZCBzZXBhcmF0ZWx5IGFzIHJlYWRhYmxlWFhYIGFuZCB3cml0YWJsZVhYWC5cblxuICBpZiAodHlwZW9mIGlzRHVwbGV4ICE9PSAnYm9vbGVhbicpIGlzRHVwbGV4ID0gc3RyZWFtIGluc3RhbmNlb2YgRHVwbGV4OyAvLyBvYmplY3Qgc3RyZWFtIGZsYWcuIFVzZWQgdG8gbWFrZSByZWFkKG4pIGlnbm9yZSBuIGFuZCB0b1xuICAvLyBtYWtlIGFsbCB0aGUgYnVmZmVyIG1lcmdpbmcgYW5kIGxlbmd0aCBjaGVja3MgZ28gYXdheVxuXG4gIHRoaXMub2JqZWN0TW9kZSA9ICEhb3B0aW9ucy5vYmplY3RNb2RlO1xuICBpZiAoaXNEdXBsZXgpIHRoaXMub2JqZWN0TW9kZSA9IHRoaXMub2JqZWN0TW9kZSB8fCAhIW9wdGlvbnMucmVhZGFibGVPYmplY3RNb2RlOyAvLyB0aGUgcG9pbnQgYXQgd2hpY2ggaXQgc3RvcHMgY2FsbGluZyBfcmVhZCgpIHRvIGZpbGwgdGhlIGJ1ZmZlclxuICAvLyBOb3RlOiAwIGlzIGEgdmFsaWQgdmFsdWUsIG1lYW5zIFwiZG9uJ3QgY2FsbCBfcmVhZCBwcmVlbXB0aXZlbHkgZXZlclwiXG5cbiAgdGhpcy5oaWdoV2F0ZXJNYXJrID0gZ2V0SGlnaFdhdGVyTWFyayh0aGlzLCBvcHRpb25zLCAncmVhZGFibGVIaWdoV2F0ZXJNYXJrJywgaXNEdXBsZXgpOyAvLyBBIGxpbmtlZCBsaXN0IGlzIHVzZWQgdG8gc3RvcmUgZGF0YSBjaHVua3MgaW5zdGVhZCBvZiBhbiBhcnJheSBiZWNhdXNlIHRoZVxuICAvLyBsaW5rZWQgbGlzdCBjYW4gcmVtb3ZlIGVsZW1lbnRzIGZyb20gdGhlIGJlZ2lubmluZyBmYXN0ZXIgdGhhblxuICAvLyBhcnJheS5zaGlmdCgpXG5cbiAgdGhpcy5idWZmZXIgPSBuZXcgQnVmZmVyTGlzdCgpO1xuICB0aGlzLmxlbmd0aCA9IDA7XG4gIHRoaXMucGlwZXMgPSBudWxsO1xuICB0aGlzLnBpcGVzQ291bnQgPSAwO1xuICB0aGlzLmZsb3dpbmcgPSBudWxsO1xuICB0aGlzLmVuZGVkID0gZmFsc2U7XG4gIHRoaXMuZW5kRW1pdHRlZCA9IGZhbHNlO1xuICB0aGlzLnJlYWRpbmcgPSBmYWxzZTsgLy8gYSBmbGFnIHRvIGJlIGFibGUgdG8gdGVsbCBpZiB0aGUgZXZlbnQgJ3JlYWRhYmxlJy8nZGF0YScgaXMgZW1pdHRlZFxuICAvLyBpbW1lZGlhdGVseSwgb3Igb24gYSBsYXRlciB0aWNrLiAgV2Ugc2V0IHRoaXMgdG8gdHJ1ZSBhdCBmaXJzdCwgYmVjYXVzZVxuICAvLyBhbnkgYWN0aW9ucyB0aGF0IHNob3VsZG4ndCBoYXBwZW4gdW50aWwgXCJsYXRlclwiIHNob3VsZCBnZW5lcmFsbHkgYWxzb1xuICAvLyBub3QgaGFwcGVuIGJlZm9yZSB0aGUgZmlyc3QgcmVhZCBjYWxsLlxuXG4gIHRoaXMuc3luYyA9IHRydWU7IC8vIHdoZW5ldmVyIHdlIHJldHVybiBudWxsLCB0aGVuIHdlIHNldCBhIGZsYWcgdG8gc2F5XG4gIC8vIHRoYXQgd2UncmUgYXdhaXRpbmcgYSAncmVhZGFibGUnIGV2ZW50IGVtaXNzaW9uLlxuXG4gIHRoaXMubmVlZFJlYWRhYmxlID0gZmFsc2U7XG4gIHRoaXMuZW1pdHRlZFJlYWRhYmxlID0gZmFsc2U7XG4gIHRoaXMucmVhZGFibGVMaXN0ZW5pbmcgPSBmYWxzZTtcbiAgdGhpcy5yZXN1bWVTY2hlZHVsZWQgPSBmYWxzZTtcbiAgdGhpcy5wYXVzZWQgPSB0cnVlOyAvLyBTaG91bGQgY2xvc2UgYmUgZW1pdHRlZCBvbiBkZXN0cm95LiBEZWZhdWx0cyB0byB0cnVlLlxuXG4gIHRoaXMuZW1pdENsb3NlID0gb3B0aW9ucy5lbWl0Q2xvc2UgIT09IGZhbHNlOyAvLyBTaG91bGQgLmRlc3Ryb3koKSBiZSBjYWxsZWQgYWZ0ZXIgJ2VuZCcgKGFuZCBwb3RlbnRpYWxseSAnZmluaXNoJylcblxuICB0aGlzLmF1dG9EZXN0cm95ID0gISFvcHRpb25zLmF1dG9EZXN0cm95OyAvLyBoYXMgaXQgYmVlbiBkZXN0cm95ZWRcblxuICB0aGlzLmRlc3Ryb3llZCA9IGZhbHNlOyAvLyBDcnlwdG8gaXMga2luZCBvZiBvbGQgYW5kIGNydXN0eS4gIEhpc3RvcmljYWxseSwgaXRzIGRlZmF1bHQgc3RyaW5nXG4gIC8vIGVuY29kaW5nIGlzICdiaW5hcnknIHNvIHdlIGhhdmUgdG8gbWFrZSB0aGlzIGNvbmZpZ3VyYWJsZS5cbiAgLy8gRXZlcnl0aGluZyBlbHNlIGluIHRoZSB1bml2ZXJzZSB1c2VzICd1dGY4JywgdGhvdWdoLlxuXG4gIHRoaXMuZGVmYXVsdEVuY29kaW5nID0gb3B0aW9ucy5kZWZhdWx0RW5jb2RpbmcgfHwgJ3V0ZjgnOyAvLyB0aGUgbnVtYmVyIG9mIHdyaXRlcnMgdGhhdCBhcmUgYXdhaXRpbmcgYSBkcmFpbiBldmVudCBpbiAucGlwZSgpc1xuXG4gIHRoaXMuYXdhaXREcmFpbiA9IDA7IC8vIGlmIHRydWUsIGEgbWF5YmVSZWFkTW9yZSBoYXMgYmVlbiBzY2hlZHVsZWRcblxuICB0aGlzLnJlYWRpbmdNb3JlID0gZmFsc2U7XG4gIHRoaXMuZGVjb2RlciA9IG51bGw7XG4gIHRoaXMuZW5jb2RpbmcgPSBudWxsO1xuXG4gIGlmIChvcHRpb25zLmVuY29kaW5nKSB7XG4gICAgaWYgKCFTdHJpbmdEZWNvZGVyKSBTdHJpbmdEZWNvZGVyID0gcmVxdWlyZSgnc3RyaW5nX2RlY29kZXIvJykuU3RyaW5nRGVjb2RlcjtcbiAgICB0aGlzLmRlY29kZXIgPSBuZXcgU3RyaW5nRGVjb2RlcihvcHRpb25zLmVuY29kaW5nKTtcbiAgICB0aGlzLmVuY29kaW5nID0gb3B0aW9ucy5lbmNvZGluZztcbiAgfVxufVxuXG5mdW5jdGlvbiBSZWFkYWJsZShvcHRpb25zKSB7XG4gIER1cGxleCA9IER1cGxleCB8fCByZXF1aXJlKCcuL19zdHJlYW1fZHVwbGV4Jyk7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBSZWFkYWJsZSkpIHJldHVybiBuZXcgUmVhZGFibGUob3B0aW9ucyk7IC8vIENoZWNraW5nIGZvciBhIFN0cmVhbS5EdXBsZXggaW5zdGFuY2UgaXMgZmFzdGVyIGhlcmUgaW5zdGVhZCBvZiBpbnNpZGVcbiAgLy8gdGhlIFJlYWRhYmxlU3RhdGUgY29uc3RydWN0b3IsIGF0IGxlYXN0IHdpdGggVjggNi41XG5cbiAgdmFyIGlzRHVwbGV4ID0gdGhpcyBpbnN0YW5jZW9mIER1cGxleDtcbiAgdGhpcy5fcmVhZGFibGVTdGF0ZSA9IG5ldyBSZWFkYWJsZVN0YXRlKG9wdGlvbnMsIHRoaXMsIGlzRHVwbGV4KTsgLy8gbGVnYWN5XG5cbiAgdGhpcy5yZWFkYWJsZSA9IHRydWU7XG5cbiAgaWYgKG9wdGlvbnMpIHtcbiAgICBpZiAodHlwZW9mIG9wdGlvbnMucmVhZCA9PT0gJ2Z1bmN0aW9uJykgdGhpcy5fcmVhZCA9IG9wdGlvbnMucmVhZDtcbiAgICBpZiAodHlwZW9mIG9wdGlvbnMuZGVzdHJveSA9PT0gJ2Z1bmN0aW9uJykgdGhpcy5fZGVzdHJveSA9IG9wdGlvbnMuZGVzdHJveTtcbiAgfVxuXG4gIFN0cmVhbS5jYWxsKHRoaXMpO1xufVxuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoUmVhZGFibGUucHJvdG90eXBlLCAnZGVzdHJveWVkJywge1xuICAvLyBtYWtpbmcgaXQgZXhwbGljaXQgdGhpcyBwcm9wZXJ0eSBpcyBub3QgZW51bWVyYWJsZVxuICAvLyBiZWNhdXNlIG90aGVyd2lzZSBzb21lIHByb3RvdHlwZSBtYW5pcHVsYXRpb24gaW5cbiAgLy8gdXNlcmxhbmQgd2lsbCBmYWlsXG4gIGVudW1lcmFibGU6IGZhbHNlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICBpZiAodGhpcy5fcmVhZGFibGVTdGF0ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX3JlYWRhYmxlU3RhdGUuZGVzdHJveWVkO1xuICB9LFxuICBzZXQ6IGZ1bmN0aW9uIHNldCh2YWx1ZSkge1xuICAgIC8vIHdlIGlnbm9yZSB0aGUgdmFsdWUgaWYgdGhlIHN0cmVhbVxuICAgIC8vIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZCB5ZXRcbiAgICBpZiAoIXRoaXMuX3JlYWRhYmxlU3RhdGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9IC8vIGJhY2t3YXJkIGNvbXBhdGliaWxpdHksIHRoZSB1c2VyIGlzIGV4cGxpY2l0bHlcbiAgICAvLyBtYW5hZ2luZyBkZXN0cm95ZWRcblxuXG4gICAgdGhpcy5fcmVhZGFibGVTdGF0ZS5kZXN0cm95ZWQgPSB2YWx1ZTtcbiAgfVxufSk7XG5SZWFkYWJsZS5wcm90b3R5cGUuZGVzdHJveSA9IGRlc3Ryb3lJbXBsLmRlc3Ryb3k7XG5SZWFkYWJsZS5wcm90b3R5cGUuX3VuZGVzdHJveSA9IGRlc3Ryb3lJbXBsLnVuZGVzdHJveTtcblxuUmVhZGFibGUucHJvdG90eXBlLl9kZXN0cm95ID0gZnVuY3Rpb24gKGVyciwgY2IpIHtcbiAgY2IoZXJyKTtcbn07IC8vIE1hbnVhbGx5IHNob3ZlIHNvbWV0aGluZyBpbnRvIHRoZSByZWFkKCkgYnVmZmVyLlxuLy8gVGhpcyByZXR1cm5zIHRydWUgaWYgdGhlIGhpZ2hXYXRlck1hcmsgaGFzIG5vdCBiZWVuIGhpdCB5ZXQsXG4vLyBzaW1pbGFyIHRvIGhvdyBXcml0YWJsZS53cml0ZSgpIHJldHVybnMgdHJ1ZSBpZiB5b3Ugc2hvdWxkXG4vLyB3cml0ZSgpIHNvbWUgbW9yZS5cblxuXG5SZWFkYWJsZS5wcm90b3R5cGUucHVzaCA9IGZ1bmN0aW9uIChjaHVuaywgZW5jb2RpbmcpIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZTtcbiAgdmFyIHNraXBDaHVua0NoZWNrO1xuXG4gIGlmICghc3RhdGUub2JqZWN0TW9kZSkge1xuICAgIGlmICh0eXBlb2YgY2h1bmsgPT09ICdzdHJpbmcnKSB7XG4gICAgICBlbmNvZGluZyA9IGVuY29kaW5nIHx8IHN0YXRlLmRlZmF1bHRFbmNvZGluZztcblxuICAgICAgaWYgKGVuY29kaW5nICE9PSBzdGF0ZS5lbmNvZGluZykge1xuICAgICAgICBjaHVuayA9IEJ1ZmZlci5mcm9tKGNodW5rLCBlbmNvZGluZyk7XG4gICAgICAgIGVuY29kaW5nID0gJyc7XG4gICAgICB9XG5cbiAgICAgIHNraXBDaHVua0NoZWNrID0gdHJ1ZTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgc2tpcENodW5rQ2hlY2sgPSB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIHJlYWRhYmxlQWRkQ2h1bmsodGhpcywgY2h1bmssIGVuY29kaW5nLCBmYWxzZSwgc2tpcENodW5rQ2hlY2spO1xufTsgLy8gVW5zaGlmdCBzaG91bGQgKmFsd2F5cyogYmUgc29tZXRoaW5nIGRpcmVjdGx5IG91dCBvZiByZWFkKClcblxuXG5SZWFkYWJsZS5wcm90b3R5cGUudW5zaGlmdCA9IGZ1bmN0aW9uIChjaHVuaykge1xuICByZXR1cm4gcmVhZGFibGVBZGRDaHVuayh0aGlzLCBjaHVuaywgbnVsbCwgdHJ1ZSwgZmFsc2UpO1xufTtcblxuZnVuY3Rpb24gcmVhZGFibGVBZGRDaHVuayhzdHJlYW0sIGNodW5rLCBlbmNvZGluZywgYWRkVG9Gcm9udCwgc2tpcENodW5rQ2hlY2spIHtcbiAgZGVidWcoJ3JlYWRhYmxlQWRkQ2h1bmsnLCBjaHVuayk7XG4gIHZhciBzdGF0ZSA9IHN0cmVhbS5fcmVhZGFibGVTdGF0ZTtcblxuICBpZiAoY2h1bmsgPT09IG51bGwpIHtcbiAgICBzdGF0ZS5yZWFkaW5nID0gZmFsc2U7XG4gICAgb25Fb2ZDaHVuayhzdHJlYW0sIHN0YXRlKTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgZXI7XG4gICAgaWYgKCFza2lwQ2h1bmtDaGVjaykgZXIgPSBjaHVua0ludmFsaWQoc3RhdGUsIGNodW5rKTtcblxuICAgIGlmIChlcikge1xuICAgICAgZXJyb3JPckRlc3Ryb3koc3RyZWFtLCBlcik7XG4gICAgfSBlbHNlIGlmIChzdGF0ZS5vYmplY3RNb2RlIHx8IGNodW5rICYmIGNodW5rLmxlbmd0aCA+IDApIHtcbiAgICAgIGlmICh0eXBlb2YgY2h1bmsgIT09ICdzdHJpbmcnICYmICFzdGF0ZS5vYmplY3RNb2RlICYmIE9iamVjdC5nZXRQcm90b3R5cGVPZihjaHVuaykgIT09IEJ1ZmZlci5wcm90b3R5cGUpIHtcbiAgICAgICAgY2h1bmsgPSBfdWludDhBcnJheVRvQnVmZmVyKGNodW5rKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGFkZFRvRnJvbnQpIHtcbiAgICAgICAgaWYgKHN0YXRlLmVuZEVtaXR0ZWQpIGVycm9yT3JEZXN0cm95KHN0cmVhbSwgbmV3IEVSUl9TVFJFQU1fVU5TSElGVF9BRlRFUl9FTkRfRVZFTlQoKSk7ZWxzZSBhZGRDaHVuayhzdHJlYW0sIHN0YXRlLCBjaHVuaywgdHJ1ZSk7XG4gICAgICB9IGVsc2UgaWYgKHN0YXRlLmVuZGVkKSB7XG4gICAgICAgIGVycm9yT3JEZXN0cm95KHN0cmVhbSwgbmV3IEVSUl9TVFJFQU1fUFVTSF9BRlRFUl9FT0YoKSk7XG4gICAgICB9IGVsc2UgaWYgKHN0YXRlLmRlc3Ryb3llZCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdGF0ZS5yZWFkaW5nID0gZmFsc2U7XG5cbiAgICAgICAgaWYgKHN0YXRlLmRlY29kZXIgJiYgIWVuY29kaW5nKSB7XG4gICAgICAgICAgY2h1bmsgPSBzdGF0ZS5kZWNvZGVyLndyaXRlKGNodW5rKTtcbiAgICAgICAgICBpZiAoc3RhdGUub2JqZWN0TW9kZSB8fCBjaHVuay5sZW5ndGggIT09IDApIGFkZENodW5rKHN0cmVhbSwgc3RhdGUsIGNodW5rLCBmYWxzZSk7ZWxzZSBtYXliZVJlYWRNb3JlKHN0cmVhbSwgc3RhdGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGFkZENodW5rKHN0cmVhbSwgc3RhdGUsIGNodW5rLCBmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKCFhZGRUb0Zyb250KSB7XG4gICAgICBzdGF0ZS5yZWFkaW5nID0gZmFsc2U7XG4gICAgICBtYXliZVJlYWRNb3JlKHN0cmVhbSwgc3RhdGUpO1xuICAgIH1cbiAgfSAvLyBXZSBjYW4gcHVzaCBtb3JlIGRhdGEgaWYgd2UgYXJlIGJlbG93IHRoZSBoaWdoV2F0ZXJNYXJrLlxuICAvLyBBbHNvLCBpZiB3ZSBoYXZlIG5vIGRhdGEgeWV0LCB3ZSBjYW4gc3RhbmQgc29tZSBtb3JlIGJ5dGVzLlxuICAvLyBUaGlzIGlzIHRvIHdvcmsgYXJvdW5kIGNhc2VzIHdoZXJlIGh3bT0wLCBzdWNoIGFzIHRoZSByZXBsLlxuXG5cbiAgcmV0dXJuICFzdGF0ZS5lbmRlZCAmJiAoc3RhdGUubGVuZ3RoIDwgc3RhdGUuaGlnaFdhdGVyTWFyayB8fCBzdGF0ZS5sZW5ndGggPT09IDApO1xufVxuXG5mdW5jdGlvbiBhZGRDaHVuayhzdHJlYW0sIHN0YXRlLCBjaHVuaywgYWRkVG9Gcm9udCkge1xuICBpZiAoc3RhdGUuZmxvd2luZyAmJiBzdGF0ZS5sZW5ndGggPT09IDAgJiYgIXN0YXRlLnN5bmMpIHtcbiAgICBzdGF0ZS5hd2FpdERyYWluID0gMDtcbiAgICBzdHJlYW0uZW1pdCgnZGF0YScsIGNodW5rKTtcbiAgfSBlbHNlIHtcbiAgICAvLyB1cGRhdGUgdGhlIGJ1ZmZlciBpbmZvLlxuICAgIHN0YXRlLmxlbmd0aCArPSBzdGF0ZS5vYmplY3RNb2RlID8gMSA6IGNodW5rLmxlbmd0aDtcbiAgICBpZiAoYWRkVG9Gcm9udCkgc3RhdGUuYnVmZmVyLnVuc2hpZnQoY2h1bmspO2Vsc2Ugc3RhdGUuYnVmZmVyLnB1c2goY2h1bmspO1xuICAgIGlmIChzdGF0ZS5uZWVkUmVhZGFibGUpIGVtaXRSZWFkYWJsZShzdHJlYW0pO1xuICB9XG5cbiAgbWF5YmVSZWFkTW9yZShzdHJlYW0sIHN0YXRlKTtcbn1cblxuZnVuY3Rpb24gY2h1bmtJbnZhbGlkKHN0YXRlLCBjaHVuaykge1xuICB2YXIgZXI7XG5cbiAgaWYgKCFfaXNVaW50OEFycmF5KGNodW5rKSAmJiB0eXBlb2YgY2h1bmsgIT09ICdzdHJpbmcnICYmIGNodW5rICE9PSB1bmRlZmluZWQgJiYgIXN0YXRlLm9iamVjdE1vZGUpIHtcbiAgICBlciA9IG5ldyBFUlJfSU5WQUxJRF9BUkdfVFlQRSgnY2h1bmsnLCBbJ3N0cmluZycsICdCdWZmZXInLCAnVWludDhBcnJheSddLCBjaHVuayk7XG4gIH1cblxuICByZXR1cm4gZXI7XG59XG5cblJlYWRhYmxlLnByb3RvdHlwZS5pc1BhdXNlZCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZyA9PT0gZmFsc2U7XG59OyAvLyBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS5cblxuXG5SZWFkYWJsZS5wcm90b3R5cGUuc2V0RW5jb2RpbmcgPSBmdW5jdGlvbiAoZW5jKSB7XG4gIGlmICghU3RyaW5nRGVjb2RlcikgU3RyaW5nRGVjb2RlciA9IHJlcXVpcmUoJ3N0cmluZ19kZWNvZGVyLycpLlN0cmluZ0RlY29kZXI7XG4gIHZhciBkZWNvZGVyID0gbmV3IFN0cmluZ0RlY29kZXIoZW5jKTtcbiAgdGhpcy5fcmVhZGFibGVTdGF0ZS5kZWNvZGVyID0gZGVjb2RlcjsgLy8gSWYgc2V0RW5jb2RpbmcobnVsbCksIGRlY29kZXIuZW5jb2RpbmcgZXF1YWxzIHV0ZjhcblxuICB0aGlzLl9yZWFkYWJsZVN0YXRlLmVuY29kaW5nID0gdGhpcy5fcmVhZGFibGVTdGF0ZS5kZWNvZGVyLmVuY29kaW5nOyAvLyBJdGVyYXRlIG92ZXIgY3VycmVudCBidWZmZXIgdG8gY29udmVydCBhbHJlYWR5IHN0b3JlZCBCdWZmZXJzOlxuXG4gIHZhciBwID0gdGhpcy5fcmVhZGFibGVTdGF0ZS5idWZmZXIuaGVhZDtcbiAgdmFyIGNvbnRlbnQgPSAnJztcblxuICB3aGlsZSAocCAhPT0gbnVsbCkge1xuICAgIGNvbnRlbnQgKz0gZGVjb2Rlci53cml0ZShwLmRhdGEpO1xuICAgIHAgPSBwLm5leHQ7XG4gIH1cblxuICB0aGlzLl9yZWFkYWJsZVN0YXRlLmJ1ZmZlci5jbGVhcigpO1xuXG4gIGlmIChjb250ZW50ICE9PSAnJykgdGhpcy5fcmVhZGFibGVTdGF0ZS5idWZmZXIucHVzaChjb250ZW50KTtcbiAgdGhpcy5fcmVhZGFibGVTdGF0ZS5sZW5ndGggPSBjb250ZW50Lmxlbmd0aDtcbiAgcmV0dXJuIHRoaXM7XG59OyAvLyBEb24ndCByYWlzZSB0aGUgaHdtID4gMUdCXG5cblxudmFyIE1BWF9IV00gPSAweDQwMDAwMDAwO1xuXG5mdW5jdGlvbiBjb21wdXRlTmV3SGlnaFdhdGVyTWFyayhuKSB7XG4gIGlmIChuID49IE1BWF9IV00pIHtcbiAgICAvLyBUT0RPKHJvbmFnKTogVGhyb3cgRVJSX1ZBTFVFX09VVF9PRl9SQU5HRS5cbiAgICBuID0gTUFYX0hXTTtcbiAgfSBlbHNlIHtcbiAgICAvLyBHZXQgdGhlIG5leHQgaGlnaGVzdCBwb3dlciBvZiAyIHRvIHByZXZlbnQgaW5jcmVhc2luZyBod20gZXhjZXNzaXZlbHkgaW5cbiAgICAvLyB0aW55IGFtb3VudHNcbiAgICBuLS07XG4gICAgbiB8PSBuID4+PiAxO1xuICAgIG4gfD0gbiA+Pj4gMjtcbiAgICBuIHw9IG4gPj4+IDQ7XG4gICAgbiB8PSBuID4+PiA4O1xuICAgIG4gfD0gbiA+Pj4gMTY7XG4gICAgbisrO1xuICB9XG5cbiAgcmV0dXJuIG47XG59IC8vIFRoaXMgZnVuY3Rpb24gaXMgZGVzaWduZWQgdG8gYmUgaW5saW5hYmxlLCBzbyBwbGVhc2UgdGFrZSBjYXJlIHdoZW4gbWFraW5nXG4vLyBjaGFuZ2VzIHRvIHRoZSBmdW5jdGlvbiBib2R5LlxuXG5cbmZ1bmN0aW9uIGhvd011Y2hUb1JlYWQobiwgc3RhdGUpIHtcbiAgaWYgKG4gPD0gMCB8fCBzdGF0ZS5sZW5ndGggPT09IDAgJiYgc3RhdGUuZW5kZWQpIHJldHVybiAwO1xuICBpZiAoc3RhdGUub2JqZWN0TW9kZSkgcmV0dXJuIDE7XG5cbiAgaWYgKG4gIT09IG4pIHtcbiAgICAvLyBPbmx5IGZsb3cgb25lIGJ1ZmZlciBhdCBhIHRpbWVcbiAgICBpZiAoc3RhdGUuZmxvd2luZyAmJiBzdGF0ZS5sZW5ndGgpIHJldHVybiBzdGF0ZS5idWZmZXIuaGVhZC5kYXRhLmxlbmd0aDtlbHNlIHJldHVybiBzdGF0ZS5sZW5ndGg7XG4gIH0gLy8gSWYgd2UncmUgYXNraW5nIGZvciBtb3JlIHRoYW4gdGhlIGN1cnJlbnQgaHdtLCB0aGVuIHJhaXNlIHRoZSBod20uXG5cblxuICBpZiAobiA+IHN0YXRlLmhpZ2hXYXRlck1hcmspIHN0YXRlLmhpZ2hXYXRlck1hcmsgPSBjb21wdXRlTmV3SGlnaFdhdGVyTWFyayhuKTtcbiAgaWYgKG4gPD0gc3RhdGUubGVuZ3RoKSByZXR1cm4gbjsgLy8gRG9uJ3QgaGF2ZSBlbm91Z2hcblxuICBpZiAoIXN0YXRlLmVuZGVkKSB7XG4gICAgc3RhdGUubmVlZFJlYWRhYmxlID0gdHJ1ZTtcbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIHJldHVybiBzdGF0ZS5sZW5ndGg7XG59IC8vIHlvdSBjYW4gb3ZlcnJpZGUgZWl0aGVyIHRoaXMgbWV0aG9kLCBvciB0aGUgYXN5bmMgX3JlYWQobikgYmVsb3cuXG5cblxuUmVhZGFibGUucHJvdG90eXBlLnJlYWQgPSBmdW5jdGlvbiAobikge1xuICBkZWJ1ZygncmVhZCcsIG4pO1xuICBuID0gcGFyc2VJbnQobiwgMTApO1xuICB2YXIgc3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuICB2YXIgbk9yaWcgPSBuO1xuICBpZiAobiAhPT0gMCkgc3RhdGUuZW1pdHRlZFJlYWRhYmxlID0gZmFsc2U7IC8vIGlmIHdlJ3JlIGRvaW5nIHJlYWQoMCkgdG8gdHJpZ2dlciBhIHJlYWRhYmxlIGV2ZW50LCBidXQgd2VcbiAgLy8gYWxyZWFkeSBoYXZlIGEgYnVuY2ggb2YgZGF0YSBpbiB0aGUgYnVmZmVyLCB0aGVuIGp1c3QgdHJpZ2dlclxuICAvLyB0aGUgJ3JlYWRhYmxlJyBldmVudCBhbmQgbW92ZSBvbi5cblxuICBpZiAobiA9PT0gMCAmJiBzdGF0ZS5uZWVkUmVhZGFibGUgJiYgKChzdGF0ZS5oaWdoV2F0ZXJNYXJrICE9PSAwID8gc3RhdGUubGVuZ3RoID49IHN0YXRlLmhpZ2hXYXRlck1hcmsgOiBzdGF0ZS5sZW5ndGggPiAwKSB8fCBzdGF0ZS5lbmRlZCkpIHtcbiAgICBkZWJ1ZygncmVhZDogZW1pdFJlYWRhYmxlJywgc3RhdGUubGVuZ3RoLCBzdGF0ZS5lbmRlZCk7XG4gICAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCAmJiBzdGF0ZS5lbmRlZCkgZW5kUmVhZGFibGUodGhpcyk7ZWxzZSBlbWl0UmVhZGFibGUodGhpcyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBuID0gaG93TXVjaFRvUmVhZChuLCBzdGF0ZSk7IC8vIGlmIHdlJ3ZlIGVuZGVkLCBhbmQgd2UncmUgbm93IGNsZWFyLCB0aGVuIGZpbmlzaCBpdCB1cC5cblxuICBpZiAobiA9PT0gMCAmJiBzdGF0ZS5lbmRlZCkge1xuICAgIGlmIChzdGF0ZS5sZW5ndGggPT09IDApIGVuZFJlYWRhYmxlKHRoaXMpO1xuICAgIHJldHVybiBudWxsO1xuICB9IC8vIEFsbCB0aGUgYWN0dWFsIGNodW5rIGdlbmVyYXRpb24gbG9naWMgbmVlZHMgdG8gYmVcbiAgLy8gKmJlbG93KiB0aGUgY2FsbCB0byBfcmVhZC4gIFRoZSByZWFzb24gaXMgdGhhdCBpbiBjZXJ0YWluXG4gIC8vIHN5bnRoZXRpYyBzdHJlYW0gY2FzZXMsIHN1Y2ggYXMgcGFzc3Rocm91Z2ggc3RyZWFtcywgX3JlYWRcbiAgLy8gbWF5IGJlIGEgY29tcGxldGVseSBzeW5jaHJvbm91cyBvcGVyYXRpb24gd2hpY2ggbWF5IGNoYW5nZVxuICAvLyB0aGUgc3RhdGUgb2YgdGhlIHJlYWQgYnVmZmVyLCBwcm92aWRpbmcgZW5vdWdoIGRhdGEgd2hlblxuICAvLyBiZWZvcmUgdGhlcmUgd2FzICpub3QqIGVub3VnaC5cbiAgLy9cbiAgLy8gU28sIHRoZSBzdGVwcyBhcmU6XG4gIC8vIDEuIEZpZ3VyZSBvdXQgd2hhdCB0aGUgc3RhdGUgb2YgdGhpbmdzIHdpbGwgYmUgYWZ0ZXIgd2UgZG9cbiAgLy8gYSByZWFkIGZyb20gdGhlIGJ1ZmZlci5cbiAgLy9cbiAgLy8gMi4gSWYgdGhhdCByZXN1bHRpbmcgc3RhdGUgd2lsbCB0cmlnZ2VyIGEgX3JlYWQsIHRoZW4gY2FsbCBfcmVhZC5cbiAgLy8gTm90ZSB0aGF0IHRoaXMgbWF5IGJlIGFzeW5jaHJvbm91cywgb3Igc3luY2hyb25vdXMuICBZZXMsIGl0IGlzXG4gIC8vIGRlZXBseSB1Z2x5IHRvIHdyaXRlIEFQSXMgdGhpcyB3YXksIGJ1dCB0aGF0IHN0aWxsIGRvZXNuJ3QgbWVhblxuICAvLyB0aGF0IHRoZSBSZWFkYWJsZSBjbGFzcyBzaG91bGQgYmVoYXZlIGltcHJvcGVybHksIGFzIHN0cmVhbXMgYXJlXG4gIC8vIGRlc2lnbmVkIHRvIGJlIHN5bmMvYXN5bmMgYWdub3N0aWMuXG4gIC8vIFRha2Ugbm90ZSBpZiB0aGUgX3JlYWQgY2FsbCBpcyBzeW5jIG9yIGFzeW5jIChpZSwgaWYgdGhlIHJlYWQgY2FsbFxuICAvLyBoYXMgcmV0dXJuZWQgeWV0KSwgc28gdGhhdCB3ZSBrbm93IHdoZXRoZXIgb3Igbm90IGl0J3Mgc2FmZSB0byBlbWl0XG4gIC8vICdyZWFkYWJsZScgZXRjLlxuICAvL1xuICAvLyAzLiBBY3R1YWxseSBwdWxsIHRoZSByZXF1ZXN0ZWQgY2h1bmtzIG91dCBvZiB0aGUgYnVmZmVyIGFuZCByZXR1cm4uXG4gIC8vIGlmIHdlIG5lZWQgYSByZWFkYWJsZSBldmVudCwgdGhlbiB3ZSBuZWVkIHRvIGRvIHNvbWUgcmVhZGluZy5cblxuXG4gIHZhciBkb1JlYWQgPSBzdGF0ZS5uZWVkUmVhZGFibGU7XG4gIGRlYnVnKCduZWVkIHJlYWRhYmxlJywgZG9SZWFkKTsgLy8gaWYgd2UgY3VycmVudGx5IGhhdmUgbGVzcyB0aGFuIHRoZSBoaWdoV2F0ZXJNYXJrLCB0aGVuIGFsc28gcmVhZCBzb21lXG5cbiAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCB8fCBzdGF0ZS5sZW5ndGggLSBuIDwgc3RhdGUuaGlnaFdhdGVyTWFyaykge1xuICAgIGRvUmVhZCA9IHRydWU7XG4gICAgZGVidWcoJ2xlbmd0aCBsZXNzIHRoYW4gd2F0ZXJtYXJrJywgZG9SZWFkKTtcbiAgfSAvLyBob3dldmVyLCBpZiB3ZSd2ZSBlbmRlZCwgdGhlbiB0aGVyZSdzIG5vIHBvaW50LCBhbmQgaWYgd2UncmUgYWxyZWFkeVxuICAvLyByZWFkaW5nLCB0aGVuIGl0J3MgdW5uZWNlc3NhcnkuXG5cblxuICBpZiAoc3RhdGUuZW5kZWQgfHwgc3RhdGUucmVhZGluZykge1xuICAgIGRvUmVhZCA9IGZhbHNlO1xuICAgIGRlYnVnKCdyZWFkaW5nIG9yIGVuZGVkJywgZG9SZWFkKTtcbiAgfSBlbHNlIGlmIChkb1JlYWQpIHtcbiAgICBkZWJ1ZygnZG8gcmVhZCcpO1xuICAgIHN0YXRlLnJlYWRpbmcgPSB0cnVlO1xuICAgIHN0YXRlLnN5bmMgPSB0cnVlOyAvLyBpZiB0aGUgbGVuZ3RoIGlzIGN1cnJlbnRseSB6ZXJvLCB0aGVuIHdlICpuZWVkKiBhIHJlYWRhYmxlIGV2ZW50LlxuXG4gICAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCkgc3RhdGUubmVlZFJlYWRhYmxlID0gdHJ1ZTsgLy8gY2FsbCBpbnRlcm5hbCByZWFkIG1ldGhvZFxuXG4gICAgdGhpcy5fcmVhZChzdGF0ZS5oaWdoV2F0ZXJNYXJrKTtcblxuICAgIHN0YXRlLnN5bmMgPSBmYWxzZTsgLy8gSWYgX3JlYWQgcHVzaGVkIGRhdGEgc3luY2hyb25vdXNseSwgdGhlbiBgcmVhZGluZ2Agd2lsbCBiZSBmYWxzZSxcbiAgICAvLyBhbmQgd2UgbmVlZCB0byByZS1ldmFsdWF0ZSBob3cgbXVjaCBkYXRhIHdlIGNhbiByZXR1cm4gdG8gdGhlIHVzZXIuXG5cbiAgICBpZiAoIXN0YXRlLnJlYWRpbmcpIG4gPSBob3dNdWNoVG9SZWFkKG5PcmlnLCBzdGF0ZSk7XG4gIH1cblxuICB2YXIgcmV0O1xuICBpZiAobiA+IDApIHJldCA9IGZyb21MaXN0KG4sIHN0YXRlKTtlbHNlIHJldCA9IG51bGw7XG5cbiAgaWYgKHJldCA9PT0gbnVsbCkge1xuICAgIHN0YXRlLm5lZWRSZWFkYWJsZSA9IHN0YXRlLmxlbmd0aCA8PSBzdGF0ZS5oaWdoV2F0ZXJNYXJrO1xuICAgIG4gPSAwO1xuICB9IGVsc2Uge1xuICAgIHN0YXRlLmxlbmd0aCAtPSBuO1xuICAgIHN0YXRlLmF3YWl0RHJhaW4gPSAwO1xuICB9XG5cbiAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCkge1xuICAgIC8vIElmIHdlIGhhdmUgbm90aGluZyBpbiB0aGUgYnVmZmVyLCB0aGVuIHdlIHdhbnQgdG8ga25vd1xuICAgIC8vIGFzIHNvb24gYXMgd2UgKmRvKiBnZXQgc29tZXRoaW5nIGludG8gdGhlIGJ1ZmZlci5cbiAgICBpZiAoIXN0YXRlLmVuZGVkKSBzdGF0ZS5uZWVkUmVhZGFibGUgPSB0cnVlOyAvLyBJZiB3ZSB0cmllZCB0byByZWFkKCkgcGFzdCB0aGUgRU9GLCB0aGVuIGVtaXQgZW5kIG9uIHRoZSBuZXh0IHRpY2suXG5cbiAgICBpZiAobk9yaWcgIT09IG4gJiYgc3RhdGUuZW5kZWQpIGVuZFJlYWRhYmxlKHRoaXMpO1xuICB9XG5cbiAgaWYgKHJldCAhPT0gbnVsbCkgdGhpcy5lbWl0KCdkYXRhJywgcmV0KTtcbiAgcmV0dXJuIHJldDtcbn07XG5cbmZ1bmN0aW9uIG9uRW9mQ2h1bmsoc3RyZWFtLCBzdGF0ZSkge1xuICBkZWJ1Zygnb25Fb2ZDaHVuaycpO1xuICBpZiAoc3RhdGUuZW5kZWQpIHJldHVybjtcblxuICBpZiAoc3RhdGUuZGVjb2Rlcikge1xuICAgIHZhciBjaHVuayA9IHN0YXRlLmRlY29kZXIuZW5kKCk7XG5cbiAgICBpZiAoY2h1bmsgJiYgY2h1bmsubGVuZ3RoKSB7XG4gICAgICBzdGF0ZS5idWZmZXIucHVzaChjaHVuayk7XG4gICAgICBzdGF0ZS5sZW5ndGggKz0gc3RhdGUub2JqZWN0TW9kZSA/IDEgOiBjaHVuay5sZW5ndGg7XG4gICAgfVxuICB9XG5cbiAgc3RhdGUuZW5kZWQgPSB0cnVlO1xuXG4gIGlmIChzdGF0ZS5zeW5jKSB7XG4gICAgLy8gaWYgd2UgYXJlIHN5bmMsIHdhaXQgdW50aWwgbmV4dCB0aWNrIHRvIGVtaXQgdGhlIGRhdGEuXG4gICAgLy8gT3RoZXJ3aXNlIHdlIHJpc2sgZW1pdHRpbmcgZGF0YSBpbiB0aGUgZmxvdygpXG4gICAgLy8gdGhlIHJlYWRhYmxlIGNvZGUgdHJpZ2dlcnMgZHVyaW5nIGEgcmVhZCgpIGNhbGxcbiAgICBlbWl0UmVhZGFibGUoc3RyZWFtKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBlbWl0ICdyZWFkYWJsZScgbm93IHRvIG1ha2Ugc3VyZSBpdCBnZXRzIHBpY2tlZCB1cC5cbiAgICBzdGF0ZS5uZWVkUmVhZGFibGUgPSBmYWxzZTtcblxuICAgIGlmICghc3RhdGUuZW1pdHRlZFJlYWRhYmxlKSB7XG4gICAgICBzdGF0ZS5lbWl0dGVkUmVhZGFibGUgPSB0cnVlO1xuICAgICAgZW1pdFJlYWRhYmxlXyhzdHJlYW0pO1xuICAgIH1cbiAgfVxufSAvLyBEb24ndCBlbWl0IHJlYWRhYmxlIHJpZ2h0IGF3YXkgaW4gc3luYyBtb2RlLCBiZWNhdXNlIHRoaXMgY2FuIHRyaWdnZXJcbi8vIGFub3RoZXIgcmVhZCgpIGNhbGwgPT4gc3RhY2sgb3ZlcmZsb3cuICBUaGlzIHdheSwgaXQgbWlnaHQgdHJpZ2dlclxuLy8gYSBuZXh0VGljayByZWN1cnNpb24gd2FybmluZywgYnV0IHRoYXQncyBub3Qgc28gYmFkLlxuXG5cbmZ1bmN0aW9uIGVtaXRSZWFkYWJsZShzdHJlYW0pIHtcbiAgdmFyIHN0YXRlID0gc3RyZWFtLl9yZWFkYWJsZVN0YXRlO1xuICBkZWJ1ZygnZW1pdFJlYWRhYmxlJywgc3RhdGUubmVlZFJlYWRhYmxlLCBzdGF0ZS5lbWl0dGVkUmVhZGFibGUpO1xuICBzdGF0ZS5uZWVkUmVhZGFibGUgPSBmYWxzZTtcblxuICBpZiAoIXN0YXRlLmVtaXR0ZWRSZWFkYWJsZSkge1xuICAgIGRlYnVnKCdlbWl0UmVhZGFibGUnLCBzdGF0ZS5mbG93aW5nKTtcbiAgICBzdGF0ZS5lbWl0dGVkUmVhZGFibGUgPSB0cnVlO1xuICAgIHByb2Nlc3MubmV4dFRpY2soZW1pdFJlYWRhYmxlXywgc3RyZWFtKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBlbWl0UmVhZGFibGVfKHN0cmVhbSkge1xuICB2YXIgc3RhdGUgPSBzdHJlYW0uX3JlYWRhYmxlU3RhdGU7XG4gIGRlYnVnKCdlbWl0UmVhZGFibGVfJywgc3RhdGUuZGVzdHJveWVkLCBzdGF0ZS5sZW5ndGgsIHN0YXRlLmVuZGVkKTtcblxuICBpZiAoIXN0YXRlLmRlc3Ryb3llZCAmJiAoc3RhdGUubGVuZ3RoIHx8IHN0YXRlLmVuZGVkKSkge1xuICAgIHN0cmVhbS5lbWl0KCdyZWFkYWJsZScpO1xuICAgIHN0YXRlLmVtaXR0ZWRSZWFkYWJsZSA9IGZhbHNlO1xuICB9IC8vIFRoZSBzdHJlYW0gbmVlZHMgYW5vdGhlciByZWFkYWJsZSBldmVudCBpZlxuICAvLyAxLiBJdCBpcyBub3QgZmxvd2luZywgYXMgdGhlIGZsb3cgbWVjaGFuaXNtIHdpbGwgdGFrZVxuICAvLyAgICBjYXJlIG9mIGl0LlxuICAvLyAyLiBJdCBpcyBub3QgZW5kZWQuXG4gIC8vIDMuIEl0IGlzIGJlbG93IHRoZSBoaWdoV2F0ZXJNYXJrLCBzbyB3ZSBjYW4gc2NoZWR1bGVcbiAgLy8gICAgYW5vdGhlciByZWFkYWJsZSBsYXRlci5cblxuXG4gIHN0YXRlLm5lZWRSZWFkYWJsZSA9ICFzdGF0ZS5mbG93aW5nICYmICFzdGF0ZS5lbmRlZCAmJiBzdGF0ZS5sZW5ndGggPD0gc3RhdGUuaGlnaFdhdGVyTWFyaztcbiAgZmxvdyhzdHJlYW0pO1xufSAvLyBhdCB0aGlzIHBvaW50LCB0aGUgdXNlciBoYXMgcHJlc3VtYWJseSBzZWVuIHRoZSAncmVhZGFibGUnIGV2ZW50LFxuLy8gYW5kIGNhbGxlZCByZWFkKCkgdG8gY29uc3VtZSBzb21lIGRhdGEuICB0aGF0IG1heSBoYXZlIHRyaWdnZXJlZFxuLy8gaW4gdHVybiBhbm90aGVyIF9yZWFkKG4pIGNhbGwsIGluIHdoaWNoIGNhc2UgcmVhZGluZyA9IHRydWUgaWZcbi8vIGl0J3MgaW4gcHJvZ3Jlc3MuXG4vLyBIb3dldmVyLCBpZiB3ZSdyZSBub3QgZW5kZWQsIG9yIHJlYWRpbmcsIGFuZCB0aGUgbGVuZ3RoIDwgaHdtLFxuLy8gdGhlbiBnbyBhaGVhZCBhbmQgdHJ5IHRvIHJlYWQgc29tZSBtb3JlIHByZWVtcHRpdmVseS5cblxuXG5mdW5jdGlvbiBtYXliZVJlYWRNb3JlKHN0cmVhbSwgc3RhdGUpIHtcbiAgaWYgKCFzdGF0ZS5yZWFkaW5nTW9yZSkge1xuICAgIHN0YXRlLnJlYWRpbmdNb3JlID0gdHJ1ZTtcbiAgICBwcm9jZXNzLm5leHRUaWNrKG1heWJlUmVhZE1vcmVfLCBzdHJlYW0sIHN0YXRlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBtYXliZVJlYWRNb3JlXyhzdHJlYW0sIHN0YXRlKSB7XG4gIC8vIEF0dGVtcHQgdG8gcmVhZCBtb3JlIGRhdGEgaWYgd2Ugc2hvdWxkLlxuICAvL1xuICAvLyBUaGUgY29uZGl0aW9ucyBmb3IgcmVhZGluZyBtb3JlIGRhdGEgYXJlIChvbmUgb2YpOlxuICAvLyAtIE5vdCBlbm91Z2ggZGF0YSBidWZmZXJlZCAoc3RhdGUubGVuZ3RoIDwgc3RhdGUuaGlnaFdhdGVyTWFyaykuIFRoZSBsb29wXG4gIC8vICAgaXMgcmVzcG9uc2libGUgZm9yIGZpbGxpbmcgdGhlIGJ1ZmZlciB3aXRoIGVub3VnaCBkYXRhIGlmIHN1Y2ggZGF0YVxuICAvLyAgIGlzIGF2YWlsYWJsZS4gSWYgaGlnaFdhdGVyTWFyayBpcyAwIGFuZCB3ZSBhcmUgbm90IGluIHRoZSBmbG93aW5nIG1vZGVcbiAgLy8gICB3ZSBzaG91bGQgX25vdF8gYXR0ZW1wdCB0byBidWZmZXIgYW55IGV4dHJhIGRhdGEuIFdlJ2xsIGdldCBtb3JlIGRhdGFcbiAgLy8gICB3aGVuIHRoZSBzdHJlYW0gY29uc3VtZXIgY2FsbHMgcmVhZCgpIGluc3RlYWQuXG4gIC8vIC0gTm8gZGF0YSBpbiB0aGUgYnVmZmVyLCBhbmQgdGhlIHN0cmVhbSBpcyBpbiBmbG93aW5nIG1vZGUuIEluIHRoaXMgbW9kZVxuICAvLyAgIHRoZSBsb29wIGJlbG93IGlzIHJlc3BvbnNpYmxlIGZvciBlbnN1cmluZyByZWFkKCkgaXMgY2FsbGVkLiBGYWlsaW5nIHRvXG4gIC8vICAgY2FsbCByZWFkIGhlcmUgd291bGQgYWJvcnQgdGhlIGZsb3cgYW5kIHRoZXJlJ3Mgbm8gb3RoZXIgbWVjaGFuaXNtIGZvclxuICAvLyAgIGNvbnRpbnVpbmcgdGhlIGZsb3cgaWYgdGhlIHN0cmVhbSBjb25zdW1lciBoYXMganVzdCBzdWJzY3JpYmVkIHRvIHRoZVxuICAvLyAgICdkYXRhJyBldmVudC5cbiAgLy9cbiAgLy8gSW4gYWRkaXRpb24gdG8gdGhlIGFib3ZlIGNvbmRpdGlvbnMgdG8ga2VlcCByZWFkaW5nIGRhdGEsIHRoZSBmb2xsb3dpbmdcbiAgLy8gY29uZGl0aW9ucyBwcmV2ZW50IHRoZSBkYXRhIGZyb20gYmVpbmcgcmVhZDpcbiAgLy8gLSBUaGUgc3RyZWFtIGhhcyBlbmRlZCAoc3RhdGUuZW5kZWQpLlxuICAvLyAtIFRoZXJlIGlzIGFscmVhZHkgYSBwZW5kaW5nICdyZWFkJyBvcGVyYXRpb24gKHN0YXRlLnJlYWRpbmcpLiBUaGlzIGlzIGFcbiAgLy8gICBjYXNlIHdoZXJlIHRoZSB0aGUgc3RyZWFtIGhhcyBjYWxsZWQgdGhlIGltcGxlbWVudGF0aW9uIGRlZmluZWQgX3JlYWQoKVxuICAvLyAgIG1ldGhvZCwgYnV0IHRoZXkgYXJlIHByb2Nlc3NpbmcgdGhlIGNhbGwgYXN5bmNocm9ub3VzbHkgYW5kIGhhdmUgX25vdF9cbiAgLy8gICBjYWxsZWQgcHVzaCgpIHdpdGggbmV3IGRhdGEuIEluIHRoaXMgY2FzZSB3ZSBza2lwIHBlcmZvcm1pbmcgbW9yZVxuICAvLyAgIHJlYWQoKXMuIFRoZSBleGVjdXRpb24gZW5kcyBpbiB0aGlzIG1ldGhvZCBhZ2FpbiBhZnRlciB0aGUgX3JlYWQoKSBlbmRzXG4gIC8vICAgdXAgY2FsbGluZyBwdXNoKCkgd2l0aCBtb3JlIGRhdGEuXG4gIHdoaWxlICghc3RhdGUucmVhZGluZyAmJiAhc3RhdGUuZW5kZWQgJiYgKHN0YXRlLmxlbmd0aCA8IHN0YXRlLmhpZ2hXYXRlck1hcmsgfHwgc3RhdGUuZmxvd2luZyAmJiBzdGF0ZS5sZW5ndGggPT09IDApKSB7XG4gICAgdmFyIGxlbiA9IHN0YXRlLmxlbmd0aDtcbiAgICBkZWJ1ZygnbWF5YmVSZWFkTW9yZSByZWFkIDAnKTtcbiAgICBzdHJlYW0ucmVhZCgwKTtcbiAgICBpZiAobGVuID09PSBzdGF0ZS5sZW5ndGgpIC8vIGRpZG4ndCBnZXQgYW55IGRhdGEsIHN0b3Agc3Bpbm5pbmcuXG4gICAgICBicmVhaztcbiAgfVxuXG4gIHN0YXRlLnJlYWRpbmdNb3JlID0gZmFsc2U7XG59IC8vIGFic3RyYWN0IG1ldGhvZC4gIHRvIGJlIG92ZXJyaWRkZW4gaW4gc3BlY2lmaWMgaW1wbGVtZW50YXRpb24gY2xhc3Nlcy5cbi8vIGNhbGwgY2IoZXIsIGRhdGEpIHdoZXJlIGRhdGEgaXMgPD0gbiBpbiBsZW5ndGguXG4vLyBmb3IgdmlydHVhbCAobm9uLXN0cmluZywgbm9uLWJ1ZmZlcikgc3RyZWFtcywgXCJsZW5ndGhcIiBpcyBzb21ld2hhdFxuLy8gYXJiaXRyYXJ5LCBhbmQgcGVyaGFwcyBub3QgdmVyeSBtZWFuaW5nZnVsLlxuXG5cblJlYWRhYmxlLnByb3RvdHlwZS5fcmVhZCA9IGZ1bmN0aW9uIChuKSB7XG4gIGVycm9yT3JEZXN0cm95KHRoaXMsIG5ldyBFUlJfTUVUSE9EX05PVF9JTVBMRU1FTlRFRCgnX3JlYWQoKScpKTtcbn07XG5cblJlYWRhYmxlLnByb3RvdHlwZS5waXBlID0gZnVuY3Rpb24gKGRlc3QsIHBpcGVPcHRzKSB7XG4gIHZhciBzcmMgPSB0aGlzO1xuICB2YXIgc3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuXG4gIHN3aXRjaCAoc3RhdGUucGlwZXNDb3VudCkge1xuICAgIGNhc2UgMDpcbiAgICAgIHN0YXRlLnBpcGVzID0gZGVzdDtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAxOlxuICAgICAgc3RhdGUucGlwZXMgPSBbc3RhdGUucGlwZXMsIGRlc3RdO1xuICAgICAgYnJlYWs7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgc3RhdGUucGlwZXMucHVzaChkZXN0KTtcbiAgICAgIGJyZWFrO1xuICB9XG5cbiAgc3RhdGUucGlwZXNDb3VudCArPSAxO1xuICBkZWJ1ZygncGlwZSBjb3VudD0lZCBvcHRzPSVqJywgc3RhdGUucGlwZXNDb3VudCwgcGlwZU9wdHMpO1xuICB2YXIgZG9FbmQgPSAoIXBpcGVPcHRzIHx8IHBpcGVPcHRzLmVuZCAhPT0gZmFsc2UpICYmIGRlc3QgIT09IHByb2Nlc3Muc3Rkb3V0ICYmIGRlc3QgIT09IHByb2Nlc3Muc3RkZXJyO1xuICB2YXIgZW5kRm4gPSBkb0VuZCA/IG9uZW5kIDogdW5waXBlO1xuICBpZiAoc3RhdGUuZW5kRW1pdHRlZCkgcHJvY2Vzcy5uZXh0VGljayhlbmRGbik7ZWxzZSBzcmMub25jZSgnZW5kJywgZW5kRm4pO1xuICBkZXN0Lm9uKCd1bnBpcGUnLCBvbnVucGlwZSk7XG5cbiAgZnVuY3Rpb24gb251bnBpcGUocmVhZGFibGUsIHVucGlwZUluZm8pIHtcbiAgICBkZWJ1Zygnb251bnBpcGUnKTtcblxuICAgIGlmIChyZWFkYWJsZSA9PT0gc3JjKSB7XG4gICAgICBpZiAodW5waXBlSW5mbyAmJiB1bnBpcGVJbmZvLmhhc1VucGlwZWQgPT09IGZhbHNlKSB7XG4gICAgICAgIHVucGlwZUluZm8uaGFzVW5waXBlZCA9IHRydWU7XG4gICAgICAgIGNsZWFudXAoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBvbmVuZCgpIHtcbiAgICBkZWJ1Zygnb25lbmQnKTtcbiAgICBkZXN0LmVuZCgpO1xuICB9IC8vIHdoZW4gdGhlIGRlc3QgZHJhaW5zLCBpdCByZWR1Y2VzIHRoZSBhd2FpdERyYWluIGNvdW50ZXJcbiAgLy8gb24gdGhlIHNvdXJjZS4gIFRoaXMgd291bGQgYmUgbW9yZSBlbGVnYW50IHdpdGggYSAub25jZSgpXG4gIC8vIGhhbmRsZXIgaW4gZmxvdygpLCBidXQgYWRkaW5nIGFuZCByZW1vdmluZyByZXBlYXRlZGx5IGlzXG4gIC8vIHRvbyBzbG93LlxuXG5cbiAgdmFyIG9uZHJhaW4gPSBwaXBlT25EcmFpbihzcmMpO1xuICBkZXN0Lm9uKCdkcmFpbicsIG9uZHJhaW4pO1xuICB2YXIgY2xlYW5lZFVwID0gZmFsc2U7XG5cbiAgZnVuY3Rpb24gY2xlYW51cCgpIHtcbiAgICBkZWJ1ZygnY2xlYW51cCcpOyAvLyBjbGVhbnVwIGV2ZW50IGhhbmRsZXJzIG9uY2UgdGhlIHBpcGUgaXMgYnJva2VuXG5cbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdjbG9zZScsIG9uY2xvc2UpO1xuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2ZpbmlzaCcsIG9uZmluaXNoKTtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdkcmFpbicsIG9uZHJhaW4pO1xuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2Vycm9yJywgb25lcnJvcik7XG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcigndW5waXBlJywgb251bnBpcGUpO1xuICAgIHNyYy5yZW1vdmVMaXN0ZW5lcignZW5kJywgb25lbmQpO1xuICAgIHNyYy5yZW1vdmVMaXN0ZW5lcignZW5kJywgdW5waXBlKTtcbiAgICBzcmMucmVtb3ZlTGlzdGVuZXIoJ2RhdGEnLCBvbmRhdGEpO1xuICAgIGNsZWFuZWRVcCA9IHRydWU7IC8vIGlmIHRoZSByZWFkZXIgaXMgd2FpdGluZyBmb3IgYSBkcmFpbiBldmVudCBmcm9tIHRoaXNcbiAgICAvLyBzcGVjaWZpYyB3cml0ZXIsIHRoZW4gaXQgd291bGQgY2F1c2UgaXQgdG8gbmV2ZXIgc3RhcnRcbiAgICAvLyBmbG93aW5nIGFnYWluLlxuICAgIC8vIFNvLCBpZiB0aGlzIGlzIGF3YWl0aW5nIGEgZHJhaW4sIHRoZW4gd2UganVzdCBjYWxsIGl0IG5vdy5cbiAgICAvLyBJZiB3ZSBkb24ndCBrbm93LCB0aGVuIGFzc3VtZSB0aGF0IHdlIGFyZSB3YWl0aW5nIGZvciBvbmUuXG5cbiAgICBpZiAoc3RhdGUuYXdhaXREcmFpbiAmJiAoIWRlc3QuX3dyaXRhYmxlU3RhdGUgfHwgZGVzdC5fd3JpdGFibGVTdGF0ZS5uZWVkRHJhaW4pKSBvbmRyYWluKCk7XG4gIH1cblxuICBzcmMub24oJ2RhdGEnLCBvbmRhdGEpO1xuXG4gIGZ1bmN0aW9uIG9uZGF0YShjaHVuaykge1xuICAgIGRlYnVnKCdvbmRhdGEnKTtcbiAgICB2YXIgcmV0ID0gZGVzdC53cml0ZShjaHVuayk7XG4gICAgZGVidWcoJ2Rlc3Qud3JpdGUnLCByZXQpO1xuXG4gICAgaWYgKHJldCA9PT0gZmFsc2UpIHtcbiAgICAgIC8vIElmIHRoZSB1c2VyIHVucGlwZWQgZHVyaW5nIGBkZXN0LndyaXRlKClgLCBpdCBpcyBwb3NzaWJsZVxuICAgICAgLy8gdG8gZ2V0IHN0dWNrIGluIGEgcGVybWFuZW50bHkgcGF1c2VkIHN0YXRlIGlmIHRoYXQgd3JpdGVcbiAgICAgIC8vIGFsc28gcmV0dXJuZWQgZmFsc2UuXG4gICAgICAvLyA9PiBDaGVjayB3aGV0aGVyIGBkZXN0YCBpcyBzdGlsbCBhIHBpcGluZyBkZXN0aW5hdGlvbi5cbiAgICAgIGlmICgoc3RhdGUucGlwZXNDb3VudCA9PT0gMSAmJiBzdGF0ZS5waXBlcyA9PT0gZGVzdCB8fCBzdGF0ZS5waXBlc0NvdW50ID4gMSAmJiBpbmRleE9mKHN0YXRlLnBpcGVzLCBkZXN0KSAhPT0gLTEpICYmICFjbGVhbmVkVXApIHtcbiAgICAgICAgZGVidWcoJ2ZhbHNlIHdyaXRlIHJlc3BvbnNlLCBwYXVzZScsIHN0YXRlLmF3YWl0RHJhaW4pO1xuICAgICAgICBzdGF0ZS5hd2FpdERyYWluKys7XG4gICAgICB9XG5cbiAgICAgIHNyYy5wYXVzZSgpO1xuICAgIH1cbiAgfSAvLyBpZiB0aGUgZGVzdCBoYXMgYW4gZXJyb3IsIHRoZW4gc3RvcCBwaXBpbmcgaW50byBpdC5cbiAgLy8gaG93ZXZlciwgZG9uJ3Qgc3VwcHJlc3MgdGhlIHRocm93aW5nIGJlaGF2aW9yIGZvciB0aGlzLlxuXG5cbiAgZnVuY3Rpb24gb25lcnJvcihlcikge1xuICAgIGRlYnVnKCdvbmVycm9yJywgZXIpO1xuICAgIHVucGlwZSgpO1xuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2Vycm9yJywgb25lcnJvcik7XG4gICAgaWYgKEVFbGlzdGVuZXJDb3VudChkZXN0LCAnZXJyb3InKSA9PT0gMCkgZXJyb3JPckRlc3Ryb3koZGVzdCwgZXIpO1xuICB9IC8vIE1ha2Ugc3VyZSBvdXIgZXJyb3IgaGFuZGxlciBpcyBhdHRhY2hlZCBiZWZvcmUgdXNlcmxhbmQgb25lcy5cblxuXG4gIHByZXBlbmRMaXN0ZW5lcihkZXN0LCAnZXJyb3InLCBvbmVycm9yKTsgLy8gQm90aCBjbG9zZSBhbmQgZmluaXNoIHNob3VsZCB0cmlnZ2VyIHVucGlwZSwgYnV0IG9ubHkgb25jZS5cblxuICBmdW5jdGlvbiBvbmNsb3NlKCkge1xuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2ZpbmlzaCcsIG9uZmluaXNoKTtcbiAgICB1bnBpcGUoKTtcbiAgfVxuXG4gIGRlc3Qub25jZSgnY2xvc2UnLCBvbmNsb3NlKTtcblxuICBmdW5jdGlvbiBvbmZpbmlzaCgpIHtcbiAgICBkZWJ1Zygnb25maW5pc2gnKTtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdjbG9zZScsIG9uY2xvc2UpO1xuICAgIHVucGlwZSgpO1xuICB9XG5cbiAgZGVzdC5vbmNlKCdmaW5pc2gnLCBvbmZpbmlzaCk7XG5cbiAgZnVuY3Rpb24gdW5waXBlKCkge1xuICAgIGRlYnVnKCd1bnBpcGUnKTtcbiAgICBzcmMudW5waXBlKGRlc3QpO1xuICB9IC8vIHRlbGwgdGhlIGRlc3QgdGhhdCBpdCdzIGJlaW5nIHBpcGVkIHRvXG5cblxuICBkZXN0LmVtaXQoJ3BpcGUnLCBzcmMpOyAvLyBzdGFydCB0aGUgZmxvdyBpZiBpdCBoYXNuJ3QgYmVlbiBzdGFydGVkIGFscmVhZHkuXG5cbiAgaWYgKCFzdGF0ZS5mbG93aW5nKSB7XG4gICAgZGVidWcoJ3BpcGUgcmVzdW1lJyk7XG4gICAgc3JjLnJlc3VtZSgpO1xuICB9XG5cbiAgcmV0dXJuIGRlc3Q7XG59O1xuXG5mdW5jdGlvbiBwaXBlT25EcmFpbihzcmMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIHBpcGVPbkRyYWluRnVuY3Rpb25SZXN1bHQoKSB7XG4gICAgdmFyIHN0YXRlID0gc3JjLl9yZWFkYWJsZVN0YXRlO1xuICAgIGRlYnVnKCdwaXBlT25EcmFpbicsIHN0YXRlLmF3YWl0RHJhaW4pO1xuICAgIGlmIChzdGF0ZS5hd2FpdERyYWluKSBzdGF0ZS5hd2FpdERyYWluLS07XG5cbiAgICBpZiAoc3RhdGUuYXdhaXREcmFpbiA9PT0gMCAmJiBFRWxpc3RlbmVyQ291bnQoc3JjLCAnZGF0YScpKSB7XG4gICAgICBzdGF0ZS5mbG93aW5nID0gdHJ1ZTtcbiAgICAgIGZsb3coc3JjKTtcbiAgICB9XG4gIH07XG59XG5cblJlYWRhYmxlLnByb3RvdHlwZS51bnBpcGUgPSBmdW5jdGlvbiAoZGVzdCkge1xuICB2YXIgc3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuICB2YXIgdW5waXBlSW5mbyA9IHtcbiAgICBoYXNVbnBpcGVkOiBmYWxzZVxuICB9OyAvLyBpZiB3ZSdyZSBub3QgcGlwaW5nIGFueXdoZXJlLCB0aGVuIGRvIG5vdGhpbmcuXG5cbiAgaWYgKHN0YXRlLnBpcGVzQ291bnQgPT09IDApIHJldHVybiB0aGlzOyAvLyBqdXN0IG9uZSBkZXN0aW5hdGlvbi4gIG1vc3QgY29tbW9uIGNhc2UuXG5cbiAgaWYgKHN0YXRlLnBpcGVzQ291bnQgPT09IDEpIHtcbiAgICAvLyBwYXNzZWQgaW4gb25lLCBidXQgaXQncyBub3QgdGhlIHJpZ2h0IG9uZS5cbiAgICBpZiAoZGVzdCAmJiBkZXN0ICE9PSBzdGF0ZS5waXBlcykgcmV0dXJuIHRoaXM7XG4gICAgaWYgKCFkZXN0KSBkZXN0ID0gc3RhdGUucGlwZXM7IC8vIGdvdCBhIG1hdGNoLlxuXG4gICAgc3RhdGUucGlwZXMgPSBudWxsO1xuICAgIHN0YXRlLnBpcGVzQ291bnQgPSAwO1xuICAgIHN0YXRlLmZsb3dpbmcgPSBmYWxzZTtcbiAgICBpZiAoZGVzdCkgZGVzdC5lbWl0KCd1bnBpcGUnLCB0aGlzLCB1bnBpcGVJbmZvKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfSAvLyBzbG93IGNhc2UuIG11bHRpcGxlIHBpcGUgZGVzdGluYXRpb25zLlxuXG5cbiAgaWYgKCFkZXN0KSB7XG4gICAgLy8gcmVtb3ZlIGFsbC5cbiAgICB2YXIgZGVzdHMgPSBzdGF0ZS5waXBlcztcbiAgICB2YXIgbGVuID0gc3RhdGUucGlwZXNDb3VudDtcbiAgICBzdGF0ZS5waXBlcyA9IG51bGw7XG4gICAgc3RhdGUucGlwZXNDb3VudCA9IDA7XG4gICAgc3RhdGUuZmxvd2luZyA9IGZhbHNlO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgZGVzdHNbaV0uZW1pdCgndW5waXBlJywgdGhpcywge1xuICAgICAgICBoYXNVbnBpcGVkOiBmYWxzZVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH0gLy8gdHJ5IHRvIGZpbmQgdGhlIHJpZ2h0IG9uZS5cblxuXG4gIHZhciBpbmRleCA9IGluZGV4T2Yoc3RhdGUucGlwZXMsIGRlc3QpO1xuICBpZiAoaW5kZXggPT09IC0xKSByZXR1cm4gdGhpcztcbiAgc3RhdGUucGlwZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgc3RhdGUucGlwZXNDb3VudCAtPSAxO1xuICBpZiAoc3RhdGUucGlwZXNDb3VudCA9PT0gMSkgc3RhdGUucGlwZXMgPSBzdGF0ZS5waXBlc1swXTtcbiAgZGVzdC5lbWl0KCd1bnBpcGUnLCB0aGlzLCB1bnBpcGVJbmZvKTtcbiAgcmV0dXJuIHRoaXM7XG59OyAvLyBzZXQgdXAgZGF0YSBldmVudHMgaWYgdGhleSBhcmUgYXNrZWQgZm9yXG4vLyBFbnN1cmUgcmVhZGFibGUgbGlzdGVuZXJzIGV2ZW50dWFsbHkgZ2V0IHNvbWV0aGluZ1xuXG5cblJlYWRhYmxlLnByb3RvdHlwZS5vbiA9IGZ1bmN0aW9uIChldiwgZm4pIHtcbiAgdmFyIHJlcyA9IFN0cmVhbS5wcm90b3R5cGUub24uY2FsbCh0aGlzLCBldiwgZm4pO1xuICB2YXIgc3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuXG4gIGlmIChldiA9PT0gJ2RhdGEnKSB7XG4gICAgLy8gdXBkYXRlIHJlYWRhYmxlTGlzdGVuaW5nIHNvIHRoYXQgcmVzdW1lKCkgbWF5IGJlIGEgbm8tb3BcbiAgICAvLyBhIGZldyBsaW5lcyBkb3duLiBUaGlzIGlzIG5lZWRlZCB0byBzdXBwb3J0IG9uY2UoJ3JlYWRhYmxlJykuXG4gICAgc3RhdGUucmVhZGFibGVMaXN0ZW5pbmcgPSB0aGlzLmxpc3RlbmVyQ291bnQoJ3JlYWRhYmxlJykgPiAwOyAvLyBUcnkgc3RhcnQgZmxvd2luZyBvbiBuZXh0IHRpY2sgaWYgc3RyZWFtIGlzbid0IGV4cGxpY2l0bHkgcGF1c2VkXG5cbiAgICBpZiAoc3RhdGUuZmxvd2luZyAhPT0gZmFsc2UpIHRoaXMucmVzdW1lKCk7XG4gIH0gZWxzZSBpZiAoZXYgPT09ICdyZWFkYWJsZScpIHtcbiAgICBpZiAoIXN0YXRlLmVuZEVtaXR0ZWQgJiYgIXN0YXRlLnJlYWRhYmxlTGlzdGVuaW5nKSB7XG4gICAgICBzdGF0ZS5yZWFkYWJsZUxpc3RlbmluZyA9IHN0YXRlLm5lZWRSZWFkYWJsZSA9IHRydWU7XG4gICAgICBzdGF0ZS5mbG93aW5nID0gZmFsc2U7XG4gICAgICBzdGF0ZS5lbWl0dGVkUmVhZGFibGUgPSBmYWxzZTtcbiAgICAgIGRlYnVnKCdvbiByZWFkYWJsZScsIHN0YXRlLmxlbmd0aCwgc3RhdGUucmVhZGluZyk7XG5cbiAgICAgIGlmIChzdGF0ZS5sZW5ndGgpIHtcbiAgICAgICAgZW1pdFJlYWRhYmxlKHRoaXMpO1xuICAgICAgfSBlbHNlIGlmICghc3RhdGUucmVhZGluZykge1xuICAgICAgICBwcm9jZXNzLm5leHRUaWNrKG5SZWFkaW5nTmV4dFRpY2ssIHRoaXMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXM7XG59O1xuXG5SZWFkYWJsZS5wcm90b3R5cGUuYWRkTGlzdGVuZXIgPSBSZWFkYWJsZS5wcm90b3R5cGUub247XG5cblJlYWRhYmxlLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lciA9IGZ1bmN0aW9uIChldiwgZm4pIHtcbiAgdmFyIHJlcyA9IFN0cmVhbS5wcm90b3R5cGUucmVtb3ZlTGlzdGVuZXIuY2FsbCh0aGlzLCBldiwgZm4pO1xuXG4gIGlmIChldiA9PT0gJ3JlYWRhYmxlJykge1xuICAgIC8vIFdlIG5lZWQgdG8gY2hlY2sgaWYgdGhlcmUgaXMgc29tZW9uZSBzdGlsbCBsaXN0ZW5pbmcgdG9cbiAgICAvLyByZWFkYWJsZSBhbmQgcmVzZXQgdGhlIHN0YXRlLiBIb3dldmVyIHRoaXMgbmVlZHMgdG8gaGFwcGVuXG4gICAgLy8gYWZ0ZXIgcmVhZGFibGUgaGFzIGJlZW4gZW1pdHRlZCBidXQgYmVmb3JlIEkvTyAobmV4dFRpY2spIHRvXG4gICAgLy8gc3VwcG9ydCBvbmNlKCdyZWFkYWJsZScsIGZuKSBjeWNsZXMuIFRoaXMgbWVhbnMgdGhhdCBjYWxsaW5nXG4gICAgLy8gcmVzdW1lIHdpdGhpbiB0aGUgc2FtZSB0aWNrIHdpbGwgaGF2ZSBub1xuICAgIC8vIGVmZmVjdC5cbiAgICBwcm9jZXNzLm5leHRUaWNrKHVwZGF0ZVJlYWRhYmxlTGlzdGVuaW5nLCB0aGlzKTtcbiAgfVxuXG4gIHJldHVybiByZXM7XG59O1xuXG5SZWFkYWJsZS5wcm90b3R5cGUucmVtb3ZlQWxsTGlzdGVuZXJzID0gZnVuY3Rpb24gKGV2KSB7XG4gIHZhciByZXMgPSBTdHJlYW0ucHJvdG90eXBlLnJlbW92ZUFsbExpc3RlbmVycy5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXG4gIGlmIChldiA9PT0gJ3JlYWRhYmxlJyB8fCBldiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgLy8gV2UgbmVlZCB0byBjaGVjayBpZiB0aGVyZSBpcyBzb21lb25lIHN0aWxsIGxpc3RlbmluZyB0b1xuICAgIC8vIHJlYWRhYmxlIGFuZCByZXNldCB0aGUgc3RhdGUuIEhvd2V2ZXIgdGhpcyBuZWVkcyB0byBoYXBwZW5cbiAgICAvLyBhZnRlciByZWFkYWJsZSBoYXMgYmVlbiBlbWl0dGVkIGJ1dCBiZWZvcmUgSS9PIChuZXh0VGljaykgdG9cbiAgICAvLyBzdXBwb3J0IG9uY2UoJ3JlYWRhYmxlJywgZm4pIGN5Y2xlcy4gVGhpcyBtZWFucyB0aGF0IGNhbGxpbmdcbiAgICAvLyByZXN1bWUgd2l0aGluIHRoZSBzYW1lIHRpY2sgd2lsbCBoYXZlIG5vXG4gICAgLy8gZWZmZWN0LlxuICAgIHByb2Nlc3MubmV4dFRpY2sodXBkYXRlUmVhZGFibGVMaXN0ZW5pbmcsIHRoaXMpO1xuICB9XG5cbiAgcmV0dXJuIHJlcztcbn07XG5cbmZ1bmN0aW9uIHVwZGF0ZVJlYWRhYmxlTGlzdGVuaW5nKHNlbGYpIHtcbiAgdmFyIHN0YXRlID0gc2VsZi5fcmVhZGFibGVTdGF0ZTtcbiAgc3RhdGUucmVhZGFibGVMaXN0ZW5pbmcgPSBzZWxmLmxpc3RlbmVyQ291bnQoJ3JlYWRhYmxlJykgPiAwO1xuXG4gIGlmIChzdGF0ZS5yZXN1bWVTY2hlZHVsZWQgJiYgIXN0YXRlLnBhdXNlZCkge1xuICAgIC8vIGZsb3dpbmcgbmVlZHMgdG8gYmUgc2V0IHRvIHRydWUgbm93LCBvdGhlcndpc2VcbiAgICAvLyB0aGUgdXBjb21pbmcgcmVzdW1lIHdpbGwgbm90IGZsb3cuXG4gICAgc3RhdGUuZmxvd2luZyA9IHRydWU7IC8vIGNydWRlIHdheSB0byBjaGVjayBpZiB3ZSBzaG91bGQgcmVzdW1lXG4gIH0gZWxzZSBpZiAoc2VsZi5saXN0ZW5lckNvdW50KCdkYXRhJykgPiAwKSB7XG4gICAgc2VsZi5yZXN1bWUoKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBuUmVhZGluZ05leHRUaWNrKHNlbGYpIHtcbiAgZGVidWcoJ3JlYWRhYmxlIG5leHR0aWNrIHJlYWQgMCcpO1xuICBzZWxmLnJlYWQoMCk7XG59IC8vIHBhdXNlKCkgYW5kIHJlc3VtZSgpIGFyZSByZW1uYW50cyBvZiB0aGUgbGVnYWN5IHJlYWRhYmxlIHN0cmVhbSBBUElcbi8vIElmIHRoZSB1c2VyIHVzZXMgdGhlbSwgdGhlbiBzd2l0Y2ggaW50byBvbGQgbW9kZS5cblxuXG5SZWFkYWJsZS5wcm90b3R5cGUucmVzdW1lID0gZnVuY3Rpb24gKCkge1xuICB2YXIgc3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuXG4gIGlmICghc3RhdGUuZmxvd2luZykge1xuICAgIGRlYnVnKCdyZXN1bWUnKTsgLy8gd2UgZmxvdyBvbmx5IGlmIHRoZXJlIGlzIG5vIG9uZSBsaXN0ZW5pbmdcbiAgICAvLyBmb3IgcmVhZGFibGUsIGJ1dCB3ZSBzdGlsbCBoYXZlIHRvIGNhbGxcbiAgICAvLyByZXN1bWUoKVxuXG4gICAgc3RhdGUuZmxvd2luZyA9ICFzdGF0ZS5yZWFkYWJsZUxpc3RlbmluZztcbiAgICByZXN1bWUodGhpcywgc3RhdGUpO1xuICB9XG5cbiAgc3RhdGUucGF1c2VkID0gZmFsc2U7XG4gIHJldHVybiB0aGlzO1xufTtcblxuZnVuY3Rpb24gcmVzdW1lKHN0cmVhbSwgc3RhdGUpIHtcbiAgaWYgKCFzdGF0ZS5yZXN1bWVTY2hlZHVsZWQpIHtcbiAgICBzdGF0ZS5yZXN1bWVTY2hlZHVsZWQgPSB0cnVlO1xuICAgIHByb2Nlc3MubmV4dFRpY2socmVzdW1lXywgc3RyZWFtLCBzdGF0ZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVzdW1lXyhzdHJlYW0sIHN0YXRlKSB7XG4gIGRlYnVnKCdyZXN1bWUnLCBzdGF0ZS5yZWFkaW5nKTtcblxuICBpZiAoIXN0YXRlLnJlYWRpbmcpIHtcbiAgICBzdHJlYW0ucmVhZCgwKTtcbiAgfVxuXG4gIHN0YXRlLnJlc3VtZVNjaGVkdWxlZCA9IGZhbHNlO1xuICBzdHJlYW0uZW1pdCgncmVzdW1lJyk7XG4gIGZsb3coc3RyZWFtKTtcbiAgaWYgKHN0YXRlLmZsb3dpbmcgJiYgIXN0YXRlLnJlYWRpbmcpIHN0cmVhbS5yZWFkKDApO1xufVxuXG5SZWFkYWJsZS5wcm90b3R5cGUucGF1c2UgPSBmdW5jdGlvbiAoKSB7XG4gIGRlYnVnKCdjYWxsIHBhdXNlIGZsb3dpbmc9JWonLCB0aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmcpO1xuXG4gIGlmICh0aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmcgIT09IGZhbHNlKSB7XG4gICAgZGVidWcoJ3BhdXNlJyk7XG4gICAgdGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nID0gZmFsc2U7XG4gICAgdGhpcy5lbWl0KCdwYXVzZScpO1xuICB9XG5cbiAgdGhpcy5fcmVhZGFibGVTdGF0ZS5wYXVzZWQgPSB0cnVlO1xuICByZXR1cm4gdGhpcztcbn07XG5cbmZ1bmN0aW9uIGZsb3coc3RyZWFtKSB7XG4gIHZhciBzdGF0ZSA9IHN0cmVhbS5fcmVhZGFibGVTdGF0ZTtcbiAgZGVidWcoJ2Zsb3cnLCBzdGF0ZS5mbG93aW5nKTtcblxuICB3aGlsZSAoc3RhdGUuZmxvd2luZyAmJiBzdHJlYW0ucmVhZCgpICE9PSBudWxsKSB7XG4gICAgO1xuICB9XG59IC8vIHdyYXAgYW4gb2xkLXN0eWxlIHN0cmVhbSBhcyB0aGUgYXN5bmMgZGF0YSBzb3VyY2UuXG4vLyBUaGlzIGlzICpub3QqIHBhcnQgb2YgdGhlIHJlYWRhYmxlIHN0cmVhbSBpbnRlcmZhY2UuXG4vLyBJdCBpcyBhbiB1Z2x5IHVuZm9ydHVuYXRlIG1lc3Mgb2YgaGlzdG9yeS5cblxuXG5SZWFkYWJsZS5wcm90b3R5cGUud3JhcCA9IGZ1bmN0aW9uIChzdHJlYW0pIHtcbiAgdmFyIF90aGlzID0gdGhpcztcblxuICB2YXIgc3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuICB2YXIgcGF1c2VkID0gZmFsc2U7XG4gIHN0cmVhbS5vbignZW5kJywgZnVuY3Rpb24gKCkge1xuICAgIGRlYnVnKCd3cmFwcGVkIGVuZCcpO1xuXG4gICAgaWYgKHN0YXRlLmRlY29kZXIgJiYgIXN0YXRlLmVuZGVkKSB7XG4gICAgICB2YXIgY2h1bmsgPSBzdGF0ZS5kZWNvZGVyLmVuZCgpO1xuICAgICAgaWYgKGNodW5rICYmIGNodW5rLmxlbmd0aCkgX3RoaXMucHVzaChjaHVuayk7XG4gICAgfVxuXG4gICAgX3RoaXMucHVzaChudWxsKTtcbiAgfSk7XG4gIHN0cmVhbS5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykge1xuICAgIGRlYnVnKCd3cmFwcGVkIGRhdGEnKTtcbiAgICBpZiAoc3RhdGUuZGVjb2RlcikgY2h1bmsgPSBzdGF0ZS5kZWNvZGVyLndyaXRlKGNodW5rKTsgLy8gZG9uJ3Qgc2tpcCBvdmVyIGZhbHN5IHZhbHVlcyBpbiBvYmplY3RNb2RlXG5cbiAgICBpZiAoc3RhdGUub2JqZWN0TW9kZSAmJiAoY2h1bmsgPT09IG51bGwgfHwgY2h1bmsgPT09IHVuZGVmaW5lZCkpIHJldHVybjtlbHNlIGlmICghc3RhdGUub2JqZWN0TW9kZSAmJiAoIWNodW5rIHx8ICFjaHVuay5sZW5ndGgpKSByZXR1cm47XG5cbiAgICB2YXIgcmV0ID0gX3RoaXMucHVzaChjaHVuayk7XG5cbiAgICBpZiAoIXJldCkge1xuICAgICAgcGF1c2VkID0gdHJ1ZTtcbiAgICAgIHN0cmVhbS5wYXVzZSgpO1xuICAgIH1cbiAgfSk7IC8vIHByb3h5IGFsbCB0aGUgb3RoZXIgbWV0aG9kcy5cbiAgLy8gaW1wb3J0YW50IHdoZW4gd3JhcHBpbmcgZmlsdGVycyBhbmQgZHVwbGV4ZXMuXG5cbiAgZm9yICh2YXIgaSBpbiBzdHJlYW0pIHtcbiAgICBpZiAodGhpc1tpXSA9PT0gdW5kZWZpbmVkICYmIHR5cGVvZiBzdHJlYW1baV0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRoaXNbaV0gPSBmdW5jdGlvbiBtZXRob2RXcmFwKG1ldGhvZCkge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gbWV0aG9kV3JhcFJldHVybkZ1bmN0aW9uKCkge1xuICAgICAgICAgIHJldHVybiBzdHJlYW1bbWV0aG9kXS5hcHBseShzdHJlYW0sIGFyZ3VtZW50cyk7XG4gICAgICAgIH07XG4gICAgICB9KGkpO1xuICAgIH1cbiAgfSAvLyBwcm94eSBjZXJ0YWluIGltcG9ydGFudCBldmVudHMuXG5cblxuICBmb3IgKHZhciBuID0gMDsgbiA8IGtQcm94eUV2ZW50cy5sZW5ndGg7IG4rKykge1xuICAgIHN0cmVhbS5vbihrUHJveHlFdmVudHNbbl0sIHRoaXMuZW1pdC5iaW5kKHRoaXMsIGtQcm94eUV2ZW50c1tuXSkpO1xuICB9IC8vIHdoZW4gd2UgdHJ5IHRvIGNvbnN1bWUgc29tZSBtb3JlIGJ5dGVzLCBzaW1wbHkgdW5wYXVzZSB0aGVcbiAgLy8gdW5kZXJseWluZyBzdHJlYW0uXG5cblxuICB0aGlzLl9yZWFkID0gZnVuY3Rpb24gKG4pIHtcbiAgICBkZWJ1Zygnd3JhcHBlZCBfcmVhZCcsIG4pO1xuXG4gICAgaWYgKHBhdXNlZCkge1xuICAgICAgcGF1c2VkID0gZmFsc2U7XG4gICAgICBzdHJlYW0ucmVzdW1lKCk7XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiB0aGlzO1xufTtcblxuaWYgKHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicpIHtcbiAgUmVhZGFibGUucHJvdG90eXBlW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoY3JlYXRlUmVhZGFibGVTdHJlYW1Bc3luY0l0ZXJhdG9yID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNyZWF0ZVJlYWRhYmxlU3RyZWFtQXN5bmNJdGVyYXRvciA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvc3RyZWFtcy9hc3luY19pdGVyYXRvcicpO1xuICAgIH1cblxuICAgIHJldHVybiBjcmVhdGVSZWFkYWJsZVN0cmVhbUFzeW5jSXRlcmF0b3IodGhpcyk7XG4gIH07XG59XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShSZWFkYWJsZS5wcm90b3R5cGUsICdyZWFkYWJsZUhpZ2hXYXRlck1hcmsnLCB7XG4gIC8vIG1ha2luZyBpdCBleHBsaWNpdCB0aGlzIHByb3BlcnR5IGlzIG5vdCBlbnVtZXJhYmxlXG4gIC8vIGJlY2F1c2Ugb3RoZXJ3aXNlIHNvbWUgcHJvdG90eXBlIG1hbmlwdWxhdGlvbiBpblxuICAvLyB1c2VybGFuZCB3aWxsIGZhaWxcbiAgZW51bWVyYWJsZTogZmFsc2UsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiB0aGlzLl9yZWFkYWJsZVN0YXRlLmhpZ2hXYXRlck1hcms7XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KFJlYWRhYmxlLnByb3RvdHlwZSwgJ3JlYWRhYmxlQnVmZmVyJywge1xuICAvLyBtYWtpbmcgaXQgZXhwbGljaXQgdGhpcyBwcm9wZXJ0eSBpcyBub3QgZW51bWVyYWJsZVxuICAvLyBiZWNhdXNlIG90aGVyd2lzZSBzb21lIHByb3RvdHlwZSBtYW5pcHVsYXRpb24gaW5cbiAgLy8gdXNlcmxhbmQgd2lsbCBmYWlsXG4gIGVudW1lcmFibGU6IGZhbHNlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gdGhpcy5fcmVhZGFibGVTdGF0ZSAmJiB0aGlzLl9yZWFkYWJsZVN0YXRlLmJ1ZmZlcjtcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoUmVhZGFibGUucHJvdG90eXBlLCAncmVhZGFibGVGbG93aW5nJywge1xuICAvLyBtYWtpbmcgaXQgZXhwbGljaXQgdGhpcyBwcm9wZXJ0eSBpcyBub3QgZW51bWVyYWJsZVxuICAvLyBiZWNhdXNlIG90aGVyd2lzZSBzb21lIHByb3RvdHlwZSBtYW5pcHVsYXRpb24gaW5cbiAgLy8gdXNlcmxhbmQgd2lsbCBmYWlsXG4gIGVudW1lcmFibGU6IGZhbHNlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gdGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nO1xuICB9LFxuICBzZXQ6IGZ1bmN0aW9uIHNldChzdGF0ZSkge1xuICAgIGlmICh0aGlzLl9yZWFkYWJsZVN0YXRlKSB7XG4gICAgICB0aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmcgPSBzdGF0ZTtcbiAgICB9XG4gIH1cbn0pOyAvLyBleHBvc2VkIGZvciB0ZXN0aW5nIHB1cnBvc2VzIG9ubHkuXG5cblJlYWRhYmxlLl9mcm9tTGlzdCA9IGZyb21MaXN0O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KFJlYWRhYmxlLnByb3RvdHlwZSwgJ3JlYWRhYmxlTGVuZ3RoJywge1xuICAvLyBtYWtpbmcgaXQgZXhwbGljaXQgdGhpcyBwcm9wZXJ0eSBpcyBub3QgZW51bWVyYWJsZVxuICAvLyBiZWNhdXNlIG90aGVyd2lzZSBzb21lIHByb3RvdHlwZSBtYW5pcHVsYXRpb24gaW5cbiAgLy8gdXNlcmxhbmQgd2lsbCBmYWlsXG4gIGVudW1lcmFibGU6IGZhbHNlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gdGhpcy5fcmVhZGFibGVTdGF0ZS5sZW5ndGg7XG4gIH1cbn0pOyAvLyBQbHVjayBvZmYgbiBieXRlcyBmcm9tIGFuIGFycmF5IG9mIGJ1ZmZlcnMuXG4vLyBMZW5ndGggaXMgdGhlIGNvbWJpbmVkIGxlbmd0aHMgb2YgYWxsIHRoZSBidWZmZXJzIGluIHRoZSBsaXN0LlxuLy8gVGhpcyBmdW5jdGlvbiBpcyBkZXNpZ25lZCB0byBiZSBpbmxpbmFibGUsIHNvIHBsZWFzZSB0YWtlIGNhcmUgd2hlbiBtYWtpbmdcbi8vIGNoYW5nZXMgdG8gdGhlIGZ1bmN0aW9uIGJvZHkuXG5cbmZ1bmN0aW9uIGZyb21MaXN0KG4sIHN0YXRlKSB7XG4gIC8vIG5vdGhpbmcgYnVmZmVyZWRcbiAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCkgcmV0dXJuIG51bGw7XG4gIHZhciByZXQ7XG4gIGlmIChzdGF0ZS5vYmplY3RNb2RlKSByZXQgPSBzdGF0ZS5idWZmZXIuc2hpZnQoKTtlbHNlIGlmICghbiB8fCBuID49IHN0YXRlLmxlbmd0aCkge1xuICAgIC8vIHJlYWQgaXQgYWxsLCB0cnVuY2F0ZSB0aGUgbGlzdFxuICAgIGlmIChzdGF0ZS5kZWNvZGVyKSByZXQgPSBzdGF0ZS5idWZmZXIuam9pbignJyk7ZWxzZSBpZiAoc3RhdGUuYnVmZmVyLmxlbmd0aCA9PT0gMSkgcmV0ID0gc3RhdGUuYnVmZmVyLmZpcnN0KCk7ZWxzZSByZXQgPSBzdGF0ZS5idWZmZXIuY29uY2F0KHN0YXRlLmxlbmd0aCk7XG4gICAgc3RhdGUuYnVmZmVyLmNsZWFyKCk7XG4gIH0gZWxzZSB7XG4gICAgLy8gcmVhZCBwYXJ0IG9mIGxpc3RcbiAgICByZXQgPSBzdGF0ZS5idWZmZXIuY29uc3VtZShuLCBzdGF0ZS5kZWNvZGVyKTtcbiAgfVxuICByZXR1cm4gcmV0O1xufVxuXG5mdW5jdGlvbiBlbmRSZWFkYWJsZShzdHJlYW0pIHtcbiAgdmFyIHN0YXRlID0gc3RyZWFtLl9yZWFkYWJsZVN0YXRlO1xuICBkZWJ1ZygnZW5kUmVhZGFibGUnLCBzdGF0ZS5lbmRFbWl0dGVkKTtcblxuICBpZiAoIXN0YXRlLmVuZEVtaXR0ZWQpIHtcbiAgICBzdGF0ZS5lbmRlZCA9IHRydWU7XG4gICAgcHJvY2Vzcy5uZXh0VGljayhlbmRSZWFkYWJsZU5ULCBzdGF0ZSwgc3RyZWFtKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBlbmRSZWFkYWJsZU5UKHN0YXRlLCBzdHJlYW0pIHtcbiAgZGVidWcoJ2VuZFJlYWRhYmxlTlQnLCBzdGF0ZS5lbmRFbWl0dGVkLCBzdGF0ZS5sZW5ndGgpOyAvLyBDaGVjayB0aGF0IHdlIGRpZG4ndCBnZXQgb25lIGxhc3QgdW5zaGlmdC5cblxuICBpZiAoIXN0YXRlLmVuZEVtaXR0ZWQgJiYgc3RhdGUubGVuZ3RoID09PSAwKSB7XG4gICAgc3RhdGUuZW5kRW1pdHRlZCA9IHRydWU7XG4gICAgc3RyZWFtLnJlYWRhYmxlID0gZmFsc2U7XG4gICAgc3RyZWFtLmVtaXQoJ2VuZCcpO1xuXG4gICAgaWYgKHN0YXRlLmF1dG9EZXN0cm95KSB7XG4gICAgICAvLyBJbiBjYXNlIG9mIGR1cGxleCBzdHJlYW1zIHdlIG5lZWQgYSB3YXkgdG8gZGV0ZWN0XG4gICAgICAvLyBpZiB0aGUgd3JpdGFibGUgc2lkZSBpcyByZWFkeSBmb3IgYXV0b0Rlc3Ryb3kgYXMgd2VsbFxuICAgICAgdmFyIHdTdGF0ZSA9IHN0cmVhbS5fd3JpdGFibGVTdGF0ZTtcblxuICAgICAgaWYgKCF3U3RhdGUgfHwgd1N0YXRlLmF1dG9EZXN0cm95ICYmIHdTdGF0ZS5maW5pc2hlZCkge1xuICAgICAgICBzdHJlYW0uZGVzdHJveSgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5pZiAodHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJykge1xuICBSZWFkYWJsZS5mcm9tID0gZnVuY3Rpb24gKGl0ZXJhYmxlLCBvcHRzKSB7XG4gICAgaWYgKGZyb20gPT09IHVuZGVmaW5lZCkge1xuICAgICAgZnJvbSA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvc3RyZWFtcy9mcm9tJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZyb20oUmVhZGFibGUsIGl0ZXJhYmxlLCBvcHRzKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gaW5kZXhPZih4cywgeCkge1xuICBmb3IgKHZhciBpID0gMCwgbCA9IHhzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIGlmICh4c1tpXSA9PT0geCkgcmV0dXJuIGk7XG4gIH1cblxuICByZXR1cm4gLTE7XG59IiwiLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG4vLyBhIHRyYW5zZm9ybSBzdHJlYW0gaXMgYSByZWFkYWJsZS93cml0YWJsZSBzdHJlYW0gd2hlcmUgeW91IGRvXG4vLyBzb21ldGhpbmcgd2l0aCB0aGUgZGF0YS4gIFNvbWV0aW1lcyBpdCdzIGNhbGxlZCBhIFwiZmlsdGVyXCIsXG4vLyBidXQgdGhhdCdzIG5vdCBhIGdyZWF0IG5hbWUgZm9yIGl0LCBzaW5jZSB0aGF0IGltcGxpZXMgYSB0aGluZyB3aGVyZVxuLy8gc29tZSBiaXRzIHBhc3MgdGhyb3VnaCwgYW5kIG90aGVycyBhcmUgc2ltcGx5IGlnbm9yZWQuICAoVGhhdCB3b3VsZFxuLy8gYmUgYSB2YWxpZCBleGFtcGxlIG9mIGEgdHJhbnNmb3JtLCBvZiBjb3Vyc2UuKVxuLy9cbi8vIFdoaWxlIHRoZSBvdXRwdXQgaXMgY2F1c2FsbHkgcmVsYXRlZCB0byB0aGUgaW5wdXQsIGl0J3Mgbm90IGFcbi8vIG5lY2Vzc2FyaWx5IHN5bW1ldHJpYyBvciBzeW5jaHJvbm91cyB0cmFuc2Zvcm1hdGlvbi4gIEZvciBleGFtcGxlLFxuLy8gYSB6bGliIHN0cmVhbSBtaWdodCB0YWtlIG11bHRpcGxlIHBsYWluLXRleHQgd3JpdGVzKCksIGFuZCB0aGVuXG4vLyBlbWl0IGEgc2luZ2xlIGNvbXByZXNzZWQgY2h1bmsgc29tZSB0aW1lIGluIHRoZSBmdXR1cmUuXG4vL1xuLy8gSGVyZSdzIGhvdyB0aGlzIHdvcmtzOlxuLy9cbi8vIFRoZSBUcmFuc2Zvcm0gc3RyZWFtIGhhcyBhbGwgdGhlIGFzcGVjdHMgb2YgdGhlIHJlYWRhYmxlIGFuZCB3cml0YWJsZVxuLy8gc3RyZWFtIGNsYXNzZXMuICBXaGVuIHlvdSB3cml0ZShjaHVuayksIHRoYXQgY2FsbHMgX3dyaXRlKGNodW5rLGNiKVxuLy8gaW50ZXJuYWxseSwgYW5kIHJldHVybnMgZmFsc2UgaWYgdGhlcmUncyBhIGxvdCBvZiBwZW5kaW5nIHdyaXRlc1xuLy8gYnVmZmVyZWQgdXAuICBXaGVuIHlvdSBjYWxsIHJlYWQoKSwgdGhhdCBjYWxscyBfcmVhZChuKSB1bnRpbFxuLy8gdGhlcmUncyBlbm91Z2ggcGVuZGluZyByZWFkYWJsZSBkYXRhIGJ1ZmZlcmVkIHVwLlxuLy9cbi8vIEluIGEgdHJhbnNmb3JtIHN0cmVhbSwgdGhlIHdyaXR0ZW4gZGF0YSBpcyBwbGFjZWQgaW4gYSBidWZmZXIuICBXaGVuXG4vLyBfcmVhZChuKSBpcyBjYWxsZWQsIGl0IHRyYW5zZm9ybXMgdGhlIHF1ZXVlZCB1cCBkYXRhLCBjYWxsaW5nIHRoZVxuLy8gYnVmZmVyZWQgX3dyaXRlIGNiJ3MgYXMgaXQgY29uc3VtZXMgY2h1bmtzLiAgSWYgY29uc3VtaW5nIGEgc2luZ2xlXG4vLyB3cml0dGVuIGNodW5rIHdvdWxkIHJlc3VsdCBpbiBtdWx0aXBsZSBvdXRwdXQgY2h1bmtzLCB0aGVuIHRoZSBmaXJzdFxuLy8gb3V0cHV0dGVkIGJpdCBjYWxscyB0aGUgcmVhZGNiLCBhbmQgc3Vic2VxdWVudCBjaHVua3MganVzdCBnbyBpbnRvXG4vLyB0aGUgcmVhZCBidWZmZXIsIGFuZCB3aWxsIGNhdXNlIGl0IHRvIGVtaXQgJ3JlYWRhYmxlJyBpZiBuZWNlc3NhcnkuXG4vL1xuLy8gVGhpcyB3YXksIGJhY2stcHJlc3N1cmUgaXMgYWN0dWFsbHkgZGV0ZXJtaW5lZCBieSB0aGUgcmVhZGluZyBzaWRlLFxuLy8gc2luY2UgX3JlYWQgaGFzIHRvIGJlIGNhbGxlZCB0byBzdGFydCBwcm9jZXNzaW5nIGEgbmV3IGNodW5rLiAgSG93ZXZlcixcbi8vIGEgcGF0aG9sb2dpY2FsIGluZmxhdGUgdHlwZSBvZiB0cmFuc2Zvcm0gY2FuIGNhdXNlIGV4Y2Vzc2l2ZSBidWZmZXJpbmdcbi8vIGhlcmUuICBGb3IgZXhhbXBsZSwgaW1hZ2luZSBhIHN0cmVhbSB3aGVyZSBldmVyeSBieXRlIG9mIGlucHV0IGlzXG4vLyBpbnRlcnByZXRlZCBhcyBhbiBpbnRlZ2VyIGZyb20gMC0yNTUsIGFuZCB0aGVuIHJlc3VsdHMgaW4gdGhhdCBtYW55XG4vLyBieXRlcyBvZiBvdXRwdXQuICBXcml0aW5nIHRoZSA0IGJ5dGVzIHtmZixmZixmZixmZn0gd291bGQgcmVzdWx0IGluXG4vLyAxa2Igb2YgZGF0YSBiZWluZyBvdXRwdXQuICBJbiB0aGlzIGNhc2UsIHlvdSBjb3VsZCB3cml0ZSBhIHZlcnkgc21hbGxcbi8vIGFtb3VudCBvZiBpbnB1dCwgYW5kIGVuZCB1cCB3aXRoIGEgdmVyeSBsYXJnZSBhbW91bnQgb2Ygb3V0cHV0LiAgSW5cbi8vIHN1Y2ggYSBwYXRob2xvZ2ljYWwgaW5mbGF0aW5nIG1lY2hhbmlzbSwgdGhlcmUnZCBiZSBubyB3YXkgdG8gdGVsbFxuLy8gdGhlIHN5c3RlbSB0byBzdG9wIGRvaW5nIHRoZSB0cmFuc2Zvcm0uICBBIHNpbmdsZSA0TUIgd3JpdGUgY291bGRcbi8vIGNhdXNlIHRoZSBzeXN0ZW0gdG8gcnVuIG91dCBvZiBtZW1vcnkuXG4vL1xuLy8gSG93ZXZlciwgZXZlbiBpbiBzdWNoIGEgcGF0aG9sb2dpY2FsIGNhc2UsIG9ubHkgYSBzaW5nbGUgd3JpdHRlbiBjaHVua1xuLy8gd291bGQgYmUgY29uc3VtZWQsIGFuZCB0aGVuIHRoZSByZXN0IHdvdWxkIHdhaXQgKHVuLXRyYW5zZm9ybWVkKSB1bnRpbFxuLy8gdGhlIHJlc3VsdHMgb2YgdGhlIHByZXZpb3VzIHRyYW5zZm9ybWVkIGNodW5rIHdlcmUgY29uc3VtZWQuXG4ndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gVHJhbnNmb3JtO1xuXG52YXIgX3JlcXVpcmUkY29kZXMgPSByZXF1aXJlKCcuLi9lcnJvcnMnKS5jb2RlcyxcbiAgICBFUlJfTUVUSE9EX05PVF9JTVBMRU1FTlRFRCA9IF9yZXF1aXJlJGNvZGVzLkVSUl9NRVRIT0RfTk9UX0lNUExFTUVOVEVELFxuICAgIEVSUl9NVUxUSVBMRV9DQUxMQkFDSyA9IF9yZXF1aXJlJGNvZGVzLkVSUl9NVUxUSVBMRV9DQUxMQkFDSyxcbiAgICBFUlJfVFJBTlNGT1JNX0FMUkVBRFlfVFJBTlNGT1JNSU5HID0gX3JlcXVpcmUkY29kZXMuRVJSX1RSQU5TRk9STV9BTFJFQURZX1RSQU5TRk9STUlORyxcbiAgICBFUlJfVFJBTlNGT1JNX1dJVEhfTEVOR1RIXzAgPSBfcmVxdWlyZSRjb2Rlcy5FUlJfVFJBTlNGT1JNX1dJVEhfTEVOR1RIXzA7XG5cbnZhciBEdXBsZXggPSByZXF1aXJlKCcuL19zdHJlYW1fZHVwbGV4Jyk7XG5cbnJlcXVpcmUoJ2luaGVyaXRzJykoVHJhbnNmb3JtLCBEdXBsZXgpO1xuXG5mdW5jdGlvbiBhZnRlclRyYW5zZm9ybShlciwgZGF0YSkge1xuICB2YXIgdHMgPSB0aGlzLl90cmFuc2Zvcm1TdGF0ZTtcbiAgdHMudHJhbnNmb3JtaW5nID0gZmFsc2U7XG4gIHZhciBjYiA9IHRzLndyaXRlY2I7XG5cbiAgaWYgKGNiID09PSBudWxsKSB7XG4gICAgcmV0dXJuIHRoaXMuZW1pdCgnZXJyb3InLCBuZXcgRVJSX01VTFRJUExFX0NBTExCQUNLKCkpO1xuICB9XG5cbiAgdHMud3JpdGVjaHVuayA9IG51bGw7XG4gIHRzLndyaXRlY2IgPSBudWxsO1xuICBpZiAoZGF0YSAhPSBudWxsKSAvLyBzaW5nbGUgZXF1YWxzIGNoZWNrIGZvciBib3RoIGBudWxsYCBhbmQgYHVuZGVmaW5lZGBcbiAgICB0aGlzLnB1c2goZGF0YSk7XG4gIGNiKGVyKTtcbiAgdmFyIHJzID0gdGhpcy5fcmVhZGFibGVTdGF0ZTtcbiAgcnMucmVhZGluZyA9IGZhbHNlO1xuXG4gIGlmIChycy5uZWVkUmVhZGFibGUgfHwgcnMubGVuZ3RoIDwgcnMuaGlnaFdhdGVyTWFyaykge1xuICAgIHRoaXMuX3JlYWQocnMuaGlnaFdhdGVyTWFyayk7XG4gIH1cbn1cblxuZnVuY3Rpb24gVHJhbnNmb3JtKG9wdGlvbnMpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFRyYW5zZm9ybSkpIHJldHVybiBuZXcgVHJhbnNmb3JtKG9wdGlvbnMpO1xuICBEdXBsZXguY2FsbCh0aGlzLCBvcHRpb25zKTtcbiAgdGhpcy5fdHJhbnNmb3JtU3RhdGUgPSB7XG4gICAgYWZ0ZXJUcmFuc2Zvcm06IGFmdGVyVHJhbnNmb3JtLmJpbmQodGhpcyksXG4gICAgbmVlZFRyYW5zZm9ybTogZmFsc2UsXG4gICAgdHJhbnNmb3JtaW5nOiBmYWxzZSxcbiAgICB3cml0ZWNiOiBudWxsLFxuICAgIHdyaXRlY2h1bms6IG51bGwsXG4gICAgd3JpdGVlbmNvZGluZzogbnVsbFxuICB9OyAvLyBzdGFydCBvdXQgYXNraW5nIGZvciBhIHJlYWRhYmxlIGV2ZW50IG9uY2UgZGF0YSBpcyB0cmFuc2Zvcm1lZC5cblxuICB0aGlzLl9yZWFkYWJsZVN0YXRlLm5lZWRSZWFkYWJsZSA9IHRydWU7IC8vIHdlIGhhdmUgaW1wbGVtZW50ZWQgdGhlIF9yZWFkIG1ldGhvZCwgYW5kIGRvbmUgdGhlIG90aGVyIHRoaW5nc1xuICAvLyB0aGF0IFJlYWRhYmxlIHdhbnRzIGJlZm9yZSB0aGUgZmlyc3QgX3JlYWQgY2FsbCwgc28gdW5zZXQgdGhlXG4gIC8vIHN5bmMgZ3VhcmQgZmxhZy5cblxuICB0aGlzLl9yZWFkYWJsZVN0YXRlLnN5bmMgPSBmYWxzZTtcblxuICBpZiAob3B0aW9ucykge1xuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy50cmFuc2Zvcm0gPT09ICdmdW5jdGlvbicpIHRoaXMuX3RyYW5zZm9ybSA9IG9wdGlvbnMudHJhbnNmb3JtO1xuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5mbHVzaCA9PT0gJ2Z1bmN0aW9uJykgdGhpcy5fZmx1c2ggPSBvcHRpb25zLmZsdXNoO1xuICB9IC8vIFdoZW4gdGhlIHdyaXRhYmxlIHNpZGUgZmluaXNoZXMsIHRoZW4gZmx1c2ggb3V0IGFueXRoaW5nIHJlbWFpbmluZy5cblxuXG4gIHRoaXMub24oJ3ByZWZpbmlzaCcsIHByZWZpbmlzaCk7XG59XG5cbmZ1bmN0aW9uIHByZWZpbmlzaCgpIHtcbiAgdmFyIF90aGlzID0gdGhpcztcblxuICBpZiAodHlwZW9mIHRoaXMuX2ZsdXNoID09PSAnZnVuY3Rpb24nICYmICF0aGlzLl9yZWFkYWJsZVN0YXRlLmRlc3Ryb3llZCkge1xuICAgIHRoaXMuX2ZsdXNoKGZ1bmN0aW9uIChlciwgZGF0YSkge1xuICAgICAgZG9uZShfdGhpcywgZXIsIGRhdGEpO1xuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIGRvbmUodGhpcywgbnVsbCwgbnVsbCk7XG4gIH1cbn1cblxuVHJhbnNmb3JtLnByb3RvdHlwZS5wdXNoID0gZnVuY3Rpb24gKGNodW5rLCBlbmNvZGluZykge1xuICB0aGlzLl90cmFuc2Zvcm1TdGF0ZS5uZWVkVHJhbnNmb3JtID0gZmFsc2U7XG4gIHJldHVybiBEdXBsZXgucHJvdG90eXBlLnB1c2guY2FsbCh0aGlzLCBjaHVuaywgZW5jb2RpbmcpO1xufTsgLy8gVGhpcyBpcyB0aGUgcGFydCB3aGVyZSB5b3UgZG8gc3R1ZmYhXG4vLyBvdmVycmlkZSB0aGlzIGZ1bmN0aW9uIGluIGltcGxlbWVudGF0aW9uIGNsYXNzZXMuXG4vLyAnY2h1bmsnIGlzIGFuIGlucHV0IGNodW5rLlxuLy9cbi8vIENhbGwgYHB1c2gobmV3Q2h1bmspYCB0byBwYXNzIGFsb25nIHRyYW5zZm9ybWVkIG91dHB1dFxuLy8gdG8gdGhlIHJlYWRhYmxlIHNpZGUuICBZb3UgbWF5IGNhbGwgJ3B1c2gnIHplcm8gb3IgbW9yZSB0aW1lcy5cbi8vXG4vLyBDYWxsIGBjYihlcnIpYCB3aGVuIHlvdSBhcmUgZG9uZSB3aXRoIHRoaXMgY2h1bmsuICBJZiB5b3UgcGFzc1xuLy8gYW4gZXJyb3IsIHRoZW4gdGhhdCdsbCBwdXQgdGhlIGh1cnQgb24gdGhlIHdob2xlIG9wZXJhdGlvbi4gIElmIHlvdVxuLy8gbmV2ZXIgY2FsbCBjYigpLCB0aGVuIHlvdSdsbCBuZXZlciBnZXQgYW5vdGhlciBjaHVuay5cblxuXG5UcmFuc2Zvcm0ucHJvdG90eXBlLl90cmFuc2Zvcm0gPSBmdW5jdGlvbiAoY2h1bmssIGVuY29kaW5nLCBjYikge1xuICBjYihuZXcgRVJSX01FVEhPRF9OT1RfSU1QTEVNRU5URUQoJ190cmFuc2Zvcm0oKScpKTtcbn07XG5cblRyYW5zZm9ybS5wcm90b3R5cGUuX3dyaXRlID0gZnVuY3Rpb24gKGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgdmFyIHRzID0gdGhpcy5fdHJhbnNmb3JtU3RhdGU7XG4gIHRzLndyaXRlY2IgPSBjYjtcbiAgdHMud3JpdGVjaHVuayA9IGNodW5rO1xuICB0cy53cml0ZWVuY29kaW5nID0gZW5jb2Rpbmc7XG5cbiAgaWYgKCF0cy50cmFuc2Zvcm1pbmcpIHtcbiAgICB2YXIgcnMgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuICAgIGlmICh0cy5uZWVkVHJhbnNmb3JtIHx8IHJzLm5lZWRSZWFkYWJsZSB8fCBycy5sZW5ndGggPCBycy5oaWdoV2F0ZXJNYXJrKSB0aGlzLl9yZWFkKHJzLmhpZ2hXYXRlck1hcmspO1xuICB9XG59OyAvLyBEb2Vzbid0IG1hdHRlciB3aGF0IHRoZSBhcmdzIGFyZSBoZXJlLlxuLy8gX3RyYW5zZm9ybSBkb2VzIGFsbCB0aGUgd29yay5cbi8vIFRoYXQgd2UgZ290IGhlcmUgbWVhbnMgdGhhdCB0aGUgcmVhZGFibGUgc2lkZSB3YW50cyBtb3JlIGRhdGEuXG5cblxuVHJhbnNmb3JtLnByb3RvdHlwZS5fcmVhZCA9IGZ1bmN0aW9uIChuKSB7XG4gIHZhciB0cyA9IHRoaXMuX3RyYW5zZm9ybVN0YXRlO1xuXG4gIGlmICh0cy53cml0ZWNodW5rICE9PSBudWxsICYmICF0cy50cmFuc2Zvcm1pbmcpIHtcbiAgICB0cy50cmFuc2Zvcm1pbmcgPSB0cnVlO1xuXG4gICAgdGhpcy5fdHJhbnNmb3JtKHRzLndyaXRlY2h1bmssIHRzLndyaXRlZW5jb2RpbmcsIHRzLmFmdGVyVHJhbnNmb3JtKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBtYXJrIHRoYXQgd2UgbmVlZCBhIHRyYW5zZm9ybSwgc28gdGhhdCBhbnkgZGF0YSB0aGF0IGNvbWVzIGluXG4gICAgLy8gd2lsbCBnZXQgcHJvY2Vzc2VkLCBub3cgdGhhdCB3ZSd2ZSBhc2tlZCBmb3IgaXQuXG4gICAgdHMubmVlZFRyYW5zZm9ybSA9IHRydWU7XG4gIH1cbn07XG5cblRyYW5zZm9ybS5wcm90b3R5cGUuX2Rlc3Ryb3kgPSBmdW5jdGlvbiAoZXJyLCBjYikge1xuICBEdXBsZXgucHJvdG90eXBlLl9kZXN0cm95LmNhbGwodGhpcywgZXJyLCBmdW5jdGlvbiAoZXJyMikge1xuICAgIGNiKGVycjIpO1xuICB9KTtcbn07XG5cbmZ1bmN0aW9uIGRvbmUoc3RyZWFtLCBlciwgZGF0YSkge1xuICBpZiAoZXIpIHJldHVybiBzdHJlYW0uZW1pdCgnZXJyb3InLCBlcik7XG4gIGlmIChkYXRhICE9IG51bGwpIC8vIHNpbmdsZSBlcXVhbHMgY2hlY2sgZm9yIGJvdGggYG51bGxgIGFuZCBgdW5kZWZpbmVkYFxuICAgIHN0cmVhbS5wdXNoKGRhdGEpOyAvLyBUT0RPKEJyaWRnZUFSKTogV3JpdGUgYSB0ZXN0IGZvciB0aGVzZSB0d28gZXJyb3IgY2FzZXNcbiAgLy8gaWYgdGhlcmUncyBub3RoaW5nIGluIHRoZSB3cml0ZSBidWZmZXIsIHRoZW4gdGhhdCBtZWFuc1xuICAvLyB0aGF0IG5vdGhpbmcgbW9yZSB3aWxsIGV2ZXIgYmUgcHJvdmlkZWRcblxuICBpZiAoc3RyZWFtLl93cml0YWJsZVN0YXRlLmxlbmd0aCkgdGhyb3cgbmV3IEVSUl9UUkFOU0ZPUk1fV0lUSF9MRU5HVEhfMCgpO1xuICBpZiAoc3RyZWFtLl90cmFuc2Zvcm1TdGF0ZS50cmFuc2Zvcm1pbmcpIHRocm93IG5ldyBFUlJfVFJBTlNGT1JNX0FMUkVBRFlfVFJBTlNGT1JNSU5HKCk7XG4gIHJldHVybiBzdHJlYW0ucHVzaChudWxsKTtcbn0iLCIvLyBDb3B5cmlnaHQgSm95ZW50LCBJbmMuIGFuZCBvdGhlciBOb2RlIGNvbnRyaWJ1dG9ycy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYVxuLy8gY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuLy8gXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG4vLyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG4vLyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0XG4vLyBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGVcbi8vIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkXG4vLyBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTXG4vLyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOXG4vLyBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcbi8vIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUlxuLy8gT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRVxuLy8gVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cbi8vIEEgYml0IHNpbXBsZXIgdGhhbiByZWFkYWJsZSBzdHJlYW1zLlxuLy8gSW1wbGVtZW50IGFuIGFzeW5jIC5fd3JpdGUoY2h1bmssIGVuY29kaW5nLCBjYiksIGFuZCBpdCdsbCBoYW5kbGUgYWxsXG4vLyB0aGUgZHJhaW4gZXZlbnQgZW1pc3Npb24gYW5kIGJ1ZmZlcmluZy5cbid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBXcml0YWJsZTtcbi8qIDxyZXBsYWNlbWVudD4gKi9cblxuZnVuY3Rpb24gV3JpdGVSZXEoY2h1bmssIGVuY29kaW5nLCBjYikge1xuICB0aGlzLmNodW5rID0gY2h1bms7XG4gIHRoaXMuZW5jb2RpbmcgPSBlbmNvZGluZztcbiAgdGhpcy5jYWxsYmFjayA9IGNiO1xuICB0aGlzLm5leHQgPSBudWxsO1xufSAvLyBJdCBzZWVtcyBhIGxpbmtlZCBsaXN0IGJ1dCBpdCBpcyBub3Rcbi8vIHRoZXJlIHdpbGwgYmUgb25seSAyIG9mIHRoZXNlIGZvciBlYWNoIHN0cmVhbVxuXG5cbmZ1bmN0aW9uIENvcmtlZFJlcXVlc3Qoc3RhdGUpIHtcbiAgdmFyIF90aGlzID0gdGhpcztcblxuICB0aGlzLm5leHQgPSBudWxsO1xuICB0aGlzLmVudHJ5ID0gbnVsbDtcblxuICB0aGlzLmZpbmlzaCA9IGZ1bmN0aW9uICgpIHtcbiAgICBvbkNvcmtlZEZpbmlzaChfdGhpcywgc3RhdGUpO1xuICB9O1xufVxuLyogPC9yZXBsYWNlbWVudD4gKi9cblxuLyo8cmVwbGFjZW1lbnQ+Ki9cblxuXG52YXIgRHVwbGV4O1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbldyaXRhYmxlLldyaXRhYmxlU3RhdGUgPSBXcml0YWJsZVN0YXRlO1xuLyo8cmVwbGFjZW1lbnQ+Ki9cblxudmFyIGludGVybmFsVXRpbCA9IHtcbiAgZGVwcmVjYXRlOiByZXF1aXJlKCd1dGlsLWRlcHJlY2F0ZScpXG59O1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbi8qPHJlcGxhY2VtZW50PiovXG5cbnZhciBTdHJlYW0gPSByZXF1aXJlKCcuL2ludGVybmFsL3N0cmVhbXMvc3RyZWFtJyk7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxuXG52YXIgQnVmZmVyID0gcmVxdWlyZSgnYnVmZmVyJykuQnVmZmVyO1xuXG52YXIgT3VyVWludDhBcnJheSA9IGdsb2JhbC5VaW50OEFycmF5IHx8IGZ1bmN0aW9uICgpIHt9O1xuXG5mdW5jdGlvbiBfdWludDhBcnJheVRvQnVmZmVyKGNodW5rKSB7XG4gIHJldHVybiBCdWZmZXIuZnJvbShjaHVuayk7XG59XG5cbmZ1bmN0aW9uIF9pc1VpbnQ4QXJyYXkob2JqKSB7XG4gIHJldHVybiBCdWZmZXIuaXNCdWZmZXIob2JqKSB8fCBvYmogaW5zdGFuY2VvZiBPdXJVaW50OEFycmF5O1xufVxuXG52YXIgZGVzdHJveUltcGwgPSByZXF1aXJlKCcuL2ludGVybmFsL3N0cmVhbXMvZGVzdHJveScpO1xuXG52YXIgX3JlcXVpcmUgPSByZXF1aXJlKCcuL2ludGVybmFsL3N0cmVhbXMvc3RhdGUnKSxcbiAgICBnZXRIaWdoV2F0ZXJNYXJrID0gX3JlcXVpcmUuZ2V0SGlnaFdhdGVyTWFyaztcblxudmFyIF9yZXF1aXJlJGNvZGVzID0gcmVxdWlyZSgnLi4vZXJyb3JzJykuY29kZXMsXG4gICAgRVJSX0lOVkFMSURfQVJHX1RZUEUgPSBfcmVxdWlyZSRjb2Rlcy5FUlJfSU5WQUxJRF9BUkdfVFlQRSxcbiAgICBFUlJfTUVUSE9EX05PVF9JTVBMRU1FTlRFRCA9IF9yZXF1aXJlJGNvZGVzLkVSUl9NRVRIT0RfTk9UX0lNUExFTUVOVEVELFxuICAgIEVSUl9NVUxUSVBMRV9DQUxMQkFDSyA9IF9yZXF1aXJlJGNvZGVzLkVSUl9NVUxUSVBMRV9DQUxMQkFDSyxcbiAgICBFUlJfU1RSRUFNX0NBTk5PVF9QSVBFID0gX3JlcXVpcmUkY29kZXMuRVJSX1NUUkVBTV9DQU5OT1RfUElQRSxcbiAgICBFUlJfU1RSRUFNX0RFU1RST1lFRCA9IF9yZXF1aXJlJGNvZGVzLkVSUl9TVFJFQU1fREVTVFJPWUVELFxuICAgIEVSUl9TVFJFQU1fTlVMTF9WQUxVRVMgPSBfcmVxdWlyZSRjb2Rlcy5FUlJfU1RSRUFNX05VTExfVkFMVUVTLFxuICAgIEVSUl9TVFJFQU1fV1JJVEVfQUZURVJfRU5EID0gX3JlcXVpcmUkY29kZXMuRVJSX1NUUkVBTV9XUklURV9BRlRFUl9FTkQsXG4gICAgRVJSX1VOS05PV05fRU5DT0RJTkcgPSBfcmVxdWlyZSRjb2Rlcy5FUlJfVU5LTk9XTl9FTkNPRElORztcblxudmFyIGVycm9yT3JEZXN0cm95ID0gZGVzdHJveUltcGwuZXJyb3JPckRlc3Ryb3k7XG5cbnJlcXVpcmUoJ2luaGVyaXRzJykoV3JpdGFibGUsIFN0cmVhbSk7XG5cbmZ1bmN0aW9uIG5vcCgpIHt9XG5cbmZ1bmN0aW9uIFdyaXRhYmxlU3RhdGUob3B0aW9ucywgc3RyZWFtLCBpc0R1cGxleCkge1xuICBEdXBsZXggPSBEdXBsZXggfHwgcmVxdWlyZSgnLi9fc3RyZWFtX2R1cGxleCcpO1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTsgLy8gRHVwbGV4IHN0cmVhbXMgYXJlIGJvdGggcmVhZGFibGUgYW5kIHdyaXRhYmxlLCBidXQgc2hhcmVcbiAgLy8gdGhlIHNhbWUgb3B0aW9ucyBvYmplY3QuXG4gIC8vIEhvd2V2ZXIsIHNvbWUgY2FzZXMgcmVxdWlyZSBzZXR0aW5nIG9wdGlvbnMgdG8gZGlmZmVyZW50XG4gIC8vIHZhbHVlcyBmb3IgdGhlIHJlYWRhYmxlIGFuZCB0aGUgd3JpdGFibGUgc2lkZXMgb2YgdGhlIGR1cGxleCBzdHJlYW0sXG4gIC8vIGUuZy4gb3B0aW9ucy5yZWFkYWJsZU9iamVjdE1vZGUgdnMuIG9wdGlvbnMud3JpdGFibGVPYmplY3RNb2RlLCBldGMuXG5cbiAgaWYgKHR5cGVvZiBpc0R1cGxleCAhPT0gJ2Jvb2xlYW4nKSBpc0R1cGxleCA9IHN0cmVhbSBpbnN0YW5jZW9mIER1cGxleDsgLy8gb2JqZWN0IHN0cmVhbSBmbGFnIHRvIGluZGljYXRlIHdoZXRoZXIgb3Igbm90IHRoaXMgc3RyZWFtXG4gIC8vIGNvbnRhaW5zIGJ1ZmZlcnMgb3Igb2JqZWN0cy5cblxuICB0aGlzLm9iamVjdE1vZGUgPSAhIW9wdGlvbnMub2JqZWN0TW9kZTtcbiAgaWYgKGlzRHVwbGV4KSB0aGlzLm9iamVjdE1vZGUgPSB0aGlzLm9iamVjdE1vZGUgfHwgISFvcHRpb25zLndyaXRhYmxlT2JqZWN0TW9kZTsgLy8gdGhlIHBvaW50IGF0IHdoaWNoIHdyaXRlKCkgc3RhcnRzIHJldHVybmluZyBmYWxzZVxuICAvLyBOb3RlOiAwIGlzIGEgdmFsaWQgdmFsdWUsIG1lYW5zIHRoYXQgd2UgYWx3YXlzIHJldHVybiBmYWxzZSBpZlxuICAvLyB0aGUgZW50aXJlIGJ1ZmZlciBpcyBub3QgZmx1c2hlZCBpbW1lZGlhdGVseSBvbiB3cml0ZSgpXG5cbiAgdGhpcy5oaWdoV2F0ZXJNYXJrID0gZ2V0SGlnaFdhdGVyTWFyayh0aGlzLCBvcHRpb25zLCAnd3JpdGFibGVIaWdoV2F0ZXJNYXJrJywgaXNEdXBsZXgpOyAvLyBpZiBfZmluYWwgaGFzIGJlZW4gY2FsbGVkXG5cbiAgdGhpcy5maW5hbENhbGxlZCA9IGZhbHNlOyAvLyBkcmFpbiBldmVudCBmbGFnLlxuXG4gIHRoaXMubmVlZERyYWluID0gZmFsc2U7IC8vIGF0IHRoZSBzdGFydCBvZiBjYWxsaW5nIGVuZCgpXG5cbiAgdGhpcy5lbmRpbmcgPSBmYWxzZTsgLy8gd2hlbiBlbmQoKSBoYXMgYmVlbiBjYWxsZWQsIGFuZCByZXR1cm5lZFxuXG4gIHRoaXMuZW5kZWQgPSBmYWxzZTsgLy8gd2hlbiAnZmluaXNoJyBpcyBlbWl0dGVkXG5cbiAgdGhpcy5maW5pc2hlZCA9IGZhbHNlOyAvLyBoYXMgaXQgYmVlbiBkZXN0cm95ZWRcblxuICB0aGlzLmRlc3Ryb3llZCA9IGZhbHNlOyAvLyBzaG91bGQgd2UgZGVjb2RlIHN0cmluZ3MgaW50byBidWZmZXJzIGJlZm9yZSBwYXNzaW5nIHRvIF93cml0ZT9cbiAgLy8gdGhpcyBpcyBoZXJlIHNvIHRoYXQgc29tZSBub2RlLWNvcmUgc3RyZWFtcyBjYW4gb3B0aW1pemUgc3RyaW5nXG4gIC8vIGhhbmRsaW5nIGF0IGEgbG93ZXIgbGV2ZWwuXG5cbiAgdmFyIG5vRGVjb2RlID0gb3B0aW9ucy5kZWNvZGVTdHJpbmdzID09PSBmYWxzZTtcbiAgdGhpcy5kZWNvZGVTdHJpbmdzID0gIW5vRGVjb2RlOyAvLyBDcnlwdG8gaXMga2luZCBvZiBvbGQgYW5kIGNydXN0eS4gIEhpc3RvcmljYWxseSwgaXRzIGRlZmF1bHQgc3RyaW5nXG4gIC8vIGVuY29kaW5nIGlzICdiaW5hcnknIHNvIHdlIGhhdmUgdG8gbWFrZSB0aGlzIGNvbmZpZ3VyYWJsZS5cbiAgLy8gRXZlcnl0aGluZyBlbHNlIGluIHRoZSB1bml2ZXJzZSB1c2VzICd1dGY4JywgdGhvdWdoLlxuXG4gIHRoaXMuZGVmYXVsdEVuY29kaW5nID0gb3B0aW9ucy5kZWZhdWx0RW5jb2RpbmcgfHwgJ3V0ZjgnOyAvLyBub3QgYW4gYWN0dWFsIGJ1ZmZlciB3ZSBrZWVwIHRyYWNrIG9mLCBidXQgYSBtZWFzdXJlbWVudFxuICAvLyBvZiBob3cgbXVjaCB3ZSdyZSB3YWl0aW5nIHRvIGdldCBwdXNoZWQgdG8gc29tZSB1bmRlcmx5aW5nXG4gIC8vIHNvY2tldCBvciBmaWxlLlxuXG4gIHRoaXMubGVuZ3RoID0gMDsgLy8gYSBmbGFnIHRvIHNlZSB3aGVuIHdlJ3JlIGluIHRoZSBtaWRkbGUgb2YgYSB3cml0ZS5cblxuICB0aGlzLndyaXRpbmcgPSBmYWxzZTsgLy8gd2hlbiB0cnVlIGFsbCB3cml0ZXMgd2lsbCBiZSBidWZmZXJlZCB1bnRpbCAudW5jb3JrKCkgY2FsbFxuXG4gIHRoaXMuY29ya2VkID0gMDsgLy8gYSBmbGFnIHRvIGJlIGFibGUgdG8gdGVsbCBpZiB0aGUgb253cml0ZSBjYiBpcyBjYWxsZWQgaW1tZWRpYXRlbHksXG4gIC8vIG9yIG9uIGEgbGF0ZXIgdGljay4gIFdlIHNldCB0aGlzIHRvIHRydWUgYXQgZmlyc3QsIGJlY2F1c2UgYW55XG4gIC8vIGFjdGlvbnMgdGhhdCBzaG91bGRuJ3QgaGFwcGVuIHVudGlsIFwibGF0ZXJcIiBzaG91bGQgZ2VuZXJhbGx5IGFsc29cbiAgLy8gbm90IGhhcHBlbiBiZWZvcmUgdGhlIGZpcnN0IHdyaXRlIGNhbGwuXG5cbiAgdGhpcy5zeW5jID0gdHJ1ZTsgLy8gYSBmbGFnIHRvIGtub3cgaWYgd2UncmUgcHJvY2Vzc2luZyBwcmV2aW91c2x5IGJ1ZmZlcmVkIGl0ZW1zLCB3aGljaFxuICAvLyBtYXkgY2FsbCB0aGUgX3dyaXRlKCkgY2FsbGJhY2sgaW4gdGhlIHNhbWUgdGljaywgc28gdGhhdCB3ZSBkb24ndFxuICAvLyBlbmQgdXAgaW4gYW4gb3ZlcmxhcHBlZCBvbndyaXRlIHNpdHVhdGlvbi5cblxuICB0aGlzLmJ1ZmZlclByb2Nlc3NpbmcgPSBmYWxzZTsgLy8gdGhlIGNhbGxiYWNrIHRoYXQncyBwYXNzZWQgdG8gX3dyaXRlKGNodW5rLGNiKVxuXG4gIHRoaXMub253cml0ZSA9IGZ1bmN0aW9uIChlcikge1xuICAgIG9ud3JpdGUoc3RyZWFtLCBlcik7XG4gIH07IC8vIHRoZSBjYWxsYmFjayB0aGF0IHRoZSB1c2VyIHN1cHBsaWVzIHRvIHdyaXRlKGNodW5rLGVuY29kaW5nLGNiKVxuXG5cbiAgdGhpcy53cml0ZWNiID0gbnVsbDsgLy8gdGhlIGFtb3VudCB0aGF0IGlzIGJlaW5nIHdyaXR0ZW4gd2hlbiBfd3JpdGUgaXMgY2FsbGVkLlxuXG4gIHRoaXMud3JpdGVsZW4gPSAwO1xuICB0aGlzLmJ1ZmZlcmVkUmVxdWVzdCA9IG51bGw7XG4gIHRoaXMubGFzdEJ1ZmZlcmVkUmVxdWVzdCA9IG51bGw7IC8vIG51bWJlciBvZiBwZW5kaW5nIHVzZXItc3VwcGxpZWQgd3JpdGUgY2FsbGJhY2tzXG4gIC8vIHRoaXMgbXVzdCBiZSAwIGJlZm9yZSAnZmluaXNoJyBjYW4gYmUgZW1pdHRlZFxuXG4gIHRoaXMucGVuZGluZ2NiID0gMDsgLy8gZW1pdCBwcmVmaW5pc2ggaWYgdGhlIG9ubHkgdGhpbmcgd2UncmUgd2FpdGluZyBmb3IgaXMgX3dyaXRlIGNic1xuICAvLyBUaGlzIGlzIHJlbGV2YW50IGZvciBzeW5jaHJvbm91cyBUcmFuc2Zvcm0gc3RyZWFtc1xuXG4gIHRoaXMucHJlZmluaXNoZWQgPSBmYWxzZTsgLy8gVHJ1ZSBpZiB0aGUgZXJyb3Igd2FzIGFscmVhZHkgZW1pdHRlZCBhbmQgc2hvdWxkIG5vdCBiZSB0aHJvd24gYWdhaW5cblxuICB0aGlzLmVycm9yRW1pdHRlZCA9IGZhbHNlOyAvLyBTaG91bGQgY2xvc2UgYmUgZW1pdHRlZCBvbiBkZXN0cm95LiBEZWZhdWx0cyB0byB0cnVlLlxuXG4gIHRoaXMuZW1pdENsb3NlID0gb3B0aW9ucy5lbWl0Q2xvc2UgIT09IGZhbHNlOyAvLyBTaG91bGQgLmRlc3Ryb3koKSBiZSBjYWxsZWQgYWZ0ZXIgJ2ZpbmlzaCcgKGFuZCBwb3RlbnRpYWxseSAnZW5kJylcblxuICB0aGlzLmF1dG9EZXN0cm95ID0gISFvcHRpb25zLmF1dG9EZXN0cm95OyAvLyBjb3VudCBidWZmZXJlZCByZXF1ZXN0c1xuXG4gIHRoaXMuYnVmZmVyZWRSZXF1ZXN0Q291bnQgPSAwOyAvLyBhbGxvY2F0ZSB0aGUgZmlyc3QgQ29ya2VkUmVxdWVzdCwgdGhlcmUgaXMgYWx3YXlzXG4gIC8vIG9uZSBhbGxvY2F0ZWQgYW5kIGZyZWUgdG8gdXNlLCBhbmQgd2UgbWFpbnRhaW4gYXQgbW9zdCB0d29cblxuICB0aGlzLmNvcmtlZFJlcXVlc3RzRnJlZSA9IG5ldyBDb3JrZWRSZXF1ZXN0KHRoaXMpO1xufVxuXG5Xcml0YWJsZVN0YXRlLnByb3RvdHlwZS5nZXRCdWZmZXIgPSBmdW5jdGlvbiBnZXRCdWZmZXIoKSB7XG4gIHZhciBjdXJyZW50ID0gdGhpcy5idWZmZXJlZFJlcXVlc3Q7XG4gIHZhciBvdXQgPSBbXTtcblxuICB3aGlsZSAoY3VycmVudCkge1xuICAgIG91dC5wdXNoKGN1cnJlbnQpO1xuICAgIGN1cnJlbnQgPSBjdXJyZW50Lm5leHQ7XG4gIH1cblxuICByZXR1cm4gb3V0O1xufTtcblxuKGZ1bmN0aW9uICgpIHtcbiAgdHJ5IHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoV3JpdGFibGVTdGF0ZS5wcm90b3R5cGUsICdidWZmZXInLCB7XG4gICAgICBnZXQ6IGludGVybmFsVXRpbC5kZXByZWNhdGUoZnVuY3Rpb24gd3JpdGFibGVTdGF0ZUJ1ZmZlckdldHRlcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0QnVmZmVyKCk7XG4gICAgICB9LCAnX3dyaXRhYmxlU3RhdGUuYnVmZmVyIGlzIGRlcHJlY2F0ZWQuIFVzZSBfd3JpdGFibGVTdGF0ZS5nZXRCdWZmZXIgJyArICdpbnN0ZWFkLicsICdERVAwMDAzJylcbiAgICB9KTtcbiAgfSBjYXRjaCAoXykge31cbn0pKCk7IC8vIFRlc3QgX3dyaXRhYmxlU3RhdGUgZm9yIGluaGVyaXRhbmNlIHRvIGFjY291bnQgZm9yIER1cGxleCBzdHJlYW1zLFxuLy8gd2hvc2UgcHJvdG90eXBlIGNoYWluIG9ubHkgcG9pbnRzIHRvIFJlYWRhYmxlLlxuXG5cbnZhciByZWFsSGFzSW5zdGFuY2U7XG5cbmlmICh0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIFN5bWJvbC5oYXNJbnN0YW5jZSAmJiB0eXBlb2YgRnVuY3Rpb24ucHJvdG90eXBlW1N5bWJvbC5oYXNJbnN0YW5jZV0gPT09ICdmdW5jdGlvbicpIHtcbiAgcmVhbEhhc0luc3RhbmNlID0gRnVuY3Rpb24ucHJvdG90eXBlW1N5bWJvbC5oYXNJbnN0YW5jZV07XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShXcml0YWJsZSwgU3ltYm9sLmhhc0luc3RhbmNlLCB7XG4gICAgdmFsdWU6IGZ1bmN0aW9uIHZhbHVlKG9iamVjdCkge1xuICAgICAgaWYgKHJlYWxIYXNJbnN0YW5jZS5jYWxsKHRoaXMsIG9iamVjdCkpIHJldHVybiB0cnVlO1xuICAgICAgaWYgKHRoaXMgIT09IFdyaXRhYmxlKSByZXR1cm4gZmFsc2U7XG4gICAgICByZXR1cm4gb2JqZWN0ICYmIG9iamVjdC5fd3JpdGFibGVTdGF0ZSBpbnN0YW5jZW9mIFdyaXRhYmxlU3RhdGU7XG4gICAgfVxuICB9KTtcbn0gZWxzZSB7XG4gIHJlYWxIYXNJbnN0YW5jZSA9IGZ1bmN0aW9uIHJlYWxIYXNJbnN0YW5jZShvYmplY3QpIHtcbiAgICByZXR1cm4gb2JqZWN0IGluc3RhbmNlb2YgdGhpcztcbiAgfTtcbn1cblxuZnVuY3Rpb24gV3JpdGFibGUob3B0aW9ucykge1xuICBEdXBsZXggPSBEdXBsZXggfHwgcmVxdWlyZSgnLi9fc3RyZWFtX2R1cGxleCcpOyAvLyBXcml0YWJsZSBjdG9yIGlzIGFwcGxpZWQgdG8gRHVwbGV4ZXMsIHRvby5cbiAgLy8gYHJlYWxIYXNJbnN0YW5jZWAgaXMgbmVjZXNzYXJ5IGJlY2F1c2UgdXNpbmcgcGxhaW4gYGluc3RhbmNlb2ZgXG4gIC8vIHdvdWxkIHJldHVybiBmYWxzZSwgYXMgbm8gYF93cml0YWJsZVN0YXRlYCBwcm9wZXJ0eSBpcyBhdHRhY2hlZC5cbiAgLy8gVHJ5aW5nIHRvIHVzZSB0aGUgY3VzdG9tIGBpbnN0YW5jZW9mYCBmb3IgV3JpdGFibGUgaGVyZSB3aWxsIGFsc28gYnJlYWsgdGhlXG4gIC8vIE5vZGUuanMgTGF6eVRyYW5zZm9ybSBpbXBsZW1lbnRhdGlvbiwgd2hpY2ggaGFzIGEgbm9uLXRyaXZpYWwgZ2V0dGVyIGZvclxuICAvLyBgX3dyaXRhYmxlU3RhdGVgIHRoYXQgd291bGQgbGVhZCB0byBpbmZpbml0ZSByZWN1cnNpb24uXG4gIC8vIENoZWNraW5nIGZvciBhIFN0cmVhbS5EdXBsZXggaW5zdGFuY2UgaXMgZmFzdGVyIGhlcmUgaW5zdGVhZCBvZiBpbnNpZGVcbiAgLy8gdGhlIFdyaXRhYmxlU3RhdGUgY29uc3RydWN0b3IsIGF0IGxlYXN0IHdpdGggVjggNi41XG5cbiAgdmFyIGlzRHVwbGV4ID0gdGhpcyBpbnN0YW5jZW9mIER1cGxleDtcbiAgaWYgKCFpc0R1cGxleCAmJiAhcmVhbEhhc0luc3RhbmNlLmNhbGwoV3JpdGFibGUsIHRoaXMpKSByZXR1cm4gbmV3IFdyaXRhYmxlKG9wdGlvbnMpO1xuICB0aGlzLl93cml0YWJsZVN0YXRlID0gbmV3IFdyaXRhYmxlU3RhdGUob3B0aW9ucywgdGhpcywgaXNEdXBsZXgpOyAvLyBsZWdhY3kuXG5cbiAgdGhpcy53cml0YWJsZSA9IHRydWU7XG5cbiAgaWYgKG9wdGlvbnMpIHtcbiAgICBpZiAodHlwZW9mIG9wdGlvbnMud3JpdGUgPT09ICdmdW5jdGlvbicpIHRoaXMuX3dyaXRlID0gb3B0aW9ucy53cml0ZTtcbiAgICBpZiAodHlwZW9mIG9wdGlvbnMud3JpdGV2ID09PSAnZnVuY3Rpb24nKSB0aGlzLl93cml0ZXYgPSBvcHRpb25zLndyaXRldjtcbiAgICBpZiAodHlwZW9mIG9wdGlvbnMuZGVzdHJveSA9PT0gJ2Z1bmN0aW9uJykgdGhpcy5fZGVzdHJveSA9IG9wdGlvbnMuZGVzdHJveTtcbiAgICBpZiAodHlwZW9mIG9wdGlvbnMuZmluYWwgPT09ICdmdW5jdGlvbicpIHRoaXMuX2ZpbmFsID0gb3B0aW9ucy5maW5hbDtcbiAgfVxuXG4gIFN0cmVhbS5jYWxsKHRoaXMpO1xufSAvLyBPdGhlcndpc2UgcGVvcGxlIGNhbiBwaXBlIFdyaXRhYmxlIHN0cmVhbXMsIHdoaWNoIGlzIGp1c3Qgd3JvbmcuXG5cblxuV3JpdGFibGUucHJvdG90eXBlLnBpcGUgPSBmdW5jdGlvbiAoKSB7XG4gIGVycm9yT3JEZXN0cm95KHRoaXMsIG5ldyBFUlJfU1RSRUFNX0NBTk5PVF9QSVBFKCkpO1xufTtcblxuZnVuY3Rpb24gd3JpdGVBZnRlckVuZChzdHJlYW0sIGNiKSB7XG4gIHZhciBlciA9IG5ldyBFUlJfU1RSRUFNX1dSSVRFX0FGVEVSX0VORCgpOyAvLyBUT0RPOiBkZWZlciBlcnJvciBldmVudHMgY29uc2lzdGVudGx5IGV2ZXJ5d2hlcmUsIG5vdCBqdXN0IHRoZSBjYlxuXG4gIGVycm9yT3JEZXN0cm95KHN0cmVhbSwgZXIpO1xuICBwcm9jZXNzLm5leHRUaWNrKGNiLCBlcik7XG59IC8vIENoZWNrcyB0aGF0IGEgdXNlci1zdXBwbGllZCBjaHVuayBpcyB2YWxpZCwgZXNwZWNpYWxseSBmb3IgdGhlIHBhcnRpY3VsYXJcbi8vIG1vZGUgdGhlIHN0cmVhbSBpcyBpbi4gQ3VycmVudGx5IHRoaXMgbWVhbnMgdGhhdCBgbnVsbGAgaXMgbmV2ZXIgYWNjZXB0ZWRcbi8vIGFuZCB1bmRlZmluZWQvbm9uLXN0cmluZyB2YWx1ZXMgYXJlIG9ubHkgYWxsb3dlZCBpbiBvYmplY3QgbW9kZS5cblxuXG5mdW5jdGlvbiB2YWxpZENodW5rKHN0cmVhbSwgc3RhdGUsIGNodW5rLCBjYikge1xuICB2YXIgZXI7XG5cbiAgaWYgKGNodW5rID09PSBudWxsKSB7XG4gICAgZXIgPSBuZXcgRVJSX1NUUkVBTV9OVUxMX1ZBTFVFUygpO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBjaHVuayAhPT0gJ3N0cmluZycgJiYgIXN0YXRlLm9iamVjdE1vZGUpIHtcbiAgICBlciA9IG5ldyBFUlJfSU5WQUxJRF9BUkdfVFlQRSgnY2h1bmsnLCBbJ3N0cmluZycsICdCdWZmZXInXSwgY2h1bmspO1xuICB9XG5cbiAgaWYgKGVyKSB7XG4gICAgZXJyb3JPckRlc3Ryb3koc3RyZWFtLCBlcik7XG4gICAgcHJvY2Vzcy5uZXh0VGljayhjYiwgZXIpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5Xcml0YWJsZS5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbiAoY2h1bmssIGVuY29kaW5nLCBjYikge1xuICB2YXIgc3RhdGUgPSB0aGlzLl93cml0YWJsZVN0YXRlO1xuICB2YXIgcmV0ID0gZmFsc2U7XG5cbiAgdmFyIGlzQnVmID0gIXN0YXRlLm9iamVjdE1vZGUgJiYgX2lzVWludDhBcnJheShjaHVuayk7XG5cbiAgaWYgKGlzQnVmICYmICFCdWZmZXIuaXNCdWZmZXIoY2h1bmspKSB7XG4gICAgY2h1bmsgPSBfdWludDhBcnJheVRvQnVmZmVyKGNodW5rKTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgZW5jb2RpbmcgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjYiA9IGVuY29kaW5nO1xuICAgIGVuY29kaW5nID0gbnVsbDtcbiAgfVxuXG4gIGlmIChpc0J1ZikgZW5jb2RpbmcgPSAnYnVmZmVyJztlbHNlIGlmICghZW5jb2RpbmcpIGVuY29kaW5nID0gc3RhdGUuZGVmYXVsdEVuY29kaW5nO1xuICBpZiAodHlwZW9mIGNiICE9PSAnZnVuY3Rpb24nKSBjYiA9IG5vcDtcbiAgaWYgKHN0YXRlLmVuZGluZykgd3JpdGVBZnRlckVuZCh0aGlzLCBjYik7ZWxzZSBpZiAoaXNCdWYgfHwgdmFsaWRDaHVuayh0aGlzLCBzdGF0ZSwgY2h1bmssIGNiKSkge1xuICAgIHN0YXRlLnBlbmRpbmdjYisrO1xuICAgIHJldCA9IHdyaXRlT3JCdWZmZXIodGhpcywgc3RhdGUsIGlzQnVmLCBjaHVuaywgZW5jb2RpbmcsIGNiKTtcbiAgfVxuICByZXR1cm4gcmV0O1xufTtcblxuV3JpdGFibGUucHJvdG90eXBlLmNvcmsgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMuX3dyaXRhYmxlU3RhdGUuY29ya2VkKys7XG59O1xuXG5Xcml0YWJsZS5wcm90b3R5cGUudW5jb3JrID0gZnVuY3Rpb24gKCkge1xuICB2YXIgc3RhdGUgPSB0aGlzLl93cml0YWJsZVN0YXRlO1xuXG4gIGlmIChzdGF0ZS5jb3JrZWQpIHtcbiAgICBzdGF0ZS5jb3JrZWQtLTtcbiAgICBpZiAoIXN0YXRlLndyaXRpbmcgJiYgIXN0YXRlLmNvcmtlZCAmJiAhc3RhdGUuYnVmZmVyUHJvY2Vzc2luZyAmJiBzdGF0ZS5idWZmZXJlZFJlcXVlc3QpIGNsZWFyQnVmZmVyKHRoaXMsIHN0YXRlKTtcbiAgfVxufTtcblxuV3JpdGFibGUucHJvdG90eXBlLnNldERlZmF1bHRFbmNvZGluZyA9IGZ1bmN0aW9uIHNldERlZmF1bHRFbmNvZGluZyhlbmNvZGluZykge1xuICAvLyBub2RlOjpQYXJzZUVuY29kaW5nKCkgcmVxdWlyZXMgbG93ZXIgY2FzZS5cbiAgaWYgKHR5cGVvZiBlbmNvZGluZyA9PT0gJ3N0cmluZycpIGVuY29kaW5nID0gZW5jb2RpbmcudG9Mb3dlckNhc2UoKTtcbiAgaWYgKCEoWydoZXgnLCAndXRmOCcsICd1dGYtOCcsICdhc2NpaScsICdiaW5hcnknLCAnYmFzZTY0JywgJ3VjczInLCAndWNzLTInLCAndXRmMTZsZScsICd1dGYtMTZsZScsICdyYXcnXS5pbmRleE9mKChlbmNvZGluZyArICcnKS50b0xvd2VyQ2FzZSgpKSA+IC0xKSkgdGhyb3cgbmV3IEVSUl9VTktOT1dOX0VOQ09ESU5HKGVuY29kaW5nKTtcbiAgdGhpcy5fd3JpdGFibGVTdGF0ZS5kZWZhdWx0RW5jb2RpbmcgPSBlbmNvZGluZztcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoV3JpdGFibGUucHJvdG90eXBlLCAnd3JpdGFibGVCdWZmZXInLCB7XG4gIC8vIG1ha2luZyBpdCBleHBsaWNpdCB0aGlzIHByb3BlcnR5IGlzIG5vdCBlbnVtZXJhYmxlXG4gIC8vIGJlY2F1c2Ugb3RoZXJ3aXNlIHNvbWUgcHJvdG90eXBlIG1hbmlwdWxhdGlvbiBpblxuICAvLyB1c2VybGFuZCB3aWxsIGZhaWxcbiAgZW51bWVyYWJsZTogZmFsc2UsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiB0aGlzLl93cml0YWJsZVN0YXRlICYmIHRoaXMuX3dyaXRhYmxlU3RhdGUuZ2V0QnVmZmVyKCk7XG4gIH1cbn0pO1xuXG5mdW5jdGlvbiBkZWNvZGVDaHVuayhzdGF0ZSwgY2h1bmssIGVuY29kaW5nKSB7XG4gIGlmICghc3RhdGUub2JqZWN0TW9kZSAmJiBzdGF0ZS5kZWNvZGVTdHJpbmdzICE9PSBmYWxzZSAmJiB0eXBlb2YgY2h1bmsgPT09ICdzdHJpbmcnKSB7XG4gICAgY2h1bmsgPSBCdWZmZXIuZnJvbShjaHVuaywgZW5jb2RpbmcpO1xuICB9XG5cbiAgcmV0dXJuIGNodW5rO1xufVxuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoV3JpdGFibGUucHJvdG90eXBlLCAnd3JpdGFibGVIaWdoV2F0ZXJNYXJrJywge1xuICAvLyBtYWtpbmcgaXQgZXhwbGljaXQgdGhpcyBwcm9wZXJ0eSBpcyBub3QgZW51bWVyYWJsZVxuICAvLyBiZWNhdXNlIG90aGVyd2lzZSBzb21lIHByb3RvdHlwZSBtYW5pcHVsYXRpb24gaW5cbiAgLy8gdXNlcmxhbmQgd2lsbCBmYWlsXG4gIGVudW1lcmFibGU6IGZhbHNlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gdGhpcy5fd3JpdGFibGVTdGF0ZS5oaWdoV2F0ZXJNYXJrO1xuICB9XG59KTsgLy8gaWYgd2UncmUgYWxyZWFkeSB3cml0aW5nIHNvbWV0aGluZywgdGhlbiBqdXN0IHB1dCB0aGlzXG4vLyBpbiB0aGUgcXVldWUsIGFuZCB3YWl0IG91ciB0dXJuLiAgT3RoZXJ3aXNlLCBjYWxsIF93cml0ZVxuLy8gSWYgd2UgcmV0dXJuIGZhbHNlLCB0aGVuIHdlIG5lZWQgYSBkcmFpbiBldmVudCwgc28gc2V0IHRoYXQgZmxhZy5cblxuZnVuY3Rpb24gd3JpdGVPckJ1ZmZlcihzdHJlYW0sIHN0YXRlLCBpc0J1ZiwgY2h1bmssIGVuY29kaW5nLCBjYikge1xuICBpZiAoIWlzQnVmKSB7XG4gICAgdmFyIG5ld0NodW5rID0gZGVjb2RlQ2h1bmsoc3RhdGUsIGNodW5rLCBlbmNvZGluZyk7XG5cbiAgICBpZiAoY2h1bmsgIT09IG5ld0NodW5rKSB7XG4gICAgICBpc0J1ZiA9IHRydWU7XG4gICAgICBlbmNvZGluZyA9ICdidWZmZXInO1xuICAgICAgY2h1bmsgPSBuZXdDaHVuaztcbiAgICB9XG4gIH1cblxuICB2YXIgbGVuID0gc3RhdGUub2JqZWN0TW9kZSA/IDEgOiBjaHVuay5sZW5ndGg7XG4gIHN0YXRlLmxlbmd0aCArPSBsZW47XG4gIHZhciByZXQgPSBzdGF0ZS5sZW5ndGggPCBzdGF0ZS5oaWdoV2F0ZXJNYXJrOyAvLyB3ZSBtdXN0IGVuc3VyZSB0aGF0IHByZXZpb3VzIG5lZWREcmFpbiB3aWxsIG5vdCBiZSByZXNldCB0byBmYWxzZS5cblxuICBpZiAoIXJldCkgc3RhdGUubmVlZERyYWluID0gdHJ1ZTtcblxuICBpZiAoc3RhdGUud3JpdGluZyB8fCBzdGF0ZS5jb3JrZWQpIHtcbiAgICB2YXIgbGFzdCA9IHN0YXRlLmxhc3RCdWZmZXJlZFJlcXVlc3Q7XG4gICAgc3RhdGUubGFzdEJ1ZmZlcmVkUmVxdWVzdCA9IHtcbiAgICAgIGNodW5rOiBjaHVuayxcbiAgICAgIGVuY29kaW5nOiBlbmNvZGluZyxcbiAgICAgIGlzQnVmOiBpc0J1ZixcbiAgICAgIGNhbGxiYWNrOiBjYixcbiAgICAgIG5leHQ6IG51bGxcbiAgICB9O1xuXG4gICAgaWYgKGxhc3QpIHtcbiAgICAgIGxhc3QubmV4dCA9IHN0YXRlLmxhc3RCdWZmZXJlZFJlcXVlc3Q7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdCA9IHN0YXRlLmxhc3RCdWZmZXJlZFJlcXVlc3Q7XG4gICAgfVxuXG4gICAgc3RhdGUuYnVmZmVyZWRSZXF1ZXN0Q291bnQgKz0gMTtcbiAgfSBlbHNlIHtcbiAgICBkb1dyaXRlKHN0cmVhbSwgc3RhdGUsIGZhbHNlLCBsZW4sIGNodW5rLCBlbmNvZGluZywgY2IpO1xuICB9XG5cbiAgcmV0dXJuIHJldDtcbn1cblxuZnVuY3Rpb24gZG9Xcml0ZShzdHJlYW0sIHN0YXRlLCB3cml0ZXYsIGxlbiwgY2h1bmssIGVuY29kaW5nLCBjYikge1xuICBzdGF0ZS53cml0ZWxlbiA9IGxlbjtcbiAgc3RhdGUud3JpdGVjYiA9IGNiO1xuICBzdGF0ZS53cml0aW5nID0gdHJ1ZTtcbiAgc3RhdGUuc3luYyA9IHRydWU7XG4gIGlmIChzdGF0ZS5kZXN0cm95ZWQpIHN0YXRlLm9ud3JpdGUobmV3IEVSUl9TVFJFQU1fREVTVFJPWUVEKCd3cml0ZScpKTtlbHNlIGlmICh3cml0ZXYpIHN0cmVhbS5fd3JpdGV2KGNodW5rLCBzdGF0ZS5vbndyaXRlKTtlbHNlIHN0cmVhbS5fd3JpdGUoY2h1bmssIGVuY29kaW5nLCBzdGF0ZS5vbndyaXRlKTtcbiAgc3RhdGUuc3luYyA9IGZhbHNlO1xufVxuXG5mdW5jdGlvbiBvbndyaXRlRXJyb3Ioc3RyZWFtLCBzdGF0ZSwgc3luYywgZXIsIGNiKSB7XG4gIC0tc3RhdGUucGVuZGluZ2NiO1xuXG4gIGlmIChzeW5jKSB7XG4gICAgLy8gZGVmZXIgdGhlIGNhbGxiYWNrIGlmIHdlIGFyZSBiZWluZyBjYWxsZWQgc3luY2hyb25vdXNseVxuICAgIC8vIHRvIGF2b2lkIHBpbGluZyB1cCB0aGluZ3Mgb24gdGhlIHN0YWNrXG4gICAgcHJvY2Vzcy5uZXh0VGljayhjYiwgZXIpOyAvLyB0aGlzIGNhbiBlbWl0IGZpbmlzaCwgYW5kIGl0IHdpbGwgYWx3YXlzIGhhcHBlblxuICAgIC8vIGFmdGVyIGVycm9yXG5cbiAgICBwcm9jZXNzLm5leHRUaWNrKGZpbmlzaE1heWJlLCBzdHJlYW0sIHN0YXRlKTtcbiAgICBzdHJlYW0uX3dyaXRhYmxlU3RhdGUuZXJyb3JFbWl0dGVkID0gdHJ1ZTtcbiAgICBlcnJvck9yRGVzdHJveShzdHJlYW0sIGVyKTtcbiAgfSBlbHNlIHtcbiAgICAvLyB0aGUgY2FsbGVyIGV4cGVjdCB0aGlzIHRvIGhhcHBlbiBiZWZvcmUgaWZcbiAgICAvLyBpdCBpcyBhc3luY1xuICAgIGNiKGVyKTtcbiAgICBzdHJlYW0uX3dyaXRhYmxlU3RhdGUuZXJyb3JFbWl0dGVkID0gdHJ1ZTtcbiAgICBlcnJvck9yRGVzdHJveShzdHJlYW0sIGVyKTsgLy8gdGhpcyBjYW4gZW1pdCBmaW5pc2gsIGJ1dCBmaW5pc2ggbXVzdFxuICAgIC8vIGFsd2F5cyBmb2xsb3cgZXJyb3JcblxuICAgIGZpbmlzaE1heWJlKHN0cmVhbSwgc3RhdGUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIG9ud3JpdGVTdGF0ZVVwZGF0ZShzdGF0ZSkge1xuICBzdGF0ZS53cml0aW5nID0gZmFsc2U7XG4gIHN0YXRlLndyaXRlY2IgPSBudWxsO1xuICBzdGF0ZS5sZW5ndGggLT0gc3RhdGUud3JpdGVsZW47XG4gIHN0YXRlLndyaXRlbGVuID0gMDtcbn1cblxuZnVuY3Rpb24gb253cml0ZShzdHJlYW0sIGVyKSB7XG4gIHZhciBzdGF0ZSA9IHN0cmVhbS5fd3JpdGFibGVTdGF0ZTtcbiAgdmFyIHN5bmMgPSBzdGF0ZS5zeW5jO1xuICB2YXIgY2IgPSBzdGF0ZS53cml0ZWNiO1xuICBpZiAodHlwZW9mIGNiICE9PSAnZnVuY3Rpb24nKSB0aHJvdyBuZXcgRVJSX01VTFRJUExFX0NBTExCQUNLKCk7XG4gIG9ud3JpdGVTdGF0ZVVwZGF0ZShzdGF0ZSk7XG4gIGlmIChlcikgb253cml0ZUVycm9yKHN0cmVhbSwgc3RhdGUsIHN5bmMsIGVyLCBjYik7ZWxzZSB7XG4gICAgLy8gQ2hlY2sgaWYgd2UncmUgYWN0dWFsbHkgcmVhZHkgdG8gZmluaXNoLCBidXQgZG9uJ3QgZW1pdCB5ZXRcbiAgICB2YXIgZmluaXNoZWQgPSBuZWVkRmluaXNoKHN0YXRlKSB8fCBzdHJlYW0uZGVzdHJveWVkO1xuXG4gICAgaWYgKCFmaW5pc2hlZCAmJiAhc3RhdGUuY29ya2VkICYmICFzdGF0ZS5idWZmZXJQcm9jZXNzaW5nICYmIHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdCkge1xuICAgICAgY2xlYXJCdWZmZXIoc3RyZWFtLCBzdGF0ZSk7XG4gICAgfVxuXG4gICAgaWYgKHN5bmMpIHtcbiAgICAgIHByb2Nlc3MubmV4dFRpY2soYWZ0ZXJXcml0ZSwgc3RyZWFtLCBzdGF0ZSwgZmluaXNoZWQsIGNiKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYWZ0ZXJXcml0ZShzdHJlYW0sIHN0YXRlLCBmaW5pc2hlZCwgY2IpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBhZnRlcldyaXRlKHN0cmVhbSwgc3RhdGUsIGZpbmlzaGVkLCBjYikge1xuICBpZiAoIWZpbmlzaGVkKSBvbndyaXRlRHJhaW4oc3RyZWFtLCBzdGF0ZSk7XG4gIHN0YXRlLnBlbmRpbmdjYi0tO1xuICBjYigpO1xuICBmaW5pc2hNYXliZShzdHJlYW0sIHN0YXRlKTtcbn0gLy8gTXVzdCBmb3JjZSBjYWxsYmFjayB0byBiZSBjYWxsZWQgb24gbmV4dFRpY2ssIHNvIHRoYXQgd2UgZG9uJ3Rcbi8vIGVtaXQgJ2RyYWluJyBiZWZvcmUgdGhlIHdyaXRlKCkgY29uc3VtZXIgZ2V0cyB0aGUgJ2ZhbHNlJyByZXR1cm5cbi8vIHZhbHVlLCBhbmQgaGFzIGEgY2hhbmNlIHRvIGF0dGFjaCBhICdkcmFpbicgbGlzdGVuZXIuXG5cblxuZnVuY3Rpb24gb253cml0ZURyYWluKHN0cmVhbSwgc3RhdGUpIHtcbiAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCAmJiBzdGF0ZS5uZWVkRHJhaW4pIHtcbiAgICBzdGF0ZS5uZWVkRHJhaW4gPSBmYWxzZTtcbiAgICBzdHJlYW0uZW1pdCgnZHJhaW4nKTtcbiAgfVxufSAvLyBpZiB0aGVyZSdzIHNvbWV0aGluZyBpbiB0aGUgYnVmZmVyIHdhaXRpbmcsIHRoZW4gcHJvY2VzcyBpdFxuXG5cbmZ1bmN0aW9uIGNsZWFyQnVmZmVyKHN0cmVhbSwgc3RhdGUpIHtcbiAgc3RhdGUuYnVmZmVyUHJvY2Vzc2luZyA9IHRydWU7XG4gIHZhciBlbnRyeSA9IHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdDtcblxuICBpZiAoc3RyZWFtLl93cml0ZXYgJiYgZW50cnkgJiYgZW50cnkubmV4dCkge1xuICAgIC8vIEZhc3QgY2FzZSwgd3JpdGUgZXZlcnl0aGluZyB1c2luZyBfd3JpdGV2KClcbiAgICB2YXIgbCA9IHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdENvdW50O1xuICAgIHZhciBidWZmZXIgPSBuZXcgQXJyYXkobCk7XG4gICAgdmFyIGhvbGRlciA9IHN0YXRlLmNvcmtlZFJlcXVlc3RzRnJlZTtcbiAgICBob2xkZXIuZW50cnkgPSBlbnRyeTtcbiAgICB2YXIgY291bnQgPSAwO1xuICAgIHZhciBhbGxCdWZmZXJzID0gdHJ1ZTtcblxuICAgIHdoaWxlIChlbnRyeSkge1xuICAgICAgYnVmZmVyW2NvdW50XSA9IGVudHJ5O1xuICAgICAgaWYgKCFlbnRyeS5pc0J1ZikgYWxsQnVmZmVycyA9IGZhbHNlO1xuICAgICAgZW50cnkgPSBlbnRyeS5uZXh0O1xuICAgICAgY291bnQgKz0gMTtcbiAgICB9XG5cbiAgICBidWZmZXIuYWxsQnVmZmVycyA9IGFsbEJ1ZmZlcnM7XG4gICAgZG9Xcml0ZShzdHJlYW0sIHN0YXRlLCB0cnVlLCBzdGF0ZS5sZW5ndGgsIGJ1ZmZlciwgJycsIGhvbGRlci5maW5pc2gpOyAvLyBkb1dyaXRlIGlzIGFsbW9zdCBhbHdheXMgYXN5bmMsIGRlZmVyIHRoZXNlIHRvIHNhdmUgYSBiaXQgb2YgdGltZVxuICAgIC8vIGFzIHRoZSBob3QgcGF0aCBlbmRzIHdpdGggZG9Xcml0ZVxuXG4gICAgc3RhdGUucGVuZGluZ2NiKys7XG4gICAgc3RhdGUubGFzdEJ1ZmZlcmVkUmVxdWVzdCA9IG51bGw7XG5cbiAgICBpZiAoaG9sZGVyLm5leHQpIHtcbiAgICAgIHN0YXRlLmNvcmtlZFJlcXVlc3RzRnJlZSA9IGhvbGRlci5uZXh0O1xuICAgICAgaG9sZGVyLm5leHQgPSBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdGF0ZS5jb3JrZWRSZXF1ZXN0c0ZyZWUgPSBuZXcgQ29ya2VkUmVxdWVzdChzdGF0ZSk7XG4gICAgfVxuXG4gICAgc3RhdGUuYnVmZmVyZWRSZXF1ZXN0Q291bnQgPSAwO1xuICB9IGVsc2Uge1xuICAgIC8vIFNsb3cgY2FzZSwgd3JpdGUgY2h1bmtzIG9uZS1ieS1vbmVcbiAgICB3aGlsZSAoZW50cnkpIHtcbiAgICAgIHZhciBjaHVuayA9IGVudHJ5LmNodW5rO1xuICAgICAgdmFyIGVuY29kaW5nID0gZW50cnkuZW5jb2Rpbmc7XG4gICAgICB2YXIgY2IgPSBlbnRyeS5jYWxsYmFjaztcbiAgICAgIHZhciBsZW4gPSBzdGF0ZS5vYmplY3RNb2RlID8gMSA6IGNodW5rLmxlbmd0aDtcbiAgICAgIGRvV3JpdGUoc3RyZWFtLCBzdGF0ZSwgZmFsc2UsIGxlbiwgY2h1bmssIGVuY29kaW5nLCBjYik7XG4gICAgICBlbnRyeSA9IGVudHJ5Lm5leHQ7XG4gICAgICBzdGF0ZS5idWZmZXJlZFJlcXVlc3RDb3VudC0tOyAvLyBpZiB3ZSBkaWRuJ3QgY2FsbCB0aGUgb253cml0ZSBpbW1lZGlhdGVseSwgdGhlblxuICAgICAgLy8gaXQgbWVhbnMgdGhhdCB3ZSBuZWVkIHRvIHdhaXQgdW50aWwgaXQgZG9lcy5cbiAgICAgIC8vIGFsc28sIHRoYXQgbWVhbnMgdGhhdCB0aGUgY2h1bmsgYW5kIGNiIGFyZSBjdXJyZW50bHlcbiAgICAgIC8vIGJlaW5nIHByb2Nlc3NlZCwgc28gbW92ZSB0aGUgYnVmZmVyIGNvdW50ZXIgcGFzdCB0aGVtLlxuXG4gICAgICBpZiAoc3RhdGUud3JpdGluZykge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZW50cnkgPT09IG51bGwpIHN0YXRlLmxhc3RCdWZmZXJlZFJlcXVlc3QgPSBudWxsO1xuICB9XG5cbiAgc3RhdGUuYnVmZmVyZWRSZXF1ZXN0ID0gZW50cnk7XG4gIHN0YXRlLmJ1ZmZlclByb2Nlc3NpbmcgPSBmYWxzZTtcbn1cblxuV3JpdGFibGUucHJvdG90eXBlLl93cml0ZSA9IGZ1bmN0aW9uIChjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIGNiKG5ldyBFUlJfTUVUSE9EX05PVF9JTVBMRU1FTlRFRCgnX3dyaXRlKCknKSk7XG59O1xuXG5Xcml0YWJsZS5wcm90b3R5cGUuX3dyaXRldiA9IG51bGw7XG5cbldyaXRhYmxlLnByb3RvdHlwZS5lbmQgPSBmdW5jdGlvbiAoY2h1bmssIGVuY29kaW5nLCBjYikge1xuICB2YXIgc3RhdGUgPSB0aGlzLl93cml0YWJsZVN0YXRlO1xuXG4gIGlmICh0eXBlb2YgY2h1bmsgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjYiA9IGNodW5rO1xuICAgIGNodW5rID0gbnVsbDtcbiAgICBlbmNvZGluZyA9IG51bGw7XG4gIH0gZWxzZSBpZiAodHlwZW9mIGVuY29kaW5nID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY2IgPSBlbmNvZGluZztcbiAgICBlbmNvZGluZyA9IG51bGw7XG4gIH1cblxuICBpZiAoY2h1bmsgIT09IG51bGwgJiYgY2h1bmsgIT09IHVuZGVmaW5lZCkgdGhpcy53cml0ZShjaHVuaywgZW5jb2RpbmcpOyAvLyAuZW5kKCkgZnVsbHkgdW5jb3Jrc1xuXG4gIGlmIChzdGF0ZS5jb3JrZWQpIHtcbiAgICBzdGF0ZS5jb3JrZWQgPSAxO1xuICAgIHRoaXMudW5jb3JrKCk7XG4gIH0gLy8gaWdub3JlIHVubmVjZXNzYXJ5IGVuZCgpIGNhbGxzLlxuXG5cbiAgaWYgKCFzdGF0ZS5lbmRpbmcpIGVuZFdyaXRhYmxlKHRoaXMsIHN0YXRlLCBjYik7XG4gIHJldHVybiB0aGlzO1xufTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KFdyaXRhYmxlLnByb3RvdHlwZSwgJ3dyaXRhYmxlTGVuZ3RoJywge1xuICAvLyBtYWtpbmcgaXQgZXhwbGljaXQgdGhpcyBwcm9wZXJ0eSBpcyBub3QgZW51bWVyYWJsZVxuICAvLyBiZWNhdXNlIG90aGVyd2lzZSBzb21lIHByb3RvdHlwZSBtYW5pcHVsYXRpb24gaW5cbiAgLy8gdXNlcmxhbmQgd2lsbCBmYWlsXG4gIGVudW1lcmFibGU6IGZhbHNlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gdGhpcy5fd3JpdGFibGVTdGF0ZS5sZW5ndGg7XG4gIH1cbn0pO1xuXG5mdW5jdGlvbiBuZWVkRmluaXNoKHN0YXRlKSB7XG4gIHJldHVybiBzdGF0ZS5lbmRpbmcgJiYgc3RhdGUubGVuZ3RoID09PSAwICYmIHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdCA9PT0gbnVsbCAmJiAhc3RhdGUuZmluaXNoZWQgJiYgIXN0YXRlLndyaXRpbmc7XG59XG5cbmZ1bmN0aW9uIGNhbGxGaW5hbChzdHJlYW0sIHN0YXRlKSB7XG4gIHN0cmVhbS5fZmluYWwoZnVuY3Rpb24gKGVycikge1xuICAgIHN0YXRlLnBlbmRpbmdjYi0tO1xuXG4gICAgaWYgKGVycikge1xuICAgICAgZXJyb3JPckRlc3Ryb3koc3RyZWFtLCBlcnIpO1xuICAgIH1cblxuICAgIHN0YXRlLnByZWZpbmlzaGVkID0gdHJ1ZTtcbiAgICBzdHJlYW0uZW1pdCgncHJlZmluaXNoJyk7XG4gICAgZmluaXNoTWF5YmUoc3RyZWFtLCBzdGF0ZSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBwcmVmaW5pc2goc3RyZWFtLCBzdGF0ZSkge1xuICBpZiAoIXN0YXRlLnByZWZpbmlzaGVkICYmICFzdGF0ZS5maW5hbENhbGxlZCkge1xuICAgIGlmICh0eXBlb2Ygc3RyZWFtLl9maW5hbCA9PT0gJ2Z1bmN0aW9uJyAmJiAhc3RhdGUuZGVzdHJveWVkKSB7XG4gICAgICBzdGF0ZS5wZW5kaW5nY2IrKztcbiAgICAgIHN0YXRlLmZpbmFsQ2FsbGVkID0gdHJ1ZTtcbiAgICAgIHByb2Nlc3MubmV4dFRpY2soY2FsbEZpbmFsLCBzdHJlYW0sIHN0YXRlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RhdGUucHJlZmluaXNoZWQgPSB0cnVlO1xuICAgICAgc3RyZWFtLmVtaXQoJ3ByZWZpbmlzaCcpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBmaW5pc2hNYXliZShzdHJlYW0sIHN0YXRlKSB7XG4gIHZhciBuZWVkID0gbmVlZEZpbmlzaChzdGF0ZSk7XG5cbiAgaWYgKG5lZWQpIHtcbiAgICBwcmVmaW5pc2goc3RyZWFtLCBzdGF0ZSk7XG5cbiAgICBpZiAoc3RhdGUucGVuZGluZ2NiID09PSAwKSB7XG4gICAgICBzdGF0ZS5maW5pc2hlZCA9IHRydWU7XG4gICAgICBzdHJlYW0uZW1pdCgnZmluaXNoJyk7XG5cbiAgICAgIGlmIChzdGF0ZS5hdXRvRGVzdHJveSkge1xuICAgICAgICAvLyBJbiBjYXNlIG9mIGR1cGxleCBzdHJlYW1zIHdlIG5lZWQgYSB3YXkgdG8gZGV0ZWN0XG4gICAgICAgIC8vIGlmIHRoZSByZWFkYWJsZSBzaWRlIGlzIHJlYWR5IGZvciBhdXRvRGVzdHJveSBhcyB3ZWxsXG4gICAgICAgIHZhciByU3RhdGUgPSBzdHJlYW0uX3JlYWRhYmxlU3RhdGU7XG5cbiAgICAgICAgaWYgKCFyU3RhdGUgfHwgclN0YXRlLmF1dG9EZXN0cm95ICYmIHJTdGF0ZS5lbmRFbWl0dGVkKSB7XG4gICAgICAgICAgc3RyZWFtLmRlc3Ryb3koKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZWVkO1xufVxuXG5mdW5jdGlvbiBlbmRXcml0YWJsZShzdHJlYW0sIHN0YXRlLCBjYikge1xuICBzdGF0ZS5lbmRpbmcgPSB0cnVlO1xuICBmaW5pc2hNYXliZShzdHJlYW0sIHN0YXRlKTtcblxuICBpZiAoY2IpIHtcbiAgICBpZiAoc3RhdGUuZmluaXNoZWQpIHByb2Nlc3MubmV4dFRpY2soY2IpO2Vsc2Ugc3RyZWFtLm9uY2UoJ2ZpbmlzaCcsIGNiKTtcbiAgfVxuXG4gIHN0YXRlLmVuZGVkID0gdHJ1ZTtcbiAgc3RyZWFtLndyaXRhYmxlID0gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIG9uQ29ya2VkRmluaXNoKGNvcmtSZXEsIHN0YXRlLCBlcnIpIHtcbiAgdmFyIGVudHJ5ID0gY29ya1JlcS5lbnRyeTtcbiAgY29ya1JlcS5lbnRyeSA9IG51bGw7XG5cbiAgd2hpbGUgKGVudHJ5KSB7XG4gICAgdmFyIGNiID0gZW50cnkuY2FsbGJhY2s7XG4gICAgc3RhdGUucGVuZGluZ2NiLS07XG4gICAgY2IoZXJyKTtcbiAgICBlbnRyeSA9IGVudHJ5Lm5leHQ7XG4gIH0gLy8gcmV1c2UgdGhlIGZyZWUgY29ya1JlcS5cblxuXG4gIHN0YXRlLmNvcmtlZFJlcXVlc3RzRnJlZS5uZXh0ID0gY29ya1JlcTtcbn1cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KFdyaXRhYmxlLnByb3RvdHlwZSwgJ2Rlc3Ryb3llZCcsIHtcbiAgLy8gbWFraW5nIGl0IGV4cGxpY2l0IHRoaXMgcHJvcGVydHkgaXMgbm90IGVudW1lcmFibGVcbiAgLy8gYmVjYXVzZSBvdGhlcndpc2Ugc29tZSBwcm90b3R5cGUgbWFuaXB1bGF0aW9uIGluXG4gIC8vIHVzZXJsYW5kIHdpbGwgZmFpbFxuICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgaWYgKHRoaXMuX3dyaXRhYmxlU3RhdGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl93cml0YWJsZVN0YXRlLmRlc3Ryb3llZDtcbiAgfSxcbiAgc2V0OiBmdW5jdGlvbiBzZXQodmFsdWUpIHtcbiAgICAvLyB3ZSBpZ25vcmUgdGhlIHZhbHVlIGlmIHRoZSBzdHJlYW1cbiAgICAvLyBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQgeWV0XG4gICAgaWYgKCF0aGlzLl93cml0YWJsZVN0YXRlKSB7XG4gICAgICByZXR1cm47XG4gICAgfSAvLyBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LCB0aGUgdXNlciBpcyBleHBsaWNpdGx5XG4gICAgLy8gbWFuYWdpbmcgZGVzdHJveWVkXG5cblxuICAgIHRoaXMuX3dyaXRhYmxlU3RhdGUuZGVzdHJveWVkID0gdmFsdWU7XG4gIH1cbn0pO1xuV3JpdGFibGUucHJvdG90eXBlLmRlc3Ryb3kgPSBkZXN0cm95SW1wbC5kZXN0cm95O1xuV3JpdGFibGUucHJvdG90eXBlLl91bmRlc3Ryb3kgPSBkZXN0cm95SW1wbC51bmRlc3Ryb3k7XG5cbldyaXRhYmxlLnByb3RvdHlwZS5fZGVzdHJveSA9IGZ1bmN0aW9uIChlcnIsIGNiKSB7XG4gIGNiKGVycik7XG59OyIsIid1c2Ugc3RyaWN0JztcblxudmFyIF9PYmplY3Qkc2V0UHJvdG90eXBlTztcblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkgeyBpZiAoa2V5IGluIG9iaikgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHsgdmFsdWU6IHZhbHVlLCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlIH0pOyB9IGVsc2UgeyBvYmpba2V5XSA9IHZhbHVlOyB9IHJldHVybiBvYmo7IH1cblxudmFyIGZpbmlzaGVkID0gcmVxdWlyZSgnLi9lbmQtb2Ytc3RyZWFtJyk7XG5cbnZhciBrTGFzdFJlc29sdmUgPSBTeW1ib2woJ2xhc3RSZXNvbHZlJyk7XG52YXIga0xhc3RSZWplY3QgPSBTeW1ib2woJ2xhc3RSZWplY3QnKTtcbnZhciBrRXJyb3IgPSBTeW1ib2woJ2Vycm9yJyk7XG52YXIga0VuZGVkID0gU3ltYm9sKCdlbmRlZCcpO1xudmFyIGtMYXN0UHJvbWlzZSA9IFN5bWJvbCgnbGFzdFByb21pc2UnKTtcbnZhciBrSGFuZGxlUHJvbWlzZSA9IFN5bWJvbCgnaGFuZGxlUHJvbWlzZScpO1xudmFyIGtTdHJlYW0gPSBTeW1ib2woJ3N0cmVhbScpO1xuXG5mdW5jdGlvbiBjcmVhdGVJdGVyUmVzdWx0KHZhbHVlLCBkb25lKSB7XG4gIHJldHVybiB7XG4gICAgdmFsdWU6IHZhbHVlLFxuICAgIGRvbmU6IGRvbmVcbiAgfTtcbn1cblxuZnVuY3Rpb24gcmVhZEFuZFJlc29sdmUoaXRlcikge1xuICB2YXIgcmVzb2x2ZSA9IGl0ZXJba0xhc3RSZXNvbHZlXTtcblxuICBpZiAocmVzb2x2ZSAhPT0gbnVsbCkge1xuICAgIHZhciBkYXRhID0gaXRlcltrU3RyZWFtXS5yZWFkKCk7IC8vIHdlIGRlZmVyIGlmIGRhdGEgaXMgbnVsbFxuICAgIC8vIHdlIGNhbiBiZSBleHBlY3RpbmcgZWl0aGVyICdlbmQnIG9yXG4gICAgLy8gJ2Vycm9yJ1xuXG4gICAgaWYgKGRhdGEgIT09IG51bGwpIHtcbiAgICAgIGl0ZXJba0xhc3RQcm9taXNlXSA9IG51bGw7XG4gICAgICBpdGVyW2tMYXN0UmVzb2x2ZV0gPSBudWxsO1xuICAgICAgaXRlcltrTGFzdFJlamVjdF0gPSBudWxsO1xuICAgICAgcmVzb2x2ZShjcmVhdGVJdGVyUmVzdWx0KGRhdGEsIGZhbHNlKSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIG9uUmVhZGFibGUoaXRlcikge1xuICAvLyB3ZSB3YWl0IGZvciB0aGUgbmV4dCB0aWNrLCBiZWNhdXNlIGl0IG1pZ2h0XG4gIC8vIGVtaXQgYW4gZXJyb3Igd2l0aCBwcm9jZXNzLm5leHRUaWNrXG4gIHByb2Nlc3MubmV4dFRpY2socmVhZEFuZFJlc29sdmUsIGl0ZXIpO1xufVxuXG5mdW5jdGlvbiB3cmFwRm9yTmV4dChsYXN0UHJvbWlzZSwgaXRlcikge1xuICByZXR1cm4gZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgIGxhc3RQcm9taXNlLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKGl0ZXJba0VuZGVkXSkge1xuICAgICAgICByZXNvbHZlKGNyZWF0ZUl0ZXJSZXN1bHQodW5kZWZpbmVkLCB0cnVlKSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaXRlcltrSGFuZGxlUHJvbWlzZV0ocmVzb2x2ZSwgcmVqZWN0KTtcbiAgICB9LCByZWplY3QpO1xuICB9O1xufVxuXG52YXIgQXN5bmNJdGVyYXRvclByb3RvdHlwZSA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihmdW5jdGlvbiAoKSB7fSk7XG52YXIgUmVhZGFibGVTdHJlYW1Bc3luY0l0ZXJhdG9yUHJvdG90eXBlID0gT2JqZWN0LnNldFByb3RvdHlwZU9mKChfT2JqZWN0JHNldFByb3RvdHlwZU8gPSB7XG4gIGdldCBzdHJlYW0oKSB7XG4gICAgcmV0dXJuIHRoaXNba1N0cmVhbV07XG4gIH0sXG5cbiAgbmV4dDogZnVuY3Rpb24gbmV4dCgpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgLy8gaWYgd2UgaGF2ZSBkZXRlY3RlZCBhbiBlcnJvciBpbiB0aGUgbWVhbndoaWxlXG4gICAgLy8gcmVqZWN0IHN0cmFpZ2h0IGF3YXlcbiAgICB2YXIgZXJyb3IgPSB0aGlzW2tFcnJvcl07XG5cbiAgICBpZiAoZXJyb3IgIT09IG51bGwpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlcnJvcik7XG4gICAgfVxuXG4gICAgaWYgKHRoaXNba0VuZGVkXSkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShjcmVhdGVJdGVyUmVzdWx0KHVuZGVmaW5lZCwgdHJ1ZSkpO1xuICAgIH1cblxuICAgIGlmICh0aGlzW2tTdHJlYW1dLmRlc3Ryb3llZCkge1xuICAgICAgLy8gV2UgbmVlZCB0byBkZWZlciB2aWEgbmV4dFRpY2sgYmVjYXVzZSBpZiAuZGVzdHJveShlcnIpIGlzXG4gICAgICAvLyBjYWxsZWQsIHRoZSBlcnJvciB3aWxsIGJlIGVtaXR0ZWQgdmlhIG5leHRUaWNrLCBhbmRcbiAgICAgIC8vIHdlIGNhbm5vdCBndWFyYW50ZWUgdGhhdCB0aGVyZSBpcyBubyBlcnJvciBsaW5nZXJpbmcgYXJvdW5kXG4gICAgICAvLyB3YWl0aW5nIHRvIGJlIGVtaXR0ZWQuXG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBwcm9jZXNzLm5leHRUaWNrKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpZiAoX3RoaXNba0Vycm9yXSkge1xuICAgICAgICAgICAgcmVqZWN0KF90aGlzW2tFcnJvcl0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXNvbHZlKGNyZWF0ZUl0ZXJSZXN1bHQodW5kZWZpbmVkLCB0cnVlKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0gLy8gaWYgd2UgaGF2ZSBtdWx0aXBsZSBuZXh0KCkgY2FsbHNcbiAgICAvLyB3ZSB3aWxsIHdhaXQgZm9yIHRoZSBwcmV2aW91cyBQcm9taXNlIHRvIGZpbmlzaFxuICAgIC8vIHRoaXMgbG9naWMgaXMgb3B0aW1pemVkIHRvIHN1cHBvcnQgZm9yIGF3YWl0IGxvb3BzLFxuICAgIC8vIHdoZXJlIG5leHQoKSBpcyBvbmx5IGNhbGxlZCBvbmNlIGF0IGEgdGltZVxuXG5cbiAgICB2YXIgbGFzdFByb21pc2UgPSB0aGlzW2tMYXN0UHJvbWlzZV07XG4gICAgdmFyIHByb21pc2U7XG5cbiAgICBpZiAobGFzdFByb21pc2UpIHtcbiAgICAgIHByb21pc2UgPSBuZXcgUHJvbWlzZSh3cmFwRm9yTmV4dChsYXN0UHJvbWlzZSwgdGhpcykpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBmYXN0IHBhdGggbmVlZGVkIHRvIHN1cHBvcnQgbXVsdGlwbGUgdGhpcy5wdXNoKClcbiAgICAgIC8vIHdpdGhvdXQgdHJpZ2dlcmluZyB0aGUgbmV4dCgpIHF1ZXVlXG4gICAgICB2YXIgZGF0YSA9IHRoaXNba1N0cmVhbV0ucmVhZCgpO1xuXG4gICAgICBpZiAoZGF0YSAhPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGNyZWF0ZUl0ZXJSZXN1bHQoZGF0YSwgZmFsc2UpKTtcbiAgICAgIH1cblxuICAgICAgcHJvbWlzZSA9IG5ldyBQcm9taXNlKHRoaXNba0hhbmRsZVByb21pc2VdKTtcbiAgICB9XG5cbiAgICB0aGlzW2tMYXN0UHJvbWlzZV0gPSBwcm9taXNlO1xuICAgIHJldHVybiBwcm9taXNlO1xuICB9XG59LCBfZGVmaW5lUHJvcGVydHkoX09iamVjdCRzZXRQcm90b3R5cGVPLCBTeW1ib2wuYXN5bmNJdGVyYXRvciwgZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcztcbn0pLCBfZGVmaW5lUHJvcGVydHkoX09iamVjdCRzZXRQcm90b3R5cGVPLCBcInJldHVyblwiLCBmdW5jdGlvbiBfcmV0dXJuKCkge1xuICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAvLyBkZXN0cm95KGVyciwgY2IpIGlzIGEgcHJpdmF0ZSBBUElcbiAgLy8gd2UgY2FuIGd1YXJhbnRlZSB3ZSBoYXZlIHRoYXQgaGVyZSwgYmVjYXVzZSB3ZSBjb250cm9sIHRoZVxuICAvLyBSZWFkYWJsZSBjbGFzcyB0aGlzIGlzIGF0dGFjaGVkIHRvXG4gIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgX3RoaXMyW2tTdHJlYW1dLmRlc3Ryb3kobnVsbCwgZnVuY3Rpb24gKGVycikge1xuICAgICAgaWYgKGVycikge1xuICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICByZXNvbHZlKGNyZWF0ZUl0ZXJSZXN1bHQodW5kZWZpbmVkLCB0cnVlKSk7XG4gICAgfSk7XG4gIH0pO1xufSksIF9PYmplY3Qkc2V0UHJvdG90eXBlTyksIEFzeW5jSXRlcmF0b3JQcm90b3R5cGUpO1xuXG52YXIgY3JlYXRlUmVhZGFibGVTdHJlYW1Bc3luY0l0ZXJhdG9yID0gZnVuY3Rpb24gY3JlYXRlUmVhZGFibGVTdHJlYW1Bc3luY0l0ZXJhdG9yKHN0cmVhbSkge1xuICB2YXIgX09iamVjdCRjcmVhdGU7XG5cbiAgdmFyIGl0ZXJhdG9yID0gT2JqZWN0LmNyZWF0ZShSZWFkYWJsZVN0cmVhbUFzeW5jSXRlcmF0b3JQcm90b3R5cGUsIChfT2JqZWN0JGNyZWF0ZSA9IHt9LCBfZGVmaW5lUHJvcGVydHkoX09iamVjdCRjcmVhdGUsIGtTdHJlYW0sIHtcbiAgICB2YWx1ZTogc3RyZWFtLFxuICAgIHdyaXRhYmxlOiB0cnVlXG4gIH0pLCBfZGVmaW5lUHJvcGVydHkoX09iamVjdCRjcmVhdGUsIGtMYXN0UmVzb2x2ZSwge1xuICAgIHZhbHVlOiBudWxsLFxuICAgIHdyaXRhYmxlOiB0cnVlXG4gIH0pLCBfZGVmaW5lUHJvcGVydHkoX09iamVjdCRjcmVhdGUsIGtMYXN0UmVqZWN0LCB7XG4gICAgdmFsdWU6IG51bGwsXG4gICAgd3JpdGFibGU6IHRydWVcbiAgfSksIF9kZWZpbmVQcm9wZXJ0eShfT2JqZWN0JGNyZWF0ZSwga0Vycm9yLCB7XG4gICAgdmFsdWU6IG51bGwsXG4gICAgd3JpdGFibGU6IHRydWVcbiAgfSksIF9kZWZpbmVQcm9wZXJ0eShfT2JqZWN0JGNyZWF0ZSwga0VuZGVkLCB7XG4gICAgdmFsdWU6IHN0cmVhbS5fcmVhZGFibGVTdGF0ZS5lbmRFbWl0dGVkLFxuICAgIHdyaXRhYmxlOiB0cnVlXG4gIH0pLCBfZGVmaW5lUHJvcGVydHkoX09iamVjdCRjcmVhdGUsIGtIYW5kbGVQcm9taXNlLCB7XG4gICAgdmFsdWU6IGZ1bmN0aW9uIHZhbHVlKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgdmFyIGRhdGEgPSBpdGVyYXRvcltrU3RyZWFtXS5yZWFkKCk7XG5cbiAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgIGl0ZXJhdG9yW2tMYXN0UHJvbWlzZV0gPSBudWxsO1xuICAgICAgICBpdGVyYXRvcltrTGFzdFJlc29sdmVdID0gbnVsbDtcbiAgICAgICAgaXRlcmF0b3Jba0xhc3RSZWplY3RdID0gbnVsbDtcbiAgICAgICAgcmVzb2x2ZShjcmVhdGVJdGVyUmVzdWx0KGRhdGEsIGZhbHNlKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpdGVyYXRvcltrTGFzdFJlc29sdmVdID0gcmVzb2x2ZTtcbiAgICAgICAgaXRlcmF0b3Jba0xhc3RSZWplY3RdID0gcmVqZWN0O1xuICAgICAgfVxuICAgIH0sXG4gICAgd3JpdGFibGU6IHRydWVcbiAgfSksIF9PYmplY3QkY3JlYXRlKSk7XG4gIGl0ZXJhdG9yW2tMYXN0UHJvbWlzZV0gPSBudWxsO1xuICBmaW5pc2hlZChzdHJlYW0sIGZ1bmN0aW9uIChlcnIpIHtcbiAgICBpZiAoZXJyICYmIGVyci5jb2RlICE9PSAnRVJSX1NUUkVBTV9QUkVNQVRVUkVfQ0xPU0UnKSB7XG4gICAgICB2YXIgcmVqZWN0ID0gaXRlcmF0b3Jba0xhc3RSZWplY3RdOyAvLyByZWplY3QgaWYgd2UgYXJlIHdhaXRpbmcgZm9yIGRhdGEgaW4gdGhlIFByb21pc2VcbiAgICAgIC8vIHJldHVybmVkIGJ5IG5leHQoKSBhbmQgc3RvcmUgdGhlIGVycm9yXG5cbiAgICAgIGlmIChyZWplY3QgIT09IG51bGwpIHtcbiAgICAgICAgaXRlcmF0b3Jba0xhc3RQcm9taXNlXSA9IG51bGw7XG4gICAgICAgIGl0ZXJhdG9yW2tMYXN0UmVzb2x2ZV0gPSBudWxsO1xuICAgICAgICBpdGVyYXRvcltrTGFzdFJlamVjdF0gPSBudWxsO1xuICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgIH1cblxuICAgICAgaXRlcmF0b3Jba0Vycm9yXSA9IGVycjtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgcmVzb2x2ZSA9IGl0ZXJhdG9yW2tMYXN0UmVzb2x2ZV07XG5cbiAgICBpZiAocmVzb2x2ZSAhPT0gbnVsbCkge1xuICAgICAgaXRlcmF0b3Jba0xhc3RQcm9taXNlXSA9IG51bGw7XG4gICAgICBpdGVyYXRvcltrTGFzdFJlc29sdmVdID0gbnVsbDtcbiAgICAgIGl0ZXJhdG9yW2tMYXN0UmVqZWN0XSA9IG51bGw7XG4gICAgICByZXNvbHZlKGNyZWF0ZUl0ZXJSZXN1bHQodW5kZWZpbmVkLCB0cnVlKSk7XG4gICAgfVxuXG4gICAgaXRlcmF0b3Jba0VuZGVkXSA9IHRydWU7XG4gIH0pO1xuICBzdHJlYW0ub24oJ3JlYWRhYmxlJywgb25SZWFkYWJsZS5iaW5kKG51bGwsIGl0ZXJhdG9yKSk7XG4gIHJldHVybiBpdGVyYXRvcjtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gY3JlYXRlUmVhZGFibGVTdHJlYW1Bc3luY0l0ZXJhdG9yOyIsIid1c2Ugc3RyaWN0JztcblxuZnVuY3Rpb24gb3duS2V5cyhvYmplY3QsIGVudW1lcmFibGVPbmx5KSB7IHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KTsgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHsgdmFyIHN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG9iamVjdCk7IGlmIChlbnVtZXJhYmxlT25seSkgc3ltYm9scyA9IHN5bWJvbHMuZmlsdGVyKGZ1bmN0aW9uIChzeW0pIHsgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBzeW0pLmVudW1lcmFibGU7IH0pOyBrZXlzLnB1c2guYXBwbHkoa2V5cywgc3ltYm9scyk7IH0gcmV0dXJuIGtleXM7IH1cblxuZnVuY3Rpb24gX29iamVjdFNwcmVhZCh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXSAhPSBudWxsID8gYXJndW1lbnRzW2ldIDoge307IGlmIChpICUgMikgeyBvd25LZXlzKE9iamVjdChzb3VyY2UpLCB0cnVlKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgX2RlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7IH0pOyB9IGVsc2UgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoc291cmNlKSk7IH0gZWxzZSB7IG93bktleXMoT2JqZWN0KHNvdXJjZSkpLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBrZXkpKTsgfSk7IH0gfSByZXR1cm4gdGFyZ2V0OyB9XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHsgaWYgKGtleSBpbiBvYmopIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7IHZhbHVlOiB2YWx1ZSwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSB9KTsgfSBlbHNlIHsgb2JqW2tleV0gPSB2YWx1ZTsgfSByZXR1cm4gb2JqOyB9XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH1cblxuZnVuY3Rpb24gX2NyZWF0ZUNsYXNzKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH1cblxudmFyIF9yZXF1aXJlID0gcmVxdWlyZSgnYnVmZmVyJyksXG4gICAgQnVmZmVyID0gX3JlcXVpcmUuQnVmZmVyO1xuXG52YXIgX3JlcXVpcmUyID0gcmVxdWlyZSgndXRpbCcpLFxuICAgIGluc3BlY3QgPSBfcmVxdWlyZTIuaW5zcGVjdDtcblxudmFyIGN1c3RvbSA9IGluc3BlY3QgJiYgaW5zcGVjdC5jdXN0b20gfHwgJ2luc3BlY3QnO1xuXG5mdW5jdGlvbiBjb3B5QnVmZmVyKHNyYywgdGFyZ2V0LCBvZmZzZXQpIHtcbiAgQnVmZmVyLnByb3RvdHlwZS5jb3B5LmNhbGwoc3JjLCB0YXJnZXQsIG9mZnNldCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gQnVmZmVyTGlzdCgpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgQnVmZmVyTGlzdCk7XG5cbiAgICB0aGlzLmhlYWQgPSBudWxsO1xuICAgIHRoaXMudGFpbCA9IG51bGw7XG4gICAgdGhpcy5sZW5ndGggPSAwO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKEJ1ZmZlckxpc3QsIFt7XG4gICAga2V5OiBcInB1c2hcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcHVzaCh2KSB7XG4gICAgICB2YXIgZW50cnkgPSB7XG4gICAgICAgIGRhdGE6IHYsXG4gICAgICAgIG5leHQ6IG51bGxcbiAgICAgIH07XG4gICAgICBpZiAodGhpcy5sZW5ndGggPiAwKSB0aGlzLnRhaWwubmV4dCA9IGVudHJ5O2Vsc2UgdGhpcy5oZWFkID0gZW50cnk7XG4gICAgICB0aGlzLnRhaWwgPSBlbnRyeTtcbiAgICAgICsrdGhpcy5sZW5ndGg7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInVuc2hpZnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gdW5zaGlmdCh2KSB7XG4gICAgICB2YXIgZW50cnkgPSB7XG4gICAgICAgIGRhdGE6IHYsXG4gICAgICAgIG5leHQ6IHRoaXMuaGVhZFxuICAgICAgfTtcbiAgICAgIGlmICh0aGlzLmxlbmd0aCA9PT0gMCkgdGhpcy50YWlsID0gZW50cnk7XG4gICAgICB0aGlzLmhlYWQgPSBlbnRyeTtcbiAgICAgICsrdGhpcy5sZW5ndGg7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInNoaWZ0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNoaWZ0KCkge1xuICAgICAgaWYgKHRoaXMubGVuZ3RoID09PSAwKSByZXR1cm47XG4gICAgICB2YXIgcmV0ID0gdGhpcy5oZWFkLmRhdGE7XG4gICAgICBpZiAodGhpcy5sZW5ndGggPT09IDEpIHRoaXMuaGVhZCA9IHRoaXMudGFpbCA9IG51bGw7ZWxzZSB0aGlzLmhlYWQgPSB0aGlzLmhlYWQubmV4dDtcbiAgICAgIC0tdGhpcy5sZW5ndGg7XG4gICAgICByZXR1cm4gcmV0O1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJjbGVhclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjbGVhcigpIHtcbiAgICAgIHRoaXMuaGVhZCA9IHRoaXMudGFpbCA9IG51bGw7XG4gICAgICB0aGlzLmxlbmd0aCA9IDA7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImpvaW5cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gam9pbihzKSB7XG4gICAgICBpZiAodGhpcy5sZW5ndGggPT09IDApIHJldHVybiAnJztcbiAgICAgIHZhciBwID0gdGhpcy5oZWFkO1xuICAgICAgdmFyIHJldCA9ICcnICsgcC5kYXRhO1xuXG4gICAgICB3aGlsZSAocCA9IHAubmV4dCkge1xuICAgICAgICByZXQgKz0gcyArIHAuZGF0YTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJldDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiY29uY2F0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvbmNhdChuKSB7XG4gICAgICBpZiAodGhpcy5sZW5ndGggPT09IDApIHJldHVybiBCdWZmZXIuYWxsb2MoMCk7XG4gICAgICB2YXIgcmV0ID0gQnVmZmVyLmFsbG9jVW5zYWZlKG4gPj4+IDApO1xuICAgICAgdmFyIHAgPSB0aGlzLmhlYWQ7XG4gICAgICB2YXIgaSA9IDA7XG5cbiAgICAgIHdoaWxlIChwKSB7XG4gICAgICAgIGNvcHlCdWZmZXIocC5kYXRhLCByZXQsIGkpO1xuICAgICAgICBpICs9IHAuZGF0YS5sZW5ndGg7XG4gICAgICAgIHAgPSBwLm5leHQ7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXQ7XG4gICAgfSAvLyBDb25zdW1lcyBhIHNwZWNpZmllZCBhbW91bnQgb2YgYnl0ZXMgb3IgY2hhcmFjdGVycyBmcm9tIHRoZSBidWZmZXJlZCBkYXRhLlxuXG4gIH0sIHtcbiAgICBrZXk6IFwiY29uc3VtZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjb25zdW1lKG4sIGhhc1N0cmluZ3MpIHtcbiAgICAgIHZhciByZXQ7XG5cbiAgICAgIGlmIChuIDwgdGhpcy5oZWFkLmRhdGEubGVuZ3RoKSB7XG4gICAgICAgIC8vIGBzbGljZWAgaXMgdGhlIHNhbWUgZm9yIGJ1ZmZlcnMgYW5kIHN0cmluZ3MuXG4gICAgICAgIHJldCA9IHRoaXMuaGVhZC5kYXRhLnNsaWNlKDAsIG4pO1xuICAgICAgICB0aGlzLmhlYWQuZGF0YSA9IHRoaXMuaGVhZC5kYXRhLnNsaWNlKG4pO1xuICAgICAgfSBlbHNlIGlmIChuID09PSB0aGlzLmhlYWQuZGF0YS5sZW5ndGgpIHtcbiAgICAgICAgLy8gRmlyc3QgY2h1bmsgaXMgYSBwZXJmZWN0IG1hdGNoLlxuICAgICAgICByZXQgPSB0aGlzLnNoaWZ0KCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBSZXN1bHQgc3BhbnMgbW9yZSB0aGFuIG9uZSBidWZmZXIuXG4gICAgICAgIHJldCA9IGhhc1N0cmluZ3MgPyB0aGlzLl9nZXRTdHJpbmcobikgOiB0aGlzLl9nZXRCdWZmZXIobik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXQ7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImZpcnN0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGZpcnN0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuaGVhZC5kYXRhO1xuICAgIH0gLy8gQ29uc3VtZXMgYSBzcGVjaWZpZWQgYW1vdW50IG9mIGNoYXJhY3RlcnMgZnJvbSB0aGUgYnVmZmVyZWQgZGF0YS5cblxuICB9LCB7XG4gICAga2V5OiBcIl9nZXRTdHJpbmdcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gX2dldFN0cmluZyhuKSB7XG4gICAgICB2YXIgcCA9IHRoaXMuaGVhZDtcbiAgICAgIHZhciBjID0gMTtcbiAgICAgIHZhciByZXQgPSBwLmRhdGE7XG4gICAgICBuIC09IHJldC5sZW5ndGg7XG5cbiAgICAgIHdoaWxlIChwID0gcC5uZXh0KSB7XG4gICAgICAgIHZhciBzdHIgPSBwLmRhdGE7XG4gICAgICAgIHZhciBuYiA9IG4gPiBzdHIubGVuZ3RoID8gc3RyLmxlbmd0aCA6IG47XG4gICAgICAgIGlmIChuYiA9PT0gc3RyLmxlbmd0aCkgcmV0ICs9IHN0cjtlbHNlIHJldCArPSBzdHIuc2xpY2UoMCwgbik7XG4gICAgICAgIG4gLT0gbmI7XG5cbiAgICAgICAgaWYgKG4gPT09IDApIHtcbiAgICAgICAgICBpZiAobmIgPT09IHN0ci5sZW5ndGgpIHtcbiAgICAgICAgICAgICsrYztcbiAgICAgICAgICAgIGlmIChwLm5leHQpIHRoaXMuaGVhZCA9IHAubmV4dDtlbHNlIHRoaXMuaGVhZCA9IHRoaXMudGFpbCA9IG51bGw7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuaGVhZCA9IHA7XG4gICAgICAgICAgICBwLmRhdGEgPSBzdHIuc2xpY2UobmIpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgKytjO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmxlbmd0aCAtPSBjO1xuICAgICAgcmV0dXJuIHJldDtcbiAgICB9IC8vIENvbnN1bWVzIGEgc3BlY2lmaWVkIGFtb3VudCBvZiBieXRlcyBmcm9tIHRoZSBidWZmZXJlZCBkYXRhLlxuXG4gIH0sIHtcbiAgICBrZXk6IFwiX2dldEJ1ZmZlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfZ2V0QnVmZmVyKG4pIHtcbiAgICAgIHZhciByZXQgPSBCdWZmZXIuYWxsb2NVbnNhZmUobik7XG4gICAgICB2YXIgcCA9IHRoaXMuaGVhZDtcbiAgICAgIHZhciBjID0gMTtcbiAgICAgIHAuZGF0YS5jb3B5KHJldCk7XG4gICAgICBuIC09IHAuZGF0YS5sZW5ndGg7XG5cbiAgICAgIHdoaWxlIChwID0gcC5uZXh0KSB7XG4gICAgICAgIHZhciBidWYgPSBwLmRhdGE7XG4gICAgICAgIHZhciBuYiA9IG4gPiBidWYubGVuZ3RoID8gYnVmLmxlbmd0aCA6IG47XG4gICAgICAgIGJ1Zi5jb3B5KHJldCwgcmV0Lmxlbmd0aCAtIG4sIDAsIG5iKTtcbiAgICAgICAgbiAtPSBuYjtcblxuICAgICAgICBpZiAobiA9PT0gMCkge1xuICAgICAgICAgIGlmIChuYiA9PT0gYnVmLmxlbmd0aCkge1xuICAgICAgICAgICAgKytjO1xuICAgICAgICAgICAgaWYgKHAubmV4dCkgdGhpcy5oZWFkID0gcC5uZXh0O2Vsc2UgdGhpcy5oZWFkID0gdGhpcy50YWlsID0gbnVsbDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5oZWFkID0gcDtcbiAgICAgICAgICAgIHAuZGF0YSA9IGJ1Zi5zbGljZShuYik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICArK2M7XG4gICAgICB9XG5cbiAgICAgIHRoaXMubGVuZ3RoIC09IGM7XG4gICAgICByZXR1cm4gcmV0O1xuICAgIH0gLy8gTWFrZSBzdXJlIHRoZSBsaW5rZWQgbGlzdCBvbmx5IHNob3dzIHRoZSBtaW5pbWFsIG5lY2Vzc2FyeSBpbmZvcm1hdGlvbi5cblxuICB9LCB7XG4gICAga2V5OiBjdXN0b20sXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHZhbHVlKF8sIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBpbnNwZWN0KHRoaXMsIF9vYmplY3RTcHJlYWQoe30sIG9wdGlvbnMsIHtcbiAgICAgICAgLy8gT25seSBpbnNwZWN0IG9uZSBsZXZlbC5cbiAgICAgICAgZGVwdGg6IDAsXG4gICAgICAgIC8vIEl0IHNob3VsZCBub3QgcmVjdXJzZS5cbiAgICAgICAgY3VzdG9tSW5zcGVjdDogZmFsc2VcbiAgICAgIH0pKTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gQnVmZmVyTGlzdDtcbn0oKTsiLCIndXNlIHN0cmljdCc7IC8vIHVuZG9jdW1lbnRlZCBjYigpIEFQSSwgbmVlZGVkIGZvciBjb3JlLCBub3QgZm9yIHB1YmxpYyBBUElcblxuZnVuY3Rpb24gZGVzdHJveShlcnIsIGNiKSB7XG4gIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgdmFyIHJlYWRhYmxlRGVzdHJveWVkID0gdGhpcy5fcmVhZGFibGVTdGF0ZSAmJiB0aGlzLl9yZWFkYWJsZVN0YXRlLmRlc3Ryb3llZDtcbiAgdmFyIHdyaXRhYmxlRGVzdHJveWVkID0gdGhpcy5fd3JpdGFibGVTdGF0ZSAmJiB0aGlzLl93cml0YWJsZVN0YXRlLmRlc3Ryb3llZDtcblxuICBpZiAocmVhZGFibGVEZXN0cm95ZWQgfHwgd3JpdGFibGVEZXN0cm95ZWQpIHtcbiAgICBpZiAoY2IpIHtcbiAgICAgIGNiKGVycik7XG4gICAgfSBlbHNlIGlmIChlcnIpIHtcbiAgICAgIGlmICghdGhpcy5fd3JpdGFibGVTdGF0ZSkge1xuICAgICAgICBwcm9jZXNzLm5leHRUaWNrKGVtaXRFcnJvck5ULCB0aGlzLCBlcnIpO1xuICAgICAgfSBlbHNlIGlmICghdGhpcy5fd3JpdGFibGVTdGF0ZS5lcnJvckVtaXR0ZWQpIHtcbiAgICAgICAgdGhpcy5fd3JpdGFibGVTdGF0ZS5lcnJvckVtaXR0ZWQgPSB0cnVlO1xuICAgICAgICBwcm9jZXNzLm5leHRUaWNrKGVtaXRFcnJvck5ULCB0aGlzLCBlcnIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9IC8vIHdlIHNldCBkZXN0cm95ZWQgdG8gdHJ1ZSBiZWZvcmUgZmlyaW5nIGVycm9yIGNhbGxiYWNrcyBpbiBvcmRlclxuICAvLyB0byBtYWtlIGl0IHJlLWVudHJhbmNlIHNhZmUgaW4gY2FzZSBkZXN0cm95KCkgaXMgY2FsbGVkIHdpdGhpbiBjYWxsYmFja3NcblxuXG4gIGlmICh0aGlzLl9yZWFkYWJsZVN0YXRlKSB7XG4gICAgdGhpcy5fcmVhZGFibGVTdGF0ZS5kZXN0cm95ZWQgPSB0cnVlO1xuICB9IC8vIGlmIHRoaXMgaXMgYSBkdXBsZXggc3RyZWFtIG1hcmsgdGhlIHdyaXRhYmxlIHBhcnQgYXMgZGVzdHJveWVkIGFzIHdlbGxcblxuXG4gIGlmICh0aGlzLl93cml0YWJsZVN0YXRlKSB7XG4gICAgdGhpcy5fd3JpdGFibGVTdGF0ZS5kZXN0cm95ZWQgPSB0cnVlO1xuICB9XG5cbiAgdGhpcy5fZGVzdHJveShlcnIgfHwgbnVsbCwgZnVuY3Rpb24gKGVycikge1xuICAgIGlmICghY2IgJiYgZXJyKSB7XG4gICAgICBpZiAoIV90aGlzLl93cml0YWJsZVN0YXRlKSB7XG4gICAgICAgIHByb2Nlc3MubmV4dFRpY2soZW1pdEVycm9yQW5kQ2xvc2VOVCwgX3RoaXMsIGVycik7XG4gICAgICB9IGVsc2UgaWYgKCFfdGhpcy5fd3JpdGFibGVTdGF0ZS5lcnJvckVtaXR0ZWQpIHtcbiAgICAgICAgX3RoaXMuX3dyaXRhYmxlU3RhdGUuZXJyb3JFbWl0dGVkID0gdHJ1ZTtcbiAgICAgICAgcHJvY2Vzcy5uZXh0VGljayhlbWl0RXJyb3JBbmRDbG9zZU5ULCBfdGhpcywgZXJyKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHByb2Nlc3MubmV4dFRpY2soZW1pdENsb3NlTlQsIF90aGlzKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGNiKSB7XG4gICAgICBwcm9jZXNzLm5leHRUaWNrKGVtaXRDbG9zZU5ULCBfdGhpcyk7XG4gICAgICBjYihlcnIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBwcm9jZXNzLm5leHRUaWNrKGVtaXRDbG9zZU5ULCBfdGhpcyk7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gdGhpcztcbn1cblxuZnVuY3Rpb24gZW1pdEVycm9yQW5kQ2xvc2VOVChzZWxmLCBlcnIpIHtcbiAgZW1pdEVycm9yTlQoc2VsZiwgZXJyKTtcbiAgZW1pdENsb3NlTlQoc2VsZik7XG59XG5cbmZ1bmN0aW9uIGVtaXRDbG9zZU5UKHNlbGYpIHtcbiAgaWYgKHNlbGYuX3dyaXRhYmxlU3RhdGUgJiYgIXNlbGYuX3dyaXRhYmxlU3RhdGUuZW1pdENsb3NlKSByZXR1cm47XG4gIGlmIChzZWxmLl9yZWFkYWJsZVN0YXRlICYmICFzZWxmLl9yZWFkYWJsZVN0YXRlLmVtaXRDbG9zZSkgcmV0dXJuO1xuICBzZWxmLmVtaXQoJ2Nsb3NlJyk7XG59XG5cbmZ1bmN0aW9uIHVuZGVzdHJveSgpIHtcbiAgaWYgKHRoaXMuX3JlYWRhYmxlU3RhdGUpIHtcbiAgICB0aGlzLl9yZWFkYWJsZVN0YXRlLmRlc3Ryb3llZCA9IGZhbHNlO1xuICAgIHRoaXMuX3JlYWRhYmxlU3RhdGUucmVhZGluZyA9IGZhbHNlO1xuICAgIHRoaXMuX3JlYWRhYmxlU3RhdGUuZW5kZWQgPSBmYWxzZTtcbiAgICB0aGlzLl9yZWFkYWJsZVN0YXRlLmVuZEVtaXR0ZWQgPSBmYWxzZTtcbiAgfVxuXG4gIGlmICh0aGlzLl93cml0YWJsZVN0YXRlKSB7XG4gICAgdGhpcy5fd3JpdGFibGVTdGF0ZS5kZXN0cm95ZWQgPSBmYWxzZTtcbiAgICB0aGlzLl93cml0YWJsZVN0YXRlLmVuZGVkID0gZmFsc2U7XG4gICAgdGhpcy5fd3JpdGFibGVTdGF0ZS5lbmRpbmcgPSBmYWxzZTtcbiAgICB0aGlzLl93cml0YWJsZVN0YXRlLmZpbmFsQ2FsbGVkID0gZmFsc2U7XG4gICAgdGhpcy5fd3JpdGFibGVTdGF0ZS5wcmVmaW5pc2hlZCA9IGZhbHNlO1xuICAgIHRoaXMuX3dyaXRhYmxlU3RhdGUuZmluaXNoZWQgPSBmYWxzZTtcbiAgICB0aGlzLl93cml0YWJsZVN0YXRlLmVycm9yRW1pdHRlZCA9IGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGVtaXRFcnJvck5UKHNlbGYsIGVycikge1xuICBzZWxmLmVtaXQoJ2Vycm9yJywgZXJyKTtcbn1cblxuZnVuY3Rpb24gZXJyb3JPckRlc3Ryb3koc3RyZWFtLCBlcnIpIHtcbiAgLy8gV2UgaGF2ZSB0ZXN0cyB0aGF0IHJlbHkgb24gZXJyb3JzIGJlaW5nIGVtaXR0ZWRcbiAgLy8gaW4gdGhlIHNhbWUgdGljaywgc28gY2hhbmdpbmcgdGhpcyBpcyBzZW12ZXIgbWFqb3IuXG4gIC8vIEZvciBub3cgd2hlbiB5b3Ugb3B0LWluIHRvIGF1dG9EZXN0cm95IHdlIGFsbG93XG4gIC8vIHRoZSBlcnJvciB0byBiZSBlbWl0dGVkIG5leHRUaWNrLiBJbiBhIGZ1dHVyZVxuICAvLyBzZW12ZXIgbWFqb3IgdXBkYXRlIHdlIHNob3VsZCBjaGFuZ2UgdGhlIGRlZmF1bHQgdG8gdGhpcy5cbiAgdmFyIHJTdGF0ZSA9IHN0cmVhbS5fcmVhZGFibGVTdGF0ZTtcbiAgdmFyIHdTdGF0ZSA9IHN0cmVhbS5fd3JpdGFibGVTdGF0ZTtcbiAgaWYgKHJTdGF0ZSAmJiByU3RhdGUuYXV0b0Rlc3Ryb3kgfHwgd1N0YXRlICYmIHdTdGF0ZS5hdXRvRGVzdHJveSkgc3RyZWFtLmRlc3Ryb3koZXJyKTtlbHNlIHN0cmVhbS5lbWl0KCdlcnJvcicsIGVycik7XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBkZXN0cm95OiBkZXN0cm95LFxuICB1bmRlc3Ryb3k6IHVuZGVzdHJveSxcbiAgZXJyb3JPckRlc3Ryb3k6IGVycm9yT3JEZXN0cm95XG59OyIsIi8vIFBvcnRlZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9tYWZpbnRvc2gvZW5kLW9mLXN0cmVhbSB3aXRoXG4vLyBwZXJtaXNzaW9uIGZyb20gdGhlIGF1dGhvciwgTWF0aGlhcyBCdXVzIChAbWFmaW50b3NoKS5cbid1c2Ugc3RyaWN0JztcblxudmFyIEVSUl9TVFJFQU1fUFJFTUFUVVJFX0NMT1NFID0gcmVxdWlyZSgnLi4vLi4vLi4vZXJyb3JzJykuY29kZXMuRVJSX1NUUkVBTV9QUkVNQVRVUkVfQ0xPU0U7XG5cbmZ1bmN0aW9uIG9uY2UoY2FsbGJhY2spIHtcbiAgdmFyIGNhbGxlZCA9IGZhbHNlO1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIGlmIChjYWxsZWQpIHJldHVybjtcbiAgICBjYWxsZWQgPSB0cnVlO1xuXG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICBhcmdzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICAgIH1cblxuICAgIGNhbGxiYWNrLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBub29wKCkge31cblxuZnVuY3Rpb24gaXNSZXF1ZXN0KHN0cmVhbSkge1xuICByZXR1cm4gc3RyZWFtLnNldEhlYWRlciAmJiB0eXBlb2Ygc3RyZWFtLmFib3J0ID09PSAnZnVuY3Rpb24nO1xufVxuXG5mdW5jdGlvbiBlb3Moc3RyZWFtLCBvcHRzLCBjYWxsYmFjaykge1xuICBpZiAodHlwZW9mIG9wdHMgPT09ICdmdW5jdGlvbicpIHJldHVybiBlb3Moc3RyZWFtLCBudWxsLCBvcHRzKTtcbiAgaWYgKCFvcHRzKSBvcHRzID0ge307XG4gIGNhbGxiYWNrID0gb25jZShjYWxsYmFjayB8fCBub29wKTtcbiAgdmFyIHJlYWRhYmxlID0gb3B0cy5yZWFkYWJsZSB8fCBvcHRzLnJlYWRhYmxlICE9PSBmYWxzZSAmJiBzdHJlYW0ucmVhZGFibGU7XG4gIHZhciB3cml0YWJsZSA9IG9wdHMud3JpdGFibGUgfHwgb3B0cy53cml0YWJsZSAhPT0gZmFsc2UgJiYgc3RyZWFtLndyaXRhYmxlO1xuXG4gIHZhciBvbmxlZ2FjeWZpbmlzaCA9IGZ1bmN0aW9uIG9ubGVnYWN5ZmluaXNoKCkge1xuICAgIGlmICghc3RyZWFtLndyaXRhYmxlKSBvbmZpbmlzaCgpO1xuICB9O1xuXG4gIHZhciB3cml0YWJsZUVuZGVkID0gc3RyZWFtLl93cml0YWJsZVN0YXRlICYmIHN0cmVhbS5fd3JpdGFibGVTdGF0ZS5maW5pc2hlZDtcblxuICB2YXIgb25maW5pc2ggPSBmdW5jdGlvbiBvbmZpbmlzaCgpIHtcbiAgICB3cml0YWJsZSA9IGZhbHNlO1xuICAgIHdyaXRhYmxlRW5kZWQgPSB0cnVlO1xuICAgIGlmICghcmVhZGFibGUpIGNhbGxiYWNrLmNhbGwoc3RyZWFtKTtcbiAgfTtcblxuICB2YXIgcmVhZGFibGVFbmRlZCA9IHN0cmVhbS5fcmVhZGFibGVTdGF0ZSAmJiBzdHJlYW0uX3JlYWRhYmxlU3RhdGUuZW5kRW1pdHRlZDtcblxuICB2YXIgb25lbmQgPSBmdW5jdGlvbiBvbmVuZCgpIHtcbiAgICByZWFkYWJsZSA9IGZhbHNlO1xuICAgIHJlYWRhYmxlRW5kZWQgPSB0cnVlO1xuICAgIGlmICghd3JpdGFibGUpIGNhbGxiYWNrLmNhbGwoc3RyZWFtKTtcbiAgfTtcblxuICB2YXIgb25lcnJvciA9IGZ1bmN0aW9uIG9uZXJyb3IoZXJyKSB7XG4gICAgY2FsbGJhY2suY2FsbChzdHJlYW0sIGVycik7XG4gIH07XG5cbiAgdmFyIG9uY2xvc2UgPSBmdW5jdGlvbiBvbmNsb3NlKCkge1xuICAgIHZhciBlcnI7XG5cbiAgICBpZiAocmVhZGFibGUgJiYgIXJlYWRhYmxlRW5kZWQpIHtcbiAgICAgIGlmICghc3RyZWFtLl9yZWFkYWJsZVN0YXRlIHx8ICFzdHJlYW0uX3JlYWRhYmxlU3RhdGUuZW5kZWQpIGVyciA9IG5ldyBFUlJfU1RSRUFNX1BSRU1BVFVSRV9DTE9TRSgpO1xuICAgICAgcmV0dXJuIGNhbGxiYWNrLmNhbGwoc3RyZWFtLCBlcnIpO1xuICAgIH1cblxuICAgIGlmICh3cml0YWJsZSAmJiAhd3JpdGFibGVFbmRlZCkge1xuICAgICAgaWYgKCFzdHJlYW0uX3dyaXRhYmxlU3RhdGUgfHwgIXN0cmVhbS5fd3JpdGFibGVTdGF0ZS5lbmRlZCkgZXJyID0gbmV3IEVSUl9TVFJFQU1fUFJFTUFUVVJFX0NMT1NFKCk7XG4gICAgICByZXR1cm4gY2FsbGJhY2suY2FsbChzdHJlYW0sIGVycik7XG4gICAgfVxuICB9O1xuXG4gIHZhciBvbnJlcXVlc3QgPSBmdW5jdGlvbiBvbnJlcXVlc3QoKSB7XG4gICAgc3RyZWFtLnJlcS5vbignZmluaXNoJywgb25maW5pc2gpO1xuICB9O1xuXG4gIGlmIChpc1JlcXVlc3Qoc3RyZWFtKSkge1xuICAgIHN0cmVhbS5vbignY29tcGxldGUnLCBvbmZpbmlzaCk7XG4gICAgc3RyZWFtLm9uKCdhYm9ydCcsIG9uY2xvc2UpO1xuICAgIGlmIChzdHJlYW0ucmVxKSBvbnJlcXVlc3QoKTtlbHNlIHN0cmVhbS5vbigncmVxdWVzdCcsIG9ucmVxdWVzdCk7XG4gIH0gZWxzZSBpZiAod3JpdGFibGUgJiYgIXN0cmVhbS5fd3JpdGFibGVTdGF0ZSkge1xuICAgIC8vIGxlZ2FjeSBzdHJlYW1zXG4gICAgc3RyZWFtLm9uKCdlbmQnLCBvbmxlZ2FjeWZpbmlzaCk7XG4gICAgc3RyZWFtLm9uKCdjbG9zZScsIG9ubGVnYWN5ZmluaXNoKTtcbiAgfVxuXG4gIHN0cmVhbS5vbignZW5kJywgb25lbmQpO1xuICBzdHJlYW0ub24oJ2ZpbmlzaCcsIG9uZmluaXNoKTtcbiAgaWYgKG9wdHMuZXJyb3IgIT09IGZhbHNlKSBzdHJlYW0ub24oJ2Vycm9yJywgb25lcnJvcik7XG4gIHN0cmVhbS5vbignY2xvc2UnLCBvbmNsb3NlKTtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICBzdHJlYW0ucmVtb3ZlTGlzdGVuZXIoJ2NvbXBsZXRlJywgb25maW5pc2gpO1xuICAgIHN0cmVhbS5yZW1vdmVMaXN0ZW5lcignYWJvcnQnLCBvbmNsb3NlKTtcbiAgICBzdHJlYW0ucmVtb3ZlTGlzdGVuZXIoJ3JlcXVlc3QnLCBvbnJlcXVlc3QpO1xuICAgIGlmIChzdHJlYW0ucmVxKSBzdHJlYW0ucmVxLnJlbW92ZUxpc3RlbmVyKCdmaW5pc2gnLCBvbmZpbmlzaCk7XG4gICAgc3RyZWFtLnJlbW92ZUxpc3RlbmVyKCdlbmQnLCBvbmxlZ2FjeWZpbmlzaCk7XG4gICAgc3RyZWFtLnJlbW92ZUxpc3RlbmVyKCdjbG9zZScsIG9ubGVnYWN5ZmluaXNoKTtcbiAgICBzdHJlYW0ucmVtb3ZlTGlzdGVuZXIoJ2ZpbmlzaCcsIG9uZmluaXNoKTtcbiAgICBzdHJlYW0ucmVtb3ZlTGlzdGVuZXIoJ2VuZCcsIG9uZW5kKTtcbiAgICBzdHJlYW0ucmVtb3ZlTGlzdGVuZXIoJ2Vycm9yJywgb25lcnJvcik7XG4gICAgc3RyZWFtLnJlbW92ZUxpc3RlbmVyKCdjbG9zZScsIG9uY2xvc2UpO1xuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGVvczsiLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICgpIHtcbiAgdGhyb3cgbmV3IEVycm9yKCdSZWFkYWJsZS5mcm9tIGlzIG5vdCBhdmFpbGFibGUgaW4gdGhlIGJyb3dzZXInKVxufTtcbiIsIi8vIFBvcnRlZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9tYWZpbnRvc2gvcHVtcCB3aXRoXG4vLyBwZXJtaXNzaW9uIGZyb20gdGhlIGF1dGhvciwgTWF0aGlhcyBCdXVzIChAbWFmaW50b3NoKS5cbid1c2Ugc3RyaWN0JztcblxudmFyIGVvcztcblxuZnVuY3Rpb24gb25jZShjYWxsYmFjaykge1xuICB2YXIgY2FsbGVkID0gZmFsc2U7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKGNhbGxlZCkgcmV0dXJuO1xuICAgIGNhbGxlZCA9IHRydWU7XG4gICAgY2FsbGJhY2suYXBwbHkodm9pZCAwLCBhcmd1bWVudHMpO1xuICB9O1xufVxuXG52YXIgX3JlcXVpcmUkY29kZXMgPSByZXF1aXJlKCcuLi8uLi8uLi9lcnJvcnMnKS5jb2RlcyxcbiAgICBFUlJfTUlTU0lOR19BUkdTID0gX3JlcXVpcmUkY29kZXMuRVJSX01JU1NJTkdfQVJHUyxcbiAgICBFUlJfU1RSRUFNX0RFU1RST1lFRCA9IF9yZXF1aXJlJGNvZGVzLkVSUl9TVFJFQU1fREVTVFJPWUVEO1xuXG5mdW5jdGlvbiBub29wKGVycikge1xuICAvLyBSZXRocm93IHRoZSBlcnJvciBpZiBpdCBleGlzdHMgdG8gYXZvaWQgc3dhbGxvd2luZyBpdFxuICBpZiAoZXJyKSB0aHJvdyBlcnI7XG59XG5cbmZ1bmN0aW9uIGlzUmVxdWVzdChzdHJlYW0pIHtcbiAgcmV0dXJuIHN0cmVhbS5zZXRIZWFkZXIgJiYgdHlwZW9mIHN0cmVhbS5hYm9ydCA9PT0gJ2Z1bmN0aW9uJztcbn1cblxuZnVuY3Rpb24gZGVzdHJveWVyKHN0cmVhbSwgcmVhZGluZywgd3JpdGluZywgY2FsbGJhY2spIHtcbiAgY2FsbGJhY2sgPSBvbmNlKGNhbGxiYWNrKTtcbiAgdmFyIGNsb3NlZCA9IGZhbHNlO1xuICBzdHJlYW0ub24oJ2Nsb3NlJywgZnVuY3Rpb24gKCkge1xuICAgIGNsb3NlZCA9IHRydWU7XG4gIH0pO1xuICBpZiAoZW9zID09PSB1bmRlZmluZWQpIGVvcyA9IHJlcXVpcmUoJy4vZW5kLW9mLXN0cmVhbScpO1xuICBlb3Moc3RyZWFtLCB7XG4gICAgcmVhZGFibGU6IHJlYWRpbmcsXG4gICAgd3JpdGFibGU6IHdyaXRpbmdcbiAgfSwgZnVuY3Rpb24gKGVycikge1xuICAgIGlmIChlcnIpIHJldHVybiBjYWxsYmFjayhlcnIpO1xuICAgIGNsb3NlZCA9IHRydWU7XG4gICAgY2FsbGJhY2soKTtcbiAgfSk7XG4gIHZhciBkZXN0cm95ZWQgPSBmYWxzZTtcbiAgcmV0dXJuIGZ1bmN0aW9uIChlcnIpIHtcbiAgICBpZiAoY2xvc2VkKSByZXR1cm47XG4gICAgaWYgKGRlc3Ryb3llZCkgcmV0dXJuO1xuICAgIGRlc3Ryb3llZCA9IHRydWU7IC8vIHJlcXVlc3QuZGVzdHJveSBqdXN0IGRvIC5lbmQgLSAuYWJvcnQgaXMgd2hhdCB3ZSB3YW50XG5cbiAgICBpZiAoaXNSZXF1ZXN0KHN0cmVhbSkpIHJldHVybiBzdHJlYW0uYWJvcnQoKTtcbiAgICBpZiAodHlwZW9mIHN0cmVhbS5kZXN0cm95ID09PSAnZnVuY3Rpb24nKSByZXR1cm4gc3RyZWFtLmRlc3Ryb3koKTtcbiAgICBjYWxsYmFjayhlcnIgfHwgbmV3IEVSUl9TVFJFQU1fREVTVFJPWUVEKCdwaXBlJykpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBjYWxsKGZuKSB7XG4gIGZuKCk7XG59XG5cbmZ1bmN0aW9uIHBpcGUoZnJvbSwgdG8pIHtcbiAgcmV0dXJuIGZyb20ucGlwZSh0byk7XG59XG5cbmZ1bmN0aW9uIHBvcENhbGxiYWNrKHN0cmVhbXMpIHtcbiAgaWYgKCFzdHJlYW1zLmxlbmd0aCkgcmV0dXJuIG5vb3A7XG4gIGlmICh0eXBlb2Ygc3RyZWFtc1tzdHJlYW1zLmxlbmd0aCAtIDFdICE9PSAnZnVuY3Rpb24nKSByZXR1cm4gbm9vcDtcbiAgcmV0dXJuIHN0cmVhbXMucG9wKCk7XG59XG5cbmZ1bmN0aW9uIHBpcGVsaW5lKCkge1xuICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgc3RyZWFtcyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICBzdHJlYW1zW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICB9XG5cbiAgdmFyIGNhbGxiYWNrID0gcG9wQ2FsbGJhY2soc3RyZWFtcyk7XG4gIGlmIChBcnJheS5pc0FycmF5KHN0cmVhbXNbMF0pKSBzdHJlYW1zID0gc3RyZWFtc1swXTtcblxuICBpZiAoc3RyZWFtcy5sZW5ndGggPCAyKSB7XG4gICAgdGhyb3cgbmV3IEVSUl9NSVNTSU5HX0FSR1MoJ3N0cmVhbXMnKTtcbiAgfVxuXG4gIHZhciBlcnJvcjtcbiAgdmFyIGRlc3Ryb3lzID0gc3RyZWFtcy5tYXAoZnVuY3Rpb24gKHN0cmVhbSwgaSkge1xuICAgIHZhciByZWFkaW5nID0gaSA8IHN0cmVhbXMubGVuZ3RoIC0gMTtcbiAgICB2YXIgd3JpdGluZyA9IGkgPiAwO1xuICAgIHJldHVybiBkZXN0cm95ZXIoc3RyZWFtLCByZWFkaW5nLCB3cml0aW5nLCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICBpZiAoIWVycm9yKSBlcnJvciA9IGVycjtcbiAgICAgIGlmIChlcnIpIGRlc3Ryb3lzLmZvckVhY2goY2FsbCk7XG4gICAgICBpZiAocmVhZGluZykgcmV0dXJuO1xuICAgICAgZGVzdHJveXMuZm9yRWFjaChjYWxsKTtcbiAgICAgIGNhbGxiYWNrKGVycm9yKTtcbiAgICB9KTtcbiAgfSk7XG4gIHJldHVybiBzdHJlYW1zLnJlZHVjZShwaXBlKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBwaXBlbGluZTsiLCIndXNlIHN0cmljdCc7XG5cbnZhciBFUlJfSU5WQUxJRF9PUFRfVkFMVUUgPSByZXF1aXJlKCcuLi8uLi8uLi9lcnJvcnMnKS5jb2Rlcy5FUlJfSU5WQUxJRF9PUFRfVkFMVUU7XG5cbmZ1bmN0aW9uIGhpZ2hXYXRlck1hcmtGcm9tKG9wdGlvbnMsIGlzRHVwbGV4LCBkdXBsZXhLZXkpIHtcbiAgcmV0dXJuIG9wdGlvbnMuaGlnaFdhdGVyTWFyayAhPSBudWxsID8gb3B0aW9ucy5oaWdoV2F0ZXJNYXJrIDogaXNEdXBsZXggPyBvcHRpb25zW2R1cGxleEtleV0gOiBudWxsO1xufVxuXG5mdW5jdGlvbiBnZXRIaWdoV2F0ZXJNYXJrKHN0YXRlLCBvcHRpb25zLCBkdXBsZXhLZXksIGlzRHVwbGV4KSB7XG4gIHZhciBod20gPSBoaWdoV2F0ZXJNYXJrRnJvbShvcHRpb25zLCBpc0R1cGxleCwgZHVwbGV4S2V5KTtcblxuICBpZiAoaHdtICE9IG51bGwpIHtcbiAgICBpZiAoIShpc0Zpbml0ZShod20pICYmIE1hdGguZmxvb3IoaHdtKSA9PT0gaHdtKSB8fCBod20gPCAwKSB7XG4gICAgICB2YXIgbmFtZSA9IGlzRHVwbGV4ID8gZHVwbGV4S2V5IDogJ2hpZ2hXYXRlck1hcmsnO1xuICAgICAgdGhyb3cgbmV3IEVSUl9JTlZBTElEX09QVF9WQUxVRShuYW1lLCBod20pO1xuICAgIH1cblxuICAgIHJldHVybiBNYXRoLmZsb29yKGh3bSk7XG4gIH0gLy8gRGVmYXVsdCB2YWx1ZVxuXG5cbiAgcmV0dXJuIHN0YXRlLm9iamVjdE1vZGUgPyAxNiA6IDE2ICogMTAyNDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGdldEhpZ2hXYXRlck1hcms6IGdldEhpZ2hXYXRlck1hcmtcbn07IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCdldmVudHMnKS5FdmVudEVtaXR0ZXI7XG4iLCJleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2xpYi9fc3RyZWFtX3JlYWRhYmxlLmpzJyk7XG5leHBvcnRzLlN0cmVhbSA9IGV4cG9ydHM7XG5leHBvcnRzLlJlYWRhYmxlID0gZXhwb3J0cztcbmV4cG9ydHMuV3JpdGFibGUgPSByZXF1aXJlKCcuL2xpYi9fc3RyZWFtX3dyaXRhYmxlLmpzJyk7XG5leHBvcnRzLkR1cGxleCA9IHJlcXVpcmUoJy4vbGliL19zdHJlYW1fZHVwbGV4LmpzJyk7XG5leHBvcnRzLlRyYW5zZm9ybSA9IHJlcXVpcmUoJy4vbGliL19zdHJlYW1fdHJhbnNmb3JtLmpzJyk7XG5leHBvcnRzLlBhc3NUaHJvdWdoID0gcmVxdWlyZSgnLi9saWIvX3N0cmVhbV9wYXNzdGhyb3VnaC5qcycpO1xuZXhwb3J0cy5maW5pc2hlZCA9IHJlcXVpcmUoJy4vbGliL2ludGVybmFsL3N0cmVhbXMvZW5kLW9mLXN0cmVhbS5qcycpO1xuZXhwb3J0cy5waXBlbGluZSA9IHJlcXVpcmUoJy4vbGliL2ludGVybmFsL3N0cmVhbXMvcGlwZWxpbmUuanMnKTtcbiIsIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG4ndXNlIHN0cmljdCc7XG5cbi8qPHJlcGxhY2VtZW50PiovXG5cbnZhciBCdWZmZXIgPSByZXF1aXJlKCdzYWZlLWJ1ZmZlcicpLkJ1ZmZlcjtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG52YXIgaXNFbmNvZGluZyA9IEJ1ZmZlci5pc0VuY29kaW5nIHx8IGZ1bmN0aW9uIChlbmNvZGluZykge1xuICBlbmNvZGluZyA9ICcnICsgZW5jb2Rpbmc7XG4gIHN3aXRjaCAoZW5jb2RpbmcgJiYgZW5jb2RpbmcudG9Mb3dlckNhc2UoKSkge1xuICAgIGNhc2UgJ2hleCc6Y2FzZSAndXRmOCc6Y2FzZSAndXRmLTgnOmNhc2UgJ2FzY2lpJzpjYXNlICdiaW5hcnknOmNhc2UgJ2Jhc2U2NCc6Y2FzZSAndWNzMic6Y2FzZSAndWNzLTInOmNhc2UgJ3V0ZjE2bGUnOmNhc2UgJ3V0Zi0xNmxlJzpjYXNlICdyYXcnOlxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgfVxufTtcblxuZnVuY3Rpb24gX25vcm1hbGl6ZUVuY29kaW5nKGVuYykge1xuICBpZiAoIWVuYykgcmV0dXJuICd1dGY4JztcbiAgdmFyIHJldHJpZWQ7XG4gIHdoaWxlICh0cnVlKSB7XG4gICAgc3dpdGNoIChlbmMpIHtcbiAgICAgIGNhc2UgJ3V0ZjgnOlxuICAgICAgY2FzZSAndXRmLTgnOlxuICAgICAgICByZXR1cm4gJ3V0ZjgnO1xuICAgICAgY2FzZSAndWNzMic6XG4gICAgICBjYXNlICd1Y3MtMic6XG4gICAgICBjYXNlICd1dGYxNmxlJzpcbiAgICAgIGNhc2UgJ3V0Zi0xNmxlJzpcbiAgICAgICAgcmV0dXJuICd1dGYxNmxlJztcbiAgICAgIGNhc2UgJ2xhdGluMSc6XG4gICAgICBjYXNlICdiaW5hcnknOlxuICAgICAgICByZXR1cm4gJ2xhdGluMSc7XG4gICAgICBjYXNlICdiYXNlNjQnOlxuICAgICAgY2FzZSAnYXNjaWknOlxuICAgICAgY2FzZSAnaGV4JzpcbiAgICAgICAgcmV0dXJuIGVuYztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmIChyZXRyaWVkKSByZXR1cm47IC8vIHVuZGVmaW5lZFxuICAgICAgICBlbmMgPSAoJycgKyBlbmMpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIHJldHJpZWQgPSB0cnVlO1xuICAgIH1cbiAgfVxufTtcblxuLy8gRG8gbm90IGNhY2hlIGBCdWZmZXIuaXNFbmNvZGluZ2Agd2hlbiBjaGVja2luZyBlbmNvZGluZyBuYW1lcyBhcyBzb21lXG4vLyBtb2R1bGVzIG1vbmtleS1wYXRjaCBpdCB0byBzdXBwb3J0IGFkZGl0aW9uYWwgZW5jb2RpbmdzXG5mdW5jdGlvbiBub3JtYWxpemVFbmNvZGluZyhlbmMpIHtcbiAgdmFyIG5lbmMgPSBfbm9ybWFsaXplRW5jb2RpbmcoZW5jKTtcbiAgaWYgKHR5cGVvZiBuZW5jICE9PSAnc3RyaW5nJyAmJiAoQnVmZmVyLmlzRW5jb2RpbmcgPT09IGlzRW5jb2RpbmcgfHwgIWlzRW5jb2RpbmcoZW5jKSkpIHRocm93IG5ldyBFcnJvcignVW5rbm93biBlbmNvZGluZzogJyArIGVuYyk7XG4gIHJldHVybiBuZW5jIHx8IGVuYztcbn1cblxuLy8gU3RyaW5nRGVjb2RlciBwcm92aWRlcyBhbiBpbnRlcmZhY2UgZm9yIGVmZmljaWVudGx5IHNwbGl0dGluZyBhIHNlcmllcyBvZlxuLy8gYnVmZmVycyBpbnRvIGEgc2VyaWVzIG9mIEpTIHN0cmluZ3Mgd2l0aG91dCBicmVha2luZyBhcGFydCBtdWx0aS1ieXRlXG4vLyBjaGFyYWN0ZXJzLlxuZXhwb3J0cy5TdHJpbmdEZWNvZGVyID0gU3RyaW5nRGVjb2RlcjtcbmZ1bmN0aW9uIFN0cmluZ0RlY29kZXIoZW5jb2RpbmcpIHtcbiAgdGhpcy5lbmNvZGluZyA9IG5vcm1hbGl6ZUVuY29kaW5nKGVuY29kaW5nKTtcbiAgdmFyIG5iO1xuICBzd2l0Y2ggKHRoaXMuZW5jb2RpbmcpIHtcbiAgICBjYXNlICd1dGYxNmxlJzpcbiAgICAgIHRoaXMudGV4dCA9IHV0ZjE2VGV4dDtcbiAgICAgIHRoaXMuZW5kID0gdXRmMTZFbmQ7XG4gICAgICBuYiA9IDQ7XG4gICAgICBicmVhaztcbiAgICBjYXNlICd1dGY4JzpcbiAgICAgIHRoaXMuZmlsbExhc3QgPSB1dGY4RmlsbExhc3Q7XG4gICAgICBuYiA9IDQ7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdiYXNlNjQnOlxuICAgICAgdGhpcy50ZXh0ID0gYmFzZTY0VGV4dDtcbiAgICAgIHRoaXMuZW5kID0gYmFzZTY0RW5kO1xuICAgICAgbmIgPSAzO1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIHRoaXMud3JpdGUgPSBzaW1wbGVXcml0ZTtcbiAgICAgIHRoaXMuZW5kID0gc2ltcGxlRW5kO1xuICAgICAgcmV0dXJuO1xuICB9XG4gIHRoaXMubGFzdE5lZWQgPSAwO1xuICB0aGlzLmxhc3RUb3RhbCA9IDA7XG4gIHRoaXMubGFzdENoYXIgPSBCdWZmZXIuYWxsb2NVbnNhZmUobmIpO1xufVxuXG5TdHJpbmdEZWNvZGVyLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uIChidWYpIHtcbiAgaWYgKGJ1Zi5sZW5ndGggPT09IDApIHJldHVybiAnJztcbiAgdmFyIHI7XG4gIHZhciBpO1xuICBpZiAodGhpcy5sYXN0TmVlZCkge1xuICAgIHIgPSB0aGlzLmZpbGxMYXN0KGJ1Zik7XG4gICAgaWYgKHIgPT09IHVuZGVmaW5lZCkgcmV0dXJuICcnO1xuICAgIGkgPSB0aGlzLmxhc3ROZWVkO1xuICAgIHRoaXMubGFzdE5lZWQgPSAwO1xuICB9IGVsc2Uge1xuICAgIGkgPSAwO1xuICB9XG4gIGlmIChpIDwgYnVmLmxlbmd0aCkgcmV0dXJuIHIgPyByICsgdGhpcy50ZXh0KGJ1ZiwgaSkgOiB0aGlzLnRleHQoYnVmLCBpKTtcbiAgcmV0dXJuIHIgfHwgJyc7XG59O1xuXG5TdHJpbmdEZWNvZGVyLnByb3RvdHlwZS5lbmQgPSB1dGY4RW5kO1xuXG4vLyBSZXR1cm5zIG9ubHkgY29tcGxldGUgY2hhcmFjdGVycyBpbiBhIEJ1ZmZlclxuU3RyaW5nRGVjb2Rlci5wcm90b3R5cGUudGV4dCA9IHV0ZjhUZXh0O1xuXG4vLyBBdHRlbXB0cyB0byBjb21wbGV0ZSBhIHBhcnRpYWwgbm9uLVVURi04IGNoYXJhY3RlciB1c2luZyBieXRlcyBmcm9tIGEgQnVmZmVyXG5TdHJpbmdEZWNvZGVyLnByb3RvdHlwZS5maWxsTGFzdCA9IGZ1bmN0aW9uIChidWYpIHtcbiAgaWYgKHRoaXMubGFzdE5lZWQgPD0gYnVmLmxlbmd0aCkge1xuICAgIGJ1Zi5jb3B5KHRoaXMubGFzdENoYXIsIHRoaXMubGFzdFRvdGFsIC0gdGhpcy5sYXN0TmVlZCwgMCwgdGhpcy5sYXN0TmVlZCk7XG4gICAgcmV0dXJuIHRoaXMubGFzdENoYXIudG9TdHJpbmcodGhpcy5lbmNvZGluZywgMCwgdGhpcy5sYXN0VG90YWwpO1xuICB9XG4gIGJ1Zi5jb3B5KHRoaXMubGFzdENoYXIsIHRoaXMubGFzdFRvdGFsIC0gdGhpcy5sYXN0TmVlZCwgMCwgYnVmLmxlbmd0aCk7XG4gIHRoaXMubGFzdE5lZWQgLT0gYnVmLmxlbmd0aDtcbn07XG5cbi8vIENoZWNrcyB0aGUgdHlwZSBvZiBhIFVURi04IGJ5dGUsIHdoZXRoZXIgaXQncyBBU0NJSSwgYSBsZWFkaW5nIGJ5dGUsIG9yIGFcbi8vIGNvbnRpbnVhdGlvbiBieXRlLiBJZiBhbiBpbnZhbGlkIGJ5dGUgaXMgZGV0ZWN0ZWQsIC0yIGlzIHJldHVybmVkLlxuZnVuY3Rpb24gdXRmOENoZWNrQnl0ZShieXRlKSB7XG4gIGlmIChieXRlIDw9IDB4N0YpIHJldHVybiAwO2Vsc2UgaWYgKGJ5dGUgPj4gNSA9PT0gMHgwNikgcmV0dXJuIDI7ZWxzZSBpZiAoYnl0ZSA+PiA0ID09PSAweDBFKSByZXR1cm4gMztlbHNlIGlmIChieXRlID4+IDMgPT09IDB4MUUpIHJldHVybiA0O1xuICByZXR1cm4gYnl0ZSA+PiA2ID09PSAweDAyID8gLTEgOiAtMjtcbn1cblxuLy8gQ2hlY2tzIGF0IG1vc3QgMyBieXRlcyBhdCB0aGUgZW5kIG9mIGEgQnVmZmVyIGluIG9yZGVyIHRvIGRldGVjdCBhblxuLy8gaW5jb21wbGV0ZSBtdWx0aS1ieXRlIFVURi04IGNoYXJhY3Rlci4gVGhlIHRvdGFsIG51bWJlciBvZiBieXRlcyAoMiwgMywgb3IgNClcbi8vIG5lZWRlZCB0byBjb21wbGV0ZSB0aGUgVVRGLTggY2hhcmFjdGVyIChpZiBhcHBsaWNhYmxlKSBhcmUgcmV0dXJuZWQuXG5mdW5jdGlvbiB1dGY4Q2hlY2tJbmNvbXBsZXRlKHNlbGYsIGJ1ZiwgaSkge1xuICB2YXIgaiA9IGJ1Zi5sZW5ndGggLSAxO1xuICBpZiAoaiA8IGkpIHJldHVybiAwO1xuICB2YXIgbmIgPSB1dGY4Q2hlY2tCeXRlKGJ1ZltqXSk7XG4gIGlmIChuYiA+PSAwKSB7XG4gICAgaWYgKG5iID4gMCkgc2VsZi5sYXN0TmVlZCA9IG5iIC0gMTtcbiAgICByZXR1cm4gbmI7XG4gIH1cbiAgaWYgKC0taiA8IGkgfHwgbmIgPT09IC0yKSByZXR1cm4gMDtcbiAgbmIgPSB1dGY4Q2hlY2tCeXRlKGJ1ZltqXSk7XG4gIGlmIChuYiA+PSAwKSB7XG4gICAgaWYgKG5iID4gMCkgc2VsZi5sYXN0TmVlZCA9IG5iIC0gMjtcbiAgICByZXR1cm4gbmI7XG4gIH1cbiAgaWYgKC0taiA8IGkgfHwgbmIgPT09IC0yKSByZXR1cm4gMDtcbiAgbmIgPSB1dGY4Q2hlY2tCeXRlKGJ1ZltqXSk7XG4gIGlmIChuYiA+PSAwKSB7XG4gICAgaWYgKG5iID4gMCkge1xuICAgICAgaWYgKG5iID09PSAyKSBuYiA9IDA7ZWxzZSBzZWxmLmxhc3ROZWVkID0gbmIgLSAzO1xuICAgIH1cbiAgICByZXR1cm4gbmI7XG4gIH1cbiAgcmV0dXJuIDA7XG59XG5cbi8vIFZhbGlkYXRlcyBhcyBtYW55IGNvbnRpbnVhdGlvbiBieXRlcyBmb3IgYSBtdWx0aS1ieXRlIFVURi04IGNoYXJhY3RlciBhc1xuLy8gbmVlZGVkIG9yIGFyZSBhdmFpbGFibGUuIElmIHdlIHNlZSBhIG5vbi1jb250aW51YXRpb24gYnl0ZSB3aGVyZSB3ZSBleHBlY3Rcbi8vIG9uZSwgd2UgXCJyZXBsYWNlXCIgdGhlIHZhbGlkYXRlZCBjb250aW51YXRpb24gYnl0ZXMgd2UndmUgc2VlbiBzbyBmYXIgd2l0aFxuLy8gYSBzaW5nbGUgVVRGLTggcmVwbGFjZW1lbnQgY2hhcmFjdGVyICgnXFx1ZmZmZCcpLCB0byBtYXRjaCB2OCdzIFVURi04IGRlY29kaW5nXG4vLyBiZWhhdmlvci4gVGhlIGNvbnRpbnVhdGlvbiBieXRlIGNoZWNrIGlzIGluY2x1ZGVkIHRocmVlIHRpbWVzIGluIHRoZSBjYXNlXG4vLyB3aGVyZSBhbGwgb2YgdGhlIGNvbnRpbnVhdGlvbiBieXRlcyBmb3IgYSBjaGFyYWN0ZXIgZXhpc3QgaW4gdGhlIHNhbWUgYnVmZmVyLlxuLy8gSXQgaXMgYWxzbyBkb25lIHRoaXMgd2F5IGFzIGEgc2xpZ2h0IHBlcmZvcm1hbmNlIGluY3JlYXNlIGluc3RlYWQgb2YgdXNpbmcgYVxuLy8gbG9vcC5cbmZ1bmN0aW9uIHV0ZjhDaGVja0V4dHJhQnl0ZXMoc2VsZiwgYnVmLCBwKSB7XG4gIGlmICgoYnVmWzBdICYgMHhDMCkgIT09IDB4ODApIHtcbiAgICBzZWxmLmxhc3ROZWVkID0gMDtcbiAgICByZXR1cm4gJ1xcdWZmZmQnO1xuICB9XG4gIGlmIChzZWxmLmxhc3ROZWVkID4gMSAmJiBidWYubGVuZ3RoID4gMSkge1xuICAgIGlmICgoYnVmWzFdICYgMHhDMCkgIT09IDB4ODApIHtcbiAgICAgIHNlbGYubGFzdE5lZWQgPSAxO1xuICAgICAgcmV0dXJuICdcXHVmZmZkJztcbiAgICB9XG4gICAgaWYgKHNlbGYubGFzdE5lZWQgPiAyICYmIGJ1Zi5sZW5ndGggPiAyKSB7XG4gICAgICBpZiAoKGJ1ZlsyXSAmIDB4QzApICE9PSAweDgwKSB7XG4gICAgICAgIHNlbGYubGFzdE5lZWQgPSAyO1xuICAgICAgICByZXR1cm4gJ1xcdWZmZmQnO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4vLyBBdHRlbXB0cyB0byBjb21wbGV0ZSBhIG11bHRpLWJ5dGUgVVRGLTggY2hhcmFjdGVyIHVzaW5nIGJ5dGVzIGZyb20gYSBCdWZmZXIuXG5mdW5jdGlvbiB1dGY4RmlsbExhc3QoYnVmKSB7XG4gIHZhciBwID0gdGhpcy5sYXN0VG90YWwgLSB0aGlzLmxhc3ROZWVkO1xuICB2YXIgciA9IHV0ZjhDaGVja0V4dHJhQnl0ZXModGhpcywgYnVmLCBwKTtcbiAgaWYgKHIgIT09IHVuZGVmaW5lZCkgcmV0dXJuIHI7XG4gIGlmICh0aGlzLmxhc3ROZWVkIDw9IGJ1Zi5sZW5ndGgpIHtcbiAgICBidWYuY29weSh0aGlzLmxhc3RDaGFyLCBwLCAwLCB0aGlzLmxhc3ROZWVkKTtcbiAgICByZXR1cm4gdGhpcy5sYXN0Q2hhci50b1N0cmluZyh0aGlzLmVuY29kaW5nLCAwLCB0aGlzLmxhc3RUb3RhbCk7XG4gIH1cbiAgYnVmLmNvcHkodGhpcy5sYXN0Q2hhciwgcCwgMCwgYnVmLmxlbmd0aCk7XG4gIHRoaXMubGFzdE5lZWQgLT0gYnVmLmxlbmd0aDtcbn1cblxuLy8gUmV0dXJucyBhbGwgY29tcGxldGUgVVRGLTggY2hhcmFjdGVycyBpbiBhIEJ1ZmZlci4gSWYgdGhlIEJ1ZmZlciBlbmRlZCBvbiBhXG4vLyBwYXJ0aWFsIGNoYXJhY3RlciwgdGhlIGNoYXJhY3RlcidzIGJ5dGVzIGFyZSBidWZmZXJlZCB1bnRpbCB0aGUgcmVxdWlyZWRcbi8vIG51bWJlciBvZiBieXRlcyBhcmUgYXZhaWxhYmxlLlxuZnVuY3Rpb24gdXRmOFRleHQoYnVmLCBpKSB7XG4gIHZhciB0b3RhbCA9IHV0ZjhDaGVja0luY29tcGxldGUodGhpcywgYnVmLCBpKTtcbiAgaWYgKCF0aGlzLmxhc3ROZWVkKSByZXR1cm4gYnVmLnRvU3RyaW5nKCd1dGY4JywgaSk7XG4gIHRoaXMubGFzdFRvdGFsID0gdG90YWw7XG4gIHZhciBlbmQgPSBidWYubGVuZ3RoIC0gKHRvdGFsIC0gdGhpcy5sYXN0TmVlZCk7XG4gIGJ1Zi5jb3B5KHRoaXMubGFzdENoYXIsIDAsIGVuZCk7XG4gIHJldHVybiBidWYudG9TdHJpbmcoJ3V0ZjgnLCBpLCBlbmQpO1xufVxuXG4vLyBGb3IgVVRGLTgsIGEgcmVwbGFjZW1lbnQgY2hhcmFjdGVyIGlzIGFkZGVkIHdoZW4gZW5kaW5nIG9uIGEgcGFydGlhbFxuLy8gY2hhcmFjdGVyLlxuZnVuY3Rpb24gdXRmOEVuZChidWYpIHtcbiAgdmFyIHIgPSBidWYgJiYgYnVmLmxlbmd0aCA/IHRoaXMud3JpdGUoYnVmKSA6ICcnO1xuICBpZiAodGhpcy5sYXN0TmVlZCkgcmV0dXJuIHIgKyAnXFx1ZmZmZCc7XG4gIHJldHVybiByO1xufVxuXG4vLyBVVEYtMTZMRSB0eXBpY2FsbHkgbmVlZHMgdHdvIGJ5dGVzIHBlciBjaGFyYWN0ZXIsIGJ1dCBldmVuIGlmIHdlIGhhdmUgYW4gZXZlblxuLy8gbnVtYmVyIG9mIGJ5dGVzIGF2YWlsYWJsZSwgd2UgbmVlZCB0byBjaGVjayBpZiB3ZSBlbmQgb24gYSBsZWFkaW5nL2hpZ2hcbi8vIHN1cnJvZ2F0ZS4gSW4gdGhhdCBjYXNlLCB3ZSBuZWVkIHRvIHdhaXQgZm9yIHRoZSBuZXh0IHR3byBieXRlcyBpbiBvcmRlciB0b1xuLy8gZGVjb2RlIHRoZSBsYXN0IGNoYXJhY3RlciBwcm9wZXJseS5cbmZ1bmN0aW9uIHV0ZjE2VGV4dChidWYsIGkpIHtcbiAgaWYgKChidWYubGVuZ3RoIC0gaSkgJSAyID09PSAwKSB7XG4gICAgdmFyIHIgPSBidWYudG9TdHJpbmcoJ3V0ZjE2bGUnLCBpKTtcbiAgICBpZiAocikge1xuICAgICAgdmFyIGMgPSByLmNoYXJDb2RlQXQoci5sZW5ndGggLSAxKTtcbiAgICAgIGlmIChjID49IDB4RDgwMCAmJiBjIDw9IDB4REJGRikge1xuICAgICAgICB0aGlzLmxhc3ROZWVkID0gMjtcbiAgICAgICAgdGhpcy5sYXN0VG90YWwgPSA0O1xuICAgICAgICB0aGlzLmxhc3RDaGFyWzBdID0gYnVmW2J1Zi5sZW5ndGggLSAyXTtcbiAgICAgICAgdGhpcy5sYXN0Q2hhclsxXSA9IGJ1ZltidWYubGVuZ3RoIC0gMV07XG4gICAgICAgIHJldHVybiByLnNsaWNlKDAsIC0xKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHI7XG4gIH1cbiAgdGhpcy5sYXN0TmVlZCA9IDE7XG4gIHRoaXMubGFzdFRvdGFsID0gMjtcbiAgdGhpcy5sYXN0Q2hhclswXSA9IGJ1ZltidWYubGVuZ3RoIC0gMV07XG4gIHJldHVybiBidWYudG9TdHJpbmcoJ3V0ZjE2bGUnLCBpLCBidWYubGVuZ3RoIC0gMSk7XG59XG5cbi8vIEZvciBVVEYtMTZMRSB3ZSBkbyBub3QgZXhwbGljaXRseSBhcHBlbmQgc3BlY2lhbCByZXBsYWNlbWVudCBjaGFyYWN0ZXJzIGlmIHdlXG4vLyBlbmQgb24gYSBwYXJ0aWFsIGNoYXJhY3Rlciwgd2Ugc2ltcGx5IGxldCB2OCBoYW5kbGUgdGhhdC5cbmZ1bmN0aW9uIHV0ZjE2RW5kKGJ1Zikge1xuICB2YXIgciA9IGJ1ZiAmJiBidWYubGVuZ3RoID8gdGhpcy53cml0ZShidWYpIDogJyc7XG4gIGlmICh0aGlzLmxhc3ROZWVkKSB7XG4gICAgdmFyIGVuZCA9IHRoaXMubGFzdFRvdGFsIC0gdGhpcy5sYXN0TmVlZDtcbiAgICByZXR1cm4gciArIHRoaXMubGFzdENoYXIudG9TdHJpbmcoJ3V0ZjE2bGUnLCAwLCBlbmQpO1xuICB9XG4gIHJldHVybiByO1xufVxuXG5mdW5jdGlvbiBiYXNlNjRUZXh0KGJ1ZiwgaSkge1xuICB2YXIgbiA9IChidWYubGVuZ3RoIC0gaSkgJSAzO1xuICBpZiAobiA9PT0gMCkgcmV0dXJuIGJ1Zi50b1N0cmluZygnYmFzZTY0JywgaSk7XG4gIHRoaXMubGFzdE5lZWQgPSAzIC0gbjtcbiAgdGhpcy5sYXN0VG90YWwgPSAzO1xuICBpZiAobiA9PT0gMSkge1xuICAgIHRoaXMubGFzdENoYXJbMF0gPSBidWZbYnVmLmxlbmd0aCAtIDFdO1xuICB9IGVsc2Uge1xuICAgIHRoaXMubGFzdENoYXJbMF0gPSBidWZbYnVmLmxlbmd0aCAtIDJdO1xuICAgIHRoaXMubGFzdENoYXJbMV0gPSBidWZbYnVmLmxlbmd0aCAtIDFdO1xuICB9XG4gIHJldHVybiBidWYudG9TdHJpbmcoJ2Jhc2U2NCcsIGksIGJ1Zi5sZW5ndGggLSBuKTtcbn1cblxuZnVuY3Rpb24gYmFzZTY0RW5kKGJ1Zikge1xuICB2YXIgciA9IGJ1ZiAmJiBidWYubGVuZ3RoID8gdGhpcy53cml0ZShidWYpIDogJyc7XG4gIGlmICh0aGlzLmxhc3ROZWVkKSByZXR1cm4gciArIHRoaXMubGFzdENoYXIudG9TdHJpbmcoJ2Jhc2U2NCcsIDAsIDMgLSB0aGlzLmxhc3ROZWVkKTtcbiAgcmV0dXJuIHI7XG59XG5cbi8vIFBhc3MgYnl0ZXMgb24gdGhyb3VnaCBmb3Igc2luZ2xlLWJ5dGUgZW5jb2RpbmdzIChlLmcuIGFzY2lpLCBsYXRpbjEsIGhleClcbmZ1bmN0aW9uIHNpbXBsZVdyaXRlKGJ1Zikge1xuICByZXR1cm4gYnVmLnRvU3RyaW5nKHRoaXMuZW5jb2RpbmcpO1xufVxuXG5mdW5jdGlvbiBzaW1wbGVFbmQoYnVmKSB7XG4gIHJldHVybiBidWYgJiYgYnVmLmxlbmd0aCA/IHRoaXMud3JpdGUoYnVmKSA6ICcnO1xufSIsInZhciBuZXh0VGljayA9IHJlcXVpcmUoJ3Byb2Nlc3MvYnJvd3Nlci5qcycpLm5leHRUaWNrO1xudmFyIGFwcGx5ID0gRnVuY3Rpb24ucHJvdG90eXBlLmFwcGx5O1xudmFyIHNsaWNlID0gQXJyYXkucHJvdG90eXBlLnNsaWNlO1xudmFyIGltbWVkaWF0ZUlkcyA9IHt9O1xudmFyIG5leHRJbW1lZGlhdGVJZCA9IDA7XG5cbi8vIERPTSBBUElzLCBmb3IgY29tcGxldGVuZXNzXG5cbmV4cG9ydHMuc2V0VGltZW91dCA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gbmV3IFRpbWVvdXQoYXBwbHkuY2FsbChzZXRUaW1lb3V0LCB3aW5kb3csIGFyZ3VtZW50cyksIGNsZWFyVGltZW91dCk7XG59O1xuZXhwb3J0cy5zZXRJbnRlcnZhbCA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gbmV3IFRpbWVvdXQoYXBwbHkuY2FsbChzZXRJbnRlcnZhbCwgd2luZG93LCBhcmd1bWVudHMpLCBjbGVhckludGVydmFsKTtcbn07XG5leHBvcnRzLmNsZWFyVGltZW91dCA9XG5leHBvcnRzLmNsZWFySW50ZXJ2YWwgPSBmdW5jdGlvbih0aW1lb3V0KSB7IHRpbWVvdXQuY2xvc2UoKTsgfTtcblxuZnVuY3Rpb24gVGltZW91dChpZCwgY2xlYXJGbikge1xuICB0aGlzLl9pZCA9IGlkO1xuICB0aGlzLl9jbGVhckZuID0gY2xlYXJGbjtcbn1cblRpbWVvdXQucHJvdG90eXBlLnVucmVmID0gVGltZW91dC5wcm90b3R5cGUucmVmID0gZnVuY3Rpb24oKSB7fTtcblRpbWVvdXQucHJvdG90eXBlLmNsb3NlID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMuX2NsZWFyRm4uY2FsbCh3aW5kb3csIHRoaXMuX2lkKTtcbn07XG5cbi8vIERvZXMgbm90IHN0YXJ0IHRoZSB0aW1lLCBqdXN0IHNldHMgdXAgdGhlIG1lbWJlcnMgbmVlZGVkLlxuZXhwb3J0cy5lbnJvbGwgPSBmdW5jdGlvbihpdGVtLCBtc2Vjcykge1xuICBjbGVhclRpbWVvdXQoaXRlbS5faWRsZVRpbWVvdXRJZCk7XG4gIGl0ZW0uX2lkbGVUaW1lb3V0ID0gbXNlY3M7XG59O1xuXG5leHBvcnRzLnVuZW5yb2xsID0gZnVuY3Rpb24oaXRlbSkge1xuICBjbGVhclRpbWVvdXQoaXRlbS5faWRsZVRpbWVvdXRJZCk7XG4gIGl0ZW0uX2lkbGVUaW1lb3V0ID0gLTE7XG59O1xuXG5leHBvcnRzLl91bnJlZkFjdGl2ZSA9IGV4cG9ydHMuYWN0aXZlID0gZnVuY3Rpb24oaXRlbSkge1xuICBjbGVhclRpbWVvdXQoaXRlbS5faWRsZVRpbWVvdXRJZCk7XG5cbiAgdmFyIG1zZWNzID0gaXRlbS5faWRsZVRpbWVvdXQ7XG4gIGlmIChtc2VjcyA+PSAwKSB7XG4gICAgaXRlbS5faWRsZVRpbWVvdXRJZCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gb25UaW1lb3V0KCkge1xuICAgICAgaWYgKGl0ZW0uX29uVGltZW91dClcbiAgICAgICAgaXRlbS5fb25UaW1lb3V0KCk7XG4gICAgfSwgbXNlY3MpO1xuICB9XG59O1xuXG4vLyBUaGF0J3Mgbm90IGhvdyBub2RlLmpzIGltcGxlbWVudHMgaXQgYnV0IHRoZSBleHBvc2VkIGFwaSBpcyB0aGUgc2FtZS5cbmV4cG9ydHMuc2V0SW1tZWRpYXRlID0gdHlwZW9mIHNldEltbWVkaWF0ZSA9PT0gXCJmdW5jdGlvblwiID8gc2V0SW1tZWRpYXRlIDogZnVuY3Rpb24oZm4pIHtcbiAgdmFyIGlkID0gbmV4dEltbWVkaWF0ZUlkKys7XG4gIHZhciBhcmdzID0gYXJndW1lbnRzLmxlbmd0aCA8IDIgPyBmYWxzZSA6IHNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTtcblxuICBpbW1lZGlhdGVJZHNbaWRdID0gdHJ1ZTtcblxuICBuZXh0VGljayhmdW5jdGlvbiBvbk5leHRUaWNrKCkge1xuICAgIGlmIChpbW1lZGlhdGVJZHNbaWRdKSB7XG4gICAgICAvLyBmbi5jYWxsKCkgaXMgZmFzdGVyIHNvIHdlIG9wdGltaXplIGZvciB0aGUgY29tbW9uIHVzZS1jYXNlXG4gICAgICAvLyBAc2VlIGh0dHA6Ly9qc3BlcmYuY29tL2NhbGwtYXBwbHktc2VndVxuICAgICAgaWYgKGFyZ3MpIHtcbiAgICAgICAgZm4uYXBwbHkobnVsbCwgYXJncyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmbi5jYWxsKG51bGwpO1xuICAgICAgfVxuICAgICAgLy8gUHJldmVudCBpZHMgZnJvbSBsZWFraW5nXG4gICAgICBleHBvcnRzLmNsZWFySW1tZWRpYXRlKGlkKTtcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiBpZDtcbn07XG5cbmV4cG9ydHMuY2xlYXJJbW1lZGlhdGUgPSB0eXBlb2YgY2xlYXJJbW1lZGlhdGUgPT09IFwiZnVuY3Rpb25cIiA/IGNsZWFySW1tZWRpYXRlIDogZnVuY3Rpb24oaWQpIHtcbiAgZGVsZXRlIGltbWVkaWF0ZUlkc1tpZF07XG59OyIsIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBwdW55Y29kZSA9IHJlcXVpcmUoJ3B1bnljb2RlJyk7XG52YXIgdXRpbCA9IHJlcXVpcmUoJy4vdXRpbCcpO1xuXG5leHBvcnRzLnBhcnNlID0gdXJsUGFyc2U7XG5leHBvcnRzLnJlc29sdmUgPSB1cmxSZXNvbHZlO1xuZXhwb3J0cy5yZXNvbHZlT2JqZWN0ID0gdXJsUmVzb2x2ZU9iamVjdDtcbmV4cG9ydHMuZm9ybWF0ID0gdXJsRm9ybWF0O1xuXG5leHBvcnRzLlVybCA9IFVybDtcblxuZnVuY3Rpb24gVXJsKCkge1xuICB0aGlzLnByb3RvY29sID0gbnVsbDtcbiAgdGhpcy5zbGFzaGVzID0gbnVsbDtcbiAgdGhpcy5hdXRoID0gbnVsbDtcbiAgdGhpcy5ob3N0ID0gbnVsbDtcbiAgdGhpcy5wb3J0ID0gbnVsbDtcbiAgdGhpcy5ob3N0bmFtZSA9IG51bGw7XG4gIHRoaXMuaGFzaCA9IG51bGw7XG4gIHRoaXMuc2VhcmNoID0gbnVsbDtcbiAgdGhpcy5xdWVyeSA9IG51bGw7XG4gIHRoaXMucGF0aG5hbWUgPSBudWxsO1xuICB0aGlzLnBhdGggPSBudWxsO1xuICB0aGlzLmhyZWYgPSBudWxsO1xufVxuXG4vLyBSZWZlcmVuY2U6IFJGQyAzOTg2LCBSRkMgMTgwOCwgUkZDIDIzOTZcblxuLy8gZGVmaW5lIHRoZXNlIGhlcmUgc28gYXQgbGVhc3QgdGhleSBvbmx5IGhhdmUgdG8gYmVcbi8vIGNvbXBpbGVkIG9uY2Ugb24gdGhlIGZpcnN0IG1vZHVsZSBsb2FkLlxudmFyIHByb3RvY29sUGF0dGVybiA9IC9eKFthLXowLTkuKy1dKzopL2ksXG4gICAgcG9ydFBhdHRlcm4gPSAvOlswLTldKiQvLFxuXG4gICAgLy8gU3BlY2lhbCBjYXNlIGZvciBhIHNpbXBsZSBwYXRoIFVSTFxuICAgIHNpbXBsZVBhdGhQYXR0ZXJuID0gL14oXFwvXFwvPyg/IVxcLylbXlxcP1xcc10qKShcXD9bXlxcc10qKT8kLyxcblxuICAgIC8vIFJGQyAyMzk2OiBjaGFyYWN0ZXJzIHJlc2VydmVkIGZvciBkZWxpbWl0aW5nIFVSTHMuXG4gICAgLy8gV2UgYWN0dWFsbHkganVzdCBhdXRvLWVzY2FwZSB0aGVzZS5cbiAgICBkZWxpbXMgPSBbJzwnLCAnPicsICdcIicsICdgJywgJyAnLCAnXFxyJywgJ1xcbicsICdcXHQnXSxcblxuICAgIC8vIFJGQyAyMzk2OiBjaGFyYWN0ZXJzIG5vdCBhbGxvd2VkIGZvciB2YXJpb3VzIHJlYXNvbnMuXG4gICAgdW53aXNlID0gWyd7JywgJ30nLCAnfCcsICdcXFxcJywgJ14nLCAnYCddLmNvbmNhdChkZWxpbXMpLFxuXG4gICAgLy8gQWxsb3dlZCBieSBSRkNzLCBidXQgY2F1c2Ugb2YgWFNTIGF0dGFja3MuICBBbHdheXMgZXNjYXBlIHRoZXNlLlxuICAgIGF1dG9Fc2NhcGUgPSBbJ1xcJyddLmNvbmNhdCh1bndpc2UpLFxuICAgIC8vIENoYXJhY3RlcnMgdGhhdCBhcmUgbmV2ZXIgZXZlciBhbGxvd2VkIGluIGEgaG9zdG5hbWUuXG4gICAgLy8gTm90ZSB0aGF0IGFueSBpbnZhbGlkIGNoYXJzIGFyZSBhbHNvIGhhbmRsZWQsIGJ1dCB0aGVzZVxuICAgIC8vIGFyZSB0aGUgb25lcyB0aGF0IGFyZSAqZXhwZWN0ZWQqIHRvIGJlIHNlZW4sIHNvIHdlIGZhc3QtcGF0aFxuICAgIC8vIHRoZW0uXG4gICAgbm9uSG9zdENoYXJzID0gWyclJywgJy8nLCAnPycsICc7JywgJyMnXS5jb25jYXQoYXV0b0VzY2FwZSksXG4gICAgaG9zdEVuZGluZ0NoYXJzID0gWycvJywgJz8nLCAnIyddLFxuICAgIGhvc3RuYW1lTWF4TGVuID0gMjU1LFxuICAgIGhvc3RuYW1lUGFydFBhdHRlcm4gPSAvXlsrYS16MC05QS1aXy1dezAsNjN9JC8sXG4gICAgaG9zdG5hbWVQYXJ0U3RhcnQgPSAvXihbK2EtejAtOUEtWl8tXXswLDYzfSkoLiopJC8sXG4gICAgLy8gcHJvdG9jb2xzIHRoYXQgY2FuIGFsbG93IFwidW5zYWZlXCIgYW5kIFwidW53aXNlXCIgY2hhcnMuXG4gICAgdW5zYWZlUHJvdG9jb2wgPSB7XG4gICAgICAnamF2YXNjcmlwdCc6IHRydWUsXG4gICAgICAnamF2YXNjcmlwdDonOiB0cnVlXG4gICAgfSxcbiAgICAvLyBwcm90b2NvbHMgdGhhdCBuZXZlciBoYXZlIGEgaG9zdG5hbWUuXG4gICAgaG9zdGxlc3NQcm90b2NvbCA9IHtcbiAgICAgICdqYXZhc2NyaXB0JzogdHJ1ZSxcbiAgICAgICdqYXZhc2NyaXB0Oic6IHRydWVcbiAgICB9LFxuICAgIC8vIHByb3RvY29scyB0aGF0IGFsd2F5cyBjb250YWluIGEgLy8gYml0LlxuICAgIHNsYXNoZWRQcm90b2NvbCA9IHtcbiAgICAgICdodHRwJzogdHJ1ZSxcbiAgICAgICdodHRwcyc6IHRydWUsXG4gICAgICAnZnRwJzogdHJ1ZSxcbiAgICAgICdnb3BoZXInOiB0cnVlLFxuICAgICAgJ2ZpbGUnOiB0cnVlLFxuICAgICAgJ2h0dHA6JzogdHJ1ZSxcbiAgICAgICdodHRwczonOiB0cnVlLFxuICAgICAgJ2Z0cDonOiB0cnVlLFxuICAgICAgJ2dvcGhlcjonOiB0cnVlLFxuICAgICAgJ2ZpbGU6JzogdHJ1ZVxuICAgIH0sXG4gICAgcXVlcnlzdHJpbmcgPSByZXF1aXJlKCdxdWVyeXN0cmluZycpO1xuXG5mdW5jdGlvbiB1cmxQYXJzZSh1cmwsIHBhcnNlUXVlcnlTdHJpbmcsIHNsYXNoZXNEZW5vdGVIb3N0KSB7XG4gIGlmICh1cmwgJiYgdXRpbC5pc09iamVjdCh1cmwpICYmIHVybCBpbnN0YW5jZW9mIFVybCkgcmV0dXJuIHVybDtcblxuICB2YXIgdSA9IG5ldyBVcmw7XG4gIHUucGFyc2UodXJsLCBwYXJzZVF1ZXJ5U3RyaW5nLCBzbGFzaGVzRGVub3RlSG9zdCk7XG4gIHJldHVybiB1O1xufVxuXG5VcmwucHJvdG90eXBlLnBhcnNlID0gZnVuY3Rpb24odXJsLCBwYXJzZVF1ZXJ5U3RyaW5nLCBzbGFzaGVzRGVub3RlSG9zdCkge1xuICBpZiAoIXV0aWwuaXNTdHJpbmcodXJsKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQYXJhbWV0ZXIgJ3VybCcgbXVzdCBiZSBhIHN0cmluZywgbm90IFwiICsgdHlwZW9mIHVybCk7XG4gIH1cblxuICAvLyBDb3B5IGNocm9tZSwgSUUsIG9wZXJhIGJhY2tzbGFzaC1oYW5kbGluZyBiZWhhdmlvci5cbiAgLy8gQmFjayBzbGFzaGVzIGJlZm9yZSB0aGUgcXVlcnkgc3RyaW5nIGdldCBjb252ZXJ0ZWQgdG8gZm9yd2FyZCBzbGFzaGVzXG4gIC8vIFNlZTogaHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTI1OTE2XG4gIHZhciBxdWVyeUluZGV4ID0gdXJsLmluZGV4T2YoJz8nKSxcbiAgICAgIHNwbGl0dGVyID1cbiAgICAgICAgICAocXVlcnlJbmRleCAhPT0gLTEgJiYgcXVlcnlJbmRleCA8IHVybC5pbmRleE9mKCcjJykpID8gJz8nIDogJyMnLFxuICAgICAgdVNwbGl0ID0gdXJsLnNwbGl0KHNwbGl0dGVyKSxcbiAgICAgIHNsYXNoUmVnZXggPSAvXFxcXC9nO1xuICB1U3BsaXRbMF0gPSB1U3BsaXRbMF0ucmVwbGFjZShzbGFzaFJlZ2V4LCAnLycpO1xuICB1cmwgPSB1U3BsaXQuam9pbihzcGxpdHRlcik7XG5cbiAgdmFyIHJlc3QgPSB1cmw7XG5cbiAgLy8gdHJpbSBiZWZvcmUgcHJvY2VlZGluZy5cbiAgLy8gVGhpcyBpcyB0byBzdXBwb3J0IHBhcnNlIHN0dWZmIGxpa2UgXCIgIGh0dHA6Ly9mb28uY29tICBcXG5cIlxuICByZXN0ID0gcmVzdC50cmltKCk7XG5cbiAgaWYgKCFzbGFzaGVzRGVub3RlSG9zdCAmJiB1cmwuc3BsaXQoJyMnKS5sZW5ndGggPT09IDEpIHtcbiAgICAvLyBUcnkgZmFzdCBwYXRoIHJlZ2V4cFxuICAgIHZhciBzaW1wbGVQYXRoID0gc2ltcGxlUGF0aFBhdHRlcm4uZXhlYyhyZXN0KTtcbiAgICBpZiAoc2ltcGxlUGF0aCkge1xuICAgICAgdGhpcy5wYXRoID0gcmVzdDtcbiAgICAgIHRoaXMuaHJlZiA9IHJlc3Q7XG4gICAgICB0aGlzLnBhdGhuYW1lID0gc2ltcGxlUGF0aFsxXTtcbiAgICAgIGlmIChzaW1wbGVQYXRoWzJdKSB7XG4gICAgICAgIHRoaXMuc2VhcmNoID0gc2ltcGxlUGF0aFsyXTtcbiAgICAgICAgaWYgKHBhcnNlUXVlcnlTdHJpbmcpIHtcbiAgICAgICAgICB0aGlzLnF1ZXJ5ID0gcXVlcnlzdHJpbmcucGFyc2UodGhpcy5zZWFyY2guc3Vic3RyKDEpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnF1ZXJ5ID0gdGhpcy5zZWFyY2guc3Vic3RyKDEpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHBhcnNlUXVlcnlTdHJpbmcpIHtcbiAgICAgICAgdGhpcy5zZWFyY2ggPSAnJztcbiAgICAgICAgdGhpcy5xdWVyeSA9IHt9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICB9XG5cbiAgdmFyIHByb3RvID0gcHJvdG9jb2xQYXR0ZXJuLmV4ZWMocmVzdCk7XG4gIGlmIChwcm90bykge1xuICAgIHByb3RvID0gcHJvdG9bMF07XG4gICAgdmFyIGxvd2VyUHJvdG8gPSBwcm90by50b0xvd2VyQ2FzZSgpO1xuICAgIHRoaXMucHJvdG9jb2wgPSBsb3dlclByb3RvO1xuICAgIHJlc3QgPSByZXN0LnN1YnN0cihwcm90by5sZW5ndGgpO1xuICB9XG5cbiAgLy8gZmlndXJlIG91dCBpZiBpdCdzIGdvdCBhIGhvc3RcbiAgLy8gdXNlckBzZXJ2ZXIgaXMgKmFsd2F5cyogaW50ZXJwcmV0ZWQgYXMgYSBob3N0bmFtZSwgYW5kIHVybFxuICAvLyByZXNvbHV0aW9uIHdpbGwgdHJlYXQgLy9mb28vYmFyIGFzIGhvc3Q9Zm9vLHBhdGg9YmFyIGJlY2F1c2UgdGhhdCdzXG4gIC8vIGhvdyB0aGUgYnJvd3NlciByZXNvbHZlcyByZWxhdGl2ZSBVUkxzLlxuICBpZiAoc2xhc2hlc0Rlbm90ZUhvc3QgfHwgcHJvdG8gfHwgcmVzdC5tYXRjaCgvXlxcL1xcL1teQFxcL10rQFteQFxcL10rLykpIHtcbiAgICB2YXIgc2xhc2hlcyA9IHJlc3Quc3Vic3RyKDAsIDIpID09PSAnLy8nO1xuICAgIGlmIChzbGFzaGVzICYmICEocHJvdG8gJiYgaG9zdGxlc3NQcm90b2NvbFtwcm90b10pKSB7XG4gICAgICByZXN0ID0gcmVzdC5zdWJzdHIoMik7XG4gICAgICB0aGlzLnNsYXNoZXMgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIGlmICghaG9zdGxlc3NQcm90b2NvbFtwcm90b10gJiZcbiAgICAgIChzbGFzaGVzIHx8IChwcm90byAmJiAhc2xhc2hlZFByb3RvY29sW3Byb3RvXSkpKSB7XG5cbiAgICAvLyB0aGVyZSdzIGEgaG9zdG5hbWUuXG4gICAgLy8gdGhlIGZpcnN0IGluc3RhbmNlIG9mIC8sID8sIDssIG9yICMgZW5kcyB0aGUgaG9zdC5cbiAgICAvL1xuICAgIC8vIElmIHRoZXJlIGlzIGFuIEAgaW4gdGhlIGhvc3RuYW1lLCB0aGVuIG5vbi1ob3N0IGNoYXJzICphcmUqIGFsbG93ZWRcbiAgICAvLyB0byB0aGUgbGVmdCBvZiB0aGUgbGFzdCBAIHNpZ24sIHVubGVzcyBzb21lIGhvc3QtZW5kaW5nIGNoYXJhY3RlclxuICAgIC8vIGNvbWVzICpiZWZvcmUqIHRoZSBALXNpZ24uXG4gICAgLy8gVVJMcyBhcmUgb2Jub3hpb3VzLlxuICAgIC8vXG4gICAgLy8gZXg6XG4gICAgLy8gaHR0cDovL2FAYkBjLyA9PiB1c2VyOmFAYiBob3N0OmNcbiAgICAvLyBodHRwOi8vYUBiP0BjID0+IHVzZXI6YSBob3N0OmMgcGF0aDovP0BjXG5cbiAgICAvLyB2MC4xMiBUT0RPKGlzYWFjcyk6IFRoaXMgaXMgbm90IHF1aXRlIGhvdyBDaHJvbWUgZG9lcyB0aGluZ3MuXG4gICAgLy8gUmV2aWV3IG91ciB0ZXN0IGNhc2UgYWdhaW5zdCBicm93c2VycyBtb3JlIGNvbXByZWhlbnNpdmVseS5cblxuICAgIC8vIGZpbmQgdGhlIGZpcnN0IGluc3RhbmNlIG9mIGFueSBob3N0RW5kaW5nQ2hhcnNcbiAgICB2YXIgaG9zdEVuZCA9IC0xO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaG9zdEVuZGluZ0NoYXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgaGVjID0gcmVzdC5pbmRleE9mKGhvc3RFbmRpbmdDaGFyc1tpXSk7XG4gICAgICBpZiAoaGVjICE9PSAtMSAmJiAoaG9zdEVuZCA9PT0gLTEgfHwgaGVjIDwgaG9zdEVuZCkpXG4gICAgICAgIGhvc3RFbmQgPSBoZWM7XG4gICAgfVxuXG4gICAgLy8gYXQgdGhpcyBwb2ludCwgZWl0aGVyIHdlIGhhdmUgYW4gZXhwbGljaXQgcG9pbnQgd2hlcmUgdGhlXG4gICAgLy8gYXV0aCBwb3J0aW9uIGNhbm5vdCBnbyBwYXN0LCBvciB0aGUgbGFzdCBAIGNoYXIgaXMgdGhlIGRlY2lkZXIuXG4gICAgdmFyIGF1dGgsIGF0U2lnbjtcbiAgICBpZiAoaG9zdEVuZCA9PT0gLTEpIHtcbiAgICAgIC8vIGF0U2lnbiBjYW4gYmUgYW55d2hlcmUuXG4gICAgICBhdFNpZ24gPSByZXN0Lmxhc3RJbmRleE9mKCdAJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGF0U2lnbiBtdXN0IGJlIGluIGF1dGggcG9ydGlvbi5cbiAgICAgIC8vIGh0dHA6Ly9hQGIvY0BkID0+IGhvc3Q6YiBhdXRoOmEgcGF0aDovY0BkXG4gICAgICBhdFNpZ24gPSByZXN0Lmxhc3RJbmRleE9mKCdAJywgaG9zdEVuZCk7XG4gICAgfVxuXG4gICAgLy8gTm93IHdlIGhhdmUgYSBwb3J0aW9uIHdoaWNoIGlzIGRlZmluaXRlbHkgdGhlIGF1dGguXG4gICAgLy8gUHVsbCB0aGF0IG9mZi5cbiAgICBpZiAoYXRTaWduICE9PSAtMSkge1xuICAgICAgYXV0aCA9IHJlc3Quc2xpY2UoMCwgYXRTaWduKTtcbiAgICAgIHJlc3QgPSByZXN0LnNsaWNlKGF0U2lnbiArIDEpO1xuICAgICAgdGhpcy5hdXRoID0gZGVjb2RlVVJJQ29tcG9uZW50KGF1dGgpO1xuICAgIH1cblxuICAgIC8vIHRoZSBob3N0IGlzIHRoZSByZW1haW5pbmcgdG8gdGhlIGxlZnQgb2YgdGhlIGZpcnN0IG5vbi1ob3N0IGNoYXJcbiAgICBob3N0RW5kID0gLTE7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub25Ib3N0Q2hhcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBoZWMgPSByZXN0LmluZGV4T2Yobm9uSG9zdENoYXJzW2ldKTtcbiAgICAgIGlmIChoZWMgIT09IC0xICYmIChob3N0RW5kID09PSAtMSB8fCBoZWMgPCBob3N0RW5kKSlcbiAgICAgICAgaG9zdEVuZCA9IGhlYztcbiAgICB9XG4gICAgLy8gaWYgd2Ugc3RpbGwgaGF2ZSBub3QgaGl0IGl0LCB0aGVuIHRoZSBlbnRpcmUgdGhpbmcgaXMgYSBob3N0LlxuICAgIGlmIChob3N0RW5kID09PSAtMSlcbiAgICAgIGhvc3RFbmQgPSByZXN0Lmxlbmd0aDtcblxuICAgIHRoaXMuaG9zdCA9IHJlc3Quc2xpY2UoMCwgaG9zdEVuZCk7XG4gICAgcmVzdCA9IHJlc3Quc2xpY2UoaG9zdEVuZCk7XG5cbiAgICAvLyBwdWxsIG91dCBwb3J0LlxuICAgIHRoaXMucGFyc2VIb3N0KCk7XG5cbiAgICAvLyB3ZSd2ZSBpbmRpY2F0ZWQgdGhhdCB0aGVyZSBpcyBhIGhvc3RuYW1lLFxuICAgIC8vIHNvIGV2ZW4gaWYgaXQncyBlbXB0eSwgaXQgaGFzIHRvIGJlIHByZXNlbnQuXG4gICAgdGhpcy5ob3N0bmFtZSA9IHRoaXMuaG9zdG5hbWUgfHwgJyc7XG5cbiAgICAvLyBpZiBob3N0bmFtZSBiZWdpbnMgd2l0aCBbIGFuZCBlbmRzIHdpdGggXVxuICAgIC8vIGFzc3VtZSB0aGF0IGl0J3MgYW4gSVB2NiBhZGRyZXNzLlxuICAgIHZhciBpcHY2SG9zdG5hbWUgPSB0aGlzLmhvc3RuYW1lWzBdID09PSAnWycgJiZcbiAgICAgICAgdGhpcy5ob3N0bmFtZVt0aGlzLmhvc3RuYW1lLmxlbmd0aCAtIDFdID09PSAnXSc7XG5cbiAgICAvLyB2YWxpZGF0ZSBhIGxpdHRsZS5cbiAgICBpZiAoIWlwdjZIb3N0bmFtZSkge1xuICAgICAgdmFyIGhvc3RwYXJ0cyA9IHRoaXMuaG9zdG5hbWUuc3BsaXQoL1xcLi8pO1xuICAgICAgZm9yICh2YXIgaSA9IDAsIGwgPSBob3N0cGFydHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgIHZhciBwYXJ0ID0gaG9zdHBhcnRzW2ldO1xuICAgICAgICBpZiAoIXBhcnQpIGNvbnRpbnVlO1xuICAgICAgICBpZiAoIXBhcnQubWF0Y2goaG9zdG5hbWVQYXJ0UGF0dGVybikpIHtcbiAgICAgICAgICB2YXIgbmV3cGFydCA9ICcnO1xuICAgICAgICAgIGZvciAodmFyIGogPSAwLCBrID0gcGFydC5sZW5ndGg7IGogPCBrOyBqKyspIHtcbiAgICAgICAgICAgIGlmIChwYXJ0LmNoYXJDb2RlQXQoaikgPiAxMjcpIHtcbiAgICAgICAgICAgICAgLy8gd2UgcmVwbGFjZSBub24tQVNDSUkgY2hhciB3aXRoIGEgdGVtcG9yYXJ5IHBsYWNlaG9sZGVyXG4gICAgICAgICAgICAgIC8vIHdlIG5lZWQgdGhpcyB0byBtYWtlIHN1cmUgc2l6ZSBvZiBob3N0bmFtZSBpcyBub3RcbiAgICAgICAgICAgICAgLy8gYnJva2VuIGJ5IHJlcGxhY2luZyBub24tQVNDSUkgYnkgbm90aGluZ1xuICAgICAgICAgICAgICBuZXdwYXJ0ICs9ICd4JztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIG5ld3BhcnQgKz0gcGFydFtqXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gd2UgdGVzdCBhZ2FpbiB3aXRoIEFTQ0lJIGNoYXIgb25seVxuICAgICAgICAgIGlmICghbmV3cGFydC5tYXRjaChob3N0bmFtZVBhcnRQYXR0ZXJuKSkge1xuICAgICAgICAgICAgdmFyIHZhbGlkUGFydHMgPSBob3N0cGFydHMuc2xpY2UoMCwgaSk7XG4gICAgICAgICAgICB2YXIgbm90SG9zdCA9IGhvc3RwYXJ0cy5zbGljZShpICsgMSk7XG4gICAgICAgICAgICB2YXIgYml0ID0gcGFydC5tYXRjaChob3N0bmFtZVBhcnRTdGFydCk7XG4gICAgICAgICAgICBpZiAoYml0KSB7XG4gICAgICAgICAgICAgIHZhbGlkUGFydHMucHVzaChiaXRbMV0pO1xuICAgICAgICAgICAgICBub3RIb3N0LnVuc2hpZnQoYml0WzJdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChub3RIb3N0Lmxlbmd0aCkge1xuICAgICAgICAgICAgICByZXN0ID0gJy8nICsgbm90SG9zdC5qb2luKCcuJykgKyByZXN0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5ob3N0bmFtZSA9IHZhbGlkUGFydHMuam9pbignLicpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaG9zdG5hbWUubGVuZ3RoID4gaG9zdG5hbWVNYXhMZW4pIHtcbiAgICAgIHRoaXMuaG9zdG5hbWUgPSAnJztcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gaG9zdG5hbWVzIGFyZSBhbHdheXMgbG93ZXIgY2FzZS5cbiAgICAgIHRoaXMuaG9zdG5hbWUgPSB0aGlzLmhvc3RuYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgfVxuXG4gICAgaWYgKCFpcHY2SG9zdG5hbWUpIHtcbiAgICAgIC8vIElETkEgU3VwcG9ydDogUmV0dXJucyBhIHB1bnljb2RlZCByZXByZXNlbnRhdGlvbiBvZiBcImRvbWFpblwiLlxuICAgICAgLy8gSXQgb25seSBjb252ZXJ0cyBwYXJ0cyBvZiB0aGUgZG9tYWluIG5hbWUgdGhhdFxuICAgICAgLy8gaGF2ZSBub24tQVNDSUkgY2hhcmFjdGVycywgaS5lLiBpdCBkb2Vzbid0IG1hdHRlciBpZlxuICAgICAgLy8geW91IGNhbGwgaXQgd2l0aCBhIGRvbWFpbiB0aGF0IGFscmVhZHkgaXMgQVNDSUktb25seS5cbiAgICAgIHRoaXMuaG9zdG5hbWUgPSBwdW55Y29kZS50b0FTQ0lJKHRoaXMuaG9zdG5hbWUpO1xuICAgIH1cblxuICAgIHZhciBwID0gdGhpcy5wb3J0ID8gJzonICsgdGhpcy5wb3J0IDogJyc7XG4gICAgdmFyIGggPSB0aGlzLmhvc3RuYW1lIHx8ICcnO1xuICAgIHRoaXMuaG9zdCA9IGggKyBwO1xuICAgIHRoaXMuaHJlZiArPSB0aGlzLmhvc3Q7XG5cbiAgICAvLyBzdHJpcCBbIGFuZCBdIGZyb20gdGhlIGhvc3RuYW1lXG4gICAgLy8gdGhlIGhvc3QgZmllbGQgc3RpbGwgcmV0YWlucyB0aGVtLCB0aG91Z2hcbiAgICBpZiAoaXB2Nkhvc3RuYW1lKSB7XG4gICAgICB0aGlzLmhvc3RuYW1lID0gdGhpcy5ob3N0bmFtZS5zdWJzdHIoMSwgdGhpcy5ob3N0bmFtZS5sZW5ndGggLSAyKTtcbiAgICAgIGlmIChyZXN0WzBdICE9PSAnLycpIHtcbiAgICAgICAgcmVzdCA9ICcvJyArIHJlc3Q7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gbm93IHJlc3QgaXMgc2V0IHRvIHRoZSBwb3N0LWhvc3Qgc3R1ZmYuXG4gIC8vIGNob3Agb2ZmIGFueSBkZWxpbSBjaGFycy5cbiAgaWYgKCF1bnNhZmVQcm90b2NvbFtsb3dlclByb3RvXSkge1xuXG4gICAgLy8gRmlyc3QsIG1ha2UgMTAwJSBzdXJlIHRoYXQgYW55IFwiYXV0b0VzY2FwZVwiIGNoYXJzIGdldFxuICAgIC8vIGVzY2FwZWQsIGV2ZW4gaWYgZW5jb2RlVVJJQ29tcG9uZW50IGRvZXNuJ3QgdGhpbmsgdGhleVxuICAgIC8vIG5lZWQgdG8gYmUuXG4gICAgZm9yICh2YXIgaSA9IDAsIGwgPSBhdXRvRXNjYXBlLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgdmFyIGFlID0gYXV0b0VzY2FwZVtpXTtcbiAgICAgIGlmIChyZXN0LmluZGV4T2YoYWUpID09PSAtMSlcbiAgICAgICAgY29udGludWU7XG4gICAgICB2YXIgZXNjID0gZW5jb2RlVVJJQ29tcG9uZW50KGFlKTtcbiAgICAgIGlmIChlc2MgPT09IGFlKSB7XG4gICAgICAgIGVzYyA9IGVzY2FwZShhZSk7XG4gICAgICB9XG4gICAgICByZXN0ID0gcmVzdC5zcGxpdChhZSkuam9pbihlc2MpO1xuICAgIH1cbiAgfVxuXG5cbiAgLy8gY2hvcCBvZmYgZnJvbSB0aGUgdGFpbCBmaXJzdC5cbiAgdmFyIGhhc2ggPSByZXN0LmluZGV4T2YoJyMnKTtcbiAgaWYgKGhhc2ggIT09IC0xKSB7XG4gICAgLy8gZ290IGEgZnJhZ21lbnQgc3RyaW5nLlxuICAgIHRoaXMuaGFzaCA9IHJlc3Quc3Vic3RyKGhhc2gpO1xuICAgIHJlc3QgPSByZXN0LnNsaWNlKDAsIGhhc2gpO1xuICB9XG4gIHZhciBxbSA9IHJlc3QuaW5kZXhPZignPycpO1xuICBpZiAocW0gIT09IC0xKSB7XG4gICAgdGhpcy5zZWFyY2ggPSByZXN0LnN1YnN0cihxbSk7XG4gICAgdGhpcy5xdWVyeSA9IHJlc3Quc3Vic3RyKHFtICsgMSk7XG4gICAgaWYgKHBhcnNlUXVlcnlTdHJpbmcpIHtcbiAgICAgIHRoaXMucXVlcnkgPSBxdWVyeXN0cmluZy5wYXJzZSh0aGlzLnF1ZXJ5KTtcbiAgICB9XG4gICAgcmVzdCA9IHJlc3Quc2xpY2UoMCwgcW0pO1xuICB9IGVsc2UgaWYgKHBhcnNlUXVlcnlTdHJpbmcpIHtcbiAgICAvLyBubyBxdWVyeSBzdHJpbmcsIGJ1dCBwYXJzZVF1ZXJ5U3RyaW5nIHN0aWxsIHJlcXVlc3RlZFxuICAgIHRoaXMuc2VhcmNoID0gJyc7XG4gICAgdGhpcy5xdWVyeSA9IHt9O1xuICB9XG4gIGlmIChyZXN0KSB0aGlzLnBhdGhuYW1lID0gcmVzdDtcbiAgaWYgKHNsYXNoZWRQcm90b2NvbFtsb3dlclByb3RvXSAmJlxuICAgICAgdGhpcy5ob3N0bmFtZSAmJiAhdGhpcy5wYXRobmFtZSkge1xuICAgIHRoaXMucGF0aG5hbWUgPSAnLyc7XG4gIH1cblxuICAvL3RvIHN1cHBvcnQgaHR0cC5yZXF1ZXN0XG4gIGlmICh0aGlzLnBhdGhuYW1lIHx8IHRoaXMuc2VhcmNoKSB7XG4gICAgdmFyIHAgPSB0aGlzLnBhdGhuYW1lIHx8ICcnO1xuICAgIHZhciBzID0gdGhpcy5zZWFyY2ggfHwgJyc7XG4gICAgdGhpcy5wYXRoID0gcCArIHM7XG4gIH1cblxuICAvLyBmaW5hbGx5LCByZWNvbnN0cnVjdCB0aGUgaHJlZiBiYXNlZCBvbiB3aGF0IGhhcyBiZWVuIHZhbGlkYXRlZC5cbiAgdGhpcy5ocmVmID0gdGhpcy5mb3JtYXQoKTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vLyBmb3JtYXQgYSBwYXJzZWQgb2JqZWN0IGludG8gYSB1cmwgc3RyaW5nXG5mdW5jdGlvbiB1cmxGb3JtYXQob2JqKSB7XG4gIC8vIGVuc3VyZSBpdCdzIGFuIG9iamVjdCwgYW5kIG5vdCBhIHN0cmluZyB1cmwuXG4gIC8vIElmIGl0J3MgYW4gb2JqLCB0aGlzIGlzIGEgbm8tb3AuXG4gIC8vIHRoaXMgd2F5LCB5b3UgY2FuIGNhbGwgdXJsX2Zvcm1hdCgpIG9uIHN0cmluZ3NcbiAgLy8gdG8gY2xlYW4gdXAgcG90ZW50aWFsbHkgd29ua3kgdXJscy5cbiAgaWYgKHV0aWwuaXNTdHJpbmcob2JqKSkgb2JqID0gdXJsUGFyc2Uob2JqKTtcbiAgaWYgKCEob2JqIGluc3RhbmNlb2YgVXJsKSkgcmV0dXJuIFVybC5wcm90b3R5cGUuZm9ybWF0LmNhbGwob2JqKTtcbiAgcmV0dXJuIG9iai5mb3JtYXQoKTtcbn1cblxuVXJsLnByb3RvdHlwZS5mb3JtYXQgPSBmdW5jdGlvbigpIHtcbiAgdmFyIGF1dGggPSB0aGlzLmF1dGggfHwgJyc7XG4gIGlmIChhdXRoKSB7XG4gICAgYXV0aCA9IGVuY29kZVVSSUNvbXBvbmVudChhdXRoKTtcbiAgICBhdXRoID0gYXV0aC5yZXBsYWNlKC8lM0EvaSwgJzonKTtcbiAgICBhdXRoICs9ICdAJztcbiAgfVxuXG4gIHZhciBwcm90b2NvbCA9IHRoaXMucHJvdG9jb2wgfHwgJycsXG4gICAgICBwYXRobmFtZSA9IHRoaXMucGF0aG5hbWUgfHwgJycsXG4gICAgICBoYXNoID0gdGhpcy5oYXNoIHx8ICcnLFxuICAgICAgaG9zdCA9IGZhbHNlLFxuICAgICAgcXVlcnkgPSAnJztcblxuICBpZiAodGhpcy5ob3N0KSB7XG4gICAgaG9zdCA9IGF1dGggKyB0aGlzLmhvc3Q7XG4gIH0gZWxzZSBpZiAodGhpcy5ob3N0bmFtZSkge1xuICAgIGhvc3QgPSBhdXRoICsgKHRoaXMuaG9zdG5hbWUuaW5kZXhPZignOicpID09PSAtMSA/XG4gICAgICAgIHRoaXMuaG9zdG5hbWUgOlxuICAgICAgICAnWycgKyB0aGlzLmhvc3RuYW1lICsgJ10nKTtcbiAgICBpZiAodGhpcy5wb3J0KSB7XG4gICAgICBob3N0ICs9ICc6JyArIHRoaXMucG9ydDtcbiAgICB9XG4gIH1cblxuICBpZiAodGhpcy5xdWVyeSAmJlxuICAgICAgdXRpbC5pc09iamVjdCh0aGlzLnF1ZXJ5KSAmJlxuICAgICAgT2JqZWN0LmtleXModGhpcy5xdWVyeSkubGVuZ3RoKSB7XG4gICAgcXVlcnkgPSBxdWVyeXN0cmluZy5zdHJpbmdpZnkodGhpcy5xdWVyeSk7XG4gIH1cblxuICB2YXIgc2VhcmNoID0gdGhpcy5zZWFyY2ggfHwgKHF1ZXJ5ICYmICgnPycgKyBxdWVyeSkpIHx8ICcnO1xuXG4gIGlmIChwcm90b2NvbCAmJiBwcm90b2NvbC5zdWJzdHIoLTEpICE9PSAnOicpIHByb3RvY29sICs9ICc6JztcblxuICAvLyBvbmx5IHRoZSBzbGFzaGVkUHJvdG9jb2xzIGdldCB0aGUgLy8uICBOb3QgbWFpbHRvOiwgeG1wcDosIGV0Yy5cbiAgLy8gdW5sZXNzIHRoZXkgaGFkIHRoZW0gdG8gYmVnaW4gd2l0aC5cbiAgaWYgKHRoaXMuc2xhc2hlcyB8fFxuICAgICAgKCFwcm90b2NvbCB8fCBzbGFzaGVkUHJvdG9jb2xbcHJvdG9jb2xdKSAmJiBob3N0ICE9PSBmYWxzZSkge1xuICAgIGhvc3QgPSAnLy8nICsgKGhvc3QgfHwgJycpO1xuICAgIGlmIChwYXRobmFtZSAmJiBwYXRobmFtZS5jaGFyQXQoMCkgIT09ICcvJykgcGF0aG5hbWUgPSAnLycgKyBwYXRobmFtZTtcbiAgfSBlbHNlIGlmICghaG9zdCkge1xuICAgIGhvc3QgPSAnJztcbiAgfVxuXG4gIGlmIChoYXNoICYmIGhhc2guY2hhckF0KDApICE9PSAnIycpIGhhc2ggPSAnIycgKyBoYXNoO1xuICBpZiAoc2VhcmNoICYmIHNlYXJjaC5jaGFyQXQoMCkgIT09ICc/Jykgc2VhcmNoID0gJz8nICsgc2VhcmNoO1xuXG4gIHBhdGhuYW1lID0gcGF0aG5hbWUucmVwbGFjZSgvWz8jXS9nLCBmdW5jdGlvbihtYXRjaCkge1xuICAgIHJldHVybiBlbmNvZGVVUklDb21wb25lbnQobWF0Y2gpO1xuICB9KTtcbiAgc2VhcmNoID0gc2VhcmNoLnJlcGxhY2UoJyMnLCAnJTIzJyk7XG5cbiAgcmV0dXJuIHByb3RvY29sICsgaG9zdCArIHBhdGhuYW1lICsgc2VhcmNoICsgaGFzaDtcbn07XG5cbmZ1bmN0aW9uIHVybFJlc29sdmUoc291cmNlLCByZWxhdGl2ZSkge1xuICByZXR1cm4gdXJsUGFyc2Uoc291cmNlLCBmYWxzZSwgdHJ1ZSkucmVzb2x2ZShyZWxhdGl2ZSk7XG59XG5cblVybC5wcm90b3R5cGUucmVzb2x2ZSA9IGZ1bmN0aW9uKHJlbGF0aXZlKSB7XG4gIHJldHVybiB0aGlzLnJlc29sdmVPYmplY3QodXJsUGFyc2UocmVsYXRpdmUsIGZhbHNlLCB0cnVlKSkuZm9ybWF0KCk7XG59O1xuXG5mdW5jdGlvbiB1cmxSZXNvbHZlT2JqZWN0KHNvdXJjZSwgcmVsYXRpdmUpIHtcbiAgaWYgKCFzb3VyY2UpIHJldHVybiByZWxhdGl2ZTtcbiAgcmV0dXJuIHVybFBhcnNlKHNvdXJjZSwgZmFsc2UsIHRydWUpLnJlc29sdmVPYmplY3QocmVsYXRpdmUpO1xufVxuXG5VcmwucHJvdG90eXBlLnJlc29sdmVPYmplY3QgPSBmdW5jdGlvbihyZWxhdGl2ZSkge1xuICBpZiAodXRpbC5pc1N0cmluZyhyZWxhdGl2ZSkpIHtcbiAgICB2YXIgcmVsID0gbmV3IFVybCgpO1xuICAgIHJlbC5wYXJzZShyZWxhdGl2ZSwgZmFsc2UsIHRydWUpO1xuICAgIHJlbGF0aXZlID0gcmVsO1xuICB9XG5cbiAgdmFyIHJlc3VsdCA9IG5ldyBVcmwoKTtcbiAgdmFyIHRrZXlzID0gT2JqZWN0LmtleXModGhpcyk7XG4gIGZvciAodmFyIHRrID0gMDsgdGsgPCB0a2V5cy5sZW5ndGg7IHRrKyspIHtcbiAgICB2YXIgdGtleSA9IHRrZXlzW3RrXTtcbiAgICByZXN1bHRbdGtleV0gPSB0aGlzW3RrZXldO1xuICB9XG5cbiAgLy8gaGFzaCBpcyBhbHdheXMgb3ZlcnJpZGRlbiwgbm8gbWF0dGVyIHdoYXQuXG4gIC8vIGV2ZW4gaHJlZj1cIlwiIHdpbGwgcmVtb3ZlIGl0LlxuICByZXN1bHQuaGFzaCA9IHJlbGF0aXZlLmhhc2g7XG5cbiAgLy8gaWYgdGhlIHJlbGF0aXZlIHVybCBpcyBlbXB0eSwgdGhlbiB0aGVyZSdzIG5vdGhpbmcgbGVmdCB0byBkbyBoZXJlLlxuICBpZiAocmVsYXRpdmUuaHJlZiA9PT0gJycpIHtcbiAgICByZXN1bHQuaHJlZiA9IHJlc3VsdC5mb3JtYXQoKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLy8gaHJlZnMgbGlrZSAvL2Zvby9iYXIgYWx3YXlzIGN1dCB0byB0aGUgcHJvdG9jb2wuXG4gIGlmIChyZWxhdGl2ZS5zbGFzaGVzICYmICFyZWxhdGl2ZS5wcm90b2NvbCkge1xuICAgIC8vIHRha2UgZXZlcnl0aGluZyBleGNlcHQgdGhlIHByb3RvY29sIGZyb20gcmVsYXRpdmVcbiAgICB2YXIgcmtleXMgPSBPYmplY3Qua2V5cyhyZWxhdGl2ZSk7XG4gICAgZm9yICh2YXIgcmsgPSAwOyByayA8IHJrZXlzLmxlbmd0aDsgcmsrKykge1xuICAgICAgdmFyIHJrZXkgPSBya2V5c1tya107XG4gICAgICBpZiAocmtleSAhPT0gJ3Byb3RvY29sJylcbiAgICAgICAgcmVzdWx0W3JrZXldID0gcmVsYXRpdmVbcmtleV07XG4gICAgfVxuXG4gICAgLy91cmxQYXJzZSBhcHBlbmRzIHRyYWlsaW5nIC8gdG8gdXJscyBsaWtlIGh0dHA6Ly93d3cuZXhhbXBsZS5jb21cbiAgICBpZiAoc2xhc2hlZFByb3RvY29sW3Jlc3VsdC5wcm90b2NvbF0gJiZcbiAgICAgICAgcmVzdWx0Lmhvc3RuYW1lICYmICFyZXN1bHQucGF0aG5hbWUpIHtcbiAgICAgIHJlc3VsdC5wYXRoID0gcmVzdWx0LnBhdGhuYW1lID0gJy8nO1xuICAgIH1cblxuICAgIHJlc3VsdC5ocmVmID0gcmVzdWx0LmZvcm1hdCgpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBpZiAocmVsYXRpdmUucHJvdG9jb2wgJiYgcmVsYXRpdmUucHJvdG9jb2wgIT09IHJlc3VsdC5wcm90b2NvbCkge1xuICAgIC8vIGlmIGl0J3MgYSBrbm93biB1cmwgcHJvdG9jb2wsIHRoZW4gY2hhbmdpbmdcbiAgICAvLyB0aGUgcHJvdG9jb2wgZG9lcyB3ZWlyZCB0aGluZ3NcbiAgICAvLyBmaXJzdCwgaWYgaXQncyBub3QgZmlsZTosIHRoZW4gd2UgTVVTVCBoYXZlIGEgaG9zdCxcbiAgICAvLyBhbmQgaWYgdGhlcmUgd2FzIGEgcGF0aFxuICAgIC8vIHRvIGJlZ2luIHdpdGgsIHRoZW4gd2UgTVVTVCBoYXZlIGEgcGF0aC5cbiAgICAvLyBpZiBpdCBpcyBmaWxlOiwgdGhlbiB0aGUgaG9zdCBpcyBkcm9wcGVkLFxuICAgIC8vIGJlY2F1c2UgdGhhdCdzIGtub3duIHRvIGJlIGhvc3RsZXNzLlxuICAgIC8vIGFueXRoaW5nIGVsc2UgaXMgYXNzdW1lZCB0byBiZSBhYnNvbHV0ZS5cbiAgICBpZiAoIXNsYXNoZWRQcm90b2NvbFtyZWxhdGl2ZS5wcm90b2NvbF0pIHtcbiAgICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMocmVsYXRpdmUpO1xuICAgICAgZm9yICh2YXIgdiA9IDA7IHYgPCBrZXlzLmxlbmd0aDsgdisrKSB7XG4gICAgICAgIHZhciBrID0ga2V5c1t2XTtcbiAgICAgICAgcmVzdWx0W2tdID0gcmVsYXRpdmVba107XG4gICAgICB9XG4gICAgICByZXN1bHQuaHJlZiA9IHJlc3VsdC5mb3JtYXQoKTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgcmVzdWx0LnByb3RvY29sID0gcmVsYXRpdmUucHJvdG9jb2w7XG4gICAgaWYgKCFyZWxhdGl2ZS5ob3N0ICYmICFob3N0bGVzc1Byb3RvY29sW3JlbGF0aXZlLnByb3RvY29sXSkge1xuICAgICAgdmFyIHJlbFBhdGggPSAocmVsYXRpdmUucGF0aG5hbWUgfHwgJycpLnNwbGl0KCcvJyk7XG4gICAgICB3aGlsZSAocmVsUGF0aC5sZW5ndGggJiYgIShyZWxhdGl2ZS5ob3N0ID0gcmVsUGF0aC5zaGlmdCgpKSk7XG4gICAgICBpZiAoIXJlbGF0aXZlLmhvc3QpIHJlbGF0aXZlLmhvc3QgPSAnJztcbiAgICAgIGlmICghcmVsYXRpdmUuaG9zdG5hbWUpIHJlbGF0aXZlLmhvc3RuYW1lID0gJyc7XG4gICAgICBpZiAocmVsUGF0aFswXSAhPT0gJycpIHJlbFBhdGgudW5zaGlmdCgnJyk7XG4gICAgICBpZiAocmVsUGF0aC5sZW5ndGggPCAyKSByZWxQYXRoLnVuc2hpZnQoJycpO1xuICAgICAgcmVzdWx0LnBhdGhuYW1lID0gcmVsUGF0aC5qb2luKCcvJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdC5wYXRobmFtZSA9IHJlbGF0aXZlLnBhdGhuYW1lO1xuICAgIH1cbiAgICByZXN1bHQuc2VhcmNoID0gcmVsYXRpdmUuc2VhcmNoO1xuICAgIHJlc3VsdC5xdWVyeSA9IHJlbGF0aXZlLnF1ZXJ5O1xuICAgIHJlc3VsdC5ob3N0ID0gcmVsYXRpdmUuaG9zdCB8fCAnJztcbiAgICByZXN1bHQuYXV0aCA9IHJlbGF0aXZlLmF1dGg7XG4gICAgcmVzdWx0Lmhvc3RuYW1lID0gcmVsYXRpdmUuaG9zdG5hbWUgfHwgcmVsYXRpdmUuaG9zdDtcbiAgICByZXN1bHQucG9ydCA9IHJlbGF0aXZlLnBvcnQ7XG4gICAgLy8gdG8gc3VwcG9ydCBodHRwLnJlcXVlc3RcbiAgICBpZiAocmVzdWx0LnBhdGhuYW1lIHx8IHJlc3VsdC5zZWFyY2gpIHtcbiAgICAgIHZhciBwID0gcmVzdWx0LnBhdGhuYW1lIHx8ICcnO1xuICAgICAgdmFyIHMgPSByZXN1bHQuc2VhcmNoIHx8ICcnO1xuICAgICAgcmVzdWx0LnBhdGggPSBwICsgcztcbiAgICB9XG4gICAgcmVzdWx0LnNsYXNoZXMgPSByZXN1bHQuc2xhc2hlcyB8fCByZWxhdGl2ZS5zbGFzaGVzO1xuICAgIHJlc3VsdC5ocmVmID0gcmVzdWx0LmZvcm1hdCgpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICB2YXIgaXNTb3VyY2VBYnMgPSAocmVzdWx0LnBhdGhuYW1lICYmIHJlc3VsdC5wYXRobmFtZS5jaGFyQXQoMCkgPT09ICcvJyksXG4gICAgICBpc1JlbEFicyA9IChcbiAgICAgICAgICByZWxhdGl2ZS5ob3N0IHx8XG4gICAgICAgICAgcmVsYXRpdmUucGF0aG5hbWUgJiYgcmVsYXRpdmUucGF0aG5hbWUuY2hhckF0KDApID09PSAnLydcbiAgICAgICksXG4gICAgICBtdXN0RW5kQWJzID0gKGlzUmVsQWJzIHx8IGlzU291cmNlQWJzIHx8XG4gICAgICAgICAgICAgICAgICAgIChyZXN1bHQuaG9zdCAmJiByZWxhdGl2ZS5wYXRobmFtZSkpLFxuICAgICAgcmVtb3ZlQWxsRG90cyA9IG11c3RFbmRBYnMsXG4gICAgICBzcmNQYXRoID0gcmVzdWx0LnBhdGhuYW1lICYmIHJlc3VsdC5wYXRobmFtZS5zcGxpdCgnLycpIHx8IFtdLFxuICAgICAgcmVsUGF0aCA9IHJlbGF0aXZlLnBhdGhuYW1lICYmIHJlbGF0aXZlLnBhdGhuYW1lLnNwbGl0KCcvJykgfHwgW10sXG4gICAgICBwc3ljaG90aWMgPSByZXN1bHQucHJvdG9jb2wgJiYgIXNsYXNoZWRQcm90b2NvbFtyZXN1bHQucHJvdG9jb2xdO1xuXG4gIC8vIGlmIHRoZSB1cmwgaXMgYSBub24tc2xhc2hlZCB1cmwsIHRoZW4gcmVsYXRpdmVcbiAgLy8gbGlua3MgbGlrZSAuLi8uLiBzaG91bGQgYmUgYWJsZVxuICAvLyB0byBjcmF3bCB1cCB0byB0aGUgaG9zdG5hbWUsIGFzIHdlbGwuICBUaGlzIGlzIHN0cmFuZ2UuXG4gIC8vIHJlc3VsdC5wcm90b2NvbCBoYXMgYWxyZWFkeSBiZWVuIHNldCBieSBub3cuXG4gIC8vIExhdGVyIG9uLCBwdXQgdGhlIGZpcnN0IHBhdGggcGFydCBpbnRvIHRoZSBob3N0IGZpZWxkLlxuICBpZiAocHN5Y2hvdGljKSB7XG4gICAgcmVzdWx0Lmhvc3RuYW1lID0gJyc7XG4gICAgcmVzdWx0LnBvcnQgPSBudWxsO1xuICAgIGlmIChyZXN1bHQuaG9zdCkge1xuICAgICAgaWYgKHNyY1BhdGhbMF0gPT09ICcnKSBzcmNQYXRoWzBdID0gcmVzdWx0Lmhvc3Q7XG4gICAgICBlbHNlIHNyY1BhdGgudW5zaGlmdChyZXN1bHQuaG9zdCk7XG4gICAgfVxuICAgIHJlc3VsdC5ob3N0ID0gJyc7XG4gICAgaWYgKHJlbGF0aXZlLnByb3RvY29sKSB7XG4gICAgICByZWxhdGl2ZS5ob3N0bmFtZSA9IG51bGw7XG4gICAgICByZWxhdGl2ZS5wb3J0ID0gbnVsbDtcbiAgICAgIGlmIChyZWxhdGl2ZS5ob3N0KSB7XG4gICAgICAgIGlmIChyZWxQYXRoWzBdID09PSAnJykgcmVsUGF0aFswXSA9IHJlbGF0aXZlLmhvc3Q7XG4gICAgICAgIGVsc2UgcmVsUGF0aC51bnNoaWZ0KHJlbGF0aXZlLmhvc3QpO1xuICAgICAgfVxuICAgICAgcmVsYXRpdmUuaG9zdCA9IG51bGw7XG4gICAgfVxuICAgIG11c3RFbmRBYnMgPSBtdXN0RW5kQWJzICYmIChyZWxQYXRoWzBdID09PSAnJyB8fCBzcmNQYXRoWzBdID09PSAnJyk7XG4gIH1cblxuICBpZiAoaXNSZWxBYnMpIHtcbiAgICAvLyBpdCdzIGFic29sdXRlLlxuICAgIHJlc3VsdC5ob3N0ID0gKHJlbGF0aXZlLmhvc3QgfHwgcmVsYXRpdmUuaG9zdCA9PT0gJycpID9cbiAgICAgICAgICAgICAgICAgIHJlbGF0aXZlLmhvc3QgOiByZXN1bHQuaG9zdDtcbiAgICByZXN1bHQuaG9zdG5hbWUgPSAocmVsYXRpdmUuaG9zdG5hbWUgfHwgcmVsYXRpdmUuaG9zdG5hbWUgPT09ICcnKSA/XG4gICAgICAgICAgICAgICAgICAgICAgcmVsYXRpdmUuaG9zdG5hbWUgOiByZXN1bHQuaG9zdG5hbWU7XG4gICAgcmVzdWx0LnNlYXJjaCA9IHJlbGF0aXZlLnNlYXJjaDtcbiAgICByZXN1bHQucXVlcnkgPSByZWxhdGl2ZS5xdWVyeTtcbiAgICBzcmNQYXRoID0gcmVsUGF0aDtcbiAgICAvLyBmYWxsIHRocm91Z2ggdG8gdGhlIGRvdC1oYW5kbGluZyBiZWxvdy5cbiAgfSBlbHNlIGlmIChyZWxQYXRoLmxlbmd0aCkge1xuICAgIC8vIGl0J3MgcmVsYXRpdmVcbiAgICAvLyB0aHJvdyBhd2F5IHRoZSBleGlzdGluZyBmaWxlLCBhbmQgdGFrZSB0aGUgbmV3IHBhdGggaW5zdGVhZC5cbiAgICBpZiAoIXNyY1BhdGgpIHNyY1BhdGggPSBbXTtcbiAgICBzcmNQYXRoLnBvcCgpO1xuICAgIHNyY1BhdGggPSBzcmNQYXRoLmNvbmNhdChyZWxQYXRoKTtcbiAgICByZXN1bHQuc2VhcmNoID0gcmVsYXRpdmUuc2VhcmNoO1xuICAgIHJlc3VsdC5xdWVyeSA9IHJlbGF0aXZlLnF1ZXJ5O1xuICB9IGVsc2UgaWYgKCF1dGlsLmlzTnVsbE9yVW5kZWZpbmVkKHJlbGF0aXZlLnNlYXJjaCkpIHtcbiAgICAvLyBqdXN0IHB1bGwgb3V0IHRoZSBzZWFyY2guXG4gICAgLy8gbGlrZSBocmVmPSc/Zm9vJy5cbiAgICAvLyBQdXQgdGhpcyBhZnRlciB0aGUgb3RoZXIgdHdvIGNhc2VzIGJlY2F1c2UgaXQgc2ltcGxpZmllcyB0aGUgYm9vbGVhbnNcbiAgICBpZiAocHN5Y2hvdGljKSB7XG4gICAgICByZXN1bHQuaG9zdG5hbWUgPSByZXN1bHQuaG9zdCA9IHNyY1BhdGguc2hpZnQoKTtcbiAgICAgIC8vb2NjYXRpb25hbHkgdGhlIGF1dGggY2FuIGdldCBzdHVjayBvbmx5IGluIGhvc3RcbiAgICAgIC8vdGhpcyBlc3BlY2lhbGx5IGhhcHBlbnMgaW4gY2FzZXMgbGlrZVxuICAgICAgLy91cmwucmVzb2x2ZU9iamVjdCgnbWFpbHRvOmxvY2FsMUBkb21haW4xJywgJ2xvY2FsMkBkb21haW4yJylcbiAgICAgIHZhciBhdXRoSW5Ib3N0ID0gcmVzdWx0Lmhvc3QgJiYgcmVzdWx0Lmhvc3QuaW5kZXhPZignQCcpID4gMCA/XG4gICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5ob3N0LnNwbGl0KCdAJykgOiBmYWxzZTtcbiAgICAgIGlmIChhdXRoSW5Ib3N0KSB7XG4gICAgICAgIHJlc3VsdC5hdXRoID0gYXV0aEluSG9zdC5zaGlmdCgpO1xuICAgICAgICByZXN1bHQuaG9zdCA9IHJlc3VsdC5ob3N0bmFtZSA9IGF1dGhJbkhvc3Quc2hpZnQoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmVzdWx0LnNlYXJjaCA9IHJlbGF0aXZlLnNlYXJjaDtcbiAgICByZXN1bHQucXVlcnkgPSByZWxhdGl2ZS5xdWVyeTtcbiAgICAvL3RvIHN1cHBvcnQgaHR0cC5yZXF1ZXN0XG4gICAgaWYgKCF1dGlsLmlzTnVsbChyZXN1bHQucGF0aG5hbWUpIHx8ICF1dGlsLmlzTnVsbChyZXN1bHQuc2VhcmNoKSkge1xuICAgICAgcmVzdWx0LnBhdGggPSAocmVzdWx0LnBhdGhuYW1lID8gcmVzdWx0LnBhdGhuYW1lIDogJycpICtcbiAgICAgICAgICAgICAgICAgICAgKHJlc3VsdC5zZWFyY2ggPyByZXN1bHQuc2VhcmNoIDogJycpO1xuICAgIH1cbiAgICByZXN1bHQuaHJlZiA9IHJlc3VsdC5mb3JtYXQoKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgaWYgKCFzcmNQYXRoLmxlbmd0aCkge1xuICAgIC8vIG5vIHBhdGggYXQgYWxsLiAgZWFzeS5cbiAgICAvLyB3ZSd2ZSBhbHJlYWR5IGhhbmRsZWQgdGhlIG90aGVyIHN0dWZmIGFib3ZlLlxuICAgIHJlc3VsdC5wYXRobmFtZSA9IG51bGw7XG4gICAgLy90byBzdXBwb3J0IGh0dHAucmVxdWVzdFxuICAgIGlmIChyZXN1bHQuc2VhcmNoKSB7XG4gICAgICByZXN1bHQucGF0aCA9ICcvJyArIHJlc3VsdC5zZWFyY2g7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdC5wYXRoID0gbnVsbDtcbiAgICB9XG4gICAgcmVzdWx0LmhyZWYgPSByZXN1bHQuZm9ybWF0KCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8vIGlmIGEgdXJsIEVORHMgaW4gLiBvciAuLiwgdGhlbiBpdCBtdXN0IGdldCBhIHRyYWlsaW5nIHNsYXNoLlxuICAvLyBob3dldmVyLCBpZiBpdCBlbmRzIGluIGFueXRoaW5nIGVsc2Ugbm9uLXNsYXNoeSxcbiAgLy8gdGhlbiBpdCBtdXN0IE5PVCBnZXQgYSB0cmFpbGluZyBzbGFzaC5cbiAgdmFyIGxhc3QgPSBzcmNQYXRoLnNsaWNlKC0xKVswXTtcbiAgdmFyIGhhc1RyYWlsaW5nU2xhc2ggPSAoXG4gICAgICAocmVzdWx0Lmhvc3QgfHwgcmVsYXRpdmUuaG9zdCB8fCBzcmNQYXRoLmxlbmd0aCA+IDEpICYmXG4gICAgICAobGFzdCA9PT0gJy4nIHx8IGxhc3QgPT09ICcuLicpIHx8IGxhc3QgPT09ICcnKTtcblxuICAvLyBzdHJpcCBzaW5nbGUgZG90cywgcmVzb2x2ZSBkb3VibGUgZG90cyB0byBwYXJlbnQgZGlyXG4gIC8vIGlmIHRoZSBwYXRoIHRyaWVzIHRvIGdvIGFib3ZlIHRoZSByb290LCBgdXBgIGVuZHMgdXAgPiAwXG4gIHZhciB1cCA9IDA7XG4gIGZvciAodmFyIGkgPSBzcmNQYXRoLmxlbmd0aDsgaSA+PSAwOyBpLS0pIHtcbiAgICBsYXN0ID0gc3JjUGF0aFtpXTtcbiAgICBpZiAobGFzdCA9PT0gJy4nKSB7XG4gICAgICBzcmNQYXRoLnNwbGljZShpLCAxKTtcbiAgICB9IGVsc2UgaWYgKGxhc3QgPT09ICcuLicpIHtcbiAgICAgIHNyY1BhdGguc3BsaWNlKGksIDEpO1xuICAgICAgdXArKztcbiAgICB9IGVsc2UgaWYgKHVwKSB7XG4gICAgICBzcmNQYXRoLnNwbGljZShpLCAxKTtcbiAgICAgIHVwLS07XG4gICAgfVxuICB9XG5cbiAgLy8gaWYgdGhlIHBhdGggaXMgYWxsb3dlZCB0byBnbyBhYm92ZSB0aGUgcm9vdCwgcmVzdG9yZSBsZWFkaW5nIC4uc1xuICBpZiAoIW11c3RFbmRBYnMgJiYgIXJlbW92ZUFsbERvdHMpIHtcbiAgICBmb3IgKDsgdXAtLTsgdXApIHtcbiAgICAgIHNyY1BhdGgudW5zaGlmdCgnLi4nKTtcbiAgICB9XG4gIH1cblxuICBpZiAobXVzdEVuZEFicyAmJiBzcmNQYXRoWzBdICE9PSAnJyAmJlxuICAgICAgKCFzcmNQYXRoWzBdIHx8IHNyY1BhdGhbMF0uY2hhckF0KDApICE9PSAnLycpKSB7XG4gICAgc3JjUGF0aC51bnNoaWZ0KCcnKTtcbiAgfVxuXG4gIGlmIChoYXNUcmFpbGluZ1NsYXNoICYmIChzcmNQYXRoLmpvaW4oJy8nKS5zdWJzdHIoLTEpICE9PSAnLycpKSB7XG4gICAgc3JjUGF0aC5wdXNoKCcnKTtcbiAgfVxuXG4gIHZhciBpc0Fic29sdXRlID0gc3JjUGF0aFswXSA9PT0gJycgfHxcbiAgICAgIChzcmNQYXRoWzBdICYmIHNyY1BhdGhbMF0uY2hhckF0KDApID09PSAnLycpO1xuXG4gIC8vIHB1dCB0aGUgaG9zdCBiYWNrXG4gIGlmIChwc3ljaG90aWMpIHtcbiAgICByZXN1bHQuaG9zdG5hbWUgPSByZXN1bHQuaG9zdCA9IGlzQWJzb2x1dGUgPyAnJyA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNQYXRoLmxlbmd0aCA/IHNyY1BhdGguc2hpZnQoKSA6ICcnO1xuICAgIC8vb2NjYXRpb25hbHkgdGhlIGF1dGggY2FuIGdldCBzdHVjayBvbmx5IGluIGhvc3RcbiAgICAvL3RoaXMgZXNwZWNpYWxseSBoYXBwZW5zIGluIGNhc2VzIGxpa2VcbiAgICAvL3VybC5yZXNvbHZlT2JqZWN0KCdtYWlsdG86bG9jYWwxQGRvbWFpbjEnLCAnbG9jYWwyQGRvbWFpbjInKVxuICAgIHZhciBhdXRoSW5Ib3N0ID0gcmVzdWx0Lmhvc3QgJiYgcmVzdWx0Lmhvc3QuaW5kZXhPZignQCcpID4gMCA/XG4gICAgICAgICAgICAgICAgICAgICByZXN1bHQuaG9zdC5zcGxpdCgnQCcpIDogZmFsc2U7XG4gICAgaWYgKGF1dGhJbkhvc3QpIHtcbiAgICAgIHJlc3VsdC5hdXRoID0gYXV0aEluSG9zdC5zaGlmdCgpO1xuICAgICAgcmVzdWx0Lmhvc3QgPSByZXN1bHQuaG9zdG5hbWUgPSBhdXRoSW5Ib3N0LnNoaWZ0KCk7XG4gICAgfVxuICB9XG5cbiAgbXVzdEVuZEFicyA9IG11c3RFbmRBYnMgfHwgKHJlc3VsdC5ob3N0ICYmIHNyY1BhdGgubGVuZ3RoKTtcblxuICBpZiAobXVzdEVuZEFicyAmJiAhaXNBYnNvbHV0ZSkge1xuICAgIHNyY1BhdGgudW5zaGlmdCgnJyk7XG4gIH1cblxuICBpZiAoIXNyY1BhdGgubGVuZ3RoKSB7XG4gICAgcmVzdWx0LnBhdGhuYW1lID0gbnVsbDtcbiAgICByZXN1bHQucGF0aCA9IG51bGw7XG4gIH0gZWxzZSB7XG4gICAgcmVzdWx0LnBhdGhuYW1lID0gc3JjUGF0aC5qb2luKCcvJyk7XG4gIH1cblxuICAvL3RvIHN1cHBvcnQgcmVxdWVzdC5odHRwXG4gIGlmICghdXRpbC5pc051bGwocmVzdWx0LnBhdGhuYW1lKSB8fCAhdXRpbC5pc051bGwocmVzdWx0LnNlYXJjaCkpIHtcbiAgICByZXN1bHQucGF0aCA9IChyZXN1bHQucGF0aG5hbWUgPyByZXN1bHQucGF0aG5hbWUgOiAnJykgK1xuICAgICAgICAgICAgICAgICAgKHJlc3VsdC5zZWFyY2ggPyByZXN1bHQuc2VhcmNoIDogJycpO1xuICB9XG4gIHJlc3VsdC5hdXRoID0gcmVsYXRpdmUuYXV0aCB8fCByZXN1bHQuYXV0aDtcbiAgcmVzdWx0LnNsYXNoZXMgPSByZXN1bHQuc2xhc2hlcyB8fCByZWxhdGl2ZS5zbGFzaGVzO1xuICByZXN1bHQuaHJlZiA9IHJlc3VsdC5mb3JtYXQoKTtcbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cblVybC5wcm90b3R5cGUucGFyc2VIb3N0ID0gZnVuY3Rpb24oKSB7XG4gIHZhciBob3N0ID0gdGhpcy5ob3N0O1xuICB2YXIgcG9ydCA9IHBvcnRQYXR0ZXJuLmV4ZWMoaG9zdCk7XG4gIGlmIChwb3J0KSB7XG4gICAgcG9ydCA9IHBvcnRbMF07XG4gICAgaWYgKHBvcnQgIT09ICc6Jykge1xuICAgICAgdGhpcy5wb3J0ID0gcG9ydC5zdWJzdHIoMSk7XG4gICAgfVxuICAgIGhvc3QgPSBob3N0LnN1YnN0cigwLCBob3N0Lmxlbmd0aCAtIHBvcnQubGVuZ3RoKTtcbiAgfVxuICBpZiAoaG9zdCkgdGhpcy5ob3N0bmFtZSA9IGhvc3Q7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgaXNTdHJpbmc6IGZ1bmN0aW9uKGFyZykge1xuICAgIHJldHVybiB0eXBlb2YoYXJnKSA9PT0gJ3N0cmluZyc7XG4gIH0sXG4gIGlzT2JqZWN0OiBmdW5jdGlvbihhcmcpIHtcbiAgICByZXR1cm4gdHlwZW9mKGFyZykgPT09ICdvYmplY3QnICYmIGFyZyAhPT0gbnVsbDtcbiAgfSxcbiAgaXNOdWxsOiBmdW5jdGlvbihhcmcpIHtcbiAgICByZXR1cm4gYXJnID09PSBudWxsO1xuICB9LFxuICBpc051bGxPclVuZGVmaW5lZDogZnVuY3Rpb24oYXJnKSB7XG4gICAgcmV0dXJuIGFyZyA9PSBudWxsO1xuICB9XG59O1xuIiwiXG4vKipcbiAqIE1vZHVsZSBleHBvcnRzLlxuICovXG5cbm1vZHVsZS5leHBvcnRzID0gZGVwcmVjYXRlO1xuXG4vKipcbiAqIE1hcmsgdGhhdCBhIG1ldGhvZCBzaG91bGQgbm90IGJlIHVzZWQuXG4gKiBSZXR1cm5zIGEgbW9kaWZpZWQgZnVuY3Rpb24gd2hpY2ggd2FybnMgb25jZSBieSBkZWZhdWx0LlxuICpcbiAqIElmIGBsb2NhbFN0b3JhZ2Uubm9EZXByZWNhdGlvbiA9IHRydWVgIGlzIHNldCwgdGhlbiBpdCBpcyBhIG5vLW9wLlxuICpcbiAqIElmIGBsb2NhbFN0b3JhZ2UudGhyb3dEZXByZWNhdGlvbiA9IHRydWVgIGlzIHNldCwgdGhlbiBkZXByZWNhdGVkIGZ1bmN0aW9uc1xuICogd2lsbCB0aHJvdyBhbiBFcnJvciB3aGVuIGludm9rZWQuXG4gKlxuICogSWYgYGxvY2FsU3RvcmFnZS50cmFjZURlcHJlY2F0aW9uID0gdHJ1ZWAgaXMgc2V0LCB0aGVuIGRlcHJlY2F0ZWQgZnVuY3Rpb25zXG4gKiB3aWxsIGludm9rZSBgY29uc29sZS50cmFjZSgpYCBpbnN0ZWFkIG9mIGBjb25zb2xlLmVycm9yKClgLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIC0gdGhlIGZ1bmN0aW9uIHRvIGRlcHJlY2F0ZVxuICogQHBhcmFtIHtTdHJpbmd9IG1zZyAtIHRoZSBzdHJpbmcgdG8gcHJpbnQgdG8gdGhlIGNvbnNvbGUgd2hlbiBgZm5gIGlzIGludm9rZWRcbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gYSBuZXcgXCJkZXByZWNhdGVkXCIgdmVyc2lvbiBvZiBgZm5gXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIGRlcHJlY2F0ZSAoZm4sIG1zZykge1xuICBpZiAoY29uZmlnKCdub0RlcHJlY2F0aW9uJykpIHtcbiAgICByZXR1cm4gZm47XG4gIH1cblxuICB2YXIgd2FybmVkID0gZmFsc2U7XG4gIGZ1bmN0aW9uIGRlcHJlY2F0ZWQoKSB7XG4gICAgaWYgKCF3YXJuZWQpIHtcbiAgICAgIGlmIChjb25maWcoJ3Rocm93RGVwcmVjYXRpb24nKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IobXNnKTtcbiAgICAgIH0gZWxzZSBpZiAoY29uZmlnKCd0cmFjZURlcHJlY2F0aW9uJykpIHtcbiAgICAgICAgY29uc29sZS50cmFjZShtc2cpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS53YXJuKG1zZyk7XG4gICAgICB9XG4gICAgICB3YXJuZWQgPSB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfVxuXG4gIHJldHVybiBkZXByZWNhdGVkO1xufVxuXG4vKipcbiAqIENoZWNrcyBgbG9jYWxTdG9yYWdlYCBmb3IgYm9vbGVhbiB2YWx1ZXMgZm9yIHRoZSBnaXZlbiBgbmFtZWAuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWVcbiAqIEByZXR1cm5zIHtCb29sZWFufVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gY29uZmlnIChuYW1lKSB7XG4gIC8vIGFjY2Vzc2luZyBnbG9iYWwubG9jYWxTdG9yYWdlIGNhbiB0cmlnZ2VyIGEgRE9NRXhjZXB0aW9uIGluIHNhbmRib3hlZCBpZnJhbWVzXG4gIHRyeSB7XG4gICAgaWYgKCFnbG9iYWwubG9jYWxTdG9yYWdlKSByZXR1cm4gZmFsc2U7XG4gIH0gY2F0Y2ggKF8pIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgdmFyIHZhbCA9IGdsb2JhbC5sb2NhbFN0b3JhZ2VbbmFtZV07XG4gIGlmIChudWxsID09IHZhbCkgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gU3RyaW5nKHZhbCkudG9Mb3dlckNhc2UoKSA9PT0gJ3RydWUnO1xufVxuIiwibW9kdWxlLmV4cG9ydHMgPSBleHRlbmRcblxudmFyIGhhc093blByb3BlcnR5ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcblxuZnVuY3Rpb24gZXh0ZW5kKCkge1xuICAgIHZhciB0YXJnZXQgPSB7fVxuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXVxuXG4gICAgICAgIGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHtcbiAgICAgICAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkge1xuICAgICAgICAgICAgICAgIHRhcmdldFtrZXldID0gc291cmNlW2tleV1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0YXJnZXRcbn1cbiJdfQ==